registration

pull/3/head
Rustem 2025-01-01 16:41:47 +05:00
parent 1078f7d973
commit d216994ef6
9 changed files with 63 additions and 449 deletions

View File

@ -102,7 +102,6 @@ class LoginController extends Controller
$request->session()->put('user.segment', Acl::getSegment(Acl::company_id())); $request->session()->put('user.segment', Acl::getSegment(Acl::company_id()));
$request->session()->put('user.name', Auth::user()->name); $request->session()->put('user.name', Auth::user()->name);
Accounting::session_extend($request);
$this->resetAttempt($request); $this->resetAttempt($request);
} }
return $this->sendLoginResponse($request); return $this->sendLoginResponse($request);

View File

@ -1,285 +0,0 @@
<?php
/*
* Copyright (c) 2023.
*
* A.Сапаргалиев
* ТОО "Дизайн лаборатория А7"
* Астана
*/
namespace modules\Auth\Http\Controllers;
use A7kz\Platform\Helpers\Facade\Helper;
use A7kz\Platform\Http\Controllers\Controller;
use A7kz\Platform\Models\UniModel;
use A7kz\Platform\Modules\Platform\Acl\Facades\Acl;
use A7kz\Platform\Modules\Platform\Segment\Facades\Segment;
use Carbon\Carbon;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
class RegisterCompanyController extends Controller
{
const COWORKER_ROLE = 'coworker';
const DIRECTOR_ROLE = 'director';
const DEFAULT_COMPANY_ID = 0;
public function checkBiniinAjax(Request $request) {
$validation = Validator::make(['biniin' => $request->get('biniin')], $this->getBiniinRules());
if ($validation->fails()) {
return [
'status' => 'error',
'message' => __('Неправильно введен БИН/ИИН')
];
}
$biniin = $validation->validated()['biniin'];
$company = $this->getCompanyByBiniin($biniin);
if ($company) {
return [
'status' => 'success',
'data' => [
'biniin' => $biniin,
'name' => $company->name,
'fullname' => $company->fullname,
'companyExists' => true
]
];
}
else {
$inputData = [
'biniin' => $biniin
];
$minStat = $this->minStat($biniin);
if ($minStat['status'] == 2) {
$inputData['name'] = $minStat['data']['name'];
$inputData['fullname'] = $minStat['data']['name'];
}
return [
'status' => 'success',
'data' => array_merge($inputData, ['registerNewCompany' => true])
];
}
}
public function getCompanyByBiniin(string $biniin) {
return UniModel::model(config('platform.company.tables.company'))
->where('biniin', trim($biniin))
->first();
}
/**
* Store a new company.
*
* @param Request $request
* @return RedirectResponse
* @throws \Exception
*/
public function registerCompany(Request $request) {
if (!Auth::check()) {
return redirect(lurl("/"));
}
$userId = Auth::id();
$biniin = $this->getBiniin($request);
if ($company = $this->getCompanyByBiniin($biniin)) {
return $this->applyToCompany($company);
}
$minStat = $this->minStat($biniin);
[$name, $fullname] = $this->getNameAndFullName($request);
$company = $this->saveCompany([
'name' => $name,
'biniin' => $biniin,
'fullname' => $fullname
]);
$this->saveOrganization($minStat, $company);
Helper::company()->addUserToCompany($userId, $company->id);
Helper::company()->addUserRoleToCompany($userId, $company->id, self::COWORKER_ROLE);
Helper::company()->addUserRoleToCompany($userId, $company->id, self::DIRECTOR_ROLE);
$this->updateSession($company->id);
return redirect(lurl("/"));
}
public function minStat(string $biniin){
if (Cache::has($biniin)) {
return Cache::get($biniin);
}
$i = 0;
while($i < 3) {
try {
$i++;
$res = $this->getMinStatData($biniin);
if($res['status']){
Cache::put($biniin, $res, 10);
return $res;
}
sleep(10);
} catch (\Exception $e){
// ExceptionControl::message($e);
return ["status" => 0, "message" => "Данные не найдены"];
}
}
return ["status" => 0, "message" => "Данные не найдены"];
}
private function getMinStatData(string $biniin){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://stat.gov.kz/api/juridicalusr/counter/gov/?bin=' . $biniin . '&lang=ru',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Referer: https://stat.gov.kz/jur-search/bin'
),
));
$result = curl_exec($curl);
if (!curl_error($curl)) {
curl_close($curl);
$response = json_decode($result, 1);
if(!is_null($response)) {
if (array_key_exists("error", $response)) {
return ['status' => 0, 'message' => "Ошибка при запросе данных с stat gov kz"];
} else {
if ($response["success"] == true) {
return ['status' => 2, 'data' => $response['obj']];
} else {
if(is_null($response['obj'])){
return ["status" => 1, "message" => "Данные не найдены"];
}
}
}
}
return ["status" => 0, "message" => "Сервер занят"];
} else {
return ["status" => 0, "message" => "Данные не найдены"];
}
}
/**
* @throws \Exception
*/
private function saveCompany(array $data) {
$company = UniModel::model(config('platform.company.tables.company'));
$company->fill(array_merge($data, ['segment' => Segment::random()]));
$company->save();
return $company;
}
private function saveOrganization(array $minStat, $company) {
$data = $this->getOrganizationData($minStat, $company);
$organization = UniModel::model(config('platform.company.tables.organization'));
$organization->fill($data);
$organization->save();
}
private function getBiniin(Request $request) {
return $request->validate($this->getBiniinRules())['biniin'];
}
private function getNameAndFullName(Request $request) {
$data = $request->validate([
'name' => ['required', 'string', 'max:255'],
'fullname' => ['required', 'string', 'max:255'],
]);
return array($data['name'], $data['fullname']);
}
private function getOrganizationData(array $minStat, $company) {
if ($minStat['status'] == 2) {
$organizationData = $minStat['data'];
$organizationData['biniin'] = $organizationData['bin'];
unset($organizationData['bin']);
$organizationData['registerDate'] = Carbon::parse($organizationData['registerDate'])
->format('Y-m-d H:i:s');
unset($organizationData['id']);
}
else {
$organizationData = [
"name" => $company->name,
"biniin" => $company->biniin
];
}
$organizationData['company_id'] = $company->id;
return $organizationData;
}
public function showRegisterCompanyForm() {
return view('platform.auth::registerCompany');
}
public function applyToCompany($company) {
if ($this->issetApplication($company->id)) {
return back()
->withInput([
'name' => $company->name,
'biniin' => $company->biniin,
'fullname' => $company->name
])
->with('companyExists', true)
->withErrors(['company' => __('Your application already exists')]);
}
$addRequest = UniModel::model(config('platform.company.tables.company_request'));
$addRequest->fill([
'user_id' => Auth::id(),
'company_id' => $company->id,
]);
$addRequest->save();
$this->updateSession();
return redirect(lurl("/"));
}
private function issetApplication(int|string $companyId) {
return UniModel::model(config('platform.company.tables.company_request'))
->where('user_id', Auth::id())
->where('company_id', $companyId)
->count();
}
private function getBiniinRules(): array
{
return [
'biniin' => ['required', 'string', 'size:12', 'regex:/^[0-9]+$/']
];
}
private function updateSession(int $companyId = self::DEFAULT_COMPANY_ID): void
{
Session::put('user.company_id', $companyId);
Session::put('user.rights', Acl::getUserRights(Auth::id(), $companyId));
Session::put('user.segment', Acl::getSegment($companyId));
}
}

