Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Cadastro/Localizacao/LogradouroController.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

276 lines
9.9 KiB
PHP

<?php
namespace App\Http\Controllers\Cadastro\Localizacao;
use App\Http\Controllers\Controller;
use App\Http\Requests\Cadastro\Localizacao\LogradouroRequest;
use App\Models\Cadastro\Localizacao\Bairro;
use App\Models\Cadastro\Localizacao\Logradouro;
use App\Models\Cadastro\Localizacao\LogradouroTipo;
use App\Models\Cns\TermoInvalido;
use App\Models\Intranet\Estado;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class LogradouroController extends Controller
{
protected $modulo = 'cadastro';
protected $funcionalidade = 'logradouro';
public function datatable()
{
$logradouros = DB::table('cadastro_logradouro')
->whereNull('cadastro_logradouro.deleted_at')
->select([
'cadastro_logradouro.id',
'cadastro_estado.uf AS estado_uf',
'cadastro_municipio.nome AS municipio_nome',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_logradouro_tipo.descricao as logradouro_tipo_descricao',
'cadastro_logradouro.nome',
'cadastro_logradouro.cep',
'cadastro_logradouro.tipo_id',
])
->join('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->join('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->join('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->join('cadastro_logradouro_tipo', 'cadastro_logradouro_tipo.id', 'cadastro_logradouro.tipo_id');
return datatables()
->of($logradouros)
->filterColumn('cep', function ($query, $keyword) {
$query
->whereRaw("cadastro_logradouro.cep like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(cadastro_logradouro.cep,1,2),
'.',
SUBSTR(cadastro_logradouro.cep,3,3),
'-',
SUBSTR(cadastro_logradouro.cep,6,3)
) like ?",
["%{$keyword}%"]
);
})
->skipTotalRecords()
->toJson();
}
public function index()
{
$this->auth(__FUNCTION__);
$logradouros = $this->get(Logradouro::class)
->where($this->getWhereFromQueryString(['cep', 'municipio_id']))
->orderBy('nome')
->get();
return response()->json($logradouros, Response::HTTP_OK);
}
public function hasCep($cep)
{
return response()->json(Logradouro::where('cep', $cep)->exists(), Response::HTTP_OK);
}
public function create()
{
$this->auth(__FUNCTION__);
return response()->json(
[
'form' => $this->getFormData()
],
Response::HTTP_OK
);
}
public function store(LogradouroRequest $request)
{
$this->auth(__FUNCTION__);
$logradouro = null;
if (DataUtil::getBooleanValueFromStringBoolean($request->search_by_base_endereco_nacional) === true) {
$tipo = LogradouroTipo::where('descricao', $request->logradouro_tipo_nome)->first();
$bairro = Bairro::where('nome', $request->bairro_nome)->first();
if (is_null($tipo)) {
$tipo = LogradouroTipo::create(['descricao' => $request->logradouro_tipo_nome])->fresh();
}
if (is_null($bairro)) {
$bairro = Bairro::create(['nome' => $request->bairro_nome])->fresh();
}
$logradouro = Logradouro::where('municipio_id', $request->municipio_id)
->where('bairro_id', $bairro->id)
->where('tipo_id', $tipo->id)
->where('nome', $request->logradouro_nome)
->where('cep', $request->logradouro_cep)
->first();
if (is_null($logradouro)) {
$logradouro = Logradouro::create([
'municipio_id' => $request->municipio_id,
'tipo_id' => $tipo->id,
'bairro_id' => $bairro->id,
'nome' => $request->logradouro_nome,
'cep' => $request->logradouro_cep,
])->fresh();
}
} else {
$logradouro = Logradouro::create($this->getParams($request))->fresh();
}
return response()->json($logradouro, Response::HTTP_CREATED);
}
public function show($id)
{
$this->auth(__FUNCTION__);
return response()->json($this->get(Logradouro::class, $id), Response::HTTP_OK);
}
public function edit($id)
{
$this->auth(__FUNCTION__);
$logradouro = Logradouro::findOrFail($id);
return response()->json(
[
'form' => $this->getFormData(),
'model' => [
'tipo_id' => $logradouro->tipo_id,
'bairro' => $logradouro->bairro,
'estado_id' => $logradouro->municipio->estado_id,
'municipio' => $logradouro->municipio,
'cep' => MaskUtil::getCepMasked($logradouro->cep),
'nome' => $logradouro->nome,
],
],
Response::HTTP_OK
);
}
private function getFormData()
{
return [
'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao),
'tipos' => LogradouroTipo::orderBy('descricao')->get()->map(fn ($tipo) => [
'id' => $tipo->id,
'descricao' => $tipo->descricao,
]),
'estados' => Estado::where('pais_id', 1)->orderBy('nome')->get()->map(fn ($estado) => [
'id' => $estado->id,
'uf' => $estado->uf,
]),
];
}
public function update(LogradouroRequest $request, $id)
{
$this->auth(__FUNCTION__);
$logradouro = tap(Logradouro::findOrFail($id))->update($this->getParams($request));
return response()->json($logradouro->fresh(), Response::HTTP_OK);
}
private function getParams($request)
{
return [
'tipo_id' => $request->tipo_id,
'bairro_id' => $request->bairro_id,
'estado_id' => $request->estado_id,
'municipio_id' => $request->municipio_id,
'cep' => $request->cep,
'nome' => mb_strtoupper($request->nome)
];
}
public function destroy($id)
{
$this->auth(__FUNCTION__);
Logradouro::findOrFail($id)->delete();
return response()->json(null, Response::HTTP_NO_CONTENT);
}
public function autocomplete()
{
if (isset(request()->search_by_base_endereco_nacional) && DataUtil::getBooleanValueFromStringBoolean(request()->search_by_base_endereco_nacional) === true) {
$logradouros = DB::table('intranet.cadastro_logradouro')
->select([
'cadastro_estado.uf AS estado_uf',
'cadastro_municipio.nome AS municipio_nome',
'cadastro_bairro.nome AS bairro_nome',
'cadastro_logradouro_tipo.id AS logradouro_tipo_id',
'cadastro_logradouro_tipo.nome AS logradouro_tipo_nome',
'cadastro_logradouro.nome AS logradouro_nome',
DB::raw('COALESCE(cadastro_logradouro.cep, cadastro_municipio.cep) AS logradouro_cep'),
])
->join('intranet.cadastro_logradouro_tipo', 'cadastro_logradouro_tipo.id', 'cadastro_logradouro.tipo_id')
->join('intranet.cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->join('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_bairro.municipio_id')
->join('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->when(request()->municipio_id, fn ($q) => $q->where('cadastro_municipio.id', request()->municipio_id));
} else {
$logradouros = Logradouro::with([]);
if (is_numeric(request()->municipio_id)) {
$logradouros->where('municipio_id', request()->municipio_id);
}
if (is_numeric(request()->cep)) {
$logradouros->where('cep', request()->cep);
}
if (is_numeric(request()->tipo_id)) {
$logradouros->where('tipo_id', request()->tipo_id);
}
if (is_numeric(request()->bairro_id)) {
$logradouros->where('bairro_id', request()->bairro_id);
}
if (request()->with_domicilio) {
$logradouros->whereHas('enderecos', function ($query) {
$query->whereHas('domicilios', function ($query) {
$query->whereHas('cadastroDomiciliar');
});
});
}
}
return datatables()
->of($logradouros)
->filterColumn('cadastro_logradouro.cep', function ($query, $keyword) {
$query
->whereRaw("COALESCE(cadastro_logradouro.cep, cadastro_municipio.cep) like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(COALESCE(cadastro_logradouro.cep, cadastro_municipio.cep),1,2),
'.',
SUBSTR(COALESCE(cadastro_logradouro.cep, cadastro_municipio.cep),3,3),
'-',
SUBSTR(COALESCE(cadastro_logradouro.cep, cadastro_municipio.cep),6,3)
) like ?",
["%{$keyword}%"]
);
})
->toJson();
}
}