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,257 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Enums\Integracao\Bnafar\BnafarServicoTipo;
use App\Services\Integracao\BnafarService;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class GerenciamentoEnvioService extends Service
{
public static function index()
{
if (request()->get('acao') == 'inconsistencias') {
$response = [];
DB::table('integracao_bnafar_protocolo_resposta')
->select(['resposta'])
->where('protocolo_id', request()->get('id'))
->get()
->map(function($query) use (&$response) {
$resposta = json_decode($query->resposta, true);
if (isset($resposta['exceptions'])) {
foreach ($resposta['exceptions'] as $value) {
$response[] = [
'codigo' => $value['codigo'] ?? 'Não informado',
'valor_rejeitado' => $value['valorRejeitado'] ?? 'Não informado',
'descricao' => DB::table('integracao_bnafar_resposta')
->select(['descricao'])
->where('codigo', $value['codigo'] ?? null)
->first()->descricao ?? ($value['caminho'] ?? 'Não informado'),
];
}
}
foreach ($resposta as $value) {
if (isset($value['inconsistencias'])) {
foreach ($value['inconsistencias'] as $inconsistencia) {
$response[] = [
'codigo' => $inconsistencia['codigo'] ?? 'Não informado',
'valor_rejeitado' => $inconsistencia['valorRejeitado'] ?? 'Não informado',
'descricao' => DB::table('integracao_bnafar_resposta')
->select(['descricao'])
->where('codigo', $inconsistencia['codigo'])
->first()->descricao ?? BnafarService::formatarMensagem($inconsistencia['mensagem'] ?? null),
];
}
}
}
});
return collect($response)
->unique(fn ($erro) => $erro['codigo'] . '|' . $erro['valor_rejeitado'] . '|' . $erro['descricao'])
->values()
->all();
}
}
public static function show($id)
{
$protocolo = DB::table('integracao_bnafar_protocolo')
->select([
'integracao_bnafar_protocolo.id',
'integracao_bnafar_protocolo.servico_tipo_id',
'integracao_bnafar_protocolo.protocolo',
'integracao_bnafar_servico_tipo.descricao AS servico_tipo_descricao',
])
->leftJoin('integracao_bnafar_servico_tipo', 'integracao_bnafar_servico_tipo.id', 'integracao_bnafar_protocolo.servico_tipo_id')
->where('integracao_bnafar_protocolo.id', $id)
->first();
if ($protocolo->servico_tipo_id === BnafarServicoTipo::ENTRADA) {
return DB::table('integracao_bnafar_entrada_item')
->select([
'integracao_bnafar_entrada.id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
'integracao_bnafar_entrada.codigo_registro',
'integracao_bnafar_entrada.processado_sucesso',
'integracao_bnafar_entrada_item.id AS entrada_item_id',
'cadastro_material.descricao AS material_descricao',
'cadastro_fabricante.nome AS fabricante_nome',
'integracao_bnafar_entrada_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_entrada_item.data_validade, '%d/%m/%Y') AS data_validade"),
'integracao_bnafar_entrada_item.quantidade',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_entrada_item.material_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_entrada_item.fabricante_id')
->join('integracao_bnafar_entrada', 'integracao_bnafar_entrada.id', 'integracao_bnafar_entrada_item.entrada_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('integracao_bnafar_entrada.protocolo_id', $protocolo->id)
->get()
->map(function($entrada) use ($protocolo) {
return [
'id' => $entrada->id,
'servico_tipo_id' => $protocolo->servico_tipo_id,
'unidade_nome_fantasia' => $entrada->unidade_nome_fantasia,
'protocolo' => $protocolo->protocolo,
'codigo_registro' => $entrada->codigo_registro,
'entrada_item_id' => $entrada->entrada_item_id,
'material_descricao' => $entrada->material_descricao,
'fabricante_nome' => $entrada->fabricante_nome,
'lote' => $entrada->lote,
'data_validade' => $entrada->data_validade,
'quantidade' => $entrada->quantidade,
'status_processamento' => is_null($entrada->processado_sucesso) ? 'Ainda não processado' : ($entrada->processado_sucesso ? 'Processado com sucesso' : 'Erro ao processar'),
'mensagem' => null,
'servico_tipo_descricao' => $protocolo->servico_tipo_descricao,
];
});
}
else if ($protocolo->servico_tipo_id === BnafarServicoTipo::SAIDA) {
return DB::table('integracao_bnafar_saida_item')
->select([
'integracao_bnafar_saida.id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
'integracao_bnafar_saida.codigo_registro',
'integracao_bnafar_saida.processado_sucesso',
'integracao_bnafar_saida_item.id AS saida_item_id',
'cadastro_material.descricao AS material_descricao',
'cadastro_fabricante.nome AS fabricante_nome',
'integracao_bnafar_saida_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_saida_item.data_validade, '%d/%m/%Y') AS data_validade"),
'integracao_bnafar_saida_item.quantidade',
'integracao_bnafar_saida_item.mensagem',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_saida_item.material_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_saida_item.fabricante_id')
->join('integracao_bnafar_saida', 'integracao_bnafar_saida.id', 'integracao_bnafar_saida_item.saida_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('integracao_bnafar_saida.protocolo_id', $protocolo->id)
->get()
->map(function($saida) use ($protocolo) {
return [
'id' => $saida->id,
'servico_tipo_id' => $protocolo->servico_tipo_id,
'unidade_nome_fantasia' => $saida->unidade_nome_fantasia,
'protocolo' => $protocolo->protocolo,
'codigo_registro' => $saida->codigo_registro,
'saida_item_id' => $saida->saida_item_id,
'material_descricao' => $saida->material_descricao,
'fabricante_nome' => $saida->fabricante_nome,
'lote' => $saida->lote,
'data_validade' => $saida->data_validade,
'quantidade' => $saida->quantidade,
'status_processamento' => is_null($saida->processado_sucesso) ? 'Ainda não processado' : ($saida->processado_sucesso ? 'Processado com sucesso' : 'Erro ao processar'),
'mensagem' => BnafarService::formatarMensagem($saida->mensagem),
'servico_tipo_descricao' => $protocolo->servico_tipo_descricao,
];
});
}
else if ($protocolo->servico_tipo_id === BnafarServicoTipo::DISPENSACAO) {
return DB::table('integracao_bnafar_dispensacao_item')
->select([
'integracao_bnafar_dispensacao.id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
'integracao_bnafar_dispensacao.codigo_registro',
'integracao_bnafar_dispensacao.processado_sucesso',
'integracao_bnafar_dispensacao_item.id AS dispensacao_item_id',
'cadastro_material.descricao AS material_descricao',
'cadastro_fabricante.nome AS fabricante_nome',
'integracao_bnafar_dispensacao_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_dispensacao_item.data_validade, '%d/%m/%Y') AS data_validade"),
'integracao_bnafar_dispensacao_item.quantidade',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_dispensacao_item.material_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_dispensacao_item.fabricante_id')
->join('integracao_bnafar_dispensacao', 'integracao_bnafar_dispensacao.id', 'integracao_bnafar_dispensacao_item.dispensacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('integracao_bnafar_dispensacao.protocolo_id', $protocolo->id)
->get()
->map(function($dispensacao) use ($protocolo) {
return [
'id' => $dispensacao->id,
'servico_tipo_id' => $protocolo->servico_tipo_id,
'unidade_nome_fantasia' => $dispensacao->unidade_nome_fantasia,
'protocolo' => $protocolo->protocolo,
'codigo_registro' => $dispensacao->codigo_registro,
'dispensacao_item_id' => $dispensacao->dispensacao_item_id,
'material_descricao' => $dispensacao->material_descricao,
'fabricante_nome' => $dispensacao->fabricante_nome,
'lote' => $dispensacao->lote,
'data_validade' => $dispensacao->data_validade,
'quantidade' => $dispensacao->quantidade,
'status_processamento' => is_null($dispensacao->processado_sucesso) ? 'Ainda não processado' : ($dispensacao->processado_sucesso ? 'Processado com sucesso' : 'Erro ao processar'),
'mensagem' => null,
'servico_tipo_descricao' => $protocolo->servico_tipo_descricao,
];
});
}
else if ($protocolo->servico_tipo_id === BnafarServicoTipo::POSICAO_ESTOQUE) {
return DB::table('integracao_bnafar_posicao_estoque_item')
->select([
'integracao_bnafar_posicao_estoque.id',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
'integracao_bnafar_posicao_estoque.codigo_registro',
'integracao_bnafar_posicao_estoque.processado_sucesso',
'integracao_bnafar_posicao_estoque_item.id AS posicao_estoque_item_id',
'cadastro_material.descricao AS material_descricao',
'cadastro_fabricante.nome AS fabricante_nome',
'integracao_bnafar_posicao_estoque_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_posicao_estoque_item.data_validade, '%d/%m/%Y') AS data_validade"),
'integracao_bnafar_posicao_estoque_item.quantidade',
'integracao_bnafar_posicao_estoque_item.mensagem',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_posicao_estoque_item.material_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_posicao_estoque_item.fabricante_id')
->join('integracao_bnafar_posicao_estoque', 'integracao_bnafar_posicao_estoque.id', 'integracao_bnafar_posicao_estoque_item.posicao_estoque_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('integracao_bnafar_posicao_estoque.protocolo_id', $protocolo->id)
->get()
->map(function($posicaoEstoque) use ($protocolo) {
return [
'id' => $posicaoEstoque->id,
'servico_tipo_id' => $protocolo->servico_tipo_id,
'unidade_nome_fantasia' => $posicaoEstoque->unidade_nome_fantasia,
'protocolo' => $protocolo->protocolo,
'codigo_registro' => $posicaoEstoque->codigo_registro,
'posicao_estoque_item_id' => $posicaoEstoque->posicao_estoque_item_id,
'material_descricao' => $posicaoEstoque->material_descricao,
'fabricante_nome' => $posicaoEstoque->fabricante_nome,
'lote' => $posicaoEstoque->lote,
'data_validade' => $posicaoEstoque->data_validade,
'quantidade' => $posicaoEstoque->quantidade,
'status_processamento' => is_null($posicaoEstoque->processado_sucesso) ? 'Ainda não processado' : ($posicaoEstoque->processado_sucesso ? 'Processado com sucesso' : 'Erro ao processar'),
'mensagem' => BnafarService::formatarMensagem($posicaoEstoque->mensagem),
'servico_tipo_descricao' => $protocolo->servico_tipo_descricao,
];
});
}
}
public static function datatable()
{
return DB::table('integracao_bnafar_protocolo')
->select([
'integracao_bnafar_protocolo.id',
'integracao_bnafar_processamento_status.id AS processamento_status_id',
'integracao_bnafar_processamento_status.descricao AS processamento_status_descricao',
'integracao_bnafar_servico_tipo.descricao AS servico_tipo_descricao',
'integracao_bnafar_operacao_tipo.descricao AS operacao_tipo_descricao',
'integracao_bnafar_protocolo.protocolo',
DB::raw("DATE_FORMAT(integracao_bnafar_protocolo.data_protocolo, '%d/%m/%Y') AS data_protocolo"),
])
->leftJoin('integracao_bnafar_processamento_status', 'integracao_bnafar_processamento_status.id', 'integracao_bnafar_protocolo.processamento_status_id')
->leftJoin('integracao_bnafar_servico_tipo', 'integracao_bnafar_servico_tipo.id', 'integracao_bnafar_protocolo.servico_tipo_id')
->leftJoin('integracao_bnafar_operacao_tipo', 'integracao_bnafar_operacao_tipo.id', 'integracao_bnafar_protocolo.operacao_tipo_id');
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class MedicamentoService extends Service
{
public static function autocomplete()
{
return DB::table('integracao_bnafar_medicamento')
->select([
'id',
'codigo',
'descricao',
])
->when(request()->ids, fn ($q, $ids) => $q->whereNotIn('id', $ids));
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Models\Integracao\Bnafar\Parametrizacao;
use App\Services\Service;
class ParametrizacaoService extends Service
{
public static function create()
{
$parametrizacao = self::show();
return [
'model' => [
'usuario' => $parametrizacao->usuario ?? null,
'senha' => $parametrizacao->senha ?? null,
'ativo' => $parametrizacao->ativo ?? false,
],
];
}
public static function store($request)
{
self::validate($request);
$parametrizacao = self::show();
if (is_null($parametrizacao)) {
Parametrizacao::create([
'usuario' => $request->usuario,
'senha' => $request->senha,
'ativo' => $request->ativo,
]);
} else {
$parametrizacao->update([
'usuario' => $request->usuario,
'senha' => $request->senha,
'ativo' => $request->ativo,
]);
}
}
public static function show()
{
return Parametrizacao::first();
}
private static function validate()
{
request()->validate([
'usuario' => [
'required',
'string',
'max:180',
],
'senha' => [
'required',
'string',
'max:180',
],
'ativo' => [
'required',
'boolean',
],
]);
}
}

View File

@@ -0,0 +1,344 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Enums\Cadastro\Fabricante\Tipo as FabricanteTipo;
use App\Enums\Integracao\Bnafar\BnafarOperacaoTipo;
use App\Enums\Integracao\Bnafar\BnafarProcessamentoStatus;
use App\Enums\Integracao\Bnafar\BnafarServicoTipo;
use App\Models\Integracao\Bnafar\PosicaoEstoque;
use App\Models\Integracao\Bnafar\PosicaoEstoqueItem;
use App\Models\Integracao\Bnafar\Protocolo;
use App\Models\Integracao\Bnafar\ProtocoloResposta;
use App\Services\Integracao\BnafarService;
use App\Services\Service;
use App\Services\Telegram\TelegramService;
use Exception;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class PosicaoEstoqueService extends Service
{
private const POSICOES_ESTOQUE_POR_PROTOCOLO = 1000;
private const ITENS_POR_POSICAO_ESTOQUE = 60;
public static function store()
{
$posicaoEstoqueId = null;
$posicoes = self::getAlmoxarifadoPosicoesEstoque();
if (sizeof($posicoes) > 0) {
$protocoloId = Protocolo::create([
'servico_tipo_id' => BnafarServicoTipo::POSICAO_ESTOQUE,
'operacao_tipo_id' => BnafarOperacaoTipo::OPERACAO_INCLUSAO_REGISTRO,
])->id;
}
foreach ($posicoes as $posicao) {
$posicaoEstoqueId = DB::table('integracao_bnafar_posicao_estoque')
->where('id', $posicaoEstoqueId)
->whereRaw('
(
SELECT COUNT(*)
FROM integracao_bnafar_posicao_estoque_item
WHERE integracao_bnafar_posicao_estoque_item.posicao_estoque_id = integracao_bnafar_posicao_estoque.id
) < ' . self::ITENS_POR_POSICAO_ESTOQUE . '
')
->first()->id ?? null;
if (is_null($posicaoEstoqueId)) {
$protocoloId = DB::table('integracao_bnafar_protocolo')
->where('id', $protocoloId)
->whereRaw('
(
SELECT COUNT(*)
FROM integracao_bnafar_posicao_estoque
WHERE integracao_bnafar_posicao_estoque.protocolo_id = integracao_bnafar_protocolo.id
) < ' . self::POSICOES_ESTOQUE_POR_PROTOCOLO . '
')
->first()->id ?? null;
if (is_null($protocoloId)) {
$protocoloId = Protocolo::create([
'servico_tipo_id' => BnafarServicoTipo::POSICAO_ESTOQUE,
'operacao_tipo_id' => BnafarOperacaoTipo::OPERACAO_INCLUSAO_REGISTRO,
])->id;
}
$posicaoEstoqueId = PosicaoEstoque::create([
'protocolo_id' => $protocoloId,
'centro_custo_id' => $posicao->centro_custo_id,
'data_posicao_estoque' => $posicao->data_posicao_estoque,
])->id;
}
PosicaoEstoqueItem::create([
'posicao_estoque_id' => $posicaoEstoqueId,
'material_id' => $posicao->material_id,
'fabricante_id' => $posicao->fabricante_id,
'integracao_bnafar_medicamento_id' => $posicao->integracao_bnafar_medicamento_id,
'lote' => $posicao->lote,
'data_validade' => $posicao->data_validade,
'quantidade' => $posicao->quantidade,
'valor_unitario' => $posicao->valor_unitario,
]);
}
}
public static function post($cliente, $token, $ibge)
{
$protocolos = self::getPosicoesEstoque();
foreach ($protocolos as $protocolo) {
try {
$response = BnafarService::post(['action' => 'posicao-estoque-lote', 'token' => $token, 'ibge' => $ibge], $protocolo['posicoes']);
if ($response->status() === Response::HTTP_OK) {
Protocolo::where('id', $protocolo['id'])->update([
'processamento_status_id' => $response['situacao'],
'protocolo' => $response['protocolo'],
'data_protocolo' => $response['dataProtocolo'],
]);
} else {
Protocolo::where('id', $protocolo['id'])->update(['processamento_status_id' => BnafarProcessamentoStatus::ERRO_INTERNO_SERVIDOR]);
ProtocoloResposta::create([
'protocolo_id' => $protocolo['id'],
'resposta' => json_encode($response->json()),
]);
}
} catch (Exception $error) {
Log::channel('integracao-bnafar')->error('Erro ao executar o comando', [
'cliente' => $cliente,
'origem' => 'PosicaoEstoqueService',
'erro' => $error->getMessage(),
]);
if (env('APP_ENV') === 'production') {
TelegramService::send('<strong>Integração BNAFAR (' . $cliente . '):</strong> (Erro ao executar o comando: EnviarPosicaoEstoqueCommand).');
}
continue;
}
}
}
public static function check($cliente, $token, $ibge)
{
Protocolo::whereNull('protocolo')->delete();
$protocolos = self::getProtocolos();
foreach ($protocolos as $protocolo) {
try {
$response = BnafarService::getDetalheProcessamento($token, $ibge, $protocolo->protocolo);
if (isset($response['protocolo'])) {
Protocolo::where('id', $protocolo->id)->update(['processamento_status_id' => $response['protocolo']['situacao']]);
}
$resposta = BnafarService::getInconsistencias($token, $ibge, $protocolo->protocolo);
if (!is_null($resposta)) {
ProtocoloResposta::create([
'protocolo_id' => $protocolo->id,
'resposta' => $resposta,
]);
self::salvarInconsistenciasItens($resposta);
} else {
ProtocoloResposta::where('protocolo_id', $protocolo->id)->delete();
}
if (isset($response['itensProcessados'])) {
foreach ($response['itensProcessados'] as $itemProcessado) {
PosicaoEstoque::where('id', $itemProcessado['codigoOrigem'])->update([
'codigo_registro' => isset($itemProcessado['codigoBnafar']) && $itemProcessado['codigoBnafar'] > 0 ? $itemProcessado['codigoBnafar'] : null,
'processado_sucesso' => $itemProcessado['sucesso'],
]);
}
}
} catch (Exception $error) {
Log::channel('integracao-bnafar')->error('Erro ao executar o comando', [
'cliente' => $cliente,
'origem' => 'PosicaoEstoqueService',
'erro' => $error->getMessage(),
]);
if (env('APP_ENV') === 'production') {
TelegramService::send('<strong>Integração BNAFAR (' . $cliente . '):</strong> (Erro ao executar o comando: EnviarPosicaoEstoqueCommand).');
}
continue;
}
}
}
private static function salvarInconsistenciasItens($resposta)
{
collect(json_decode($resposta, true))
->pluck('inconsistencias')
->filter()
->flatten(1)
->groupBy('codigoOrigem')
->each(function ($inconsistencias, $codigoOrigem) {
$mensagem = $inconsistencias
->pluck('mensagem')
->map(fn ($mensagem) => BnafarService::formatarMensagem($mensagem))
->filter()
->unique()
->implode(' ');
PosicaoEstoqueItem::where('id', $codigoOrigem)->update(['mensagem' => $mensagem]);
});
}
private static function getPosicoesEstoque()
{
return DB::table('integracao_bnafar_protocolo')
->select('id')
->where('servico_tipo_id', BnafarServicoTipo::POSICAO_ESTOQUE)
->whereNull('integracao_bnafar_protocolo.processamento_status_id')
->get()
->map(function($protocolo) {
$posicoes = DB::table('integracao_bnafar_posicao_estoque')
->select([
'cadastro_unidade.cnes AS cnes',
'cadastro_setor.tipo_id AS setor_tipo_id',
'integracao_bnafar_posicao_estoque.id AS codigo_origem',
'integracao_bnafar_posicao_estoque.data_posicao_estoque',
])
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.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')
->where('integracao_bnafar_posicao_estoque.protocolo_id', $protocolo->id)
->where(function($query) {
$query
->whereNull('integracao_bnafar_posicao_estoque.processado_sucesso')
->orWhere('integracao_bnafar_posicao_estoque.processado_sucesso', false);
})
->get()
->map(function($posicao){
$itens = DB::table('integracao_bnafar_posicao_estoque_item')
->select([
'integracao_bnafar_posicao_estoque_item.posicao_estoque_id',
'integracao_bnafar_posicao_estoque_item.id AS codigo_origem',
'cadastro_material_bnafar.codigo AS numero',
'cadastro_material_bnafar.tipo AS tipo_produto',
'integracao_bnafar_posicao_estoque_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_posicao_estoque_item.data_validade, '%Y-%m-%d') AS data_validade"),
'cadastro_fabricante.tipo_id AS tipo_fabricante',
'cadastro_fabricante.cnpj AS cnpj_fabricante',
'cadastro_fabricante.nome AS nome_fabricante',
'integracao_bnafar_medicamento.codigo AS integracao_bnafar_medicamento_codigo',
'integracao_bnafar_posicao_estoque_item.quantidade',
'integracao_bnafar_posicao_estoque_item.valor_unitario',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_posicao_estoque_item.material_id')
->join('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_posicao_estoque_item.fabricante_id')
->leftJoin('integracao_bnafar_medicamento', 'integracao_bnafar_medicamento.id', 'integracao_bnafar_posicao_estoque_item.integracao_bnafar_medicamento_id')
->where('integracao_bnafar_posicao_estoque_item.posicao_estoque_id', $posicao->codigo_origem)
->get()
->map(function($item) {
return [
'codigoOrigem' => $item->codigo_origem,
'numero' => $item->numero,
'terminologia' => $item->integracao_bnafar_medicamento_codigo ? 'OBM' : 'CATMAT',
'codigoAmpp' => $item->integracao_bnafar_medicamento_codigo,
'tipoProduto' => $item->tipo_produto,
'lote' => $item->lote,
'dataValidade' => $item->data_validade,
'cnpjFabricante' => $item->tipo_fabricante === FabricanteTipo::NACIONAL ? $item->cnpj_fabricante : null,
'nomeFabricanteInternacional' => $item->tipo_fabricante === FabricanteTipo::INTERNACIONAL ? $item->nome_fabricante : null,
'quantidade' => $item->quantidade,
'valorUnitario' => $item->valor_unitario,
];
})
->toArray();
return [
'estabelecimento' => [
'cnes' => $posicao->cnes,
'tipo' => BnafarService::getEstabelecimentoTipo($posicao->setor_tipo_id),
],
'caracterizacao' => [
'codigoOrigem' => $posicao->codigo_origem,
'dataPosicaoEstoque' => $posicao->data_posicao_estoque,
],
'itens' => $itens,
];
})
->toArray();
return [
'id' => $protocolo->id,
'posicoes' => $posicoes,
];
})
->toArray();
}
private static function getProtocolos()
{
return DB::table('integracao_bnafar_protocolo')
->select([
'id',
'protocolo',
])
->where('servico_tipo_id', BnafarServicoTipo::POSICAO_ESTOQUE)
->where('processamento_status_id', '!=', BnafarProcessamentoStatus::PROCESSAMENTO_FINALIZADO_SEM_INCONSISTENCIA)
->whereNotNull('processamento_status_id')
->get();
}
private static function getAlmoxarifadoPosicoesEstoque()
{
return DB::table('almoxarifado_entrada_item')
->select([
'almoxarifado_entrada.centro_custo_id',
'almoxarifado_entrada_item.material_id',
'almoxarifado_entrada_item.fabricante_id',
'almoxarifado_entrada_item.integracao_bnafar_medicamento_id',
'almoxarifado_entrada_item.lote',
'almoxarifado_entrada_item.validade_lote AS data_validade',
DB::raw('CURRENT_DATE AS data_posicao_estoque'),
DB::raw('MAX(almoxarifado_entrada_item.valor_unitario) AS valor_unitario'),
DB::raw('
SUM(almoxarifado_entrada_item.quantidade - COALESCE((
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
FROM almoxarifado_saida_item_entrada_item
INNER JOIN almoxarifado_saida_item
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
INNER JOIN almoxarifado_saida
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
WHERE almoxarifado_saida.finalizada = true
AND almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
), 0)) AS quantidade
'),
])
->join('almoxarifado_entrada', 'almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
->where('almoxarifado_entrada.finalizada', true)
->whereNotNull('almoxarifado_entrada_item.fabricante_id')
->whereNotNull('almoxarifado_entrada_item.lote')
->where(DB::raw('ROUND(almoxarifado_entrada_item.valor_unitario, 2)'), '>', 0)
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->join('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id')
->whereColumn('cadastro_material.id', 'almoxarifado_entrada_item.material_id')
)
->groupBy([
'almoxarifado_entrada.centro_custo_id',
'almoxarifado_entrada_item.material_id',
'almoxarifado_entrada_item.fabricante_id',
'almoxarifado_entrada_item.integracao_bnafar_medicamento_id',
'almoxarifado_entrada_item.lote',
'almoxarifado_entrada_item.validade_lote',
DB::raw('CURRENT_DATE'),
])
->get();
}
}

View File

@@ -0,0 +1,571 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Enums\Integracao\Bnafar\BnafarServicoTipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Integracao\Bnafar\ProcessamentoStatus;
use App\Models\Integracao\Bnafar\ServicoTipo;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioEnvioService extends Service
{
public static function index()
{
$params = self::getParams();
$totalizadores = (object) [
'quantidade_total_envios' => 0,
'quantidade_total_inconsistencias' => 0,
'quantidade_total' => 0,
];
$protocolos = DB::table('integracao_bnafar_protocolo')
->select([
'integracao_bnafar_protocolo.id',
DB::raw("DATE_FORMAT(integracao_bnafar_protocolo.data_protocolo, '%d/%m/%Y') AS data_protocolo"),
'integracao_bnafar_servico_tipo.descricao AS servico_tipo_descricao',
'integracao_bnafar_processamento_status.descricao AS processamento_status_descricao',
'integracao_bnafar_protocolo.protocolo',
DB::raw("
CASE integracao_bnafar_protocolo.servico_tipo_id WHEN " . BnafarServicoTipo::ENTRADA . " THEN
(
SELECT COUNT(*)
FROM integracao_bnafar_entrada
WHERE integracao_bnafar_entrada.protocolo_id = integracao_bnafar_protocolo.id
AND NOT EXISTS (
SELECT 1
FROM integracao_bnafar_protocolo_resposta
WHERE integracao_bnafar_protocolo_resposta.protocolo_id = integracao_bnafar_entrada.protocolo_id
)
)
WHEN " . BnafarServicoTipo::SAIDA . " THEN
(
SELECT COUNT(*)
FROM integracao_bnafar_saida
WHERE integracao_bnafar_saida.protocolo_id = integracao_bnafar_protocolo.id
AND NOT EXISTS (
SELECT 1
FROM integracao_bnafar_protocolo_resposta
WHERE integracao_bnafar_protocolo_resposta.protocolo_id = integracao_bnafar_saida.protocolo_id
)
)
WHEN " . BnafarServicoTipo::DISPENSACAO . " THEN
(
SELECT COUNT(*)
FROM integracao_bnafar_dispensacao
WHERE integracao_bnafar_dispensacao.protocolo_id = integracao_bnafar_protocolo.id
AND NOT EXISTS (
SELECT 1
FROM integracao_bnafar_protocolo_resposta
WHERE integracao_bnafar_protocolo_resposta.protocolo_id = integracao_bnafar_dispensacao.protocolo_id
)
)
WHEN " . BnafarServicoTipo::POSICAO_ESTOQUE . " THEN
(
SELECT COUNT(*)
FROM integracao_bnafar_posicao_estoque
WHERE integracao_bnafar_posicao_estoque.protocolo_id = integracao_bnafar_protocolo.id
AND NOT EXISTS (
SELECT 1
FROM integracao_bnafar_protocolo_resposta
WHERE integracao_bnafar_protocolo_resposta.protocolo_id = integracao_bnafar_posicao_estoque.protocolo_id
)
)
END AS quantidade_envios
"),
DB::raw("
(
SELECT COUNT(*)
FROM integracao_bnafar_protocolo_resposta
WHERE integracao_bnafar_protocolo_resposta.protocolo_id = integracao_bnafar_protocolo.id
) AS quantidade_inconsistencias
"),
])
->join('integracao_bnafar_servico_tipo', 'integracao_bnafar_servico_tipo.id', 'integracao_bnafar_protocolo.servico_tipo_id')
->join('integracao_bnafar_processamento_status', 'integracao_bnafar_processamento_status.id', 'integracao_bnafar_protocolo.processamento_status_id')
->whereBetween('data_protocolo', $params->data)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_entrada_item')
->join('integracao_bnafar_entrada', 'integracao_bnafar_entrada.id', 'integracao_bnafar_entrada_item.entrada_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->lotes, fn ($q) => $q->whereIn('integracao_bnafar_entrada_item.lote', $params->lotes))
->whereColumn('integracao_bnafar_entrada.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_saida_item')
->join('integracao_bnafar_saida', 'integracao_bnafar_saida.id', 'integracao_bnafar_saida_item.saida_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->lotes, fn ($q) => $q->whereIn('integracao_bnafar_saida_item.lote', $params->lotes))
->whereColumn('integracao_bnafar_saida.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_posicao_estoque_item')
->join('integracao_bnafar_posicao_estoque', 'integracao_bnafar_posicao_estoque.id', 'integracao_bnafar_posicao_estoque_item.posicao_estoque_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->lotes, fn ($q) => $q->whereIn('integracao_bnafar_posicao_estoque_item.lote', $params->lotes))
->whereColumn('integracao_bnafar_posicao_estoque.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_dispensacao_item')
->join('integracao_bnafar_dispensacao', 'integracao_bnafar_dispensacao.id', 'integracao_bnafar_dispensacao_item.dispensacao_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->lotes, fn ($q) => $q->whereIn('integracao_bnafar_dispensacao_item.lote', $params->lotes))
->whereColumn('integracao_bnafar_dispensacao.protocolo_id', 'integracao_bnafar_protocolo.id')
)
)
->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos)
->whereIn('integracao_bnafar_protocolo.processamento_status_id', $params->processamentos_status)
->whereIn('integracao_bnafar_protocolo.id', $params->protocolos)
->get()
->map(function ($protocolo) {
DB::table('integracao_bnafar_protocolo_resposta')
->select(['resposta'])
->where('protocolo_id', $protocolo->id)
->get()
->map(function($query) use (&$protocolo) {
$resposta = json_decode($query->resposta, true);
if (isset($resposta['exceptions'])) {
foreach ($resposta['exceptions'] as $value) {
$protocolo->respostas[] = [
'codigo' => $value['codigo'] ?? 'Não informado',
'valor_rejeitado' => $value['valorRejeitado'] ?? 'Não informado',
'descricao' => DB::table('integracao_bnafar_resposta')
->select(['descricao'])
->where('codigo', $value['codigo'] ?? null)
->first()->descricao ?? ($value['caminho'] ?? 'Não informado'),
];
}
}
foreach ($resposta as $value) {
if (isset($value['inconsistencias'])) {
foreach ($value['inconsistencias'] as $inconsistencia) {
$protocolo->respostas[] = [
'codigo' => $inconsistencia['codigo'] ?? 'Não informado',
'valor_rejeitado' => $inconsistencia['valorRejeitado'] ?? 'Não informado',
'descricao' => DB::table('integracao_bnafar_resposta')
->select(['descricao'])
->where('codigo', $inconsistencia['codigo'])
->first()->descricao ?? $inconsistencia['mensagem'],
];
}
}
}
});
return $protocolo;
});
$protocolos->each(fn ($p) => $totalizadores->quantidade_total_envios += $p->quantidade_envios);
$protocolos->each(fn ($p) => $totalizadores->quantidade_total_inconsistencias += $p->quantidade_inconsistencias);
$protocolos->each(fn ($p) => $totalizadores->quantidade_total += $p->quantidade_envios + $p->quantidade_inconsistencias);
return compact('protocolos', '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),
'servicos_tipos' => self::getServicosTipos($params),
'processamentos_status' => self::getProcessamentosStatus($params),
'protocolos' => self::getProtocolos($params),
'lotes' => self::getLotes($params),
];
}
case 'servicos-tipos': {
return [
'servicos_tipos' => self::getServicosTipos($params),
'processamentos_status' => self::getProcessamentosStatus($params),
'protocolos' => self::getProtocolos($params),
'lotes' => self::getLotes($params),
];
}
case 'processamentos-status': {
return [
'processamentos_status' => self::getProcessamentosStatus($params),
'protocolos' => self::getProtocolos($params),
'lotes' => self::getLotes($params),
];
}
case 'protocolos': {
return [
'protocolos' => self::getProtocolos($params),
'lotes' => self::getLotes($params),
];
}
case 'lotes': {
return [
'lotes' => self::getLotes($params),
];
}
}
}
public static function getPrintExportData()
{
$dados = self::index();
$unidade = null;
$servicoTipo = null;
$processamentoStatus = null;
$protocolo = null;
$lote = null;
if (count(request()->get('unidades')) === 1) {
$unidade = Unidade::find(request()->get('unidades')[0])->nome_fantasia ?? null;
}
else if (count(request()->get('unidades')) > 0) {
$unidade = 'Mais de uma unidade selecionada';
}
if (count(request()->get('servicos_tipos')) === 1) {
$servicoTipo = ServicoTipo::find(request()->get('servicos_tipos')[0])->descricao ?? null;
}
else if (count(request()->get('servicos_tipos')) > 0) {
$servicoTipo = 'Mais de um tipo de serviço selecionado';
}
if (count(request()->get('processamentos_status')) === 1) {
$processamentoStatus = ProcessamentoStatus::find(request()->get('processamentos_status')[0])->descricao ?? null;
}
else if (count(request()->get('processamentos_status')) > 0) {
$processamentoStatus = 'Mais de um status de processamento selecionado';
}
if (count(request()->get('protocolos')) === 1) {
$protocolo = request()->get('protocolos')[0];
}
else if (count(request()->get('protocolos')) > 1) {
$protocolo = 'Mais de um protocolo selecionado';
}
if (count(request()->get('lotes')) === 1) {
$lote = request()->get('lotes')[0];
}
else if (count(request()->get('lotes')) > 1) {
$lote = 'Mais de um lote selecionado';
}
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' => $unidade,
'servico_tipo' => $servicoTipo,
'processamento_status' => $processamentoStatus,
'protocolo' => $protocolo,
'lote' => $lote,
'columns' => collect(request()->get('selected_columns')),
'itens' => $dados['protocolos'],
'totalizadores' => $dados['totalizadores']
];
}
private static function getParams()
{
return (object) [
'data' => [
'start' => Carbon::createFromFormat('d/m/Y', request()->get('data')['start'])->setTime(0, 0, 0),
'end' => Carbon::createFromFormat('d/m/Y', request()->get('data')['end'])->setTime(23, 59, 59),
],
'unidades' => request()->get('unidades') ?? [],
'servicos_tipos' => request()->get('servicos_tipos') ?? [],
'processamentos_status' => request()->get('processamentos_status') ?? [],
'protocolos' => request()->get('protocolos') ?? [],
'lotes' => request()->get('lotes') ?? [],
];
}
private static function getAdditionals()
{
return [
'data_atual' => Carbon::now()->format('d/m/Y'),
];
}
private static function getForm()
{
return [
'unidades' => [],
'servicos_tipos' => [],
'processamentos_status' => [],
'protocolos' => [],
'lotes' => [],
'codigos_erros' => [],
];
}
private static function getModel()
{
return [
'data' => ['start' => null, 'end' => null],
'servicos_tipos' => [],
'processamentos_status' => [],
'protocolos' => [],
'lotes' => [],
'codigos_erros' => [],
];
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia',
])
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_entrada')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_entrada.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_saida')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_saida.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_posicao_estoque')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_posicao_estoque.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_dispensacao')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_dispensacao.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
)
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getServicosTipos($params)
{
return DB::table('integracao_bnafar_servico_tipo')
->select([
'id',
'descricao',
])
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_protocolo')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->where(fn ($q) => $q
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_entrada')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_entrada.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_saida')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_saida.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_posicao_estoque')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_posicao_estoque.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_dispensacao')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_dispensacao.protocolo_id', 'integracao_bnafar_protocolo.id')
)
))
->whereColumn('integracao_bnafar_protocolo.servico_tipo_id', 'integracao_bnafar_servico_tipo.id')
)
->orderBy('integracao_bnafar_servico_tipo.descricao')
->get();
}
private static function getProcessamentosStatus($params)
{
return DB::table('integracao_bnafar_processamento_status')
->select([
'id',
'descricao',
])
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_protocolo')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->where(fn ($q) => $q
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_entrada')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_entrada.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_saida')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_saida.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_posicao_estoque')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_posicao_estoque.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_dispensacao')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_dispensacao.protocolo_id', 'integracao_bnafar_protocolo.id')
)
))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos))
->whereColumn('integracao_bnafar_protocolo.processamento_status_id', 'integracao_bnafar_processamento_status.id')
)
->orderBy('integracao_bnafar_processamento_status.descricao')
->get();
}
private static function getProtocolos($params)
{
return DB::table('integracao_bnafar_protocolo')
->select([
'id',
'protocolo',
])
->whereBetween('data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->where(fn ($q) => $q
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_entrada')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_entrada.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_saida')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_saida.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_posicao_estoque')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_posicao_estoque.protocolo_id', 'integracao_bnafar_protocolo.id')
)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_bnafar_dispensacao')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades)
->whereColumn('integracao_bnafar_dispensacao.protocolo_id', 'integracao_bnafar_protocolo.id')
)
))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('servico_tipo_id', $params->servicos_tipos))
->when($params->processamentos_status, fn ($q) => $q->whereIn('processamento_status_id', $params->processamentos_status))
->orderBy('protocolo')
->get();
}
private static function getLotes($params)
{
$entradas = DB::table('integracao_bnafar_entrada_item')
->select(['lote'])
->join('integracao_bnafar_entrada', 'integracao_bnafar_entrada.id', 'integracao_bnafar_entrada_item.entrada_id')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_entrada.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_entrada.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos))
->when($params->processamentos_status, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.processamento_status_id', $params->processamentos_status))
->when($params->protocolos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.protocolo', $params->protocolos));
$saidas = DB::table('integracao_bnafar_saida_item')
->select(['lote'])
->join('integracao_bnafar_saida', 'integracao_bnafar_saida.id', 'integracao_bnafar_saida_item.saida_id')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_saida.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos))
->when($params->processamentos_status, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.processamento_status_id', $params->processamentos_status))
->when($params->protocolos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.protocolo', $params->protocolos));
$posicoesEstoque = DB::table('integracao_bnafar_posicao_estoque_item')
->select(['lote'])
->join('integracao_bnafar_posicao_estoque', 'integracao_bnafar_posicao_estoque.id', 'integracao_bnafar_posicao_estoque_item.posicao_estoque_id')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_posicao_estoque.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_posicao_estoque.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos))
->when($params->processamentos_status, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.processamento_status_id', $params->processamentos_status))
->when($params->protocolos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.protocolo', $params->protocolos));
$dispensacoes = DB::table('integracao_bnafar_dispensacao_item')
->select(['lote'])
->join('integracao_bnafar_dispensacao', 'integracao_bnafar_dispensacao.id', 'integracao_bnafar_dispensacao_item.dispensacao_id')
->join('integracao_bnafar_protocolo', 'integracao_bnafar_protocolo.id', 'integracao_bnafar_dispensacao.protocolo_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_dispensacao.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->whereBetween('integracao_bnafar_protocolo.data_protocolo', $params->data)
->when($params->unidades, fn ($q) => $q->whereIn('cadastro_infraestrutura.unidade_id', $params->unidades))
->when($params->servicos_tipos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.servico_tipo_id', $params->servicos_tipos))
->when($params->processamentos_status, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.processamento_status_id', $params->processamentos_status))
->when($params->protocolos, fn ($q) => $q->whereIn('integracao_bnafar_protocolo.protocolo', $params->protocolos));
return $entradas->union($saidas)->union($posicoesEstoque)->union($dispensacoes)
->distinct()
->orderBy('lote')
->get();
}
}

View File

@@ -0,0 +1,434 @@
<?php
namespace App\Services\Integracao\Bnafar;
use App\Enums\Almoxarifado\SaidaTipo;
use App\Enums\Cadastro\Fabricante\Tipo as FabricanteTipo;
use App\Enums\Integracao\Bnafar\BnafarOperacaoTipo;
use App\Enums\Integracao\Bnafar\BnafarProcessamentoStatus;
use App\Enums\Integracao\Bnafar\BnafarSaidaTipo;
use App\Enums\Integracao\Bnafar\BnafarServicoTipo;
use App\Models\Integracao\Bnafar\Protocolo;
use App\Models\Integracao\Bnafar\ProtocoloResposta;
use App\Models\Integracao\Bnafar\Saida;
use App\Models\Integracao\Bnafar\SaidaItem;
use App\Services\Integracao\BnafarService;
use App\Services\Service;
use App\Services\Telegram\TelegramService;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class SaidaService extends Service
{
private const SAIDAS_POR_PROTOCOLO = 1000;
private const ITENS_POR_SAIDA = 60;
public static function store()
{
$saidas = self::getAlmoxarifadoSaidas();
if (sizeof($saidas) > 0) {
$protocoloId = Protocolo::create([
'servico_tipo_id' => BnafarServicoTipo::SAIDA,
'operacao_tipo_id' => BnafarOperacaoTipo::OPERACAO_INCLUSAO_REGISTRO,
])->id;
}
foreach ($saidas as $saida) {
$saidaId = DB::table('integracao_bnafar_saida')
->where('almoxarifado_saida_id', $saida->almoxarifado_saida_id)
->whereRaw('
(
SELECT COUNT(*)
FROM integracao_bnafar_saida_item
WHERE integracao_bnafar_saida_item.saida_id = integracao_bnafar_saida.id
) < ' . self::ITENS_POR_SAIDA . '
')
->first()->id ?? null;
if (is_null($saidaId)) {
$protocoloId = DB::table('integracao_bnafar_protocolo')
->where('id', $protocoloId)
->whereRaw('
(
SELECT COUNT(*)
FROM integracao_bnafar_saida
WHERE integracao_bnafar_saida.protocolo_id = integracao_bnafar_protocolo.id
) < ' . self::SAIDAS_POR_PROTOCOLO . '
')
->first()->id ?? null;
if (is_null($protocoloId)) {
$protocoloId = Protocolo::create([
'servico_tipo_id' => BnafarServicoTipo::SAIDA,
'operacao_tipo_id' => BnafarOperacaoTipo::OPERACAO_INCLUSAO_REGISTRO,
])->id;
}
$saidaId = Saida::create([
'protocolo_id' => $protocoloId,
'saida_tipo_id' => self::getSaidaTipo($saida->saida_tipo_id),
'almoxarifado_saida_id' => $saida->almoxarifado_saida_id,
'centro_custo_id' => $saida->centro_custo_id,
'data_saida' => $saida->data_saida,
'centro_custo_destino_id' => $saida->centro_custo_destino_id,
])->id;
}
SaidaItem::create([
'saida_id' => $saidaId,
'almoxarifado_saida_item_id' => $saida->almoxarifado_saida_item_id,
'material_id' => $saida->material_id,
'fabricante_id' => $saida->fabricante_id,
'integracao_bnafar_medicamento_id' => $saida->integracao_bnafar_medicamento_id,
'lote' => $saida->lote,
'data_validade' => $saida->data_validade,
'quantidade' => $saida->quantidade,
'valor_unitario' => $saida->valor_unitario,
]);
}
}
public static function post($cliente, $token, $ibge)
{
$protocolos = self::getSaidas();
foreach ($protocolos as $protocolo) {
try {
$response = BnafarService::post(['action' => 'saida-lote', 'token' => $token, 'ibge' => $ibge], $protocolo['saidas']);
if (isset($response['protocolo'])) {
Protocolo::where('id', $protocolo['id'])->update([
'processamento_status_id' => $response['situacao'],
'protocolo' => $response['protocolo'],
'data_protocolo' => $response['dataProtocolo'],
]);
} else {
Protocolo::where('id', $protocolo['id'])->update(['processamento_status_id' => BnafarProcessamentoStatus::ERRO_INTERNO_SERVIDOR]);
ProtocoloResposta::create([
'protocolo_id' => $protocolo['id'],
'resposta' => json_encode($response->json()),
]);
}
} catch (Exception $error) {
Log::channel('integracao-bnafar')->error('Erro ao executar o comando', [
'cliente' => $cliente,
'origem' => 'PosicaoEstoqueService',
'erro' => $error->getMessage(),
]);
if (env('APP_ENV') === 'production') {
TelegramService::send('<strong>Integração BNAFAR (' . $cliente . '):</strong> (Erro ao executar o comando: EnviarPosicaoEstoqueCommand).');
}
continue;
}
}
}
public static function check($cliente, $token, $ibge)
{
Protocolo::whereNull('protocolo')->delete();
$protocolos = self::getProtocolos();
foreach ($protocolos as $protocolo) {
try {
$response = BnafarService::getDetalheProcessamento($token, $ibge, $protocolo->protocolo);
if (isset($response['protocolo'])) {
Protocolo::where('id', $protocolo->id)->update(['processamento_status_id' => $response['protocolo']['situacao']]);
}
$resposta = BnafarService::getInconsistencias($token, $ibge, $protocolo->protocolo);
if (!is_null($resposta)) {
ProtocoloResposta::create([
'protocolo_id' => $protocolo->id,
'resposta' => $resposta,
]);
self::salvarInconsistenciasItens($resposta);
} else {
ProtocoloResposta::where('protocolo_id', $protocolo->id)->delete();
}
if (isset($response['itensProcessados'])) {
foreach ($response['itensProcessados'] as $itemProcessado) {
Saida::where('id', $itemProcessado['codigoOrigem'])->update([
'codigo_registro' => isset($itemProcessado['codigoBnafar']) && $itemProcessado['codigoBnafar'] > 0 ? $itemProcessado['codigoBnafar'] : null,
'processado_sucesso' => $itemProcessado['sucesso'],
]);
}
}
} catch (Exception $error) {
Log::channel('integracao-bnafar')->error('Erro ao executar o comando', [
'cliente' => $cliente,
'origem' => 'PosicaoEstoqueService',
'erro' => $error->getMessage(),
]);
if (env('APP_ENV') === 'production') {
TelegramService::send('<strong>Integração BNAFAR (' . $cliente . '):</strong> (Erro ao executar o comando: EnviarPosicaoEstoqueCommand).');
}
continue;
}
}
}
private static function salvarInconsistenciasItens($resposta)
{
collect(json_decode($resposta, true))
->pluck('inconsistencias')
->filter()
->flatten(1)
->groupBy('codigoOrigem')
->each(function ($inconsistencias, $codigoOrigem) {
$mensagem = $inconsistencias
->pluck('mensagem')
->map(fn ($mensagem) => BnafarService::formatarMensagem($mensagem))
->filter()
->unique()
->implode(' ');
SaidaItem::where('id', $codigoOrigem)->update(['mensagem' => $mensagem]);
});
}
private static function getSaidas()
{
return DB::table('integracao_bnafar_protocolo')
->select('id')
->where('servico_tipo_id', BnafarServicoTipo::SAIDA)
->whereNull('integracao_bnafar_protocolo.processamento_status_id')
->get()
->map(function($protocolo) {
$saidas = DB::table('integracao_bnafar_saida')
->select([
'cadastro_unidade.cnes AS cnes',
'cadastro_setor.id AS setor_tipo_id',
'integracao_bnafar_saida.id AS codigo_origem',
DB::raw("DATE_FORMAT(integracao_bnafar_saida.data_saida, '%Y-%m-%d') AS data_saida"),
'cadastro_unidade_destino.cnes AS estabelecimento_destino',
'integracao_bnafar_saida_tipo.codigo AS tipo_saida',
])
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'integracao_bnafar_saida.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_centro_custo AS cadastro_centro_custo_destino', 'cadastro_centro_custo_destino.id', 'integracao_bnafar_saida.centro_custo_destino_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_destino', 'cadastro_infraestrutura_destino.id', 'cadastro_centro_custo_destino.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_destino', 'cadastro_unidade_destino.id', 'cadastro_infraestrutura_destino.unidade_id')
->join('integracao_bnafar_saida_tipo', 'integracao_bnafar_saida_tipo.id', 'integracao_bnafar_saida.saida_tipo_id')
->where('integracao_bnafar_saida.protocolo_id', $protocolo->id)
->where('cadastro_unidade_destino.cnes', '!=', null)
->where(function($query) {
$query
->whereNull('integracao_bnafar_saida.processado_sucesso')
->orWhere('integracao_bnafar_saida.processado_sucesso', false);
})
->get()
->map(function($saida) {
$itens = DB::table('integracao_bnafar_saida_item')
->select([
'integracao_bnafar_saida_item.id AS codigo_origem',
'cadastro_material_bnafar.codigo AS numero',
'cadastro_material_bnafar.tipo AS tipo_produto',
'integracao_bnafar_saida_item.lote',
DB::raw("DATE_FORMAT(integracao_bnafar_saida_item.data_validade, '%Y-%m-%d') AS data_validade"),
'cadastro_fabricante.tipo_id AS tipo_fabricante',
'cadastro_fabricante.cnpj AS cnpj_fabricante',
'cadastro_fabricante.nome AS nome_fabricante',
'integracao_bnafar_medicamento.codigo AS integracao_bnafar_medicamento_codigo',
'integracao_bnafar_saida_item.quantidade',
'integracao_bnafar_saida_item.valor_unitario',
])
->join('cadastro_material', 'cadastro_material.id', 'integracao_bnafar_saida_item.material_id')
->join('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id')
->join('cadastro_fabricante', 'cadastro_fabricante.id', 'integracao_bnafar_saida_item.fabricante_id')
->leftJoin('integracao_bnafar_medicamento', 'integracao_bnafar_medicamento.id', 'integracao_bnafar_saida_item.integracao_bnafar_medicamento_id')
->where('integracao_bnafar_saida_item.saida_id', $saida->codigo_origem)
->get()
->map(function($item) {
return [
'codigoOrigem' => $item->codigo_origem,
'numero' => $item->numero,
'terminologia' => $item->integracao_bnafar_medicamento_codigo ? 'OBM' : 'CATMAT',
'codigoAmpp' => $item->integracao_bnafar_medicamento_codigo,
'tipoProduto' => $item->tipo_produto,
'lote' => $item->lote,
'dataValidade' => $item->data_validade,
'cnpjFabricante' => $item->tipo_fabricante === FabricanteTipo::NACIONAL ? $item->cnpj_fabricante : null,
'nomeFabricanteInternacional' => $item->tipo_fabricante === FabricanteTipo::INTERNACIONAL ? $item->nome_fabricante : null,
'quantidade' => $item->quantidade,
'valorUnitario' => $item->valor_unitario,
];
})
->toArray();
return [
'estabelecimento' => [
'cnes' => $saida->cnes,
'tipo' => BnafarService::getEstabelecimentoTipo($saida->setor_tipo_id),
],
'caracterizacao' => [
'codigoOrigem' => $saida->codigo_origem,
'dataSaida' => $saida->data_saida,
'estabelecimentoDestino' => $saida->estabelecimento_destino,
'tipoSaida' => $saida->tipo_saida,
],
'itens' => $itens,
];
})
->toArray();
return [
'id' => $protocolo->id,
'saidas' => $saidas,
];
})
->toArray();
}
private static function getProtocolos()
{
return DB::table('integracao_bnafar_protocolo')
->select([
'id',
'protocolo',
])
->where('servico_tipo_id', BnafarServicoTipo::SAIDA)
->where('processamento_status_id', '!=', BnafarProcessamentoStatus::PROCESSAMENTO_FINALIZADO_SEM_INCONSISTENCIA)
->whereNotNull('processamento_status_id')
->get();
}
private static function getAlmoxarifadoSaidas()
{
return DB::table('almoxarifado_saida_item')
->select([
'almoxarifado_saida.tipo_id AS saida_tipo_id',
'almoxarifado_saida.id AS almoxarifado_saida_id',
'almoxarifado_saida.centro_custo_id',
DB::raw("DATE_FORMAT(almoxarifado_saida.created_at, '%Y-%m-%d') AS data_saida"),
'almoxarifado_saida_item.id AS almoxarifado_saida_item_id',
'almoxarifado_saida_item.material_id',
'almoxarifado_entrada_item.fabricante_id',
'almoxarifado_entrada_item.integracao_bnafar_medicamento_id',
'almoxarifado_entrada_item.lote AS lote',
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%Y-%m-%d') AS data_validade"),
'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade',
'almoxarifado_entrada_item.valor_unitario',
DB::raw("
(
CASE almoxarifado_saida.tipo_id WHEN " . SaidaTipo::MANUAL . " THEN
(
select centro_custo_id
from almoxarifado_saida_requisicao
where almoxarifado_saida_requisicao.saida_id = almoxarifado_saida.id
)
WHEN " . SaidaTipo::REQUISICAO . " THEN
(
select almoxarifado_requisicao.created_centro_custo_id
from almoxarifado_requisicao_resposta_item
inner join almoxarifado_requisicao_item
on almoxarifado_requisicao_item.id = almoxarifado_requisicao_resposta_item.requisicao_item_id
inner join almoxarifado_requisicao
on almoxarifado_requisicao.id = almoxarifado_requisicao_item.requisicao_id
where almoxarifado_requisicao_resposta_item.saida_item_id = almoxarifado_saida_item.id
)
WHEN " . SaidaTipo::INVENTARIO . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::ESTORNO . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::BAIXA . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::TRANSFERENCIA . " THEN
(
select almoxarifado_saida_transferencia.centro_custo_id
from almoxarifado_saida_transferencia
where almoxarifado_saida_transferencia.saida_id = almoxarifado_saida.id
)
END
) AS centro_custo_destino_id
")
])
->join('almoxarifado_saida', 'almoxarifado_saida.id', 'almoxarifado_saida_item.saida_id')
->join('almoxarifado_saida_item_entrada_item', 'almoxarifado_saida_item_entrada_item.saida_item_id', 'almoxarifado_saida_item.id')
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_item_id')
->where('almoxarifado_saida.finalizada', true)
->where('almoxarifado_saida.tipo_id', '<>', SaidaTipo::DISPENSACAO_FARMACIA)
->whereRaw("CAST(almoxarifado_saida.created_at AS DATE) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)")
->whereNotNull('almoxarifado_entrada_item.fabricante_id')
->whereNotNull('almoxarifado_entrada_item.lote')
->where(DB::raw('ROUND(almoxarifado_entrada_item.valor_unitario, 2)'), '>', 0)
->whereRaw("
(
CASE almoxarifado_saida.tipo_id WHEN " . SaidaTipo::MANUAL . " THEN
(
select centro_custo_id
from almoxarifado_saida_requisicao
where almoxarifado_saida_requisicao.saida_id = almoxarifado_saida.id
)
WHEN " . SaidaTipo::REQUISICAO . " THEN
(
select almoxarifado_requisicao.created_centro_custo_id
from almoxarifado_requisicao_resposta_item
inner join almoxarifado_requisicao_item
on almoxarifado_requisicao_item.id = almoxarifado_requisicao_resposta_item.requisicao_item_id
inner join almoxarifado_requisicao
on almoxarifado_requisicao.id = almoxarifado_requisicao_item.requisicao_id
where almoxarifado_requisicao_resposta_item.saida_item_id = almoxarifado_saida_item.id
)
WHEN " . SaidaTipo::INVENTARIO . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::ESTORNO . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::BAIXA . " THEN
almoxarifado_saida.centro_custo_id
WHEN " . SaidaTipo::TRANSFERENCIA . " THEN
(
select almoxarifado_saida_transferencia.centro_custo_id
from almoxarifado_saida_transferencia
where almoxarifado_saida_transferencia.saida_id = almoxarifado_saida.id
)
END
) IS NOT NULL
")
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->join('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id')
->whereColumn('cadastro_material.id', 'almoxarifado_saida_item.material_id')
)
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('integracao_bnafar_saida')
->whereColumn('integracao_bnafar_saida.almoxarifado_saida_id', 'almoxarifado_saida.id');
})
->get();
}
private static function getSaidaTipo($saidaTipoId)
{
$saidaTipo = null;
if ($saidaTipoId === SaidaTipo::INVENTARIO) {
$saidaTipo = BnafarSaidaTipo::SAIDA_POR_AJUSTE_ESTOQUE;
}
else if ($saidaTipoId === SaidaTipo::ESTORNO) {
$saidaTipo = BnafarSaidaTipo::DEVOLUCAO_DE_ENTRADA_PRODUTO;
}
else if ($saidaTipoId === SaidaTipo::BAIXA) {
$saidaTipo = BnafarSaidaTipo::SAIDA_POR_PERDA;
}
else if ($saidaTipoId === SaidaTipo::MANUAL || $saidaTipoId === SaidaTipo::REQUISICAO || $saidaTipoId === SaidaTipo::TRANSFERENCIA) {
$saidaTipo = BnafarSaidaTipo::SAIDA_POR_TRANSFERENCIA_REMANEJAMENTO;
}
return $saidaTipo;
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace App\Services\Integracao;
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
use App\Enums\Integracao\Bnafar\BnafarEstabelecimentoTipo;
use App\Models\Integracao\Bnafar\Parametrizacao;
use Illuminate\Support\Facades\Http;
class BnafarService
{
public static function getParametrizacao()
{
return Parametrizacao::select(['usuario', 'senha'])
->where('ativo', true)
->first();
}
public static function getToken($usuario, $senha)
{
$url = env('APP_ENV') === 'production' ? env('BNAFAR_PRODUCAO_URL_API_TOKEN') : env('BNAFAR_HOMOLOGACAO_URL_API_TOKEN');
return Http::withHeaders(['Authorization' => 'Basic ' . base64_encode("{$usuario}:{$senha}")])->post($url)->json();
}
public static function post($params, $payload)
{
$url = env('APP_ENV') === 'production' ? env('BNAFAR_PRODUCAO_URL_API_SERVICO') : env('BNAFAR_HOMOLOGACAO_URL_API_SERVICO');
return Http::withHeaders(['Authorization' => "jwt {$params['token']}"])->post($url . "/produto/ibge/{$params['ibge']}/{$params['action']}", $payload);
}
public static function getDetalheProcessamento($token, $ibge, $protocolo)
{
$url = env('APP_ENV') === 'production' ? env('BNAFAR_PRODUCAO_URL_API_SERVICO') : env('BNAFAR_HOMOLOGACAO_URL_API_SERVICO');
return Http::withHeaders(['Authorization' => "jwt $token"])->get($url . "/protocolo/ibge/$ibge/detalhar-processamento/$protocolo");
}
public static function getInconsistencias($token, $ibge, $protocolo)
{
$url = env('APP_ENV') === 'production' ? env('BNAFAR_PRODUCAO_URL_API_SERVICO') : env('BNAFAR_HOMOLOGACAO_URL_API_SERVICO');
$response = Http::withHeaders(['Authorization' => "jwt $token"])->get($url . "/protocolo/ibge/$ibge/inconsistencias/$protocolo?pageNumber=0&pageSize=10");
$response = $response->json();
if (isset($response['totalElements']) && $response['totalElements'] > 0 && isset($response['content'])) {
return json_encode($response['content']);
}
return null;
}
public static function formatarMensagem($mensagem)
{
if (empty($mensagem)) {
return $mensagem;
}
$referenciasTecnicas = [
'/Para\s+os?\s+itens\[\d+\]\.\S+\s*/iu',
'/itens\[\d+\]\.\S+\s*/iu',
];
$mensagem = preg_replace($referenciasTecnicas, '', $mensagem);
$mensagem = preg_replace('/\s{2,}/', ' ', $mensagem);
return ucfirst(trim($mensagem));
}
public static function getEstabelecimentoTipo($setorTipoId)
{
$setorTipo = BnafarEstabelecimentoTipo::ALMOXARIFADO_CENTRAL;
if ($setorTipoId === SetorTipo::FARMACIA) {
$setorTipo = BnafarEstabelecimentoTipo::FARMACIA;
}
return $setorTipo;
}
}

View File

@@ -0,0 +1,116 @@
<?php
namespace App\Services\Integracao\Cns;
use App\Exceptions\Integracao\Cns\CertificadoDigitalInvalidoException;
use App\Exceptions\Integracao\Cns\SenhaInvalidaException;
use App\Models\Integracao\Cns\Parametrizacao;
use App\Services\Integracao\CnsService;
use App\Services\Service;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class ParametrizacaoService extends Service
{
public static function index()
{
return DB::table('integracao_cns_parametrizacao')
->select([
'id',
DB::raw("'" . CnsService::getFile() . "' AS certificado_digital"),
])
->get();
}
public static function create()
{
return [
'model' => [
'certificado_digital' => null,
'senha' => null,
],
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
Parametrizacao::create(['senha' => $request->senha]);
$pkcs12 = openssl_pkcs12_read(file_get_contents($request->files->get('certificado_digital')), $certificates, $request->senha);
if ($pkcs12 ) {
$path = CnsService::getPath() . DIRECTORY_SEPARATOR . CnsService::getFile();
if (isset($certificates['cert']) && isset($certificates['pkey'])) {
$contents = $certificates['cert'].$certificates['pkey'];
} else {
throw new CertificadoDigitalInvalidoException();
}
if (!Storage::disk('local')->put($path, $contents)) {
throw new Exception('Erro ao fazer o upload do certificado.');
} else {
$token = CnsService::getToken($request->senha);
if (isset($token['access_token'])) {
return true;
} else {
throw new CertificadoDigitalInvalidoException();
}
}
} else {
throw new SenhaInvalidaException();
}
});
}
public static function show()
{
return Parametrizacao::first();
}
public static function destroy()
{
DB::transaction(function() {
self::show()->delete();
$path = CnsService::getPath() . DIRECTORY_SEPARATOR . CnsService::getFile();
if (Storage::disk('local')->exists($path)) {
Storage::disk('local')->delete($path);
}
});
}
public static function download()
{
$path = 'documento/integracao/cns/evidencias.pdf';
if (Storage::disk('local')->exists($path)) {
return [
'arquivo' => Storage::path($path),
'nome' => 'EVIDENCIAS.PDF',
];
} else {
throw new Exception('Arquivo não encontrado');
}
}
private static function validate()
{
request()->validate([
'certificado_digital' => [
'required',
],
'senha' => [
'required',
'string',
'max:180',
],
]);
}
}

View File

@@ -0,0 +1,602 @@
<?php
namespace App\Services\Integracao;
use App\Enums\Cadastro\SujeitoAtencao\LocalNascimento as SujeitoAtencaoLocalNascimento;
use App\Enums\Cadastro\SujeitoAtencao\RacaCor as SujeitoAtencaoRacaCor;
use App\Enums\Cadastro\SujeitoAtencao\Sexo as SujeitoAtencaoSexo;
use App\Exceptions\Integracao\Cns\CertificadoDigitalNaoEncontradoException;
use App\Exceptions\Integracao\Cns\ConsultaException;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\SujeitoAtencao\Cidadao;
use App\Models\Cadastro\SujeitoAtencao\LocalNascimento;
use App\Models\Cadastro\SujeitoAtencao\RacaCor;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Integracao\Cns\Parametrizacao;
use App\Models\Intranet\Cliente;
use App\Models\Intranet\Municipio;
use App\Models\Intranet\Pais;
use App\Rules\Cns;
use App\Rules\CnsTermoValido;
use App\Rules\Cpf;
use App\Rules\NomeCompleto;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class CnsService extends Service
{
public static function getParametrizacao()
{
return Parametrizacao::select(['senha'])->first();
}
public static function getToken($senha)
{
$path = self::getPath() . DIRECTORY_SEPARATOR . self::getFile();
$url = env('APP_ENV') === 'production' ? env('CNS_PRODUCAO_URL_API_TOKEN') : env('CNS_HOMOLOGACAO_URL_API_TOKEN');
$http = null;
if (Storage::disk('local')->exists($path)) {
try {
$http = Http::withOptions(['cert' => [Storage::path($path), $senha]])->get($url)->json();
} catch (Exception $error) {
throw new ConsultaException();
}
} else {
throw new CertificadoDigitalNaoEncontradoException();
}
return $http;
}
public static function searchByCns($value)
{
$parametrizacao = self::getParametrizacao();
if (!is_null($parametrizacao)) {
$token = self::getToken($parametrizacao->senha);
$url = env('APP_ENV') === 'production' ? env('CNS_PRODUCAO_URL_API_SERVICO') : env('CNS_HOMOLOGACAO_URL_API_SERVICO');
$headers = [
'Authorization' => 'jwt ' . $token['access_token'],
];
$request = '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:ihe:iti:xds-b:2007" xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:3.0" xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:urn3="urn:ihe:iti:xds-b:2007">
<soap:Body>
<PRPA_IN201305UV02 xsi:schemaLocation="urn:hl7-org:v3 ./schema/HL7V3/NE2008/multicacheschemas/PRPA_IN201305UV02.xsd" ITSVersion="XML_1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3">
<id root="2.16.840.1.113883.4.714" extension="123456"/>
<creationTime value="20070428150301"/>
<interactionId root="2.16.840.1.113883.1.6" extension="PRPA_IN201305UV02"/>
<processingCode code="T"/>
<processingModeCode code="T"/>
<acceptAckCode code="AL"/>
<receiver typeCode="RCV">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.5.100.85"/>
</device>
</receiver>
<sender typeCode="SND">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.2"/>
<name>CADSUS</name>
</device>
</sender>
<controlActProcess classCode="CACT" moodCode="EVN">
<code code="PRPA_TE201305UV02" codeSystem="2.16.840.1.113883.1.6"/>
<queryByParameter>
<queryId root="1.2.840.114350.1.13.28.1.18.5.999" extension="1840997084"/>
<statusCode code="new"/>
<responseModalityCode code="R"/>
<responsePriorityCode code="I"/>
<parameterList>
<livingSubjectId>
<value root="2.16.840.1.113883.13.236" extension="'. $value .'"/>
<semanticsText>LivingSubject.id</semanticsText>
</livingSubjectId>
</parameterList>
</queryByParameter>
</controlActProcess>
</PRPA_IN201305UV02>
</soap:Body>
</soap:Envelope>
';
try {
$response = Http::withHeaders($headers)->withBody($request, 'application/soap+xml')->post($url)->body();
} catch (Exception $error) {
throw new ConsultaException();
}
$xml = simplexml_load_string($response);
return self::getFormattedCidadaoData($xml ?? []);
}
}
public static function searchByCpf($value)
{
$parametrizacao = self::getParametrizacao();
if (!is_null($parametrizacao)) {
$token = self::getToken($parametrizacao->senha);
$url = env('APP_ENV') === 'production' ? env('CNS_PRODUCAO_URL_API_SERVICO') : env('CNS_HOMOLOGACAO_URL_API_SERVICO');
$headers = [
'Authorization' => 'jwt ' . $token['access_token'],
];
$request = '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:ihe:iti:xds-b:2007" xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:3.0" xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:urn3="urn:ihe:iti:xds-b:2007">
<soap:Body>
<PRPA_IN201305UV02 xsi:schemaLocation="urn:hl7-org:v3 ./schema/HL7V3/NE2008/multicacheschemas/PRPA_IN201305UV02.xsd" ITSVersion="XML_1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3">
<id root="2.16.840.1.113883.4.714" extension="123456"/>
<creationTime value="20070428150301"/>
<interactionId root="2.16.840.1.113883.1.6" extension="PRPA_IN201305UV02"/>
<processingCode code="T"/>
<processingModeCode code="T"/>
<acceptAckCode code="AL"/>
<receiver typeCode="RCV">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.5.100.85"/>
</device>
</receiver>
<sender typeCode="SND">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.2"/>
<name>[SYSTEMCODE]</name>
</device>
</sender>
<controlActProcess classCode="CACT" moodCode="EVN">
<code code="PRPA_TE201305UV02" codeSystem="2.16.840.1.113883.1.6"/>
<queryByParameter>
<queryId root="1.2.840.114350.1.13.28.1.18.5.999" extension="1840997084"/>
<statusCode code="new"/>
<responseModalityCode code="R"/>
<responsePriorityCode code="I"/>
<parameterList>
<livingSubjectId>
<value root="2.16.840.1.113883.13.237" extension="'. $value .'"/>
<semanticsText>LivingSubject.id</semanticsText>
</livingSubjectId>
</parameterList>
</queryByParameter>
</controlActProcess>
</PRPA_IN201305UV02>
</soap:Body>
</soap:Envelope>
';
try {
$response = Http::withHeaders($headers)->withBody($request, 'application/soap+xml')->post($url)->body();
} catch (Exception $error) {
throw new ConsultaException();
}
$xml = simplexml_load_string($response);
return self::getFormattedCidadaoData($xml ?? []);
}
}
public static function searchBy()
{
$parametrizacao = self::getParametrizacao();
if (!is_null($parametrizacao)) {
$token = self::getToken($parametrizacao->senha);
$url = env('APP_ENV') === 'production' ? env('CNS_PRODUCAO_URL_API_SERVICO') : env('CNS_HOMOLOGACAO_URL_API_SERVICO');
$headers = [
'Authorization' => 'jwt ' . $token['access_token'],
];
$parameterList = null;
if (isset(request()->nome)) {
$parameterList .= '
<livingSubjectName>
<value use="L">
<given>'. request()->get('nome') .'</given>
</value>
<semanticsText>LivingSubject.Given</semanticsText>
</livingSubjectName>
';
}
if (isset(request()->data_nascimento)) {
$parameterList .= '
<livingSubjectName>
<value use="L">
<given>'. Carbon::createFromFormat('d/m/Y', request()->get('data_nascimento'))->format('Ymd') . '000000' .'</given>
</value>
<semanticsText>LivingSubject.Given</semanticsText>
</livingSubjectName>
';
}
if (isset(request()->nome_mae)) {
$parameterList .= '
<livingSubjectName>
<value use="L">
<given>'. request()->get('nome_mae') .'</given>
</value>
<semanticsText>LivingSubject.Given</semanticsText>
</livingSubjectName>
';
}
$request = '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:urn="urn:ihe:iti:xds-b:2007"
xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:lcm:3.0"
xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"
xmlns:urn3="urn:ihe:iti:xds-b:2007">
<soap:Body>
<PRPA_IN201305UV02 xsi:schemaLocation="urn:hl7-org:v3 ./schema/HL7V3/NE2008/multicacheschemas/PRPA_IN201305UV02.xsd" ITSVersion="XML_1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:hl7-org:v3">
<id root="2.16.840.1.113883.4.714" extension="123456"/>
<creationTime value="20070428150301"/>
<interactionId root="2.16.840.1.113883.1.6" extension="PRPA_IN201305UV02"/>
<processingCode code="T"/>
<processingModeCode code="T"/>
<acceptAckCode code="AL"/>
<receiver typeCode="RCV">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.5.100.85"/>
</device>
</receiver>
<sender typeCode="SND">
<device classCode="DEV" determinerCode="INSTANCE">
<id root="2.16.840.1.113883.3.72.6.2"/>
<name>[SYSTEMCODE]</name>
</device>
</sender>
<controlActProcess classCode="CACT" moodCode="EVN">
<code code="PRPA_TE201305UV02" codeSystem="2.16.840.1.113883.1.6"/>
<queryByParameter>
<queryId root="1.2.840.114350.1.13.28.1.18.5.999" extension="1840997084"/>
<statusCode code="new"/>
<responseModalityCode code="R"/>
<responsePriorityCode code="I"/>
<parameterList>
'. $parameterList .'
</parameterList>
</queryByParameter>
</controlActProcess>
</PRPA_IN201305UV02>
</soap:Body>
</soap:Envelope>
';
try {
$response = Http::withHeaders($headers)->withBody($request, 'application/soap+xml')->post($url)->body();
} catch (Exception $error) {
throw new ConsultaException();
}
$xml = simplexml_load_string($response);
return self::getFormattedCidadaoData($xml ?? []);
}
}
public static function update($request, $id)
{
self::validate($request);
$cidadao = Cidadao::findOrFail($id);
DB::transaction(function() use ($request, $cidadao) {
$cidadao->nome = $request->nome ?? $cidadao->nome;
$cidadao->data_nascimento = $request->data_nascimento ?? $cidadao->data_nascimento;
$cidadao->sexo_id = $request->sexo_id ?? $cidadao->sexo_id;
$cidadao->nome_mae = $request->nome_mae ?? $cidadao->nome_mae;
$cidadao->nome_pai = $request->nome_pai ?? $cidadao->nome_pai;
$cidadao->cns = $request->cns ?? $cidadao->cns;
$cidadao->cpf = $request->cpf ?? $cidadao->cpf;
$cidadao->raca_cor_id = $request->raca_cor_id ?? $cidadao->raca_cor_id;
$cidadao->local_nascimento_id = $request->local_nascimento_id ?? $cidadao->local_nascimento_id;
foreach ($request->telefones as $telefone) {
$cidadao->telefones()->create([
'principal' => false,
'autoriza_sms' => false,
'numero' => $telefone,
]);
}
$cidadao->save();
});
$cidadao = $cidadao->fresh();
return [
'id' => $cidadao->id,
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'data_nascimento' => $cidadao->data_nascimento,
'idade' => $cidadao->idade,
'idade_formatada' => $cidadao->idade_formatada,
'sexo' => [
'id' => $cidadao->sexo->id ?? null,
'descricao' => $cidadao->sexo->descricao ?? null,
],
'nome_mae' => $cidadao->nome_mae,
'nome_pai' => $cidadao->nome_pai,
'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : null,
'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : null,
'raca_cor' => [
'id' => $cidadao->racaCor->id ?? null,
'descricao' => $cidadao->racaCor->descricao ?? null,
],
'local_nascimento' => [
'id' => $cidadao->localNascimento->id,
'descricao' => $cidadao->localNascimento->descricao,
],
'email' => $cidadao->email,
];
}
public static function getPath()
{
return 'integracao' . DIRECTORY_SEPARATOR . 'cns' . DIRECTORY_SEPARATOR . 'certificado-digital' . DIRECTORY_SEPARATOR . app('config')->get('database.default');
}
public static function getFile()
{
return 'CERTIFICADO-DIGITAL.PEM';
}
private static function validate($request)
{
return $request->validate([
'nome' => [
'nullable',
'string',
'between:6,150',
new CnsTermoValido(['attribute' => 'Nome']),
new NomeCompleto,
],
'nome_social' => [
'nullable',
'string',
'between:3,150',
new CnsTermoValido(['attribute' => 'Nome social']),
],
'cns' => [
'nullable',
'digits:15',
new Cns,
],
'cpf' => [
'nullable',
'digits:11',
new Cpf,
],
'data_nascimento' => [
'nullable',
'date_format:Y-m-d',
'before_or_equal:now',
],
'sexo_id' => [
'nullable',
'integer',
],
'nome_mae' => [
'nullable',
'string',
'between:8,150',
new CnsTermoValido(['attribute' => 'Nome da mãe']),
new NomeCompleto,
],
'nome_pai' => [
'nullable',
'between:8,150',
new CnsTermoValido(['attribute' => 'Nome do pai']),
new NomeCompleto,
],
'raca_cor_id' => [
'nullable',
'integer',
],
'local_nascimento_id' => [
'nullable',
'integer',
],
'telefones' => [
'array',
'nullable',
],
'telefones.*.numero' => [
'nullable',
'digits_between:10,11',
],
]);
}
private static function getFormattedCidadaoData($xml)
{
$cliente = self::getCliente();
$response = [];
$body = $xml->xpath('//env:Body')[0];
$prpa = $body->PRPA_IN201306UV02;
$patient = $prpa->controlActProcess->subject->registrationEvent->subject1->patient ?? null;
if (!is_null($patient)) {
$patientName = $patient->patientPerson->name;
$patientBirthTime = (string) $patient->patientPerson->birthTime['value'];
$patientAdministrativeGenderCode = (string) $patient->patientPerson->administrativeGenderCode['code'];
$patientPersonalRelationship = $patient->patientPerson->personalRelationship;
$patientAsOtherIDs = $patient->patientPerson->asOtherIDs;
$patientRaceCode = (string) $patient->patientPerson->raceCode['code'];
$patientBirthPlace = (string) $patient->patientPerson->birthPlace->addr->city;
$patientTelecom = $patient->patientPerson->telecom;
$patientCity = $patient->patientPerson->addr->city;
$patientPostalCode = $patient->patientPerson->addr->postalCode;
$patientCountry = $patient->patientPerson->addr->country;
$patientHouseNumber = $patient->patientPerson->addr->houseNumber;
$patientStreetName = $patient->patientPerson->addr->streetName;
$patientStreetNameType = $patient->patientPerson->addr->streetNameType;
$patientAdditionalLocator = $patient->patientPerson->addr->additionalLocator;
$nome = null;
$nomeSocial = null;
$dataNascimento = null;
$sexo = null;
$nomeMae = null;
$nomePai = null;
$cnsDefinitivo = null;
$cnsProvisorio = null;
$cpf = null;
$racaCor = null;
$localNascimento = null;
$telefones = [];
$email = null;
$ibge = null;
$municipio = null;
$cep = null;
$paisCodigo = null;
$pais = null;
$numero = null;
$logradouro = null;
$logradouroTipo = null;
$bairro = null;
foreach ($patientName as $name) {
if ((string) $name['use'] === 'L') {
$nome = (string) $name->given;
}
else if ((string) $name['use'] === 'ASGN') {
$nomeSocial = (string) $name->given;
}
}
$ibge = $patientCity;
$cep = $patientPostalCode;
$paisCodigo = $patientCountry;
$numero = $patientHouseNumber;
$logradouro = $patientStreetName;
$bairro = $patientAdditionalLocator;
$municipio = $ibge ? Municipio::where('ibge', 'like', Str::substr($ibge, 0, 6) . '%')->first() : null;
$pais = $paisCodigo ? Pais::where('codigo', $paisCodigo)->first() : null;
$logradouroTipo = $patientStreetNameType ? LogradouroTipo::where('codigo', $patientStreetNameType)->first() : null;
$dataNascimento = Carbon::createFromFormat('Ymd', Str::substr($patientBirthTime, 0, 8))->format('Y-m-d');
if ($patientAdministrativeGenderCode === 'M') {
$sexo = Sexo::find(SujeitoAtencaoSexo::MASCULINO);
}
else if ($patientAdministrativeGenderCode === 'F') {
$sexo = Sexo::find(SujeitoAtencaoSexo::FEMININO);
}
foreach ($patientPersonalRelationship as $personalRelationship) {
if ((string) $personalRelationship->code['code'] === 'PRN') {
$nomeMae = (string) $personalRelationship->relationshipHolder1->name->given;
}
else if ((string) $personalRelationship->code['code'] === 'NPRN') {
$nomePai = (string) $personalRelationship->relationshipHolder1->name->given;
}
}
foreach ($patientAsOtherIDs as $asOtherIDs) {
if ((string) $asOtherIDs->id[0]['root'] === '2.16.840.1.113883.13.236') {
if( (string) $asOtherIDs->id[1]['root'] === '2.16.840.1.113883.13.236.1' && (string) $asOtherIDs->id[1]['extension'] === 'D'){
$cnsDefinitivo = (string) $asOtherIDs->id[0]['extension'];
}elseif((string) $asOtherIDs->id[1]['root'] === '2.16.840.1.113883.13.236.1' && (string) $asOtherIDs->id[1]['extension'] === 'P'){
$cnsProvisorio = (string) $asOtherIDs->id[0]['extension'];
}
}
elseif ((string) $asOtherIDs->id['root'] === '2.16.840.1.113883.13.237') {
$cpf = (string) $asOtherIDs->id['extension'];
}
}
if ($patientRaceCode === '01') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::BRANCA);
}
else if ($patientRaceCode === '02') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::NEGRA);
}
else if ($patientRaceCode === '03') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::PARDA);
}
else if ($patientRaceCode === '04') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::AMARELA);
}
else if ($patientRaceCode === '05') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::INDIGENA);
}
else if ($patientRaceCode === '99') {
$racaCor = RacaCor::find(SujeitoAtencaoRacaCor::SEM_INFORMACAO);
}
if (Str::contains($cliente->municipio->ibge ?? null, $patientBirthPlace)) {
$localNascimento = LocalNascimento::find(SujeitoAtencaoLocalNascimento::NESTE_MUNICIPIO);
} else {
$localNascimento = LocalNascimento::find(SujeitoAtencaoLocalNascimento::EM_OUTRO_MUNICIPIO);
}
foreach ($patientTelecom as $telecom) {
if ((string) $telecom['use'] === 'ASN') {
$telefones[] = Str::substr(Str::replace(['+', '-', ' '], '', (string) $telecom['value']), 2);
}
else if ((string) $telecom['use'] === 'NET') {
$email = (string) $telecom['value'];
}
}
$response[] = [
'nome' => $nome,
'nome_social' => $nomeSocial,
'data_nascimento' => $dataNascimento,
'sexo' => [
'id' => $sexo->id ?? null,
'descricao' => $sexo->descricao ?? null,
],
'nome_mae' => $nomeMae,
'nome_pai' => $nomePai,
'cns' => $cnsDefinitivo ?? $cnsProvisorio,
'cpf' => $cpf,
'raca_cor' => [
'id' => $racaCor->id ?? null,
'descricao' => $racaCor->descricao ?? null,
],
'local_nascimento' => [
'id' => $localNascimento->id,
'descricao' => $localNascimento->descricao,
],
'telefones' => $telefones,
'email' => $email,
'municipio' => $municipio->nome ?? null,
'pais' => $pais->nome ?? null,
'numero' => $numero ?? null,
'logradouro' => $logradouro ?? null,
'logradouro_tipo' => $logradouroTipo ?? null,
'bairro' => $bairro ?? null,
'cep' => $cep ? MaskUtil::getCepMasked($cep) : null,
];
}
return $response;
}
private static function getCliente()
{
return Cliente::where('link', app('config')->get('database.default'))->first();
}
}

