Commit ea264ef7 authored by sandroresende's avatar sandroresende

correcao validacao cpf e cnpj e envio email

parent e0140982
......@@ -31,11 +31,13 @@ REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_HOST=cas-mi.integracao.gov.br
MAIL_PORT=25
MAIL_USERNAME=cadastramento.mcid@mdr.gov.br
MAIL_PASSWORD=mdr@2023
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=cadastramento.mcid@mdr.gov.br
MAIL_FROM_NAME="Sistema de Gerenciamento do Cidades - SE"
PUSHER_APP_ID=
PUSHER_APP_KEY=
......@@ -44,3 +46,5 @@ PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
FILESYSTEM_DRIVER=arquivos
/vendor
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
/.vscode
/.vagrant
......@@ -9,4 +10,4 @@ Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
......@@ -7,11 +7,18 @@ use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Mail;
use DB;
use App\Http\Requests\RegistroUsuario;
use App\User;
use App\EntePublico;
use App\Mail\NovoUsuarioEntePublico;
use App\Permissoes;
use App\Propostas\CronogramaSelecao;
use App\Propostas\Selecao;
use App\Propostas\Propostas;
......@@ -35,9 +42,9 @@ class EntePublicoController extends Controller
* @return \Illuminate\Http\Response
*/
public function salvarEntePublico(Request $request)
public function salvarEntePublico(RegistroUsuario $request)
{
// return $request->all();
//return $request->all();
DB::beginTransaction();
......@@ -47,7 +54,7 @@ class EntePublicoController extends Controller
$usuario->email = $request->email;
$usuario->modalidade_participacao_id = $request->modalidade_participacao;
$usuario->tipo_usuario_id = 9;
$usuario->modulo_sistema_id = 1;
$usuario->modulo_sistema_id = 2;
$usuario->ente_publico_id = $request->txt_cnpj;
$usuario->status_usuario_id = 2;
$usuario->password = bcrypt('123456');
......@@ -66,8 +73,22 @@ class EntePublicoController extends Controller
$entePublico->created_at = Date("Y-m-d h:i:s");
$salvoComSucessoEnte = $entePublico->save();
if ($salvoComSucesso || $salvoComSucessoEnte){
$permissoes = new Permissoes;
$permissoes->user_id = $usuario->id;
$permissoes->modulo_sistema_id = 2;
$permissoes->status_permissao_id = 1;
$permissoes->bln_analisada = false;
$salvoComSucessoPermissoes = $permissoes->save();
$usuario->load('tipoUsuario', 'statusUsuario','entePublico.municipio.uf');
if ($salvoComSucesso || $salvoComSucessoEnte || $salvoComSucessoPermissoes){
flash()->sucesso("Sucesso", "Usuário cadastrado com sucesso!");
DB::commit();
Mail::to('sandro.resende@mdr.gov.br')->send(new NovoUsuarioEntePublico($usuario, $permissoes));
return redirect('/entePublico/propostas/'.$usuario->txt_cpf_usuario . '/' . $usuario->ente_publico_id);
} else {
flash()->erro("Erro", "Não foi possível cadastrar os dados do usuário.");
......
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RegistroUsuario extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'estado' => 'required',
'municipio' => 'required',
'txt_cnpj' => 'required|cnpj',
'txt_nome_proponente' => 'required|max:255',
'txt_email_ente_publico' => 'required|email|max:255',
'cargo_executivo' => 'required',
'txt_nome_chefe_executivo' => 'required|max:255',
'txt_nome' => 'required|max:255',
'txt_sobrenome' => 'required|max:255',
'txt_cpf_usuario' => 'required|cpf',
'txt_cargo' => 'required|max:255',
'txt_ddd' => 'required|max:255',
'txt_telefone' => 'required|max:255',
'txt_ddd_movel' => 'required|max:255',
'txt_celular' => 'required|max:255',
'email' => 'required|email|max:255',
];
}
public function messages()
{
return [
'estado.required' => 'O campo estado é obrigatório',
'municipio.required' => 'O campo município é obrigatório',
'txt_cnpj.required' => 'O campo cnpj é obrigatório.',
'txt_cnpj.cnpj' =>'O cnpj está inválido.',
'txt_nome_proponente.required' => 'O campo nome do proppnente é obrigatório',
'txt_nome_proponente.max' => 'Utilize até 255 caracteres',
'txt_email_ente_publico.required' => 'O campo email é obrigatório',
'txt_email_ente_publico.email' => 'Não é um email válido',
'txt_email_ente_publico.max' => 'Utilize até 255 caracteres',
'txt_email_ente_publico.unique' => 'O email já está cadastrado no Sistema',
'cargo_executivo.required' => 'O campo cargo do executivo é obrigatório',
'txt_nome_chefe_executivo.required' => 'O campo nome do chefe do executivo é obrigatório',
'txt_nome_chefe_executivo.max' => 'Utilize até 255 caracteres',
'txt_nome.required' => 'O campo nome é obrigatório',
'txt_nome.max' => 'Utilize até 255 caracteres',
'txt_sobrenome.required' => 'O campo sobrenome é obrigatório',
'txt_sobrenome.max' => 'Utilize até 255 caracteres',
'txt_cpf_usuario.required' => 'O campo cpf é obrigatório.',
'txt_cpf_usuario.cpf' =>'O cpf está inválido.',
'txt_cpf_usuario.unique' =>'O cpf já está em uso.',
'txt_cargo.required' => 'O campo cargo é obrigatório',
'txt_cargo.max' => 'Utilize até 255 caracteres',
'txt_ddd.required' => 'O campo ddd é obrigatório',
'txt_ddd.max' => 'Utilize até 255 caracteres',
'txt_telefone.required' => 'O campo telefone é obrigatório',
'txt_telefone.max' => 'Utilize até 255 caracteres',
'txt_ddd_movel.required' => 'O campo ddd é obrigatório',
'txt_ddd_movel.max' => 'Utilize até 255 caracteres',
'txt_celular.required' => 'O campo celular é obrigatório',
'txt_celular.max' => 'Utilize até 255 caracteres',
'email.required' => 'O campo email é obrigatório',
'email.email' => 'Não é um email válido',
'email.max' => 'Utilize até 255 caracteres',
'email.unique' => 'O email já está cadastrado no SISHAB',
];
}
}
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class NovoUsuarioEntePublico extends Mailable
{
use Queueable, SerializesModels;
public $url;
public $usuario;
public $permissao;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($usuario, $permissao)
{
$this->url = url('admin/modulo_sistema/permissoes');
$this->usuario = $usuario;
$this->permissao = $permissao;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.modulo_sistema.novo_usuario_ente_publico');
}
}
<?php
namespace App;
use App\Tab_dominios\StatusPermissao;
use App\Tab_dominios\TipoIndeferimento;
use App\User;
use Illuminate\Database\Eloquent\Model;
class Permissoes extends Model
{
protected $connection = 'pgsql_corp';
protected $table = 'mcid_sistema_se.tab_permissoes';
public function user()
{
return $this->belongsTo(User::class); //possui muitos
}
public function userAnalisado()
{
return $this->belongsTo(User::class,'usuario_id_analise'); //possui muitos
}
public function tipoIndeferimento()
{
return $this->belongsTo(TipoIndeferimento::class); //possui muitos
}
public function statusPermissao()
{
return $this->belongsTo(StatusPermissao::class); //possui muitos
}
//public $timestamps = false; // tabela não possui coluna de data de criação/atualização
}
......@@ -3,6 +3,8 @@
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
......@@ -13,7 +15,207 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
//
//////////////inicio validador de CPF///////////////////////
Validator::extend('cpf', function ($attribute, $value, $parameters, $validator) {
/*
* Salva em $cpf apenas numeros, isso permite receber o cpf em diferentes formatos,
* como "000.000.000-00", "00000000000", "000 000 000 00"
*/
$cpf = preg_replace('/\D/', '', $value);
$num = array();
/* Cria um array com os valores */
for($i=0; $i<(strlen($cpf)); $i++) {
$num[]=$cpf[$i];
}
if(count($num)!=11) {
return false;
}else{
for($i=0; $i<10; $i++)
{
if ($num[0]==$i && $num[1]==$i && $num[2]==$i
&& $num[3]==$i && $num[4]==$i && $num[5]==$i
&& $num[6]==$i && $num[7]==$i && $num[8]==$i)
{
return false;
break;
}
}
}
$j=10;
for($i=0; $i<9; $i++)
{
$multiplica[$i] = $num[$i] * $j;
$j--;
}
$soma = array_sum($multiplica);
$resto = $soma%11;
if($resto<2)
{
$dg=0;
}
else
{
$dg=11-$resto;
}
if($dg!=$num[9])
{
return false;
}
/*
Calcula e compara o
segundo dígito verificador.
*/
$j=11;
for($i=0; $i<10; $i++)
{
$multiplica[$i]=$num[$i] * $j;
$j--;
}
$soma = array_sum($multiplica);
$resto = $soma % 11;
if($resto<2)
{
$dg=0;
}
else
{
$dg = 11 - $resto;
}
if( $dg!=$num[10] )
{
return false;
}
else
{
return true;
}
});
//////////////fim validador de CPF///////////////////////
//////////////inicio validador de CNPJ///////////////////////
Validator::extend('cnpj', function ($attribute, $value, $parameters, $validator) {
/*
Etapa 1: Cria um array com apenas os digitos numéricos,
isso permite receber o cnpj em diferentes
formatos como "00.000.000/0000-00", "00000000000000", "00 000 000 0000 00"
etc...
*/
$cnpj = preg_replace('/\D/', '', $value);
$num = array();
/* Cria um array com os valores */
for($i=0; $i<(strlen($cnpj)); $i++) {
$num[]=$cnpj[$i];
}
//Etapa 2: Conta os dígitos, um Cnpj válido possui 14 dígitos numéricos.
if(count($num)!=14)
{
return false;
}
/*
Etapa 3: O número 00000000000 embora não seja um cnpj real resultaria
um cnpj válido após o calculo dos dígitos verificares
e por isso precisa ser filtradas nesta etapa.
*/
if ($num[0]==0 && $num[1]==0 && $num[2]==0
&& $num[3]==0 && $num[4]==0 && $num[5]==0
&& $num[6]==0 && $num[7]==0 && $num[8]==0
&& $num[9]==0 && $num[10]==0 && $num[11]==0)
{
return false;
}
//Etapa 4: Calcula e compara o primeiro dígito verificador.
else
{
$j=5;
for($i=0; $i<4; $i++)
{
$multiplica[$i]=$num[$i]*$j;
$j--;
}
$soma = array_sum($multiplica);
$j=9;
for($i=4; $i<12; $i++)
{
$multiplica[$i]=$num[$i]*$j;
$j--;
}
$soma = array_sum($multiplica);
$resto = $soma%11;
if($resto<2)
{
$dg=0;
}
else
{
$dg=11-$resto;
}
if($dg!=$num[12])
{
return false;
}
}
//Etapa 5: Calcula e compara o segundo dígito verificador.
$j=6;
for($i=0; $i<5; $i++)
{
$multiplica[$i]=$num[$i]*$j;
$j--;
}
$soma = array_sum($multiplica);
$j=9;
for($i=5; $i<13; $i++)
{
$multiplica[$i]=$num[$i]*$j;
$j--;
}
$soma = array_sum($multiplica);
$resto = $soma%11;
if($resto<2)
{
$dg=0;
}
else
{
$dg=11-$resto;
}
if($dg!=$num[13])
{
return false;
}
else
{
return true;
}
});
//////////////FIM validador de CNPJ///////////////////////
//validar email diferentes form termo adesao parcerias
Validator::extend('validar_emails_diferentes', function($attribute, $value, $parameters, $validator) {
$emailUsuario = $parameters[0];
$emailEnte = $parameters[1];
$itens = $validator->getData();
// dd('.' . $itens[$emailUsuario] .'=='. $itens[$emailEnte]);
if($itens[$emailUsuario] == $itens[$emailEnte]){
return false;
}else{
return true;
}
});
}
/**
......
......@@ -3,6 +3,7 @@
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
......@@ -25,6 +26,8 @@ class AuthServiceProvider extends ServiceProvider
{
$this->registerPolicies();
//
}
}
......@@ -6,7 +6,9 @@ use Illuminate\Database\Eloquent\Model;
class ModalidadeParticipacao extends Model
{
protected $table = 'opc_modalidade_participacao';
protected $connection = 'pgsql_corp';
protected $table = 'mcid_sistema_se.opc_modalidade_participacao';
public $timestamps = false; // tabela não possui coluna de data de criação/atualização
......
......@@ -6,9 +6,9 @@ use Illuminate\Database\Eloquent\Model;
class ModuloSistema extends Model
{
protected $connection = 'pgsql';
protected $connection = 'pgsql_corp';
protected $table = 'opc_modulo_sistema';
protected $table = 'mcid_sistema_se.opc_modulo_sistema';
public $timestamps = false; // tabela não possui coluna de data de criação/atualização
......
<?php
namespace App\Tab_dominios;;
use Illuminate\Database\Eloquent\Model;
class StatusPermissao extends Model
{
protected $connection = 'pgsql_corp';
protected $table = 'mcid_sistema_se.opc_status_permissao';
public function permissao()
{
return $this->belongsTo(Permissoes::class); //possui muitos
}
public $timestamps = false; // tabela não possui coluna de data de criação/atualização
}
<?php
namespace App\Tab_dominios;;
use Illuminate\Database\Eloquent\Model;
class TipoIndeferimento extends Model
{
protected $connection = 'pgsql_corp';
protected $table = 'mcid_sistema_se.opc_tipo_indeferimento';
public function permissao()
{
return $this->belongsTo(Permissoes::class); //possui muitos
}
public $timestamps = false; // tabela não possui coluna de data de criação/atualização
}
......@@ -12,7 +12,7 @@ class User extends Authenticatable
protected $connection = 'pgsql_corp';
protected $table = 'mcid_sistema_se.users';
protected $table = 'users';
/**
* The attributes that are mass assignable.
......
......@@ -50925,14 +50925,6 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
//
//
//
//
//
//
//
//
//
//
//
/* harmony default export */ __webpack_exports__["default"] = ({
props: ['url', 'errorshas', 'errorsfirst', 'token', 'enctype', 'metodo', 'css', 'action', 'show'],
......@@ -51034,82 +51026,31 @@ var render = function() {
_c("blockquote", { staticClass: "blockquote" }, [
_vm._m(3),
_vm._v(" "),
_c("div", { staticClass: "row" }, [
_c(
"div",
{
staticClass:
"column col-xs-12 col-sm-6 col-md-6 text-center"
},
[
_c("img", {
staticClass: "img-thumbnail",
attrs: { src: _vm.url + "/img/icones/termo.png" }
}),
_c("br"),
_vm._v(" "),
_c(
"a",
{
staticClass: "modeloOficio",
attrs: {
href: _vm.url + "/modelo_oficio_prefeitura_1.pdf",
target: "_blank"
}
},
[
_vm._v(
"\n Entes Públicos Locais (Subnacionais)\n "
)
]
)
]
),
_vm._v(" "),
_c(
"div",
{
staticClass:
"column col-xs-12 col-sm-6 col-md-6 text-center"
},
[
_c("img", {
staticClass: "img-thumbnail",
attrs: { src: _vm.url + "/img/icones/termo.png" }
}),
_c("br"),
_vm._v(" "),
_c(
"a",
{
staticClass: "modeloOficio",
attrs: {
href: _vm.url + "/modelo_oficio_COHAB.pdf",
target: "_blank"
}
},
[
_vm._v(
"\n Companhias, autarquias e agências de habitação \n "
)
]
)
]
)
]),
_vm._v(" "),
_c("span", { staticClass: "br-divider my-3" }),
_vm._v(" "),
_c("strong", { staticClass: "text-danger" }, [
_vm._v("ATENÇÃO:")
]),
_vm._v(
" O prazo para o envio da solicitação de registro, bem como possíveis correções cadastrais, \n se encerra em "
),
_c("strong", [_vm._v("16 de março de 2022")]),
_vm._v(
".\n \n "
)
_c("div", { staticClass: "row text-center" }, [
_c("div", { staticClass: "column col-xs-12 text-center" }, [
_c("img", {
staticClass: "img-thumbnail",
attrs: { src: _vm.url + "/img/icones/termo.png" }
}),
_c("br"),
_vm._v(" "),
_c(
"a",
{
staticClass: "modeloOficio",
attrs: {
href: _vm.url + "/modelo_oficio_prefeitura_1.pdf",
target: "_blank"
}
},
[
_vm._v(
"\n Entes Públicos Locais (Subnacionais)\n "
)
]
)
])
])
]),
_vm._v(" "),
_vm._m(4),
......@@ -51299,8 +51240,6 @@ var render = function() {
_vm._v(" "),
_c("span", { staticClass: "br-divider my-3" }),
_vm._v(" "),
_vm._m(7),
_vm._v(" "),
_c("span", { staticClass: "br-divider my-3" }),
_vm._v(" "),
_c("div", { staticClass: "row" }, [
......@@ -51458,7 +51397,7 @@ var staticRenderFns = [
var _h = _vm.$createElement
var _c = _vm._self._c || _h
return _c("strong", [
_c("h3", { staticClass: "text-dark" }, [_vm._v("Modelos de Ofício")])
_c("h3", { staticClass: "text-dark" }, [_vm._v("Modelo de Ofício")])
])
},
function() {
......@@ -51494,7 +51433,11 @@ var staticRenderFns = [
),
_c("br"),
_vm._v(
"\n 7. Acesse o SISHAB e redefina a senha padrão;\n 8. Informe qual modalidade deseja participar e cadastre a proposta"
"\n 7. Acesse o SISHAB e redefina a senha padrão;"
),
_c("br"),
_vm._v(
" \n 8. Informe qual modalidade deseja participar e cadastre a proposta."
),
_c("br")
])
......@@ -51523,29 +51466,6 @@ var staticRenderFns = [
_c("strong", [_vm._v("suporte.sistemase@cidades.gov.br")])
])
])
},
function() {
var _vm = this
var _h = _vm.$createElement
var _c = _vm._self._c || _h
return _c("div", { staticClass: "row" }, [
_c("div", { staticClass: "column col-xs-12 col-md-12" }, [
_c("label", { attrs: { for: "caminho_doc_cartorio" } }, [
_vm._v("Anexar Ofício Assinado")
]),
_vm._v(" "),
_c("input", {
staticClass: "form-control-file",
attrs: {
type: "file",
id: "txt_caminho_oficio",
name: "txt_caminho_oficio",
accept: "image/* , application/pdf",
required: ""
}
})
])
])
}
]
render._withStripped = true
......@@ -49,25 +49,16 @@
</blockquote>
<blockquote class="blockquote">
<strong><h3 class="text-dark">Modelos de Ofício</h3></strong>
<div class="row">
<div class="column col-xs-12 col-sm-6 col-md-6 text-center">
<strong><h3 class="text-dark">Modelo de Ofício</h3></strong>
<div class="row text-center">
<div class="column col-xs-12 text-center">
<img v-bind:src="url + '/img/icones/termo.png'" class="img-thumbnail" ></br>
<a class="modeloOficio" v-bind:href="url + '/modelo_oficio_prefeitura_1.pdf'" target="_blank">
Entes Públicos Locais (Subnacionais)
</a>
</div>
<div class="column col-xs-12 col-sm-6 col-md-6 text-center">
<img v-bind:src="url + '/img/icones/termo.png'" class="img-thumbnail" ></br>
<a class="modeloOficio" v-bind:href="url + '/modelo_oficio_COHAB.pdf'" target="_blank">
Companhias, autarquias e agências de habitação
</a>
</div>
</div>
<span class="br-divider my-3"></span>
<strong class="text-danger">ATENÇÃO:</strong> O prazo para o envio da solicitação de registro, bem como possíveis correções cadastrais,
se encerra em <strong>16 de março de 2022</strong>.
</div>
</blockquote>
......@@ -86,10 +77,11 @@
(Verifique o conteúdo necessário conforme os modelos disponibilizados acima)</br>
5. Clique em enviar; </br>
6. Aguarde o envio de confirmação de aprovação do cadastro por e-mail;</br>
7. Acesse o SISHAB e redefina a senha padrão;
8. Informe qual modalidade deseja participar e cadastre a proposta</br>
7. Acesse o SISHAB e redefina a senha padrão;</br>
8. Informe qual modalidade deseja participar e cadastre a proposta.</br>
</p>
</blockquote>
<blockquote class="blockquote">
<h4>Dúvidas sobre preenchimento da proposta:</h4>
......@@ -192,7 +184,7 @@
<!--
<div class="row">
<div class="column col-xs-12 col-md-12">
<label for="caminho_doc_cartorio">Anexar Ofício Assinado</label>
......@@ -200,7 +192,7 @@
</div>
</div>
-->
<span class="br-divider my-3"></span>
<div class="row">
......
@component('mail::message')
# Arquivo Enviado
<p>Prezado(a) {{$usuario->name}}, {{$usuario->txt_cargo}} do </p>
<p> {{$usuario->entePublicoProponente->txt_ente_publico}}</p>
<p>Confirmamos a solicitação de cadastro no Sistema de Gerenciamento do Ministério das Cidades,
foi registrado com sucesso conforme dados constantes na Manifestação de Interesse.
</p>
<p>
Para continuidade do processo, solicitamos que o <a href="{{ $urllink }}">referido documento </a>seja assinado pelo chefe do poder Executivo, ou representante por ele designado, e enviado pela
página <a href="{{ $url }}">{{ $url }}</a>, para validação.
</p>
@component('mail::button', ['url' => $url])
Acessar Sistema
@endcomponent
Atenciosamente,<br>
<strong>Secretaria Executiva</strong>
<strong>Ministério das Cidades</strong>
<hr>
<p><small>Se estiver com dificuldade para clicar no link, copie e cole esta url no seu browser: <a href="{{ $url }}">{{ $url }}</a></small></p>
@endcomponent
@component('mail::message')
# Registro de Novo Usuário
<p>Prezados,</p>
<p>Um novo usuário acaba de se registrar no <strong>sistema </strong> para representar o <b>{{ $usuario->entePublicoProponente->txt_ente_publico }}</b>. Por favor analise a permissão do usuário.</p>
<p>Dados do Usuário:</p>
<ul>
<li><b>Nome:</b> {{ $usuario->nome }} {{ $usuario->sobrenome }}</li>
<li><b>Email:</b> {{ $usuario->email }}</li>
<li><b>CPF:</b> {{ $usuario->txt_cpf_usuario }}</li>
<li><b>Cargo:</b> {{ $usuario->txt_cargo }}</li>
<li><b>Telefone:</b> ({{ $usuario->txt_ddd_fixo }}) {{ $usuario->txt_telefone_fixo }}</li>
<li><b>Celular:</b> ({{ $usuario->txt_ddd_movel }}) {{ $usuario->txt_telefone_movel }}</li>
</ul>
@component('mail::button', ['url' => $url])
Analisar Permissão
@endcomponent
<hr>
<p><small>Se estiver com dificuldade para clicar no link, copie e cole esta url no seu browser: <a href="{{ $url }}">{{ $url }}</a></small></p>
@endcomponent
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment