Files
rkm-conectasus-ci-sandbox/api/app/Services/Cadastro/Material/MaterialService.php
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

1019 lines
41 KiB
PHP

<?php
namespace App\Services\Cadastro\Material;
use App\Enums\Almoxarifado\RequisicaoRespostaItemMotivo;
use App\Enums\Almoxarifado\RequisicaoRespostaStatus;
use App\Enums\Almoxarifado\RequisicaoStatus;
use App\Enums\Cadastro\Grupo\GrupoTipo;
use App\Enums\Cadastro\Material\LivroRegistroTipo;
use App\Enums\Cadastro\UnidadeMedida;
use App\Enums\Cadastro\Material\IdentificacaoGrupo;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Material\Material;
use App\Services\Almoxarifado\AlmoxarifadoService;
use App\Services\Cadastro\Parametrizacao\ParametrizacaoService;
use App\Services\Service;
use App\Utils\DataUtil;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class MaterialService extends Service
{
public static function getDescricaoCompletaRaw(
$materialAlias,
$apresentacaoAlias,
$apresentacaoUnidadeMedidaAlias
) {
return "CONCAT(
{$materialAlias}.descricao,
' - ',
UPPER({$apresentacaoAlias}.nome),
' ',
CAST({$materialAlias}.quantidade AS INTEGER),
' ',
UPPER(COALESCE({$apresentacaoUnidadeMedidaAlias}.nome, ''))
)";
}
public static function autocomplete()
{
$showAll = DataUtil::getBooleanValueFromStringBoolean(request()->query('show_all')) ?? false;
$loadEntradas = is_null(request()->query('load_entradas')) ? true
: DataUtil::getBooleanValueFromStringBoolean(request()->query('load_entradas'));
$materiais = DB::table('cadastro_material')
->join(
'cadastro_apresentacao',
'cadastro_apresentacao.id',
'cadastro_material.apresentacao_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'cadastro_material.grupo_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_id'
)
->leftJoin(
'cadastro_subgrupo',
'cadastro_subgrupo.id',
'cadastro_material.subgrupo_id'
)
->leftJoin(
'cadastro_via_administracao',
'cadastro_via_administracao.id',
'cadastro_material.via_administracao_id'
)
->leftJoin(
'cadastro_forma_farmaceutica',
'cadastro_forma_farmaceutica.id',
'cadastro_material.forma_farmaceutica_id'
)
->leftJoin(
'cadastro_receita_tipo',
'cadastro_receita_tipo.id',
'cadastro_material.receita_tipo_id'
)
->leftJoin(
'cadastro_material_bnafar',
'cadastro_material_bnafar.id',
'cadastro_material.material_bnafar_id'
)
->when($loadEntradas, function ($query) {
$query->leftJoin('almoxarifado_entrada_item', function ($join) {
$join
->on('almoxarifado_entrada_item.material_id', 'cadastro_material.id')
->whereExists(function ($query) {
$query
->select(DB::raw('1'))
->from('almoxarifado_entrada')
->whereColumn('almoxarifado_entrada.id', 'almoxarifado_entrada_item.entrada_id')
->where('almoxarifado_entrada.finalizada', true)
->where('almoxarifado_entrada.centro_custo_id', self::getCurrentCentroCusto()->id);
});
});
})
->when(!is_null(request()->query('is_exibir_receita')), function ($query) {
$query->where('cadastro_material.is_exibir_receita', true);
})
->when(!$showAll, function ($query) {
$query->where('cadastro_material.is_ativo', true);
})
->when(!is_null(request()->query('possui_lote')), function ($query) {
$query->where(
'cadastro_material.possui_lote',
DataUtil::getBooleanValueFromStringBoolean(request()->query('possui_lote'))
);
})
->when(!is_null(request()->query('not_id')), function ($query) {
$query->whereNotIn('cadastro_material.id', request()->query('not_id'));
})
->when(!is_null(request()->query('grupo_id')), function ($query) {
$query->where('cadastro_grupo.id', request()->query('grupo_id'));
})
->when(!is_null(request()->query('grupo_tipo_id')), function ($query) {
$query->where('cadastro_grupo.grupo_tipo_id', request()->query('grupo_tipo_id'));
})
->when(!is_null(request()->query('subgrupo_id')), function ($query) {
$query->where('cadastro_subgrupo.id', request()->query('subgrupo_id'));
})
->when(DataUtil::isStringTrue(request()->query('is_programa_remedio_em_casa')), function ($query) {
$query->where('cadastro_material.is_programa_remedio_em_casa', true);
})
->when(DataUtil::isStringTrue(request()->query('is_alto_custo')), function ($query) {
$query->where('cadastro_material.is_alto_custo', true);
})
->when(DataUtil::isStringTrue(request()->query('almoxarifado_check_controle_estoque')), function ($query) {
$query->where(function ($query) {
$query->where(function ($query) {
$query
->whereNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_grupo')
->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id')
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id);
});
})->orWhere(function ($query) {
$query
->whereNotNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_subgrupo')
->join(
'almoxarifado_parametrizacao_controle_estoque_grupo',
'almoxarifado_parametrizacao_controle_estoque_grupo.id',
'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id'
)
->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id')
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id);
});
});
});
})
->when(!is_null(request()->query('almoxarifado_check_controle_estoque_centro_custo_id')), function ($query) {
$query->where(function ($query) {
$query->where(function ($query) {
$query
->whereNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_grupo')
->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id')
->where(
'almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id',
request()->query('almoxarifado_check_controle_estoque_centro_custo_id')
);
});
})->orWhere(function ($query) {
$query
->whereNotNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_subgrupo')
->join(
'almoxarifado_parametrizacao_controle_estoque_grupo',
'almoxarifado_parametrizacao_controle_estoque_grupo.id',
'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id'
)
->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id')
->where(
'almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id',
request()->query('almoxarifado_check_controle_estoque_centro_custo_id')
);
});
});
});
})
->when(request()->almoxarifado_check_dispensacao_materiais, function($query) {
$query->where(function($query) {
$query->where(function($query) {
$query->whereExists(function($query) {
$query->select(DB::raw(1))
->from('almoxarifado_parametrizacao_dispensacao')
->whereColumn('almoxarifado_parametrizacao_dispensacao.grupo_id', 'cadastro_material.grupo_id');
});
})->orWhere(function($query) {
$query->whereExists(function($query) {
$query->select(DB::raw(1))
->from('almoxarifado_parametrizacao_dispensacao')
->whereColumn('almoxarifado_parametrizacao_dispensacao.material_id', 'cadastro_material.id');
});
});
})->whereExists(function($query) {
$query->select(DB::raw(1))
->from('almoxarifado_parametrizacao_dispensacao_unidade')
->where('almoxarifado_parametrizacao_dispensacao_unidade.centro_custo_id', self::getCurrentCentroCusto()->id);
});
})
->when(!is_null(request()->query('allowed_to_request_to_centro_custo_id')), function ($query) {
$query->whereExists(function ($query) {
$centroCustoId = request()->query('allowed_to_request_to_centro_custo_id');
$query->select(DB::raw(1))
->from('almoxarifado_requisicao_permissao')
->whereColumn('almoxarifado_requisicao_permissao.material_id', 'cadastro_material.id')
->where('almoxarifado_requisicao_permissao.centro_custo_requisitante_id', self::getCurrentCentroCusto()->id)
->where('almoxarifado_requisicao_permissao.created_centro_custo_id', $centroCustoId);
});
})
->when(!is_null(request()->query('with_estoque_greater_than_zero_to_centro_custo_id')), function ($query) {
$centroCustoId = request()->query('with_estoque_greater_than_zero_to_centro_custo_id');
$query->whereRaw("COALESCE((
SELECT SUM(
COALESCE(almoxarifado_entrada_item.quantidade, 0)
-
COALESCE((
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
FROM almoxarifado_saida_item_entrada_item
JOIN almoxarifado_saida_item
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
JOIN almoxarifado_saida
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
AND almoxarifado_saida.finalizada = 1
), 0)
-
COALESCE((
SELECT SUM(almoxarifado_reserva_item_entrada_item.quantidade_saida)
FROM almoxarifado_reserva_item_entrada_item
JOIN almoxarifado_reserva_item
ON almoxarifado_reserva_item.id = almoxarifado_reserva_item_entrada_item.reserva_item_id
WHERE almoxarifado_reserva_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
), 0)
)
FROM almoxarifado_entrada_item
JOIN almoxarifado_entrada
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
WHERE almoxarifado_entrada.finalizada = 1
AND almoxarifado_entrada_item.material_id = cadastro_material.id
AND almoxarifado_entrada.centro_custo_id = {$centroCustoId}
), 0) > 0");
})
->when(!is_null(request()->query('somente_material')), function ($query) {
$query->where('cadastro_grupo.grupo_tipo_id', GrupoTipo::MATERIAL);
})
->whereNull('cadastro_material.deleted_at')
->when(!is_null(request()->query('visualizar_remume')) && DataUtil::isStringTrue(request()->query('visualizar_remume')), function ($query) {
$query->where('cadastro_material.is_remume', true);
})
->orderBy('cadastro_material.descricao')
->select(
'cadastro_material.id',
'cadastro_material.codigo_material',
'cadastro_material.prescricao_unidade_medida_id',
'cadastro_material.descricao',
'cadastro_material.receita_tipo_id',
'cadastro_receita_tipo.nome as receita_tipo',
'cadastro_grupo.grupo_tipo_id',
'cadastro_grupo.nome AS grupo',
'cadastro_subgrupo.nome AS subgrupo',
DB::raw('UPPER(cadastro_apresentacao.nome) as apresentacao_nome'),
DB::raw('UPPER(cadastro_apresentacao.sigla) as apresentacao_sigla'),
DB::raw('CAST(cadastro_material.quantidade AS INTEGER) as quantidade'),
DB::raw('UPPER(apresentacao_unidade_medida.nome) as apresentacao_unidade_medida_nome'),
DB::raw('UPPER(apresentacao_unidade_medida.id) as apresentacao_unidade_medida_id'),
DB::raw('UPPER(apresentacao_unidade_medida.sigla) as apresentacao_unidade_medida_sigla'),
'cadastro_material.possui_lote',
'cadastro_material.is_ativo',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS descricao_completa"),
DB::raw('cadastro_via_administracao.nome as via_administracao'),
DB::raw('cadastro_forma_farmaceutica.nome as forma_farmaceutica'),
DB::raw("IF(cadastro_material.material_bnafar_id IS NULL, 0, 1) as has_vinculo_bnafar"),
DB::raw("CASE WHEN cadastro_material.is_alto_custo = 0 THEN '' ELSE 'ALTO CUSTO' END AS alto_custo"),
DB::raw("CASE WHEN cadastro_material.is_programa_remedio_em_casa = 0 THEN '' ELSE 'PROGRAMA REMÉDIO EM CASA' END AS programa_remedio_em_casa"),
DB::raw("CASE WHEN cadastro_material.is_acao_judicial = 0 THEN '' ELSE 'AÇÃO JUDICIAL' END AS acao_judicial"),
DB::raw("CASE WHEN cadastro_material.is_remume = 0 THEN '' ELSE 'REMUME' END AS remume"),
'cadastro_material_bnafar.id AS material_bnafar_id',
'cadastro_material_bnafar.codigo AS material_bnafar_codigo',
'cadastro_material_bnafar.descricao AS material_bnafar_descricao',
'cadastro_material_bnafar.tipo AS material_bnafar_tipo',
)
->when($loadEntradas, function ($query) {
$query->addSelect(DB::raw("IF(almoxarifado_entrada_item.id IS NULL, 0, 1) AS has_entradas"));
});
if (!is_null(request()->query('with_requisicao_que_nao_concluiu_entrega_from_centro_custo_id'))) {
$materiais->addSelect([
'requisicao_que_nao_concluiu_entrega' => function ($query) {
$centroCustoId = request()->query('with_requisicao_que_nao_concluiu_entrega_from_centro_custo_id');
$query->select('almoxarifado_requisicao.numero')
->from('almoxarifado_requisicao_item')
->join(
'almoxarifado_requisicao',
'almoxarifado_requisicao.id',
'almoxarifado_requisicao_item.requisicao_id',
)
->whereColumn('almoxarifado_requisicao_item.material_id', 'cadastro_material.id')
->where('almoxarifado_requisicao.centro_custo_id', $centroCustoId)
->where('almoxarifado_requisicao.created_centro_custo_id', self::getCurrentCentroCusto()->id)
->whereIn('almoxarifado_requisicao.status_id', [
RequisicaoStatus::ABERTA,
RequisicaoStatus::RESPOSTA_INICIADA,
])
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('almoxarifado_requisicao_resposta_item')
->join(
'almoxarifado_requisicao_resposta',
'almoxarifado_requisicao_resposta.id',
'almoxarifado_requisicao_resposta_item.requisicao_resposta_id',
)
->whereColumn(
'almoxarifado_requisicao_resposta_item.requisicao_item_id',
'almoxarifado_requisicao_item.id'
)
->where(
'almoxarifado_requisicao_resposta.status_id',
RequisicaoRespostaStatus::RECEBIDA
)
->where(function ($query) {
$query
->whereNull('almoxarifado_requisicao_resposta_item.motivo_id')
->orWhereNotIn('almoxarifado_requisicao_resposta_item.motivo_id', [
RequisicaoRespostaItemMotivo::ENTREGA_PARCIAL,
RequisicaoRespostaItemMotivo::PENDENTE_DE_ENTREGA,
]);
});
});
}
]);
}
if ($loadEntradas) {
$materiais = $materiais->distinct();
}
return $materiais;
}
public static function datatable()
{
$materiais = DB::table('cadastro_material')
->select(
'cadastro_material.id',
'cadastro_material.codigo_material',
'cadastro_material.descricao',
DB::raw("CONCAT(
UPPER(cadastro_apresentacao.nome),
' ',
CAST(cadastro_material.quantidade AS INTEGER),
' ',
UPPER(COALESCE(apresentacao_unidade_medida.nome, ''))
) AS apresentacao"),
'cadastro_grupo.nome AS grupo',
'cadastro_subgrupo.nome AS subgrupo',
)
->join(
'cadastro_apresentacao',
'cadastro_apresentacao.id',
'cadastro_material.apresentacao_id',
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'cadastro_material.grupo_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_id'
)
->leftJoin(
'cadastro_subgrupo',
'cadastro_subgrupo.id',
'cadastro_material.subgrupo_id'
)
->leftJoin(
'cadastro_material_bnafar',
'cadastro_material_bnafar.id',
'cadastro_material.material_bnafar_id'
)
->whereNull('cadastro_material.deleted_at')
->where(function ($query) {
$query->where(function ($query) {
$query
->whereNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_grupo')
->whereColumn('almoxarifado_parametrizacao_controle_estoque_grupo.grupo_id', 'cadastro_material.grupo_id')
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id);
});
})->orWhere(function ($query) {
$query
->whereNotNull('cadastro_material.subgrupo_id')
->whereExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_parametrizacao_controle_estoque_subgrupo')
->join(
'almoxarifado_parametrizacao_controle_estoque_grupo',
'almoxarifado_parametrizacao_controle_estoque_grupo.id',
'almoxarifado_parametrizacao_controle_estoque_subgrupo.parametrizacao_controle_estoque_grupo_id'
)
->whereColumn('almoxarifado_parametrizacao_controle_estoque_subgrupo.subgrupo_id', 'cadastro_material.subgrupo_id')
->where('almoxarifado_parametrizacao_controle_estoque_grupo.centro_custo_id', self::getCurrentCentroCusto()->id);
});
});
})
->when(DataUtil::isStringBoolean(request()->query('is_programa_remedio_em_casa')), function ($query) {
$isProgramaRemedioEmCasa = DataUtil::getBooleanValueFromStringBoolean(request()->query('is_programa_remedio_em_casa'));
if ($isProgramaRemedioEmCasa) {
$query->where('cadastro_material.is_programa_remedio_em_casa', $isProgramaRemedioEmCasa);
}
});
return $materiais;
}
public static function getEstoque($materialId, $centroCustoId = null)
{
$material = Material::with('grupo')->findOrFail($materialId);
$materialId = $material->id;
if (!is_null($centroCustoId)) {
$centroCustoId = CentroCusto::findOrFail($centroCustoId)->id;
}
$estoque = AlmoxarifadoService::getEstoque($materialId, $centroCustoId);
$possuiEntradaComLote = !is_null(collect($estoque['por_entrada'])
->whereNotNull('lote')
->first());
$programa = collect([]);
if($material->grupo->grupo_tipo_id === GrupoTipo::MEDICAMENTO) {
if($material->is_programa_remedio_em_casa) $programa->push("Programa remédio em casa");
if($material->is_alto_custo) $programa->push("Alto custo");
if($material->is_acao_judicial) $programa->push("Ação judicial");
if($material->is_remume) $programa->push("REMUME");
}
$material->programa = $programa->isNotEmpty() ? implode(', ', $programa->toArray()) : '-';
return [
'total' => $estoque['total'],
'por_entrada' => $estoque['por_entrada'],
'possui_entrada_com_lote' => $possuiEntradaComLote,
'programa' => $material->programa
];
}
public static function create()
{
$material = new Material;
$material->fill(array_fill_keys($material->getFillable(), null));
$material->is_ativo = 1;
$material->is_exibir_receita = false;
$material->is_exibir_prescricao_interna = false;
$material->is_alto_custo = false;
$material->is_programa_remedio_em_casa = false;
$material->is_acao_judicial = false;
$material->is_remume = false;
$material->material_bnafar = null;
$material->possui_lote = false;
$material->integracao_bnafar_medicamentos = [];
return [
'additionals' => self::getAdditionals(),
'form' => self::getFormData(),
'model' => $material->makeHidden(['id'])
];
}
public static function store()
{
self::validate();
$material = null;
DB::transaction(function() use (&$material) {
$parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial();
if (!is_null($parametrizacaoMaterial) && $parametrizacaoMaterial->gera_codigo_automatico) {
if (is_null(request()->get('codigo_material'))) {
$codigoMaterial = Material::max('codigo_material');
request()['codigo_material'] = (int) $codigoMaterial + 1;
}
}
$material = Material::create(request()->all());
$material->integracaoBnafarMedicamentos()->sync(self::getMedicamentosIds(request()->integracao_bnafar_medicamentos));
$material = $material->fresh();
});
return $material;
}
public static function edit($id)
{
$material = Material::with('materialBnafar')->findOrFail($id);
$material->material_bnafar = null;
$material->integracao_bnafar_medicamentos = DB::table('cadastro_material_integracao_bnafar_medicamento')
->select([
'integracao_bnafar_medicamento.id AS medicamento_id',
'integracao_bnafar_medicamento.codigo AS medicamento_codigo',
'integracao_bnafar_medicamento.descricao AS medicamento_descricao',
])
->join('integracao_bnafar_medicamento', 'integracao_bnafar_medicamento.id', 'cadastro_material_integracao_bnafar_medicamento.medicamento_id')
->where('material_id', $material->id)
->get();
return [
'additionals' => self::getAdditionals(),
'form' => self::getFormData($material),
'model' => $material->makeHidden(['id'])
];
}
private static function getAdditionals()
{
$parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial();
return [
'gera_codigo_automatico' => $parametrizacaoMaterial->gera_codigo_automatico ?? false,
];
}
private static function getFormData($material = null)
{
return [
'apresentacoes' => self::getApresentacoes(),
'apresentacao_unidades_medida' => self::getApresentacaoUnidadesMedida(),
'unidades_medida' => self::getUnidadesMedida(),
'grupos' => self::getGrupos(),
'subgrupos' => self::getSubgrupos(),
'receita_tipos' => self::getReceitaTipos(),
'livros_registro' => self::getLivrosRegistro(),
'livro_registro_tipos' => self::getLivroRegistroTipos(),
'formas_farmaceutica' => self::getFormasFarmaceutica(),
'vias_administracao' => self::getViasAdministracao(),
'has_vinculo_livro' => is_null($material) ? false : $material->farmaciaLivroPagina()->exists(),
];
}
private static function getApresentacoes()
{
return DB::table('cadastro_apresentacao')
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getApresentacaoUnidadesMedida()
{
return DB::table('cadastro_unidade_medida')
->whereIn('id', [
UnidadeMedida::MILIGRAMAS,
UnidadeMedida::GRAMAS,
UnidadeMedida::QUILOGRAMAS,
UnidadeMedida::CENTIMETROS,
UnidadeMedida::METROS,
UnidadeMedida::UNIDADES,
UnidadeMedida::NAO_DEFINIDO,
UnidadeMedida::LITROS,
UnidadeMedida::MILILITROS,
UnidadeMedida::UNIDADES_INTERNACIONAIS,
UnidadeMedida::MICROGRAMAS,
UnidadeMedida::DOSE,
UnidadeMedida::COMPRIMIDO,
UnidadeMedida::FRASCO,
UnidadeMedida::AMPOLA,
UnidadeMedida::ADESIVO,
UnidadeMedida::ANEL,
UnidadeMedida::APLICACAO,
UnidadeMedida::BARRA,
UnidadeMedida::BASTAO,
UnidadeMedida::BISNAGA,
UnidadeMedida::BLISTER,
UnidadeMedida::BOLSA,
UnidadeMedida::CAIXA,
UnidadeMedida::CAPSULA,
UnidadeMedida::CAPSULA_INALANTE,
UnidadeMedida::CARPULE,
UnidadeMedida::CARTAO,
UnidadeMedida::CARTELA,
UnidadeMedida::DRAGEA,
UnidadeMedida::EMPLASTRO,
UnidadeMedida::ENVELOPE,
UnidadeMedida::FLACONETE,
UnidadeMedida::FRASCO_AMPOLA,
UnidadeMedida::GLOBULO,
UnidadeMedida::LATA,
UnidadeMedida::OVULO,
UnidadeMedida::PASTILHA,
UnidadeMedida::PILULA,
UnidadeMedida::POTE,
UnidadeMedida::SACHE,
UnidadeMedida::SERINGA,
UnidadeMedida::SUPOSITORIO,
UnidadeMedida::TABLETE,
UnidadeMedida::TUBETE,
UnidadeMedida::TUBO,
UnidadeMedida::GOTAS,
])
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getUnidadesMedida()
{
return DB::table('cadastro_unidade_medida')
->whereIn('id', [
UnidadeMedida::MILIGRAMAS,
UnidadeMedida::GRAMAS,
UnidadeMedida::QUILOGRAMAS,
UnidadeMedida::PORCENTAGEM,
UnidadeMedida::NAO_DEFINIDO,
UnidadeMedida::LITROS,
UnidadeMedida::MILILITROS,
UnidadeMedida::MICROGRAMAS,
UnidadeMedida::DOSE,
UnidadeMedida::COMPRIMIDO,
])
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getGrupos()
{
return DB::table('cadastro_grupo')
->select(
'id',
'nome',
'grupo_tipo_id'
)
->whereIn('cadastro_grupo.grupo_tipo_id', [IdentificacaoGrupo::ID_GRUPO_MATERIAL, IdentificacaoGrupo::ID_GRUPO_MEDICAMENTOS])
->whereNull('deleted_at')
->orWhere(function ($query) {
$query->whereNull('deleted_at')
->whereNull('cadastro_grupo.grupo_tipo_id');
})
->orderBy('nome')
->get();
}
private static function getSubgrupos()
{
return DB::table('cadastro_subgrupo')
->select(
'id',
'nome',
'grupo_id'
)
->whereNull('deleted_at')
->orderBy('nome')
->get();
}
private static function getReceitaTipos()
{
return DB::table('cadastro_receita_tipo')
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getLivrosRegistro()
{
return DB::table('cadastro_livro_registro')
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getLivroRegistroTipos()
{
return DB::table('cadastro_livro_registro_tipo')
->select(
'id',
'nome'
)
->whereNotIn('id', [
LivroRegistroTipo::A_BASE,
LivroRegistroTipo::ESPECIFICO,
])
->orderBy('nome')
->get();
}
private static function getFormasFarmaceutica()
{
return DB::table('cadastro_forma_farmaceutica')
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
private static function getViasAdministracao()
{
return DB::table('cadastro_via_administracao')
->select(
'id',
'nome'
)
->orderBy('nome')
->get();
}
public static function update($id)
{
self::validate();
$material = null;
DB::transaction(function() use ($id, &$material) {
$parametrizacaoMaterial = ParametrizacaoService::getParametrizacaoMaterial();
if (!is_null($parametrizacaoMaterial) && $parametrizacaoMaterial->gera_codigo_automatico) {
if (is_null(request()->get('codigo_material'))) {
$codigoMaterial = DB::table('cadastro_material')->select(DB::raw('MAX(CAST(codigo_material AS INTEGER)) AS codigo_material'))->first()->codigo_material ?? 0;
request()['codigo_material'] = (int) $codigoMaterial + 1;
}
}
$material = tap(Material::findOrFail($id))->update(request()->all());
$material->integracaoBnafarMedicamentos()->sync(self::getMedicamentosIds(request()->integracao_bnafar_medicamentos));
$material = $material->fresh();
});
return $material;
}
public static function validate()
{
$params = request()->all();
$rules = [
'codigo_material' => [
'nullable',
'string',
'max:10',
'unique:\App\Models\Cadastro\Material\Material,codigo_material,
'.(request()->route('material') ?? null).',id,deleted_at,null'
],
'descricao' => [
'required',
'string',
'between:3,100',
Rule::unique(Material::class, 'descricao')
->ignore(request()->route('material'))
->whereNull('deleted_at'),
],
'grupo_id' => [
'required',
'integer'
],
'subgrupo_id' => [
'nullable',
'integer'
],
'apresentacao_id' => [
'required',
'integer'
],
'quantidade' => [
'required',
'numeric',
],
'apresentacao_unidade_medida_id' => [
'required',
'integer'
],
'possui_lote' => [
'required',
'boolean'
],
'is_ativo' => [
'required',
'boolean'
],
'receita_tipo_id' => [
'nullable',
'integer',
Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])),
],
'livro_registro_id' => [
'nullable',
'integer'
],
'livro_registro_tipo_id' => [
'nullable',
'integer'
],
'forma_farmaceutica_id' => [
'nullable',
'integer',
Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])),
],
'via_administracao_id' => [
'nullable',
'integer',
Rule::requiredIf(fn () => DataUtil::isStringTrue($params['is_medicamento'])),
],
'exibir_receita' => [
'nullable',
'boolean'
],
'exibir_prescricao_interna' => [
'nullable',
'boolean'
],
'alto_custo' => [
'nullable',
'boolean'
],
'programa_remedio_em_casa' => [
'nullable',
'boolean'
],
'acao_judicial' => [
'nullable',
'boolean'
],
'remume' => [
'nullable',
'boolean'
],
'quantidade_gotas_ml' => [
'nullable',
'numeric',
'max:999.999'
]
];
$messages = [
'descricao.unique' => 'A descrição já foi inserida anteriormente.',
'codigo_material.unique' => 'O código do material já foi inserido anteriormente.',
];
request()->validate($rules, $messages);
}
public static function validateMaterialBnafar()
{
$rules = [
'material_bnafar_id' => [
'required',
'integer',
],
];
request()->validate($rules);
}
public static function validateIntegracaoBnafarMedicamentos()
{
$rules = [
'.*' => [
'required',
'integer',
],
];
request()->validate($rules);
}
public static function destroy($id)
{
Material::findOrFail($id)->delete();
return null;
}
private static function getMedicamentosIds($medicamentos)
{
$ids = [];
foreach ($medicamentos as $value) {
$ids[] = $value['medicamento_id'];
}
return $ids;
}
public static function editMaterialBnafar($materialId)
{
$material = Material::with('materialBnafar')->findOrFail($materialId);
return [
'id' => $material->materialBnafar->id ?? null,
'codigo' => $material->materialBnafar->codigo ?? null,
'descricao' => $material->materialBnafar->descricao ?? null,
'tipo' => $material->materialBnafar->tipo ?? null,
];
}
public static function updateMaterialBnafar($materialId)
{
self::validateMaterialBnafar();
$material = Material::findOrFail($materialId);
$material->material_bnafar_id = request()->material_bnafar_id;
$material->save();
return $material->fresh()->materialBnafar;
}
public static function storeIntegracaoBnafarMedicamentos($materialId)
{
$material = Material::findOrFail($materialId);
self::validateIntegracaoBnafarMedicamentos();
DB::transaction(function() use ($material) {
$material->integracaoBnafarMedicamentos()->sync(request()->all());
});
$material = $material->fresh();
return $material;
}
}