View File

@@ -0,0 +1,627 @@
<?php
namespace App\Services\Integracao\Erpsaude;
use App\Models\Integracao\Erpsaude\Paciente as ErpsaudePaciente;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class RelatorioAtendimentoService extends Service
{
public static function autocompletePaciente()
{
$params = request()->all();
self::adjustPeriod($params);
$pacientes = DB::table('integracao_erpsaude_paciente')
->select(
'integracao_erpsaude_paciente.id',
'integracao_erpsaude_paciente.nome',
'integracao_erpsaude_paciente.cns',
)
->join('integracao_erpsaude_atendimento', 'integracao_erpsaude_atendimento.paciente_id', 'integracao_erpsaude_paciente.id')
->where(function ($query) use ($params) {
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$query->whereRaw("CONCAT(integracao_erpsaude_atendimento.data_atendimento, ' ', integracao_erpsaude_atendimento.horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $query);
}
if (self::hasParamId($params, 'tipo_alta_id')) {
$query->where('integracao_erpsaude_atendimento.tipo_alta_id', $params['tipo_alta_id']);
}
if (isset($params['cid'])) {
$query->where('integracao_erpsaude_atendimento.cid10', $params['cid']);
}
if (isset($params['profissional'])) {
$query->where('integracao_erpsaude_atendimento.profissional', $params['profissional']);
}
if (!is_null($idadeDe)) {
$query->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$query->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) <= $idadeAte");
}
})->distinct();
return $pacientes;
}
public static function index()
{
$params = request()->all();
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
self::adjustPeriod($params);
$atendimentos = DB::table('integracao_erpsaude_atendimento')
->select(
'integracao_erpsaude_paciente.nome AS nome_paciente',
'integracao_erpsaude_paciente.cns AS cns',
'integracao_erpsaude_paciente.data_nascimento AS data_nascimento',
DB::raw("DATE_FORMAT(integracao_erpsaude_atendimento.data_atendimento, '%d/%m/%Y') AS data"),
'integracao_erpsaude_atendimento.data_atendimento AS data_atendimento',
DB::raw("DATE_FORMAT(integracao_erpsaude_atendimento.horario_atendimento, '%H:%i') AS horario"),
'integracao_erpsaude_atendimento.profissional AS profissional',
'integracao_erpsaude_tipo_alta.descricao AS tipo_alta',
DB::raw("IF(cadastro_cidadao.id IS NOT NULL, 'CADASTRADO', 'SEM CADASTRO') AS conectasus"),
DB::raw("IF(cid.id IS NULL, integracao_erpsaude_atendimento.cid10, CONCAT(cid.codigo, ' - ', cid.nome)) AS cid"),
DB::raw("
CONCAT(
TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURDATE()), ' anos, ',
TIMESTAMPDIFF(MONTH, integracao_erpsaude_paciente.data_nascimento, CURDATE()) % 12, ' meses e ',
DATEDIFF(
CURDATE(),
DATE_ADD(
DATE_ADD(
integracao_erpsaude_paciente.data_nascimento,
INTERVAL TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURDATE()) YEAR
),
INTERVAL (TIMESTAMPDIFF(MONTH, integracao_erpsaude_paciente.data_nascimento, CURDATE()) % 12) MONTH
)
), ' dias'
) AS idade
"),
DB::raw("
CASE integracao_erpsaude_paciente.sexo
WHEN 'M' THEN 'Masculino'
WHEN 'F' THEN 'Feminino'
ELSE 'Não informado'
END AS sexo
"),
)
->join('integracao_erpsaude_paciente', 'integracao_erpsaude_paciente.id', 'integracao_erpsaude_atendimento.paciente_id')
->leftJoin('integracao_erpsaude_tipo_alta', 'integracao_erpsaude_tipo_alta.id', 'integracao_erpsaude_atendimento.tipo_alta_id')
->leftJoin('sigtap.cid AS cid', 'cid.codigo', 'integracao_erpsaude_atendimento.cid10')
->leftJoin('cadastro_cidadao', function ($join) {
$join->on('cadastro_cidadao.cns', '=', 'integracao_erpsaude_paciente.cns')
->orOn(function ($query) {
$query->on(DB::raw('LOWER(cadastro_cidadao.nome)'), '=', DB::raw('LOWER(integracao_erpsaude_paciente.nome)'))
->whereRaw('DATE(cadastro_cidadao.data_nascimento) = DATE(integracao_erpsaude_paciente.data_nascimento)');
});
})
->whereRaw("CONCAT(integracao_erpsaude_atendimento.data_atendimento, ' ', integracao_erpsaude_atendimento.horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $atendimentos);
}
if (self::hasParamId($params, 'tipo_alta_id')) {
$atendimentos->where('integracao_erpsaude_atendimento.tipo_alta_id', $params['tipo_alta_id']);
}
if (isset($params['profissional'])) {
$atendimentos->where('integracao_erpsaude_atendimento.profissional', $params['profissional']);
}
if (isset($params['cid'])) {
$atendimentos->where('integracao_erpsaude_atendimento.cid10', $params['cid']);
}
if (!is_null($idadeDe)) {
$atendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) >= ?", [$idadeDe]);
}
if (!is_null($idadeAte)) {
$atendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) <= ?", [$idadeAte]);
}
if (self::hasParamId($params, 'paciente_id')) {
$atendimentos->where('integracao_erpsaude_paciente.id', $params['paciente_id']);
} else {
if (isset($params['cns'])) {
$atendimentos->where('integracao_erpsaude_paciente.cns', $params['cns']);
}
}
if (isset($params['sexo_id'])) {
$atendimentos->where('integracao_erpsaude_paciente.sexo', $params['sexo_id']);
}
self::setOrderBy($atendimentos);
$atendimentos = $atendimentos->get()
->map(function ($atendimento) {
$dtAtend = Carbon::create($atendimento->data_atendimento);
return array_merge([
'nome_paciente' => $atendimento->nome_paciente,
'data_nascimento' => $atendimento->data_nascimento,
'cns' => $atendimento->cns,
'profissional' => $atendimento->profissional ?? '-',
'data' => $atendimento->data,
'horario' => $atendimento->horario,
'cid' => $atendimento->cid ?? '-',
'idade' => $atendimento->idade,
'sexo' => $atendimento->sexo,
'tipo_alta' => $atendimento->tipo_alta,
'conectasus' => $atendimento->conectasus,
'dia_semana' => Str::ucfirst($dtAtend->translatedFormat('l')),
]);
});
$contagens = $atendimentos->groupBy('cns')->map->count();
$atendimentos = $atendimentos->map(function ($item) use ($contagens) {
$item['quantidade'] = $contagens[$item['cns']];
return $item;
});
$minimo = request()->quantidade;
$atendimentos = $atendimentos->when($minimo, function ($query) use ($minimo) {
return $query->filter(fn ($item) => $item['quantidade'] >= $minimo);
});
$atendimentos = $atendimentos->values()->toArray();
return [
'atendimentos' => $atendimentos,
];
}
private static function setOrderBy($builder)
{
$columns = [
'data' => 'integracao_erpsaude_atendimento.data_atendimento',
'horario' => 'integracao_erpsaude_atendimento.horario_atendimento',
'cns' => 'integracao_erpsaude_paciente.cns',
'nome_paciente' => 'integracao_erpsaude_paciente.nome',
'sexo' => 'integracao_erpsaude_paciente.sexo',
'dia_semana' => DB::raw('DAYOFWEEK(integracao_erpsaude_atendimento.data_atendimento)'),
'idade' => DB::raw("
CONCAT(
TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURDATE()), ' anos, ',
TIMESTAMPDIFF(MONTH, integracao_erpsaude_paciente.data_nascimento, CURDATE()) % 12, ' meses e ',
DATEDIFF(
CURDATE(),
DATE_ADD(
DATE_ADD(
integracao_erpsaude_paciente.data_nascimento,
INTERVAL TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURDATE()) YEAR
),
INTERVAL (TIMESTAMPDIFF(MONTH, integracao_erpsaude_paciente.data_nascimento, CURDATE()) % 12) MONTH
)
), ' dias'
)
"),
'tipo_alta' => 'integracao_erpsaude_atendimento.tipo_alta_id',
'cid' => 'integracao_erpsaude_atendimento.cid10',
'profissional' => 'integracao_erpsaude_atendimento.profissional',
'conectasus' => DB::raw("IF(cadastro_cidadao.id IS NOT NULL, 'CADASTRADO', 'SEM CADASTRO')"),
'cns' => 'integracao_erpsaude_paciente.cns',
'data_nascimento' => 'integracao_erpsaude_paciente.data_nascimento',
];
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)
);
}
public static function list()
{
$params = collect(request()->all());
$camposParaCarregar = collect();
if($params->isNotEmpty()){
$camposParaCarregar->push(
'dias_semana',
'tipoAltas',
'profissionais',
'cids',
'sexos',
);
}
return [
'form' => self::camposFiltrados($camposParaCarregar),
'model' => self::getModel(),
'additionals' => [
'data_atual' => Carbon::today()->format('d/m/Y'),
]
];
}
public static function filtragemPorDiaSemana(){
return self::camposFiltrados(collect([
'tipoAltas',
'profissionais',
'cids',
'sexos',
]));
}
public static function filtragemPorTipoAlta(){
return self::camposFiltrados(collect([
'profissionais',
'status',
'cids',
'sexos',
]));
}
public static function filtragemPorProfissional(){
return self::camposFiltrados(collect([
'cids',
'sexos',
]));
}
public static function filtragemPorCid(){
return self::camposFiltrados(collect([
'sexos',
]));
}
private static function camposFiltrados(Collection $campos){
$params = request()->all();
$dados = collect();
self::adjustPeriod($params);
if ($campos->contains('dias_semana')) {
$dados->put('dias_semana', self::getDiasSemana($params));
}
if ($campos->contains('tipoAltas')) {
$dados->put('tipoAltas', self::getTipoAltas($params));
}
if ($campos->contains('profissionais')) {
$dados->put('profissionais', self::getProfissionais($params));
}
if ($campos->contains('cids')) {
$dados->put('cids', self::getCids($params));
}
if ($campos->contains('sexos')) {
$dados->put('sexos', self::getSexos($params));
}
return $dados->all();
}
private static function adjustPeriod(&$params)
{
if (is_null($params['periodo']['date']['start'] ?? null) || is_null($params['periodo']['date']['end'] ?? null)) {
return;
}
$dateStart = $params['periodo']['date']['start'];
$dateEnd = $params['periodo']['date']['end'];
$timeStart = $params['periodo']['time']['start'];
$timeEnd = $params['periodo']['time']['end'];
$params['periodo']['date']['start'] = (Carbon::createFromFormat('d/m/Y', "{$dateStart}"))->startOfDay();
$params['periodo']['date']['end'] = (Carbon::createFromFormat('d/m/Y', "{$dateEnd}"))->endOfDay();
if (!is_null($timeStart ?? null)) {
$params['periodo']['date']['start'] = Carbon::createFromFormat('d/m/Y H:i:s', "{$dateStart} {$timeStart}");
}
if (!is_null($timeEnd)) {
$params['periodo']['date']['end'] = Carbon::createFromFormat('d/m/Y H:i:s', "{$dateEnd} {$timeEnd}");
}
$params['periodo']['date']['start'] = $params['periodo']['date']['start']->format('Y-m-d H:i');
$params['periodo']['date']['end'] = $params['periodo']['date']['end']->format('Y-m-d H:i');
}
private static function getDiasSemana($params)
{
$atendimentos = DB::table('integracao_erpsaude_atendimento AS at')
->select(
'at.data_atendimento'
)
->whereRaw("CONCAT(data_atendimento, ' ', horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
])
->get();
return $atendimentos
->map(function ($atendimento) {
$date = new Carbon($atendimento->data_atendimento);
return [
'valor' => $date->format('w'),
'descricao' => Str::ucfirst($date->translatedFormat('l'))
];
})
->unique('valor')
->sortBy('valor')
->values();
}
private static function getTipoAltas($params)
{
$query = DB::table('integracao_erpsaude_tipo_alta')
->select(
'integracao_erpsaude_tipo_alta.id',
'integracao_erpsaude_tipo_alta.descricao'
)
->join(
'integracao_erpsaude_atendimento',
'integracao_erpsaude_atendimento.tipo_alta_id',
'integracao_erpsaude_tipo_alta.id'
)
->whereNotNull(
'integracao_erpsaude_atendimento.tipo_alta_id',
)
->whereRaw("CONCAT(data_atendimento, ' ', horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $query);
}
$query->orderBy('integracao_erpsaude_tipo_alta.descricao');
return $query
->distinct()
->get();
}
private static function getProfissionais($params)
{
$query = DB::table('integracao_erpsaude_atendimento')
->select(
'integracao_erpsaude_atendimento.profissional as nome'
)
->distinct()
->whereRaw("CONCAT(data_atendimento, ' ', horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $query);
}
if (self::hasParamId($params, 'tipo_alta_id')) {
$query->where('integracao_erpsaude_atendimento.tipo_alta_id', $params['tipo_alta_id']);
}
return $query->orderBy('nome')->get();
}
private static function getCids($params)
{
$query = DB::table('integracao_erpsaude_atendimento')
->select(
'integracao_erpsaude_atendimento.cid10 as codigo',
DB::raw("IF(cid.id IS NULL, integracao_erpsaude_atendimento.cid10, CONCAT(cid.codigo, ' - ', cid.nome)) AS descricao"),
)
->leftJoin('sigtap.cid AS cid', 'cid.codigo', 'integracao_erpsaude_atendimento.cid10')
->distinct()
->whereRaw("CONCAT(data_atendimento, ' ', horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $query);
}
if (self::hasParamId($params, 'tipo_alta_id')) {
$query->where('integracao_erpsaude_atendimento.tipo_alta_id', $params['tipo_alta_id']);
}
if (isset($params['profissional'])) {
$query->where('integracao_erpsaude_atendimento.profissional', $params['profissional']);
}
return $query
->orderBy('descricao')
->get();
}
private static function getSexos($params)
{
$params = request()->all();
self::adjustPeriod($params);
$sexos = DB::table('integracao_erpsaude_paciente')
->select(
DB::raw("
CASE integracao_erpsaude_paciente.sexo
WHEN 'M' THEN 'Masculino'
WHEN 'F' THEN 'Feminino'
ELSE 'Não informado'
END AS descricao
"),
'integracao_erpsaude_paciente.sexo as value'
)
->distinct()
->join('integracao_erpsaude_atendimento', 'integracao_erpsaude_atendimento.paciente_id', 'integracao_erpsaude_paciente.id')
->whereRaw("CONCAT(data_atendimento, ' ', horario_atendimento) BETWEEN ? AND ?", [
$params['periodo']['date']['start'],
$params['periodo']['date']['end']
]);
if (isset($params['dia_semana'])) {
self::addWhereRawDayOfWeek($params['dia_semana'], $sexos);
}
if (self::hasParamId($params, 'alta_tipo_id')) {
$sexos->where('integracao_erpsaude_atendimento.alta_tipo_id', $params['alta_tipo_id']);
}
if (isset($params['cid'])) {
$sexos->where('integracao_erpsaude_atendimento.cid10', $params['cid']);
}
if (isset($params['profissional'])) {
$sexos->where('integracao_erpsaude_atendimento.profissional', $params['profissional']);
}
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
if (!is_null($idadeDe)) {
$sexos->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) >= ?", [$idadeDe]);
}
if (!is_null($idadeAte)) {
$sexos->whereRaw("(TIMESTAMPDIFF(YEAR, integracao_erpsaude_paciente.data_nascimento, CURRENT_DATE)) <= ?", [$idadeAte]);
}
if (self::hasParamId($params, 'paciente_id')) {
$sexos->where('integracao_erpsaude_paciente.id', $params['paciente_id']);
}
return $sexos->orderBy('sexo')->get();
}
private static function hasParamId($params, $param)
{
return isset($params[$param]) && $params[$param] > 0;
}
private static function getCidJoinSub() {
return DB::table('pronto_atendimento_atendimento_cid')
->select(
'pronto_atendimento_atendimento_cid.cid_id',
'pronto_atendimento_atendimento_cid.atendimento_id',
)
->union(
DB::table('pronto_atendimento_atendimento_procedimento')
->select(
'pronto_atendimento_atendimento_procedimento.cid_principal_id AS cid_id',
'pronto_atendimento_atendimento_procedimento.atendimento_id'
)
->where('pronto_atendimento_atendimento_procedimento.is_parametrizado', true)
);
}
private static function addWhereRawDayOfWeek($diaSemana, $query)
{
$diaSemana += 1;
$query->whereRaw("
DAYOFWEEK(integracao_erpsaude_atendimento.data_atendimento) = {$diaSemana}
");
}
private static function getModel()
{
return [
'periodo' => [
'date' => [
'start' => null,
'end' => null,
],
'time' => [
'start' => null,
'end' => null,
]
],
'dia_semana' => null,
'tipo_alta_id' => null,
'profissional' => null,
'cid_id' => null,
'paciente_id' => null,
'paciente' => null,
'cns' => null,
'sexo_id' => null,
'idade_de' => null,
'idade_ate' => null,
'quantidade' => null,
];
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Exportacao\Sexo as ExportacaoSexoEnum;
use App\Enums\Cadastro\SujeitoAtencao\Sexo as SexoEnum;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Utils\DataUtil;
use Carbon\Carbon;
use DOMDocument;
use DOMXPath;
use Exception;
use stdClass;
abstract class Ficha
{
protected $domx;
protected $inconsistenciaModel;
protected $inconsistencias;
protected $ficha;
public function __construct($xmlEnvio, $inconsistenciaModel)
{
$this->setDomx($xmlEnvio);
$this->inconsistenciaModel = $inconsistenciaModel;
$this->inconsistencias = json_decode($inconsistenciaModel->inconsistencia);
$this->ficha = new stdClass;
}
private function setDomx($xml)
{
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($xml);
$this->domx = new DOMXPath($dom);
}
protected function getFirstNodeValue($xmlPath, $context = null)
{
return $this->domx->query($xmlPath, $context)[0]->nodeValue ?? null;
}
protected function getDateString($date)
{
if (is_null($date)) {
return null;
}
return Carbon::createFromTimestamp($date / 1000)->format('d/m/Y');
}
protected function getDateTimeString($date)
{
if (is_null($date)) {
return null;
}
return Carbon::createFromTimestamp($date / 1000)->format('d/m/Y H:i:s');
}
protected function getSimNaoNaoInformado($value)
{
return $value ? DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($value)) : 'Não informado';
}
protected function getSexo($exportacaoSexoId)
{
$sexoId = null;
if ($exportacaoSexoId == ExportacaoSexoEnum::MASCULINO) {
$sexoId = SexoEnum::MASCULINO;
}
else if ($exportacaoSexoId == ExportacaoSexoEnum::FEMININO) {
$sexoId = SexoEnum::FEMININO;
}
else if ($exportacaoSexoId == ExportacaoSexoEnum::INDETERMINADO) {
$sexoId = SexoEnum::INDETERMINADO;
}
else {
return null;
}
return Sexo::find($sexoId)->descricao;
}
protected function getInconsistencias($callbacks)
{
$inconsistencias = [];
foreach ($callbacks as $item) {
$prefix = null;
$inconsistencia = null;
if (is_array($item)) {
$prefix = $item[0];
$inconsistencia = $this->getSafeString($item[1]);
}
else if (is_callable($item)) {
$inconsistencia = $this->getSafeString($item);
}
if (is_null($inconsistencia)) {
continue;
}
if (!is_null($prefix)) {
$inconsistencias[] = "{$prefix}: {$inconsistencia}";
}
else {
$inconsistencias[] = $inconsistencia;
}
}
return $inconsistencias;
}
private function getSafeString($callback)
{
try {
$value = $callback();
if (is_string($value)) {
return $value;
}
}
catch (Exception $_) {
return null;
}
return null;
}
}

View File

@@ -0,0 +1,322 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliarCondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\CondutaDesfecho;
use App\Models\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentodomiciliarmaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoDomiciliarMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoDomiciliarMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->atendimentoDomiciliar->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoDomiciliarMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentoDomiciliar->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoDomiciliarMasterTransportPath)
{
$path = "{$fichaAtendimentoDomiciliarMasterTransportPath}/atendimentosDomiciliares";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoModel = $this->inconsistenciaModel->atendimentoDomiciliarAtendimentos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosDomiciliares->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoModel, $inconsistencias);
$this->setCondicoesAvaliadas($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$this->setOutro($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosDomiciliares,
]),
];
}
private function setPaciente($atendimento, $atendimentoDomiciliarContext, $atendimentoModel, $inconsistencias)
{
$campos = (object) [
'nomeCidadao' => $atendimentoModel->paciente->cidadao->nome,
'turno' => $this->getFirstNodeValue('turno', $atendimentoDomiciliarContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoDomiciliarContext))->nome
: null,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoDomiciliarContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoDomiciliarContext)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $atendimentoDomiciliarContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoDomiciliarContext)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoDomiciliarContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoDomiciliarContext))->descricao
: null,
'atencaoDomiciliarModalidade' => $this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoDomiciliarContext)
? ModalidadeAtencaoDomiciliar::where(
'codigo_esus',
$this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoDomiciliarContext)
)->first()->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoDomiciliarContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoDomiciliarContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Modalidade', fn () => $inconsistencias->atencaoDomiciliarModalidade],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setOutro($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$campos = (object) [
'condutaDesfecho' => $this->getFirstNodeValue('condutaDesfecho', $atendimentoDomiciliarContext)
? trim(CondutaDesfecho::where(
'codigo',
$this->getFirstNodeValue('condutaDesfecho', $atendimentoDomiciliarContext)
)->first()->descricao)
: null,
];
$inconsistencias = $this->getInconsistencias([
['Conduta/Desfecho', fn () => $inconsistencias->condutaDesfecho],
]);
$atendimento->outro = (object) compact('campos', 'inconsistencias');
}
private function setCondicoesAvaliadas($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$condicoesAvaliadas = [];
foreach ($this->domx->query('condicoesAvaliadas', $atendimentoDomiciliarContext) as $context) {
$condicoesAvaliadas[] = trim(AtendimentoDomiciliarCondicaoAvaliada::where('codigo', $context->nodeValue)->first()->nome);
}
$atendimento->condicoesAvaliadas = (object) [
'lista' => $condicoesAvaliadas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->condicoesAvaliadas,
]),
];
}
private function setProblemasCondicoes($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoDomiciliarContext) as $i => $context) {
$inconsistenciasProblemaCondicao = [];
if (isset($inconsistencias->problemasCondicoes)) {
if (is_array($inconsistencias->problemasCondicoes)) {
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes[$i] ?? [];
}
else {
$posicao = $i + 1;
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes->{$posicao} ?? [];
}
}
$ciap = $this->getFirstNodeValue('ciap', $context)
? Ciap::where('codigo', $this->getFirstNodeValue('ciap', $context))->first()
: null;
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'campos' => (object) [
'ciap' => $ciap ? "{$ciap->codigo} - {$ciap->descricao}" : null,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['CIAP', fn () => $inconsistenciasProblemaCondicao->ciap],
['CID', fn () => $inconsistenciasProblemaCondicao->cid10],
['Avaliado', fn () => $inconsistenciasProblemaCondicao->isAvaliado],
]),
];
}
$atendimento->problemasCondicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setProcedimentos($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentos', $atendimentoDomiciliarContext) as $context) {
$procedimento = Procedimento::where('codigo', $context->nodeValue)->orderByDesc('competencia_id')->first();
$procedimentos[] = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->procedimentos,
]),
];
}
private function setIvcf($atendimento, $atendimentoDomiciliarContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoDomiciliarContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoDomiciliarContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoDomiciliarContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoDomiciliarContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoDomiciliarContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoDomiciliarContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoDomiciliarContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoDomiciliarContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoDomiciliarContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoDomiciliarContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoDomiciliarContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoDomiciliarContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoDomiciliarContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoDomiciliarContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoDomiciliarContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,550 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\Ambulatorio\ProblemaCondicaoSituacao;
use App\Models\AtencaoBasica\AtendimentoIndividual\AleitamentoMaterno;
use App\Models\AtencaoBasica\AtendimentoIndividual\CondicaoAvaliada;
use App\Models\AtencaoBasica\AtendimentoIndividual\Conduta;
use App\Models\AtencaoBasica\AtendimentoIndividual\DoencaTransmissivel;
use App\Models\AtencaoBasica\AtendimentoIndividual\Encaminhamento;
use App\Models\AtencaoBasica\AtendimentoIndividual\ExameSolicitadoAvaliado;
use App\Models\AtencaoBasica\AtendimentoIndividual\ModalidadeAtencaoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoIndividual\Nasf;
use App\Models\AtencaoBasica\AtendimentoIndividual\RacionalidadeSaude;
use App\Models\AtencaoBasica\AtendimentoIndividual\Rastreamento;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Parametrizacao\Exame\Exame;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoIndividual extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentoindividualmaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoIndividualMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoIndividualMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoIndividualMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoIndividualMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoIndividualMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$cns = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS");
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentosIndividuais()
->whereHas('usuarioAuxiliar', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q->where('cns', $cns))
)
->first()->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($cns),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoIndividualMasterTransportPath)
{
$path = "{$fichaAtendimentoIndividualMasterTransportPath}/atendimentosIndividuais";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoIndividualModel = $this->inconsistenciaModel->atendimentosIndividuais()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosIndividuais->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoIndividualModel, $inconsistencias);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setMedicoes($atendimento, $context, $inconsistencias);
$this->setGestante($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setExames($atendimento, $context, $inconsistencias);
$this->setObservacao($atendimento, $context, $inconsistencias);
$this->setEmulti($atendimento, $context, $inconsistencias);
$this->setConduta($atendimento, $context, $inconsistencias);
$this->setSolicitacoesOci($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosIndividuais,
]),
];
}
private function setPaciente($atendimento, $atendimentoIndividualContext, $atendimentoIndividualModel, $inconsistencias)
{
$campos = (object) [
'is_sexo_feminino' => $atendimentoIndividualModel->paciente->cidadao->sexo_id === Sexo::FEMININO,
'nomeCidadao' => $atendimentoIndividualModel->paciente->cidadao->nome,
'numeroProntuario' => $this->getFirstNodeValue('numeroProntuario', $atendimentoIndividualContext),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoIndividualContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoIndividualContext)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $atendimentoIndividualContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoIndividualContext)),
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numeroProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Sexo', fn () => $inconsistencias->sexo],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoIndividualContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoIndividualContext))->nome
: null,
'localDeAtendimento' => $this->getFirstNodeValue('localDeAtendimento', $atendimentoIndividualContext)
? LocalAtendimento::find($this->getFirstNodeValue('localDeAtendimento', $atendimentoIndividualContext))->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoIndividualContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoIndividualContext)
)->first()->descricao
: null,
'vacinaEmDia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('vacinaEmDia', $atendimentoIndividualContext))),
'atencaoDomiciliarModalidade' => $this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoIndividualContext)
? ModalidadeAtencaoDomiciliar::where(
'codigo_esus',
$this->getFirstNodeValue('atencaoDomiciliarModalidade', $atendimentoIndividualContext)
)->first()->descricao
: null,
'aleitamentoMaterno' => $this->getFirstNodeValue('aleitamentoMaterno', $atendimentoIndividualContext)
? AleitamentoMaterno::where(
'codigo_esus',
$this->getFirstNodeValue('aleitamentoMaterno', $atendimentoIndividualContext)
)->first()->descricao
: null,
'racionalidadeSaude' => $this->getFirstNodeValue('racionalidadeSaude', $atendimentoIndividualContext)
? RacionalidadeSaude::where(
'codigo_esus',
$this->getFirstNodeValue('racionalidadeSaude', $atendimentoIndividualContext)
)->first()->descricao
: null,
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoIndividualContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoIndividualContext)),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
['Vacinação em dia', fn () => $inconsistencias->vacinaEmDia],
['Atenção domiciliar', fn () => $inconsistencias->atencaoDomiciliarModalidade],
['Criança - Aleitamento materno', fn () => $inconsistencias->aleitamentoMaterno],
['Racionalidade em saúde (Exceto alopatia / convencional)', fn () => $inconsistencias->racionalidadeSaude],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setMedicoes($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoIndividualContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->medicoes = (object) compact('campos', 'inconsistencias');
}
private function setGestante($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'dumDaGestante' => $this->getDateString(
$this->getFirstNodeValue('dumDaGestante', $atendimentoIndividualContext)),
'idadeGestacional' => $this->getFirstNodeValue('idadeGestacional', $atendimentoIndividualContext),
'stGravidezPlanejada' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stGravidezPlanejada', $atendimentoIndividualContext))),
'nuGestasPrevias' => $this->getFirstNodeValue('nuGestasPrevias', $atendimentoIndividualContext),
'nuPartos' => $this->getFirstNodeValue('nuPartos', $atendimentoIndividualContext),
];
$inconsistencias = $this->getInconsistencias([
['DUM', fn () => $inconsistencias->dumDaGestante],
['Idade gestacional', fn () => $inconsistencias->idadeGestacional],
['Gravidez planejada', fn () => $inconsistencias->stGravidezPlanejada],
['Gestações prévias', fn () => $inconsistencias->nuGestasPrevias],
['Partos', fn () => $inconsistencias->nuPartos],
]);
$atendimento->gestante = (object) compact('campos', 'inconsistencias');
}
private function setProblemasCondicoes($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoIndividualContext) as $i => $context) {
$inconsistenciasProblemaCondicao = [];
if (isset($inconsistencias->problemasCondicoes)) {
if (is_array($inconsistencias->problemasCondicoes)) {
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes[$i] ?? [];
}
else {
$posicao = $i + 1;
$inconsistenciasProblemaCondicao = $inconsistencias->problemasCondicoes->{$posicao} ?? [];
}
}
$ciap = null;
if ($this->getFirstNodeValue('ciap', $context)) {
$codigo = $this->getFirstNodeValue('ciap', $context);
if ($ciap = Ciap::where('codigo', $codigo)->first()) {
$ciap = "{$ciap->codigo} - {$ciap->descricao}";
}
else if ($condicaoAvaliada = CondicaoAvaliada::where('codigo_esus', $codigo)->first()) {
$ciap = $condicaoAvaliada->descricao;
}
else if ($doencaTransmissivel = DoencaTransmissivel::where('codigo_esus', $codigo)->first()) {
$ciap = $doencaTransmissivel->descricao;
}
else if ($rastreamento = Rastreamento::where('codigo_esus', $codigo)->first()) {
$ciap = $rastreamento->descricao;
}
}
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'campos' => (object) [
'ciap' => $ciap,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'situacao' => !is_null($this->getFirstNodeValue('situacao', $context))
? ProblemaCondicaoSituacao::where('codigo_esus', $this->getFirstNodeValue('situacao', $context))->first()->nome
: null,
'dataInicioProblema' => $this->getFirstNodeValue('dataInicioProblema', $context)
? $this->getDateString($this->getFirstNodeValue('dataInicioProblema', $context))
: null,
'dataFimProblema' => $this->getFirstNodeValue('dataFimProblema', $context)
? $this->getDateString($this->getFirstNodeValue('dataFimProblema', $context))
: null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['CIAP', fn () => $inconsistenciasProblemaCondicao->ciap],
['CID', fn () => $inconsistenciasProblemaCondicao->cid10],
['Situação', fn () => $inconsistenciasProblemaCondicao->situacao],
['Início', fn () => $inconsistenciasProblemaCondicao->dataInicioProblema],
['Fim', fn () => $inconsistenciasProblemaCondicao->dataFimProblema],
['Avaliado', fn () => $inconsistenciasProblemaCondicao->isAvaliado],
]),
];
}
$atendimento->problemas_condicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setExames($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$exames = [];
foreach ($this->domx->query('exame', $atendimentoIndividualContext) as $context) {
$codigo = $this->getFirstNodeValue('codigoExame', $context);
$exame = (object) [
'is_solicitado' => 'Não',
'is_avaliado' => 'Não',
];
if ($exameSolicitadoAvaliado = ExameSolicitadoAvaliado::where('codigo_esus', $codigo)
->orWhere('codigo_procedimento', $codigo)->first()
) {
$exame->nome = $exameSolicitadoAvaliado->descricao;
}
else {
$parametrizacaoExame = Exame::where('codigo', $codigo)->first();
$exame->nome = $parametrizacaoExame->nome;
}
foreach ($this->domx->query('solicitadoAvaliado', $context) as $contextSolicitadoAvaliado) {
if ($contextSolicitadoAvaliado->nodeValue === 'S') {
$exame->is_solicitado = 'Sim';
}
else if ($contextSolicitadoAvaliado->nodeValue === 'A') {
$exame->is_avaliado = 'Sim';
}
}
$exames[] = $exame;
}
$atendimento->exames = (object) [
'lista' => $exames,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->exame,
]),
];
}
private function setObservacao($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'ficouEmObservacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('ficouEmObservacao', $atendimentoIndividualContext))),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->ficouEmObservacao,
]);
$atendimento->observacao = (object) compact('campos', 'inconsistencias');
}
private function setEmulti($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$emultis = [];
foreach ($this->domx->query('emultis', $atendimentoIndividualContext) as $context) {
$emultis[] = Nasf::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$atendimento->emultis = (object) [
'lista' => $emultis,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->emultis,
]),
];
}
private function setConduta($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$condutas = [];
foreach ($this->domx->query('condutas', $atendimentoIndividualContext) as $context) {
if ($conduta = Conduta::where('codigo_esus', $context->nodeValue)->first()) {
$condutas[] = $conduta->descricao;
}
else if ($encaminhamento = Encaminhamento::where('codigo_esus', $context->nodeValue)->first()) {
$condutas[] = $encaminhamento->descricao;
}
}
$atendimento->condutas = (object) [
'lista' => $condutas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->condutas,
]),
];
}
private function setSolicitacoesOci($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$solicitacoesOci = [];
foreach ($this->domx->query('solicitacoesOci', $atendimentoIndividualContext) as $context) {
$solicitacoesOci[] = (object) [
'codigoSigtap' => MaskUtil::getProcedimentoMasked($this->getFirstNodeValue('codigoSigtap', $context)),
];
}
$atendimento->solicitacoes_oci = (object) [
'lista' => $solicitacoesOci,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->solicitacoesOci,
]),
];
}
private function setIvcf($atendimento, $atendimentoIndividualContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoIndividualContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoIndividualContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoIndividualContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoIndividualContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoIndividualContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoIndividualContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoIndividualContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoIndividualContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoIndividualContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoIndividualContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoIndividualContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoIndividualContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoIndividualContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoIndividualContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoIndividualContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,564 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\CondutaEncaminhamento;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\Fornecimento;
use App\Enums\AtencaoBasica\AtendimentoOdontologico\VigilanciaBucal;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Integracao\Esus\Procedimentos as ProcedimentoEsus;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
use App\Models\AtencaoBasica\AtendimentoOdontologico\TipoConsulta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Geral\Ciap;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaAtendimentoOdontologico extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatendimentoodontologicomaster');
}
public function __invoke()
{
$path = '//ns4:fichaAtendimentoOdontologicoMasterTransport';
$this->setProfissionalResponsavel($path);
$this->setProfissionalAuxiliar($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissionalResponsavel($fichaAtendimentoOdontologicoMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoOdontologicoMasterTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalAuxiliar($fichaAtendimentoOdontologicoMasterTransportPath)
{
$headerTransportPath = "{$fichaAtendimentoOdontologicoMasterTransportPath}/headerTransport";
$lotacaoFormAtendimentoCompartilhadoPath = "{$headerTransportPath}/lotacaoFormAtendimentoCompartilhado";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cboCodigo_2002"))->first()
: null;
$cns = $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/profissionalCNS");
$campos = (object) [
'profissionalNome' => $this->inconsistenciaModel->atendimentosOdontologicos()
->whereHas('usuarioAuxiliar', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q->where('cns', $cns))
)
->first()->usuarioAuxiliar->cidadao->nome ?? null,
'profissionalCNS' => MaskUtil::getCnsMasked($cns),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormAtendimentoCompartilhadoPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormAtendimentoCompartilhado->ine],
]);
$this->ficha->profissional_auxiliar = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaAtendimentoOdontologicoMasterTransportPath)
{
$path = "{$fichaAtendimentoOdontologicoMasterTransportPath}/atendimentosOdontologicos";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoOdontologicoModel = $this->inconsistenciaModel->atendimentosOdontologicos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendimentosOdontologicos->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $atendimentoOdontologicoModel, $inconsistencias);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setVigilancia($atendimento, $context, $inconsistencias);
$this->setProblemasCondicoes($atendimento, $context, $inconsistencias);
$this->setMedicoes($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$this->setFornecimento($atendimento, $context, $inconsistencias);
$this->setConduta($atendimento, $context, $inconsistencias);
$this->setSolicitacoesOci($atendimento, $context, $inconsistencias);
$this->setExames($atendimento, $context, $inconsistencias);
$this->setIvcf($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendimentosOdontologicos,
]),
];
}
private function setPaciente($atendimento, $atendimentoOdontologicoContext, $atendimentoOdontologicoModel, $inconsistencias)
{
$campos = (object) [
'is_sexo_feminino' => $atendimentoOdontologicoModel->paciente->cidadao->sexo_id === Sexo::FEMININO,
'nomeCidadao' => $atendimentoOdontologicoModel->paciente->cidadao->nome,
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoOdontologicoContext),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoOdontologicoContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoOdontologicoContext)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $atendimentoOdontologicoContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoOdontologicoContext)),
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoOdontologicoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoOdontologicoContext))->nome
: null,
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoOdontologicoContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoOdontologicoContext))->descricao
: null,
'tipoAtendimento' => $this->getFirstNodeValue('tipoAtendimento', $atendimentoOdontologicoContext)
? TipoAtendimento::where(
'codigo_esus',
$this->getFirstNodeValue('tipoAtendimento', $atendimentoOdontologicoContext)
)->first()->descricao
: null,
'tiposConsultaOdonto' => $this->getFirstNodeValue('tiposConsultaOdonto', $atendimentoOdontologicoContext)
? TipoConsulta::where(
'codigo_esus',
$this->getFirstNodeValue('tiposConsultaOdonto', $atendimentoOdontologicoContext)
)->first()->descricao
: null,
'gestante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('gestante', $atendimentoOdontologicoContext))),
'necessidadesEspeciais' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('necessidadesEspeciais', $atendimentoOdontologicoContext))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoOdontologicoContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoOdontologicoContext)),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Tipo de atendimento', fn () => $inconsistencias->tipoAtendimento],
['Tipo de consulta', fn () => $inconsistencias->tiposConsultaOdonto],
['Gestante', fn () => $inconsistencias->gestante],
['Necessidades especiais', fn () => $inconsistencias->necessidadesEspeciais],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setVigilancia($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$vigilancias = [];
$getNome = function ($id) {
switch ($id) {
case VigilanciaBucal::ABSCESSO_DENTO_ALVEOLAR: {
return 'Abscesso Dento Alveolar';
}
case VigilanciaBucal::ALTERACAO_EM_TECIDOS_MOLES: {
return 'Alteração em Tecidos Moles';
}
case VigilanciaBucal::DOR_DE_DENTE: {
return 'Dor De Dente';
}
case VigilanciaBucal::FENDAS_FISSURAS_LABIO_PALATAIS: {
return 'Fendas ou Fissuras Lábio Palatais';
}
case VigilanciaBucal::FLUOROSE_DENTARIA_MODERADA_SEVERA: {
return 'Fluorose Dentária Moderada ou Sevéra';
}
case VigilanciaBucal::TRAUMATISMO_DENTO_ALVEOLAR: {
return 'Traumatismo Dento Alveolar';
}
case VigilanciaBucal::NAO_IDENTIFICADO: {
return 'Não Identificado';
}
}
};
foreach ($this->domx->query('tiposVigilanciaSaudeBucal', $atendimentoOdontologicoContext) as $context) {
$vigilancias[] = $getNome($context->nodeValue);
}
$atendimento->vigilancias = (object) [
'lista' => $vigilancias,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposVigilanciaSaudeBucal,
]),
];
}
private function setProblemasCondicoes($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$problemasCondicoes = [];
foreach ($this->domx->query('problemasCondicoes', $atendimentoOdontologicoContext) as $context) {
$ciap = $this->getFirstNodeValue('ciap', $context)
? Ciap::where('codigo', $this->getFirstNodeValue('ciap', $context))->first()
: null;
$cid = $this->getFirstNodeValue('cid10', $context)
? Cid::where('codigo', $this->getFirstNodeValue('cid10', $context))->first()
: null;
$problemasCondicoes[] = (object) [
'ciap' => $ciap ? "{$ciap->codigo} - {$ciap->descricao}" : null,
'cid10' => $cid ? MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}" : null,
'isAvaliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('isAvaliado', $context))),
];
}
$atendimento->problemas_condicoes = (object) [
'lista' => $problemasCondicoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->problemasCondicoes,
]),
];
}
private function setMedicoes($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoOdontologicoContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->medicoes = (object) compact('campos', 'inconsistencias');
}
private function setProcedimentos($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentosRealizados', $atendimentoOdontologicoContext) as $context) {
$codigo = $this->getFirstNodeValue('coMsProcedimento', $context);
if ($codigo === ProcedimentoEsus::ORIENTACAO_EM_SAUDE) {
$descricao = $codigo . " - Orientação Individual em Saúde";
} else {
$procedimento = Procedimento::where('codigo', $codigo)
->orderByDesc('competencia_id')
->first();
$descricao = $procedimento->codigo . " - {$procedimento->nome}";
}
$procedimentos[] = (object) [
'descricao' => $descricao,
'quantidade' => $this->getFirstNodeValue('quantidade', $context),
];
}
$procedimentosCallbacks = [];
$procedimentosRealizados = is_object($inconsistencias) ? ($inconsistencias->procedimentosRealizados ?? null) : null;
if (!empty($procedimentosRealizados)) {
foreach ($procedimentosRealizados as $item) {
foreach ((array) $item as $msg) {
$mensagem = $msg;
$procedimentosCallbacks[] = function () use ($mensagem) {
return $mensagem;
};
}
}
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias($procedimentosCallbacks),
];
}
private function setFornecimento($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$fornecimentos = [];
$getNome = function ($id) {
switch ($id) {
case Fornecimento::ESCOVA_DENTAL: {
return 'Escova Dental';
}
case Fornecimento::CREME_DENTAL: {
return 'Creme Dental';
}
case Fornecimento::FIO_DENTAL: {
return 'Fio Dental';
}
}
};
foreach ($this->domx->query('tiposFornecimOdonto', $atendimentoOdontologicoContext) as $context) {
$fornecimentos[] = $getNome($context->nodeValue);
}
$atendimento->fornecimentos = (object) [
'lista' => $fornecimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposFornecimOdonto,
]),
];
}
private function setConduta($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$condutas = [];
$getNome = function ($id) {
switch ($id) {
case CondutaEncaminhamento::ALTA_EPISODIO: {
return 'Alta do episódio';
}
case CondutaEncaminhamento::RETORNO_CONSULTA_AGENDADA: {
return 'Retorno para Consulta Agendada';
}
case CondutaEncaminhamento::AGENDAMENTO_OUTROS_PROFISSIONAIS: {
return 'Agendamento para Outros Profissionais AB';
}
case CondutaEncaminhamento::AGENDAMENTO_PARA_E_MULTI: {
return 'Agendamento para eMulti';
}
case CondutaEncaminhamento::AGENDAMENTO_GRUPOS: {
return 'Agendamento para Grupos';
}
case CondutaEncaminhamento::TRATAMENTO_CONCLUIDO: {
return 'Tratamento Concluído';
}
case CondutaEncaminhamento::ATENDIMENTO_PACIENTES_NECESSIDADES_ESPECIAIS: {
return 'Encaminhamento: Atendimento à Pacientes com Necessidades Especiais';
}
case CondutaEncaminhamento::CIRURGIA_BMF: {
return 'Encaminhamento: Cirurgia BMF';
}
case CondutaEncaminhamento::ENDODONTIA: {
return 'Encaminhamento: Endodontia';
}
case CondutaEncaminhamento::ESTOMATOLOGIA: {
return 'Encaminhamento: Estomatologia';
}
case CondutaEncaminhamento::IMPLANTODONTIA: {
return 'Encaminhamento: Implantodontia';
}
case CondutaEncaminhamento::ODONTOPEDIATRIA: {
return 'Encaminhamento: Odontopediatria';
}
case CondutaEncaminhamento::ORTODONTIA_ORTOPEDIA: {
return 'Encaminhamento: Ortodontia/Ortopedia';
}
case CondutaEncaminhamento::PERIDONTIA: {
return 'Encaminhamento: Peridontia';
}
case CondutaEncaminhamento::PROTESE_DENTARIA: {
return 'Encaminhamento: Prótese Dentária';
}
case CondutaEncaminhamento::RADIOLOGIA: {
return 'Encaminhamento: Radiologia';
}
case CondutaEncaminhamento::OUTROS: {
return 'Encaminhamento: Outros';
}
}
};
foreach ($this->domx->query('tiposEncamOdonto', $atendimentoOdontologicoContext) as $context) {
$condutas[] = $getNome($context->nodeValue);
}
$atendimento->condutas = (object) [
'lista' => $condutas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->tiposEncamOdonto,
]),
];
}
private function setSolicitacoesOci($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$solicitacoesOci = [];
foreach ($this->domx->query('solicitacoesOci', $atendimentoOdontologicoContext) as $context) {
$solicitacoesOci[] = (object) [
'codigoSigtap' => MaskUtil::getProcedimentoMasked($this->getFirstNodeValue('codigoSigtap', $context)),
];
}
$atendimento->solicitacoes_oci = (object) [
'lista' => $solicitacoesOci,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->solicitacoesOci,
]),
];
}
private function setExames($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$exames = [];
foreach ($this->domx->query('exame', $atendimentoOdontologicoContext) as $context) {
$exames[] = (object) [
'codigoExame' => $this->getFirstNodeValue('codigoExame', $context),
'solicitadoAvaliado' => $this->getFirstNodeValue('solicitadoAvaliado', $context) === 'S' ? 'Solicitado' : 'Avaliado',
];
}
$atendimento->exames = (object) [
'lista' => $exames,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->exame,
]),
];
}
private function setIvcf($atendimento, $atendimentoOdontologicoContext, $inconsistencias)
{
$campos = (object) [
'resultado' => $this->getFirstNodeValue('ivcf/resultado', $atendimentoOdontologicoContext),
'hasSgIdade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgIdade', $atendimentoOdontologicoContext))),
'hasSgPercepcaoSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgPercepcaoSaude', $atendimentoOdontologicoContext))),
'hasSgAvdInstrumental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdInstrumental', $atendimentoOdontologicoContext))),
'hasSgAvdBasica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAvdBasica', $atendimentoOdontologicoContext))),
'hasSgCognicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCognicao', $atendimentoOdontologicoContext))),
'hasSgHumor' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgHumor', $atendimentoOdontologicoContext))),
'hasSgAlcancePreensaoPinca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAlcancePreensaoPinca', $atendimentoOdontologicoContext))),
'hasSgCapAerobicaMuscular' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgCapAerobicaMuscular', $atendimentoOdontologicoContext))),
'hasSgMarcha' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgMarcha', $atendimentoOdontologicoContext))),
'hasSgContinencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgContinencia', $atendimentoOdontologicoContext))),
'hasSgVisao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgVisao', $atendimentoOdontologicoContext))),
'hasSgAudicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgAudicao', $atendimentoOdontologicoContext))),
'hasSgComorbidade' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue('ivcf/hasSgComorbidade', $atendimentoOdontologicoContext))),
'dataResultado' => $this->getFirstNodeValue('ivcf/dataResultado', $atendimentoOdontologicoContext),
];
$inconsistencias = $this->getInconsistencias([
['Resultado', fn () => $inconsistencias->ivcf->resultado],
['Idade', fn () => $inconsistencias->ivcf->hasSgIdade],
['Percepção de saúde', fn () => $inconsistencias->ivcf->hasSgPercepcaoSaude],
['Atividades instrumentais da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdInstrumental],
['Atividades básicas da vida diária', fn () => $inconsistencias->ivcf->hasSgAvdBasica],
['Cognição', fn () => $inconsistencias->ivcf->hasSgCognicao],
['Humor', fn () => $inconsistencias->ivcf->hasSgHumor],
['Alcance preensão pinça', fn () => $inconsistencias->ivcf->hasSgAlcancePreensaoPinca],
['Capacidade aeróbica muscular', fn () => $inconsistencias->ivcf->hasSgCapAerobicaMuscular],
['Marcha', fn () => $inconsistencias->ivcf->hasSgMarcha],
['Continência', fn () => $inconsistencias->ivcf->hasSgContinencia],
['Visão', fn () => $inconsistencias->ivcf->hasSgVisao],
['Audição', fn () => $inconsistencias->ivcf->hasSgAudicao],
['Comorbidade', fn () => $inconsistencias->ivcf->hasSgComorbidade],
['Data do resultado', fn () => $this->getDateString($inconsistencias->ivcf->dataResultado)],
]);
$atendimento->ivcf = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,310 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\AtividadeColetiva\AtividadeTipo as AtividadeColetivaAtividadeTipo;
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeTipo;
use App\Models\AtencaoBasica\AtividadeColetiva\Profissional;
use App\Models\AtencaoBasica\AtividadeColetiva\PublicoAlvo;
use App\Models\AtencaoBasica\AtividadeColetiva\ReuniaoTema;
use App\Models\AtencaoBasica\AtividadeColetiva\SaudePratica;
use App\Models\AtencaoBasica\AtividadeColetiva\SaudeTema;
use App\Models\AtencaoBasica\AtividadeColetiva\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaAtividadeColetiva extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaatividadecoletiva');
}
public function __invoke()
{
$path = '//ns4:fichaAtividadeColetivaTransport';
$this->setCadastro($path);
$this->setProfissionalResponsavel($path);
$this->setOutrosProfissionais($path);
$this->setAtividade($path);
$this->setTemasReuniao($path);
$this->setPublicoAlvo($path);
$this->setTemasSaude($path);
$this->setPraticasSaude($path);
$this->setParticipantes($path);
return $this->ficha;
}
private function setCadastro($fichaAtividadeColetivaTransportPath)
{
$headerTransportPath = "{$fichaAtividadeColetivaTransportPath}/headerTransport";
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'pseEducacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/pseEducacao"))),
'pseSaude' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/pseSaude"))),
'inep' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/inep"),
'outraLocalidade' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/outraLocalidade"),
'cnesLocalAtividade' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/cnesLocalAtividade"),
'turno' => $this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/turno")
? Turno::find($this->getFirstNodeValue("$fichaAtividadeColetivaTransportPath/turno"))->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['PSE educação', fn () => $this->inconsistencias->pseEducacao],
['PSE saúde', fn () => $this->inconsistencias->pseSaude],
['INEP', fn () => $this->inconsistencias->inep],
['Outra localidade', fn () => $this->inconsistencias->outraLocalidade],
['CNES', fn () => $this->inconsistencias->cnesLocalAtividade],
['Turno', fn () => $this->inconsistencias->turno],
]);
$this->ficha->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setProfissionalResponsavel($fichaAtividadeColetivaTransportPath)
{
$headerTransportPath = "{$fichaAtividadeColetivaTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->atividadeColetiva->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$profissionalInconsistencia = collect($this->inconsistencias->profissionais ?? [])
->pluck('cnsProfissional')
->filter()
->first();
$inconsistencias = $this->getInconsistencias([
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $profissionalInconsistencia],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional_responsavel = (object) compact('campos', 'inconsistencias');
}
private function setOutrosProfissionais($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$profissionais = [];
foreach ($this->domx->query("{$path}/profissionais") as $context) {
$ocupacao = $this->getFirstNodeValue('codigoCbo2002', $context)
? Ocupacao::where('codigo', $this->getFirstNodeValue('codigoCbo2002', $context))->first()
: null;
$profissionais[] = (object) [
'nomeProfissional' => Profissional::where('atividade_coletiva_id', $this->inconsistenciaModel->atividadeColetiva->id)
->whereHas('usuario', fn ($q) => $q
->whereHas('cidadao', fn ($q) => $q
->where('cns', $this->getFirstNodeValue('cnsProfissional', $context))
)
)
->first()->usuario->cidadao->nome
?? ($this->inconsistenciaModel->atividadeColetiva->usuario->cidadao->cns
=== $this->getFirstNodeValue('cnsProfissional', $context)
? $this->inconsistenciaModel->atividadeColetiva->usuario->cidadao->nome : null),
'cnsProfissional' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsProfissional', $context)),
'codigoCbo2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
];
}
$this->ficha->outros_profissionais = (object) [
'lista' => $profissionais,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->profissionais,
]),
];
}
private function setAtividade($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$atividadeTipoId = $this->getFirstNodeValue("{$path}/atividadeTipo");
$campos = (object) [
'showTemasReuniao' => collect([
AtividadeColetivaAtividadeTipo::REUNIAO_COM_OUTRAS_EQUIPES_DE_SAUDE,
AtividadeColetivaAtividadeTipo::REUNIAO_DE_EQUIPE,
AtividadeColetivaAtividadeTipo::REUNIAO_INTERSETORIAL_CONSELHO_LOCAL_DE_SAUDE_CONTROLE_SOCIAL,
])->contains($atividadeTipoId),
'showPublicoAlvoTemasSaude' => collect([
AtividadeColetivaAtividadeTipo::EDUCACAO_EM_SAUDE,
AtividadeColetivaAtividadeTipo::ATENDIMENTO_EM_GRUPO,
AtividadeColetivaAtividadeTipo::AVALIACAO_PROCEDIMENTO_COLETIVO,
AtividadeColetivaAtividadeTipo::MOBILIZACAO_SOCIAL,
])->contains($atividadeTipoId),
'showPraticasSaude' => collect([
AtividadeColetivaAtividadeTipo::ATENDIMENTO_EM_GRUPO,
AtividadeColetivaAtividadeTipo::AVALIACAO_PROCEDIMENTO_COLETIVO,
])->contains($atividadeTipoId),
'atividadeTipo' => $atividadeTipoId
? AtividadeTipo::find($atividadeTipoId)->descricao
: null,
'numParticipantes' => $this->getFirstNodeValue("{$path}/numParticipantes"),
'numAvaliacoesAlteradas' => $this->getFirstNodeValue("{$path}/numAvaliacoesAlteradas"),
];
$inconsistencias = $this->getInconsistencias([
['Atividade', fn () => $this->inconsistencias->atividadeTipo],
['Participantes', fn () => $this->inconsistencias->numParticipantes],
['Avaliações alteradas', fn () => $this->inconsistencias->numAvaliacoesAlteradas],
]);
$this->ficha->atividade = (object) compact('campos', 'inconsistencias');
}
private function setTemasReuniao($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$temas = [];
foreach ($this->domx->query("{$path}/temasParaReuniao") as $context) {
$temas[] = ReuniaoTema::find($context->nodeValue)->descricao;
}
$this->ficha->temas_reuniao = (object) [
'lista' => $temas,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->temasParaReuniao,
]),
];
}
private function setPublicoAlvo($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$publicosAlvos = [];
foreach ($this->domx->query("{$path}/publicoAlvo") as $context) {
$publicosAlvos[] = PublicoAlvo::find($context->nodeValue)->descricao;
}
$this->ficha->publico_alvo = (object) [
'lista' => $publicosAlvos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->publicoAlvo,
]),
];
}
private function setTemasSaude($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$temasSaude = [];
foreach ($this->domx->query("{$path}/temasParaSaude") as $context) {
$temasSaude[] = SaudeTema::find($context->nodeValue)->descricao;
}
$this->ficha->temas_saude = (object) [
'lista' => $temasSaude,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->temasParaSaude,
]),
];
}
private function setPraticasSaude($fichaAtividadeColetivaTransportPath)
{
$path = $fichaAtividadeColetivaTransportPath;
$praticasSaude = [];
foreach ($this->domx->query("{$path}/praticasEmSaude") as $context) {
$praticasSaude[] = SaudePratica::find($context->nodeValue)->descricao;
}
$this->ficha->praticas_saude = (object) [
'lista' => $praticasSaude,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->praticasEmSaude,
]),
];
}
private function setParticipantes($fichaAtividadeColetivaTransportPath)
{
$path = "{$fichaAtividadeColetivaTransportPath}/participantes";
$participantes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$participanteModel = $this->inconsistenciaModel->atividadeColetivaParticipantes()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->participantes->{$posicao} ?? [];
$participantes[] = (object) [
'campos' => (object) [
'nomeParticipante' => $participanteModel->paciente->cidadao->nome,
'cnsParticipante' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsParticipante', $context)),
'cpfParticipante' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfParticipante', $context)),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue('dataNascimento', $context)),
'avaliacaoAlterada' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('avaliacaoAlterada', $context))),
'peso' => $this->getFirstNodeValue('peso', $context),
'altura' => $this->getFirstNodeValue('altura', $context),
'cessouHabitoFumar' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('cessouHabitoFumar', $context))),
'abandonouGrupo' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('abandonouGrupo', $context))),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $context)),
],
'inconsistencias' => $this->getInconsistencias([
['CNS', fn () => $inconsistencias->cnsParticipante],
['CPF', fn () => $inconsistencias->cpfParticipante],
['Data de nascimento', fn () => $inconsistencias->dataNascimento],
['Alterada', fn () => $inconsistencias->avaliacaoAlterada],
['Peso', fn () => $inconsistencias->peso],
['Altura', fn () => $inconsistencias->altura],
['Parou de fumar', fn () => $inconsistencias->cessouHabitoFumar],
['Abandonou grupo', fn () => $inconsistencias->abandonouGrupo],
['Sexo', fn () => $inconsistencias->sexo],
]),
];
}
$this->ficha->participantes = (object) [
'lista' => $participantes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->participantes,
]),
];
}
}