View File

@ -15,6 +15,7 @@ use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use JetBrains\PhpStorm\NoReturn;
class RegisterController extends Controller class RegisterController extends Controller
{ {
@ -46,7 +47,7 @@ class RegisterController extends Controller
public function __construct() public function __construct()
{ {
$this->middleware('guest'); $this->middleware('guest');
$this->redirectTo = lurl('register_company'); $this->redirectTo = lurl('/');
} }
/** /**
@ -64,6 +65,8 @@ class RegisterController extends Controller
'username' => ['required', 'string', 'max:255', Rule::unique($usersTable, 'username')], 'username' => ['required', 'string', 'max:255', Rule::unique($usersTable, 'username')],
'email' => ['required', 'string', 'email', 'max:255', Rule::unique($usersTable, 'email')], 'email' => ['required', 'string', 'email', 'max:255', Rule::unique($usersTable, 'email')],
'password' => ['required', 'string', 'min:8', 'confirmed'], 'password' => ['required', 'string', 'min:8', 'confirmed'],
'biniin' => ['required', 'string', 'min:12', 'max:12'],
'isorg' => ['boolean'],
]); ]);
} }
@ -73,7 +76,7 @@ class RegisterController extends Controller
* @param array $data * @param array $data
* @return User; * @return User;
*/ */
protected function create(array $data) #[NoReturn] protected function create(array $data)
{ {
$user = new User(); $user = new User();
@ -100,6 +103,35 @@ class RegisterController extends Controller
$userRoleModel->save(); $userRoleModel->save();
} }
$company = UniModel::model(config('platform.company.tables.company'))
->firstOrCreate([
'name' => $data['name'],
'biniin' => $data['biniin'],
'fullname' => $data['name'],
'segment' => 'sol'
]);
$ucr = UniModel::model(config('platform.company.tables.company_user_role'))
->firstOrCreate([
'user_id' => $user->id,
'role_id' => 7,
'company_id' => $company->id
]);
if (!$ucr) {
UniModel::model(config('platform.company.tables.company_user_role'))
->create([
'user_id' => $user->id,
'role_id' => 6,
'company_id' => $company->id
]);
}
UniModel::model(config('platform.company.tables.company_user'))
->firstOrCreate([
'company_id' => $company->id,
'user_id' => $user->id,
'default' => true,
]);
return $user; return $user;
} }

