init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,473 @@
<?php
namespace App\Services\Cadastro;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use App\Utils\DataUtil;
use Illuminate\Support\Facades\DB;
class RelatorioMaterialService extends Service
{
public static function index()
{
$params = self::getParams();
$itens = DB::table('cadastro_material')
->select([
'cadastro_material.id',
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'cadastro_unidade_medida'
) . ' AS material_descricao'),
'cadastro_grupo.nome AS grupo_nome',
'cadastro_subgrupo.nome AS subgrupo_nome',
'cadastro_receita_tipo.nome AS receita_tipo_nome',
'cadastro_livro_registro.nome AS livro_nome',
'cadastro_livro_registro_tipo.nome AS livro_tipo_nome',
'cadastro_forma_farmaceutica.nome AS forma_farmaceutica_nome',
DB::raw("
CONCAT_WS(
', ',
CASE WHEN is_alto_custo THEN 'Alto custo' END,
CASE WHEN is_programa_remedio_em_casa THEN 'Programa remédio em casa' END,
CASE WHEN is_acao_judicial THEN 'Ação judicial' END,
CASE WHEN is_remume THEN 'REMUME' END
) AS programa_acao
"),
DB::raw("CASE WHEN is_ativo = 1 THEN 'Ativo' ELSE 'Inativo' END AS status"),
DB::raw("CASE WHEN possui_lote = 1 THEN 'Sim' ELSE 'Não' END AS possui_lote"),
'cadastro_material_bnafar.codigo AS material_bnafar_codigo',
DB::raw("
(
SELECT GROUP_CONCAT(integracao_bnafar_medicamento.codigo SEPARATOR ', ')
FROM integracao_bnafar_medicamento
INNER JOIN cadastro_material_integracao_bnafar_medicamento ON cadastro_material_integracao_bnafar_medicamento.medicamento_id = integracao_bnafar_medicamento.id
WHERE cadastro_material_integracao_bnafar_medicamento.material_id = cadastro_material.id
) AS material_obm_codigo
"),
])
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
->leftJoin('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
->leftJoin('cadastro_subgrupo', 'cadastro_subgrupo.id', 'cadastro_material.subgrupo_id')
->leftJoin('cadastro_receita_tipo', 'cadastro_receita_tipo.id', 'cadastro_material.receita_tipo_id')
->leftJoin('cadastro_livro_registro', 'cadastro_livro_registro.id', 'cadastro_material.livro_registro_id')
->leftJoin('cadastro_livro_registro_tipo', 'cadastro_livro_registro_tipo.id', 'cadastro_material.livro_registro_tipo_id')
->leftJoin('cadastro_forma_farmaceutica', 'cadastro_forma_farmaceutica.id', 'cadastro_material.forma_farmaceutica_id')
->leftJoin('cadastro_material_bnafar', 'cadastro_material_bnafar.id', 'cadastro_material.material_bnafar_id')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->when($params->programas_acoes, function ($q) use ($params) {
foreach ($params->programas_acoes as $programaAcao) {
$q->orWhere("cadastro_material.{$programaAcao}", true);
}
})
->when($params->status, fn ($q) => $q->where('cadastro_material.is_ativo', $params->status))
->when($params->material_id, fn ($q) => $q->where('cadastro_material.id', $params->material_id))
->orderBy('cadastro_material.descricao');
self::setOrderBy($itens);
$itens = $itens->get();
return $itens;
}
public static function create()
{
$params = self::getParams();
return [
'form' => [
'grupos' => self::getGrupos(),
'subgrupos' => self::getSubgrupos($params),
'receita_tipos' => self::getReceitaTipos($params),
'livros' => self::getLivros($params),
'livro_tipos' => self::getLivroTipos($params),
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
],
'model' => [
'grupo_id' => null,
'subgrupo_id' => null,
'receita_tipo_id' => null,
'livro_id' => null,
'livro_tipo_id' => null,
'forma_farmaceutica_id' => null,
'programas_acoes' => [],
'status' => null,
'material' => null,
],
];
}
public static function autocomplete()
{
$params = self::getParams();
return DB::table('cadastro_material')
->select([
'cadastro_material.id',
'cadastro_material.codigo_material',
'cadastro_material.descricao',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'cadastro_unidade_medida'
) . ' AS material_descricao'),
])
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->join('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->when($params->programas_acoes, function ($query) use ($params) {
foreach ($params->programas_acoes as $programaAcao) {
$query->orWhere("cadastro_material.{$programaAcao}", true);
}
})
->when($params->status, fn ($q) => $q->where('cadastro_material.is_ativo', $params->status))
->orderBy('cadastro_material.descricao');
}
public static function list()
{
$params = self::getParams();
switch (request()->listar) {
case 'subgrupos': {
return [
'subgrupos' => self::getSubgrupos($params),
'receita_tipos' => self::getReceitaTipos($params),
'livros' => self::getLivros($params),
'livro_tipos' => self::getLivroTipos($params),
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'receita-tipos': {
return [
'receita_tipos' => self::getReceitaTipos($params),
'livros' => self::getLivros($params),
'livro_tipos' => self::getLivroTipos($params),
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'livros': {
return [
'livros' => self::getLivros($params),
'livro_tipos' => self::getLivroTipos($params),
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'livro-tipos': {
return [
'livro_tipos' => self::getLivroTipos($params),
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'formas-farmaceuticas': {
return [
'formas_farmaceuticas' => self::getFormasFarmaceuticas($params),
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'programas-acoes': {
return [
'programas_acoes' => self::getProgramasAcoes($params),
'status' => self::getStatus($params),
];
}
case 'status': {
return [
'status' => self::getStatus($params),
];
}
}
}
private static function getParams()
{
return (object) [
'grupo_id' => request()->get('grupo_id'),
'subgrupo_id' => request()->get('subgrupo_id'),
'receita_tipo_id' => request()->get('receita_tipo_id'),
'livro_id' => request()->get('livro_id'),
'livro_tipo_id' => request()->get('livro_tipo_id'),
'forma_farmaceutica_id' => request()->get('forma_farmaceutica_id'),
'programas_acoes' => request()->get('programas_acoes'),
'status' => request()->get('status'),
'material_id' => request()->get('material_id'),
];
}
private static function getGrupos()
{
return DB::table('cadastro_grupo')
->select([
'cadastro_grupo.id',
'cadastro_grupo.grupo_tipo_id',
'cadastro_grupo.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->whereColumn('cadastro_material.grupo_id', 'cadastro_grupo.id')
)
->orderBy('cadastro_grupo.nome')
->get();
}
private static function getSubgrupos($params)
{
return DB::table('cadastro_subgrupo')
->select([
'cadastro_subgrupo.id',
'cadastro_subgrupo.nome',
])
->when($params->grupo_id, fn ($q) => $q->where('cadastro_subgrupo.grupo_id', $params->grupo_id))
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->whereColumn('cadastro_material.subgrupo_id', 'cadastro_subgrupo.id')
)
->orderBy('cadastro_subgrupo.nome')
->get();
}
private static function getReceitaTipos($params)
{
return DB::table('cadastro_receita_tipo')
->select([
'cadastro_receita_tipo.id',
'cadastro_receita_tipo.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->whereColumn('cadastro_material.receita_tipo_id', 'cadastro_receita_tipo.id')
)
->orderBy('cadastro_receita_tipo.nome')
->get();
}
private static function getLivros($params)
{
return DB::table('cadastro_livro_registro')
->select([
'cadastro_livro_registro.id',
'cadastro_livro_registro.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->whereColumn('cadastro_material.livro_registro_id', 'cadastro_livro_registro.id')
)
->orderBy('cadastro_livro_registro.nome')
->get();
}
private static function getLivroTipos($params)
{
return DB::table('cadastro_livro_registro_tipo')
->select([
'cadastro_livro_registro_tipo.id',
'cadastro_livro_registro_tipo.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->whereColumn('cadastro_material.livro_registro_tipo_id', 'cadastro_livro_registro_tipo.id')
)
->orderBy('cadastro_livro_registro_tipo.nome')
->get();
}
private static function getFormasFarmaceuticas($params)
{
return DB::table('cadastro_forma_farmaceutica')
->select([
'cadastro_forma_farmaceutica.id',
'cadastro_forma_farmaceutica.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_material')
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->whereColumn('cadastro_material.forma_farmaceutica_id', 'cadastro_forma_farmaceutica.id')
)
->orderBy('cadastro_forma_farmaceutica.nome')
->get();
}
private static function getProgramasAcoes($params)
{
$programasAcoes = collect();
$isAltoCusto = DB::table('cadastro_material')
->where('cadastro_material.is_alto_custo', true)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->exists();
if ($isAltoCusto) {
$programasAcoes->push(['value' => 'is_alto_custo', 'text' => 'Alto custo']);
}
$isProgramaRemedioEmCasa = DB::table('cadastro_material')
->where('cadastro_material.is_programa_remedio_em_casa', true)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->exists();
if ($isProgramaRemedioEmCasa) {
$programasAcoes->push(['value' => 'is_programa_remedio_em_casa', 'text' => 'Programa remédio em casa']);
}
$isAcaoJudicial = DB::table('cadastro_material')
->where('cadastro_material.is_acao_judicial', true)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->exists();
if ($isAcaoJudicial) {
$programasAcoes->push(['value' => 'is_acao_judicial ', 'text' => 'Ação judicial']);
}
$isRemume = DB::table('cadastro_material')
->where('cadastro_material.is_remume', true)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->exists();
if ($isRemume) {
$programasAcoes->push(['value' => 'is_remume', 'text' => 'REMUME']);
}
return $programasAcoes;
}
private static function getStatus($params)
{
$status = collect();
$ativo =DB::table('cadastro_material')
->where('cadastro_material.is_ativo', true)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->when($params->programas_acoes, function ($q) use ($params) {
foreach ($params->programas_acoes as $programaAcao) {
$q->orWhere("cadastro_material.{$programaAcao}", true);
}
})
->exists();
if ($ativo) {
$status->push(['value' => true, 'text' => 'Ativo']);
}
$inativo =DB::table('cadastro_material')
->where('cadastro_material.is_ativo', false)
->when($params->grupo_id, fn ($q) => $q->where('cadastro_material.grupo_id', $params->grupo_id))
->when($params->subgrupo_id, fn ($q) => $q->where('cadastro_material.subgrupo_id', $params->subgrupo_id))
->when($params->receita_tipo_id, fn ($q) => $q->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id))
->when($params->livro_id, fn ($q) => $q->where('cadastro_material.livro_registro_id', $params->livro_id))
->when($params->livro_tipo_id, fn ($q) => $q->where('cadastro_material.livro_registro_tipo_id', $params->livro_tipo_id))
->when($params->forma_farmaceutica_id, fn ($q) => $q->where('cadastro_material.forma_farmaceutica_id', $params->forma_farmaceutica_id))
->when($params->programas_acoes, function ($q) use ($params) {
foreach ($params->programas_acoes as $programaAcao) {
$q->orWhere("cadastro_material.{$programaAcao}", true);
}
})
->exists();
if ($inativo) {
$status->push(['value' => false, 'text' => 'Inativo']);
}
return $status;
}
private static function setOrderBy($builder)
{
$columns = [
'codigo_material' => 'codigo_material',
'material_descricao' => 'material_descricao',
'grupo_nome' => 'grupo_nome',
'subgrupo_nome' => 'subgrupo_nome',
'receita_tipo_nome' => 'receita_tipo_nome',
'livro_nome' => 'livro_nome',
'livro_tipo_nome' => 'livro_tipo_nome',
'forma_farmaceutica_nome' => 'forma_farmaceutica_nome',
'programa_acao' => 'programa_acao',
'status' => 'status',
'possui_lote' => 'possui_lote',
'material_bnafar_codigo' => 'material_bnafar_codigo',
'material_obm_codigo' => 'material_obm_codigo',
];
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));
}
}