View File

@@ -0,0 +1,311 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Avaliacao\Conclusao as AvaliacaoConclusao;
use App\Enums\AtencaoBasica\Avaliacao\Cuidador as AvaliacaoCuidador;
use App\Models\AtencaoBasica\Avaliacao\Conclusao;
use App\Models\AtencaoBasica\Avaliacao\CondicaoAvaliada;
use App\Models\AtencaoBasica\Avaliacao\Cuidador;
use App\Models\AtencaoBasica\Avaliacao\JustificativaConclusao;
use App\Models\AtencaoBasica\Avaliacao\Procedencia;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\SujeitoAtencao\EtniaIndigena;
use App\Models\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Models\Cadastro\SujeitoAtencao\RacaCor;
use App\Models\Geral\Turno;
use App\Models\Intranet\Estado;
use App\Models\Intranet\Pais;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaAvaliacao extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaavaliacaoelegibilidade');
}
public function __invoke()
{
$path = '//ns4:fichaAvaliacaoElegibilidadeTransport';
$this->setPaciente($path);
$this->setProfissional($path);
$this->setCondicoesAvalidas($path);
$this->setCid($path);
$this->setConclusao($path);
$this->setCuidador($path);
return $this->ficha;
}
private function setPaciente($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$campos = (object) [
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'dataNascimentoCidadao' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimentoCidadao")),
'sexoCidadao' => $this->getSexo($this->getFirstNodeValue("{$path}/sexoCidadao")),
'nomeCidadao' => $this->getFirstNodeValue("{$path}/nomeCidadao"),
'racaCorCidadao' => $this->getFirstNodeValue("{$path}/racaCorCidadao")
? RacaCor::where('codigo_esus', $this->getFirstNodeValue("{$path}/racaCorCidadao"))->first()->descricao
: null,
'nomeSocialCidadao' => $this->getFirstNodeValue("{$path}/nomeSocialCidadao"),
'nomeMaeCidadao' => $this->getFirstNodeValue("{$path}/nomeMaeCidadao"),
'desconheceNomeMae' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/desconheceNomeMae"))),
'codigoIbgeMunicipioNascimento' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipioNascimento"),
'nacionalidadeCidadao' => $this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
? Nacionalidade::where(
'codigo_esus',
$this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
)->first()->descricao
: null,
'emailCidadao' => $this->getFirstNodeValue("{$path}/emailCidadao"),
'numeroNisPisPasep' => $this->getFirstNodeValue("{$path}/numeroNisPisPasep"),
'nomePaiCidadao' => $this->getFirstNodeValue("{$path}/nomePaiCidadao"),
'desconheceNomePai' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/desconheceNomePai"))),
'dtNaturalizacao' => $this->getDateString($this->getFirstNodeValue("{$path}/dtNaturalizacao")),
'portariaNaturalizacao' => $this->getFirstNodeValue("{$path}/portariaNaturalizacao"),
'dtEntradaBrasil' => $this->getDateString($this->getFirstNodeValue("{$path}/dtEntradaBrasil")),
'paisNascimento' => $this->getFirstNodeValue("{$path}/paisNascimento")
? Pais::where('codigo_esus', $this->getFirstNodeValue("{$path}/paisNascimento"))->first()->nome
: null,
'etnia' => $this->getFirstNodeValue("{$path}/etnia")
? EtniaIndigena::where('codigo_cadsus', $this->getFirstNodeValue("{$path}/etnia"))->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $this->inconsistencias->dataNascimentoCidadao],
['Sexo', fn () => $this->inconsistencias->sexoCidadao],
['Nome', fn () => $this->inconsistencias->nomeCidadao],
['Raça/cor', fn () => $this->inconsistencias->racaCorCidadao],
['Nome social', fn () => $this->inconsistencias->nomeSocialCidadao],
['Nome da mãe', fn () => $this->inconsistencias->nomeMaeCidadao],
['Desconhece mãe', fn () => $this->inconsistencias->desconheceNomeMae],
['IBGE (Nascimento)', fn () => $this->inconsistencias->codigoIbgeMunicipioNascimento],
['Nacionalidade', fn () => $this->inconsistencias->nacionalidadeCidadao],
['E-mail', fn () => $this->inconsistencias->emailCidadao],
['PIS / PASEP | NIS', fn () => $this->inconsistencias->numeroNisPisPasep],
['Nome do pai', fn () => $this->inconsistencias->nomePaiCidadao],
['Desconhece pai', fn () => $this->inconsistencias->desconheceNomePai],
['Data de naturalização', fn () => $this->inconsistencias->dtNaturalizacao],
['Portaria de naturalização', fn () => $this->inconsistencias->portariaNaturalizacao],
['Data de entrada no Brasil', fn () => $this->inconsistencias->dtEntradaBrasil],
['País de nascimento', fn () => $this->inconsistencias->paisNascimento],
['Etnia', fn () => $this->inconsistencias->etnia],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
$this->setPacienteEndereco($path);
}
private function setPacienteEndereco($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = "{$fichaAvaliacaoElegibilidadeTransportPath}/endereco";
$campos = (object) [
'bairro' => $this->getFirstNodeValue("{$path}/bairro"),
'cep' => MaskUtil::getCepMasked($this->getFirstNodeValue("{$path}/cep")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipio"),
'complemento' => $this->getFirstNodeValue("{$path}/complemento"),
'nomeLogradouro' => $this->getFirstNodeValue("{$path}/nomeLogradouro"),
'numero' => $this->getFirstNodeValue("{$path}/numero"),
'numeroDneUf' => $this->getFirstNodeValue("{$path}/numeroDneUf")
? Estado::where('codigo', $this->getFirstNodeValue("{$path}/numeroDneUf"))->first()->uf
: null,
'telefoneContato' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneContato")),
'tipoLogradouroNumeroDne' => $this->getFirstNodeValue("{$path}/tipoLogradouroNumeroDne")
? LogradouroTipo::where(
'codigo',
$this->getFirstNodeValue("{$path}/tipoLogradouroNumeroDne")
)->first()->descricao
: null,
'stSemNumero' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean($this->getFirstNodeValue("{$path}/stSemNumero"))),
'pontoReferencia' => $this->getFirstNodeValue("{$path}/pontoReferencia"),
];
$inconsistencias = $this->getInconsistencias([
fn () => $this->inconsistencias->endereco,
['Bairro', fn () => $this->inconsistencias->endereco->bairro],
['CEP', fn () => $this->inconsistencias->endereco->cep],
['IBGE', fn () => $this->inconsistencias->endereco->codigoIbgeMunicipio],
['Complemento', fn () => $this->inconsistencias->endereco->complemento],
['Logradouro', fn () => $this->inconsistencias->endereco->nomeLogradouro],
['Número', fn () => $this->inconsistencias->endereco->numero],
['UF', fn () => $this->inconsistencias->endereco->numeroDneUf],
['Telefone', fn () => $this->inconsistencias->endereco->telefoneContato],
['Tipo de logradouro', fn () => $this->inconsistencias->endereco->tipoLogradouroNumeroDne],
['Sem número', fn () => $this->inconsistencias->endereco->stSemNumero],
['Ponto de referência', fn () => $this->inconsistencias->endereco->pontoReferencia],
]);
$this->ficha->paciente->campos->endereco = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($fichaAvaliacaoElegibilidadeTransportPath)
{
$headerTransportPath = "{$fichaAvaliacaoElegibilidadeTransportPath}/headerTransport";
$lotacaoFormPrincipalPath = "{$headerTransportPath}/lotacaoFormPrincipal";
$ocupacao = $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'turno' => $this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/turno")
? Turno::find($this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/turno"))->nome
: null,
'atencaoDomiciliarProcedencia' => $this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/atencaoDomiciliarProcedencia")
? Procedencia::find($this->getFirstNodeValue("{$fichaAvaliacaoElegibilidadeTransportPath}/atencaoDomiciliarProcedencia"))->descricao
: null,
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->avaliacao->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$lotacaoFormPrincipalPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $this->inconsistencias->turno],
['Procedência', fn () => $this->inconsistencias->atencaoDomiciliarProcedencia],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->lotacaoFormPrincipal->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setCondicoesAvalidas($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = "{$fichaAvaliacaoElegibilidadeTransportPath}/condicoesAvaliadas";
$condicoesAvaliadas = [];
foreach ($this->domx->query($path) as $context) {
$condicoesAvaliadas[] = CondicaoAvaliada::find($context->nodeValue)->descricao;
}
$this->ficha->condicoesAvaliadas = (object) [
'lista' => $condicoesAvaliadas,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->condicoesAvaliadas
]),
];
}
private function setCid($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$cidPrincipal = $this->getFirstNodeValue("{$path}/cid10Principal")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10Principal"))->first()
: null;
$cidSecundarioUm = $this->getFirstNodeValue("{$path}/cid10SecundarioUm")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10SecundarioUm"))->first()
: null;
$cidSecundarioDois = $this->getFirstNodeValue("{$path}/cid10SecundarioDois")
? Cid::where('codigo', $this->getFirstNodeValue("{$path}/cid10SecundarioDois"))->first()
: null;
$campos = (object) [
'cid10Principal' => $cidPrincipal
? MaskUtil::getCidMasked($cidPrincipal->codigo) . " - {$cidPrincipal->nome}"
: null,
'cid10SecundarioUm' => $cidSecundarioUm
? MaskUtil::getCidMasked($cidSecundarioUm->codigo) . " - {$cidSecundarioUm->nome}"
: null,
'cid10SecundarioDois' => $cidSecundarioDois
? MaskUtil::getCidMasked($cidSecundarioDois->codigo) . " - {$cidSecundarioDois->nome}"
: null,
];
$inconsistencias = $this->getInconsistencias([
['CID Primário', fn () => $this->inconsistencias->cid10Principal],
['CID Secundário', fn () => $this->inconsistencias->cid10SecundarioUm],
['CID Terciário', fn () => $this->inconsistencias->cid10SecundarioDois],
]);
$this->ficha->cid = (object) compact('campos', 'inconsistencias');
}
private function setConclusao($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$conclusao = $this->getFirstNodeValue("{$path}/atencaoDomiciliarModalidade")
? Conclusao::find($this->getFirstNodeValue("{$path}/atencaoDomiciliarModalidade"))
: null;
$campos = (object) [
'atencaoDomiciliarModalidade' => $conclusao->descricao ?? null,
'elegivel' => ($conclusao->id ?? null) !== AvaliacaoConclusao::INELEGIVEL,
'conclusaoDestinoInelegivel' => $this->getFirstNodeValue("{$path}/conclusaoDestinoInelegivel")
? JustificativaConclusao::where(
'codigo',
$this->getFirstNodeValue("{$path}/conclusaoDestinoInelegivel")
)->first()->descricao
: null,
'conclusaoDestinoElegivel' => $this->getFirstNodeValue("{$path}/conclusaoDestinoElegivel")
? JustificativaConclusao::where(
'codigo',
$this->getFirstNodeValue("{$path}/conclusaoDestinoElegivel")
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Conclusão', fn () => $this->inconsistencias->atencaoDomiciliarModalidade],
fn () => $this->inconsistencias->conclusaoDestinoInelegivel,
fn () => $this->inconsistencias->conclusaoDestinoElegivel,
]);
$this->ficha->conclusao = (object) compact('campos', 'inconsistencias');
}
private function setCuidador($fichaAvaliacaoElegibilidadeTransportPath)
{
$path = $fichaAvaliacaoElegibilidadeTransportPath;
$cuidador = $this->getFirstNodeValue("{$path}/cuidadorCidadao")
? Cuidador::find($this->getFirstNodeValue("{$path}/cuidadorCidadao"))
: null;
$campos = (object) [
'cuidadorCidadao' => $cuidador->descricao ?? null,
'possuiCuidador' => ($cuidador->id ?? null) !== AvaliacaoCuidador::NAO_POSSUI,
'cnsCuidador' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCuidador")),
'cpfCuidador' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCuidador")),
];
$inconsistencias = $this->getInconsistencias([
['Cuidador', fn () => $this->inconsistencias->cuidadorCidadao],
['CNS', fn () => $this->inconsistencias->cnsCuidador],
['CPF', fn () => $this->inconsistencias->cpfCuidador],
]);
$this->ficha->cuidador = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,377 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\CadastroDomiciliar\ImovelTipo as CadastroDomiciliarImovelTipo;
use App\Enums\AtencaoBasica\Exportacao\SalarioMinimo;
use App\Models\AtencaoBasica\CadastroDomiciliar\Abastecimento;
use App\Models\AtencaoBasica\CadastroDomiciliar\Animal;
use App\Models\AtencaoBasica\CadastroDomiciliar\DestinoLixo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\DomicilioTipoAcesso;
use App\Models\AtencaoBasica\CadastroDomiciliar\FormaEscoamento;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\CadastroDomiciliar\MaterialPredominante;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoDomicilio;
use App\Models\AtencaoBasica\CadastroDomiciliar\SituacaoRural;
use App\Models\AtencaoBasica\CadastroDomiciliar\Tratamento;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cadastro\Localizacao\Zona;
use App\Models\Intranet\Estado;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaCadastroDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/cadastrodomiciliar');
}
public function __invoke()
{
$path = '//ns4:cadastroDomiciliarTransport';
$this->setEndereco($path);
$this->setRecusaCadastro($path);
$this->setResidencia($path);
$this->setProfissional($path);
$this->setResidentes($path);
$this->setInstituicaoPermanencia($path);
return $this->ficha;
}
private function setEndereco($cadastroDomiciliarTransportPath)
{
$enderecoLocalPermanenciaPath = "{$cadastroDomiciliarTransportPath}/enderecoLocalPermanencia";
$campos = (object) [
'latitude' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/latitude"),
'longitude' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/longitude"),
'bairro' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/bairro"),
'cep' => MaskUtil::getCepMasked($this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/cep")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/codigoIbgeMunicipio"),
'complemento' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/complemento"),
'nomeLogradouro' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/nomeLogradouro"),
'numero' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numero"),
'numeroDneUf' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numeroDneUf")
? Estado::where('codigo', $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/numeroDneUf"))
->first()->uf
: null,
'telefoneContato' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/telefoneContato")),
'tipoLogradouroNumeroDne' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/tipoLogradouroNumeroDne")
? LogradouroTipo::where('codigo', $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/tipoLogradouroNumeroDne"))
->first()->descricao
: null,
'stSemNumero' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/stSemNumero"))),
'pontoReferencia' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/pontoReferencia"),
'microArea' => $this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/microArea"),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$enderecoLocalPermanenciaPath}/stForaArea"))),
];
$inconsistencias = $this->getInconsistencias([
['Latitude', fn () => $this->inconsistencias->latitude],
['Longitude', fn () => $this->inconsistencias->longitude],
['Bairro', fn () => $this->inconsistencias->enderecoLocalPermanencia->bairro],
['CEP', fn () => $this->inconsistencias->enderecoLocalPermanencia->cep],
['IBGE', fn () => $this->inconsistencias->enderecoLocalPermanencia->codigoIbgeMunicipio],
['Complemento', fn () => $this->inconsistencias->enderecoLocalPermanencia->complemento],
['Logradouro', fn () => $this->inconsistencias->enderecoLocalPermanencia->nomeLogradouro],
['Número', fn () => $this->inconsistencias->enderecoLocalPermanencia->numero],
['UF', fn () => $this->inconsistencias->enderecoLocalPermanencia->numeroDneUf],
['Telefone', fn () => $this->inconsistencias->enderecoLocalPermanencia->telefoneContato],
['Tipo de logradouro', fn () => $this->inconsistencias->enderecoLocalPermanencia->tipoLogradouroNumeroDne],
['Sem número', fn () => $this->inconsistencias->enderecoLocalPermanencia->stSemNumero],
['Ponto de referência', fn () => $this->inconsistencias->enderecoLocalPermanencia->pontoReferencia],
['Microárea', fn () => $this->inconsistencias->enderecoLocalPermanencia->microArea],
['Fora de área', fn () => $this->inconsistencias->enderecoLocalPermanencia->stForaArea],
]);
$this->ficha->endereco = (object) compact('campos', 'inconsistencias');
}
private function setRecusaCadastro($cadastroDomiciliarTransportPath)
{
$path = $cadastroDomiciliarTransportPath;
$campos = (object) [
'statusTermoRecusa' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTermoRecusa"))),
];
$inconsistencias = $this->getInconsistencias([
[
'Usuário recusou o cadastro por meio do termo de Recusa do Cadastro',
fn () => $this->inconsistencias->statusTermoRecusa
],
]);
$this->ficha->recusa_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setResidencia($cadastroDomiciliarTransportPath)
{
$condicaoMoradiaPath = "{$cadastroDomiciliarTransportPath}/condicaoMoradia";
$tipoImovel = $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/tipoDeImovel")
? ImovelTipo::where('codigo_esus', $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/tipoDeImovel"))
->first()
: null;
$campos = (object) [
'showInstituicaoPermanencia' => collect([
CadastroDomiciliarImovelTipo::ABRIGO,
CadastroDomiciliarImovelTipo::INSTITUICAO_LONGA_PERMANENCIA_IDOSOS,
CadastroDomiciliarImovelTipo::UNIDADE_PRISIONAL,
CadastroDomiciliarImovelTipo::UNIDADE_MEDIDA_SOCIO_EDUCATIVA,
CadastroDomiciliarImovelTipo::DELEGACIA
])->contains($tipoImovel->id ?? null),
'showResidentes' => ($tipoImovel->id ?? null) === CadastroDomiciliarImovelTipo::DOMICILIO,
'tipoDeImovel' => $tipoImovel->descricao ?? null,
'quantosAnimaisNoDomicilio' => $this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/quantosAnimaisNoDomicilio"),
'stAnimaisNoDomicilio' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$cadastroDomiciliarTransportPath}/stAnimaisNoDomicilio"))),
'abastecimentoAgua' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/abastecimentoAgua")
? Abastecimento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/abastecimentoAgua"))
->first()->descricao
: null,
'areaProducaoRural' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/areaProducaoRural")
? SituacaoRural::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/areaProducaoRural"))
->first()->descricao
: null,
'destinoLixo' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/destinoLixo")
? DestinoLixo::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/destinoLixo"))
->first()->descricao
: null,
'formaEscoamentoBanheiro' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/formaEscoamentoBanheiro")
? FormaEscoamento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/formaEscoamentoBanheiro"))
->first()->descricao
: null,
'localizacao' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/localizacao")
? Zona::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/localizacao"))->first()->descricao
: null,
'materialPredominanteParedesExtDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/materialPredominanteParedesExtDomicilio")
? MaterialPredominante::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/materialPredominanteParedesExtDomicilio"))
->first()->descricao
: null,
'nuComodos' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/nuComodos"),
'nuMoradores' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/nuMoradores"),
'situacaoMoradiaPosseTerra' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/situacaoMoradiaPosseTerra")
? SituacaoDomicilio::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/situacaoMoradiaPosseTerra"))
->first()->descricao
: null,
'stDisponibilidadeEnergiaEletrica' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$condicaoMoradiaPath}/stDisponibilidadeEnergiaEletrica"))),
'tipoAcessoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoAcessoDomicilio")
? DomicilioTipoAcesso::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoAcessoDomicilio"))
->first()->descricao
: null,
'tipoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoDomicilio")
? DomicilioTipo::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/tipoDomicilio"))
->first()->descricao
: null,
'aguaConsumoDomicilio' => $this->getFirstNodeValue("{$condicaoMoradiaPath}/aguaConsumoDomicilio")
? Tratamento::where('codigo_esus', $this->getFirstNodeValue("{$condicaoMoradiaPath}/aguaConsumoDomicilio"))
->first()->descricao
: null,
];
$animaisNoDomicilio = [];
foreach ($this->domx->query("{$cadastroDomiciliarTransportPath}/animaisNoDomicilio") as $context) {
$animaisNoDomicilio[] = Animal::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->animaisNoDomicilio = collect($animaisNoDomicilio)->join(', ');
$inconsistencias = $this->getInconsistencias([
['Tipo do imóvel', fn () => $this->inconsistencias->tipoDeImovel],
['Animais', fn () => $this->inconsistencias->animaisNoDomicilio],
['Quantidade', fn () => $this->inconsistencias->quantosAnimaisNoDomicilio],
['Possui animais?', fn () => $this->inconsistencias->stAnimaisNoDomicilio],
['Abastecimento de água', fn () => $this->inconsistencias->condicaoMoradia->abastecimentoAgua],
['Situação rural', fn () => $this->inconsistencias->condicaoMoradia->areaProducaoRural],
['Destino do lixo', fn () => $this->inconsistencias->condicaoMoradia->destinoLixo],
['Forma de escoamento sanitário', fn () => $this->inconsistencias->condicaoMoradia->formaEscoamentoBanheiro],
['Zona', fn () => $this->inconsistencias->condicaoMoradia->localizacao],
['Material predominante - paredes externas', fn () => $this->inconsistencias->condicaoMoradia->materialPredominanteParedesExtDomicilio],
['Cômodos', fn () => $this->inconsistencias->condicaoMoradia->nuComodos],
['Moradores', fn () => $this->inconsistencias->condicaoMoradia->nuMoradores],
['Situação', fn () => $this->inconsistencias->condicaoMoradia->situacaoMoradiaPosseTerra],
['Disponibilidade de energia elétrica', fn () => $this->inconsistencias->condicaoMoradia->stDisponibilidadeEnergiaEletrica],
['Tipo de acesso ao domicílio', fn () => $this->inconsistencias->condicaoMoradia->tipoAcessoDomicilio],
['Tipo de domicílio', fn () => $this->inconsistencias->condicaoMoradia->tipoDomicilio],
['Tratamento de água', fn () => $this->inconsistencias->condicaoMoradia->aguaConsumoDomicilio],
]);
$this->ficha->residencia = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($cadastroDomiciliarTransportPath)
{
$headerTransportPath = "{$cadastroDomiciliarTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->cadastroDomiciliar->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setResidentes($cadastroDomiciliarTransportPath)
{
$path = "{$cadastroDomiciliarTransportPath}/familias";
$residentes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$paciente = $this->inconsistenciaModel->cadastroDomiciliarPacientes()
->wherePivot('posicao', $posicao)
->first();
$residentes[] = (object) [
'nome' => $paciente->cidadao->nome,
'dataNascimentoResponsavel' => $this->getDateString($this->getFirstNodeValue('dataNascimentoResponsavel', $context)),
'numeroCnsResponsavel' => MaskUtil::getCnsMasked($this->getFirstNodeValue('numeroCnsResponsavel', $context)),
'cpfResponsavel' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfResponsavel', $context)),
'numeroMembrosFamilia' => $this->getFirstNodeValue('numeroMembrosFamilia', $context),
'numeroProntuario' => $this->getFirstNodeValue('numeroProntuario', $context),
'rendaFamiliar' => $this->getRendaFamiliar($this->getFirstNodeValue('rendaFamiliar', $context)),
];
}
$this->ficha->residentes = (object) [
'lista' => $residentes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->familias,
])
];
}
private function getRendaFamiliar($rendaId)
{
switch ($rendaId) {
case SalarioMinimo::UM_QUARTO_SALARIO_MINIMO: {
return 'Um quarto do salário mínimo';
}
case SalarioMinimo::MEIO_SALARIO_MINIMO: {
return 'Meio salário mínimo';
}
case SalarioMinimo::UM_QUARTO_SALARIO_MINIMO: {
return 'Um quarto do salário mínimo';
}
case SalarioMinimo::DOIS_SALARIO_MINIMO: {
return 'Dois salários mínimos';
}
case SalarioMinimo::TRES_SALARIO_MINIMO: {
return 'Três salários mínimos';
}
case SalarioMinimo::QUATRO_SALARIO_MINIMO: {
return 'Quatro salários mínimos';
}
case SalarioMinimo::ACIMA_QUATRO_SALARIO_MINIMO: {
return 'Acima de quatro salários mínimos';
}
default: {
return null;
}
}
}
private function setInstituicaoPermanencia($cadastroDomiciliarTransportPath)
{
$path = "{$cadastroDomiciliarTransportPath}/instituicaoPermanencia";
$campos = (object) [
'nomeInstituicaoPermanencia' => $this->getFirstNodeValue("{$path}/nomeInstituicaoPermanencia"),
'stOutrosProfissionaisVinculados' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/stOutrosProfissionaisVinculados"))),
];
$inconsistencias = $this->getInconsistencias([
[
'Nome da instituição de permanência',
fn () => $this->inconsistencias->instituicaoPermanencia->nomeInstituicaoPermanencia
],
[
'Existem outros profissionais de saúde vinculados à instituição (não inclui profissionais da rede pública de saúde)?',
fn () => $this->inconsistencias->instituicaoPermanencia->stOutrosProfissionaisVinculados
],
]);
$this->ficha->instituicao_permanencia = (object) compact('campos', 'inconsistencias');
$this->setIdentificacaoResponsavelTecnico($path);
}
private function setIdentificacaoResponsavelTecnico($instituicaoPermanenciaPath)
{
$path = $instituicaoPermanenciaPath;
$campos = (object) [
'nomeResponsavelTecnico' => $this->getFirstNodeValue("{$path}/nomeResponsavelTecnico"),
'cnsResponsavelTecnico' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsResponsavelTecnico")),
'cargoInstituicao' => $this->getFirstNodeValue("{$path}/cargoInstituicao"),
'telefoneResponsavelTecnico' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneResponsavelTecnico")),
];
$inconsistencias = $this->getInconsistencias([
[
'Responsável técnico pela instituição',
fn () => $this->inconsistencias->instituicaoPermanencia->nomeResponsavelTecnico
],
[
'CNS do responsável',
fn () => $this->inconsistencias->instituicaoPermanencia->cnsResponsavelTecnico
],
[
'Cargo na instituição',
fn () => $this->inconsistencias->instituicaoPermanencia->cargoInstituicao
],
[
'Telefone de contato',
fn () => $this->inconsistencias->instituicaoPermanencia->telefoneResponsavelTecnico
],
]);
$this->ficha->instituicao_permanencia->campos->identificacao_responsavel_tecnico = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,644 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\CadastroIndividual\SaidaCidadao as CadastroIndividualSaidaCidadao;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Models\AtencaoBasica\CadastroIndividual\AcompanhamentoInfantil;
use App\Models\AtencaoBasica\CadastroIndividual\AlimentacaoDiaria;
use App\Models\AtencaoBasica\CadastroIndividual\ComunidadeTradicional;
use App\Models\AtencaoBasica\CadastroIndividual\Curso;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaCardiaca;
use App\Models\AtencaoBasica\CadastroIndividual\DoencaRespiratoria;
use App\Models\AtencaoBasica\CadastroIndividual\HigienePessoal;
use App\Models\AtencaoBasica\CadastroIndividual\OrientacaoSexual;
use App\Models\AtencaoBasica\CadastroIndividual\OrigemAlimentacao;
use App\Models\AtencaoBasica\CadastroIndividual\Parentesco;
use App\Models\AtencaoBasica\CadastroIndividual\Peso;
use App\Models\AtencaoBasica\CadastroIndividual\ProblemasRins;
use App\Models\AtencaoBasica\CadastroIndividual\SaidaCidadao;
use App\Models\AtencaoBasica\CadastroIndividual\SituacaoMercadoTrabalho;
use App\Models\AtencaoBasica\CadastroIndividual\SituacaoRua;
use App\Models\Cadastro\SujeitoAtencao\DeficienciaBase;
use App\Models\Cadastro\SujeitoAtencao\EtniaIndigena;
use App\Models\Cadastro\SujeitoAtencao\IdentidadeGenero;
use App\Models\Cadastro\SujeitoAtencao\Nacionalidade;
use App\Models\Cadastro\SujeitoAtencao\RacaCor;
use App\Models\Intranet\Pais;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaCadastroIndividual extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/cadastroindividual');
}
public function __invoke()
{
$path = '//ns4:cadastroIndividualTransport';
$this->setProfissional($path);
$this->setPaciente($path);
$this->setInformacaoSociodemografica($path);
$this->setInformacaoSocioeconomica($path);
$this->setRecusaCadastro($path);
$this->setCondicaoSaudeGeral($path);
$this->setSituacaoRua($path);
return $this->ficha;
}
private function setProfissional($cadastroIndividualTransportPath)
{
$headerTransportPath = "{$cadastroIndividualTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->cadastroIndividual->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setPaciente($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/identificacaoUsuarioCidadao";
$campos = (object) [
'nomeSocial' => $this->getFirstNodeValue("{$path}/nomeSocial"),
'codigoIbgeMunicipioNascimento' => $this->getFirstNodeValue("{$path}/codigoIbgeMunicipioNascimento"),
'dataNascimentoCidadao' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimentoCidadao")),
'desconheceNomeMae' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/desconheceNomeMae"))),
'emailCidadao' => $this->getFirstNodeValue("{$path}/emailCidadao"),
'nacionalidadeCidadao' => $this->getFirstNodeValue("{$path}/nacionalidadeCidadao")
? Nacionalidade::where('codigo_esus', $this->getFirstNodeValue("{$path}/nacionalidadeCidadao"))
->first()->descricao
: null,
'nomeCidadao' => $this->getFirstNodeValue("{$path}/nomeCidadao"),
'nomeMaeCidadao' => $this->getFirstNodeValue("{$path}/nomeMaeCidadao"),
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'telefoneCelular' => MaskUtil::getPhoneMasked($this->getFirstNodeValue("{$path}/telefoneCelular")),
'numeroNisPisPasep' => $this->getFirstNodeValue("{$path}/numeroNisPisPasep"),
'paisNascimento' => $this->getFirstNodeValue("{$path}/paisNascimento")
? Pais::where('codigo_esus', $this->getFirstNodeValue("{$path}/paisNascimento"))->first()->nome
: null,
'racaCorCidadao' => $this->getFirstNodeValue("{$path}/racaCorCidadao")
? RacaCor::where('codigo_esus', $this->getFirstNodeValue("{$path}/racaCorCidadao"))->first()->descricao
: null,
'sexoCidadao' => $this->getSexo($this->getFirstNodeValue("{$path}/sexoCidadao")),
'statusEhResponsavel' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhResponsavel"))),
'etnia' => $this->getFirstNodeValue("{$path}/etnia")
? EtniaIndigena::where('codigo_cadsus', $this->getFirstNodeValue("{$path}/etnia"))->first()->descricao
: null,
'nomePaiCidadao' => $this->getFirstNodeValue("{$path}/nomePaiCidadao"),
'desconheceNomePai' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/desconheceNomePai"))),
'dtNaturalizacao' => $this->getDateString($this->getFirstNodeValue("{$path}/dtNaturalizacao")),
'portariaNaturalizacao' => $this->getFirstNodeValue("{$path}/portariaNaturalizacao"),
'dtEntradaBrasil' => $this->getDateString($this->getFirstNodeValue("{$path}/dtEntradaBrasil")),
'microArea' => $this->getFirstNodeValue("{$path}/microArea"),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/stForaArea"))),
];
$inconsistencias = $this->getInconsistencias([
['Nome social', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeSocial],
['IBGE (Nascimento)', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->codigoIbgeMunicipioNascimento],
['Data de nascimento', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dataNascimentoCidadao],
['Desconhece mãe', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->desconheceNomeMae],
['E-mail', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->emailCidadao],
['Nacionalidade', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nacionalidadeCidadao],
['Nome', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeCidadao],
['Nome da mãe', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomeMaeCidadao],
['CNS', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->cnsCidadao],
['CPF', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->cpfCidadao],
['Telefone', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->telefoneCelular],
['PIS / PASEP | NIS', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->numeroNisPisPasep],
['País de nascimento', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->paisNascimento],
['Raça/cor', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->racaCorCidadao],
['Sexo', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->sexoCidadao],
['É responsável', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->statusEhResponsavel],
['Etnia', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->etnia],
['Nome do pai', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->nomePaiCidadao],
['Desconhece pai', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->desconheceNomePai],
['Data de naturalização', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dtNaturalizacao],
['Portaria de naturalização', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->portariaNaturalizacao],
['Data de entrada no Brasil', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->dtEntradaBrasil],
['Microárea', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->microArea],
['Fora de área', fn () => $this->inconsistencias->identificacaoUsuarioCidadao->stForaArea],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setInformacaoSociodemografica($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/informacoesSocioDemograficas";
$ocupacao = $this->getFirstNodeValue("{$path}/ocupacaoCodigoCbo2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$path}/ocupacaoCodigoCbo2002"))->first()
: null;
$campos = (object) [
'grauInstrucaoCidadao' => $this->getFirstNodeValue("{$path}/grauInstrucaoCidadao")
? Curso::where('codigo_esus', $this->getFirstNodeValue("{$path}/grauInstrucaoCidadao"))->first()->descricao
: null,
'ocupacaoCodigoCbo2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'orientacaoSexualCidadao' => $this->getFirstNodeValue("{$path}/orientacaoSexualCidadao")
? OrientacaoSexual::where('codigo_esus', $this->getFirstNodeValue("{$path}/orientacaoSexualCidadao"))
->first()->descricao
: null,
'relacaoParentescoCidadao' => $this->getFirstNodeValue("{$path}/relacaoParentescoCidadao")
? Parentesco::where('codigo_esus', $this->getFirstNodeValue("{$path}/relacaoParentescoCidadao"))->first()->descricao
: null,
'situacaoMercadoTrabalhoCidadao' => $this->getFirstNodeValue("{$path}/situacaoMercadoTrabalhoCidadao")
? SituacaoMercadoTrabalho::where('codigo_esus', $this->getFirstNodeValue("{$path}/situacaoMercadoTrabalhoCidadao"))
->first()->descricao
: null,
'statusDesejaInformarOrientacaoSexual' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDesejaInformarOrientacaoSexual"))),
'statusFrequentaBenzedeira' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusFrequentaBenzedeira"))),
'statusFrequentaEscola' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusFrequentaEscola"))),
'statusMembroPovoComunidadeTradicional' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusMembroPovoComunidadeTradicional"))),
'statusParticipaGrupoComunitario' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusParticipaGrupoComunitario"))),
'statusPossuiPlanoSaudePrivado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusPossuiPlanoSaudePrivado"))),
'statusTemAlgumaDeficiencia' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemAlgumaDeficiencia"))),
'identidadeGeneroCidadao' => $this->getFirstNodeValue("{$path}/identidadeGeneroCidadao")
? IdentidadeGenero::where('codigo_esus', $this->getFirstNodeValue("{$path}/identidadeGeneroCidadao"))
->first()->descricao
: null,
'statusDesejaInformarIdentidadeGenero' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDesejaInformarIdentidadeGenero"))),
'coPovoComunidadeTradicional' => $this->getFirstNodeValue("{$path}/coPovoComunidadeTradicional")
? ComunidadeTradicional::where('codigo_esus', $this->getFirstNodeValue("{$path}/coPovoComunidadeTradicional"))
->first()->descricao
: null,
];
$deficienciasCidadao = [];
$responsaveisPorCrianca = [];
foreach ($this->domx->query("{$path}/deficienciasCidadao") as $context) {
$deficienciasCidadao[] = DeficienciaBase::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/responsavelPorCrianca") as $context) {
$responsaveisPorCrianca[] = AcompanhamentoInfantil::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->deficienciasCidadao = collect($deficienciasCidadao)->join(', ');
$campos->responsaveisPorCrianca = collect($responsaveisPorCrianca)->join(', ');
$inconsistencias = $this->getInconsistencias([
[
'Deficiências',
fn () => $this->inconsistencias->informacoesSocioDemograficas->deficienciasCidadao
],
[
'Qual é o curso mais elevado que frequenta ou frequentou?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->grauInstrucaoCidadao
],
[
'Ocupação',
fn () => $this->inconsistencias->informacoesSocioDemograficas->ocupacaoCodigoCbo2002
],
[
'Orientação sexual',
fn () => $this->inconsistencias->informacoesSocioDemograficas->orientacaoSexualCidadao
],
[
'Relação de parentesco com o responsável familiar',
fn () => $this->inconsistencias->informacoesSocioDemograficas->relacaoParentescoCidadao
],
[
'Situação no mercado de trabalho',
fn () => $this->inconsistencias->informacoesSocioDemograficas->situacaoMercadoTrabalhoCidadao
],
[
'Deseja informar orientação sexual?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusDesejaInformarOrientacaoSexual
],
[
'Frequenta cuidador tradicional?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusFrequentaBenzedeira
],
[
'Frequenta escola ou creche?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusFrequentaEscola
],
[
'É membro de povo ou comunidade tradicional?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusMembroPovoComunidadeTradicional
],
[
'Participa de grupo comunitário?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusParticipaGrupoComunitario
],
[
'Possui plano de saúde privado?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusPossuiPlanoSaudePrivado
],
[
'Tem alguma deficiência?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusTemAlgumaDeficiencia
],
[
'Identidade de gênero',
fn () => $this->inconsistencias->informacoesSocioDemograficas->identidadeGeneroCidadao
],
[
'Deseja informar identidade de gênero?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->statusDesejaInformarIdentidadeGenero
],
[
'Crianças de 0 a 9 anos, com quem fica?',
fn () => $this->inconsistencias->informacoesSocioDemograficas->responsavelPorCrianca
],
[
'Povo ou comunidade tradicional',
fn () => $this->inconsistencias->informacoesSocioDemograficas->coPovoComunidadeTradicional
],
]);
$this->ficha->informacao_sociodemografica = (object) compact('campos', 'inconsistencias');
$this->setSaidaCidadaoCadastro($cadastroIndividualTransportPath);
}
private function setSaidaCidadaoCadastro($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/saidaCidadaoCadastro";
$motivo = $this->getFirstNodeValue("{$path}/motivoSaidaCidadao")
? SaidaCidadao::where('codigo_esus', $this->getFirstNodeValue("{$path}/motivoSaidaCidadao"))->first()
: null;
$campos = (object) [
'is_motivo_saida_obito' => ($motivo->id ?? null) === CadastroIndividualSaidaCidadao::OBITO,
'motivoSaidaCidadao' => $motivo->descricao ?? null,
'dataObito' => $this->getDateString($this->getFirstNodeValue("{$path}/dataObito")),
'numeroDO' => $this->getFirstNodeValue("{$path}/numeroDO"),
];
$inconsistencias = $this->getInconsistencias([
['Motivo', fn () => $this->inconsistencias->saidaCidadaoCadastro->motivoSaidaCidadao],
['Data de óbito', fn () => $this->inconsistencias->saidaCidadaoCadastro->dataObito],
['Número da declaração de óbito', fn () => $this->inconsistencias->saidaCidadaoCadastro->numeroDO],
]);
$this->ficha->informacao_sociodemografica->campos->saida_cidadao_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setInformacaoSocioeconomica($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/informacoesSocioEconomicas";
$campos = (object) [
'alimentosAcabaramAntesTerDinheiroComprarMais' => $this->getSimNaoNaoInformado(
$this->getFirstNodeValue("{$path}/alimentosAcabaramAntesTerDinheiroComprarMais")),
'comeuAlgunsAlimentosQueTinhaDinheiroAcabou' => $this->getSimNaoNaoInformado(
$this->getFirstNodeValue("{$path}/comeuAlgunsAlimentosQueTinhaDinheiroAcabou")),
];
$inconsistencias = $this->getInconsistencias([
[
'Nos últimos três meses, os alimentos acabaram antes que você tivesse dinheiro para comprar mais comida?',
fn () => $this->inconsistencias->informacoesSocioEconomicas->alimentosAcabaramAntesTerDinheiroComprarMais
],
[
'Nos últimos três meses, você comeu apenas alguns alimentos que ainda tinha, porque o dinheiro acabou?',
fn () => $this->inconsistencias->informacoesSocioEconomicas->comeuAlgunsAlimentosQueTinhaDinheiroAcabou
],
]);
$this->ficha->informacao_socioeconomica = (object) compact('campos', 'inconsistencias');
}
private function setRecusaCadastro($cadastroIndividualTransportPath)
{
$path = $cadastroIndividualTransportPath;
$campos = (object) [
'statusTermoRecusaCadastroIndividualAtencaoBasica' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTermoRecusaCadastroIndividualAtencaoBasica")
)
)
];
$inconsistencias = $this->getInconsistencias([
[
'Usuário recusou o cadastro por meio do termo de Recusa do Cadastro',
fn () => $this->inconsistencias->statusTermoRecusaCadastroIndividualAtencaoBasica
],
]);
$this->ficha->recusa_cadastro = (object) compact('campos', 'inconsistencias');
}
private function setCondicaoSaudeGeral($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/condicoesDeSaude";
$campos = (object) [
'descricaoCausaInternacaoEm12Meses' => $this->getFirstNodeValue("{$path}/descricaoCausaInternacaoEm12Meses"),
'descricaoOutraCondicao1' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao1"),
'descricaoOutraCondicao2' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao2"),
'descricaoOutraCondicao3' => $this->getFirstNodeValue("{$path}/descricaoOutraCondicao3"),
'descricaoPlantasMedicinaisUsadas' => $this->getFirstNodeValue("{$path}/descricaoPlantasMedicinaisUsadas"),
'maternidadeDeReferencia' => $this->getFirstNodeValue("{$path}/maternidadeDeReferencia"),
'situacaoPeso' => $this->getFirstNodeValue("{$path}/situacaoPeso")
? Peso::where('codigo_esus', $this->getFirstNodeValue("{$path}/situacaoPeso"))->first()->descricao
: null,
'statusEhDependenteAlcool' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhDependenteAlcool"))),
'statusEhDependenteOutrasDrogas' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhDependenteOutrasDrogas"))),
'statusEhFumante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhFumante"))),
'statusEhGestante' => $this->inconsistenciaModel->cadastroIndividual->paciente->cidadao->sexo_id === Sexo::FEMININO
? DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEhGestante")))
: 'Não se aplica',
'statusEstaAcamado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEstaAcamado"))),
'statusEstaDomiciliado' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusEstaDomiciliado"))),
'statusTemDiabetes' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemDiabetes"))),
'statusTemDoencaRespiratoria' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemDoencaRespiratoria"))),
'statusTemHanseniase' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemHanseniase"))),
'statusTemHipertensaoArterial' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemHipertensaoArterial"))),
'statusTemTeveCancer' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTeveCancer"))),
'statusTemTeveDoencasRins' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTeveDoencasRins"))),
'statusTemTuberculose' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemTuberculose"))),
'statusTeveAvcDerrame' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveAvcDerrame"))),
'statusTeveDoencaCardiaca' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveDoencaCardiaca"))),
'statusTeveInfarto' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveInfarto"))),
'statusTeveInternadoEm12Meses' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTeveInternadoEm12Meses"))),
'statusUsaOutrasPraticasIntegrativasOuComplementares' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusUsaOutrasPraticasIntegrativasOuComplementares"))),
'statusUsaPlantaMedicinais' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusUsaPlantaMedicinais"))),
'statusDiagnosticoMental' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusDiagnosticoMental"))),
];
$doencasCardiacas = [];
$doencasRespiratorias = [];
$doencasRins = [];
foreach ($this->domx->query("{$path}/doencaCardiaca") as $context) {
$doencasCardiacas[] = DoencaCardiaca::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/doencaRespiratoria") as $context) {
$doencasRespiratorias[] = DoencaRespiratoria::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/doencaRins") as $context) {
$doencasRins[] = ProblemasRins::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->doencasCardiacas = collect($doencasCardiacas)->join(', ');
$campos->doencasRespiratorias = collect($doencasRespiratorias)->join(', ');
$campos->doencasRins = collect($doencasRins)->join(', ');
$inconsistencias = $this->getInconsistencias([
[
'Motivo internação nos últimos 12 meses',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoCausaInternacaoEm12Meses
],
[
'Outra condição de saúde 1',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao1
],
[
'Outra condição de saúde 2',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao2
],
[
'Outra condição de saúde 3',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoOutraCondicao3
],
[
'Quais plantas medicinais?',
fn () => $this->inconsistencias->condicoesDeSaude->descricaoPlantasMedicinaisUsadas
],
[
'Quais doenças cardíacas?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaCardiaca
],
[
'Quais doenças respiratórias?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaRespiratoria
],
[
'Quais problemas nos rins?',
fn () => $this->inconsistencias->condicoesDeSaude->doencaRins
],
[
'Qual é a maternidade de referência?',
fn () => $this->inconsistencias->condicoesDeSaude->maternidadeDeReferencia
],
[
'Peso',
fn () => $this->inconsistencias->condicoesDeSaude->situacaoPeso
],
[
'Usa álcool',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhDependenteAlcool
],
[
'Outras drogas',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhDependenteOutrasDrogas
],
[
'Fumante',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhFumante
],
[
'Gestante',
fn () => $this->inconsistencias->condicoesDeSaude->statusEhGestante
],
[
'Está acamado?',
fn () => $this->inconsistencias->condicoesDeSaude->statusEstaAcamado
],
[
'Está domiciliado?',
fn () => $this->inconsistencias->condicoesDeSaude->statusEstaDomiciliado
],
[
'Diabetes',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemDiabetes
],
[
'Tem doença respiratória/no pulmão?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemDoencaRespiratoria
],
[
'Está com hanseníase',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemHanseniase
],
[
'Hipertensão',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemHipertensaoArterial
],
[
'Tem ou teve câncer',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTeveCancer
],
[
'Tem ou teve problemas nos rins?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTeveDoencasRins
],
[
'Está com tuberculose',
fn () => $this->inconsistencias->condicoesDeSaude->statusTemTuberculose
],
[
'Teve AVC/Derrame',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveAvcDerrame
],
[
'Teve doença cardíaca/do coração?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveDoencaCardiaca
],
[
'Teve infarto',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveInfarto
],
[
'Teve internação nos últimos 12 meses?',
fn () => $this->inconsistencias->condicoesDeSaude->statusTeveInternadoEm12Meses
],
[
'Usa práticas integrativas e complementares?',
fn () => $this->inconsistencias->condicoesDeSaude->statusUsaOutrasPraticasIntegrativasOuComplementares
],
[
'Usa plantas medicinais?',
fn () => $this->inconsistencias->condicoesDeSaude->statusUsaPlantaMedicinais
],
[
'Fez ou faz tratamento psiquiátrico ou teve internação por problema de saúde mental?',
fn () => $this->inconsistencias->condicoesDeSaude->statusDiagnosticoMental
],
]);
$this->ficha->condicao_saude_geral = (object) compact('campos', 'inconsistencias');
}
private function setSituacaoRua($cadastroIndividualTransportPath)
{
$path = "{$cadastroIndividualTransportPath}/emSituacaoDeRua";
$campos = (object) [
'grauParentescoFamiliarFrequentado' => $this->getFirstNodeValue("{$path}/grauParentescoFamiliarFrequentado"),
'outraInstituicaoQueAcompanha' => $this->getFirstNodeValue("{$path}/outraInstituicaoQueAcompanha"),
'quantidadeAlimentacoesAoDiaSituacaoRua' => $this->getFirstNodeValue("{$path}/quantidadeAlimentacoesAoDiaSituacaoRua")
? AlimentacaoDiaria::where(
'codigo_esus',
$this->getFirstNodeValue("{$path}/quantidadeAlimentacoesAoDiaSituacaoRua")
)->first()->descricao
: null,
'statusAcompanhadoPorOutraInstituicao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusAcompanhadoPorOutraInstituicao"))),
'statusPossuiReferenciaFamiliar' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusPossuiReferenciaFamiliar"))),
'statusRecebeBeneficio' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusRecebeBeneficio"))),
'em_situacao_rua' => !is_null($this->getFirstNodeValue("{$path}/statusSituacaoRua")),
'statusSituacaoRua' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusSituacaoRua"))),
'statusTemAcessoHigienePessoalSituacaoRua' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusTemAcessoHigienePessoalSituacaoRua"))),
'statusVisitaFamiliarFrequentemente' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue("{$path}/statusVisitaFamiliarFrequentemente"))),
'tempoSituacaoRua' => $this->getFirstNodeValue("{$path}/tempoSituacaoRua")
? SituacaoRua::where('codigo_esus', $this->getFirstNodeValue("{$path}/tempoSituacaoRua"))->first()->descricao
: null,
];
$higienePessoal = [];
$origemAlimentos = [];
foreach ($this->domx->query("{$path}/higienePessoalSituacaoRua") as $context) {
$higienePessoal[] = HigienePessoal::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
foreach ($this->domx->query("{$path}/origemAlimentoSituacaoRua") as $context) {
$origemAlimentos[] = OrigemAlimentacao::where('codigo_esus', $context->nodeValue)->first()->descricao;
}
$campos->higienePessoal = collect($higienePessoal)->join(', ');
$campos->origemAlimentos = collect($origemAlimentos)->join(', ');
$inconsistencias = $this->getInconsistencias([
['Parentesco', fn () => $this->inconsistencias->emSituacaoDeRua->grauParentescoFamiliarFrequentado],
['Higiene pessoal', fn () => $this->inconsistencias->emSituacaoDeRua->higienePessoalSituacaoRua],
['Origem da alimentação', fn () => $this->inconsistencias->emSituacaoDeRua->origemAlimentoSituacaoRua],
['Outra instituição', fn () => $this->inconsistencias->emSituacaoDeRua->outraInstituicaoQueAcompanha],
['Alimentação diária', fn () => $this->inconsistencias->emSituacaoDeRua->quantidadeAlimentacoesAoDiaSituacaoRua],
['Acompanhado por outra instituição?', fn () => $this->inconsistencias->emSituacaoDeRua->statusAcompanhadoPorOutraInstituicao],
['Possui referência familiar?', fn () => $this->inconsistencias->emSituacaoDeRua->statusPossuiReferenciaFamiliar],
['Recebe algum benefício?', fn () => $this->inconsistencias->emSituacaoDeRua->statusRecebeBeneficio],
['Em situação de rua?', fn () => $this->inconsistencias->emSituacaoDeRua->statusSituacaoRua],
['Acesso a higiene pessoal?', fn () => $this->inconsistencias->emSituacaoDeRua->statusTemAcessoHigienePessoalSituacaoRua],
['Visita algum familiar com frequência?', fn () => $this->inconsistencias->emSituacaoDeRua->statusVisitaFamiliarFrequentemente],
['Tempo em situação de rua', fn () => $this->inconsistencias->emSituacaoDeRua->tempoSituacaoRua],
]);
$this->ficha->situacao_rua = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,169 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarFundoOlho;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarRessonanciaMagnetica;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTesteOlho;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTesteOrelha;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarTomografiaComputadorizada;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementarUsTransfontanela;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\MaskUtil;
class FichaComplementar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichacomplementarzikamicrocefalia');
}
public function __invoke()
{
$path = '//ns4:fichaComplementarZikaMicrocefaliaTransport';
$this->setCadastro($path);
$this->setPaciente($path);
$this->setExames($path);
return $this->ficha;
}
private function setCadastro($fichaComplementarZikaMicrocefaliaTransportPath)
{
$headerTransportPath = "{$fichaComplementarZikaMicrocefaliaTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'turno' => $this->getFirstNodeValue("{$fichaComplementarZikaMicrocefaliaTransportPath}/turno")
? Turno::find($this->getFirstNodeValue("{$fichaComplementarZikaMicrocefaliaTransportPath}/turno"))->nome
: null,
'profissionalNome' => $this->inconsistenciaModel->fichaComplementar->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $this->inconsistencias->turno],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
]);
$this->ficha->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setPaciente($fichaComplementarZikaMicrocefaliaTransportPath)
{
$path = $fichaComplementarZikaMicrocefaliaTransportPath;
$campos = (object) [
'nomeCidadao' => $this->inconsistenciaModel->fichaComplementar->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'nomeResponsavelFamiliar' => CadastroIndividual::where(
'paciente_id',
$this->inconsistenciaModel->fichaComplementar->paciente_id
)->first()->responsavelCidadao->nome ?? null,
'cnsResponsavelFamiliar' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsResponsavelFamiliar")),
'cpfResponsavelFamiliar' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfResponsavelFamiliar")),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['CNS (Responsável familiar)', fn () => $this->inconsistencias->cnsResponsavelFamiliar],
['CPF (Responsável familiar)', fn () => $this->inconsistencias->cpfResponsavelFamiliar],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setExames($fichaComplementarZikaMicrocefaliaTransportPath)
{
$path = $fichaComplementarZikaMicrocefaliaTransportPath;
$campos = (object) [
'dataRealizacaoTesteOlhinho' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTesteOlhinho")),
'coResultadoTesteOlhinho' => $this->getFirstNodeValue("{$path}/coResultadoTesteOlhinho")
? FichaComplementarTesteOlho::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTesteOlhinho")
)->first()->descricao
: null,
'dataRealizacaoExameFundoOlho' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoExameFundoOlho")),
'coResultadoExameFundoOlho' => $this->getFirstNodeValue("{$path}/coResultadoExameFundoOlho")
? FichaComplementarFundoOlho::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoExameFundoOlho")
)->first()->descricao
: null,
'dataRealizacaoTesteOrelhinha' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTesteOrelhinha")),
'coResultadoTesteOrelhinha' => $this->getFirstNodeValue("{$path}/coResultadoTesteOrelhinha")
? FichaComplementarTesteOrelha::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTesteOrelhinha")
)->first()->descricao
: null,
'dataRealizacaoUSTransfontanela' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoUSTransfontanela")),
'coResultadoUsTransfontanela' => $this->getFirstNodeValue("{$path}/coResultadoUsTransfontanela")
? FichaComplementarUsTransfontanela::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoUsTransfontanela")
)->first()->descricao
: null,
'dataRealizacaoTomografiaComputadorizada' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoTomografiaComputadorizada")),
'coResultadoTomografiaComputadorizada' => $this->getFirstNodeValue("{$path}/coResultadoTomografiaComputadorizada")
? FichaComplementarTomografiaComputadorizada::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoTomografiaComputadorizada")
)->first()->descricao
: null,
'dataRealizacaoRessonanciaMagnetica' => $this->getDateString(
$this->getFirstNodeValue("{$path}/dataRealizacaoRessonanciaMagnetica")),
'coResultadoRessonanciaMagnetica' => $this->getFirstNodeValue("{$path}/coResultadoRessonanciaMagnetica")
? FichaComplementarRessonanciaMagnetica::where(
'codigo',
$this->getFirstNodeValue("{$path}/coResultadoRessonanciaMagnetica")
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
fn () => $this->inconsistencias->{"Resultados de exames"},
['Teste do Olhinho', fn () => $this->inconsistencias->dataRealizacaoTesteOlhinho],
['Resultado - Teste do Olhinho', fn () => $this->inconsistencias->coResultadoTesteOlhinho],
['Fundo de olho', fn () => $this->inconsistencias->dataRealizacaoExameFundoOlho],
['Resultado - Fundo de olho', fn () => $this->inconsistencias->coResultadoExameFundoOlho],
['Teste da Orelhinha', fn () => $this->inconsistencias->dataRealizacaoTesteOrelhinha],
['Resultado - Teste da Orelhinha', fn () => $this->inconsistencias->coResultadoTesteOrelhinha],
['US Transfontanela', fn () => $this->inconsistencias->dataRealizacaoUSTransfontanela],
['Resultado - US Transfontanela', fn () => $this->inconsistencias->coResultadoUsTransfontanela],
['Tomografia Computadorizada', fn () => $this->inconsistencias->dataRealizacaoTomografiaComputadorizada],
['Resultado - Tomografia Computadorizada', fn () => $this->inconsistencias->coResultadoTomografiaComputadorizada],
['Ressonância Magnética', fn () => $this->inconsistencias->dataRealizacaoRessonanciaMagnetica],
['Resultado - Ressonância Magnética', fn () => $this->inconsistencias->coResultadoRessonanciaMagnetica],
]);
$this->ficha->exames = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,169 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarPergunta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentarResposta;
use App\Models\Sigtap\Ocupacao;
use App\Utils\MaskUtil;
class FichaConsumoAlimentar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaconsumoalimentar');
}
public function __invoke()
{
$path = '//ns4:fichaConsumoAlimentarTransport';
$this->setPaciente($path);
$this->setProfissional($path);
$this->setQuestionario($path);
return $this->ficha;
}
private function setPaciente($fichaConsumoAlimentarTransportPath)
{
$path = $fichaConsumoAlimentarTransportPath;
$campos = (object) [
'nomeCidadao' => $this->inconsistenciaModel->consumoAlimentar->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$path}/cnsCidadao")),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue("{$path}/cpfCidadao")),
'dataNascimento' => $this->getDateString($this->getFirstNodeValue("{$path}/dataNascimento")),
'sexo' => $this->getSexo($this->getFirstNodeValue("{$path}/sexo")),
];
$inconsistencias = $this->getInconsistencias([
['CNS', fn () => $this->inconsistencias->cnsCidadao],
['CPF', fn () => $this->inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $this->inconsistencias->dataNascimento],
['Sexo', fn () => $this->inconsistencias->sexo],
]);
$this->ficha->paciente = (object) compact('campos', 'inconsistencias');
}
private function setProfissional($fichaConsumoAlimentarTransportPath)
{
$headerTransportPath = "{$fichaConsumoAlimentarTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'localAtendimento' => $this->getFirstNodeValue("{$fichaConsumoAlimentarTransportPath}/localAtendimento")
? LocalAtendimento::find($this->getFirstNodeValue("{$fichaConsumoAlimentarTransportPath}/localAtendimento"))->descricao
: null,
'profissionalNome' => $this->inconsistenciaModel->consumoAlimentar->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
];
$inconsistencias = $this->getInconsistencias([
['Local de atendimento', fn () => $this->inconsistencias->localAtendimento],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setQuestionario($fichaConsumoAlimentarTransportPath)
{
$path = $fichaConsumoAlimentarTransportPath;
$inconsistenciaQuestionario = null;
$titulo = null;
$tituloConsumiu = null;
if ($this->domx->query("{$path}/perguntasQuestionarioCriancasDeSeisVinteTresMeses")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasDeSeisVinteTresMeses";
$titulo = 'Crianças de 6 a 23 meses';
$tituloConsumiu = 'Ontem a criança consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasDeSeisVinteTresMeses;
}
else if ($this->domx->query("{$path}/perguntasQuestionarioCriancasComMaisDoisAnos")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasComMaisDoisAnos";
$titulo = 'Crianças com 2 anos ou mais, adolescentes, adultos, gestantes e idosos';
$tituloConsumiu = 'Ontem você consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasComMaisDoisAnos;
}
else if ($this->domx->query("{$path}/perguntasQuestionarioCriancasMenoresSeisMeses")->length > 0) {
$path = "{$path}/perguntasQuestionarioCriancasMenoresSeisMeses";
$titulo = 'Crianças menores de 6 meses';
$tituloConsumiu = 'Ontem a criança consumiu';
$inconsistenciaQuestionario =
fn () => $this->inconsistencias->perguntasQuestionarioCriancasMenoresSeisMeses;
}
$perguntas = [];
$getResposta = function ($descricaoEsus) {
return MarcadorConsumoAlimentarResposta::where('descricao_esus', $descricaoEsus)
->first()
->descricao;
};
foreach ($this->domx->query($path) as $context) {
$perguntaModel = MarcadorConsumoAlimentarPergunta::where(
'descricao_esus',
$this->getFirstNodeValue('pergunta', $context)
)->first();
$pergunta = (object) [
'pergunta' => $perguntaModel->descricao,
'area_ontem_consumiu' => $perguntaModel->area_ontem_consumiu,
];
if ($resposta = $this->getFirstNodeValue('respostaUnicaEscolha', $context)) {
$pergunta->respostas = [$getResposta($resposta)];
}
else {
$pergunta->respostas = [];
foreach ($this->domx->query('respostaMultiplaEscolha', $context) as $context) {
$pergunta->respostas[] = $getResposta($context->nodeValue);
}
}
$perguntas[] = $pergunta;
}
$this->ficha->questionario = (object) [
'titulo' => $titulo,
'titulo_consumiu' => $tituloConsumiu,
'lista' => $perguntas,
'inconsistencias' => $this->getInconsistencias([
$inconsistenciaQuestionario,
]),
];
}
}

View File

@@ -0,0 +1,247 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Models\Ambulatorio\GlicemiaCapilarMomentoColeta;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\AtencaoBasica\Procedimento\PequenaCirurgia;
use App\Models\AtencaoBasica\Procedimento\TesteRapido;
use App\Models\AtencaoBasica\Procedimento\ViaAdministracao;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Models\Sigtap\Procedimento;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaProcedimento extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichaprocedimentomaster');
}
public function __invoke()
{
$path = '//ns4:fichaProcedimentoMasterTransport';
$this->setProfissional($path);
$this->setAtendimentos($path);
$this->setProcedimentosConsolidados($path);
return $this->ficha;
}
private function setProfissional($fichaProcedimentoMasterTransportPath)
{
$headerTransportPath = "{$fichaProcedimentoMasterTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->procedimento->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaProcedimentoMasterTransportPath)
{
$path = "{$fichaProcedimentoMasterTransportPath}/atendProcedimentos";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$atendimentoModel = $this->inconsistenciaModel->procedimentoAtendimentos()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->atendProcedimentos->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setAtendimento($atendimento, $context, $atendimentoModel, $inconsistencias);
$this->setInformacoesGerais($atendimento, $context, $inconsistencias);
$this->setProcedimentos($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->atendProcedimentos,
]),
];
}
private function setAtendimento($atendimento, $atendimentoContext, $atendimentoModel, $inconsistencias)
{
$campos = (object) [
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoContext),
'nomeCidadao' => $atendimentoModel->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoContext)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $atendimentoContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoContext)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $atendimentoContext)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $atendimentoContext))->descricao
: null,
'turno' => $this->getFirstNodeValue('turno', $atendimentoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoContext))->nome
: null,
'statusEscutaInicialOrientacao' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('statusEscutaInicialOrientacao', $atendimentoContext))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $atendimentoContext)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $atendimentoContext)),
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Turno', fn () => $inconsistencias->turno],
['Escuta Inicial/Orientação', fn () => $inconsistencias->statusEscutaInicialOrientacao],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setInformacoesGerais($atendimento, $atendimentoContext, $inconsistencias)
{
$medicoes = $this->domx->query('medicoes', $atendimentoContext);
$medicoesContext = $medicoes->length > 0 ? $medicoes[0] : null;
$campos = (object) [
'circunferenciaAbdominal' => $this->getFirstNodeValue('circunferenciaAbdominal', $medicoesContext),
'perimetroPanturrilha' => $this->getFirstNodeValue('perimetroPanturrilha', $medicoesContext),
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoArterialSistolica', $medicoesContext)
. '/' . $this->getFirstNodeValue('pressaoArterialDiastolica', $medicoesContext), '/'),
'frequenciaRespiratoria' => $this->getFirstNodeValue('frequenciaRespiratoria', $medicoesContext),
'frequenciaCardiaca' => $this->getFirstNodeValue('frequenciaCardiaca', $medicoesContext),
'temperatura' => $this->getFirstNodeValue('temperatura', $medicoesContext),
'saturacaoO2' => $this->getFirstNodeValue('saturacaoO2', $medicoesContext),
'glicemiaCapilar' => $this->getFirstNodeValue('glicemiaCapilar', $medicoesContext),
'tipoGlicemiaCapilar' => !is_null($this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext))
? GlicemiaCapilarMomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemiaCapilar', $medicoesContext)
)->first()->nome
: null,
'peso' => $this->getFirstNodeValue('peso', $medicoesContext),
'altura' => $this->getFirstNodeValue('altura', $medicoesContext),
'perimetroCefalico' => $this->getFirstNodeValue('perimetroCefalico', $medicoesContext),
];
$inconsistencias = $this->getInconsistencias([
fn () => $inconsistencias->medicoes,
['Circunferência abdominal', fn () => $inconsistencias->medicoes->circunferenciaAbdominal],
['Perímetro da panturrilha', fn () => $inconsistencias->medicoes->perimetroPanturrilha],
['Pressão arterial sistólica', fn () => $inconsistencias->medicoes->pressaoArterialSistolica],
['Pressão arterial diastólica', fn () => $inconsistencias->medicoes->pressaoArterialDiastolica],
['Frequência respiratória', fn () => $inconsistencias->medicoes->frequenciaRespiratoria],
['Frequência cardíaca', fn () => $inconsistencias->medicoes->frequenciaCardiaca],
['Temperatura', fn () => $inconsistencias->medicoes->temperatura],
['Saturação de O2', fn () => $inconsistencias->medicoes->saturacaoO2],
['Glicemia capilar', fn () => $inconsistencias->medicoes->glicemiaCapilar],
['Momento da coleta', fn () => $inconsistencias->medicoes->tipoGlicemiaCapilar],
['Peso', fn () => $inconsistencias->medicoes->peso],
['Altura', fn () => $inconsistencias->medicoes->altura],
['Perímetro cefálico', fn () => $inconsistencias->medicoes->perimetroCefalico],
]);
$atendimento->informacoes_gerais = (object) compact('campos', 'inconsistencias');
}
private function setProcedimentos($atendimento, $atendimentoContext, $inconsistencias)
{
$procedimentos = [];
foreach ($this->domx->query('procedimentos', $atendimentoContext) as $context) {
$codigo = $context->nodeValue;
if ($pequenaCirurgia = PequenaCirurgia::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Pequena cirurgia: {$pequenaCirurgia->descricao}";
}
else if ($testeRapido = TesteRapido::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Teste rápido: {$testeRapido->descricao}";
}
else if ($viaAdmnistracao = ViaAdministracao::where('codigo_esus', $codigo)->first()) {
$procedimentos[] = "Administração de medicamento: {$viaAdmnistracao->descricao}";
}
else {
$procedimento = Procedimento::where('codigo', $codigo)->orderByDesc('competencia_id')->first();
$procedimentos[] = MaskUtil::getProcedimentoMasked($procedimento->codigo) . " - {$procedimento->nome}";
}
}
$atendimento->procedimentos = (object) [
'lista' => $procedimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->procedimentos,
]),
];
}
private function setProcedimentosConsolidados($fichaProcedimentoMasterTransportPath)
{
$path = $fichaProcedimentoMasterTransportPath;
$campos = (object) [
'numTotalAfericaoPa' => $this->getFirstNodeValue("{$path}/numTotalAfericaoPa"),
'numTotalAfericaoTemperatura' => $this->getFirstNodeValue("{$path}/numTotalAfericaoTemperatura"),
'numTotalCurativoSimples' => $this->getFirstNodeValue("{$path}/numTotalCurativoSimples"),
'numTotalColetaMaterialParaExameLaboratorial' => $this->getFirstNodeValue("{$path}/numTotalColetaMaterialParaExameLaboratorial"),
'numTotalGlicemiaCapilar' => $this->getFirstNodeValue("{$path}/numTotalGlicemiaCapilar"),
'numTotalMedicaoAltura' => $this->getFirstNodeValue("{$path}/numTotalMedicaoAltura"),
'numTotalMedicaoPeso' => $this->getFirstNodeValue("{$path}/numTotalMedicaoPeso"),
];
$inconsistencias = $this->getInconsistencias([
['Aferição de PA', fn () => $this->inconsistencias->numTotalAfericaoPa],
['Temperatura', fn () => $this->inconsistencias->numTotalAfericaoTemperatura],
['Curativo', fn () => $this->inconsistencias->numTotalCurativoSimples],
['Coleta de material para Exame Laboratorial', fn () => $this->inconsistencias->numTotalColetaMaterialParaExameLaboratorial],
['Glicemia Capilar', fn () => $this->inconsistencias->numTotalGlicemiaCapilar],
['Altura', fn () => $this->inconsistencias->numTotalMedicaoAltura],
['Peso', fn () => $this->inconsistencias->numTotalMedicaoPeso],
]);
$this->ficha->procedimentos_consolidados = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,272 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\Exportacao\EstrategiaVacinacao;
use App\Enums\Imunizacao\Estrategia;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Cadastro\Vacina;
use App\Models\Geral\Turno;
use App\Models\Imunizacao\Dose;
use App\Models\Imunizacao\Estrategia as ImunizacaoEstrategia;
use App\Models\Imunizacao\GrupoAtendimento;
use App\Models\Imunizacao\Parametrizacao;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
class FichaVacinacao extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichavacinacaomaster');
}
public function __invoke()
{
$path = '//ns4:fichaVacinacaoMasterTransport';
$this->setCadastro($path);
$this->setVacinacoes($path);
return $this->ficha;
}
private function setCadastro($fichaVacinacaoMasterTransportPath)
{
$headerTransportPath = "{$fichaVacinacaoMasterTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->fichaVacinacao->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data da aplicação', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->cadastro = (object) compact('campos', 'inconsistencias');
}
private function setVacinacoes($fichaVacinacaoMasterTransportPath)
{
$path = "{$fichaVacinacaoMasterTransportPath}/vacinacoes";
$vacinacoes = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$vacinacaoModel = $this->inconsistenciaModel->fichaVacinacaoPacientes()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->vacinacoes->{$posicao} ?? [];
$vacinacao = (object) [
'campos' => (object) [
'turno' => $this->getFirstNodeValue('turno', $context)
? Turno::find($this->getFirstNodeValue('turno', $context))->nome
: null,
'numProntuario' => $this->getFirstNodeValue('numProntuario', $context),
'nomeCidadao' => $vacinacaoModel->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $context)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $context)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $context)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $context)),
'localAtendimento' => $this->getFirstNodeValue('localAtendimento', $context)
? LocalAtendimento::find($this->getFirstNodeValue('localAtendimento', $context))->descricao
: null,
'viajante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('viajante', $context))),
'comunicanteHanseniase' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('comunicanteHanseniase', $context))),
'gestante' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('gestante', $context))),
'puerpera' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('puerpera', $context))),
'dataHoraInicialAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraInicialAtendimento', $context)),
'dataHoraFinalAtendimento' => $this->getDateTimeString(
$this->getFirstNodeValue('dataHoraFinalAtendimento', $context)),
],
'inconsistencias' => $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Local de atendimento', fn () => $inconsistencias->localAtendimento],
['Viajante', fn () => $inconsistencias->viajante],
['Comunicante hanseníase', fn () => $inconsistencias->comunicanteHanseniase],
['Gestante', fn () => $inconsistencias->gestante],
['Puérpera', fn () => $inconsistencias->puerpera],
['Data/hora inicial do atendimento', fn () => $inconsistencias->dataHoraInicialAtendimento],
['Data/hora final do atendimento', fn () => $inconsistencias->dataHoraFinalAtendimento],
]),
];
$this->setVacinas($vacinacao, $context, $inconsistencias);
$vacinacoes[] = $vacinacao;
}
$this->ficha->vacinacoes = (object) [
'lista' => $vacinacoes,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->vacinacoes,
]),
];
}
private function setVacinas($vacinacao, $atendimentoContext, $inconsistencias)
{
$vacinas = [];
foreach ($this->domx->query('vacinas', $atendimentoContext) as $i => $context) {
$inconsistencias = $inconsistencias->vacinas->{$i + 1} ?? [];
$vacinas[] = [
'campos' => (object) [
'imunobiologico' => $this->getFirstNodeValue('imunobiologico', $context)
? $this->getDescricaoVacina(
Vacina::where('codigo', $this->getFirstNodeValue('imunobiologico', $context))->first())
: null,
'estrategiaVacinacao' => $this->getFirstNodeValue('estrategiaVacinacao', $context)
? $this->getEstrategia($this->getFirstNodeValue('estrategiaVacinacao', $context))
: null,
'dose' => $this->getFirstNodeValue('dose', $context)
? Dose::where('codigo_esus', $this->getFirstNodeValue('dose', $context))->first()->nome
: null,
'lote' => $this->getFirstNodeValue('lote', $context),
'fabricante' => $this->getFirstNodeValue('fabricante', $context),
'grupoAtendimento' => $this->getFirstNodeValue('grupoAtendimento', $context)
? GrupoAtendimento::where('codigo_esus', $this->getFirstNodeValue('grupoAtendimento', $context))
->first()->nome
: null,
'stRegistroAnterior' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stRegistroAnterior', $context))),
'dataRegistroAnterior' => $this->getDateString($this->getFirstNodeValue('dataRegistroAnterior', $context)),
'stAplicadoExterior' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stAplicadoExterior', $context))),
],
'inconsistencias' => $this->getInconsistencias([
['Imunobiológico', fn () => $inconsistencias->imunobiologico],
['Estratégia', fn () => $inconsistencias->estrategiaVacinacao],
['Dose', fn () => $inconsistencias->dose],
['Lote', fn () => $inconsistencias->lote],
['Fabricante', fn () => $inconsistencias->fabricante],
['Grupo de atendimento', fn () => $inconsistencias->grupoAtendimento],
['Registro Anterior', fn () => $inconsistencias->stRegistroAnterior],
['Data do registro anterior', fn () => $inconsistencias->dataRegistroAnterior],
['Aplicado exterior', fn () => $inconsistencias->stAplicadoExterior],
]),
];
}
$vacinacao->campos->vacinas = (object) [
'lista' => $vacinas,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->vacinas,
]),
];
}
private function getDescricaoVacina($vacina)
{
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO: {
return $vacina->nome;
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
return $vacina->abreviacao;
}
case ParametrizacaoDescricaoVacina::SIGLA: {
return $vacina->sigla;
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
return "$vacina->sigla - $vacina->nome";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
return "$vacina->sigla - $vacina->abreviacao";
}
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
return "$vacina->abreviacao - $vacina->nome";
}
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
return "$vacina->sigla - $vacina->abreviacao - $vacina->nome";
}
default: {
return $vacina->nome;
}
}
}
private function getEstrategia($exportacaoEstrategiaId)
{
$estrategiaId = null;
switch ($exportacaoEstrategiaId) {
case EstrategiaVacinacao::PESQUISA: {
$exportacaoEstrategiaId = Estrategia::PESQUISA;
break;
}
case EstrategiaVacinacao::PRE_EXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::PRE_EXPOSICAO;
break;
}
case EstrategiaVacinacao::POS_EXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::POS_EXPOSICAO;
break;
}
case EstrategiaVacinacao::REEXPOSICAO: {
$exportacaoEstrategiaId = Estrategia::REEXPOSICAO;
break;
}
default: {
$estrategiaId = $exportacaoEstrategiaId;
}
}
return ImunizacaoEstrategia::find($estrategiaId)->nome;
}
}

