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,235 @@
<?php
namespace App\Services\Almoxarifado;
use App\Models\Cadastro\Fabricante\Fabricante;
use App\Models\Cadastro\Fornecedor\Fornecedor;
use App\Models\Cadastro\Material\Material;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class EntradaInicialService extends Service
{
public static function datatable()
{
$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'
)
->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);
});
});
})
->whereNotExists(function ($query) {
$query
->select(DB::raw(1))
->from('almoxarifado_entrada_item')
->join(
'almoxarifado_entrada',
'almoxarifado_entrada.id',
'almoxarifado_entrada_item.entrada_id'
)
->whereColumn('almoxarifado_entrada_item.material_id', 'cadastro_material.id')
->where('almoxarifado_entrada.finalizada', true)
->where('almoxarifado_entrada.centro_custo_id', self::getCurrentCentroCusto()->id);
})
->select(
'cadastro_material.id',
'cadastro_material.codigo_material',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " as descricao"),
'cadastro_material.possui_lote',
'cadastro_material.is_ativo',
'cadastro_grupo.nome AS grupo',
'cadastro_subgrupo.nome AS subgrupo',
DB::raw("IF(cadastro_material.material_bnafar_id IS NULL, 0, 1) as has_vinculo_bnafar")
)
->distinct();
return datatables()
->of($materiais)
->filterColumn('descricao', function ($query, $keyword) {
$query->whereRaw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " like ?", ["%{$keyword}%"]);
})
->skipTotalRecords()
->toJson();
}
public static function store()
{
self::validate();
DB::transaction(function () {
AlmoxarifadoService::saveEntradaInicial(self::getParams());
});
}
public static function list()
{
switch (request()->listar) {
case 'integracao-bnafar-medicamentos':
return self::getIntegracaoBnafarMedicamentos(request()->material_id);
break;
}
}
private static function getParams()
{
return collect(request()->entradas)->map(fn ($entrada) => [
'material_id' => request()->material_id,
'integracao_bnafar_medicamento_id' => $entrada['integracao_bnafar_medicamento_id'],
'quantidade' => $entrada['quantidade'],
'lote' => $entrada['lote'] ? Str::upper($entrada['lote']) : null,
'validade_lote' => $entrada['validade_lote']
? Carbon::createFromFormat('d/m/Y', $entrada['validade_lote']) : null,
'valor_unitario' => $entrada['valor_unitario'],
'valor_total' => $entrada['valor_total'],
'codigo_barras' => $entrada['codigo_barras'],
'fabricante_id' => $entrada['fabricante_id'],
'fornecedor_id' => $entrada['fornecedor_id'],
]);
}
private static function validate()
{
$material = is_null(request()->material_id) ? null : Material::find(request()->material_id);
$possuiLote = $material->possui_lote ?? null;
$hasVinculoBnafar = !is_null($material->material_bnafar_id ?? null);
$rules = [
'material_id' => [
'required',
'integer',
Rule::exists(Material::class, 'id'),
],
'entradas' => [
'required',
'array',
],
'entradas.*.quantidade' => [
'required',
'integer',
'between:1,99999999'
],
'entradas.*.lote' => [
'nullable',
Rule::requiredIf(fn () => $possuiLote),
'string',
'max:15',
],
'entradas.*.validade_lote' => [
'nullable',
Rule::requiredIf(fn () => $possuiLote),
'date_format:d/m/Y',
],
'entradas.*.valor_total' => [
'required',
'numeric',
'min:0.000000',
'max:99999999.999999'
],
'entradas.*.valor_unitario' => [
'required',
'numeric',
'min:0.000000',
'max:99999999.999999'
],
'entradas.*.codigo_barras' => [
'nullable',
'digits:13',
],
'entradas.*.fabricante_id' => [
'nullable',
Rule::requiredIf(fn () => $hasVinculoBnafar),
'integer',
Rule::exists(Fabricante::class, 'id'),
],
'entradas.*.fornecedor_id' => [
'nullable',
'integer',
Rule::exists(Fornecedor::class, 'id'),
],
];
$messages = [];
request()->validate($rules, $messages);
}
private static function getIntegracaoBnafarMedicamentos($materialId)
{
return DB::table('integracao_bnafar_medicamento')
->select([
'integracao_bnafar_medicamento.id',
'integracao_bnafar_medicamento.descricao',
])
->whereExists(function ($query) use ($materialId) {
$query->select(DB::raw(1))
->from('cadastro_material_integracao_bnafar_medicamento')
->where('cadastro_material_integracao_bnafar_medicamento.material_id', $materialId)
->whereColumn('cadastro_material_integracao_bnafar_medicamento.medicamento_id', 'integracao_bnafar_medicamento.id');
})
->get();
}
}