View File

@ -10,18 +10,6 @@ Route::any("/logout", [modules\Auth\Http\Controllers\LoginController::class,'log
Route::get('/register',[modules\Auth\Http\Controllers\RegisterController::class,'showRegistrationForm'])->name('registerForm'); Route::get('/register',[modules\Auth\Http\Controllers\RegisterController::class,'showRegistrationForm'])->name('registerForm');
Route::post('/register',[modules\Auth\Http\Controllers\RegisterController::class,'register'])->name('register'); Route::post('/register',[modules\Auth\Http\Controllers\RegisterController::class,'register'])->name('register');
Route::group([
'middleware' => ['auth', 'web'],
], function () {
Route::get('register_company/',[modules\Auth\Http\Controllers\RegisterCompanyController::class,'showRegisterCompanyForm'])
->name('registerCompanyForm');
Route::post('register_company/',[modules\Auth\Http\Controllers\RegisterCompanyController::class,'registerCompany'])
->name('registerCompany');
Route::post('register_company/check_biniin_ajax',[modules\Auth\Http\Controllers\RegisterCompanyController::class,'checkBiniinAjax'])
->name('checkBiniinAjax');
});
Route::get('/password/reset', [modules\Auth\Http\Controllers\ForgotPasswordController::class,'showLinkRequestForm'])->name('password.request'); Route::get('/password/reset', [modules\Auth\Http\Controllers\ForgotPasswordController::class,'showLinkRequestForm'])->name('password.request');
Route::post('/password/email',[modules\Auth\Http\Controllers\ForgotPasswordController::class,'sendResetLinkEmail'])->name('password.email'); Route::post('/password/email',[modules\Auth\Http\Controllers\ForgotPasswordController::class,'sendResetLinkEmail'])->name('password.email');
Route::get('/password/reset/{token}',[modules\Auth\Http\Controllers\ResetPasswordController::class,'showResetForm'])->name('password.reset'); Route::get('/password/reset/{token}',[modules\Auth\Http\Controllers\ResetPasswordController::class,'showResetForm'])->name('password.reset');

View File

@ -4,7 +4,6 @@
<div class="log-reg-container"> <div class="log-reg-container">
<div class="log-reg-content"> <div class="log-reg-content">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
{{-- <a href="/" class="btn btn-light"><i class="bi bi-chevron-left me-1"></i> На главную</a>--}}
<div class="item-nav-lang"> <div class="item-nav-lang">
<div class="dropdown"> <div class="dropdown">
<span class="dropdown-trigger" data-bs-toggle="dropdown"> <span class="dropdown-trigger" data-bs-toggle="dropdown">
@ -25,10 +24,8 @@
</ul> </ul>
</div> </div>
</div> </div>
{{-- <img src="{{asset('img/logo.svg')}}" alt="logo" class="logo-log">--}} <img src="{{asset('img/logo.svg')}}" alt="logo" class="logo-log">
<div class="main-logo main-logo-login"><span style="font-weight: 600">ERP.ESEP</span><br><p>{{ __('ОБЛАЧНАЯ БУХГАЛТЕРИЯ') }}</p></div>
</div> </div>
{{-- <span>{{ __('Login') }}</span>--}}
<form method="POST" action="{{ lurl('login') }}"> <form method="POST" action="{{ lurl('login') }}">
@csrf @csrf
<div class="form-group"> <div class="form-group">
@ -73,8 +70,7 @@
</form> </form>
<div class="contact-us-wrapper d-flex flex-column justify-content-center align-items-center"> <div class="contact-us-wrapper d-flex flex-column justify-content-center align-items-center">
<div class="phone-cont d-flex flex-column align-items-center mb-1"> <div class="phone-cont d-flex flex-column align-items-center mb-1">
<p><i class="bi bi-telephone-fill"></i> +7 7172 97-20-76</p> <p>7 776 350 41 41<span>({{ __('звонок бесплатный') }})</span></p>
<p>8 800 004-04-33 <span>({{ __('звонок бесплатный') }})</span></p>
</div> </div>
<div class="line"></div> <div class="line"></div>
<div class="d-flex flex-row justify-content-between" style="column-gap: 10px"> <div class="d-flex flex-row justify-content-between" style="column-gap: 10px">

View File

@ -4,7 +4,6 @@
<div class="log-reg-container"> <div class="log-reg-container">
<div class="log-reg-content"> <div class="log-reg-content">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
{{-- <a href="/" class="btn btn-light"><i class="bi bi-chevron-left me-1"></i> На главную</a>--}}
<div class="item-nav-lang"> <div class="item-nav-lang">
<div class="dropdown"> <div class="dropdown">
<span class="dropdown-trigger" data-bs-toggle="dropdown"> <span class="dropdown-trigger" data-bs-toggle="dropdown">
@ -30,11 +29,10 @@
</ul> </ul>
</div> </div>
</div> </div>
{{-- <img src="{{asset('img/logo.svg')}}" alt="logo" class="logo-log">--}} <img src="{{asset('img/logo.svg')}}" alt="logo" class="logo-log">
<h5>ПланФакт - УЧЕТ</h5>
</div> </div>
{{-- <span>{{ __('Register') }}</span>--}} <span>{{ __('Register') }}</span>
{{-- <form method="POST" action="{{ lurl('/register') }}">--}} <form method="POST" action="{{ lurl('/register') }}">
@csrf @csrf
<div class="form-group"> <div class="form-group">
@ -64,6 +62,15 @@
@enderror @enderror
</div> </div>
<div class="form-group">
<label for="biniin" class="col-form-label">{{ __('BinIin') }}</label>
<input id="biniin" type="text" class="form-control @error('biniin') is-invalid @enderror"
name="biniin" value="{{ old('biniin') }}" required autocomplete="biniin" autofocus>
@error('biniin')
<div class="invalid-feedback form-text text-danger" role="alert">{{ $message }}</div>
@enderror
</div>
<div class="form-group"> <div class="form-group">
<label for="password" class="col-form-label">{{ __('Password') }}</label> <label for="password" class="col-form-label">{{ __('Password') }}</label>
<input id="password" type="password" <input id="password" type="password"
@ -80,6 +87,11 @@
required autocomplete="new-password"> required autocomplete="new-password">
</div> </div>
<div class="form-group">
<label for="isorg" class="col-form-label">{{ __('isOrg') }}</label>
<input type="checkbox" id="isorg" name="isorg" value="1">
</div>
<button type="submit" class="btn btn-success mt-4"> <button type="submit" class="btn btn-success mt-4">
{{ __('Register') }} {{ __('Register') }}
</button> </button>

View File

@ -1,129 +0,0 @@
@extends('layouts.app')
@section('content')
@include('ajax-loader')
<div class="log-reg-container">
<div class="card">
<a href="/" class="btn btn-primary return"><i class="bi bi-arrow-left me-1"></i> Вернуться назад</a>
<div class="card-header">
<span>{{ __('Register Company') }}</span>
<img src="{{asset('img/logo-white.png')}}" alt="logo" class="logo-log">
</div>
<div class="card-body">
<form id="register-company-form" method="POST" action="{{ lurl('register_company/') }}">
@csrf
<div class="form-group">
<label for="biniin" class="col-form-label">{{ __('BIN/IIN') }}</label>
<input id="biniin" type="text" class="form-control @error('biniin') is-invalid @enderror"
name="biniin" value="{{ old('biniin') }}" required autocomplete="biniin" autofocus
oninput="checkBiniinLength(event)"
>
@error('biniin')
<div class="invalid-feedback form-text text-danger" role="alert">{{ $message }}</div>
@enderror
</div>
<div class="form-group" id="name-group" hidden>
<label for="name" class="col-form-label">{{ __('Name') }}</label>
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror"
name="name" value="{{ old('name') }}" required
autocomplete="name" autofocus>
@error('name')
<div class="invalid-feedback form-text text-danger" role="alert">{{ $message }}</div>
@enderror
</div>
<div class="form-group" id="fullname-group" hidden>
<label for="fullname" class="col-form-label">{{ __('Full name') }}</label>
<input id="fullname" type="text" class="form-control @error('fullname') is-invalid @enderror"
name="fullname" value="{{ old('fullname') }}" required
autocomplete="fullname" autofocus>
@error('fullname')
<div class="invalid-feedback form-text text-danger" role="alert">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="btn btn-light mt-4" id="submit-button" style="visibility: hidden">
{{ __('Register Company') }}
</button>
</form>
</div>
</div>
</div>
@endsection
@push('scripts-bottom')
<script>
document.getElementById("ajax-loader-on").click();
function checkBiniinLength(event) {
console.log(event.target.value)
let valueLength = event.target.value.length;
if (valueLength === 12) {
let form = document.getElementById('register-company-form');
binAjax(form.querySelectorAll('input[name="biniin"]')[0].value);
}
}
function binAjax(biniin) {
$.ajax({
method:'post',
type:'post',
dataType: 'json',
data: {
'biniin': biniin
},
url: '{{lurl('register_company/check_biniin_ajax')}}',
success: function(response){
if (response.status === 'error') {
alert(response.message);
}
else {
setDataToForm(response.data)
}
},
error: function(){
alert("Ошибка сервера");
}
});
}
function setDataToForm(data) {
let form = document.getElementById('register-company-form');
let biniinField = form.querySelectorAll('#biniin')[0];
let nameField = form.querySelectorAll('#name')[0];
let fullnameField = form.querySelectorAll('#fullname')[0];
let submitButton = form.querySelectorAll('#submit-button')[0];
document.getElementById('name-group').removeAttribute('hidden');
document.getElementById('fullname-group').removeAttribute('hidden');
submitButton.removeAttribute('hidden');
biniinField.value = data.biniin;
if ('name' in data) {
nameField.value = data.name;
fullnameField.value = data.fullname;
}
else {
nameField.value = '';
fullnameField.value = '';
}
if ('companyExists' in data) {
nameField.setAttribute('disabled', true);
fullnameField.setAttribute('disabled', true);
submitButton.innerHTML = '{{ __('Add Request') }}';
}
else {
nameField.removeAttribute('disabled');
fullnameField.removeAttribute('disabled');
submitButton.innerHTML = '{{ __('Register Company') }}';
}
submitButton.removeAttribute('style');
}
</script>
@endpush

View File

@ -13,11 +13,6 @@ use A7kz\Platform\Models\UniModel;
$companies = Acl::myCompanies(); $companies = Acl::myCompanies();
} }
$orgs_rows = \A7kz\Accounting\Facades\Accounting::my_organizations(\Illuminate\Support\Facades\Request::get('filter'));
foreach ($orgs_rows as $orgs_row){
$orgs[$orgs_row->id] = $orgs_row;
}
$active = Acl::activeCompany(); $active = Acl::activeCompany();
?> ?>
@ -52,11 +47,9 @@ use A7kz\Platform\Models\UniModel;
<div class="card-body"> <div class="card-body">
<table class="table table-striped"> <table class="table table-striped">
@foreach($companies as $company) @foreach($companies as $company)
@if((empty($active) || $active->id != $company->id) && isset($orgs[$company->id])) @if((empty($active) || $active->id != $company->id))
<tr> <tr>
<td>{{$company->biniin}}</td> <td>{{$company->biniin}}</td>
<td>{{$orgs[$company->id]->code_gu ?? ''}}</td>
<td>{{ $orgs[$company->id]->{'name_'.app()->getLocale()} ?? $company->name}}</td>
<td> <td>
<a href="{{lurl('/app/user.profile/changecompany')."?pk=".$company->id}}" <a href="{{lurl('/app/user.profile/changecompany')."?pk=".$company->id}}"
class="btn btn-success">@lang("Выбрать")</a> class="btn btn-success">@lang("Выбрать")</a>

View File

@ -1,4 +1,12 @@
{ {
"Добавить": "Добавить", "Добавить": "Добавить",
"Закрыть": "Закрыть" "Закрыть": "Закрыть",
"Register": "Регистрация",
"Name": "Имя",
"Email Address": "Почтовый адрес",
"Username": "Логин",
"BinIin": "БИН\/ИИН",
"Password": "Пароль",
"Confirm Password": "Подтвердите пароль",
"isOrg": "Организация?"
} }