View File

@@ -0,0 +1,339 @@
<?php
namespace App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha;
use App\Enums\AtencaoBasica\VisitaDomiciliar\MotivoVisita as MotivoVisitaEnum;
use App\Models\AtencaoBasica\CadastroDomiciliar\ImovelTipo;
use App\Models\AtencaoBasica\VisitaDomiciliar\Desfecho;
use App\Models\AtencaoBasica\VisitaDomiciliar\MomentoColeta;
use App\Models\AtencaoBasica\VisitaDomiciliar\MotivoVisita;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use stdClass;
class FichaVisitaDomiciliar extends Ficha
{
public function __construct($xmlEnvio, $inconsistenciaModel)
{
parent::__construct($xmlEnvio, $inconsistenciaModel);
$this->domx->registerNamespace('ns4', 'http://esus.ufsc.br/fichavisitadomiciliarmaster');
}
public function __invoke()
{
$path = '//ns4:fichaVisitaDomiciliarMasterTransport';
$this->setProfissional($path);
$this->setAtendimentos($path);
return $this->ficha;
}
private function setProfissional($fichaVisitaDomiciliarMasterTransportPath)
{
$headerTransportPath = "{$fichaVisitaDomiciliarMasterTransportPath}/headerTransport";
$ocupacao = $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002")
? Ocupacao::where('codigo', $this->getFirstNodeValue("{$headerTransportPath}/cboCodigo_2002"))->first()
: null;
$campos = (object) [
'dataAtendimento' => $this->getDateString($this->getFirstNodeValue("{$headerTransportPath}/dataAtendimento")),
'codigoIbgeMunicipio' => $this->getFirstNodeValue("{$headerTransportPath}/codigoIbgeMunicipio"),
'profissionalNome' => $this->inconsistenciaModel->usuario->cidadao->nome,
'profissionalCNS' => MaskUtil::getCnsMasked($this->getFirstNodeValue("{$headerTransportPath}/profissionalCNS")),
'cboCodigo_2002' => $ocupacao ? "{$ocupacao->codigo} - {$ocupacao->nome}" : null,
'cnes' => $this->getFirstNodeValue("{$headerTransportPath}/cnes"),
'ine' => $this->getFirstNodeValue("{$headerTransportPath}/ine"),
];
$inconsistencias = $this->getInconsistencias([
['Data', fn () => $this->inconsistencias->headerTransport->dataAtendimento],
['IBGE', fn () => $this->inconsistencias->headerTransport->codigoIbgeMunicipio],
['CNS', fn () => $this->inconsistencias->headerTransport->profissionalCNS],
['CBO', fn () => $this->inconsistencias->headerTransport->cboCodigo_2002],
['CNES', fn () => $this->inconsistencias->headerTransport->cnes],
['INE', fn () => $this->inconsistencias->headerTransport->ine],
]);
$this->ficha->profissional = (object) compact('campos', 'inconsistencias');
}
private function setAtendimentos($fichaVisitaDomiciliarMasterTransportPath)
{
$path = "{$fichaVisitaDomiciliarMasterTransportPath}/visitasDomiciliares";
$atendimentos = [];
foreach ($this->domx->query($path) as $i => $context) {
$posicao = $i + 1;
$visitaDomiciliarModel = $this->inconsistenciaModel->visitasDomiciliares()
->wherePivot('posicao', $posicao)
->first();
$inconsistencias = $this->inconsistencias->visitasDomiciliares->{$posicao} ?? [];
$atendimento = new stdClass;
$this->setPaciente($atendimento, $context, $visitaDomiciliarModel, $inconsistencias, $posicao);
$this->setAtendimento($atendimento, $context, $inconsistencias);
$this->setAvaliacaoAntropometriza($atendimento, $context, $inconsistencias);
$this->setMotivosVisita($atendimento, $context, $inconsistencias);
$this->setSinaisVitais($atendimento, $context, $inconsistencias);
$this->setGlicemia($atendimento, $context, $inconsistencias);
$this->setDesfecho($atendimento, $context, $inconsistencias);
$atendimentos[] = $atendimento;
}
$this->ficha->atendimentos = (object) [
'lista' => $atendimentos,
'inconsistencias' => $this->getInconsistencias([
fn () => $this->inconsistencias->visitasDomiciliares,
]),
];
}
private function setPaciente($atendimento, $atendimentoContext, $visitaDomiciliarModel, $inconsistencias, $posicao)
{
$campos = (object) [
'numProntuario' => $this->getFirstNodeValue('numProntuario', $atendimentoContext),
'nomeCidadao' => $visitaDomiciliarModel->paciente->cidadao->nome,
'cnsCidadao' => MaskUtil::getCnsMasked($this->getFirstNodeValue('cnsCidadao', $atendimentoContext)),
'cpfCidadao' => MaskUtil::getCpfMasked($this->getFirstNodeValue('cpfCidadao', $atendimentoContext)),
'dtNascimento' => $this->getDateString($this->getFirstNodeValue('dtNascimento', $atendimentoContext)),
'sexo' => $this->getSexo($this->getFirstNodeValue('sexo', $atendimentoContext)),
'microArea' => $this->getFirstNodeValue('microArea', $atendimentoContext),
'stForaArea' => DataUtil::getSimOuNao(DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('stForaArea', $atendimentoContext))),
'posicao' => $posicao
];
$inconsistencias = $this->getInconsistencias([
['Prontuário', fn () => $inconsistencias->numProntuario],
['CNS', fn () => $inconsistencias->cnsCidadao],
['CPF', fn () => $inconsistencias->cpfCidadao],
['Data de nascimento', fn () => $inconsistencias->dtNascimento],
['Sexo', fn () => $inconsistencias->sexo],
['Microárea', fn () => $inconsistencias->microArea],
['Fora de área', fn () => $inconsistencias->stForaArea],
]);
$atendimento->paciente = (object) compact('campos', 'inconsistencias');
}
private function setAtendimento($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'turno' => $this->getFirstNodeValue('turno', $atendimentoContext)
? Turno::find($this->getFirstNodeValue('turno', $atendimentoContext))->nome
: null,
'tipoDeImovel' => $this->getFirstNodeValue('tipoDeImovel', $atendimentoContext)
? ImovelTipo::where(
'codigo_esus',
$this->getFirstNodeValue('tipoDeImovel', $atendimentoContext)
)->first()->descricao
: null,
'latitude' => $this->getFirstNodeValue('latitude', $atendimentoContext),
'longitude' => $this->getFirstNodeValue('longitude', $atendimentoContext),
'statusVisitaCompartilhadaOutroProfissional' => DataUtil::getSimOuNao(
DataUtil::getBooleanValueFromStringBoolean(
$this->getFirstNodeValue('statusVisitaCompartilhadaOutroProfissional', $atendimentoContext)
)
),
];
$inconsistencias = $this->getInconsistencias([
['Turno', fn () => $inconsistencias->turno],
['Tipo de imóvel', fn () => $inconsistencias->tipoDeImovel],
['Latitude', fn () => $inconsistencias->latitude],
['Longitude', fn () => $inconsistencias->longitude],
['Visita compartilhada com outro profissional', fn () => $inconsistencias->statusVisitaCompartilhadaOutroProfissional],
]);
$atendimento->atendimento = (object) compact('campos', 'inconsistencias');
}
private function setAvaliacaoAntropometriza($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'pesoAcompanhamentoNutricional' => $this->getFirstNodeValue('pesoAcompanhamentoNutricional', $atendimentoContext),
'alturaAcompanhamentoNutricional' => $this->getFirstNodeValue('alturaAcompanhamentoNutricional', $atendimentoContext),
];
$inconsistencias = $this->getInconsistencias([
['Peso', fn () => $inconsistencias->pesoAcompanhamentoNutricional],
['Altura', fn () => $inconsistencias->alturaAcompanhamentoNutricional],
]);
$atendimento->avaliacao_antropometrica = (object) compact('campos', 'inconsistencias');
}
private function setMotivosVisita($atendimento, $atendimentoContext, $inconsistencias)
{
$motivosVisita = [];
foreach ($this->domx->query('motivosVisita', $atendimentoContext) as $context) {
$motivoVisita = MotivoVisita::where('codigo_esus', $context->nodeValue)->first();
$descricao = null;
if ($this->isMotivoVisitaTipo($motivoVisita->id)) {
$descricao = 'Tipo de visita';
}
else if ($this->isMotivoVisitaBuscaAtiva($motivoVisita->id)) {
$descricao = 'Busca ativa';
}
else if ($this->isMotivoVisitaControleAmbientalVetorial($motivoVisita->id)) {
$descricao = 'Controle ambiental/vetorial';
}
else if ($this->isMotivoVisitaAcompanhamento($motivoVisita->id)) {
$descricao = 'Acompanhamento';
}
else if ($this->isOutroMotivoVisita($motivoVisita->id)) {
$descricao = 'Outros';
}
$motivosVisita[] = "{$descricao}: {$motivoVisita->descricao}";
}
$atendimento->motivos_visita = (object) [
'lista' => $motivosVisita,
'inconsistencias' => $this->getInconsistencias([
fn () => $inconsistencias->motivosVisita,
]),
];
}
private function isMotivoVisitaTipo($id)
{
return collect([
MotivoVisitaEnum::CADASTRAMENTO_ATUALIZACAO,
MotivoVisitaEnum::VISITA_PERIODICA,
])->contains($id);
}
private function isMotivoVisitaBuscaAtiva($id)
{
return collect([
MotivoVisitaEnum::CONSULTA,
MotivoVisitaEnum::EXAME,
MotivoVisitaEnum::VACINA,
MotivoVisitaEnum::CONDICIONALIDADES_DO_BOLSA_FAMILIA,
])->contains($id);
}
private function isMotivoVisitaControleAmbientalVetorial($id)
{
return collect([
MotivoVisitaEnum::ACAO_EDUCATIVA,
MotivoVisitaEnum::IMOVEL_COM_FOCO,
MotivoVisitaEnum::ACAO_MECANICA,
MotivoVisitaEnum::TRATAMENTO_FOCAL,
])->contains($id);
}
private function isMotivoVisitaAcompanhamento($id)
{
return collect([
MotivoVisitaEnum::GESTANTE,
MotivoVisitaEnum::PUERPERA,
MotivoVisitaEnum::RECEM_NASCIDO,
MotivoVisitaEnum::CRIANCA,
MotivoVisitaEnum::PESSOA_COM_DESNUTRICAO,
MotivoVisitaEnum::PESSOA_EM_REABILITACAO_OU_COM_DEFICIENCIA,
MotivoVisitaEnum::PESSOA_COM_HIPERTENSAO,
MotivoVisitaEnum::PESSOA_COM_DIABETES,
MotivoVisitaEnum::PESSOA_COM_ASMA,
MotivoVisitaEnum::PESSOA_COM_DPOC_ENFISEMA,
MotivoVisitaEnum::PESSOA_COM_CANCER,
MotivoVisitaEnum::PESSOA_COM_OUTRAS_DOENCAS_CRONICAS,
MotivoVisitaEnum::PESSOA_COM_HANSENIASE,
MotivoVisitaEnum::PESSOA_COM_TUBERCULOSE,
MotivoVisitaEnum::SINTOMATICOS_RESPIRATORIOS,
MotivoVisitaEnum::TABAGISTA,
MotivoVisitaEnum::DOMICILIADOS_ACAMADOS,
MotivoVisitaEnum::CONDICOES_DE_VULNERABILIDADE_SOCIAL,
MotivoVisitaEnum::ACOMPANHAMENTO_CONDICIONALIDADES_DO_BOLSA_FAMILIA,
MotivoVisitaEnum::SAUDE_MENTAL,
MotivoVisitaEnum::USUARIO_DE_ALCOOL,
MotivoVisitaEnum::USUARIO_DE_OUTRAS_DROGAS,
])->contains($id);
}
private function isOutroMotivoVisita($id)
{
return collect([
MotivoVisitaEnum::EGRESSO_DE_INTERNACAO,
MotivoVisitaEnum::CONVITE_PARA_ATIVIDADES_COLETIVAS_CAMPANHA_DE_SAUDE,
MotivoVisitaEnum::ORIENTACAO_PREVENCAO,
MotivoVisitaEnum::OUTROS,
])->contains($id);
}
private function setSinaisVitais($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'pressaoArterial' => trim($this->getFirstNodeValue('pressaoSistolica', $atendimentoContext)
. '/' . $this->getFirstNodeValue('pressaoDiastolica', $atendimentoContext), '/'),
'temperatura' => $this->getFirstNodeValue('temperatura', $atendimentoContext),
];
$inconsistencias = $this->getInconsistencias([
['Aferição de PA sistólica', fn () => $inconsistencias->pressaoSistolica],
['Aferição de PA diastólica', fn () => $inconsistencias->pressaoDiastolica],
['Temperatura', fn () => $inconsistencias->temperatura],
]);
$atendimento->sinais_vitais = (object) compact('campos', 'inconsistencias');
}
private function setGlicemia($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'glicemia' => $this->getFirstNodeValue('glicemia', $atendimentoContext),
'tipoGlicemia' => !is_null($this->getFirstNodeValue('tipoGlicemia', $atendimentoContext))
? MomentoColeta::where(
'codigo_esus',
$this->getFirstNodeValue('tipoGlicemia', $atendimentoContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Glicemia', fn () => $inconsistencias->glicemia],
['Momento da coleta', fn () => $inconsistencias->tipoGlicemia],
]);
$atendimento->glicemia = (object) compact('campos', 'inconsistencias');
}
private function setDesfecho($atendimento, $atendimentoContext, $inconsistencias)
{
$campos = (object) [
'desfecho' => $this->getFirstNodeValue('desfecho', $atendimentoContext)
? Desfecho::where(
'codigo_esus',
$this->getFirstNodeValue('desfecho', $atendimentoContext)
)->first()->descricao
: null,
];
$inconsistencias = $this->getInconsistencias([
['Desfecho', fn () => $inconsistencias->desfecho],
]);
$atendimento->desfecho = (object) compact('campos', 'inconsistencias');
}
}

