diff --git a/app/Http/Controllers/ClientsTableController.php b/app/Http/Controllers/ClientsTableController.php index 164ea4a..f844928 100644 --- a/app/Http/Controllers/ClientsTableController.php +++ b/app/Http/Controllers/ClientsTableController.php @@ -6,22 +6,42 @@ use App\Models\Deal\Deal; use App\Models\Agent\Agent; +use App\Models\Company\CompanyAdmin; + use App\Models\City; class ClientsTableController extends Controller { public function index(Request $request) + { + return view( + 'clients.table', + [ + 'status' => $request->status, + 'cities' => City::all() + ] + ); + + } + + public function getAllDealsInCompany(Request $request) { $user = auth()->user(); - if (!$agent = Agent::where('user_id', $user->id)->first()) + if (!$admin = CompanyAdmin::where('user_id', $user->id)->first()) { abort(401); } + $deals = Deal::whereIn('agent_id', function ($query) use ($admin) + { + $query->select('id'); + $query->from('agents'); + $query->where('company_id', $admin->company_id); + })->get(); return view( 'clients.table', [ - 'deals' => $agent->deals, + 'deals' => $deals, 'status' => $request->status, 'cities' => City::all() ] diff --git a/app/Http/Controllers/Company/CreateCompanyController.php b/app/Http/Controllers/Company/CreateCompanyController.php index a125ae1..cc16dc0 100644 --- a/app/Http/Controllers/Company/CreateCompanyController.php +++ b/app/Http/Controllers/Company/CreateCompanyController.php @@ -2,11 +2,12 @@ namespace App\Http\Controllers\Company; +use Illuminate\Validation\Rule; + use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Company\Company; - - +use App\Models\Company\CompanyType; use App\Models\Bitrix\SendCompany; class CreateCompanyController extends Controller { @@ -15,10 +16,20 @@ class CreateCompanyController extends Controller */ public function __invoke(Request $request) { + + $request->enum('type', CompanyType::class); + $validated = $request->validate([ + 'name' => 'required|max:255', + 'email' => 'required|email|unique:companies', + 'phone' => 'required', + 'inn' => 'required|unique:companies', + 'legal_address' => 'required', + 'type' => Rule::enum(CompanyType::class) + ]); + $request->request->add([ 'secret' => bin2hex(random_bytes(16)), - 'status' => 'new', - 'type' => 'AGENCY' + 'status' => 'new' ]); $data = $request->only('name', 'email', 'inn', 'legal_address', 'secret', 'status', 'type', 'phone'); $company = Company::create($data); diff --git a/app/Http/Controllers/Company/CreateCompanyFormController.php b/app/Http/Controllers/Company/CreateCompanyFormController.php new file mode 100644 index 0000000..4536750 --- /dev/null +++ b/app/Http/Controllers/Company/CreateCompanyFormController.php @@ -0,0 +1,28 @@ +has('type')) + { + $request->enum('type', CompanyType::class); + $type = $request->type; + } + return view('company.create', [ + 'type' => $type, + 'typesList' => CompanyType::cases() + ]); + } + } diff --git a/app/Http/Controllers/Company/DetailsController.php b/app/Http/Controllers/Company/DetailsController.php index 7dcf580..42306a9 100644 --- a/app/Http/Controllers/Company/DetailsController.php +++ b/app/Http/Controllers/Company/DetailsController.php @@ -8,6 +8,7 @@ use App\Models\Company\Company; use App\Models\Company\Details; use App\Models\Company\CompanyAdmin; +use App\Models\Company\CompanyType; class DetailsController extends Controller { @@ -29,7 +30,7 @@ public function index() $details = new Details($company); $details = $details->details; - if ($company->type == 'SELFEMP') + if ($company->type == CompanyType::SelfEmployer || $company->type == CompanyType::SoleProperty) { return view('company.details.selfemp', [ 'company' => $company, @@ -37,7 +38,7 @@ public function index() ]); } ; - if ($company->type == 'AGENCY') + if ($company->type == CompanyType::Agency) { return view('company.details.agency', [ 'company' => $company, diff --git a/app/Livewire/ClientsTable.php b/app/Livewire/ClientsTable.php index abed761..04b5e0f 100644 --- a/app/Livewire/ClientsTable.php +++ b/app/Livewire/ClientsTable.php @@ -7,6 +7,7 @@ use Livewire\WithoutUrlPagination; use App\Models\Agent\Agent; +use App\Models\Company\CompanyAdmin; use App\Models\Deal\Deal; class ClientsTable extends Component @@ -19,20 +20,39 @@ public function mount($status = null) { $this->status = $status; } + + public function getDeals() + { + $deals = false; + $user = auth()->user(); + if ($agent = Agent::where('user_id', $user->id)->first()) + { + $deals = Deal::where('agent_id', $agent->id); + } + elseif ($admin = CompanyAdmin::where('user_id', $user->id)->first()) + { + $deals = Deal::whereIn('agent_id', function ($query) use ($admin) + { + $query->select('id'); + $query->from('agents'); + $query->where('company_id', $admin->company_id); + }); + } + return $deals; + } public function render() { - $user = auth()->user(); - $agent = Agent::where('user_id', $user->id)->first(); - $deals = []; + $deals = $this->getDeals(); if ($this->status && $this->status == 'UNIQUE') { - $deals = Deal::where('agent_id', $agent->id)->where('status', $this->status)->paginate(8); + $deals = $deals->where('status', $this->status)->paginate(8); } else { - $deals = Deal::where('agent_id', $agent->id)->paginate(8); + $deals = $deals->paginate(8); } ; + return view( 'livewire.clients-table', [ diff --git a/app/Models/Company/Company.php b/app/Models/Company/Company.php index f98d7a1..f08409a 100644 --- a/app/Models/Company/Company.php +++ b/app/Models/Company/Company.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model; class Company extends Model -{ + { use HasFactory; const STATUS_NEW = 'new'; @@ -25,7 +25,8 @@ class Company extends Model 'secret' ]; - protected $casts = [ - 'details' => 'array' + protected $casts = [ + 'details' => 'array', + 'type' => CompanyType::class ]; -} + } diff --git a/app/Models/Company/CompanyAdmin.php b/app/Models/Company/CompanyAdmin.php index ae93519..8a27f00 100644 --- a/app/Models/Company/CompanyAdmin.php +++ b/app/Models/Company/CompanyAdmin.php @@ -6,11 +6,11 @@ use Illuminate\Database\Eloquent\Model; class CompanyAdmin extends Model -{ + { use HasFactory; protected $fillable = [ 'user_id', 'company_id' ]; - -} + + } diff --git a/app/Models/Company/CompanyType.php b/app/Models/Company/CompanyType.php new file mode 100644 index 0000000..8c8f01e --- /dev/null +++ b/app/Models/Company/CompanyType.php @@ -0,0 +1,8 @@ +details) { - if ($company->type == 'SELFEMP') + if ($company->type == CompanyType::SelfEmployer) { $company->details = $this->emptyForSelfEmp(); $company->save(); } ; - if ($company->type == 'AGENCY') + if ($company->type == CompanyType::SoleProperty) + { + $company->details = $this->emptyForSelfEmp(); + $company->save(); + } + ; + if ($company->type == CompanyType::Agency) { $company->details = $this->emptyForAgency(); $company->save(); diff --git a/app/Models/Deal/Deal.php b/app/Models/Deal/Deal.php index bf94172..375c074 100644 --- a/app/Models/Deal/Deal.php +++ b/app/Models/Deal/Deal.php @@ -16,14 +16,16 @@ class Deal extends Model 'is_unique', 'confirm_token' ]; - public function complex() { return $this->belongsTo(\App\Models\Complex::class); } - public function user() { return $this->belongsTo(\App\Models\User::class, 'client_id'); } + public function agent() + { + return $this->belongsTo(\App\Models\Agent\Agent::class, 'agent_id'); + } } diff --git a/database/migrations/2024_10_23_141203_create_companies_table.php b/database/migrations/2024_10_23_141203_create_companies_table.php index 2e7c479..7b00d00 100644 --- a/database/migrations/2024_10_23_141203_create_companies_table.php +++ b/database/migrations/2024_10_23_141203_create_companies_table.php @@ -5,15 +5,16 @@ use Illuminate\Support\Facades\Schema; return new class extends Migration -{ + { /** * Run the migrations. */ public function up(): void - { - Schema::create('companies', function (Blueprint $table) { + { + Schema::create('companies', function (Blueprint $table) + { $table->id(); - $table->enum('type',['AGENCY','SELFEMP','SOLEPROP'])->nullable(); /* AGENT - агент в компании, SELFEMP - самозанятый, SOLEPROP - инд. предприниматель */ + $table->enum('type', ['AGENCY', 'SELFEMP', 'SOLEPROP']); /* AGENT - агент в компании, SELFEMP - самозанятый, SOLEPROP - инд. предприниматель */ $table->string('name'); $table->string('inn'); $table->string('full_name')->nullable(); @@ -22,14 +23,14 @@ public function up(): void $table->string('legal_address')->nullable(); $table->json('details')->nullable(); $table->timestamps(); - }); - } + }); + } /** * Reverse the migrations. */ public function down(): void - { + { Schema::dropIfExists('companies'); - } -}; + } + }; diff --git a/lang/ru.json b/lang/ru.json index a078f45..1a87168 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -19,5 +19,15 @@ "Please use your email as login and created password": "Пожалуйста, используйте для входа Вашу электронную почту в качестве логина и пароль, который был автоматически сгенерирован: :password", "Go to login": "Перейти к авторизации", "Your login": "Ваш логин: :login", - "Your password": "Ваш пароль: :password" + "Your password": "Ваш пароль: :password", + "Agency": "Агентство", + "SelfEmployer": "Самозанятый", + "SoleProperty": "Индивидуальный предприниматель", + "Agency name": "Название агентства", + "Inn": "ИНН", + "Legal address": "Юридический адрес", + "Phone": "Номер телефона", + "Email": "Электронная почта", + "SelfEmployer name": "ФИО полностью", + "SoleProperty name": "ФИО полностью" } \ No newline at end of file diff --git a/lang/ru/auth.php b/lang/ru/auth.php new file mode 100644 index 0000000..6598e2c --- /dev/null +++ b/lang/ru/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/ru/pagination.php b/lang/ru/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/lang/ru/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/ru/passwords.php b/lang/ru/passwords.php new file mode 100644 index 0000000..f1223bd --- /dev/null +++ b/lang/ru/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset.', + 'sent' => 'We have emailed your password reset link.', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/ru/validation.php b/lang/ru/validation.php new file mode 100644 index 0000000..a574296 --- /dev/null +++ b/lang/ru/validation.php @@ -0,0 +1,191 @@ + 'The :attribute field must be accepted.', + 'accepted_if' => 'The :attribute field must be accepted when :other is :value.', + 'active_url' => 'The :attribute field must be a valid URL.', + 'after' => 'The :attribute field must be a date after :date.', + 'after_or_equal' => 'The :attribute field must be a date after or equal to :date.', + 'alpha' => 'The :attribute field must only contain letters.', + 'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.', + 'alpha_num' => 'The :attribute field must only contain letters and numbers.', + 'array' => 'The :attribute field must be an array.', + 'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.', + 'before' => 'The :attribute field must be a date before :date.', + 'before_or_equal' => 'The :attribute field must be a date before or equal to :date.', + 'between' => [ + 'array' => 'The :attribute field must have between :min and :max items.', + 'file' => 'The :attribute field must be between :min and :max kilobytes.', + 'numeric' => 'The :attribute field must be between :min and :max.', + 'string' => 'The :attribute field must be between :min and :max characters.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'can' => 'The :attribute field contains an unauthorized value.', + 'confirmed' => 'The :attribute field confirmation does not match.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute field must be a valid date.', + 'date_equals' => 'The :attribute field must be a date equal to :date.', + 'date_format' => 'The :attribute field must match the format :format.', + 'decimal' => 'The :attribute field must have :decimal decimal places.', + 'declined' => 'The :attribute field must be declined.', + 'declined_if' => 'The :attribute field must be declined when :other is :value.', + 'different' => 'The :attribute field and :other must be different.', + 'digits' => 'The :attribute field must be :digits digits.', + 'digits_between' => 'The :attribute field must be between :min and :max digits.', + 'dimensions' => 'The :attribute field has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.', + 'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.', + 'email' => 'The :attribute field must be a valid email address.', + 'ends_with' => 'The :attribute field must end with one of the following: :values.', + 'enum' => 'The selected :attribute is invalid.', + 'exists' => 'The selected :attribute is invalid.', + 'extensions' => 'The :attribute field must have one of the following extensions: :values.', + 'file' => 'The :attribute field must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'array' => 'The :attribute field must have more than :value items.', + 'file' => 'The :attribute field must be greater than :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than :value.', + 'string' => 'The :attribute field must be greater than :value characters.', + ], + 'gte' => [ + 'array' => 'The :attribute field must have :value items or more.', + 'file' => 'The :attribute field must be greater than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be greater than or equal to :value.', + 'string' => 'The :attribute field must be greater than or equal to :value characters.', + ], + 'hex_color' => 'The :attribute field must be a valid hexadecimal color.', + 'image' => 'The :attribute field must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field must exist in :other.', + 'integer' => 'The :attribute field must be an integer.', + 'ip' => 'The :attribute field must be a valid IP address.', + 'ipv4' => 'The :attribute field must be a valid IPv4 address.', + 'ipv6' => 'The :attribute field must be a valid IPv6 address.', + 'json' => 'The :attribute field must be a valid JSON string.', + 'lowercase' => 'The :attribute field must be lowercase.', + 'lt' => [ + 'array' => 'The :attribute field must have less than :value items.', + 'file' => 'The :attribute field must be less than :value kilobytes.', + 'numeric' => 'The :attribute field must be less than :value.', + 'string' => 'The :attribute field must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute field must not have more than :value items.', + 'file' => 'The :attribute field must be less than or equal to :value kilobytes.', + 'numeric' => 'The :attribute field must be less than or equal to :value.', + 'string' => 'The :attribute field must be less than or equal to :value characters.', + ], + 'mac_address' => 'The :attribute field must be a valid MAC address.', + 'max' => [ + 'array' => 'The :attribute field must not have more than :max items.', + 'file' => 'The :attribute field must not be greater than :max kilobytes.', + 'numeric' => 'The :attribute field must not be greater than :max.', + 'string' => 'The :attribute field must not be greater than :max characters.', + ], + 'max_digits' => 'The :attribute field must not have more than :max digits.', + 'mimes' => 'The :attribute field must be a file of type: :values.', + 'mimetypes' => 'The :attribute field must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute field must have at least :min items.', + 'file' => 'The :attribute field must be at least :min kilobytes.', + 'numeric' => 'The :attribute field must be at least :min.', + 'string' => 'The :attribute field must be at least :min characters.', + ], + 'min_digits' => 'The :attribute field must have at least :min digits.', + 'missing' => 'The :attribute field must be missing.', + 'missing_if' => 'The :attribute field must be missing when :other is :value.', + 'missing_unless' => 'The :attribute field must be missing unless :other is :value.', + 'missing_with' => 'The :attribute field must be missing when :values is present.', + 'missing_with_all' => 'The :attribute field must be missing when :values are present.', + 'multiple_of' => 'The :attribute field must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute field format is invalid.', + 'numeric' => 'The :attribute field must be a number.', + 'password' => [ + 'letters' => 'The :attribute field must contain at least one letter.', + 'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.', + 'numbers' => 'The :attribute field must contain at least one number.', + 'symbols' => 'The :attribute field must contain at least one symbol.', + 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.', + ], + 'present' => 'The :attribute field must be present.', + 'present_if' => 'The :attribute field must be present when :other is :value.', + 'present_unless' => 'The :attribute field must be present unless :other is :value.', + 'present_with' => 'The :attribute field must be present when :values is present.', + 'present_with_all' => 'The :attribute field must be present when :values are present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => 'The :attribute field format is invalid.', + 'required' => 'Поле обязательно для заполнения', + 'required_array_keys' => 'The :attribute field must contain entries for: :values.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_if_accepted' => 'The :attribute field is required when :other is accepted.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute field must match :other.', + 'size' => [ + 'array' => 'The :attribute field must contain :size items.', + 'file' => 'The :attribute field must be :size kilobytes.', + 'numeric' => 'The :attribute field must be :size.', + 'string' => 'The :attribute field must be :size characters.', + ], + 'starts_with' => 'The :attribute field must start with one of the following: :values.', + 'string' => 'The :attribute field must be a string.', + 'timezone' => 'The :attribute field must be a valid timezone.', + 'unique' => 'Такая запись уже существует', + 'uploaded' => 'The :attribute failed to upload.', + 'uppercase' => 'The :attribute field must be uppercase.', + 'url' => 'The :attribute field must be a valid URL.', + 'ulid' => 'The :attribute field must be a valid ULID.', + 'uuid' => 'The :attribute field must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/css/app.css b/resources/css/app.css index af88334..2aef201 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,6 +5,11 @@ .bg-primary { border-color: #ce4711 !important; } +.btn-secondary, +.btn-secondary:disabled { + color: white; +} + .btn-primary { background-color: #e6662a !important; color: white; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 05ec438..f2cfbb5 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -3,10 +3,10 @@ @section('content')
-
-
Форма входа
+
+
Вход на сайт
-
+
@csrf diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php index 8cef084..3413313 100644 --- a/resources/views/auth/passwords/email.blade.php +++ b/resources/views/auth/passwords/email.blade.php @@ -3,11 +3,11 @@ @section('content')
-
-
-
{{ __('Reset Password') }}
+
+
+
{{ __('Reset Password') }}
-
+
@if (session('status'))