Browse Source

Att: alteracao modal cadastro de empresas

Matheus
Felipe Fontana 7 months ago
parent
commit
171dc8701c
  1. 99
      app/Http/Controllers/Admin/EmpresaController.php
  2. 7
      app/Models/Empresa.php
  3. 13
      public/js/views/empresa/atualizaEmpresa.js
  4. 24
      resources/views/components/modal/edit/modalEditEmpresa.blade.php
  5. 192
      resources/views/components/modal/insert/modalEmpresa.blade.php

99
app/Http/Controllers/Admin/EmpresaController.php

@ -4,13 +4,24 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Empresa;
use App\Models\NumberChannel;
use App\Models\Agentes;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use App\Helpers\Helper;
class EmpresaController extends Controller
{
public function __construct(
protected Empresa $empresaRepository,
protected NumberChannel $numberChannelRepository,
protected Agentes $agenteRepository,
) {
}
public function index(Request $request)
{
$user = auth()->user();
@ -39,8 +50,8 @@ class EmpresaController extends Controller
}
$validator = Validator::make($request->all(), [
'nome' => 'required|string|max:255',
'cnpj' => [
'nome_empresa' => 'required|string|max:255',
'cnpj_empresa' => [
'required',
function ($attribute, $value, $fail){
$existingRecord = Empresa::where('cnpj', preg_replace('/[^0-9]/', '', $value))->first();
@ -50,8 +61,16 @@ class EmpresaController extends Controller
}
},
],
'email' => 'required|unique:empresa,email',
'status' => 'required'
'email_empresa' => 'required|unique:empresa,email',
'nome_canal' => 'required',
'numero_canal' => 'required',
'token_canal' => 'required',
'channel' => 'required',
'work_space' => 'required',
'title_canal' => 'required',
'nome_user' => 'required',
'email_user' => 'required',
'senha_user' => 'required'
], [
'unique' => 'O :attribute já está em uso.',
'required' => 'É preciso informar o campo :attribute.'
@ -61,16 +80,52 @@ class EmpresaController extends Controller
return redirect()->back()->with('error', $validator->errors()->first());
}
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->cnpj);
$status = $request->status === 'on' ? true : false;
Empresa::create([
'nome' => $request->nome,
'token' => $request->token,
'email' => $request->email,
'cnpj' => $cnpjSemMascara,
'status' => $status
]);
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->cnpj_empresa);
$status = true;
$empresa = Empresa::create([
'nome' => $request->nome_empresa,
'token' => $request->email_empresa,
'email' => $request->email_empresa,
'cnpj' => $cnpjSemMascara,
'status' => $status,
]);
$created = $this->numberChannelRepository->create($request->nome_canal, $empresa->id, $request->numero_canal, $request->token_canal, $request->channel, $request->work_space, $request->title_canal, $status);
if (!$created) {
return redirect()->back()->with('error', 'Não foi possivel criar o Canal');
}
$created = $this->agenteRepository->create($request->nome_user, $request->email_user, $request->senha_user, $empresa->id.'000', $status, $empresa->id, 4);
if (!$created) {
return redirect()->back()->with('error', 'Não foi possivel criar o Agente');
}
DB::table('motivos_pausas')->insert([
['motivo' => 'TOALLET', 'id_empresa' => $empresa->id, 'is_ativo' => true],
['motivo' => 'ALMOÇO', 'id_empresa' => $empresa->id, 'is_ativo' => true],
['motivo' => 'DESCANÇO', 'id_empresa' => $empresa->id, 'is_ativo' => true],
['motivo' => 'REUNIÃO', 'id_empresa' => $empresa->id, 'is_ativo' => true],
]);
DB::table('system_message')->insert([
['data_reg' => 'now()', 'texto' => 'Olá @cliente_name tudo certo?', 'ordem' => 0, 'momento' => 'SAUDACAO', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Cancelado o atendimento!', 'ordem' => 0, 'momento' => 'CANCELAR_FILA', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Atendimento iniciado com @agente_name!', 'ordem' => 0, 'momento' => 'INICIAR_ATENDIMENTO', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Atendimento finalizado!', 'ordem' => 0, 'momento' => 'FINALIZAR_ATENDIMENTO', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Não temos nenhum atendente disponível no momento, iremos lhe atender assim que um atendente estiver disponível!', 'ordem' => 0, 'momento' => 'ENTRAR_FILA_SEM', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Nossos atendentes estão ocupados, por favor aguarde que iremos lhe atender!', 'ordem' => 0, 'momento' => 'ENTRAR_FILA_COM', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Para finalar o atendimento digite \n*"/finalizar"*.', 'ordem' => 0, 'momento' => 'INICIAR_ATENDIMENTO', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Para sair da fila digite \n*"/cancelar"*.', 'ordem' => 0, 'momento' => 'ENTRAR_FILA_COM', 'id_empresa' => $empresa->id],
['data_reg' => 'now()', 'texto' => 'Obrigado por nos avaliar!', 'ordem' => 0, 'momento' => 'FINALIZAR_PESQUISA', 'id_empresa' => $empresa->id],
]);
DB::table('config_atendimento')->insert([
['id_empresa' => $empresa->id, 'quantidade_simutaneo' => 10, 'timeout_client' => 60000, 'timeout_agent' => 60000, 'timeout_supervisor' => 5, 'timeout_espera' => 30, 'hide_nome' => false]
]);
return redirect('empresas')->with('status', 'Cadastrado com sucesso');
}
@ -109,8 +164,8 @@ class EmpresaController extends Controller
}
$validator = Validator::make($request->all(), [
'nome' => 'required|string|max:255',
'cnpj' => [
'edit_nome' => 'required|string|max:255',
'edit_cnpj' => [
'required',
function ($attribute, $value, $fail) use ($id){
$existingRecord = Empresa::where('cnpj', preg_replace('/[^0-9]/', '', $value))->where('id', '!=', $id)->first();
@ -120,8 +175,8 @@ class EmpresaController extends Controller
}
},
],
'email' => 'required|unique:empresa,email,'.$id,
'status' => 'required'
'edit_email' => 'required|unique:empresa,email,'.$id,
'edit_status' => 'required'
], [
'unique' => 'O :attribute já está em uso.',
'required' => 'É preciso informar o campo :attribute.'
@ -131,14 +186,14 @@ class EmpresaController extends Controller
return redirect()->back()->with('error', $validator->errors()->first());
}
$status = $request->status === "on" ? true : false;
$status = $request->edit_status === "on" ? true : false;
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->cnpj);
$cnpjSemMascara = preg_replace("/[^0-9]/", "", $request->edit_cnpj);
Empresa::where("id", $id)
->update([
'nome' => $request->nome,
'email' => $request->email,
'nome' => $request->edit_nome,
'email' => $request->edit_email,
'cnpj' => $cnpjSemMascara,
'status' => $status,
]);

