Files
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

1034 lines
65 KiB
PHP

<?php
namespace App\Services\Imunizacao;
use App\Enums\Cadastro\Localizacao\Zona;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\Imunizacao\SaidaMotivo;
use App\Enums\Imunizacao\SaidaTipo;
use App\Models\Imunizacao\Exportacao;
use App\Services\Service;
use App\Utils\ZipUtil;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class ExportacaoService extends Service
{
public static function create()
{
return [
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
$temporaryPath = 'imunizacao' . DIRECTORY_SEPARATOR . 'exportacao' . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR . $request->header('customer');
try {
Storage::deleteDirectory($temporaryPath);
foreach (self::getPacientes($request) as $value) {
$arquivo = 'P' . $value['cnes'] . '.DAT';
foreach($value['pacientes'] as $value) {
Storage::disk('local')->append($temporaryPath . DIRECTORY_SEPARATOR . $arquivo, implode(', ', $value));
}
}
foreach (self::getRegistrosVacinacao($request) as $value) {
$arquivo = 'L' . $value['cnes'] . '.DAT';
foreach($value['registros_vacinacao'] as $value) {
Storage::disk('local')->append($temporaryPath . DIRECTORY_SEPARATOR . $arquivo, implode(', ', $value));
}
}
foreach (self::getObservacoesRegistrosVacinacao($request) as $value) {
$arquivo = 'O' . $value['cnes'] . '.DAT';
foreach($value['observacoes_registros_vacinacao'] as $value) {
Storage::disk('local')->append($temporaryPath . DIRECTORY_SEPARATOR . $arquivo, implode(', ', $value));
}
}
foreach (self::getBoletinsMovimentacao($request) as $value) {
$arquivo = 'B' . $value['cnes'] . '.DAT';
foreach($value['boletins_movimentacao'] as $value) {
Storage::disk('local')->append($temporaryPath . DIRECTORY_SEPARATOR . $arquivo, implode(', ', $value));
}
}
foreach (self::getItensBoletinsMovimentacao($request) as $value) {
$arquivo = 'I' . $value['cnes'] . '.DAT';
foreach($value['itens_boletins_movimentacao'] as $value) {
Storage::disk('local')->append($temporaryPath . DIRECTORY_SEPARATOR . $arquivo, implode(', ', $value));
}
}
$arquivos = [];
foreach (Storage::disk('local')->files($temporaryPath) as $value) {
$arquivos[] = [
'path' => storage_path('app' . DIRECTORY_SEPARATOR . $value),
'name' => basename($value),
];
}
$definitivePath = 'imunizacao' . DIRECTORY_SEPARATOR . 'exportacao' . DIRECTORY_SEPARATOR . $request->header('customer');
$arquivo = 'M-' . Str::substr(self::getCliente()->ibge, 0, 6) . '-' . $request['ano'] . $request['mes'] . '-' . Carbon::now()->format('dmYHis') . '-RKM.PNI';
ZipUtil::compress($arquivos, storage_path('app' . DIRECTORY_SEPARATOR . $definitivePath . DIRECTORY_SEPARATOR . $arquivo));
Storage::deleteDirectory($temporaryPath);
if (count($arquivos) > 0) {
DB::beginTransaction();
$exportacao = Exportacao::create([
'usuario_id' => self::getUsuarioLogado()->id,
'mes' => $request['mes'],
'ano' => $request['ano'],
'arquivo' => $arquivo,
]);
DB::commit();
return $exportacao->fresh();
} else {
return false;
}
} catch (Exception $_) {
DB::rollBack();
dd($_);
}
}
public static function datatable()
{
return DB::table('imunizacao_exportacao')
->select([
'imunizacao_exportacao.id',
'cadastro_cidadao.nome AS usuario_nome',
DB::raw("DATE_FORMAT(imunizacao_exportacao.created_at, '%d/%m/%Y %H:%i') AS data_hora_exportacao"),
'imunizacao_exportacao.mes',
'imunizacao_exportacao.ano',
])
->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_exportacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id');
}
public static function list()
{
switch (request()->get('listar')) {
case 'meses':
return self::getMeses(request()->get('ano'));
break;
default:
return [];
break;
}
}
public static function download($id)
{
$exportacao = Exportacao::findOrFail($id);
return [
'nome' => $exportacao->arquivo,
'arquivo' => Storage::path('imunizacao' . DIRECTORY_SEPARATOR . 'exportacao' . DIRECTORY_SEPARATOR . request()->header('customer') . DIRECTORY_SEPARATOR . $exportacao->arquivo),
];
}
private static function validate($request)
{
return $request->validate([
'mes' => [
'required',
'integer',
],
'ano' => [
'required',
'integer',
],
]);
}
private static function getFormData()
{
return [
'meses' => [],
'anos' => self::getAnos(),
];
}
private static function getModelData()
{
return [
'mes' => null,
'ano' => null,
];
}
private static function getUsuarioLogado()
{
return DB::table('cadastro_usuario')
->select([
'cadastro_usuario.id',
])
->join('cadastro_lotacao', 'cadastro_lotacao.usuario_id', 'cadastro_usuario.id')
->where('cadastro_lotacao.id', auth()->payload()->get('lotacao_id'))
->first();
}
private static function getMeses($ano)
{
return DB::table('imunizacao_registro_aplicacao')
->select([
DB::raw('EXTRACT(MONTH FROM imunizacao_registro_aplicacao.data_aplicacao) AS mes')
])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $ano)
->distinct()
->orderByRaw('EXTRACT(MONTH FROM imunizacao_registro_aplicacao.data_aplicacao)')
->get();
}
private static function getAnos()
{
return DB::table('imunizacao_registro_aplicacao')
->select([
DB::raw('EXTRACT(YEAR FROM imunizacao_registro_aplicacao.data_aplicacao) AS ano')
])
->distinct()
->get();
}
private static function getCliente()
{
return DB::table('intranet.cadastro_cliente')
->select([
'cadastro_municipio.ibge',
])
->join('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_cliente.municipio_id')
->where('cadastro_cliente.link', request()->header('customer'))
->first();
}
private static function getParametrizacaoExportacao()
{
return DB::table('imunizacao_parametrizacao_exportacao')
->select([
'codigo_sistema',
'sigla_sistema',
'senha_arquivo',
])
->first();
}
private static function getPacientes($request)
{
$items = [];
$parametrizacaoExportacao = self::getParametrizacaoExportacao();
DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.cnes AS unidade_cnes',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereNotNull('cadastro_unidade.cnes')
->whereRaw('TRIM(cadastro_unidade.cnes)', '')
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_registro_atualizacao')
->whereColumn('imunizacao_registro_atualizacao.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereMonth('imunizacao_registro_atualizacao.data_atualizacao', $request['mes'])
->whereYear('imunizacao_registro_atualizacao.data_atualizacao', $request['ano']);
})
->orWhereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_registro_aplicacao')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->whereColumn('imunizacao_saida.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano']);
})
->get()
->each(function($query) use ($request, $parametrizacaoExportacao, &$items) {
$registrosAtualizacao = DB::table('imunizacao_registro_atualizacao')
->select([
'cadastro_paciente.id AS paciente_id',
'cadastro_unidade.cnes AS unidade_cnes',
'cadastro_cidadao.cns AS cidadao_cns',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_cidadao.nome_mae AS cidadao_nome_mae',
'cadastro_cidadao.sexo_id AS cidadao_sexo_id',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%m/%d/%Y 00:00:00") AS cidadao_data_nascimento'),
'cadastro_raca_cor.codigo AS raca_cor_codigo',
'cadastro_endereco.zona_id AS endereco_zona_id',
'cadastro_pais.codigo AS pais_codigo',
'cadastro_municipio.id AS municipio_id',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_logradouro.nome AS logradouro_nome',
'cadastro_endereco.numero AS logradouro_numero',
'cadastro_endereco.complemento AS endereco_complemento',
'cadastro_logradouro.cep AS logradouro_cep',
DB::raw('
(
SELECT numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id
AND cadastro_cidadao_telefone.principal = TRUE
LIMIT 1
) AS cidadao_telefone
'),
'cadastro_paciente.email AS paciente_email',
'cadastro_etnia_indigena.codigo AS etnia_indigena_codigo',
'cadastro_bairro.id AS bairro_id',
'cadastro_cidadao.nome_social AS cidadao_nome_social',
'cadastro_pais_nascimento.codigo AS pais_nascimento_codigo',
'cadastro_municipio_nascimento.id AS municipio_nascimento_id',
])
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin('cadastro_raca_cor', 'cadastro_raca_cor.id', 'cadastro_cidadao.raca_cor_id')
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->leftJoin('intranet.cadastro_pais', 'cadastro_pais.id', 'cadastro_estado.pais_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->leftJoin('cadastro_etnia_indigena', 'cadastro_etnia_indigena.id', 'cadastro_cidadao.etnia_indigena_id')
->leftJoin('intranet.cadastro_municipio AS cadastro_municipio_nascimento', 'cadastro_municipio_nascimento.id', 'cadastro_cidadao.municipio_nascimento_id')
->leftJoin('intranet.cadastro_pais AS cadastro_pais_nascimento', 'cadastro_pais_nascimento.id', 'cadastro_cidadao.pais_nascimento_id')
->where('imunizacao_registro_atualizacao.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereMonth('imunizacao_registro_atualizacao.data_atualizacao', $request['mes'])
->whereYear('imunizacao_registro_atualizacao.data_atualizacao', $request['ano'])
->distinct();
$registrosAplicacao = DB::table('imunizacao_registro_aplicacao')
->select([
'cadastro_paciente.id AS paciente_id',
'cadastro_unidade.cnes AS unidade_cnes',
'cadastro_cidadao.cns AS cidadao_cns',
'cadastro_cidadao.nome AS cidadao_nome',
'cadastro_cidadao.nome_mae AS cidadao_nome_mae',
'cadastro_cidadao.sexo_id AS cidadao_sexo_id',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%m/%d/%Y 00:00:00") AS cidadao_data_nascimento'),
'cadastro_raca_cor.codigo AS raca_cor_codigo',
'cadastro_endereco.zona_id AS endereco_zona_id',
'cadastro_pais.codigo AS pais_codigo',
'cadastro_municipio.id AS municipio_id',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_logradouro.nome AS logradouro_nome',
'cadastro_endereco.numero AS logradouro_numero',
'cadastro_endereco.complemento AS endereco_complemento',
'cadastro_logradouro.cep AS logradouro_cep',
DB::raw('
(
SELECT numero
FROM cadastro_cidadao_telefone
WHERE cadastro_cidadao_telefone.cidadao_id = cadastro_cidadao.id
AND cadastro_cidadao_telefone.principal = TRUE
LIMIT 1
) AS cidadao_telefone
'),
'cadastro_paciente.email AS paciente_email',
'cadastro_etnia_indigena.codigo AS etnia_indigena_codigo',
'cadastro_bairro.id AS bairro_id',
'cadastro_cidadao.nome_social AS cidadao_nome_social',
'cadastro_pais_nascimento.codigo AS pais_nascimento_codigo',
'cadastro_municipio_nascimento.id AS municipio_nascimento_id',
])
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin('cadastro_raca_cor', 'cadastro_raca_cor.id', 'cadastro_cidadao.raca_cor_id')
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->leftJoin('intranet.cadastro_pais', 'cadastro_pais.id', 'cadastro_estado.pais_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->leftJoin('cadastro_etnia_indigena', 'cadastro_etnia_indigena.id', 'cadastro_cidadao.etnia_indigena_id')
->leftJoin('intranet.cadastro_municipio AS cadastro_municipio_nascimento', 'cadastro_municipio_nascimento.id', 'cadastro_cidadao.municipio_nascimento_id')
->leftJoin('intranet.cadastro_pais AS cadastro_pais_nascimento', 'cadastro_pais_nascimento.id', 'cadastro_cidadao.pais_nascimento_id')
->where('imunizacao_saida.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano'])
->union($registrosAtualizacao)
->distinct()
->get()
->map(function($query) use ($parametrizacaoExportacao) {
return [
'CO_SISTEMA_ORIGEM' => $parametrizacaoExportacao->codigo_sistema,
'CO_CHAVE_SISTEMA_ORIGEM' => '"' . Str::substr($query->paciente_id, 0, 50) . '"',
'CO_CNES_CADASTRO' => '"' . Str::substr($query->unidade_cnes, 0, 7) . '"',
'CO_NUMERO_CARTAO' => Str::substr($query->cidadao_cns, 0, 15),
'NO_PACIENTE' => '"' . Str::substr($query->cidadao_nome, 0, 70) . '"',
'NO_MAE_PACIENTE' => '"' . Str::substr($query->cidadao_nome_mae, 0, 70) . '"',
'CO_SEXO_PACIENTE' => '"' . Str::substr($query->cidadao_sexo_id === Sexo::FEMININO ? 'F' : 'M', 0, 1) . '"',
'DT_NASCIMENTO' => $query->cidadao_data_nascimento,
'CO_RACA' => Str::substr($query->raca_cor_codigo, 0, 2), // Verificar.
'SG_ZONA' => Str::substr($query->endereco_zona_id === Zona::RURAL ? 'R' : 'U', 0, 1),
'CO_PAIS' => Str::substr($query->pais_codigo, 0, 3), // Verificar.
'CO_MUNICIPIO' => Str::substr($query->municipio_id, 0, 6), // Verificar.
'NO_BAIRRO' => '"' . Str::substr($query->bairro_nome, 0, 72) . '"',
'DS_ENDERECO' => '"' . Str::substr($query->logradouro_nome, 0, 60) . '"',
'NU_ENDERECO' => Str::substr($query->logradouro_numero, 0, 10),
'DS_COMPLEMENTO' => '"' . Str::substr($query->endereco_complemento, 0, 20) . '"',
'NU_CEP' => Str::substr($query->logradouro_cep, 0, 8),
'NU_TELEFONE' => Str::substr($query->cidadao_telefone, 0, 10),
'NO_EMAIL' => '"' . Str::substr($query->paciente_email, 0, 50) . '"',
'CO_ETINIA' => $query->etnia_indigena_codigo, // Verificar.
'CO_BAIRRO' => $query->bairro_id, // Verificar.
'CO_MUNICIPIO_BAIRRO' => Str::substr($query->municipio_id, 0, 6), // Verificar.
'CO_TIPO_DOCUMENTO' => null,
'NU_DOCUMENTO' => Str::substr(null, 0, 25),
'CO_TIPO_SAIDA_PACIENTE' => null,
'NO_SOCIAL' => '"' . Str::substr($query->cidadao_nome_social, 0, 70) . '"',
'CO_PAIS_NASCIMENTO' => $query->pais_nascimento_codigo, // Verificar.
'CO_MUNICIPIO_NASCIMENTO' => $query->municipio_nascimento_id, // Verificar.
'FL_EXCLUSAO' => '"' . Str::substr(null, 0, 1) . '"',
'DT_EXCLUSAO' => null,
];
});
$items[] = [
'cnes' => $query->unidade_cnes,
'pacientes' => $registrosAplicacao,
];
});
return $items;
}
private static function getRegistrosVacinacao($request)
{
$items = [];
$parametrizacaoExportacao = self::getParametrizacaoExportacao();
DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.cnes AS unidade_cnes',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereNotNull('cadastro_unidade.cnes')
->whereRaw('TRIM(cadastro_unidade.cnes)', '')
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_registro_atualizacao')
->whereColumn('imunizacao_registro_atualizacao.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereMonth('imunizacao_registro_atualizacao.data_atualizacao', $request['mes'])
->whereYear('imunizacao_registro_atualizacao.data_atualizacao', $request['ano']);
})
->orWhereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_registro_aplicacao')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->whereColumn('imunizacao_saida.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano']);
})
->get()
->each(function($query) use ($request, $parametrizacaoExportacao, &$items) {
$registrosAtualizacao = DB::table('imunizacao_registro_atualizacao')
->select([
'imunizacao_registro_atualizacao.id AS registro_vacinacao_id',
'cadastro_unidade_sala_vacinacao.cnes AS unidade_sala_vacinacao_cnes',
'cadastro_paciente.id AS paciente_id',
'cadastro_unidade_paciente.cnes AS unidade_paciente_cnes',
'imunizacao_registro_atualizacao.vacina_id',
'imunizacao_registro_atualizacao.dose_id',
DB::raw('NULL AS imunizacao_advertida'),
DB::raw('DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, "%m/%d/%Y 00:00:00") AS data_vacinacao'),
'imunizacao_registro_atualizacao.lote',
'cadastro_municipio.id AS municipio_id',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_endereco.zona_id AS endereco_zona_id',
'imunizacao_registro_atualizacao.grupo_atendimento_id',
DB::raw('NULL AS comunicante_hanseniase'),
DB::raw('NULL AS gestante'),
DB::raw('NULL AS produtor_id'),
'imunizacao_registro_atualizacao.estrategia_id',
DB::raw('NULL AS motivo_id'),
'cadastro_cidadao_usuario.cns AS cidadao_usuario_cns',
DB::raw('NULL AS data_aprazamento'),
DB::raw('NULL AS puerpera'),
])
->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_unidade AS cadastro_unidade_paciente', 'cadastro_unidade_paciente.id', 'cadastro_paciente.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('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_sala_vacinacao', 'cadastro_infraestrutura_sala_vacinacao.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_sala_vacinacao', 'cadastro_unidade_sala_vacinacao.id', 'cadastro_infraestrutura_sala_vacinacao.unidade_id')
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao_paciente.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->where('imunizacao_registro_atualizacao.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereMonth('imunizacao_registro_atualizacao.data_atualizacao', $request['mes'])
->whereYear('imunizacao_registro_atualizacao.data_atualizacao', $request['ano'])
->distinct();
$registrosAplicacao = DB::table('imunizacao_registro_aplicacao')
->select([
'imunizacao_registro_aplicacao.id AS registro_vacinacao_id',
'cadastro_unidade_sala_vacinacao.cnes AS unidade_sala_vacinacao_cnes',
'cadastro_paciente.id AS paciente_id',
'cadastro_unidade_paciente.cnes AS unidade_paciente_cnes',
'imunizacao_entrada_vacina.vacina_id',
'imunizacao_registro_aplicacao.dose_id',
'imunizacao_registro_aplicacao.imunizacao_advertida',
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, "%m/%d/%Y 00:00:00") AS data_vacinacao'),
'imunizacao_entrada_vacina.lote',
'cadastro_municipio.id AS municipio_id',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_endereco.zona_id AS endereco_zona_id',
'imunizacao_registro_aplicacao.grupo_atendimento_id',
'imunizacao_registro_aplicacao.comunicante_hanseniase',
'imunizacao_registro_aplicacao.gestante',
'imunizacao_entrada_vacina.produtor_id',
'imunizacao_registro_aplicacao.estrategia_id',
'imunizacao_registro_aplicacao.cid_id',
'cadastro_cidadao_usuario.cns AS cidadao_usuario_cns',
DB::raw('
(
SELECT DATE_FORMAT(imunizacao_registro_aprazamento.data_aprazamento, "%m/%d/%Y 00:00:00")
FROM imunizacao_registro_aprazamento
WHERE imunizacao_registro_aprazamento.registro_aplicacao_id = imunizacao_registro_aplicacao.id
LIMIT 1
) AS data_aprazamento
'),
'imunizacao_registro_aplicacao.puerpera',
])
->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_unidade AS cadastro_unidade_paciente', 'cadastro_unidade_paciente.id', 'cadastro_paciente.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('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_saida.sala_vacinacao_id')
->join('cadastro_infraestrutura AS cadastro_infraestrutura_sala_vacinacao', 'cadastro_infraestrutura_sala_vacinacao.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade AS cadastro_unidade_sala_vacinacao', 'cadastro_unidade_sala_vacinacao.id', 'cadastro_infraestrutura_sala_vacinacao.unidade_id')
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao_paciente.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->where('imunizacao_saida.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano'])
->union($registrosAtualizacao)
->distinct()
->get()
->map(function($query) use ($parametrizacaoExportacao) {
return [
'CO_SISTEMA_ORIGEM' => $parametrizacaoExportacao->codigo_sistema,
'CO_CHAVE_SISTEMA_ORIGEM' => '"' . Str::substr($query->registro_vacinacao_id, 0, 50) . '"',
'CO_CNES_LANCAMENTO' => '"' . Str::substr($query->unidade_sala_vacinacao_cnes, 0, 7) . '"',
'CO_CNES_CADASTRO' => '"' . Str::substr($query->unidade_paciente_cnes, 0, 7) . '"',
'CO_CHAVE_PACIENTE' => '"' . Str::substr($query->paciente_id, 0, 50) . '"',
'CO_PRODUTO' => $query->vacina_id,
'CO_DOSE' => $query->dose_id,
'NU_DOSE_REPETIDA' => null,
'FL_INADVERTIDA' => '"' . Str::substr($query->imunizacao_advertida ? 'S' : 'N', 0, 1) . '"',
'DT_IMUNIZACAO' => '"' . $query->data_vacinacao . '"',
'NU_LOTE' => '"' . Str::substr($query->lote, 0, 30) . '"',
'CO_MUNICIPIO_PACIENTE' => '"' . Str::substr($query->municipio_id, 0, 6) . '"',
'NO_BAIRRO_PACIENTE' => '"' . Str::substr($query->bairro_nome, 0, 40) . '"',
'SG_ZONA' => '"' . Str::substr($query->endereco_zona_id, 0, 1) . '"',
'CO_GRUPO_ATENDIMENTO' => $query->grupo_atendimento_id,
'FL_COMUNICANTE_HANSENIASE' => '"' . Str::substr($query->comunicante_hanseniase ? 'S' : 'N', 0, 1) . '"',
'FL_GESTANTE' => '"' . Str::substr($query->gestante ? 'S' : 'N', 0, 1) . '"',
'CO_PRODUTOR' => $query->produtor_id,
'CO_ESTRATEGIA' => $query->estrategia_id,
'CO_MOTIVO_INDICACAO' => $query->cid_id,
'CO_CNS_PROFISSIONAL' => '"' . Str::substr($query->cidadao_usuario_cns, 0, 15) . '"',
'CO_CBOS_INDICADOR' => '"' . Str::substr(null, 0, 6) . '"',
'FL_ATUALIZACAO_CADERNETA' => '"' . Str::substr(null, 0, 1) . '"',
'DT_APRAZAMENTO' => '"' . $query->data_aprazamento . '"',
'FL_PUERPERA' => '"' . Str::substr($query->puerpera ? 'S' : 'N', 0, 1) . '"',
'FL_EXCLUSAO' => '"' . Str::substr(null, 0, 1) . '"',
'DT_EXCLUSAO' => null,
];
});
$items[] = [
'cnes' => $query->unidade_cnes,
'registros_vacinacao' => $registrosAplicacao,
];
});
return $items;
}
private static function getObservacoesRegistrosVacinacao($request)
{
$items = [];
$parametrizacaoExportacao = self::getParametrizacaoExportacao();
DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.cnes AS unidade_cnes',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereNotNull('cadastro_unidade.cnes')
->whereRaw('TRIM(cadastro_unidade.cnes)', '')
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_registro_aplicacao')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->whereColumn('imunizacao_saida.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano']);
})
->get()
->each(function($query) use ($request, $parametrizacaoExportacao, &$items) {
$registrosAplicacao = DB::table('imunizacao_registro_aplicacao')
->select([
'imunizacao_registro_aplicacao.id AS registro_aplicacao_id',
'imunizacao_registro_aplicacao.observacao AS registro_aplicacao_observacao',
])
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->where('imunizacao_saida.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereMonth('imunizacao_registro_aplicacao.data_aplicacao', $request['mes'])
->whereYear('imunizacao_registro_aplicacao.data_aplicacao', $request['ano'])
->distinct()
->get()
->map(function($query) use ($parametrizacaoExportacao) {
return [
'CO_SISTEMA_ORIGEM' => $parametrizacaoExportacao->codigo_sistema,
'CO_CHAVE_SISTEMA_ORIGEM' => '"' . Str::substr($query->registro_aplicacao_id, 0, 50) . '"',
'DS_OBSERVACAO' => '"' . Str::substr($query->registro_aplicacao_observacao, 0, 5000) . '"',
];
});
$items[] = [
'cnes' => $query->unidade_cnes,
'observacoes_registros_vacinacao' => $registrosAplicacao,
];
});
return $items;
}
private static function getBoletinsMovimentacao($request)
{
$items = [];
$parametrizacaoExportacao = self::getParametrizacaoExportacao();
DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.cnes AS unidade_cnes',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereNotNull('cadastro_unidade.cnes')
->whereRaw('TRIM(cadastro_unidade.cnes)', '')
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_entrada')
->whereColumn('imunizacao_entrada.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereYear('imunizacao_entrada.data_entrada', $request['ano'])
->whereMonth('imunizacao_entrada.data_entrada', $request['mes']);
})
->orWhereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_saida')
->whereColumn('imunizacao_saida.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereYear('imunizacao_saida.data_saida', $request['ano'])
->whereMonth('imunizacao_saida.data_saida', $request['mes']);
})
->get()
->each(function($query) use ($request, &$items, $parametrizacaoExportacao) {
$boletinsMovimentacao = DB::table('imunizacao_entrada_vacina')
->select([
'imunizacao_entrada_vacina.id AS movimentacao_id',
DB::raw('EXTRACT(YEAR FROM imunizacao_entrada.data_entrada) AS movimentacao_ano'),
DB::raw('EXTRACT(MONTH FROM imunizacao_entrada.data_entrada) AS movimentacao_mes'),
'cadastro_unidade.cnes AS unidade_cnes',
])
->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')
->where('imunizacao_entrada.sala_vacinacao_id', $query->sala_vacinacao_id)
->whereYear('imunizacao_entrada.data_entrada', $request['ano'])
->whereMonth('imunizacao_entrada.data_entrada', $request['mes'])
->get()
->map(function($query) use ($parametrizacaoExportacao) {
return [
'CO_SISTEMA_ORIGEM' => $parametrizacaoExportacao->codigo_sistema,
'CO_CHAVE_SISTEMA_ORIGEM' => $query->movimentacao_id,
'CO_CNES' => $query->unidade_cnes,
'CO_ANO_APURACAO' => $query->movimentacao_ano,
'CO_MES_APURACAO' => $query->movimentacao_mes,
];
});
$items[] = [
'cnes' => $query->unidade_cnes,
'boletins_movimentacao' => $boletinsMovimentacao,
];
});
return $items;
}
private static function getItensBoletinsMovimentacao($request)
{
$items = [];
DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id AS sala_vacinacao_id',
'cadastro_unidade.cnes AS unidade_cnes',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereNotNull('cadastro_unidade.cnes')
->whereRaw('TRIM(cadastro_unidade.cnes)', '')
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_entrada')
->whereColumn('imunizacao_entrada.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereYear('imunizacao_entrada.data_entrada', $request['ano'])
->whereMonth('imunizacao_entrada.data_entrada', $request['mes']);
})
->orWhereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_saida')
->whereColumn('imunizacao_saida.sala_vacinacao_id', 'imunizacao_sala_vacinacao.id')
->whereYear('imunizacao_saida.data_saida', $request['ano'])
->whereMonth('imunizacao_saida.data_saida', $request['mes']);
})
->get()
->each(function($salaVacinacao) use ($request, &$items) {
$itensBoletinsMovimentacao = DB::table('imunizacao_vacina_produtor_apresentacao')
->select([
'cadastro_vacina.codigo AS vacina_codigo',
'imunizacao_apresentacao.codigo AS apresentacao_codigo',
'imunizacao_produtor.codigo AS produtor_codigo',
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_entrada_vacina.quantidade), 0)
FROM imunizacao_entrada_vacina
INNER JOIN imunizacao_entrada
ON imunizacao_entrada.id = imunizacao_entrada_vacina.entrada_id
WHERE imunizacao_entrada.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
) AS quantidade_recebida
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::DISTRIBUICAO . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
) AS quantidade_distribuida
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::APLICACAO . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
) AS quantidade_utilizada
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::QUEBRA . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_quebra
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::FALTA_ENERGIA . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_falta_energia
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::FALHA_EQUIPAMENTO . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_falha_equipamento
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::VALIDADE_VENCIDA . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_validade_vencida
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::PROCEDIMENTO_INADEQUADO . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_procedimento_inadequado
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::OUTROS . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_outros
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::BAIXA . "
AND imunizacao_saida.motivo_id = " . SaidaMotivo::PERDA_TRANSPORTE . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_perda_transporte
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
INNER JOIN imunizacao_saida
ON imunizacao_saida.id = imunizacao_saida_vacina.saida_id
INNER JOIN imunizacao_entrada_vacina
ON imunizacao_entrada_vacina.id = imunizacao_saida_vacina.entrada_vacina_id
WHERE imunizacao_saida.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_saida.tipo_id = " . SaidaTipo::INDISPONIBILIDADE . "
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
AND NOT EXISTS (
SELECT 1
FROM imunizacao_entrada_vacina AS iev
WHERE iev.saida_vacina_id = imunizacao_saida_vacina.id
)
) AS quantidade_saldo_indisponivel
"),
DB::raw("
(
SELECT COALESCE(SUM(imunizacao_entrada_vacina.quantidade - (
SELECT COALESCE(SUM(imunizacao_saida_vacina.quantidade), 0)
FROM imunizacao_saida_vacina
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
)), 0)
FROM imunizacao_entrada_vacina
INNER JOIN imunizacao_entrada
ON imunizacao_entrada.id = imunizacao_entrada_vacina.entrada_id
WHERE imunizacao_entrada.sala_vacinacao_id = $salaVacinacao->sala_vacinacao_id
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
AND imunizacao_entrada_vacina.produtor_id = imunizacao_produtor.id
AND imunizacao_entrada_vacina.apresentacao_id = imunizacao_apresentacao.id
) AS quantidade_saldo_disponivel
"),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_vacina_produtor_apresentacao.vacina_id')
->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_vacina_produtor_apresentacao.produtor_id')
->join('imunizacao_apresentacao', 'imunizacao_apresentacao.id', 'imunizacao_vacina_produtor_apresentacao.apresentacao_id')
->whereNotNull('cadastro_vacina.codigo')
->where(function($query) use ($request) {
$query
->whereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_entrada_vacina')
->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id')
->whereColumn('imunizacao_entrada_vacina.vacina_id', 'cadastro_vacina.id')
->whereColumn('imunizacao_entrada_vacina.produtor_id', 'imunizacao_produtor.id')
->whereColumn('imunizacao_entrada_vacina.apresentacao_id', 'imunizacao_apresentacao.id')
->whereYear('imunizacao_entrada.data_entrada', $request['ano'])
->whereMonth('imunizacao_entrada.data_entrada', $request['mes']);
})
->orWhereExists(function ($query) use ($request) {
$query->select(DB::raw(1))
->from('imunizacao_saida_vacina')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->whereColumn('imunizacao_entrada_vacina.vacina_id', 'cadastro_vacina.id')
->whereColumn('imunizacao_entrada_vacina.produtor_id', 'imunizacao_produtor.id')
->whereColumn('imunizacao_entrada_vacina.apresentacao_id', 'imunizacao_apresentacao.id')
->whereYear('imunizacao_saida.data_saida', $request['ano'])
->whereMonth('imunizacao_saida.data_saida', $request['mes']);
});
})
->get()
->map(function($query) use ($salaVacinacao) {
return [
'CO_CNES' => $salaVacinacao->unidade_cnes,
'CO_PRODUTO' => (int) $query->vacina_codigo,
'CO_APRESENTACAO' => (int) $query->apresentacao_codigo,
'CO_PRODUTOR' => (int) $query->produtor_codigo,
'QT_DOSES_RECEBIDAS' => (int) $query->quantidade_recebida,
'QT_DOSES_DISTRIBUIDAS' => (int) $query->quantidade_distribuida,
'QT_DOSES_UTILIZADAS' => (int) $query->quantidade_utilizada,
'QT_DOSES_TRANSFERIDAS' => 0,
'QT_PERDA_QUEBRA' => (int) $query->quantidade_perda_quebra,
'QT_PERDA_FALTA_ENERGIA' => (int) $query->quantidade_perda_falta_energia,
'QT_PERDA_FALHA_EQUIP' => (int) $query->quantidade_perda_falha_equipamento,
'QT_PERDA_VALID_VENC' => (int) $query->quantidade_perda_validade_vencida,
'QT_PERDA_PROCED_INADEQ' => (int) $query->quantidade_perda_procedimento_inadequado,
'QT_PERDA_OUTROS_MOT' => (int) $query->quantidade_perda_outros,
'QT_PERDA_TRANSPORTE' => (int) $query->quantidade_perda_transporte,
'QT_SALDO_INDISPONIVEL' => (int) $query->quantidade_saldo_indisponivel,
'QT_SALDO_DISPONIVEL' => (int) $query->quantidade_saldo_disponivel,
'QT_INDISPONIVEL_ANTERIOR' => null,
'QT_DISPONIVEL_ANTERIOR' => null,
];
});
$items[] = [
'cnes' => $salaVacinacao->unidade_cnes,
'itens_boletins_movimentacao' => $itensBoletinsMovimentacao,
];
});
return $items;
}
}