236 lines
8.9 KiB
PHP
236 lines
8.9 KiB
PHP
<?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();
|
|
}
|
|
}
|