7
app/Models/Empresa.php

@ -20,5 +20,12 @@ class Empresa extends Model
'email',
'cnpj'
];
public function criarEmpresa(array $dadosEmpresa): int
{
$empresa = $this->create($dadosEmpresa);
return $empresa->id;
}
}

13
public/js/views/empresa/atualizaEmpresa.js

@ -6,15 +6,14 @@ function atualizaEmpresa(empresa_id) {
const empresa_data = data.empresa_data;
$(".modal-edit").show();
$(".modal-edit").find('form').attr('action', `empresas/${empresa_id}`);
$(".modal-edit").find("input[name='nome']").val(empresa_data.nome);
$(".modal-edit").find("input[name='token']").val(empresa_data.token);
$(".modal-edit").find("input[name='email']").val(empresa_data.email);
const cnpjFormatado = $(".modal-edit").find("input[name='cnpj']").masked(empresa_data.cnpj);
$(".modal-edit").find("input[name='cnpj']").val(cnpjFormatado);
$(".modal-edit").find("input[name='edit_nome']").val(empresa_data.nome);
$(".modal-edit").find("input[name='edit_email']").val(empresa_data.email);
const cnpjFormatado = $(".modal-edit").find("input[name='edit_cnpj']").masked(empresa_data.cnpj);
$(".modal-edit").find("input[name='edit_cnpj']").val(cnpjFormatado);
if (empresa_data.status) {
$(".modal-edit").find("input[name='status'][value='on']").prop("checked", true);
$(".modal-edit").find("input[name='edit_status'][value='on']").prop("checked", true);
} else {
$(".modal-edit").find("input[name='status'][value='off']").prop("checked", true);
$(".modal-edit").find("input[name='edit_status'][value='off']").prop("checked", true);
}
}
});

24
resources/views/components/modal/edit/modalEditEmpresa.blade.php