View File

@@ -0,0 +1,586 @@
<?php
namespace App\Services\Integracao\Esus;
use App\Enums\Integracao\Esus\Origem;
use App\Models\Integracao\Esus\Inconsistencia;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoDomiciliar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoIndividual;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtendimentoOdontologico;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAtividadeColetiva;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaAvaliacao;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaCadastroDomiciliar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaCadastroIndividual;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaComplementar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaConsumoAlimentar;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaProcedimento;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaVacinacao;
use App\Services\Integracao\Esus\GerenciamentoEnvio\Ficha\FichaVisitaDomiciliar;
use App\Services\Integracao\EsusService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class GerenciamentoEnvioService extends Service
{
public static function index()
{
$params = self::getParams();
$inconsistencias = DB::table('integracao_esus_inconsistencia AS inconsistencia')
->join('integracao_esus_origem AS origem', 'origem.id', 'inconsistencia.origem_id')
->leftJoin('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->leftJoin('sigtap.ocupacao AS ocupacao', 'ocupacao.id', 'inconsistencia.ocupacao_id')
->leftJoin('cadastro_usuario AS usuario', 'usuario.id', 'inconsistencia.usuario_id')
->join('cadastro_cidadao AS usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('inconsistencia.ocupacao_id', $id))
->when($params->usuario_id, fn ($q, $id) => $q->where('inconsistencia.usuario_id', $id))
->select(
'inconsistencia.id',
'inconsistencia.data_atendimento',
'origem.id AS origem_id',
'origem.nome AS origem_nome',
'unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS infraestrutura_nome"),
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS ocupacao_descricao"),
'usuario_cidadao.nome AS usuario_nome',
'inconsistencia.inconsistencia',
DB::raw('COUNT(*) OVER (PARTITION BY origem.id) AS total_origem')
)
->get();
$fichasEnviadas = self::getFichasEnviadas($params);
return [
'inconsistencias' => $inconsistencias,
'fichas_enviadas' => $fichasEnviadas
];
}
public static function list()
{
$data = (object) [
'additionals' => [],
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'periodo' => function () use ($data, $params) {
$data->model['periodo'] = ['start' => null, 'end' => null];
$params->periodo = $data->model['periodo'];
},
'origem' => function () use ($data, $params) {
$origensData = self::getOrigensData($params);
$data->form['origens'] = $origensData['form'];
$data->model['origem_id'] = $origensData['model'];
$params->origem_id = $data->model['origem_id'];
},
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData($params);
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $unidadesData['model'];
$params->unidade_id = $data->model['unidade_id'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
$params->infraestrutura_id = $data->model['infraestrutura_id'];
},
'ocupacao' => function () use ($data, $params) {
$ocupacoesData = self::getOcupacoesData($params);
$data->form['ocupacoes'] = $ocupacoesData['form'];
$data->model['ocupacao_id'] = $ocupacoesData['model'];
$params->ocupacao_id = $data->model['ocupacao_id'];
},
'usuario' => function () use ($data, $params) {
$usuariosData = self::getUsuariosData($params);
$data->form['usuarios'] = $usuariosData['form'];
$data->model['usuario_id'] = $usuariosData['model'];
$params->usuario_id = $data->model['usuario_id'];
},
];
$load = is_null(request()->load_from);
if ($load) {
$data->additionals = [
'data_atual' => Carbon::today()->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',
'origem_id',
'unidade_id',
'infraestrutura_id',
'ocupacao_id',
'usuario_id',
]);
if (isset($params->periodo)
&& !is_null($params->periodo['start'])
&& !is_null($params->periodo['end'])
) {
$start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->startOfDay();
$end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->endOfDay();
$params->periodo['start'] = $start;
$params->periodo['end'] = $end;
}
else {
$params->periodo = null;
}
return $params;
}
private static function getFichasEnviadas($params){
return DB::query()
->fromSub(
DB::table('atencao_basica_atendimento_domiciliar')
->selectRaw("
1 as origem_id,
'Atendimento Domiciliar' AS ficha,
data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
->unionAll(
DB::table('atencao_basica_atendimento_individual')
->selectRaw("
2 as origem_id,
'Atendimento Individual' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_atendimento_odontologico')
->selectRaw("
3 as origem_id,
'Atendimento Odontologico' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_atividade_coletiva')
->selectRaw("
4 as origem_id,
'Atividade Coletiva' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_avaliacao')
->selectRaw("
5 as origem_id,
'Avaliação' AS ficha,
data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_cadastro_domiciliar')
->selectRaw("
6 as origem_id,
'Cadastro Domiciliar' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_cadastro_individual')
->selectRaw("
7 as origem_id,
'Cadastro Individual' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_ficha_complementar')
->selectRaw("
8 as origem_id,
'Ficha Complementar' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
cbo_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_consumo_alimentar')
->selectRaw("
9 as origem_id,
'Consumo Alimentar' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
cbo_id as 'ocupacao_id'
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_procedimento')
->selectRaw("
10 as origem_id,
'Procedimento' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_ficha_vacinacao')
->selectRaw("
11 as origem_id,
'Ficha de vacinação' AS ficha,
data_atendimento AS data,
usuario_id,
equipe_id,
ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
)
->unionAll(
DB::table('atencao_basica_visita_domiciliar')
->selectRaw("
12 as origem_id,
'Visita Domiciliar' AS ficha,
data_usuario_responsavel AS data,
usuario_id,
equipe_id,
usuario_ocupacao_id
")
->whereNotNull('exportacao_id')
->whereNull('usuario_exportacao_id')
),
'totalizadores'
)
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'totalizadores.equipe_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id')
->whereBetween('totalizadores.data', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('totalizadores.origem_id', $id))
->when($params->usuario_id, fn ($q, $id) => $q->where('totalizadores.usuario_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('cadastro_infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('totalizadores.ocupacao_id', $id))
->select('origem_id', 'ficha', DB::raw('COUNT(*) AS quantidade', 'data','usuario_id', 'ocupacao_id'))
->groupBy('ficha')
->get();
}
private static function getOrigensData($params)
{
$origens = collect();
$id = null;
if (!is_null($params->periodo)) {
$origens = DB::table('integracao_esus_origem AS origem')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->whereColumn('inconsistencia.origem_id', 'origem.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
)
->select(
'origem.id',
'origem.nome'
)
->orderBy('origem.nome')
->get();
}
return ['form' => $origens, 'model' => $id];
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->periodo)) {
$unidades = DB::table('cadastro_unidade AS unidade')
->whereNull('unidade.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('infraestrutura.unidade_id', 'unidade.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
)
->select('unidade.id', 'unidade.nome_fantasia')
->orderBy('unidade.nome_fantasia')
->get();
}
return ['form' => $unidades, 'model' => $id];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura')
->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id')
->whereNull('infraestrutura.deleted_at')
->where('infraestrutura.unidade_id', $params->unidade_id)
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->whereColumn('equipe.infraestrutura_id', 'infraestrutura.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
)
->select(
'infraestrutura.id',
DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome")
)
->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)")
->get();
}
return ['form' => $infraestruturas, 'model' => $id];
}
private static function getOcupacoesData($params)
{
$ocupacoes = collect();
$id = null;
if (!is_null($params->periodo)) {
$ocupacoes = DB::table('sigtap.ocupacao AS ocupacao')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('inconsistencia.ocupacao_id', 'ocupacao.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
)
->select(
'ocupacao.id',
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS descricao")
)
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
->get();
}
return ['form' => $ocupacoes, 'model' => $id];
}
private static function getUsuariosData($params)
{
$usuarios = collect();
$id = null;
if (!is_null($params->periodo)) {
$usuarios = DB::table('cadastro_usuario AS usuario')
->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'usuario.cidadao_id')
->whereNull('usuario.deleted_at')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_esus_inconsistencia AS inconsistencia')
->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'inconsistencia.equipe_id')
->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'equipe.infraestrutura_id')
->whereColumn('inconsistencia.usuario_id', 'usuario.id')
->whereBetween('inconsistencia.data_atendimento', $params->periodo)
->when($params->origem_id, fn ($q, $id) => $q->where('inconsistencia.origem_id', $id))
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('equipe.infraestrutura_id', $id))
->when($params->ocupacao_id, fn ($q, $id) => $q->where('inconsistencia.ocupacao_id', $id))
)
->select(
'usuario.id',
'cidadao.nome'
)
->orderBy('cidadao.nome')
->get();
}
return ['form' => $usuarios, 'model' => $id];
}
public static function getInconsistencia($id)
{
$inconsistencia = Inconsistencia::findOrFail($id);
$xmlEnvio = Storage::disk('local')
->get(EsusService::INCONSISTENCIA_XML_ENVIO_PATH
. DIRECTORY_SEPARATOR . app('config')->get('database.default')
. DIRECTORY_SEPARATOR . "{$inconsistencia->id}.xml");
switch ($inconsistencia->origem_id) {
case Origem::ATENDIMENTO_DOMICILIAR: {
return (new FichaAtendimentoDomiciliar($xmlEnvio, $inconsistencia))();
}
case Origem::FICHA_COMPLEMENTAR: {
return (new FichaComplementar($xmlEnvio, $inconsistencia))();
}
case Origem::AVALIACAO: {
return (new FichaAvaliacao($xmlEnvio, $inconsistencia))();
}
case Origem::AVALIACAO: {
return (new FichaAvaliacao($xmlEnvio, $inconsistencia))();
}
case Origem::CONSUMO_ALIMENTAR: {
return (new FichaConsumoAlimentar($xmlEnvio, $inconsistencia))();
}
case Origem::PROCEDIMENTO: {
return (new FichaProcedimento($xmlEnvio, $inconsistencia))();
}
case Origem::VISITA_DOMICILIAR: {
return (new FichaVisitaDomiciliar($xmlEnvio, $inconsistencia))();
}
case Origem::ATENDIMENTO_INDIVIDUAL: {
return (new FichaAtendimentoIndividual($xmlEnvio, $inconsistencia))();
}
case Origem::ATENDIMENTO_ODONTOLOGICO: {
return (new FichaAtendimentoOdontologico($xmlEnvio, $inconsistencia))();
}
case Origem::ATIVIDADE_COLETIVA: {
return (new FichaAtividadeColetiva($xmlEnvio, $inconsistencia))();
}
case Origem::FICHA_VACINACAO: {
return (new FichaVacinacao($xmlEnvio, $inconsistencia))();
}
case Origem::CADASTRO_INDIVIDUAL: {
return (new FichaCadastroIndividual($xmlEnvio, $inconsistencia))();
}
case Origem::CADASTRO_DOMICILIAR: {
return (new FichaCadastroDomiciliar($xmlEnvio, $inconsistencia))();
}
}
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Services\Integracao\Esus;
use App\Models\Integracao\Esus\Parametrizacao;
use App\Services\Service;
class ParametrizacaoService extends Service
{
public static function create()
{
$parametrizacao = Parametrizacao::first();
return [
'model' => [
'ativo' => $parametrizacao->ativo ?? false,
'url_instalacao' => $parametrizacao->url_instalacao ?? null,
'usuario' => $parametrizacao->usuario ?? null,
'senha' => $parametrizacao->senha ?? null,
'confirmacao_senha' => $parametrizacao->senha ?? null,
],
];
}
public static function store($request)
{
self::validate($request);
$parametrizacao = Parametrizacao::first();
if (is_null($parametrizacao)) {
$parametrizacao = Parametrizacao::create($request->all());
}
else {
$parametrizacao->update($request->all());
}
return $parametrizacao->fresh();
}
private static function validate($request)
{
$request->validate([
'ativo' => [
'required',
'boolean'
],
'url_instalacao' => [
'nullable',
'required_if:ativo,true',
'string',
'max:255',
],
'usuario' => [
'nullable',
'required_if:ativo,true',
'string',
'max:100',
],
'senha' => [
'nullable',
'required_if:ativo,true',
'string',
'max:100',
],
]);
}
}

View File

@@ -0,0 +1,516 @@
<?php
namespace App\Services\Integracao;
use App\Enums\Integracao\Esus\Origem;
use App\Models\AtencaoBasica\AtendimentoDomiciliar\AtendimentoDomiciliar;
use App\Models\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividual;
use App\Models\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologico;
use App\Models\AtencaoBasica\AtividadeColetiva\AtividadeColetiva;
use App\Models\AtencaoBasica\Avaliacao\Avaliacao;
use App\Models\AtencaoBasica\CadastroDomiciliar\CadastroDomiciliar;
use App\Models\AtencaoBasica\CadastroIndividual\CadastroIndividual;
use App\Models\AtencaoBasica\Exportacao\Exportacao;
use App\Models\AtencaoBasica\FichaComplementar\FichaComplementar;
use App\Models\AtencaoBasica\FichaVacinacao\FichaVacinacao;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\MarcadorConsumoAlimentar;
use App\Models\AtencaoBasica\Procedimento\Procedimento;
use App\Models\AtencaoBasica\VisitaDomiciliar\VisitaDomiciliar;
use App\Models\Integracao\Esus\Inconsistencia;
use App\Services\Service;
use Exception;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class EsusService extends Service
{
public const INCONSISTENCIA_XML_ENVIO_PATH = 'integracao'
. DIRECTORY_SEPARATOR
. 'esus'
. DIRECTORY_SEPARATOR
. 'inconsistencia'
. DIRECTORY_SEPARATOR
. 'xml-envio';
public static function getAuthorizationCookie($parametrizacao)
{
$response = Http::asMultipart()
->post("{$parametrizacao->url_instalacao}/api/recebimento/login", [
'usuario' => $parametrizacao->usuario,
'senha' => $parametrizacao->senha,
]);
if ($response->successful()) {
return $response->header('Set-Cookie');
}
throw new Exception('Erro ao obter o cookie de autorização.'
. (!empty($response->body()) ? " ({$response->body()})" : ''));
}
public static function deleteInconsistencias($cliente, $nomeFicha)
{
Inconsistencia::where('origem_id', self::getOrigemId($nomeFicha))
->get()
->each(function ($inconsistencia) use ($cliente) {
Storage::disk('local')->delete(self::INCONSISTENCIA_XML_ENVIO_PATH
. DIRECTORY_SEPARATOR . $cliente
. DIRECTORY_SEPARATOR . "{$inconsistencia->id}.xml");
$inconsistencia->delete();
});
}
public static function sendFicha($cliente, $parametrizacao, $nomeFicha, $ficha)
{
$response = Http::withHeaders(['Cookie' => $parametrizacao->cookie])
->attach('ficha', $ficha['xml']['conteudo'], $ficha['xml']['nome_arquivo'])
->post("{$parametrizacao->url_instalacao}/api/v1/recebimento/ficha");
if ($response->successful()) {
return;
}
$origemId = self::getOrigemId($nomeFicha);
self::deleteExportacao($origemId, $ficha['exportacao_id']);
if ($response->clientError()) {
$dadosResposta = $response->json();
if (isset($dadosResposta['descricaoErro']) && $dadosResposta['descricaoErro'] === 'Erro de validação') {
self::saveInconsistencia($cliente, $origemId, $ficha, $dadosResposta['errosValidacao']);
return;
}
else if(
isset($dadosResposta['descricaoErro']) &&
Str::contains($dadosResposta['descricaoErro'], 'versão') &&
Str::contains($dadosResposta['descricaoErro'], 'inexistente')
) {
self::saveInconsistencia($cliente, $origemId, $ficha, $dadosResposta);
return;
}
}
throw new Exception("Erro ao enviar a ficha." . (!empty($response->body()) ? " ({$response->body()})" : ''));
}
private static function deleteExportacao($origemId, $exportacaoId)
{
switch ($origemId) {
case Origem::ATENDIMENTO_INDIVIDUAL: {
AtendimentoIndividual::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::ATENDIMENTO_DOMICILIAR: {
AtendimentoDomiciliar::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::ATENDIMENTO_ODONTOLOGICO: {
AtendimentoOdontologico::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::ATIVIDADE_COLETIVA: {
AtividadeColetiva::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::AVALIACAO: {
Avaliacao::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::PROCEDIMENTO: {
Procedimento::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::VISITA_DOMICILIAR: {
VisitaDomiciliar::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::FICHA_VACINACAO: {
FichaVacinacao::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::FICHA_COMPLEMENTAR: {
FichaComplementar::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::CADASTRO_DOMICILIAR: {
CadastroDomiciliar::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::CADASTRO_INDIVIDUAL: {
CadastroIndividual::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
case Origem::CONSUMO_ALIMENTAR: {
MarcadorConsumoAlimentar::where('exportacao_id', $exportacaoId)->update([
'exportacao_id' => null,
'data_hora_exportacao' => null,
'usuario_exportacao_id' => null,
]);
break;
}
}
Exportacao::where('id', $exportacaoId)->delete();
}
private static function saveInconsistencia($cliente, $origemId, $ficha, $errosValidacao)
{
$dadosSerializado = $errosValidacao['dadoSerializado'] ?? null;
if(!empty($dadosSerializado)){
$inconsistencia = $dadosSerializado;
}
else if(
Str::contains($errosValidacao['descricaoErro'], 'versão') &&
Str::contains($errosValidacao['descricaoErro'], 'inexistente')
) {
$inconsistencia = $errosValidacao;
}
$dadosInconsistencia = [
'origem_id' => $origemId,
'data_atendimento' => $ficha['data_atendimento'],
'usuario_id' => $ficha['usuario_id'],
'ocupacao_id' => $ficha['ocupacao_id'],
'equipe_id' => $ficha['equipe_id'],
'inconsistencia' => json_encode($inconsistencia),
];
switch ($origemId) {
case Origem::ATENDIMENTO_INDIVIDUAL: {
$inconsistencia = Inconsistencia::create($dadosInconsistencia);
$atendimentosIndividuais = [];
$ficha['atendimentos_individuais']->each(function ($atendimento) use (&$atendimentosIndividuais) {
$atendimentosIndividuais[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->atendimentosIndividuais()->sync($atendimentosIndividuais);
break;
}
case Origem::ATENDIMENTO_DOMICILIAR: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'atendimento_domiciliar_id' => $ficha['atendimento_domiciliar_id']
]));
$atendimentoDomiciliarAtendimentos = [];
$ficha['atendimento_domiciliar_atendimentos']->each(function ($atendimento) use (&$atendimentoDomiciliarAtendimentos) {
$atendimentoDomiciliarAtendimentos[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->atendimentoDomiciliarAtendimentos()->sync($atendimentoDomiciliarAtendimentos);
break;
}
case Origem::ATENDIMENTO_ODONTOLOGICO: {
$inconsistencia = Inconsistencia::create($dadosInconsistencia);
$atendimentosOdontologicos = [];
$ficha['atendimentos_odontologicos']->each(function ($atendimento) use (&$atendimentosOdontologicos) {
$atendimentosOdontologicos[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->atendimentosOdontologicos()->sync($atendimentosOdontologicos);
break;
}
case Origem::ATIVIDADE_COLETIVA: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'atividade_coletiva_id' => $ficha['atividade_coletiva_id']
]));
$atividadeColetivaParticipantes = [];
$ficha['atividade_coletiva_participantes']->each(function ($participante) use (&$atividadeColetivaParticipantes) {
$atividadeColetivaParticipantes[$participante['id']] = [
'posicao' => $participante['posicao']
];
});
$inconsistencia->atividadeColetivaParticipantes()->sync($atividadeColetivaParticipantes);
break;
}
case Origem::AVALIACAO: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'avaliacao_id' => $ficha['avaliacao_id']
]));
break;
}
case Origem::PROCEDIMENTO: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'procedimento_id' => $ficha['procedimento_id']
]));
$procedimentoAtendimentos = [];
$ficha['procedimento_atendimentos']->each(function ($atendimento) use (&$procedimentoAtendimentos) {
$procedimentoAtendimentos[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->procedimentoAtendimentos()->sync($procedimentoAtendimentos);
break;
}
case Origem::VISITA_DOMICILIAR: {
$inconsistencia = Inconsistencia::create($dadosInconsistencia);
$visitasDomiciliares = [];
$ficha['visitas_domiciliares']->each(function ($atendimento) use (&$visitasDomiciliares) {
$visitasDomiciliares[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->visitasDomiciliares()->sync($visitasDomiciliares);
break;
}
case Origem::FICHA_VACINACAO: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'ficha_vacinacao_id' => $ficha['ficha_vacinacao_id']
]));
$fichaVacinacaoPacientes = [];
$ficha['ficha_vacinacao_pacientes']->each(function ($atendimento) use (&$fichaVacinacaoPacientes) {
$fichaVacinacaoPacientes[$atendimento['id']] = [
'posicao' => $atendimento['posicao']
];
});
$inconsistencia->fichaVacinacaoPacientes()->sync($fichaVacinacaoPacientes);
break;
}
case Origem::FICHA_COMPLEMENTAR: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'ficha_complementar_id' => $ficha['ficha_complementar_id']
]));
break;
}
case Origem::CADASTRO_DOMICILIAR: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'cadastro_domiciliar_id' => $ficha['cadastro_domiciliar_id']
]));
$cadastroDomiciliarPacientes = [];
$ficha['pacientes']->each(function ($paciente) use (&$cadastroDomiciliarPacientes) {
$cadastroDomiciliarPacientes[$paciente['id']] = [
'posicao' => $paciente['posicao']
];
});
$inconsistencia->cadastroDomiciliarPacientes()->sync($cadastroDomiciliarPacientes);
break;
}
case Origem::CADASTRO_INDIVIDUAL: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'cadastro_individual_id' => $ficha['cadastro_individual_id']
]));
break;
}
case Origem::CONSUMO_ALIMENTAR: {
$inconsistencia = Inconsistencia::create(array_merge($dadosInconsistencia, [
'consumo_alimentar_id' => $ficha['consumo_alimentar_id']
]));
break;
}
}
self::saveXmlEnvio($cliente, $inconsistencia, $ficha);
}
private static function saveXmlEnvio($cliente, $inconsistencia, $ficha)
{
$path = Storage::path(self::INCONSISTENCIA_XML_ENVIO_PATH);
if (file_exists($path) === false) {
File::makeDirectory($path, 0777, true, true);
}
Storage::disk('local')->put(
self::INCONSISTENCIA_XML_ENVIO_PATH
. DIRECTORY_SEPARATOR . $cliente
. DIRECTORY_SEPARATOR . "{$inconsistencia->id}.xml",
$ficha['xml']['conteudo']
);
}
private static function getOrigemId($nomeFicha)
{
switch ($nomeFicha) {
case 'atendimento_individual': {
return Origem::ATENDIMENTO_INDIVIDUAL;
}
case 'atendimento_domiciliar': {
return Origem::ATENDIMENTO_DOMICILIAR;
}
case 'atendimento_odontologico': {
return Origem::ATENDIMENTO_ODONTOLOGICO;
}
case 'atividade_coletiva': {
return Origem::ATIVIDADE_COLETIVA;
}
case 'avaliacao': {
return Origem::AVALIACAO;
}
case 'procedimento': {
return Origem::PROCEDIMENTO;
}
case 'visita_domiciliar': {
return Origem::VISITA_DOMICILIAR;
}
case 'ficha_vacinacao': {
return Origem::FICHA_VACINACAO;
}
case 'ficha_complementar': {
return Origem::FICHA_COMPLEMENTAR;
}
case 'cadastro_domiciliar': {
return Origem::CADASTRO_DOMICILIAR;
}
case 'cadastro_individual': {
return Origem::CADASTRO_INDIVIDUAL;
}
case 'consumo_alimentar': {
return Origem::CONSUMO_ALIMENTAR;
}
}
}
}

View File

@@ -0,0 +1,249 @@
<?php
namespace App\Services\Integracao;
use App\Enums\Cadastro\SujeitoAtencao\CertidaoModelo;
use App\Models\Cadastro\SujeitoAtencao\Cidadao;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class IntegracaoCidadaoService extends Service
{
public static function integrar($cidadaoId, $origem = 'paciente')
{
$url = config('app.integracao_cidadao_url');
if (empty($url)) {
return;
}
$data = null;
switch ($origem) {
case 'paciente': {
$data = self::getPacienteData($cidadaoId);
break;
}
case 'usuario': {
$data = self::getUsuarioData($cidadaoId);
break;
}
}
$response = Http::withHeaders([
'Authorization' => config('app.integracao_cidadao_senha')
])->post($url . '/integracao', $data);
if ($response->status() === Response::HTTP_NOT_FOUND && $response->json() && $response->json('code') === 1) {
// TODO: Verificar o que vai fazer quando não tiver cliente cadastrado na integração.
} elseif ($response->status() !== Response::HTTP_CREATED) {
throw new \Exception('Erro na integração entre sistemas', Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
private static function getPacienteData($cidadaoId)
{
$cidadao = Cidadao::findOrFail($cidadaoId);
$telefoneCelular = $cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
$telefoneResidencial = $cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 10)->first()->numero ?? null;
$telefoneRecado = $cidadao->telefones
->filter(fn ($t) => !in_array($t->numero, [$telefoneCelular, $telefoneResidencial]))
->first()->numero ?? null;
return [
'sistema' => 'conectasus_v2',
'cliente' => app('config')->get('database.default'),
'tipo_origem_id' => 1, // CADASTRO_CIDADAO
'dados' => [
'aposentado_pensionista' => null,
'bairro_nome' => $cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
'certidao_cartorio_codigo' => $cidadao->certidao->cartorio_codigo ?? null,
'certidao_cartorio_nome' => $cidadao->certidao->cartorio_nome ?? null,
'certidao_data_emissao' => ($cidadao->certidao->data_emissao ?? null)
? $cidadao->certidao->data_emissao->format('Y-m-d') : null,
'certidao_folha' => $cidadao->certidao->folha ?? null,
'certidao_livro' => $cidadao->certidao->livro ?? null,
'certidao_modelo_id' => $cidadao->certidao->modelo_id ?? null,
'certidao_municipio_ibge' => $cidadao->certidao->municipio->ibge ?? null,
'certidao_numero' => ($cidadao->certidao->modelo_id ?? null) === CertidaoModelo::NOVO
? ($cidadao->certidao->numero ?? null) : null,
'certidao_termo' => ($cidadao->certidao->modelo_id ?? null) === CertidaoModelo::ANTIGO
? ($cidadao->certidao->numero ?? null) : null,
'certidao_tipo_id' => $cidadao->certidao->tipo_id ?? null,
'cidadao_id_v2' => $cidadao->id,
'classificacao_id' => $cidadao->paciente->classificacao_id ?? null,
'cnh_categoria_id' => $cidadao->carteiraHabilitacao->categoria_id ?? null,
'cnh_data_emissao' => ($cidadao->carteiraHabilitacao->data_emissao ?? null)
? $cidadao->carteiraHabilitacao->data_emissao->format('Y-m-d') : null,
'cnh_data_validade' => ($cidadao->carteiraHabilitacao->data_validade ?? null)
? $cidadao->carteiraHabilitacao->data_validade->format('Y-m-d') : null,
'cnh_estado_uf' => $cidadao->carteiraHabilitacao->estado->uf ?? null,
'cnh_numero' => $cidadao->carteiraHabilitacao->numero ?? null,
'cns' => $cidadao->cns,
'comorbidade_descricao' => null,
'complemento' => $cidadao->domicilio->endereco->complemento ?? null,
'convenio_medico_nome' => $cidadao->conveniosMedico->first()->nome ?? null,
'convenio_odontologico_nome' => null,
'cpf_numero' => $cidadao->cpf,
'ctps_data_emissao' => ($cidadao->carteiraTrabalho->data_emissao ?? null)
? $cidadao->carteiraTrabalho->data_emissao->format('Y-m-d') : null,
'ctps_estado_uf' => $cidadao->carteiraTrabalho->estado->uf ?? null,
'ctps_nis_pis_pasep' => $cidadao->carteiraTrabalho->nis_pis_pasep ?? null,
'ctps_numero' => $cidadao->carteiraTrabalho->numero ?? null,
'ctps_serie' => $cidadao->carteiraTrabalho->serie ?? null,
'data_entrada_brasil' => ($cidadao->estrangeiroEntradaBrasil->data_entrada ?? null)
? $cidadao->estrangeiroEntradaBrasil->data_entrada->format('Y-m-d') : null,
'data_nascimento' => $cidadao->data_nascimento
? $cidadao->data_nascimento->format('Y-m-d') : null,
'data_naturalizacao' => $cidadao->data_naturalizacao
? $cidadao->data_naturalizacao->format('Y-m-d') : null,
'data_obito' => $cidadao->obito
? $cidadao->obito->obito_em->format('Y-m-d H:i:s')
: null,
'deficiencia_id' => $cidadao->deficiencia_id,
'deficiencia_outra' => $cidadao->deficiencia_outro,
'desconhece_mae' => $cidadao->desconhece_nome_mae,
'desconhece_pai' => $cidadao->desconhece_nome_pai,
'doador_orgao' => null,
'email' => $cidadao->paciente->email ?? null,
'escolaridade_id' => $cidadao->escolaridade_id,
'esporte_descricao' => null,
'esta_empregado_atualmente' => null,
'estado_civil_id' => $cidadao->estado_civil_id,
'etnia_indigena_descricao' => $cidadao->etniaIndigena->descricao ?? null,
'faixa_renda_id' => null,
'id' => $cidadao->cidadao_id ?? null,
'identidade_genero_id' => $cidadao->identidade_genero_id,
'local_nascimento_id' => $cidadao->local_nascimento_id,
'logradouro_cep' => $cidadao->domicilio->endereco->logradouro->cep ?? null,
'logradouro_nome' => $cidadao->domicilio->endereco->logradouro->nome ?? null,
'logradouro_tipo_nome' => $cidadao->domicilio->endereco->logradouro->tipo->descricao ?? null,
'loteamento_nome' => $cidadao->domicilio->endereco->loteamento->nome ?? null,
'mobilidade_reduzida_id' => $cidadao->mobilidade_reduzida_id,
'municipio_ibge' => $cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null,
'municipio_nascimento_ibge' => $cidadao->municipioNascimento->ibge ?? null,
'nacionalidade_id' => $cidadao->nacionalidade_id,
'nome' => $cidadao->nome,
'nome_conjuge' => $cidadao->conjuge,
'nome_mae' => $cidadao->nome_mae,
'nome_pai' => $cidadao->nome_pai,
'nome_social' => $cidadao->nome_social,
'numero' => $cidadao->domicilio->endereco->numero ?? null,
'ocupacao_descricao' => null,
'orientacao_sexual_id' => null,
'pais_codigo' => $cidadao->domicilio->endereco->logradouro->municipio->estado->pais->codigo ?? null,
'pais_nome' => $cidadao->domicilio->endereco->logradouro->municipio->estado->pais->nome ?? null,
'pais_nascimento_codigo' => $cidadao->paisNascimento->codigo ?? null,
'pais_nascimento_nome' => $cidadao->paisNascimento->nome ?? null,
'plano_funerario_nome' => null,
'ponto_referencia' => $cidadao->domicilio->endereco->referencia ?? null,
'portador_alguma_comorbidade' => null,
'pratica_algum_esporte' => null,
'preferencia_nome_id' => $cidadao->preferencia_nome_id,
'raca_cor_id' => $cidadao->raca_cor_id,
'reside_domicilio_desde' => $cidadao->data_entrada_domicilio
? $cidadao->data_entrada_domicilio->format('Y-m-d') : null,
'rg_data_emissao' => ($cidadao->carteiraIdentidade->data_emissao ?? null)
? $cidadao->carteiraIdentidade->data_emissao->format('Y-m-d') : null,
'rg_estado_uf' => $cidadao->carteiraIdentidade->estado->uf ?? null,
'rg_numero' => $cidadao->carteiraIdentidade->numero ?? null,
'rg_orgao_emissor' => $cidadao->carteiraIdentidade->orgao_emissor ?? null,
'rne_numero' => $cidadao->estrangeiroEntradaBrasil->rne ?? null,
'sem_numero' => $cidadao->domicilio->endereco->sem_numero ?? null,
'sexo_id' => $cidadao->sexo_id,
'situacao_familiar_conjugal_id' => $cidadao->situacao_familiar_conjugal_id,
'subclassificacao_id' => $cidadao->paciente->subclassificacao_id ?? null,
'telefone_celular' => $telefoneCelular,
'telefone_recado' => $telefoneRecado,
'telefone_residencial' => $telefoneResidencial,
'tipo_moradia_id' => null,
'tipo_sanguineo_id' => $cidadao->tipo_sanguineo_id,
'titulo_eleitor_municipio_ibge' => null,
'titulo_eleitor_numero' => $cidadao->tituloEleitor->numero ?? null,
'titulo_eleitor_secao' => $cidadao->tituloEleitor->secao ?? null,
'titulo_eleitor_zona' => $cidadao->tituloEleitor->zona ?? null,
'unidade_referencia_nome' => $cidadao->paciente->unidade->nome_fantasia ?? null,
'utiliza_transporte_coletivo' => null,
'zona_id' => $cidadao->domicilio->endereco->zona_id ?? null,
]
];
}
private static function getUsuarioData($cidadaoId)
{
$cidadao = Cidadao::findOrFail($cidadaoId);
$usuario = $cidadao->usuario;
$telefoneCelular = $cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 11)->first()->numero ?? null;
$telefoneResidencial = $cidadao->telefones
->filter(fn ($t) => Str::length($t->numero) === 10)->first()->numero ?? null;
$telefoneRecado = $cidadao->telefones
->filter(fn ($t) => !in_array($t->numero, [$telefoneCelular, $telefoneResidencial]))
->first()->numero ?? null;
return [
'sistema' => 'conectasus_v2',
'cliente' => app('config')->get('database.default'),
'tipo_origem_id' => 2, // CADASTRO_USUARIO
'dados' => [
'cd_usuario_sistema_v1' => $usuario->cd_usuario_sistema_v1,
'usuario_id_v2' => $usuario->id,
'registro_numero' => $usuario->registro_numero,
'escolaridade_id' => $cidadao->escolaridade_id,
'estado_civil_id' => $cidadao->estado_civil_id,
'bairro_nome' => $cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
'logradouro_nome' => $cidadao->domicilio->endereco->logradouro->nome ?? null,
'numero' => $cidadao->domicilio->endereco->numero ?? null,
'logradouro_cep' => $cidadao->domicilio->endereco->logradouro->cep ?? null,
'municipio_ibge' => $cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null,
'logradouro_tipo_nome' => $cidadao->domicilio->endereco->logradouro->tipo->descricao ?? null,
'complemento' => $cidadao->domicilio->endereco->complemento ?? null,
'registro_tipo_id' => $usuario->registro_tipo_id,
'sexo_id' => $cidadao->sexo_id,
'data_nascimento' => $cidadao->data_nascimento->format('Y-m-d'),
'email' => $usuario->email,
'tipo_usuario' => $usuario->lotacoes()->exists() ? 'MED' : 'USU',
'nome_mae' => $cidadao->nome_mae,
'nome_pai' => $cidadao->nome_pai,
'nome' => $cidadao->nome,
'cns' => $cidadao->cns,
'cpf' => $cidadao->cpf,
'rg_numero' => $cidadao->carteiraIdentidade->numero ?? null,
'registro_uf' => $usuario->registroEstado->uf ?? null,
'nome_usuario' => $usuario->usuario,
'loteamento_nome' => $cidadao->domicilio->endereco->loteamento->nome ?? null,
'ponto_referencia' => $cidadao->domicilio->endereco->referencia ?? null,
'zona_id' => $cidadao->domicilio->endereco->zona_id ?? null,
'estado_nascimento_uf' => $cidadao->estadoNascimento->uf ?? null,
'municipio_nascimento_ibge' => $cidadao->municipioNascimento->ibge ?? null,
'telefone_recado' => $telefoneRecado,
'telefone_celular' => $telefoneCelular,
'telefone_residencial' => $telefoneResidencial,
'telefones' => $cidadao->telefones->map(fn ($telefone) => [
'numero' => $telefone->numero,
'autoriza_sms' => $telefone->autoriza_sms,
'principal' => $telefone->principal,
])
]
];
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,699 @@
<?php
namespace App\Services\Integracao\Ria;
use App\Exceptions\Integracao\Ria\EnvioException;
use App\Models\Integracao\Ria\DocumentoImunologicoRotina;
use App\Models\Intranet\Cliente;
use App\Services\Integracao\RiaService;
use App\Services\Service;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class GerenciamentoEnvioService extends Service
{
public static function index()
{
$params = self::getParams();
$registrosAplicacao = DB::table('integracao_ria_documento_imunologico_rotina')
->select([
'integracao_ria_documento_imunologico_rotina.id AS documento_imunologico_rotina_id',
DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y às %H:%i') AS data_hora_envio"),
'integracao_ria_documento_imunologico_rotina.identificador_solicitante',
'integracao_ria_documento_imunologico_rotina.cns_solicitante',
'integracao_ria_documento_imunologico_rotina.identificador_documento',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
'cadastro_cidadao_usuario.nome AS usuario_nome',
'cadastro_cidadao_paciente.nome AS paciente_nome',
'imunizacao_registro_aplicacao.data_aplicacao',
DB::raw("DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, '%d/%m/%Y') AS data_aplicacao"),
'cadastro_vacina.nome AS vacina_nome',
'imunizacao_entrada_vacina.lote',
DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"),
'imunizacao_dose.nome AS dose_nome',
'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome',
'imunizacao_estrategia.nome AS estrategia_nome',
'imunizacao_produtor.nome AS produtor_nome',
'imunizacao_registro_aplicacao.gestante',
'imunizacao_registro_aplicacao.puerpera',
DB::raw("
(
SELECT COUNT(*)
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
) AS inconsistencias
"),
'integracao_ria_documento_imunologico_rotina.atualizado',
DB::raw("IF(integracao_ria_documento_imunologico_rotina.atualizado = 1
OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1, 'Substituição', 'Inicial') as tipo_envio"),
'integracao_ria_documento_imunologico_rotina.identificador_rnds as identificador_rnds',
])
->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aplicacao.dose_id')
->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_aplicacao.estrategia_id')
->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id')
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_aplicacao.grupo_atendimento_id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_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('cadastro_usuario.id', $usuarioId)
)
->when($params->paciente_id, fn ($q, $pacienteId) => $q
->where('cadastro_paciente.id', $pacienteId)
)
->when($params->status, function($query) use ($params) {
if ($params->status === 'com_inconsistencia') {
$query->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
else if ($params->status === 'sem_inconsistencia') {
$query->whereNotExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
})
->when($params->tipo_envio === 'inicial', fn ($q) => $q
->where('integracao_ria_documento_imunologico_rotina.atualizado', false)
->where('integracao_ria_documento_imunologico_rotina.tentou_substituir', false)
)
->when($params->tipo_envio === 'substituicao', fn ($q) => $q
->where(fn ($q) => $q
->where('integracao_ria_documento_imunologico_rotina.atualizado', true)
->orWhere('integracao_ria_documento_imunologico_rotina.tentou_substituir', true)
)
);
$registrosAtualizacao = DB::table('integracao_ria_documento_imunologico_rotina')
->select([
'integracao_ria_documento_imunologico_rotina.id AS documento_imunologico_rotina_id',
DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y às %H:%i') AS data_hora_envio"),
'integracao_ria_documento_imunologico_rotina.identificador_solicitante',
'integracao_ria_documento_imunologico_rotina.cns_solicitante',
'integracao_ria_documento_imunologico_rotina.identificador_documento',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
'cadastro_cidadao_usuario.nome AS usuario_nome',
'cadastro_cidadao_paciente.nome AS paciente_nome',
'imunizacao_registro_atualizacao.data_atualizacao',
DB::raw("DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, '%d/%m/%Y') AS data_atualizacao"),
'cadastro_vacina.nome AS vacina_nome',
DB::raw("NULL AS lote"),
DB::raw("NULL AS data_validade_lote"),
'imunizacao_dose.nome AS dose_nome',
'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome',
'imunizacao_estrategia.nome AS estrategia_nome',
DB::raw("NULL AS produtor_nome"),
DB::raw("FALSE AS gestante"),
DB::raw("FALSE AS puerpera"),
DB::raw("
(
SELECT COUNT(*)
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
) AS inconsistencias
"),
'integracao_ria_documento_imunologico_rotina.atualizado',
DB::raw("IF(integracao_ria_documento_imunologico_rotina.atualizado = 1
OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1, 'Substituição', 'Inicial') as tipo_envio"),
'integracao_ria_documento_imunologico_rotina.identificador_rnds as identificador_rnds',
])
->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_atualizacao.aplicador_id')
->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_atualizacao.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_atualizacao.dose_id')
->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_atualizacao.estrategia_id')
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_atualizacao.grupo_atendimento_id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_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('cadastro_usuario.id', $usuarioId)
)
->when($params->paciente_id, fn ($q, $pacienteId) => $q
->where('cadastro_paciente.id', $pacienteId)
)
->when($params->status, function($query) use ($params) {
if ($params->status === 'com_inconsistencia') {
$query->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
else if ($params->status === 'sem_inconsistencia') {
$query->whereNotExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
})
->when($params->tipo_envio === 'inicial', fn ($q) => $q
->where('integracao_ria_documento_imunologico_rotina.atualizado', false)
->where('integracao_ria_documento_imunologico_rotina.tentou_substituir', false)
)
->when($params->tipo_envio === 'substituicao', fn ($q) => $q
->where(fn ($q) => $q
->where('integracao_ria_documento_imunologico_rotina.atualizado', true)
->orWhere('integracao_ria_documento_imunologico_rotina.tentou_substituir', true)
)
);
$registros = $registrosAplicacao->union($registrosAtualizacao)->get();
$registros->each(function ($registro) {
if (!is_null($registro->identificador_rnds)) {
$registro->identificador_rnds = basename(parse_url($registro->identificador_rnds, PHP_URL_PATH));
}
});
return $registros;
}
public static function create()
{
return [
'form' => [
'unidades' => [],
'infraestruturas' => [],
'usuarios' => [],
'status' => [],
'tipos_envio' => [],
],
'model' => [
'periodo' => ['start' => null, 'end' => null],
'unidade_id' => null,
'infraestrutura_id' => null,
'usuario_id' => null,
'paciente' => null,
'status' => null,
'tipo_envio' => null
],
];
}
public static function send($request)
{
$response = null;
$inconsistencias = [];
try {
$cliente = Cliente::where('link', app('config')->get('database.default'))
->where('sistema_id', 1)
->firstOrFail();
$documentoImunologicoRotina = DocumentoImunologicoRotina::findOrFail($request->documento_imunologico_rotina_id);
if ($documentoImunologicoRotina->alterar) {
$documentoImunologicoRotinaAlterado = DocumentoImunologicoRotinaService::getDocumentoAlterado($request->documento_imunologico_rotina_id);
if (!is_null($documentoImunologicoRotinaAlterado)) {
$parametrizacao = RiaService::getParametrizacao();
$token = RiaService::getToken($parametrizacao->senha);
$headers = [
'Authorization' => $parametrizacao->cns_solicitante,
'Content-Type' => 'application/json',
'X-Authorization-Server' => "Bearer " . $token['access_token'],
];
$documentoImunologicoRotinaAlterado->identificador_solicitante = $parametrizacao->identificador_solicitante;
$documentoImunologicoRotinaAlterado->cns_solicitante = $parametrizacao->cns_solicitante;
$documentoImunologicoRotinaAlterado->data_hora_envio = Carbon::now();
$response = RiaService::sendDocumentoImunologicoRotina($headers, $documentoImunologicoRotinaAlterado, $cliente->municipio->estado->uf);
if ($response->status() === 201) {
$documentoImunologicoRotinaAlterado->identificador_rnds = $response->header('Location') ? $response->header('Location') : null;
$documentoImunologicoRotinaAlterado->response = $response->json();
$documentoImunologicoRotinaAlterado->alterar = false;
$documentoImunologicoRotinaAlterado->atualizado = true;
DocumentoImunologicoRotinaService::update($documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id, $documentoImunologicoRotinaAlterado);
}
else {
DocumentoImunologicoRotina::where('id', $documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id)->update([
'tentou_substituir' => true,
]);
DocumentoImunologicoRotinaService::updateInconsistencias($documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id, $response->json());
}
Log::channel('integracao-ria')->info('Comando executado com sucesso.', [
'cliente' => $cliente->link,
'origem' => 'GerenciamentoEnvioService'
]);
}
}
else {
$documentoImunologicoRotinaComInconsistencia = DocumentoImunologicoRotinaService::getDocumentoComInconsistencia($request->documento_imunologico_rotina_id);
if (!is_null($documentoImunologicoRotinaComInconsistencia)) {
$parametrizacao = RiaService::getParametrizacao();
$token = RiaService::getToken($parametrizacao->senha);
$headers = [
'Authorization' => $parametrizacao->cns_solicitante,
'Content-Type' => 'application/json',
'X-Authorization-Server' => "Bearer " . $token['access_token'],
];
$documentoImunologicoRotinaComInconsistencia->identificador_solicitante = $parametrizacao->identificador_solicitante;
$documentoImunologicoRotinaComInconsistencia->cns_solicitante = $parametrizacao->cns_solicitante;
$documentoImunologicoRotinaComInconsistencia->data_hora_envio = Carbon::now();
$response = RiaService::sendDocumentoImunologicoRotina($headers, $documentoImunologicoRotinaComInconsistencia, $cliente->municipio->estado->uf);
$documentoImunologicoRotinaComInconsistencia->identificador_rnds = $response->header('Location') ? $response->header('Location') : null;
$documentoImunologicoRotinaComInconsistencia->response = $response->json();
DocumentoImunologicoRotinaService::update($documentoImunologicoRotinaComInconsistencia->documento_imunologico_rotina_id, $documentoImunologicoRotinaComInconsistencia);
Log::channel('integracao-ria')->info('Comando executado com sucesso.', [
'cliente' => $cliente->link,
'origem' => 'GerenciamentoEnvioService'
]);
}
}
} catch (Exception $error) {
Log::channel('integracao-ria')->error('Erro ao executar o comando', [
'origem' => 'GerenciamentoEnvioService',
'erro' => $error->getMessage(),
]);
throw new EnvioException();
}
if ($response) {
$response = $response->json();
if (isset($response->issue)) {
foreach ($response->issue as $issue) {
$inconsistencias[] = ['resposta' => $issue->diagnostics];
}
}
}
return $inconsistencias;
}
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),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getInfraestruturas($params),
'usuarios' => self::getUsuarios($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
];
}
case 'usuarios': {
return [
'usuarios' => self::getUsuarios($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
];
}
case 'status': {
return [
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
];
}
case 'tipos_envio': {
return [
'tipos_envio' => self::getTiposEnvio($params),
];
}
}
}
public static function getInconsistencias($documentoImunologicoRotinaId)
{
return DB::table('integracao_ria_documento_imunologico_rotina_resposta')
->select(['resposta'])
->where('documento_imunologico_rotina_id', $documentoImunologicoRotinaId)
->get()
->each(function($documentoImunologicoRotinaResposta) use (&$inconsistencias) {
$resposta = null;
if (preg_match("/\(([^)]+)\)\s(.+)/", $documentoImunologicoRotinaResposta->resposta, $matches)) {
$resposta = DB::table('integracao_ria_resposta')
->select(['descricao'])
->where('codigo', str_replace('EHR-', '', $matches[1]))
->first()->descricao ?? $documentoImunologicoRotinaResposta->resposta;
} else {
$resposta = $documentoImunologicoRotinaResposta->resposta;
}
$inconsistencias[] = ['resposta' => $resposta];
});
}
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'),
'paciente_id' => request()->get('paciente_id'),
'status' => request()->get('status'),
'tipo_envio' => request()->get('tipo_envio'),
];
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select([
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia',
])
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
)
)
->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_infraestrutura.unidade_id', $params->unidade_id)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
)
)
->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')
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_aplicacao.aplicador_id', 'cadastro_usuario.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->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)
)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina')
->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_atualizacao.aplicador_id', 'cadastro_usuario.id')
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->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 getStatus($params)
{
return DB::table('integracao_ria_documento_imunologico_rotina')
->select([
DB::raw("
COALESCE((
SELECT 'com_inconsistencia'
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
LIMIT 1
), 'sem_inconsistencia') AS value,
COALESCE((
SELECT 'Com inconsistência'
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
LIMIT 1
), 'Sem inconsistência') AS text
"),
])
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->whereExists(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_registro_aplicacao')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_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('imunizacao_registro_aplicacao.aplicador_id', $usuarioId)
)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_registro_atualizacao')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_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('imunizacao_registro_atualizacao.aplicador_id', $usuarioId)
)
)
)
->groupBy([
DB::raw("
COALESCE((
SELECT 'com_inconsistencia'
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
LIMIT 1
), 'sem_inconsistencia'),
COALESCE((
SELECT 'Com inconsistência'
FROM integracao_ria_documento_imunologico_rotina_resposta
WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id
LIMIT 1
), 'Sem inconsistência')
")
])
->get();
}
private static function getTiposEnvio($params)
{
return DB::table('integracao_ria_documento_imunologico_rotina')
->select([
DB::raw("
(
CASE
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0
THEN 'inicial'
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1
THEN 'substituicao'
END
) AS value,
(
CASE
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0
THEN 'Inicial'
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1
THEN 'Substituição'
END
) AS text
"),
])
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo)
->whereExists(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_registro_aplicacao')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_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('imunizacao_registro_aplicacao.aplicador_id', $usuarioId)
)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('imunizacao_registro_atualizacao')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_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('imunizacao_registro_atualizacao.aplicador_id', $usuarioId)
)
)
)
->when($params->status, function($query) use ($params) {
if ($params->status === 'com_inconsistencia') {
$query->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
else if ($params->status === 'sem_inconsistencia') {
$query->whereNotExists(fn ($q) => $q->select(DB::raw(1))
->from('integracao_ria_documento_imunologico_rotina_resposta')
->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id')
);
}
})
->groupBy([
DB::raw("
(
CASE
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0
THEN 'inicial'
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1
THEN 'substituicao'
END
),
(
CASE
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0
THEN 'Inicial'
WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1
THEN 'Substituição'
END
)
")
])
->get();
}
}

