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(); } }