@ -19,25 +19,21 @@
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome Fantasia: </label>
<input type="text" placeholder="Digite o nome fantasia: " required name="nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
<input type="text" placeholder="Digite o nome fantasia: " required name="edit_nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
</div>
{{-- <div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é o Token: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
</div> --}}
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o Email: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" >
<label class="dark:text-gray-100">Email: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="edit_email" >
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Digite o CPNJ: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj" maxlength="8">
<label class="dark:text-gray-100">CPNJ: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="edit_cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="edit_cnpj" maxlength="8">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativa: </label>
<div class="container-checkbox">
<input type="radio" name="status" value="on"> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off"> <span class="dark:text-gray-100">Não</span>
<input type="radio" name="edit_status" value="on"> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="edit_status" value="off"> <span class="dark:text-gray-100">Não</span>
</div>
</div>
@ -52,15 +48,15 @@
</div>
<script>
$(document).ready(function(){
$('.modal-edit').find('#cnpj').mask('00.000.000/0000-00', {reverse: true});
$('.modal-edit').find('#edit_cnpj').mask('00.000.000/0000-00', {reverse: true});
})
$('.modal-edit').find('form').submit(function(e){
e.preventDefault();
const inputValue = $(this).find("input[name='cnpj']").val();
const inputValue = $(this).find("input[name='edit_cnpj']").val();
if(inputValue.length < 18){
$(this).find("input[name='cnpj']").addClass("border border-red-500");
$(this).find("input[name='edit_cnpj']").addClass("border border-red-500");
return;
}

192
resources/views/components/modal/insert/modalEmpresa.blade.php

@ -1,7 +1,7 @@
<div class="fixed z-50 p-4 bg-gray-900 bg-opacity-60 h-full w-full hidden modal" :class="{'block': modal, 'hidden': !modal}">
<div class="fixed w-full max-w-2xl md:h-auto top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]">
<!-- Modal content -->
<form method="POST" action="{{route('empresas.store')}}" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
<form method="POST" id="cadastro-empresa" action="{{route('empresas.store')}}" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
@csrf
<!-- Modal header -->
@ -14,53 +14,189 @@
</button>
</div>
<!-- Modal body -->
<div class="p-6 space-y-6">
<div class="p-6 space-y-6 step step-1">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Nome Fantasia: </label>
<input type="text" placeholder="Digite o nome fantasia: " required name="nome" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Qual é o Token: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o token: " name="token" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
<input type="text" placeholder="Digite o nome fantasia: " required name="nome_empresa" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100">
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Selecione o Email: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email" >
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email_empresa" >
</div>
<div class="flex flex-col gap-2">
<label class="dark:text-gray-100">Digite o CPNJ: </label>
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj">
<input type="text" required class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o CPNJ: " name="cnpj_empresa" onkeypress="return event.charCode >= 48 && event.charCode <= 57" id="cnpj">
</div>
</div>
</div>
<div class="p-6 space-y-6 step step-2 hidden">
<div class="flex flex-col gap-4">
<p class="dark:text-gray-100"><strong>Canal</strong>: No formulário abaixo preencha as informações do canal da empresa que será criada.</p>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Nome: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Informe o nome: " name="nome_canal" >
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Número: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Informe o numero do canal: " name="numero_canal">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Token: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Informe o token do canal: " name="token_canal">
</div>
<div>
<label for="" class="dark:text-gray-100 block">Ativa: </label>
<input type="radio" name="status" checked value="on"> <span class="mr-3 dark:text-gray-100">Sim</span>
<input type="radio" name="status" value="off"> <span class="dark:text-gray-100">Não</span>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Channel: </label>
<select class="w-full dark:bg-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" name="channel">
<option value="positus">Positus</option>
<option value="gupshup">GupShup</option>
</select>
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Workspace: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Informe o numero do workspace: " name="work_space">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Título: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Informe o titulo do canal: " name="title_canal">
</div>
</div>
</div>
<div class="p-6 space-y-6 step step-3 hidden">
<div class="flex flex-col gap-4">
<p class="dark:text-gray-100"><strong>Usuário</strong>: No formulário abaixo preencha as informações do novo usuário para a empresa que será criada. É através deste usuário que a empresa poderá ser acessada e administrada.</p>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Nome: </label>
<input type="text" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100 " placeholder="Digite o nome: " name="nome_user">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Email: </label>
<input type="email" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite o email: " name="email_user">
</div>
<div class="flex flex-col gap-2">
<label for="" class="dark:text-gray-100">Senha: </label>
<input type="password" value="12345678" pattern=".{8,}" title="A senha deve ter pelo menos 8 caracteres" class="w-full dark:bg-gray-800 placeholder:text-gray-800 dark:placeholder:text-gray-100 dark:text-gray-100" placeholder="Digite a senha: " name="senha_user">
</div>
</div>
</div>
<!-- Modal footer -->
<div class="flex items-center justify-end p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg">Cadastrar</button>
<div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
<button type="button" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-back-step hidden" onclick="backStep()">Voltar</button>
<button type="button" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg btn-step" onclick="nextStep()">Continuar</button>
<button type="submit" class="bg-blue-500 hover:bg-opacity-90 transition-all text-white py-2 px-6 rounded text-lg hidden btn-cadastro">
<div >Cadastrar</div>
</button>
</div>
</form>
</div>
</div>
<script>
$('.modal').find('form').submit(function(e){
e.preventDefault();
<script>
const modal = document.querySelector('.modal');
const form = document.querySelector("#cadastro-empresa");
const steps = modal.querySelectorAll('.step');
function nextStep() {
const isValidated = validationInput();
if (isValidated) {
toogleNextStep();
}
}
const inputValue = $(this).find("input[name='cnpj']").val();
if(inputValue.length < 18){
$(this).find("input[name='cnpj']").addClass("border border-red-500");
return;
function validationInput() {
const currentStep = getCurrentStep();
let inputs = [];
if (currentStep == 1) {
inputs = [modal.querySelector("input[name='nome_empresa']"), modal.querySelector("input[name='email_empresa']"), modal.querySelector("input[name='cnpj_empresa']")];
} else if (currentStep == 2) {
inputs = [modal.querySelector("input[name='nome_canal']"), modal.querySelector("input[name='numero_canal']"), modal.querySelector("input[name='token_canal']"), modal.querySelector("input[name='work_space']"), modal.querySelector("input[name='title_canal']")];
} else if (currentStep == 3) {
inputs = [modal.querySelector("input[name='nome_user']"), modal.querySelector("input[name='email_user']"), modal.querySelector("input[name='senha_user']")];
}
let validacao = true;
for (let i = 0; i < inputs.length; i++) {
if (inputs[i].value.length < 1) {
inputs[i].classList.add('border-2', 'border-red-500');
validacao = false;
} else {
inputs[i].classList.remove('border-2', 'border-red-500');
}
}
return validacao;
}
function backStep() {
toogleBackStep();
}
function toogleNextStep() {
let selected;
let next;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
selected = steps[i];
next = steps[i + 1];
}
}
selected.classList.toggle('hidden');
next.classList.toggle('hidden');
const [btnStep, btnBackStep, btnCadastro] = getButtons();
const isStep3 = next.classList.contains('step-3');
btnCadastro.classList.toggle("hidden", !isStep3);
btnStep.classList.toggle("hidden", isStep3);
const isHidden = btnCadastro.classList.contains('hidden');
if (isHidden) {
btnBackStep.classList.remove('hidden')
}
}
function toogleBackStep() {
let selected;
let back;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
selected = steps[i];
back = steps[i - 1];
}
}
selected.classList.toggle('hidden');
back.classList.toggle('hidden');
const [btnStep, btnBackStep, btnCadastro] = getButtons();
const isHidden = btnCadastro.classList.contains('hidden');
const isStep3 = back.classList.contains('step-3');
btnCadastro.classList.toggle("hidden", !isStep3);
btnStep.classList.remove("hidden", isStep3);
if (isHidden) {
btnBackStep.classList.toggle('hidden')
}
}
function getCurrentStep() {
let selected;
for (let i = 0; i < steps.length; i++) {
const isHidden = steps[i].classList.contains('hidden');
if (!isHidden) {
selected = i + 1;
}
}
return selected;
}
function getButtons() {
const btnStep = modal.querySelector('.btn-step');
const btnBackStep = modal.querySelector('.btn-back-step');
const btnCadastro = modal.querySelector('.btn-cadastro');
this.submit();
})
return [btnStep, btnBackStep, btnCadastro];
}
$(document).ready(function(){
$('.modal').find('#cnpj').mask('00.000.000/0000-00', {reverse: true});
})
</script>
$(document).ready(function(){
$('.modal').find('#cnpj').mask('00.000.000/0000-00', {reverse: true});
})
</script>
Loading…
Cancel
Save