View File

@@ -0,0 +1,180 @@
<?php
namespace App\Services\Integracao\Ria;
use App\Exceptions\Integracao\Ria\CertificadoDigitalInvalidoException;
use App\Exceptions\Integracao\Ria\CertificadoDigitalNaoEncontradoException;
use App\Exceptions\Integracao\Ria\SenhaInvalidaException;
use App\Models\Integracao\Ria\Parametrizacao;
use App\Rules\Cns;
use App\Services\Integracao\RiaService;
use App\Services\Service;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class ParametrizacaoService extends Service
{
public static function index()
{
return DB::table('integracao_ria_parametrizacao')
->select([
'id',
DB::raw("'" . RiaService::getFile() . "' AS certificado_digital"),
'identificador_solicitante',
'cns_solicitante',
])
->get();
}
public static function create()
{
return [
'model' => [
'certificado_digital' => null,
'senha' => null,
'identificador_solicitante' => null,
'cns_solicitante' => null,
],
];
}
public static function store($request)
{
self::validateStore($request);
DB::transaction(function() use ($request) {
Parametrizacao::create([
'senha' => $request->senha,
'identificador_solicitante' => $request->identificador_solicitante,
'cns_solicitante' => $request->cns_solicitante,
]);
$pkcs12 = openssl_pkcs12_read(file_get_contents($request->files->get('certificado_digital')), $certificates, $request->senha);
if ($pkcs12 ) {
$path = RiaService::getPath() . DIRECTORY_SEPARATOR . RiaService::getFile();
if (isset($certificates['cert']) && isset($certificates['pkey'])) {
$contents = $certificates['cert'].$certificates['pkey'];
} else {
throw new CertificadoDigitalInvalidoException();
}
if (!Storage::disk('local')->put($path, $contents)) {
throw new Exception('Erro ao fazer o upload do certificado.');
} else {
$token = RiaService::getToken($request->senha);
if (isset($token['access_token'])) {
return true;
} else {
throw new CertificadoDigitalInvalidoException();
}
}
} else {
throw new SenhaInvalidaException();
}
});
}
public static function show()
{
return Parametrizacao::first();
}
public static function edit()
{
$parametrizacao = self::show();
return [
'model' => [
'certificado_digital' => null,
'senha' => str_repeat('*', strlen($parametrizacao->senha)),
'identificador_solicitante' => $parametrizacao->identificador_solicitante,
'cns_solicitante' => $parametrizacao->cns_solicitante,
],
];
}
public static function update($request)
{
self::validateUpdate($request);
DB::transaction(function() use ($request) {
$parametrizacao = self::show();
$parametrizacao->update([
'identificador_solicitante' => $request->identificador_solicitante,
'cns_solicitante' => $request->cns_solicitante,
]);
});
}
public static function destroy()
{
DB::transaction(function() {
self::show()->delete();
$path = RiaService::getPath() . DIRECTORY_SEPARATOR . RiaService::getFile();
if (Storage::disk('local')->exists($path)) {
Storage::disk('local')->delete($path);
}
});
}
public static function download()
{
$path = 'documento/integracao/ria/evidencias.pdf';
if (Storage::disk('local')->exists($path)) {
return [
'arquivo' => Storage::path($path),
'nome' => 'EVIDENCIAS.PDF',
];
} else {
throw new CertificadoDigitalNaoEncontradoException();
}
}
private static function validateStore()
{
request()->validate([
'certificado_digital' => [
'required',
],
'senha' => [
'required',
'string',
'max:180',
],
'identificador_solicitante' => [
'required',
'string',
'max:100',
],
'cns_solicitante' => [
'required',
'digits:15',
new Cns,
],
]);
}
private static function validateUpdate()
{
request()->validate([
'identificador_solicitante' => [
'required',
'string',
'max:100',
],
'cns_solicitante' => [
'required',
'digits:15',
new Cns,
],
]);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,351 @@
<?php
namespace App\Services\Integracao;
use App\Enums\Integracao\Ria\CondicaoMaternal;
use App\Enums\Integracao\Ria\Estrategia;
use App\Enums\Integracao\Ria\GrupoAtendimento;
use App\Enums\Integracao\Ria\LocalAplicacao;
use App\Enums\Integracao\Ria\ViaAdministracao;
use App\Exceptions\Integracao\Ria\CertificadoDigitalNaoEncontradoException;
use App\Models\Integracao\Ria\Parametrizacao;
use App\Services\Service;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class RiaService extends Service
{
public static function getParametrizacao()
{
return Parametrizacao::select(['senha', 'identificador_solicitante', 'cns_solicitante'])
->first();
}
public static function sendDocumentoImunologicoRotina($headers, $params, $uf)
{
$url = 'https://' . (env('APP_ENV') === 'production' ? Str::lower($uf) . '-' . env('RIA_PRODUCAO_URL_API_SERVICO') : env('RIA_HOMOLOGACAO_URL_API_SERVICO')) . '/fhir/r4/Bundle';
$fhirComposition = self::getFhirComposition($params);
$fhirImunization = self::getFhirImunization($params);
$fhirConditiion = self::getFhirConditiion($params);
$entry = [];
if (!is_null($fhirComposition)) {
$entry[] = $fhirComposition;
}
if (!is_null($fhirImunization)) {
$entry[] = $fhirImunization;
}
if (!is_null($fhirConditiion)) {
$entry[] = $fhirConditiion;
}
$payload = [
'resourceType' => 'Bundle',
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/NamingSystem/BRRNDS-' . $params->identificador_solicitante,
'value' => $params->identificador_documento,
],
'type' => 'document',
'timestamp' => $params->data_hora_envio->toIso8601String(),
'entry' => $entry,
];
return Http::withHeaders($headers)->post($url, $payload);
}
public static function getToken($senha)
{
$path = self::getPath() . DIRECTORY_SEPARATOR . self::getFile();
$url = 'https://' . (env('APP_ENV') === 'production' ? env('RIA_PRODUCAO_URL_API_TOKEN') : env('RIA_HOMOLOGACAO_URL_API_TOKEN'));
if (Storage::disk('local')->exists($path)) {
return Http::withOptions(['cert' => [Storage::path($path), $senha]])->get($url)->json();
} else {
throw new CertificadoDigitalNaoEncontradoException();
}
}
public static function getPath()
{
return 'integracao' . DIRECTORY_SEPARATOR . 'ria' . DIRECTORY_SEPARATOR . 'certificado-digital' . DIRECTORY_SEPARATOR . app('config')->get('database.default');
}
public static function getFile()
{
return 'CERTIFICADO-DIGITAL.PEM';
}
private static function getFhirComposition($params)
{
$data = [
'fullUrl' => $params->identificador_composicao,
'resource' => [
'resourceType' => 'Composition',
'id' => (string) $params->identificador_composicao,
'meta' => [
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRRegistroImunobiologicoAdministradoRotina-2.0',
],
],
'status' => 'final',
'type' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRTipoDocumento',
'code' => 'RIA',
]
]
],
'subject' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => (string) $params->paciente_cns_ou_cpf,
],
],
'date' => $params->data_hora_envio->toIso8601String(),
'author' => [
[
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstabelecimentoSaude-1.0',
'value' => (string) $params->unidade_cnes,
],
],
],
'title' => 'Registro de Imunobiologico Administrado na Rotina',
'section' => [
[
'entry' => [
[
'reference' => 'Immunization/' . $params->identificador_imunizacao,
],
],
],
],
],
];
if (isset($params->is_substituicao) && $params->is_substituicao) {
$data['resource']['relatesTo'] = [
[
'code' => 'replaces',
'targetReference' => [
'reference' => 'Composition/' . $params->identificador_rnds
]
]
];
}
return $data;
}
private static function getFhirImunization($params)
{
$imunization = [
'fullUrl' => $params->identificador_imunizacao,
'resource' => [
'resourceType' => 'Immunization',
'id' => (string) $params->identificador_imunizacao,
'meta' => [
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRImunobiologicoAdministrado-3.0',
],
],
'extension' => [
[
'url' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRGrupoAtendimento',
'valueCodeableConcept' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRGrupoAtendimento',
'code' => (string) ($params->grupo_atendimento_codigo ?? GrupoAtendimento::OUTROS),
],
],
],
],
[
'url' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRCondicaoMaternal',
'valueCodeableConcept' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCondicaoMaternal',
'code' => (string) ($params->gestante ? CondicaoMaternal::GESTANTE : ($params->puerpera ? CondicaoMaternal::PUERPERA : CondicaoMaternal::NAO_SE_APLICA)),
],
],
],
],
[
'url' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRContatoHanseniase',
'valueBoolean' => (Boolean) $params->comunicante_hanseniase,
],
],
'status' => 'completed',
'vaccineCode' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRImunobiologico',
'code' => (string) $params->vacina_codigo,
],
],
],
'patient' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => (string) $params->paciente_cns_ou_cpf,
],
],
'occurrenceDateTime' => $params->data,
'primarySource' => true,
'site' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRLocalAplicacao',
'code' => (string) ($params->local_aplicacao_codigo ?? LocalAplicacao::OUTRO),
],
],
],
'route' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRViaAdministracao',
'code' => (string) ($params->via_administracao_codigo ?? ViaAdministracao::SEM_REGISTRO_NO_SISTEMA_DE_INFORMACAO_DE_ORIGEM),
],
],
],
'performer' => [
[
array_filter([
'function' => $params->estrategia_codigo == 2 ? [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO',
'code' => $params->cbo ?? null,
]
]
] : null,
'actor' => [
'reference' => 'Practitioner/' . $params->aplicador_cns_ou_cpf,
],
])
],
],
'protocolApplied' => [
[
'extension' => [
[
'url' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstrategiaVacinacao-1.0',
'valueCodeableConcept' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BREstrategiaVacinacao',
'code' => (string) $params->estrategia_codigo
],
],
],
],
[
'url' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstrategiaVacinacaoPesquisa-1.0',
'extension' => [
[
'url' => 'numeroProtocoloEstudoANVISA',
'valueString' => 'GU1AMT9CYR',
],
[
'url' => 'numeroVersaoProtocoloEstudo',
'valueString' => 'F3D1U354V6',
],
[
'url' => 'numeroRegistroVacinaAnvisa',
'valueString' => 'WWZZJJWIBF',
],
],
],
],
'doseNumberString' => (string) $params->dose_codigo,
],
],
],
];
if ($params->estrategia_codigo === Estrategia::ESPECIAL) {
$imunization['resource']['reasonReference'] = [
[
'reference' => 'Condition/' . $params->identificador_condicao,
],
];
}
if (isset($params->registro_aplicacao_id)) {
$imunization['resource']['lotNumber'] = (string) $params->lote;
$imunization['resource']['expirationDate'] = $params->data_validade_lote;
$imunization['resource']['manufacturer'] = [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRFabricantePNI',
'value' => (string) $params->produtor_codigo,
],
];
}
if (isset($params->registro_atualizacao_id)) {
$imunization['resource']['reportOrigin'] = [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRRegistroOrigem',
'code' => '01',
],
],
];
}
return $imunization;
}
private static function getFhirConditiion($params)
{
$condition = null;
if ($params->estrategia_codigo === Estrategia::ESPECIAL) {
$condition = [
'fullUrl' => $params->identificador_condicao,
'resource' => [
'resourceType' => 'Condition',
'id' => (string) $params->identificador_condicao,
'meta' => [
'lastUpdated' => '2024-03-30T14:59:51.283-03:00',
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRCID10Avaliado-1.0',
],
],
'code' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCID10',
'code' => $params->cid_codigo,
],
],
],
'subject' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => (string) $params->paciente_cns_ou_cpf,
],
],
],
];
}
return $condition;
}
public static function destroy($headers, $resourceUrl)
{
return Http::withHeaders($headers)->delete($resourceUrl);
}
}

