This commit is contained in:
235
api/app/Services/Almoxarifado/EntradaInicialService.php
Normal file
235
api/app/Services/Almoxarifado/EntradaInicialService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user