This commit is contained in:
257
api/app/Services/Integracao/Bnafar/GerenciamentoEnvioService.php
Normal file
257
api/app/Services/Integracao/Bnafar/GerenciamentoEnvioService.php
Normal 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');
|
||||
}
|
||||
}
|
||||
20
api/app/Services/Integracao/Bnafar/MedicamentoService.php
Normal file
20
api/app/Services/Integracao/Bnafar/MedicamentoService.php
Normal 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));
|
||||
}
|
||||
}
|
||||
68
api/app/Services/Integracao/Bnafar/ParametrizacaoService.php
Normal file
68
api/app/Services/Integracao/Bnafar/ParametrizacaoService.php
Normal 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',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
344
api/app/Services/Integracao/Bnafar/PosicaoEstoqueService.php
Normal file
344
api/app/Services/Integracao/Bnafar/PosicaoEstoqueService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
571
api/app/Services/Integracao/Bnafar/RelatorioEnvioService.php
Normal file
571
api/app/Services/Integracao/Bnafar/RelatorioEnvioService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
434
api/app/Services/Integracao/Bnafar/SaidaService.php
Normal file
434
api/app/Services/Integracao/Bnafar/SaidaService.php
Normal 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;
|
||||
}
|
||||
}
|
||||
83
api/app/Services/Integracao/BnafarService.php
Normal file
83
api/app/Services/Integracao/BnafarService.php
Normal 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;
|
||||
}
|
||||
}
|
||||
116
api/app/Services/Integracao/Cns/ParametrizacaoService.php
Normal file
116
api/app/Services/Integracao/Cns/ParametrizacaoService.php
Normal 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',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
602
api/app/Services/Integracao/CnsService.php
Normal file
602
api/app/Services/Integracao/CnsService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
586
api/app/Services/Integracao/Esus/GerenciamentoEnvioService.php
Normal file
586
api/app/Services/Integracao/Esus/GerenciamentoEnvioService.php
Normal 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))();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
70
api/app/Services/Integracao/Esus/ParametrizacaoService.php
Normal file
70
api/app/Services/Integracao/Esus/ParametrizacaoService.php
Normal 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',
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
516
api/app/Services/Integracao/EsusService.php
Normal file
516
api/app/Services/Integracao/EsusService.php
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
249
api/app/Services/Integracao/IntegracaoCidadaoService.php
Normal file
249
api/app/Services/Integracao/IntegracaoCidadaoService.php
Normal 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
699
api/app/Services/Integracao/Ria/GerenciamentoEnvioService.php
Normal file
699
api/app/Services/Integracao/Ria/GerenciamentoEnvioService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
180
api/app/Services/Integracao/Ria/ParametrizacaoService.php
Normal file
180
api/app/Services/Integracao/Ria/ParametrizacaoService.php
Normal 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,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
1268
api/app/Services/Integracao/Ria/RelatorioEnvioService.php
Normal file
1268
api/app/Services/Integracao/Ria/RelatorioEnvioService.php
Normal file
File diff suppressed because it is too large
Load Diff
351
api/app/Services/Integracao/RiaService.php
Normal file
351
api/app/Services/Integracao/RiaService.php
Normal 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);
|
||||
}
|
||||
}
|
||||
443
api/app/Services/Integracao/Rira/DocumentoService.php
Normal file
443
api/app/Services/Integracao/Rira/DocumentoService.php
Normal 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';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
180
api/app/Services/Integracao/Rira/ParametrizacaoService.php
Normal file
180
api/app/Services/Integracao/Rira/ParametrizacaoService.php
Normal 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,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
439
api/app/Services/Integracao/RiraService.php
Normal file
439
api/app/Services/Integracao/RiraService.php
Normal 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';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user