View File

@@ -0,0 +1,443 @@
<?php
namespace App\Services\Integracao\Rira;
use App\Enums\Regulacao\SolicitacaoPrioridade;
use App\Enums\Regulacao\StatusTipo;
use App\Models\Integracao\Rira\Documento;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class DocumentoService
{
public static function save($params)
{
DB::transaction(function () use ($params) {
$documento = is_null($params->documento_id)
? Documento::create([
'regulacao_solicitacao_item_id' => $params->solicitacao_item_id,
'identificador' => $params->identificador_documento,
])
: Documento::findOrFail($params->documento_id);
$paramsEnvio = [
'url_rnds' => $params->url_rnds,
'identificador_rnds' => $params->identificador_rnds,
'regulacao_status_enviado_id' => $params->status_id,
'identificador_solicitante' => $params->identificador_solicitante,
'cns_solicitante' => $params->cns_solicitante,
'data_hora_envio' => $params->data_hora_envio,
'request' => is_null($params->identificador_rnds) ? json_encode($params->request) : null,
'response' => is_null($params->response) ? null : json_encode($params->response),
];
$ultimoEnvio = $documento->envios()->orderByDesc('created_at')->first();
if (!is_null($ultimoEnvio) && is_null($ultimoEnvio->identificador_rnds)) {
$ultimoEnvio->update($paramsEnvio);
}
else {
$documento->envios()->create($paramsEnvio);
}
});
}
public static function getSolicitacoes()
{
return DB::query()
->fromSub(DB::table('regulacao_solicitacao_item as solicitacao_item')
->join('parametrizacao_exame as exame', 'exame.id', 'solicitacao_item.exame_id')
->selectRaw("
solicitacao_item.id,
solicitacao_item.solicitacao_id,
exame.codigo as codigo_procedimento,
COALESCE(
(
SELECT ocupacao.codigo
FROM sigtap.ocupacao as ocupacao
JOIN exame_laboratorial_agendamento_exame as agendamento_exame
ON agendamento_exame.ocupacao_id = ocupacao.id
JOIN exame_laboratorial_agendamento as agendamento
ON agendamento.id = agendamento_exame.agendamento_id
WHERE agendamento_exame.exame_id = solicitacao_item.exame_id
AND agendamento.regulacao_solicitacao_id = solicitacao_item.solicitacao_id
),
(
SELECT ocupacao.codigo
FROM sigtap.ocupacao as ocupacao
JOIN exame_imagem_fechamento_faturamento as fechamento_faturamento
ON fechamento_faturamento.ocupacao_id = ocupacao.id
JOIN exame_imagem_agendamento_exame as agendamento_exame
ON agendamento_exame.id = fechamento_faturamento.agendamento_exame_id
JOIN exame_imagem_agendamento as agendamento
ON agendamento.id = agendamento_exame.agendamento_id
WHERE agendamento_exame.exame_id = solicitacao_item.exame_id
AND agendamento.regulacao_solicitacao_id = solicitacao_item.solicitacao_id
)
) as cbo_prestador
")
->unionAll(DB::table('regulacao_solicitacao_item as solicitacao_item')
->join(
'parametrizacao_procedimento_cirurgico as procedimento_cirurgico',
'procedimento_cirurgico.id',
'solicitacao_item.procedimento_cirurgico_id'
)
->selectRaw("
solicitacao_item.id,
solicitacao_item.solicitacao_id,
procedimento_cirurgico.procedimento_codigo as codigo_procedimento,
NULL as cbo_prestador
")
)
->unionAll(DB::table('regulacao_solicitacao_item as solicitacao_item')
->join('cadastro_especialidade as especialidade', 'especialidade.id', 'solicitacao_item.especialidade_id')
->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id')
->selectRaw("
solicitacao_item.id,
solicitacao_item.solicitacao_id,
'0301010072' as codigo_procedimento, -- TODO: Alterar para o código de procedimento da especialidade
ocupacao.codigo as cbo_prestador
")
)
, 'solicitacao_item')
->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'solicitacao_item.solicitacao_id')
->join('regulacao_status as status', 'status.id', 'solicitacao.status_id')
->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id')
->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->join('sigtap.cid as cid', 'cid.id', 'solicitacao.cid_id')
->join(
'cadastro_infraestrutura as infraestrutura_solicitante',
'infraestrutura_solicitante.id',
'solicitacao.infraestrutura_solicitante_id'
)
->join(
'cadastro_unidade as unidade_solicitante',
'unidade_solicitante.id',
'infraestrutura_solicitante.unidade_id'
)
->leftJoin(
'regulacao_parametrizacao_regulador as regulador',
'regulador.id',
'solicitacao.regulador_id'
)
->join(
'cadastro_infraestrutura as infraestrutura_regulador',
'infraestrutura_regulador.id',
'regulador.infraestrutura_id'
)
->join(
'cadastro_unidade as unidade_regulador',
'unidade_regulador.id',
'infraestrutura_regulador.unidade_id'
)
->leftJoin(
'integracao_rira_documento as rira_documento',
'rira_documento.regulacao_solicitacao_item_id',
'solicitacao_item.id'
)
->leftJoin('integracao_rira_documento_envio as rira_documento_envio', fn ($j) => $j
->on('rira_documento_envio.documento_id', 'rira_documento.id')
->where('rira_documento_envio.id', '=', fn ($q) => $q
->select('id')
->from('integracao_rira_documento_envio')
->whereColumn('documento_id', 'rira_documento.id')
->whereNotNull('identificador_rnds')
->orderByDesc('created_at')
->limit(1)
)
)
->leftJoin(
'regulacao_parametrizacao_prestador_interno as prestador_interno',
'prestador_interno.id',
'solicitacao.prestador_interno_id'
)
->leftJoin(
'cadastro_infraestrutura as prestador_interno_infraestrutura',
'prestador_interno_infraestrutura.id',
'prestador_interno.infraestrutura_id'
)
->leftJoin(
'cadastro_unidade as prestador_interno_unidade',
'prestador_interno_unidade.id',
'prestador_interno_infraestrutura.unidade_id'
)
->leftJoin(
'regulacao_parametrizacao_prestador_externo as prestador_externo',
'prestador_externo.id',
'solicitacao.prestador_externo_id'
)
->leftJoin(
'transporte_paciente_destino as prestador_externo_destino',
'prestador_externo_destino.id',
'prestador_externo.destino_id'
)
->where('solicitacao.created_at', '>=', '2024-10-01 00:00:00')
->where(fn ($q) => $q
->whereNotExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_rira_documento as rira_documento')
->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id')
)
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('integracao_rira_documento_envio as rira_documento_envio')
->join(
'integracao_rira_documento as rira_documento',
'rira_documento.id',
'rira_documento_envio.documento_id'
)
->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id')
->whereNull('rira_documento_envio.identificador_rnds')
)
->orWhere('solicitacao.status_id', '<>', fn ($q) => $q
->selectRaw("rira_documento_envio.regulacao_status_enviado_id")
->from('integracao_rira_documento_envio as rira_documento_envio')
->join(
'integracao_rira_documento as rira_documento',
'rira_documento.id',
'rira_documento_envio.documento_id'
)
->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id')
->orderByDesc('rira_documento_envio.created_at')
->limit(1)
)
)
->selectRaw("
rira_documento.id as documento_id,
rira_documento.identificador as identificador_documento,
rira_documento_envio.identificador_rnds as ultimo_identificador_rnds,
solicitacao_item.id as solicitacao_item_id,
solicitacao_item.codigo_procedimento,
solicitacao_item.cbo_prestador,
solicitacao.data,
solicitacao.data_agendada,
solicitacao.hora_agendada,
solicitacao.prioridade_id,
solicitacao.hipotese_diagnostica_justificativa,
status.id as status_id,
status.tipo_id as status_tipo_id,
paciente_cidadao.cns as paciente_cns,
paciente_cidadao.cpf as paciente_cpf,
cid.codigo as cid_codigo,
unidade_solicitante.cnes as cnes_solicitante,
unidade_regulador.cnes as cnes_regulador,
COALESCE(prestador_interno_unidade.cnes, NULL /* prestador_externo_destino.cnes */) as cnes_prestador
")
->orderBy('solicitacao.updated_at')
->get()
->map(function ($solicitacao) {
$solicitacao->has_agendamento = !is_null($solicitacao->data_agendada)
&& !is_null($solicitacao->hora_agendada);
return (object) [
'documento_id' => $solicitacao->documento_id,
'identificador_documento' => $solicitacao->identificador_documento ?? uniqid(),
'ultimo_identificador_rnds' => $solicitacao->ultimo_identificador_rnds,
'solicitacao_item_id' => $solicitacao->solicitacao_item_id,
'paciente_cns' => $solicitacao->paciente_cns,
'paciente_cpf' => $solicitacao->paciente_cpf,
'codigo_procedimento' => $solicitacao->codigo_procedimento,
'cid_codigo' => $solicitacao->cid_codigo,
'prioridade' => self::getPrioridade($solicitacao->prioridade_id),
'data_solicitacao' => new Carbon($solicitacao->data),
'data_hora_agendada' => $solicitacao->has_agendamento
? new Carbon("{$solicitacao->data_agendada} {$solicitacao->hora_agendada}")
: null,
'data_execucao' => null,
'status_id' => $solicitacao->status_id,
'status_composicao' => self::getStatusComposicao($solicitacao->status_tipo_id),
'status_consulta' => self::getStatusConsulta($solicitacao->status_tipo_id),
'status_paciente_consulta' => self::getStatusPacienteConsulta(),
'status_requisicao' => self::getStatusRequisicao(),
'status_condicao' => self::getStatusCondicao(),
'cnes_solicitante' => $solicitacao->cnes_solicitante,
'cnes_prestador' => $solicitacao->cnes_prestador,
'cnes_regulador' => $solicitacao->cnes_regulador,
'cnes_responsavel_status_composicao' => self::getCnesResponsavelStatusComposicao($solicitacao),
'cbo_prestador' => $solicitacao->cbo_prestador,
'hipotese_diagnostica_justificativa' => $solicitacao->hipotese_diagnostica_justificativa,
'intencao_requisicao' => self::getIntencaoRequisicao($solicitacao->status_tipo_id),
'categoria_condicao' => self::getCategoriaCondicao(),
];
});
}
private static function getPrioridade($prioridadeId)
{
switch ($prioridadeId) {
case SolicitacaoPrioridade::ELETIVO: {
return 'routine';
}
case SolicitacaoPrioridade::URGENCIA: {
return 'urgent';
}
}
}
private static function getStatusComposicao($statusTipoId)
{
switch ($statusTipoId) {
case StatusTipo::SOLICITADO: {
return 'pending';
}
case StatusTipo::DEVOLVIDO: {
return 'returned-to-requester';
}
case StatusTipo::REENVIADA: {
return 'pending';
}
case StatusTipo::CANCELADO: {
return 'cancelled';
}
case StatusTipo::EM_ESPERA: {
return 'pending';
}
case StatusTipo::AGENDADO: {
return 'booked';
}
case StatusTipo::REAGENDADO: {
return 'booked';
}
case StatusTipo::FALTA: {
return 'absence';
}
case StatusTipo::REALIZADO: {
return 'attended';
}
case StatusTipo::REMARCAR: {
return 'pending';
}
}
}
private static function getStatusConsulta($statusTipoId)
{
switch ($statusTipoId) {
case StatusTipo::SOLICITADO: {
return 'proposed';
}
case StatusTipo::DEVOLVIDO: {
return 'proposed';
}
case StatusTipo::REENVIADA: {
return 'proposed';
}
case StatusTipo::CANCELADO: {
return 'cancelled';
}
case StatusTipo::EM_ESPERA: {
return 'waitlist';
}
case StatusTipo::AGENDADO: {
return 'booked';
}
case StatusTipo::REAGENDADO: {
return 'booked';
}
case StatusTipo::FALTA: {
return 'noshow';
}
case StatusTipo::REALIZADO: {
return 'fulfilled';
}
case StatusTipo::REMARCAR: {
return 'proposed';
}
}
}
private static function getStatusPacienteConsulta()
{
return 'accepted';
}
private static function getStatusRequisicao()
{
return 'active';
}
private static function getStatusCondicao()
{
return 'active';
}
private static function getCnesResponsavelStatusComposicao($solicitacao)
{
switch ($solicitacao->status_tipo_id) {
case StatusTipo::SOLICITADO: {
return $solicitacao->cnes_solicitante;
}
case StatusTipo::DEVOLVIDO: {
return $solicitacao->cnes_regulador;
}
case StatusTipo::REENVIADA: {
return $solicitacao->cnes_solicitante;
}
case StatusTipo::CANCELADO: {
return $solicitacao->has_agendamento ? $solicitacao->cnes_prestador : $solicitacao->cnes_regulador;
}
case StatusTipo::EM_ESPERA: {
return $solicitacao->cnes_solicitante;
}
case StatusTipo::AGENDADO: {
return $solicitacao->cnes_prestador;
}
case StatusTipo::REAGENDADO: {
return $solicitacao->cnes_prestador;
}
case StatusTipo::FALTA: {
return $solicitacao->cnes_prestador;
}
case StatusTipo::REALIZADO: {
return $solicitacao->cnes_prestador;
}
case StatusTipo::REMARCAR: {
return $solicitacao->cnes_solicitante;
}
}
}
private static function getCategoriaCondicao()
{
return (object) [
'codigo' => '01',
'exibicao' => 'Principal'
];
}
private static function getIntencaoRequisicao($statusTipoId)
{
switch ($statusTipoId) {
case StatusTipo::SOLICITADO: {
return 'proposal';
}
case StatusTipo::DEVOLVIDO: {
return 'proposal';
}
case StatusTipo::REENVIADA: {
return 'proposal';
}
case StatusTipo::CANCELADO: {
return 'order';
}
case StatusTipo::EM_ESPERA: {
return 'proposal';
}
case StatusTipo::AGENDADO: {
return 'order';
}
case StatusTipo::REAGENDADO: {
return 'order';
}
case StatusTipo::FALTA: {
return 'order';
}
case StatusTipo::REALIZADO: {
return 'order';
}
case StatusTipo::REMARCAR: {
return 'proposal';
}
}
}
}

View File

@@ -0,0 +1,180 @@
<?php
namespace App\Services\Integracao\Rira;
use App\Exceptions\Integracao\Rira\CertificadoDigitalInvalidoException;
use App\Exceptions\Integracao\Rira\CertificadoDigitalNaoEncontradoException;
use App\Exceptions\Integracao\Rira\SenhaInvalidaException;
use App\Models\Integracao\Rira\Parametrizacao;
use App\Rules\Cns;
use App\Services\Integracao\RiraService;
use App\Services\Service;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class ParametrizacaoService extends Service
{
public static function index()
{
return DB::table('integracao_rira_parametrizacao')
->select([
'id',
DB::raw("'" . RiraService::getFile() . "' AS certificado_digital"),
'identificador_solicitante',
'cns_solicitante',
])
->get();
}
public static function create()
{
return [
'model' => [
'certificado_digital' => null,
'senha' => null,
'identificador_solicitante' => null,
'cns_solicitante' => null,
],
];
}
public static function store($request)
{
self::validateStore($request);
DB::transaction(function() use ($request) {
Parametrizacao::create([
'senha' => $request->senha,
'identificador_solicitante' => $request->identificador_solicitante,
'cns_solicitante' => $request->cns_solicitante,
]);
$pkcs12 = openssl_pkcs12_read(file_get_contents($request->files->get('certificado_digital')), $certificates, $request->senha);
if ($pkcs12) {
$path = RiraService::getPath() . DIRECTORY_SEPARATOR . RiraService::getFile();
if (isset($certificates['cert']) && isset($certificates['pkey'])) {
$contents = $certificates['cert'].$certificates['pkey'];
} else {
throw new CertificadoDigitalInvalidoException();
}
if (!Storage::disk('local')->put($path, $contents)) {
throw new Exception('Erro ao fazer o upload do certificado.');
} else {
$token = RiraService::getToken($request->senha);
if (isset($token['access_token'])) {
return true;
} else {
throw new CertificadoDigitalInvalidoException();
}
}
} else {
throw new SenhaInvalidaException();
}
});
}
public static function show()
{
return Parametrizacao::first();
}
public static function edit()
{
$parametrizacao = self::show();
return [
'model' => [
'certificado_digital' => null,
'senha' => str_repeat('*', strlen($parametrizacao->senha)),
'identificador_solicitante' => $parametrizacao->identificador_solicitante,
'cns_solicitante' => $parametrizacao->cns_solicitante,
],
];
}
public static function update($request)
{
self::validateUpdate($request);
DB::transaction(function() use ($request) {
$parametrizacao = self::show();
$parametrizacao->update([
'identificador_solicitante' => $request->identificador_solicitante,
'cns_solicitante' => $request->cns_solicitante,
]);
});
}
public static function destroy()
{
DB::transaction(function() {
self::show()->delete();
$path = RiraService::getPath() . DIRECTORY_SEPARATOR . RiraService::getFile();
if (Storage::disk('local')->exists($path)) {
Storage::disk('local')->delete($path);
}
});
}
public static function download()
{
$path = 'documento/integracao/rira/evidencias.pdf';
if (Storage::disk('local')->exists($path)) {
return [
'arquivo' => Storage::path($path),
'nome' => 'EVIDENCIAS.PDF',
];
} else {
throw new CertificadoDigitalNaoEncontradoException();
}
}
private static function validateStore()
{
request()->validate([
'certificado_digital' => [
'required',
],
'senha' => [
'required',
'string',
'max:180',
],
'identificador_solicitante' => [
'required',
'string',
'max:100',
],
'cns_solicitante' => [
'required',
'digits:15',
new Cns,
],
]);
}
private static function validateUpdate()
{
request()->validate([
'identificador_solicitante' => [
'required',
'string',
'max:100',
],
'cns_solicitante' => [
'required',
'digits:15',
new Cns,
],
]);
}
}

View File

@@ -0,0 +1,439 @@
<?php
namespace App\Services\Integracao;
use App\Exceptions\Integracao\Rira\CertificadoDigitalNaoEncontradoException;
use App\Models\Integracao\Rira\Parametrizacao;
use App\Services\Service;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class RiraService extends Service
{
public static function getParametrizacao()
{
return Parametrizacao::select(['senha', 'identificador_solicitante', 'cns_solicitante'])->first();
}
public static function send($cliente, $headers, $params)
{
$url = (env('APP_ENV') === 'production'
? Str::replace('uf-', Str::lower($cliente->municipio->estado->uf) . '-', env('RIRA_PRODUCAO_URL_API_SERVICO'))
: env('RIRA_HOMOLOGACAO_URL_API_SERVICO')
) . '/fhir/r4/Bundle';
$params->tipo_documento = 'RA';
$params->status_documento = 'final';
$params->titulo_documento = 'Registro de Informações da Regulação Assistencial';
$params->modalidade_assistencial = '09';
$params->composition_full_url = 'urn:uuid:transient-0';
$params->appointment_full_url = 'urn:uuid:transient-1';
$params->service_request_full_url = 'urn:uuid:transient-2';
$params->condition_full_url = 'urn:uuid:transient-3';
$params->request = [
'resourceType' => 'Bundle',
'identifier' => [
'system' => "http://www.saude.gov.br/fhir/r4/NamingSystem/BRRNDS-{$params->identificador_solicitante}",
'value' => $params->identificador_documento
],
'type' => 'document',
'timestamp' => $params->data_hora_envio->toIso8601String(),
'meta' => [
'lastUpdated' => $params->data_hora_envio->toIso8601String()
],
'entry' => [
[
'fullUrl' => $params->composition_full_url,
'resource' => self::getFhirComposition($params),
],
[
'fullUrl' => $params->appointment_full_url,
'resource' => self::getFhirAppointment($params),
],
[
'fullUrl' => $params->service_request_full_url,
'resource' => self::getFhirServiceRequest($params),
],
[
'fullUrl' => $params->condition_full_url,
'resource' => self::getFhirCondition($params),
],
]
];
return Http::withHeaders($headers)->post($url, $params->request);
}
private static function getFhirComposition($params)
{
$detailEvent = [];
if ($params->status_composicao === 'pending') {
$detailEvent[] = ['reference' => $params->service_request_full_url];
}
else if (in_array($params->status_composicao, ['booked', 'attended', 'absence'])) {
$detailEvent[] = ['reference' => $params->appointment_full_url];
}
$detailEvent[] = [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstabelecimentoSaude-1.0',
'value' => $params->cnes_responsavel_status_composicao
]
];
$data = [
'resourceType' => 'Composition',
'meta' => [
'lastUpdated' => $params->data_hora_envio->toIso8601String(),
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRRegulacaoAssistencial'
]
],
'status' => $params->status_documento,
'type' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRTipoDocumento',
'code' => $params->tipo_documento
]
]
],
'category' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRModalidadeAssistencial',
'code' => $params->modalidade_assistencial
]
]
]
],
'subject' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => $params->paciente_cns ?? $params->paciente_cpf
]
],
'date' => $params->data_hora_envio->format('Y-m-d'),
'author' => [
[
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstabelecimentoSaude-1.0',
'value' => $params->cnes_responsavel_status_composicao
]
]
],
'title' => $params->titulo_documento,
'event' => [
[
'code' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRStatusRegulacaoAssistencial',
'code' => $params->status_composicao
]
]
]
],
'period' => [
'start' => $params->data_solicitacao->toIso8601String(),
'end' => $params->data_solicitacao->toIso8601String()
],
'detail' => $detailEvent
],
],
'section' => [
[
'entry' => [
[
'reference' => $params->appointment_full_url
]
]
]
]
];
if (isset($params->ultimo_identificador_rnds)) {
$data['relatesTo'] = [
[
'code' => 'replaces',
'targetReference' => [
'reference' => "Composition/{$params->ultimo_identificador_rnds}"
]
]
];
}
return $data;
}
private static function getFhirAppointment($params)
{
$data = [
'resourceType' => 'Appointment',
'meta' => [
'lastUpdated' => $params->data_hora_envio->toIso8601String(),
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRAgendamentoRegulacaoAssistencial'
]
],
'status' => $params->status_consulta,
'serviceCategory' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRModalidadeAssistencial',
'code' => $params->modalidade_assistencial
]
]
]
],
'serviceType' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRTabelaSUS',
'code' => $params->codigo_procedimento
]
]
]
],
'appointmentType' => [
'coding' => [
[
'system' => 'http://hl7.org/fhir/request-priority',
'code' => $params->prioridade
]
]
],
'reasonReference' => [
[
'reference' => $params->condition_full_url
]
],
'basedOn' => [
[
'reference' => $params->service_request_full_url
]
],
'participant' => [
[
'type' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRTipoParticipante',
'code' => 'PCT'
]
]
]
],
'actor' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => $params->paciente_cns ?? $params->paciente_cpf
]
],
'status' => $params->status_paciente_consulta,
]
]
];
if (isset($params->data_hora_agendada)) {
$data['start'] = $params->data_hora_agendada->toIso8601String();
$data['end'] = $params->data_hora_agendada->toIso8601String();
}
if (isset($params->cbo_prestador)) {
$data['specialty'] = [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO',
'code' => $params->cbo_prestador
]
]
]
];
}
return $data;
}
private static function getFhirServiceRequest($params)
{
$data = [
'resourceType' => 'ServiceRequest',
'meta' => [
'lastUpdated' => $params->data_hora_envio->toIso8601String(),
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRRequisicaoRegulacaoAssistencial'
]
],
'status' => $params->status_requisicao,
'intent' => $params->intencao_requisicao,
'category' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRModalidadeAssistencial',
'code' => $params->modalidade_assistencial
]
]
]
],
'priority' => $params->prioridade,
'code' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRTabelaSUS',
'code' => $params->codigo_procedimento
]
]
],
'subject' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => $params->paciente_cns ?? $params->paciente_cpf
]
],
'authoredOn' => $params->data_solicitacao->format('Y-m-d'),
'requester' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstabelecimentoSaude-1.0',
'value' => $params->cnes_solicitante
]
],
'reasonReference' => [
[
'reference' => $params->condition_full_url
]
]
];
if (isset($params->data_execucao)) {
$data['occurrenceDateTime'] = $params->data_execucao->format('Y-m-d');
}
if (isset($params->cbo_prestador)) {
$data['performerType'] = [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCBO',
'code' => $params->cbo_prestador
]
]
];
}
if (isset($params->cnes_prestador)) {
$data['performer'] = [
[
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BREstabelecimentoSaude-1.0',
'value' => $params->cnes_prestador
]
]
];
}
return $data;
}
private static function getFhirCondition($params)
{
$data = [
'resourceType' => 'Condition',
'meta' => [
'lastUpdated' => $params->data_hora_envio->toIso8601String(),
'profile' => [
'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRCID10Avaliado-1.0'
]
],
'clinicalStatus' => [
'coding' => [
[
'system' => 'http://terminology.hl7.org/CodeSystem/condition-clinical',
'code' => $params->status_condicao
]
]
],
'category' => [
[
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCategoriaDiagnostico',
'code' => $params->categoria_condicao->codigo,
'display' => $params->categoria_condicao->exibicao
]
]
]
],
'code' => [
'coding' => [
[
'system' => 'http://www.saude.gov.br/fhir/r4/CodeSystem/BRCID10',
'code' => $params->cid_codigo
]
]
],
'subject' => [
'identifier' => [
'system' => 'http://www.saude.gov.br/fhir/r4/StructureDefinition/BRIndividuo-1.0',
'value' => $params->paciente_cns ?? $params->paciente_cpf
]
]
];
if (isset($params->hipotese_diagnostica_justificativa)) {
$data['note'] = [
[
'text' => $params->hipotese_diagnostica_justificativa
]
];
}
return $data;
}
public static function getToken($senha)
{
$path = self::getPath() . DIRECTORY_SEPARATOR . self::getFile();
$url = env('APP_ENV') === 'production' ? env('RIRA_PRODUCAO_URL_API_TOKEN') : env('RIRA_HOMOLOGACAO_URL_API_TOKEN');
if (Storage::disk('local')->exists($path)) {
return Http::withOptions(['cert' => [Storage::path($path), $senha]])->get($url)->json();
} else {
throw new CertificadoDigitalNaoEncontradoException();
}
}
public static function getPath()
{
return 'integracao'
. DIRECTORY_SEPARATOR
. 'rira'
. DIRECTORY_SEPARATOR
. 'certificado-digital'
. DIRECTORY_SEPARATOR
. app('config')->get('database.default');
}
public static function getFile()
{
return 'CERTIFICADO-DIGITAL.PEM';
}
}