master
sergeybodin 2023-08-01 10:38:53 +03:00
commit 367cfb3753
80 changed files with 3608 additions and 71 deletions

View File

@ -0,0 +1,72 @@
<?php
namespace App\Http\Controllers\Api\Advisories;
use App\Http\Controllers\Controller;
use App\Models\Advisories\Advisory;
use App\Services\Filters\FiltersService;
use App\Transformers\Advisories\AdvisoryTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AdvisoriesController extends Controller {
protected Advisory $model;
public function __construct(Advisory $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$query = $this->model->query();
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new AdvisoryTransformer())->respond();
}
public function show(Request $request, $id): JsonResponse {
$query = $this->model->query();
$model = ($id === 'main') ? $query->where(['is_main' => 1])->firstOrFail() : $query->byUuid($id)->firstOrFail();
return fractal($model, new AdvisoryTransformer())->respond();
}
public function siblings(Request $request, $id): JsonResponse {
$filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : []);
$query = $this->model->query();
$model = ($id === 'main') ? $query->where(['is_main' => 1])->firstOrFail() : $query->byUuid($id)->firstOrFail();
$query = $model->siblings();
$service = FiltersService::getService('advisories');
$service->applyFilters($query, $filters);
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new AdvisoryTransformer())->respond();
}
public function store(Request $request): JsonResponse {
$this->validate($request, [
'parent' => 'required|exists:advisories,uuid',
'title' => 'required',
'number' => 'required',
'type' => 'required'
]);
$model = $this->model->create($request->all());
return fractal($model, new AdvisoryTransformer())->respond(201);
}
public function update(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$this->validate($request, [
'title' => 'required',
'number' => 'required',
'type' => 'required'
]);
$model->update($request->all());
return fractal($model->fresh(), new AdvisoryTransformer())->respond();
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\Api\Advisories;
use App\Http\Controllers\Controller;
use App\Models\Advisories\AdvisoryCompany;
use App\Transformers\Advisories\AdvisoryCompanyTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AdvisoryCompaniesController extends Controller {
protected AdvisoryCompany $model;
public function __construct(AdvisoryCompany $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$query = $this->model->query();
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new AdvisoryCompanyTransformer())->respond();
}
public function show(Request $request, $id): JsonResponse {
$model = $this->model->byUuid($id)->firstOrFail();
return fractal($model, new AdvisoryCompanyTransformer())->respond();
}
public function store(Request $request): void {
}
public function update(Request $request, $uuid): void {
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->advisoryMembers()->delete();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api\Advisories;
use App\Http\Controllers\Controller;
use App\Models\Advisories\AdvisoryMember;
use App\Transformers\Advisories\AdvisoryMemberTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AdvisoryMembersController extends Controller {
protected AdvisoryMember $model;
public function __construct(AdvisoryMember $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$query = $this->model->query();
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new AdvisoryMemberTransformer())->respond();
}
public function show(Request $request, $id): JsonResponse {
$model = $this->model->byUuid($id)->firstOrFail();
return fractal($model, new AdvisoryMemberTransformer())->respond();
}
public function store(Request $request): void {
}
public function update(Request $request, $uuid): void {
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -30,6 +30,12 @@ class UploadFileController extends Controller {
'type' => 'image', 'type' => 'image',
'extension' => 'png', 'extension' => 'png',
], ],
/*
'image/svg+xml' => [
'type' => 'image',
'extension' => 'svg'
],
*/
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => [
'type' => 'document', 'type' => 'document',
'extension' => 'xlsx' 'extension' => 'xlsx'

View File

@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers\Api\Companies;
use App\Http\Controllers\Controller;
use App\Models\Companies\Company;
use App\Services\DaDataService;
use App\Transformers\Companies\CompanyTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CompaniesController extends Controller {
protected Company $model;
public function __construct(Company $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$filters = collect(json_decode($request->get('filters'), true) ?? []);
$query = $this->model->query()->orderBy('updated_at', 'desc');
if ($val = $filters->get('search')) {
$query->where(function($query) use($val) {
$query->where('name', 'like', "%{$val}%")->orWhere('full_name', 'like', "%{$val}%")->orWhere('inn', 'like', "%{$val}%");
});
}
if ($val = $filters->get('type')) $query->whereHas('types', function($query) use($val) {
$query->where(['name' => $val]);
});
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new CompanyTransformer())->respond();
}
public function show($id): JsonResponse {
$query = ($id === 'main') ? $this->model->where(['is_main' => 1]) : $this->model->byUuid($id);
return fractal($query->firstOrFail(), new CompanyTransformer())->respond();
}
public function store(Request $request): JsonResponse {
$this->validate($request, [
'inn' => 'required',
'name' => 'required',
'address' => 'required',
]);
$model = $this->model->getByData($request->all());
return fractal($model, new CompanyTransformer())->respond(201);
}
public function update(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$this->validate($request, [
'name' => 'required',
'address' => 'required',
]);
$model->update(['name' => $request->get('name')]);
$address = [
'full' => $request->get('address')
];
$model->legalAddress->update($address);
$model->actualAddress->update($address);
foreach(['phone', 'email'] as $key) {
if ($request->has($key)) {
$model->$key->update(['value' => $request->get($key)]);
}
}
return fractal($model->fresh(), new CompanyTransformer())->respond();
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
public function getDataByInn(Request $request, $inn) {
return (new DaDataService($inn))->getCompanyData();
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Api\Companies;
use App\Http\Controllers\Controller;
use App\Models\Companies\Department;
use App\Transformers\Companies\DepartmentTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DepartmentsController extends Controller {
protected Department $model;
public function __construct(Department $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$query = $this->model->query();
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new DepartmentTransformer())->respond();
}
public function show($id): JsonResponse {
$model = $this->model->byUuid($id)->firstOrFail();
return fractal($model, new DepartmentTransformer())->respond();
}
public function my(Request $request): JsonResponse {
return fractal($request->user()->selectedMember->department, new DepartmentTransformer())->respond();
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers\Api\Companies;
use App\Http\Controllers\Controller;
use App\Models\Companies\Company;
use App\Models\Companies\CompanyMember;
use App\Models\Companies\Department;
use App\Models\User;
use App\Services\Filters\FiltersService;
use App\Transformers\Companies\CompanyMemberTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class MembersController extends Controller {
protected CompanyMember $model;
public function __construct(CompanyMember $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : [])->filter(function($val) {return $val;});
$query = $this->model->query();
$service = FiltersService::getService('companyMembers');
$service->applyFilters($query, $filters);
$paginator = $query->paginate(2);
return fractal($paginator, new CompanyMemberTransformer())->respond();
}
public function show($id): JsonResponse {
$model = $this->model->byUuid($id)->firstOrFail();
return fractal($model, new CompanyMemberTransformer())->respond();
}
public function store(Request $request): JsonResponse {
$this->validate($request, [
'name' => 'required',
'position' => 'required',
'company' => 'required|exists:companies,uuid',
]);
$user = User::getByData($request->only('name', 'email', 'phone'));
$company = Company::byUuid($request->get('company'))->first();
$department = Department::byUuid($request->get('department'));
$model = $company->addMember($user, $request->get('position'), $department->id ?? null, $request->get('rank'));
return fractal($model, new CompanyMemberTransformer())->respond(201);
}
public function update(Request $request, $uuid): JsonResponse {
$this->validate($request, [
'name' => 'required'
]);
$model = $this->model->byUuid($uuid)->firstOrFail();
foreach (['name', 'phone'] as $key) {
if ($request->has($key)) {
$model->user->update([$key => $request->get($key)]);
}
}
$model->update($request->all());
return fractal($model->fresh(), new CompanyMemberTransformer())->respond();
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -20,10 +20,10 @@ class EntriesController extends Controller {
public function index(Request $request): JsonResponse { public function index(Request $request): JsonResponse {
$filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : [])->filter(function($val) {return $val;}); $filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : [])->filter(function($val) {return $val;});
$registry = Registry::byUuid($request->get('registry'))->first(); //$registry = Registry::byUuid($request->get('registry'))->first();
$category = Category::byUuid($request->get('category'))->first(); //$category = Category::byUuid($request->get('category'))->first();
$query = $this->model->query()->where(['registry_id' => $registry->id ?? 0]); $query = $this->model->query();
if ($filters->isEmpty()) $query->where(['category_id' => $category->id ?? 0]); //if ($filters->except('registry')->isEmpty()) $query->where(['category_id' => $category->id ?? 0]);
$service = FiltersService::getService('registryEntries'); $service = FiltersService::getService('registryEntries');
$service->applyFilters($query, $filters); $service->applyFilters($query, $filters);
$paginator = $query->paginate(config('app.pagination_limit')); $paginator = $query->paginate(config('app.pagination_limit'));

View File

@ -0,0 +1,162 @@
<?php
namespace App\Models\Advisories;
use App\Models\Asset;
use App\Models\Companies\Company;
use App\Models\Companies\CompanyMember;
use App\Support\HasObjectsTrait;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;
class Advisory extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait, HasObjectsTrait;
protected $dates = [
];
protected $fillable = [
'uuid',
'parent_id',
'logo_id',
'document_id',
'type',
'name',
'title',
'number',
'email',
'phone',
'director_name',
'secretary_name',
'is_main'
];
protected $hidden = [
'id'
];
public function logo(): BelongsTo {
return $this->belongsTo(Asset::class);
}
public function document(): BelongsTo {
return $this->belongsTo(Asset::class);
}
public function advisoryCompanies(): HasMany {
return $this->hasMany(AdvisoryCompany::class);
}
public function companies(): BelongsToMany {
return $this->belongsToMany(Company::class, 'advisory_companies');
}
public function members(): HasMany {
return $this->hasMany(AdvisoryMember::class);
}
public function companyMembers(): BelongsToMany {
return $this->belongsToMany(CompanyMember::class, 'advisory_members')->wherePivotNull('deleted_at');
}
public function parent(): BelongsTo {
return $this->belongsTo(self::class, 'parent_id');
}
public function children(): HasMany {
return $this->hasMany(self::class, 'parent_id');
}
public function siblings(): HasMany {
return $this->hasMany(Advisory::class, 'parent_id', 'parent_id')->where('id', '!=', $this->id);
}
public function getParsedTypeAttribute(): array {
return ['name' => $this->type, 'title' => AdvisoryType::TITLES[$this->type] ?? null];
}
public function getCaptionAttribute(): string {
return "{$this->number} «{$this->title}»";
}
public function getPathTitleAttribute(): string {
$advisory = $this;
$result = [$advisory->number];
while ($advisory = $advisory->parent) $result[] = $advisory->number;
return implode(' / ', $result);
}
/*
public function getSecretaryAttribute() {
return $this->companyMembers()->wherePivot('rank', '=', AdvisoryMemberRank::SECRETARY)->first();
}
*/
public function getSecretaryAssistantsAttribute(): Collection {
return $this->companyMembers()->wherePivot('rank', '=', AdvisoryMemberRank::SECRETARY_ASSISTANT)->get();
}
public function getSecretaryAndAssistantsAttribute(): Collection {
return $this->companyMembers()->wherePivotIn('rank', [AdvisoryMemberRank::SECRETARY, AdvisoryMemberRank::SECRETARY_ASSISTANT])->get();
}
public function getChairmanAttribute() {
return $this->companyMembers()->wherePivot('rank', '=', AdvisoryMemberRank::CHAIRMAN)->first();
}
public function getChairmanVicesAttribute(): Collection {
return $this->companyMembers()->wherePivot('rank', '=', AdvisoryMemberRank::VICE_CHAIRMAN)->get();
}
public function getOrdinaryMembersAttribute(): Collection {
return $this->companyMembers()->wherePivot('rank', '=', AdvisoryMemberRank::ORDINARY)->get();
}
public function setLogo($val) {
$asset = Asset::byUuid($val)->first();
$this->update(['logo_id' => $asset->id ?? null]);
}
public function setDocument($val) {
$asset = Asset::byUuid($val)->first();
$this->update(['document_id' => $asset->id ?? null]);
}
public function addMember(CompanyMember $companyMember, $rank = null): Model {
$member = $this->members()->firstOrCreate(['company_member_id' => $companyMember->id]);
$member->update(['rank' => $rank ?? AdvisoryMemberRank::ORDINARY]);
return $member;
}
public function syncMembers(Collection $companyMembers, $rank, ?Company $company = null) {
$exists = $companyMembers->map(function(CompanyMember $companyMember) use($rank) {
return $this->members()->firstOrCreate(['company_member_id' => $companyMember->id, 'rank' => $rank]);
});
$this->deleteDisappearedMembers($exists, $rank, $company);
}
public function deleteDisappearedMembers(Collection $exists, $rank, ?Company $company) {
$query = $this->members()->where(['rank' => $rank])->whereNotIn('id', $exists->pluck('id')->all());
if ($company && in_array($rank, [AdvisoryMemberRank::ORDINARY, AdvisoryMemberRank::VOTER])) $query->whereHas('companyMember', function($query) use($company) {
$query->where(['company_id' => $company->id]);
});
$query->delete();
}
public static function main() {
return self::query()->where(['is_main' => 1])->first();
}
public static function root() {
return self::query()->where(['parent_id' => 0])->get();
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Models\Advisories;
use App\Models\Companies\Company;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class AdvisoryCompany extends Model {
use UuidScopeTrait, RelationValuesTrait;
protected $dates = [
];
protected $fillable = [
'uuid',
'advisory_id',
'company_id'
];
protected $hidden = [
'id'
];
public function advisory(): BelongsTo {
return $this->belongsTo(Advisory::class);
}
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function advisoryMembers() {
return $this->advisory->members()->whereHas('companyMember', function($query) {
$query->where(['company_id' => $this->company_id]);
});
}
public function companyMembers(): BelongsToMany {
return $this->advisory->companyMembers()->where(['company_id' => $this->company_id]);
}
public function getTitleAttribute(): string {
return "Член {$this->advisory->number} {$this->company->name}";
}
public function getSubtitleAttribute(): string {
return "Член {$this->advisory->number}";
}
public function getVoterAttribute(): ?Model {
return $this->advisoryMembers()->where(['rank' => AdvisoryMemberRank::VOTER])->first();
}
public function getCompanyMembers($rank): BelongsToMany {
return $this->companyMembers()->wherePivot('rank', '=', $rank);
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Models\Advisories;
use App\Models\Companies\CompanyMember;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class AdvisoryMember extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $dates = [
];
protected $fillable = [
'uuid',
'advisory_id',
'company_member_id',
'rank'
];
protected $hidden = [
'id'
];
public function advisory(): BelongsTo {
return $this->belongsTo(Advisory::class);
}
public function companyMember(): BelongsTo {
return $this->belongsTo(CompanyMember::class);
}
public function getTitleAttribute(): string {
$rank = AdvisoryMemberRank::CATEGORIES[$this->rank] ?? 'Член';
return "{$rank} {$this->advisory->number} {$this->companyMember->company->name}";
}
public function getParsedRankAttribute(): array {
return ['name' => AdvisoryMemberRank::NAMES[$this->rank] ?? null, 'title' => AdvisoryMemberRank::TITLES[$this->rank] ?? null, 'level' => $this->rank];
}
public function getAdvisoryCompanyAttribute(): ?Model {
return ($this->advisory && $this->companyMember) ? $this->advisory->advisoryCompanies()->where(['company_id' => $this->companyMember->company_id])->first() : null;
}
public function setRank($rank = null) {
$this->update(['rank' => $rank ?? AdvisoryMemberRank::ORDINARY]);
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace App\Models\Advisories;
class AdvisoryMemberRank {
public const ORDINARY = 0;
public const VOTER = 5;
public const SECRETARY_ASSISTANT = 10;
public const SECRETARY = 15;
public const VICE_CHAIRMAN = 20;
public const CHAIRMAN = 25;
public const TITLES = [
self::ORDINARY => 'Член',
self::VOTER => 'Член с правом голоса',
self::SECRETARY_ASSISTANT => 'Помощник секретаря',
self::SECRETARY => 'Секретарь',
self::VICE_CHAIRMAN => 'Заместитель руководителя',
self::CHAIRMAN => 'Руководитель'
];
public const NAMES = [
self::ORDINARY => 'ordinary',
self::VOTER => 'voter',
self::SECRETARY_ASSISTANT => 'secretary-assistant',
self::SECRETARY => 'secretary',
self::VICE_CHAIRMAN => 'vice-chairman',
self::CHAIRMAN => 'chairman'
];
public const CATEGORIES = [
self::ORDINARY => 'Член',
self::VOTER => 'Член',
self::SECRETARY_ASSISTANT => 'Секретариат',
self::SECRETARY => 'Секретариат',
self::VICE_CHAIRMAN => 'Руководство',
self::CHAIRMAN => 'Руководство'
];
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Models\Advisories;
class AdvisoryType {
public const COMMITTEE = 'committee';
public const WORKGROUP = 'workgroup';
public const TITLES = [
self::COMMITTEE => 'Комитет',
self::WORKGROUP => 'Рабочая группа'
];
}

View File

@ -0,0 +1,57 @@
<?php
namespace App\Models\Companies;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class Address extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $table = 'company_addresses';
protected $dates = [
'deleted_at',
];
protected $fillable = [
'uuid',
'company_id',
'type',
'full',
'postcode',
'country',
'region',
'city',
'district',
'street',
'house',
'block',
'office'
];
protected $hidden = [
];
public static string $TYPE_LEGAL = 'legal';
public static string $TYPE_ACTUAL = 'actual';
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function setFullAddress($val) {
$address = ['full' => $val, 'postcode' => '', 'country' => '', 'region' => '', 'city' => '',
'district' => '', 'street' => '', 'house' => '', 'block' => '', 'office' => ''];
$this->update($address);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Models\Companies;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class BankDetails extends Model {
use HasFactory, UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $table = 'company_bank_details';
protected $dates = [
'deleted_at'
];
protected $fillable = [
'uuid',
'company_id',
'bik',
'bank',
'address',
'checking_account',
'correspondent_account'
];
protected $hidden = [
];
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
}

View File

@ -0,0 +1,220 @@
<?php
namespace App\Models\Companies;
use App\Models\Advisories\AdvisoryCompany;
use App\Models\Asset;
use App\Models\User;
use App\Services\DaDataService;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
class Company extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $dates = [
'tax_registration_date',
'deleted_at'
];
protected $fillable = [
'uuid',
'logo_id',
'name',
'full_name',
'inn',
'kpp',
'ogrn',
'okpo',
'okved',
'okato',
'tax_registration_date',
'is_main'
];
protected $hidden = [
'id',
'deleted_at',
'updated_at',
'pivot'
];
public function logo(): BelongsTo {
return $this->belongsTo(Asset::class);
}
public function types(): HasMany {
return $this->hasMany(CompanyType::class);
}
public function departments(): HasMany {
return $this->hasMany(Department::class);
}
public function members(): HasMany {
return $this->hasMany(CompanyMember::class);
}
public function rootMembers(): HasMany {
return $this->members()->whereNull('department_id');
}
public function management(): HasMany {
return $this->members()->whereIn('status', [CompanyMemberRank::VICE, CompanyMemberRank::CHIEF]);
}
public function vices(): HasMany {
return $this->members()->where(['status' => CompanyMemberRank::VICE]);
}
public function employees(): HasMany {
return $this->members()->where(['status' => CompanyMemberRank::EMPLOYEE]);
}
public function addresses(): HasMany {
return $this->hasMany(Address::class);
}
public function bankDetails(): HasOne {
return $this->hasOne(BankDetails::class);
}
public function contacts(): HasMany {
return $this->hasMany(Contact::class);
}
public function phones(): HasMany {
return $this->contacts()->where(['type' => ContactType::PHONE]);
}
public function emails(): HasMany {
return $this->contacts()->where(['type' => ContactType::EMAIL]);
}
public function advisoryCompanies(): HasMany {
return $this->hasMany(AdvisoryCompany::class);
}
public function scopeByTypes($query, $types) {
return $query->whereHas('types', function($query) use($types) {
$query->whereIn('name', is_array($types) ? $types : [$types]);
});
}
public function getLegalAddressAttribute(): Model {
return $this->addresses()->firstOrCreate(['type' => Address::$TYPE_LEGAL]);
}
public function getActualAddressAttribute(): Model {
return $this->addresses()->firstOrCreate(['type' => Address::$TYPE_ACTUAL]);
}
public function getPhoneAttribute(): Model {
return $this->phones()->firstOrCreate(['type' => ContactType::PHONE]);
}
public function getEmailAttribute(): Model {
return $this->emails()->firstOrCreate(['type' => ContactType::EMAIL]);
}
public function getRootDepartmentAttribute(): Model {
$res = $this->departments()->whereNull('parent_id')->firstOrCreate(['name' => 'root']);
if (!$res->title) $res->update(['title' => 'Дирекция']);
return $res;
}
public function getRepresentativeMemberAttribute() {
return $this->members()->where(['representative' => true])->first();
}
public function getResponsibleMemberAttribute() {
return $this->members()->orderBy('representative', 'desc')->first();
}
public static function getByData($data) {
$result = false;
if (!empty($data['inn'])) {
$result = self::firstOrCreate(['inn' => $data['inn']]);
(new DaDataService($data['inn']))->saveToCompany($result);
if ($val = $data['name'] ?? null) $result->update(['name' => $val, 'full_name' => $val]);
if (($val = $data['address'] ?? null) && $result->legalAddress->full !== $val) $result->setAddress($val);
if ($val = $data['phone'] ?? null) $result->setPhone($val);
if ($val = $data['email'] ?? null) $result->setEmail($val);
if ($val = $data['contacts'] ?? null) $result->setContacts($val);
if ($val = $data['types'] ?? null) $result->setTypes($val);
if ($val = $data['logo'] ?? null) $result->setLogo($val);
if (!$result->name && !is_numeric($result->inn)) $result->update(['name' => $result->inn, 'full_name' => $result->inn]);
}
return $result;
}
public function addMember(User $user, $position, $departmentId = null, $rank = null): Model {
if ($member = $this->members()->where(['user_id' => $user->id, 'position' => $position])->first()) {
if ($departmentId) $member->update(['department_id' => $departmentId]);
if (!is_null($rank)) $member->update(['rank' => $rank]);
} elseif ($member = $this->members()->create(['user_id' => $user->id, 'position' => $position])) {
$member->update(['department_id' => $departmentId ?? $this->rootDepartment->id ?? null, 'rank' => $rank ?? CompanyMemberRank::EMPLOYEE]);
}
return $member;
}
public function isMember(CompanyMember $member): bool {
return $this->members()->where('id', $member->id)->exists();
}
public function findDepartments($search): Collection {
return $this->departments()->where('title', 'like', "%{$search}%")->get();
}
public function findMembers($search): Collection {
return $this->members()->where('position', 'like', "%{$search}%")->orWhereHas('user', function($query) use($search) {
$query->where('name', 'like', "%{$search}%");
})->get();
}
public function setTypes(array $types) {
$exists = collect($types)->map(function($item) {
$name = (is_string($item)) ? $item : $item['id'] ?? null;
return $name ? $this->types()->firstOrCreate(['name' => $name]) : null;
});
$this->types()->whereNotIn('name', $exists->pluck('name')->all())->delete();
}
public function setLogo($val) {
$asset = Asset::byUuid($val)->first();
$this->update(['logo_id' => $asset->id ?? null]);
}
public function setAddress($val) {
$this->legalAddress->setFullAddress($val);
$this->actualAddress->setFullAddress($val);
}
public function setEmail($val): ?Model {
$this->emails()->delete();
return $val ? $this->contacts()->create(['type' => ContactType::EMAIL, 'value' => $val]) : null;
}
public function setPhone($val): ?Model {
$this->phones()->delete();
return $val ? $this->contacts()->create(['type' => ContactType::PHONE, 'value' => $val]) : null;
}
public function setContacts($val) {
$this->contacts()->firstOrCreate(['type' => ContactType::MIXED, 'value' => $val]);
collect(explode(';', $val))->each(function($contact) {
$type = (Str::contains($contact, '@')) ? ContactType::EMAIL : ContactType::PHONE;
$this->contacts()->firstOrCreate(['type' => $type, 'value' => trim($contact)]);
});
}
public function getPermissions(User $user): array {
$result = ['view' => false, 'edit' => false];
if ($user->isAdmin) $result = ['view' => true, 'edit' => true];
elseif ($user->isCompanyMember($this)) {
$result['view'] = true;
if ($this->members()->where(['user_id' => $user->id, 'representative' => 1])->exists()) $result['edit'] = true;
}
return $result;
}
}

View File

@ -0,0 +1,115 @@
<?php
namespace App\Models\Companies;
use App\Models\Advisories\AdvisoryMember;
use App\Models\User;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;
class CompanyMember extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $dates = [
'deleted_at',
];
protected $fillable = [
'uuid',
'user_id',
'company_id',
'department_id',
'rank',
'role',
'position',
'room',
'intercom',
'selected'
];
protected $hidden = [
'id'
];
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function user(): BelongsTo {
return $this->belongsTo(User::class);
}
public function department(): BelongsTo {
return $this->belongsTo(Department::class);
}
public function advisoryMembership(): HasMany {
return $this->hasMany(AdvisoryMember::class);
}
public function getIsMeAttribute(): ?bool {
return ($user = Auth::user()) ? ($user->id === $this->user_id) : null;
}
public function getSubordinatesAttribute() {
$query = $this->department ? $this->department->members() : $this->company->members()->whereNull('department_id');
return $query->where('role', '<', $this->role)->get();
}
public function getSuperiorsAttribute() {
$query = $this->department ? $this->department->members() : $this->company->members()->whereNull('department_id');
return $query->where('role', '>', $this->role)->get();
}
public function getIsChiefAttribute(): bool {
return $this->role === CompanyMemberRank::CHIEF;
}
public function getIsViceAttribute(): bool {
return $this->role === CompanyMemberRank::VICE;
}
public function getIsManagementAttribute(): bool {
return in_array($this->role, [CompanyMemberRank::VICE, CompanyMemberRank::CHIEF]);
}
public function getParsedRankAttribute(): array {
return [
'name' => CompanyMemberRank::NAMES[$this->rank] ?? null,
'title' => CompanyMemberRank::TITLES[$this->rank] ?? null,
'level' => $this->rank
];
}
public function getParsedRoleAttribute(): array {
return ['name' => $this->role, 'title' => CompanyMemberRole::TITLES[$this->role] ?? null];
}
public function isSubordinateFor(User $user): bool {
$members = $user->membership()->where(['company_id' => $this->company_id])->where('rank', '>', CompanyMemberRank::EMPLOYEE)->get();
foreach ($members->all() as $member) {
if ($this->department->isMember($member)) return ($member->rank > $this->rank);
elseif ($member->department->level < $this->department->level) return $member->department->isParentFor($this->department);
}
return false;
}
public function setRank($rank): bool {
if (!empty(CompanyMemberRank::TITLES[$rank])) {
if (($rank === CompanyMemberRank::CHIEF) && ($chief = $this->department->chief)) $chief->setRank(CompanyMemberRank::EMPLOYEE);
return $this->update(['rank' => $rank]);
}
return false;
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Models\Companies;
class CompanyMemberRank {
public const EMPLOYEE = 0;
public const VICE = 5;
public const CHIEF = 10;
public const TITLES = [
self::CHIEF => 'Руководитель структурного подразделения',
self::VICE => 'Заместитель руководителя структурного подразделения',
self::EMPLOYEE => 'Сотрудник структурного подразделения'
];
public const NAMES = [
self::EMPLOYEE => 'employee',
self::VICE => 'vice',
self::CHIEF => 'chief'
];
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Models\Companies;
class CompanyMemberRole {
public const ORDINARY = 'ordinary';
public const MODERATOR = 'moderator';
public const ADMINISTRATOR = 'administrator';
public const TITLES = [
self::ORDINARY => 'Пользователь',
self::MODERATOR => 'Редактор',
self::ADMINISTRATOR => 'Администратор'
];
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Models\Companies;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class CompanyType extends Model {
public const APPLICANT = 'applicant';
public const PRODUCER = 'producer';
public const TITLES = [
self::APPLICANT => 'Заявитель',
self::PRODUCER => 'Изготовитель продукции'
];
protected $dates = [
];
protected $fillable = [
'company_id',
'name'
];
protected $hidden = [
];
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function getTitleAttribute(): ?string {
return self::TITLES[$this->name] ?? null;
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace App\Models\Companies;
use App\Support\RelationValuesTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Contact extends Model {
use RelationValuesTrait;
protected $table = 'company_contacts';
protected $dates = [
];
protected $fillable = [
'company_id',
'type',
'value'
];
protected $hidden = [
];
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function getParsedTypeAttribute(): array {
return ['name' => $this->type, 'title' => ContactType::TITLES[$this->type] ?? null];
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Models\Companies;
class ContactType {
public const PHONE = 'phone';
public const EMAIL = 'email';
public const SITE = 'site';
public const FAX = 'fax';
public const MIXED = 'mixed';
public const TITLES = [
self::PHONE => 'телефон',
self::EMAIL => 'электронная почта',
self::SITE => 'сайт',
self::FAX => 'факс',
self::MIXED => 'смешанное'
];
}

View File

@ -0,0 +1,89 @@
<?php
namespace App\Models\Companies;
use App\Models\User;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Department extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $table = 'company_departments';
protected $dates = [
];
protected $fillable = [
'uuid',
'company_id',
'parent_id',
'name',
'title',
'level'
];
protected $hidden = [
];
public function company(): BelongsTo {
return $this->belongsTo(Company::class);
}
public function parent(): BelongsTo {
return $this->belongsTo(self::class, 'parent_id');
}
public function children(): HasMany {
return $this->hasMany(self::class, 'parent_id');
}
public function members(): HasMany {
return $this->hasMany(CompanyMember::class);
}
public function management(): HasMany {
return $this->members()->whereIn('rank', [CompanyMemberRank::VICE, CompanyMemberRank::CHIEF]);
}
public function vices(): HasMany {
return $this->members()->where(['rank' => CompanyMemberRank::VICE]);
}
public function employees(): HasMany {
return $this->members()->where(['rank' => CompanyMemberRank::EMPLOYEE]);
}
public function getChiefAttribute() {
return $this->members()->where(['rank' => CompanyMemberRank::CHIEF])->first();
}
public function addChildren($name, $title): ?Department {
$result = null;
if (($name = trim($name)) && ($title = trim($title))) {
$result = $this->company->departments()->firstOrCreate(['name' => $name]);
$result->update(['title' => $title, 'parent_id' => $this->id, 'level' => ++$this->level]);
}
return $result;
}
public function addMember(User $user, $position = null): Model {
return $this->members()->firstOrCreate(['company_id' => $this->company_id, 'user_id' => $user->id, 'position' => $position]);
}
public function isMember(CompanyMember $member): bool {
return $this->members()->where(['id' => $member->id])->exists();
}
public function isParentFor(Department $department): bool {
while ($parent = $department->parent) {
if ($parent->id === $this->id) return true;
$department = $department->parent;
}
return false;
}
}

View File

@ -178,9 +178,9 @@ class Field extends Model {
public function applyOrder(Builder $query, $dir) { public function applyOrder(Builder $query, $dir) {
if ($table = FieldType::TABLES[$this->type] ?? null) { if ($table = FieldType::TABLES[$this->type] ?? null) {
$query->leftJoin("{$table} as {$this->name}", function(JoinClause $join) use($table) { $query->leftJoin("{$table} as prop-{$this->name}", function(JoinClause $join) use($table) {
$join->on('objects.id', '=', "{$this->name}.object_id"); $join->on('objects.id', '=', "prop-{$this->name}.object_id");
})->where(["{$this->name}.field_id" => $this->id])->orderBy("{$this->name}.value", $dir); })->where(["prop-{$this->name}.field_id" => $this->id])->orderBy("prop-{$this->name}.value", $dir);
} }
} }

View File

@ -11,6 +11,7 @@ use App\Models\Objects\Values\IntegerValue;
use App\Models\Objects\Values\RelationValue; use App\Models\Objects\Values\RelationValue;
use App\Models\Objects\Values\StringValue; use App\Models\Objects\Values\StringValue;
use App\Models\Objects\Values\TextValue; use App\Models\Objects\Values\TextValue;
use App\Models\Registries\Entry;
use App\Models\User; use App\Models\User;
use App\Support\UuidScopeTrait; use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
@ -41,6 +42,10 @@ class NirObject extends Model {
]; ];
public function entries(): MorphToMany {
return $this->morphedByMany(Entry::class, 'objectable');
}
public function objects(): MorphToMany { public function objects(): MorphToMany {
return $this->morphToMany(NirObject::class, 'objectable'); return $this->morphToMany(NirObject::class, 'objectable');
} }

View File

@ -6,10 +6,12 @@ class PageType {
public const CONTENT = 'content'; public const CONTENT = 'content';
public const PUBLICATIONS = 'publications'; public const PUBLICATIONS = 'publications';
public const REGISTRY = 'registry'; public const REGISTRY = 'registry';
public const TK_STRUCTURE = 'tk-structure';
public const TITLES = [ public const TITLES = [
self::CONTENT => 'Контентная страница', self::CONTENT => 'Контентная страница',
self::PUBLICATIONS => 'Страница публикаций', self::PUBLICATIONS => 'Страница публикаций',
self::REGISTRY => 'Страница реестра' self::REGISTRY => 'Страница реестра',
self::TK_STRUCTURE => 'Структура ТК'
]; ];
} }

View File

@ -6,6 +6,7 @@ use App\Models\Asset;
use App\Support\HasObjectsTrait; use App\Support\HasObjectsTrait;
use App\Support\RelationValuesTrait; use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait; use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\MorphToMany;
@ -56,10 +57,54 @@ class Entry extends Model {
} }
public function operations(): MorphToMany { public function operations(): MorphToMany {
return $this->objectsByGroup('operations')->reorder()->applyOrders(['order-date' => 'desc']); return $this->objectsByGroup('operations');
} }
public function scopeByStates($query, $states) {
$query->where(function($query) use($states) {
collect($states)->each(function($state) use($query) {
$query->orWhere(function($query) use($state) {
$query->$state();
});
});
});
}
public function scopeAwaiting($query) {
$query->where('active_since', '>', now());
}
public function scopeActive($query) {
$query->where('active_since', '<=', now())->where(function($query) {
$query->whereNull('active_till')->orWhere('active_till', '>', now());
})->notCancelled()->notSuspended();
}
public function scopeExpired($query) {
$query->where('active_till', '<=', now());
}
public function scopeSuspended($query) {
$query->where('suspended_since', '<=', now())->where(function($query) {
$query->whereNull('suspended_till')->orWhere('suspended_till', '>', now());
})->notCancelled();
}
public function scopeNotSuspended($query) {
$query->where(function($query) {
$query->whereNull('suspended_since')->orWhere('suspended_since', '>', now());
})->where(function($query) {
$query->whereNull('suspended_till')->orWhere('suspended_till', '<', now());
});
}
public function scopeCancelled($query) {
$query->where('cancelled_at', '<=', now());
}
public function scopeNotCancelled($query) {
$query->where(function($query) {
$query->whereNull('cancelled_at')->orWhere('cancelled_at', '>', now());
});
}
public function getPropertiesAttribute(): ?Model { public function getPropertiesAttribute(): ?Model {
return ($type = $this->registry->parsedType['options']['properties'] ?? null) ? $this->getObject($type, 'properties') : null; return ($type = $this->registry->parsedType['options']['properties'] ?? null) ? $this->getObject($type, 'properties') : null;
} }
@ -76,5 +121,12 @@ class Entry extends Model {
} }
public function sortOperations() {
$this->operations()->reorder()->applyOrders(['order-date' => 'desc'])->get()->each(function($operation, $ord) {
$this->objects()->updateExistingPivot($operation, ['ord' => $ord]);
});
}
} }

View File

@ -4,11 +4,17 @@ namespace App\Models\Registries;
class RegistryType { class RegistryType {
public const SIMPLE = 'simple'; public const SIMPLE = 'simple';
public const CATEGORIZED = 'categorized';
public const RULESET = 'ruleset'; public const RULESET = 'ruleset';
public const LABORATORIES = 'laboratories'; public const LABORATORIES = 'laboratories';
public const CERTIFIERS = 'certifiers'; public const CERTIFIERS = 'certifiers';
public const EXPERTS = 'experts'; public const EXPERTS = 'experts';
public const CERTIFICATES = 'certificates'; public const CERTIFICATES = 'certificates';
public const COMPANIES = 'companies';
public const DEVELOPMENTS = 'developments';
public const DISCUSSIONS = 'discussions';
public const RESEARCHES = 'researches';
public const TECHNICAL_CERTIFICATES = 'technical-certificates';
public const TITLES = [ public const TITLES = [
self::SIMPLE => 'Простой реестр', self::SIMPLE => 'Простой реестр',
@ -16,15 +22,26 @@ class RegistryType {
self::LABORATORIES => 'Реестр испытательных лабораторий', self::LABORATORIES => 'Реестр испытательных лабораторий',
self::CERTIFIERS => 'Реестр органов по сертификации', self::CERTIFIERS => 'Реестр органов по сертификации',
self::EXPERTS => 'Реестр экспертов', self::EXPERTS => 'Реестр экспертов',
self::CERTIFICATES => 'Реестр сертификатов соответствия' self::CERTIFICATES => 'Реестр сертификатов соответствия',
self::COMPANIES => 'Реестр организаций',
self::DEVELOPMENTS => 'Реестр планов разработки',
self::DISCUSSIONS => 'Реестр публичных обсуждений',
self::RESEARCHES => 'Реестр исследований',
self::TECHNICAL_CERTIFICATES => 'Реестр технических свидетельств'
]; ];
public const OPTIONS = [ public const OPTIONS = [
self::SIMPLE => [], self::SIMPLE => [],
self::CATEGORIZED => ['categories' => true],
self::RULESET => ['categories' => true, 'operations' => 'entry-operation-ruleset', 'states' => true], self::RULESET => ['categories' => true, 'operations' => 'entry-operation-ruleset', 'states' => true],
self::LABORATORIES => ['properties' => 'entry-properties-laboratory', 'states' => true], self::LABORATORIES => ['properties' => 'entry-properties-laboratory', 'states' => true],
self::CERTIFIERS => ['properties' => 'entry-properties-certifier', 'states' => true], self::CERTIFIERS => ['properties' => 'entry-properties-certifier', 'states' => true],
self::EXPERTS => ['categories' => true, 'properties' => 'entry-properties-expert', 'states' => true], self::EXPERTS => ['categories' => true, 'states' => true],
self::CERTIFICATES => ['categories' => true, 'properties' => 'entry-properties-certificate', 'states' => true] self::CERTIFICATES => ['categories' => true, 'properties' => 'entry-properties-certificate', 'states' => true],
self::COMPANIES => ['properties' => 'entry-properties-company'],
self::DEVELOPMENTS => ['categorized' => true, 'properties' => 'entry-properties-development'],
self::DISCUSSIONS => ['properties' => 'entry-properties-discussion'],
self::RESEARCHES => ['categories' => true, 'properties' => 'entry-properties-research'],
self::TECHNICAL_CERTIFICATES => ['properties' => 'entry-properties-technical-certificate', 'states' => true]
]; ];
} }

View File

@ -70,6 +70,9 @@ class User extends Authenticatable {
return $this->hasRole('Administrator'); return $this->hasRole('Administrator');
} }
public function getIsPrivilegedAttribute() {
return $this->isAdmin;
}
public static function getByData($data, $triggerEvent = false) { public static function getByData($data, $triggerEvent = false) {

View File

@ -2,7 +2,16 @@
namespace App\Providers; namespace App\Providers;
use App\Models\Advisories\Advisory;
use App\Models\Advisories\AdvisoryCompany;
use App\Models\Advisories\AdvisoryMember;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Companies\Address;
use App\Models\Companies\BankDetails;
use App\Models\Companies\Company;
use App\Models\Companies\CompanyMember;
use App\Models\Companies\Contact;
use App\Models\Companies\Department;
use App\Models\Dictionaries\Dictionary; use App\Models\Dictionaries\Dictionary;
use App\Models\Dictionaries\DictionaryItem; use App\Models\Dictionaries\DictionaryItem;
use App\Models\Objects\Field; use App\Models\Objects\Field;
@ -64,7 +73,18 @@ class AppServiceProvider extends ServiceProvider
'registry' => Registry::class, 'registry' => Registry::class,
'registry-category' => Category::class, 'registry-category' => Category::class,
'registry-entry' => Entry::class 'registry-entry' => Entry::class,
'company' => Company::class,
'company-address' => Address::class,
'company-member' => CompanyMember::class,
'company-contact' => Contact::class,
'company-department' => Department::class,
'bank-details' => BankDetails::class,
'advisory' => Advisory::class,
'advisory-member' => AdvisoryMember::class,
'advisory-company' => AdvisoryCompany::class
]); ]);
} }
} }

View File

@ -0,0 +1,9 @@
<?php
namespace App\Services\Filters\Companies;
class CompanyFiltersServices {
public static array $services = [
'companyMembers' => CompanyMemberFilters::class
];
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Services\Filters\Companies;
use App\Models\Companies\CompanyMember;
use App\Services\Filters\FiltersService;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
class CompanyMemberFilters extends FiltersService {
public function get(Collection $filters): array {
$groups = [
[
'name' => 'common',
'title' => 'Общие параметры',
'fields' => $this->nativeFields($filters)
]
];
$query = CompanyMember::query();
$this->applyFilters($query, $filters);
return ['groups' => ['data' => $groups], 'total' => $query->count()];
}
public function nativeFields(Collection $filters): array {
return [
];
}
public function applyFilters(Builder $query, Collection $filters) {
$this->applyNativeFilters($query, $filters);
$this->applyPermissionsFilters($query);
}
public function applyNativeFilters(Builder $query, Collection $filters) {
$filters->each(function($value, $prop) use($query) {
$this->applyNativeFilter($query, $prop, $value);
});
}
public function applyNativeFilter(Builder $query, $prop, $value) {
if ($value) {
if ($prop === 'search') $this->applySearchFilter($query, $value, ['position', 'room', 'intercom', ['user' => ['name', 'email', 'phone']], ['department' => ['title']]]);
elseif ($prop === 'company') $this->applyCompanyFilter($query, $value);
}
}
public function applyCompanyFilter(Builder $query, $value) {
$query->whereHas('company', function($query) use($value) {
($value === 'main') ? $query->where(['is_main' => 1]) : $query->whereIn('uuid', is_array($value) ? $value : [$value]);
});
}
public function applyPermissionsFilters(Builder $query) {
}
}

View File

@ -2,6 +2,7 @@
namespace App\Services\Filters; namespace App\Services\Filters;
use App\Services\Filters\Companies\CompanyFiltersServices;
use App\Services\Filters\Registries\RegistryFiltersServices; use App\Services\Filters\Registries\RegistryFiltersServices;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@ -9,7 +10,8 @@ use Illuminate\Support\Facades\Date;
class FiltersService { class FiltersService {
public static array $services = [ public static array $services = [
RegistryFiltersServices::class RegistryFiltersServices::class,
CompanyFiltersServices::class
]; ];

View File

@ -3,17 +3,30 @@
namespace App\Services\Filters\Registries; namespace App\Services\Filters\Registries;
use App\Models\Dictionaries\Dictionary; use App\Models\Dictionaries\Dictionary;
use App\Models\Dictionaries\DictionaryItem; use App\Models\Objects\Field;
use App\Models\Objects\FieldType; use App\Models\Objects\FieldType;
use App\Models\Objects\ObjectType;
use App\Models\Registries\Category;
use App\Models\Registries\Entry; use App\Models\Registries\Entry;
use App\Models\Registries\EntryState;
use App\Models\Registries\Registry;
use App\Services\Filters\FiltersService; use App\Services\Filters\FiltersService;
use App\Transformers\Dictionaries\DictionaryItemTransformer; use App\Transformers\Dictionaries\DictionaryItemTransformer;
use App\Transformers\Objects\FieldTransformer;
use App\Transformers\Objects\ObjectTypeTransformer;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Spatie\Fractal\Fractal; use Spatie\Fractal\Fractal;
class EntryFilters extends FiltersService { class EntryFilters extends FiltersService {
public string $objectRelationName = 'entries';
public function get(Collection $filters): array { public function get(Collection $filters): array {
$registry = Registry::byUuid($filters->get('registry'))->firstOrFail();
$types = [];
if ($v = ObjectType::byName($registry->options['operations'] ?? null)->first()) $types[] = $v->uuid;
if ($v = ObjectType::byName($registry->options['properties'] ?? null)->first()) $types[] = $v->uuid;
if ($types) $filters->put('types', $types);
$groups = [ $groups = [
[ [
'name' => 'common', 'name' => 'common',
@ -21,29 +34,43 @@ class EntryFilters extends FiltersService {
'fields' => $this->nativeFields($filters) 'fields' => $this->nativeFields($filters)
] ]
]; ];
if ($types) $groups[] = ['name' => 'properties', 'title' => 'Дополнительные характеристики', 'fields' => $this->objectFields($filters)];
//if ($v = $registry->options['properties'] ?? null) $groups[] = ['name' => 'properties', 'title' => 'Особые характеристики', 'fields' => $this->propertiesFields($v, $filters)];
$query = Entry::query(); $query = Entry::query();
$this->applyFilters($query, $filters); $this->applyFilters($query, $filters->put('fake', 'zzz'));
return ['groups' => ['data' => $groups], 'total' => $query->count()]; return ['groups' => ['data' => $groups], 'total' => $query->count()];
} }
public function nativeFields(Collection $filters): array { public function nativeFields(Collection $filters): array {
return [ return [
[ [
'name' => 'listings', 'name' => 'registry',
'title' => 'Вхождение в перечень ПП', 'title' => 'Реестр',
'type' => FieldType::STRING,
'hidden' => true,
'value' => $filters->get('registry')
],
[
'name' => 'types',
'title' => 'Типы связанных объектов',
'type' => FieldType::RELATION, 'type' => FieldType::RELATION,
'represented' => $this->getListings($filters), 'hidden' => true,
'value' => ($val = $filters->get('listings')) ? fractal(DictionaryItem::byUuids($val)->get(), new DictionaryItemTransformer()) : null 'value' => $filters->get('types') ? fractal(ObjectType::whereIn('uuid', $filters->get('types'))->get(), new ObjectTypeTransformer()) : null
] ],
[
'name' => 'state',
'title' => 'Статус',
'type' => FieldType::RELATION,
'represented' => $this->getRelationItems(EntryState::TITLES),
'value' => $this->getRelationValue($filters->get('state'), EntryState::TITLES)
],
]; ];
} }
public function operationsFields(Collection $filters): array { public function objectFields(Collection $filters): array {
return []; return fractal(Field::query()->whereHas('groups.objectType', function($query) use($filters) {
} $query->whereIn('uuid', $filters->get('types') ?? []);
})->whereIn('type', [FieldType::RELATION, FieldType::DATE, FieldType::STRING])->get(), new FieldTransformer($filters->all(), $this))->toArray();
public function propertiesFilters(Collection $filters): array {
return [];
} }
@ -53,7 +80,9 @@ class EntryFilters extends FiltersService {
public function applyFilters(Builder $query, Collection $filters) { public function applyFilters(Builder $query, Collection $filters) {
$this->applyCategoryFilter($query, $filters);
$this->applyNativeFilters($query, $filters); $this->applyNativeFilters($query, $filters);
$this->applyObjectFilters($query, $filters);
$this->applyPermissionsFilters($query); $this->applyPermissionsFilters($query);
} }
@ -66,14 +95,37 @@ class EntryFilters extends FiltersService {
public function applyNativeFilter(Builder $query, $prop, $value) { public function applyNativeFilter(Builder $query, $prop, $value) {
if ($value) { if ($value) {
if ($prop === 'search') $this->applySearchFilter($query, $value, ['name', 'number']); if ($prop === 'search') $this->applySearchFilter($query, $value, ['name', 'number']);
elseif ($prop === 'registry') $this->applyRelationFilter($query, 'registry', $value);
elseif ($prop === 'state') $query->byStates($value);
} }
} }
public function applyObjectFilters(Builder $query, Collection $filters) {
if ($filters->get('types') && !$this->isFiltersEmpty($filters, true)) $query->whereHas('objects', function($query) use($filters) {
Field::applyFilters($query, $filters);
});
}
public function applyCategoryFilter(Builder $query, Collection $filters) {
if ($this->isFiltersEmpty($filters)) $query->where(['category_id' => Category::byUuid($filters->get('category'))->first()->id ?? 0]);
}
public function applyPermissionsFilters(Builder $query) { public function applyPermissionsFilters(Builder $query) {
} }
public function isFiltersEmpty(Collection $filters, $exceptNative = false): bool {
if ($exceptNative) $filters = $filters->filter(function($val, $prop) {
return Field::byName($prop)->exists();
});
return $filters->except('registry', 'category', 'types', 'state')->filter(function($val) {
return collect($val)->filter(function($val) {return $val;})->isNotEmpty();
})->isEmpty();
}
} }

View File

@ -0,0 +1,53 @@
<?php
namespace App\Services\Forms\Advisories;
use App\Models\Advisories\Advisory;
use App\Models\Companies\Company;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Advisories\AdvisoryTransformer;
use App\Transformers\Companies\CompanyTransformer;
use Illuminate\Http\JsonResponse;
class AdvisoryCompaniesForms extends FormsService {
public array $formTitles = ['create' => 'Добавление организаций-участников', 'update' => 'Редактирование организаций-участников'];
public function form(?string $id = null, array $data = []): array {
$model = Advisory::byUuid($id)->first();
$groups = [
['name' => 'common', 'fields' => $this->commonGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'companies',
'title' => 'Организации-участники',
'type' => FieldType::RELATION,
'multiple' => true,
'options' => fractal(Company::all(), new CompanyTransformer()),
'value' => $model ? fractal($model->companies, new CompanyTransformer()) : null
]
];
return ['data' => $fields];
}
public function store(array $data): ?JsonResponse {
}
public function update(string $id, array $data): ?JsonResponse {
$model = Advisory::byUuid($id)->firstOrFail();
$exists = Company::byUuids($data['companies'] ?? [])->get()->map(function($company) use($model) {
return $model->advisoryCompanies()->firstOrCreate(['company_id' => $company->id]);
});
$model->advisoryCompanies()->whereNotIn('id', $exists->pluck('id')->all())->delete();
return fractal($model->fresh(), new AdvisoryTransformer())->respond();
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Services\Forms\Advisories;
use App\Models\Advisories\AdvisoryCompany;
use App\Models\Advisories\AdvisoryMemberRank;
use App\Models\Companies\CompanyMember;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Advisories\AdvisoryCompanyTransformer;
use App\Transformers\Companies\CompanyMemberTransformer;
use Illuminate\Http\JsonResponse;
class AdvisoryCompanyMembersForms extends FormsService {
public array $formTitles = ['create' => '', 'update' => 'Добавление сотрудников-участников'];
public function form(?string $id = null, array $data = []): array {
$model = AdvisoryCompany::byUuid($id)->first();
$groups = [
['name' => 'common', 'fields' => $this->commonGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?AdvisoryCompany $model): array {
$fields = [
[
'name' => 'voter',
'title' => 'Сотрудник с правом голоса',
'type' => FieldType::RELATION,
'required' => true,
'options' => $model ? fractal($model->company->members, new CompanyMemberTransformer()) : null,
'value' => $model ? fractal($model->getCompanyMembers(AdvisoryMemberRank::VOTER)->get(), new CompanyMemberTransformer()) : null
],
[
'name' => 'members',
'title' => 'Сотрудники',
'type' => FieldType::RELATION,
'multiple' => true,
'options' => $model ? fractal($model->company->members, new CompanyMemberTransformer()) : null,
'value' => $model ? fractal($model->getCompanyMembers(AdvisoryMemberRank::ORDINARY)->get(), new CompanyMemberTransformer()) : null
]
];
return ['data' => $fields];
}
public function store(array $data): void {
}
public function update(string $id, array $data): ?JsonResponse {
$model = AdvisoryCompany::byUuid($id)->firstOrFail();
$voter = $data['voter'] ?? null;
$members = collect($data['members'] ?? [])->filter(function($member_id) use($voter) {
return $member_id !== $voter;
})->all();
$model->advisory->syncMembers(CompanyMember::byUuids($members)->get(), AdvisoryMemberRank::ORDINARY, $model->company);
$model->advisory->syncMembers(CompanyMember::byUuids([$voter])->get(), AdvisoryMemberRank::VOTER, $model->company);
return fractal($model->fresh(), new AdvisoryCompanyTransformer())->respond();
}
}

View File

@ -0,0 +1,188 @@
<?php
namespace App\Services\Forms\Advisories;
use App\Models\Advisories\Advisory;
use App\Models\Advisories\AdvisoryMemberRank;
use App\Models\Advisories\AdvisoryType;
use App\Models\Companies\CompanyMember;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Advisories\AdvisoryTransformer;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Companies\CompanyMemberTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str;
class AdvisoryForms extends FormsService {
public array $formTitles = ['create' => 'Добавление подразделения', 'update' => 'Редактирование подразделения'];
public function form(?string $id = null, array $data = []): array {
$model = Advisory::byUuid($id)->first();
return [
'title' => $this->formTitle($model),
'frames' => [
['title' => 'Общие сведения', 'groups' => $this->form1Groups($model)],
// ['title' => 'Руководство', 'groups' => $this->form2Groups($model)]
]
];
}
public function form1Groups(?Advisory $model): array {
$groups = [
['name' => 'common', 'title' => '', 'fields' => $this->commonGroupFields($model)]
];
return ['data' => $groups];
}
public function form2Groups(?Advisory $model): array {
$groups = [
['name' => 'management', 'title' => '', 'fields' => $this->managementGroupFields($model)]
];
return ['data' => $groups];
}
public function commonGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'type',
'title' => 'Тип подразделения',
'type' => FieldType::RELATION,
'required' => true,
'appearance' => 'radio',
'options' => $this->getRelationItems(AdvisoryType::TITLES),
'value' => $this->getRelationValue(AdvisoryType::TITLES, $model->type ?? null)
],
[
'name' => 'title',
'title' => 'Название подразделения',
'type' => FieldType::TEXT,
'required' => true,
'value' => $model->title ?? null
],
[
'name' => 'number',
'title' => 'Обозначение подразделения',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->number ?? null
],
[
'name' => 'email',
'title' => 'Электронная почта',
'type' => FieldType::STRING,
'value' => $model->email ?? null
],
[
'name' => 'phone',
'title' => 'Телефон',
'type' => FieldType::STRING,
'value' => $model->phone ?? null
],
[
'name' => 'director_name',
'title' => 'Руководитель',
'type' => FieldType::STRING,
'value' => $model->director_name ?? null
],
[
'name' => 'secretary_name',
'title' => 'Секретарь',
'type' => FieldType::STRING,
'value' => $model->secretary_name ?? null
],
[
'name' => 'document',
'title' => 'Списочный состав',
'type' => FieldType::DOCUMENT,
'value' => ($model->document ?? null) ? fractal($model->document, new AssetTransformer()) : null
],
/*
[
'name' => 'logo',
'title' => 'Логотип',
'type' => FieldType::IMAGE,
'value' => ($model->logo ?? null) ? fractal($model->logo, new AssetTransformer()) : null
]
*/
];
return ['data' => $fields];
}
public function managementGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'chairman',
'title' => 'Руководитель',
'type' => FieldType::RELATION,
//'required' => true,
'options' => fractal(CompanyMember::all(), new CompanyMemberTransformer()),
'value' => ($val = $model->chairman ?? null) ? fractal($val, new CompanyMemberTransformer()) : null
],
[
'name' => 'vices',
'title' => 'Заместители',
'type' => FieldType::RELATION,
'multiple' => true,
'options' => fractal(CompanyMember::all(), new CompanyMemberTransformer()),
'value' => $model ? fractal($model->chairmanVices, new CompanyMemberTransformer()) : null
],
[
'name' => 'secretary',
'title' => 'Ответственный секретарь',
'type' => FieldType::RELATION,
//'required' => true,
'options' => fractal(CompanyMember::all(), new CompanyMemberTransformer()),
'value' => ($val = $model->secretary ?? null) ? fractal($val, new CompanyMemberTransformer()) : null
],
[
'name' => 'assistants',
'title' => 'Помощники секретаря',
'type' => FieldType::RELATION,
'multiple' => true,
'options' => fractal(CompanyMember::all(), new CompanyMemberTransformer()),
'value' => $model ? fractal($model->secretaryAssistants, new CompanyMemberTransformer()) : null
]
];
return ['data' => $fields];
}
public function store(array $data): JsonResponse {
$parent = Advisory::byUuid($data['parent'] ?? null)->firstOrFail();
$model = $parent->children()->create();
$this->updateData($model, $data);
return fractal($model, new AdvisoryTransformer())->respond(201);
}
public function update(string $id, array $data): JsonResponse {
$model = Advisory::byUuid($id)->firstOrFail();
$this->updateData($model, $data);
return fractal($model->fresh(), new AdvisoryTransformer())->respond();
}
public function updateData(Advisory $model, $data) {
$data['name'] = $this->makeName($data);
$model->update(collect($data)->only('type', 'name', 'title', 'number', 'email', 'phone', 'director_name', 'secretary_name')->all());
$this->syncMembers($model, $data);
$model->setLogo($data['logo'] ?? null);
$model->setDocument($data['document'] ?? null);
}
public function makeName($data): string {
$val = $data['number'] ?? $data['title'] ?? '';
return Str::lower(Str::replace(' ', '', Str::transliterate($val)));
}
public function syncMembers(Advisory $model, $data) {
$ranksByFields = ['chairman' => AdvisoryMemberRank::CHAIRMAN, 'vices' => AdvisoryMemberRank::VICE_CHAIRMAN,
'secretary' => AdvisoryMemberRank::SECRETARY, 'assistants' => AdvisoryMemberRank::SECRETARY_ASSISTANT, 'ordinary' => AdvisoryMemberRank::ORDINARY];
collect($ranksByFields)->each(function($rank, $field) use($model, $data) {
if (array_key_exists($field, $data)) $model->syncMembers(CompanyMember::byUuids($data[$field])->get(), $rank);
});
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Services\Forms\Advisories;
class AdvisoryFormsServices {
public static array $services = [
'advisoryCompanies' => AdvisoryCompaniesForms::class,
'advisoryCompanyMembers' => AdvisoryCompanyMembersForms::class,
'advisory' => AdvisoryForms::class,
'advisoryInfo' => AdvisoryInfoForms::class,
'advisoryGroup' => AdvisoryGroupForms::class
];
}

View File

@ -0,0 +1,71 @@
<?php
namespace App\Services\Forms\Advisories;
use App\Models\Advisories\Advisory;
use App\Models\Advisories\AdvisoryMemberRank;
use App\Models\Advisories\AdvisoryType;
use App\Models\Companies\CompanyMember;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Advisories\AdvisoryTransformer;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Companies\CompanyMemberTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str;
class AdvisoryGroupForms extends FormsService {
public array $formTitles = ['create' => 'Добавление направления', 'update' => 'Редактирование направления'];
public function form(?string $id = null, array $data = []): array {
$model = Advisory::byUuid($id)->first();
return [
'title' => $this->formTitle($model),
'frames' => [
['title' => 'Общие сведения', 'groups' => $this->form1Groups($model)]
]
];
}
public function form1Groups(?Advisory $model): array {
$groups = [
['name' => 'common', 'title' => '', 'fields' => $this->commonGroupFields($model)]
];
return ['data' => $groups];
}
public function commonGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'title',
'title' => 'Название подразделения',
'type' => FieldType::TEXT,
'required' => true,
'value' => $model->title ?? null
]
];
return ['data' => $fields];
}
public function store(array $data): JsonResponse {
$parent = Advisory::byUuid($data['parent'] ?? null)->firstOrFail();
$data['name'] = $this->makeName($data);
$model = $parent->children()->create(collect($data)->only('name', 'title')->all());
$model->setLogo($data['logo'] ?? null);
return fractal($model, new AdvisoryTransformer())->respond(201);
}
public function update(string $id, array $data): JsonResponse {
$model = Advisory::byUuid($id)->firstOrFail();
$data['name'] = $this->makeName($data);
$model->update(collect($data)->only('name', 'title')->all());
$model->setLogo($data['logo'] ?? null);
return fractal($model->fresh(), new AdvisoryTransformer())->respond();
}
public function makeName($data): string {
return Str::slug(Str::transliterate($data['title'] ?? ''));
}
}

View File

@ -0,0 +1,92 @@
<?php
namespace App\Services\Forms\Advisories;
use App\Models\Advisories\Advisory;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Companies\CompanyMemberTransformer;
class AdvisoryInfoForms extends FormsService {
public array $formTitles = ['create' => '', 'update' => 'Профиль подкомитета'];
public function form(?string $id = null, array $data = []): array {
$model = Advisory::byUuid($id)->first();
$groups = [
['name' => 'contacts', 'title' => 'Контакты', 'fields' => $this->contactsGroupFields($model)],
['name' => 'management', 'title' => 'Руководители и секретариат', 'fields' => $this->managementGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'btnSaveHidden' => true, 'data' => $groups];
}
public function contactsGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'caption',
'title' => 'Наименование',
'type' => FieldType::STRING,
'readonly' => true,
'value' => $model->caption ?? null
],
[
'name' => 'email',
'title' => 'Электронная почта',
'type' => FieldType::STRING,
'readonly' => true,
'value' => $model->email ?? null
],
[
'name' => 'phone',
'title' => 'Телефон',
'type' => FieldType::STRING,
'readonly' => true,
'value' => $model->phone ?? null
]
];
return ['data' => $fields];
}
public function managementGroupFields(?Advisory $model): array {
$fields = [
[
'name' => 'chairman',
'title' => 'Руководитель',
'type' => FieldType::RELATION,
'readonly' => true,
'value' => ($val = $model->chairman ?? null) ? fractal($val, new CompanyMemberTransformer()) : null
],
[
'name' => 'vices',
'title' => 'Заместители',
'type' => FieldType::RELATION,
'readonly' => true,
'value' => $model ? fractal($model->chairmanVices, new CompanyMemberTransformer()) : null
],
[
'name' => 'secretary',
'title' => 'Ответственный секретарь',
'type' => FieldType::RELATION,
'readonly' => true,
'value' => ($val = $model->secretary ?? null) ? fractal($val, new CompanyMemberTransformer()) : null
],
[
'name' => 'assistants',
'title' => 'Помощники секретаря',
'type' => FieldType::RELATION,
'readonly' => true,
'value' => $model ? fractal($model->secretaryAssistants, new CompanyMemberTransformer()) : null
]
];
return ['data' => $fields];
}
public function store(array $data): void {
}
public function update(string $id, array $data): void {
}
}

View File

@ -0,0 +1,91 @@
<?php
namespace App\Services\Forms\Companies;
use App\Models\Companies\Company;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Companies\CompanyTransformer;
use Illuminate\Http\JsonResponse;
class CompanyForms extends FormsService {
public array $formTitles = ['create' => 'Создание новой организации', 'update' => 'Редактирование организации'];
public function form(?string $id = null, array $data = []): array {
$model = Company::byUuid($id)->first();
$groups = [
['name' => 'common', 'fields' => $this->commonGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?Company $model): array {
$fields = [
[
'name' => 'inn',
'title' => 'ИНН',
'type' => FieldType::STRING,
'required' => true,
'readonly' => !!$model,
'value' => $model->inn ?? null
],
[
'name' => 'name',
'title' => 'Наименование организации',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->name ?? null
],
[
'name' => 'address',
'title' => 'Юридический адрес',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->legalAddress->full ?? null
],
[
'name' => 'phone',
'title' => 'Телефон',
'type' => FieldType::STRING,
'required' => false,
'value' => $model->phone->value ?? null
],
[
'name' => 'email',
'title' => 'Email',
'type' => FieldType::STRING,
'required' => false,
'value' => $model->email->value ?? null
],
[
'name' => 'logo',
'title' => 'Логотип',
'type' => FieldType::IMAGE,
'value' => ($model->logo ?? null) ? fractal($model->logo, new AssetTransformer()) : null
]
];
return ['data' => $fields];
}
public function store(array $data): ?JsonResponse {
if (!empty($data['inn']) && ($model = Company::getByData($data))) {
return fractal($model, new CompanyTransformer())->respond();
}
}
public function update(string $id, array $data): ?JsonResponse {
$model = Company::byUuid($id)->firstOrFail();
if ($val = trim($data['name'] ?? null)) $model->update(['name' => $val]);
if ($val = trim($data['address'] ?? null)) $model->setAddress($val);
if ($val = trim($data['phone'] ?? null)) $model->setPhone($val);
if ($val = trim($data['email'] ?? null)) $model->setEmail($val);
$model->setTypes($data['types'] ?? []);
$model->setLogo($data['logo'] ?? null);
return fractal($model->fresh(), new CompanyTransformer())->respond();
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace App\Services\Forms\Companies;
class CompanyFormsServices {
public static array $services = [
'company' => CompanyForms::class,
'companyMember' => CompanyMemberForms::class,
'department' => DepartmentForms::class
];
}

View File

@ -0,0 +1,147 @@
<?php
namespace App\Services\Forms\Companies;
use App\Models\Companies\CompanyMember;
use App\Models\Companies\CompanyMemberRank;
use App\Models\Companies\CompanyMemberRole;
use App\Models\Companies\Department;
use App\Models\Objects\FieldType;
use App\Models\Pages\Page;
use App\Models\User;
use App\Services\Forms\FormsService;
use App\Transformers\Companies\CompanyMemberTransformer;
use App\Transformers\Companies\DepartmentTransformer;
use App\Transformers\Pages\PageTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
class CompanyMemberForms extends FormsService {
public array $formTitles = ['create' => 'Добавление сотрудника организации', 'update' => 'Редактирование сотрудника'];
public function form(?string $id = null, array $data = []): array {
$model = CompanyMember::byUuid($id)->first();
$groups = [
[
'name' => 'common',
'fields' => $this->commonGroupFields($model),
'dynamic' => [
['field' => 'role', 'hide' => ['pages']],
['field' => 'role', 'value' => CompanyMemberRole::MODERATOR, 'show' => ['pages']]
]
]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?CompanyMember $model): array {
$fields = [
[
'name' => 'email',
'title' => 'Email',
'type' => FieldType::STRING,
'required' => true,
'readonly' => !!$model && !Auth::user()->isPrivileged,
'value' => $model->user->email ?? null
],
[
'name' => 'name',
'title' => 'ФИО',
'type' => FieldType::TEXT,
'required' => true,
'value' => $model->user->name ?? null
],
[
'name' => 'position',
'title' => 'Должность',
'type' => FieldType::TEXT,
'required' => true,
'value' => $model->position ?? null
],
[
'name' => 'phone',
'title' => 'Телефон',
'type' => FieldType::STRING,
'value' => $model->user->phone ?? null
],
[
'name' => 'room',
'title' => 'Кабинет',
'type' => FieldType::STRING,
'value' => $model->room ?? null
],
[
'name' => 'intercom',
'title' => 'Внутренний телефон',
'type' => FieldType::STRING,
'value' => $model->intercom ?? null
],
[
'name' => 'role',
'title' => 'Роль',
'type' => FieldType::RELATION,
'required' => true,
'appearance' => 'radio',
'options' => $this->getRelationItems(CompanyMemberRole::TITLES),
'value' => $this->getRelationValue(CompanyMemberRole::TITLES, $model->role ?? null)
],
[
'name' => 'pages',
'title' => 'Разделы сайта',
'type' => FieldType::RELATION,
'multiple' => true,
'options' => fractal(Page::all(), new PageTransformer()),
'value' => null
]
/*
[
'name' => 'rank',
'title' => 'Ранг сотрудника',
'type' => FieldType::RELATION,
'required' => true,
'appearance' => 'radio',
'options' => $this->getRelationItems(CompanyMemberRank::TITLES),
'value' => $model ? $model->parsedRank + ['id' => $model->rank] : null
],
[
'name' => 'representative',
'title' => 'Назначить администратором',
'type' => FieldType::BOOLEAN,
'value' => $model->representative ?? null
]
*/
];
/*
if ($model) $fields[] = [
'name' => 'department',
'title' => 'Отдел',
'type' => FieldType::RELATION,
'options' => fractal($model->company->departments ?? [], new DepartmentTransformer()),
'value' => $model ? fractal($model->department, new DepartmentTransformer()) : null
];
*/
return ['data' => $fields];
}
public function store(array $data): ?JsonResponse {
if (($department = Department::byUuid($data['department'] ?? null)->first()) && ($user = User::getByData(collect($data)->except('role')->all(), true))) {
$model = $department->addMember($user, $data['position'] ?? null);
$model->update(['position' => $data['position'] ?? null, 'role' => $data['role'] ?? null, 'room' => $data['room'] ?? null, 'intercom' => $data['intercom'] ?? null]);
return fractal($model, new CompanyMemberTransformer())->respond();
}
}
public function update(string $id, array $data): ?JsonResponse {
$model = CompanyMember::byUuid($id)->firstOrFail();
$model->update(['position' => $data['position'] ?? null, 'role' => $data['role'] ?? null, 'room' => $data['room'] ?? null, 'intercom' => $data['intercom'] ?? null]);
if ($department = Department::byUuid($data['department'] ?? null)->first()) $model->update(['department_id' => $department->id]);
$model->user->update(['name' => $data['name'] ?? null, 'phone' => $data['phone'] ?? null]);
if (($email = $data['email'] ?? null) && !User::query()->where(['email' => $email])->exists()) $model->user->update(['email' => $data['email']]);
return fractal($model->fresh(), new CompanyMemberTransformer())->respond();
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Services\Forms\Companies;
use App\Models\Companies\Department;
use App\Models\Objects\FieldType;
use App\Services\Forms\FormsService;
use App\Transformers\Companies\DepartmentTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str;
class DepartmentForms extends FormsService {
public array $formTitles = ['create' => 'Создание подразделение организации', 'update' => 'Редактирование подразделения'];
public function form(?string $id = null, array $data = []): array {
$model = Department::byUuid($id)->first();
$groups = [
['name' => 'common', 'fields' => $this->commonGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?Department $model): array {
$fields = [
[
'name' => 'title',
'title' => 'Название подразделения',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->title ?? null
]
];
return ['data' => $fields];
}
public function store(array $data): ?JsonResponse {
$parent = Department::byUuid($data['department'] ?? null)->firstOrFail();
if ($title = trim($data['title'] ?? null)) {
$model = $parent->addChildren(Str::transliterate($title), $title);
return fractal($model, new DepartmentTransformer())->respond();
}
}
public function update(string $id, array $data): ?JsonResponse {
$model = Department::byUuid($id)->firstOrFail();
if ($val = trim($data['title'] ?? null)) {
$model->update(['title' => $val]);
if ($model->name !== 'root') $model->update(['name' => Str::transliterate($val)]);
}
return fractal($model, new DepartmentTransformer())->respond();
}
}

View File

@ -2,6 +2,8 @@
namespace App\Services\Forms; namespace App\Services\Forms;
use App\Services\Forms\Advisories\AdvisoryFormsServices;
use App\Services\Forms\Companies\CompanyFormsServices;
use App\Services\Forms\Feedback\FeedbackFormsServices; use App\Services\Forms\Feedback\FeedbackFormsServices;
use App\Services\Forms\Pages\PageFormsServices; use App\Services\Forms\Pages\PageFormsServices;
use App\Services\Forms\Publications\PublicationFormsServices; use App\Services\Forms\Publications\PublicationFormsServices;
@ -17,6 +19,8 @@ class FormsService {
RegistryFormsServices::class, RegistryFormsServices::class,
UserFormsServices::class, UserFormsServices::class,
FeedbackFormsServices::class, FeedbackFormsServices::class,
AdvisoryFormsServices::class,
CompanyFormsServices::class
]; ];
public function __construct() { public function __construct() {

View File

@ -35,12 +35,14 @@ class OperationForms extends FormsService {
$entry = Entry::byUuid($data['entry'] ?? null)->firstOrFail(); $entry = Entry::byUuid($data['entry'] ?? null)->firstOrFail();
$model = $entry->createObject($entry->registry->options['operations'] ?? null, null, 'operations'); $model = $entry->createObject($entry->registry->options['operations'] ?? null, null, 'operations');
$model->setValues($data); $model->setValues($data);
$entry->sortOperations();
return fractal($model, new ObjectTransformer())->respond(); return fractal($model, new ObjectTransformer())->respond();
} }
public function update(string $id, array $data): ?JsonResponse { public function update(string $id, array $data): ?JsonResponse {
$model = NirObject::byUuid($id)->firstOrFail(); $model = NirObject::byUuid($id)->firstOrFail();
$model->setValues($data); $model->setValues($data);
$model->entries()->first()->sortOperations();
return fractal($model->fresh(), new ObjectTransformer())->respond(); return fractal($model->fresh(), new ObjectTransformer())->respond();
} }
} }

View File

@ -1,12 +0,0 @@
<?php
namespace App\Support;
use App\Models\Processes\Participant;
use Illuminate\Database\Eloquent\Relations\MorphMany;
trait ParticipatableTrait {
public function participation(): MorphMany {
return $this->morphMany(Participant::class, 'participatable');
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace App\Transformers\Advisories;
use App\Models\Advisories\AdvisoryCompany;
use App\Models\Advisories\AdvisoryMemberRank;
use App\Services\PermissionsService;
use App\Transformers\Companies\CompanyMemberTransformer;
use App\Transformers\Companies\CompanyTransformer;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\Primitive;
use League\Fractal\TransformerAbstract;
class AdvisoryCompanyTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'advisory', 'company', 'voter', 'advisoryMembers', 'companyMembers', 'permissions'
];
public function transform(AdvisoryCompany $model): array {
return [
'id' => $model->uuid,
'title' => $model->title
];
}
public function includeAdvisory(AdvisoryCompany $model): ?Item {
return $model->advisory ? $this->item($model->advisory, new AdvisoryTransformer()) : null;
}
public function includeCompany(AdvisoryCompany $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
public function includeVoter(AdvisoryCompany $model): ?Item {
return $model->voter ? $this->item($model->voter, new AdvisoryMemberTransformer()) : null;
}
public function includeAdvisoryMembers(AdvisoryCompany $model): Collection {
return $this->collection($model->advisoryMembers()->whereIn('rank', [AdvisoryMemberRank::ORDINARY, AdvisoryMemberRank::VOTER])->get(), new AdvisoryMemberTransformer());
}
public function includeCompanyMembers(AdvisoryCompany $model): Collection {
return $this->collection($model->companyMembers, new CompanyMemberTransformer());
}
public function includePermissions(AdvisoryCompany $model): Primitive {
return $this->primitive((new PermissionsService($model))->get());
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Transformers\Advisories;
use App\Models\Advisories\AdvisoryMember;
use App\Transformers\Companies\CompanyMemberTransformer;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class AdvisoryMemberTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'advisory', 'companyMember'
];
public function transform(AdvisoryMember $model): array {
return [
'id' => $model->uuid,
'rank' => $model->parsedRank,
'title' => $model->title
];
}
public function includeAdvisory(AdvisoryMember $model): ?Item {
return $model->advisory ? $this->item($model->advisory, new AdvisoryTransformer()) : null;
}
public function includeCompanyMember(AdvisoryMember $model): ?Item {
return $model->companyMember ? $this->item($model->companyMember, new CompanyMemberTransformer()) : null;
}
}

View File

@ -0,0 +1,80 @@
<?php
namespace App\Transformers\Advisories;
use App\Models\Advisories\Advisory;
use App\Services\PermissionsService;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Companies\CompanyMemberTransformer;
use App\Transformers\Companies\CompanyTransformer;
use App\Transformers\Objects\ObjectTransformer;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\Primitive;
use League\Fractal\TransformerAbstract;
class AdvisoryTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'logo', 'document', 'companies', 'advisoryCompanies', 'members', 'secretary', 'parent', 'children', 'object', 'permissions'
];
public function transform(Advisory $model): array {
return [
'id' => $model->uuid,
'type' => $model->parsedType,
'name' => $model->name,
'title' => $model->title,
'number' => $model->number,
'email' => $model->email,
'phone' => $model->phone,
'director_name' => $model->director_name,
'secretary_name' => $model->secretary_name,
'is_main' => boolval($model->is_main),
'caption' => $model->caption
];
}
public function includeLogo(Advisory $model): ?Item {
return $model->logo ? $this->item($model->logo, new AssetTransformer()) : null;
}
public function includeDocument(Advisory $model): ?Item {
return $model->document ? $this->item($model->document, new AssetTransformer()) : null;
}
public function includeCompanies(Advisory $model): Collection {
return $this->collection($model->companies, new CompanyTransformer());
}
public function includeAdvisoryCompanies(Advisory $model): Collection {
return $this->collection($model->advisoryCompanies, new AdvisoryCompanyTransformer());
}
public function includeMembers(Advisory $model): Collection {
return $this->collection($model->members, new AdvisoryMemberTransformer());
}
public function includeSecretary(Advisory $model): ?Item {
return $model->secretary ? $this->item($model->secretary, new CompanyMemberTransformer()) : null;
}
public function includeParent(Advisory $model): ?Item {
return $model->parent ? $this->item($model->parent, new AdvisoryTransformer()) : null;
}
public function includeChildren(Advisory $model): Collection {
return $this->collection($model->children, new AdvisoryTransformer());
}
public function includeObject(Advisory $model): ?Item {
return $model->object ? $this->item($model->object, new ObjectTransformer()) : null;
}
public function includePermissions(Advisory $model): Primitive {
return $this->primitive((new PermissionsService($model))->get());
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\Address;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class AddressTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'company'
];
public function transform(Address $model): array {
return [
'id' => $model->uuid,
'type' => $model->type,
'full' => $model->full,
'postcode' => $model->postcode,
'country' => $model->country,
'region' => $model->region,
'city' => $model->city,
'district' => $model->district,
'street' => $model->street,
'house' => $model->house,
'block' => $model->block,
'office' => $model->office
];
}
public function includeCompany(Address $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\BankDetails;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class BankDetailsTransformer extends TransformerAbstract {
protected array $defaultIncludes = [
];
protected array $availableIncludes = [
'company'
];
public function transform(BankDetails $model): array {
return [
'id' => $model->uuid,
'bik' => $model->bik,
'bank' => $model->bank,
'address' => $model->address,
'checking_account' => $model->checking_account,
'correspondent_account' => $model->correspondent_account
];
}
public function includeCompany(BankDetails $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\CompanyMember;
use App\Transformers\Advisories\AdvisoryMemberTransformer;
use App\Transformers\Users\UserTransformer;
use Illuminate\Support\Facades\Auth;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\Primitive;
use League\Fractal\TransformerAbstract;
class CompanyMemberTransformer extends TransformerAbstract {
protected array $defaultIncludes = [
];
protected array $availableIncludes = [
'user', 'company', 'department', 'advisoryMembership', 'isSubordinate'
];
public function transform(CompanyMember $model): array {
return [
'id' => $model->uuid,
'position' => $model->position,
'rank' => $model->parsedRank,
'role' => $model->parsedRole,
'caption' => $model->user->name,
'subtitle' => "{$model->company->name}, {$model->position}",
'room' => $model->room,
'intercom' => $model->intercom
];
}
public function includeUser(CompanyMember $model): ?Item {
return $model->user ? $this->item($model->user, new UserTransformer()) : null;
}
public function includeCompany(CompanyMember $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
public function includeDepartment(CompanyMember $model): ?Item {
return $model->department ? $this->item($model->department, new DepartmentTransformer()) : null;
}
public function includeAdvisoryMembership(CompanyMember $model): Collection {
return $this->collection($model->advisoryMembership, new AdvisoryMemberTransformer());
}
public function includeIsSubordinate(CompanyMember $model): ?Primitive {
return $this->primitive($model->isSubordinateFor(Auth::user()));
}
}

View File

@ -0,0 +1,100 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\Company;
use App\Services\PermissionsService;
use App\Transformers\Advisories\AdvisoryCompanyTransformer;
use App\Transformers\Assets\AssetTransformer;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\Resource\Primitive;
use League\Fractal\TransformerAbstract;
class CompanyTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'logo', 'types', 'departments', 'rootDepartment', 'members', 'rootMembers', 'representativeMember',
'addresses', 'legalAddress', 'actualAddress', 'bankDetails', 'contacts', 'phones', 'emails', 'permissions',
'advisoryCompanies'
];
public function transform(Company $model): array {
return [
'id' => $model->uuid,
'name' => $model->name,
'full_name' => $model->full_name,
'inn' => $model->inn,
'kpp' => $model->kpp,
'ogrn' => $model->ogrn,
'okved' => $model->okved,
'okato' => $model->okato,
'tax_registration_date' => $model->tax_registration_date ? $model->tax_registration_date->toIso8601String() : null
];
}
public function includeLogo(Company $model): ?Item {
return $model->logo ? $this->item($model->logo, new AssetTransformer()) : null;
}
public function includeTypes(Company $model): Collection {
return $this->collection($model->types, new CompanyTypeTransformer());
}
public function includeDepartments(Company $model): Collection {
return $this->collection($model->departments, new DepartmentTransformer());
}
public function includeRootDepartment(Company $model): ?Item {
return $model->rootDepartment ? $this->item($model->rootDepartment, new DepartmentTransformer()) : null;
}
public function includeMembers(Company $model): Collection {
return $this->collection($model->members, new CompanyMemberTransformer());
}
public function includeRootMembers(Company $model): Collection {
return $this->collection($model->rootMembers, new CompanyMemberTransformer());
}
public function includeRepresentativeMember(Company $model): ?Item {
return $model->representativeMember ? $this->item($model->representativeMember, new CompanyMemberTransformer()) : null;
}
public function includeAddresses(Company $model): Collection {
return $this->collection($model->addresses, new AddressTransformer());
}
public function includeLegalAddress(Company $model): Item {
return $this->item($model->legalAddress, new AddressTransformer());
}
public function includeActualAddress(Company $model): Item {
return $this->item($model->actualAddress, new AddressTransformer());
}
public function includeBankDetails(Company $model): Item {
return $this->item($model->bankDetails, new BankDetailsTransformer());
}
public function includeContacts(Company $model): Collection {
return $this->collection($model->contacts, new ContactTransformer());
}
public function includePhones(Company $model): Collection {
return $this->collection($model->phones, new ContactTransformer());
}
public function includeEmails(Company $model): Collection {
return $this->collection($model->emails, new ContactTransformer());
}
public function includePermissions(Company $model): Primitive {
return $this->primitive((new PermissionsService($model))->get());
}
public function includeAdvisoryCompanies(Company $model): Collection {
return $this->collection($model->advisoryCompanies, new AdvisoryCompanyTransformer());
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\CompanyType;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class CompanyTypeTransformer extends TransformerAbstract {
protected array $defaultIncludes = [
];
protected array $availableIncludes = [
'company'
];
public function transform(CompanyType $model): array {
return [
'id' => $model->name,
'name' => $model->name,
'title' => $model->title
];
}
public function includeCompany(CompanyType $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\Contact;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class ContactTransformer extends TransformerAbstract {
protected array $defaultIncludes = [
];
protected array $availableIncludes = [
'company'
];
public function transform(Contact $model): array {
return [
'type' => $model->parsedType,
'value' => $model->value
];
}
public function includeCompany(Contact $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace App\Transformers\Companies;
use App\Models\Companies\Department;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class DepartmentTransformer extends TransformerAbstract {
protected array $defaultIncludes = [];
protected array $availableIncludes = [
'company', 'parent', 'children', 'members'
];
public function transform(Department $model): array {
return [
'id' => $model->uuid,
'name' => $model->name,
'title' => $model->title
];
}
public function includeCompany(Department $model): ?Item {
return $model->company ? $this->item($model->company, new CompanyTransformer()) : null;
}
public function includeParent(Department $model): ?Item {
return $model->parent ? $this->item($model->parent, new DepartmentTransformer()) : null;
}
public function includeChildren(Department $model): Collection {
return $this->collection($model->children, new DepartmentTransformer());
}
public function includeMembers(Department $model): Collection {
return $this->collection($model->members, new CompanyMemberTransformer());
}
}

View File

@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompaniesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('companies', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('logo_id')->nullable();
$table->string('name')->nullable();
$table->string('full_name', 500)->nullable();
$table->string('inn')->index()->unique();
$table->string('kpp', 20)->nullable();
$table->string('ogrn', 20)->nullable();
$table->string('okpo', 20)->nullable();
$table->string('okved', 20)->nullable();
$table->string('okato', 20)->nullable();
$table->timestamp('tax_registration_date')->nullable();
$table->boolean('is_main')->index()->default(0);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('companies');
}
}

View File

@ -0,0 +1,43 @@
<?php
use App\Models\Companies\CompanyMemberRank;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyMembersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_members', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('user_id')->index()->nullable();
$table->integer('company_id')->index()->nullable();
$table->integer('department_id')->index()->nullable();
$table->smallInteger('rank')->index()->default(CompanyMemberRank::EMPLOYEE);
$table->string('role')->index()->nullable();
$table->string('position')->index()->nullable();
$table->string('room')->index()->nullable();
$table->string('intercom')->index()->nullable();
$table->boolean('selected')->index()->default(0);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_members');
}
}

View File

@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyAddressesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_addresses', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('company_id')->index();
$table->string('type')->index();
$table->string('full', 500)->nullable();
$table->string('postcode')->nullable();
$table->string('country')->nullable();
$table->string('region')->nullable();
$table->string('city')->nullable();
$table->string('district')->nullable();
$table->string('street')->nullable();
$table->string('house')->nullable();
$table->string('block')->nullable();
$table->string('office')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_addresses');
}
}

View File

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyBankDetailsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_bank_details', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('company_id')->index();
$table->string('bik')->nullable();
$table->string('bank')->nullable();
$table->string('address')->nullable();
$table->string('checking_account')->nullable();
$table->string('correspondent_account')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_bank_details');
}
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyContactsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_contacts', function (Blueprint $table) {
$table->id();
$table->integer('company_id')->index();
$table->string('type', 20)->index();
$table->string('value')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_contacts');
}
}

View File

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyDepartmentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_departments', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('company_id')->nullable()->index();
$table->integer('parent_id')->nullable()->index();
$table->string('name')->index()->nullable();
$table->string('title')->index()->nullable();
$table->smallInteger('level')->index()->default(0);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_departments');
}
}

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompanyTypesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('company_types', function (Blueprint $table) {
$table->id();
$table->integer('company_id')->index()->nullable();
$table->string('name')->index()->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('company_types');
}
}

View File

@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdvisoriesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('advisories', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('parent_id')->index()->default(0);
$table->integer('logo_id')->nullable();
$table->integer('document_id')->nullable();
$table->string('type')->index()->nullable();
$table->string('name')->index()->nullable();
$table->string('title')->index()->nullable();
$table->string('number')->index()->nullable();
$table->string('email')->index()->nullable();
$table->string('phone')->index()->nullable();
$table->string('director_name')->index()->nullable();
$table->string('secretary_name')->index()->nullable();
$table->boolean('is_main')->index()->default(0);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('advisories');
}
}

View File

@ -0,0 +1,37 @@
<?php
use App\Models\Advisories\AdvisoryMemberRank;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdvisoryMembersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('advisory_members', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('advisory_id')->index()->nullable();
$table->integer('company_member_id')->index()->nullable();
$table->integer('rank')->index()->default(AdvisoryMemberRank::ORDINARY);
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('advisory_members');
}
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdvisoryCompaniesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('advisory_companies', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('advisory_id')->index()->nullable();
$table->integer('company_id')->index()->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('advisory_companies');
}
}

View File

@ -0,0 +1,83 @@
<?php
namespace Database\Seeders\Advisories;
use App\Imports\AdvisoryMembersImport;
use App\Models\Advisories\Advisory;
use App\Models\Advisories\AdvisoryType;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
class AdvisoriesTableSeeder extends Seeder {
public array $advisories = [
'tk465' => [
'number' => 'ТК 465',
'title' => 'Строительство',
'type' => AdvisoryType::COMMITTEE,
'is_main' => true,
//'members' => ['import' => 'import/advisories/tk465_members.xlsx'],
'children' => [
'group1' => [
'title' => 'Организационно-методические и общетехнические вопросы в строительстве',
'children' => [
'pk2' => [
'title' => 'Проектирование. Основные положения нормирования',
'number' => 'ПК 2',
'type' => AdvisoryType::COMMITTEE
],
'pk4' => [
'title' => 'Обследование и мониторинг технического состояния зданий и сооружений. Ремонт, восстановление и усиление конструкций зданий и сооружений',
'number' => 'ПК 4',
'type' => AdvisoryType::COMMITTEE
],
'pk6' => [
'title' => 'Пожаробезопасность в строительстве',
'number' => 'ПК 6',
'type' => AdvisoryType::COMMITTEE
]
]
],
'group2' => [
'title' => 'Здания и сооружения',
'children' => [
'pk10' => [
'title' => 'Жилые, общественные и производственные здания и сооружения',
'number' => 'ПК 2',
'type' => AdvisoryType::COMMITTEE
]
]
],
'group3' => [
'title' => 'Наружные и внутренние инженерные сети и оборудование',
'children' => []
],
'group4' => [
'title' => 'Строительные конструкции и основания',
'children' => []
]
]
]
];
public function run() {
collect($this->advisories)->each(function($data, $name) {
$this->importAdvisory($name, $data);
});
}
public function importAdvisory($name, $data, $parent = null) {
$query = $parent ? $parent->children() : Advisory::query();
$advisory = $query->firstOrCreate(['name' => $name]);
$advisory->update(collect($data)->except('members', 'children')->all());
$this->importAdvisoryMembers($advisory, $data['members'] ?? []);
collect($data['children'] ?? [])->each(function($data, $name) use($advisory) {
$this->importAdvisory($name, $data, $advisory);
});
}
public function importAdvisoryMembers(Advisory $advisory, $data) {
if ($path = $data['import'] ?? null) Excel::import(new AdvisoryMembersImport($advisory), Storage::path($path));
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace Database\Seeders\Advisories;
use Illuminate\Database\Seeder;
class AdvisoriesTablesSeeder extends Seeder {
public function run() {
$this->call(AdvisoriesTableSeeder::class);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Database\Seeders\Companies;
use App\Imports\CompaniesImport;
use App\Models\Companies\Company;
use App\Models\Companies\CompanyMemberRank;
use App\Models\Companies\Department;
use App\Models\User;
use App\Services\DaDataService;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
class CompaniesTableSeeder extends Seeder {
public array $companies = [
'7736151499' => [
'is_main' => 1,
'members' => [
'test1@testnir.ru' => ['name' => 'Иванов Иван Иванович', 'position' => 'Генеральный директор', 'rank' => CompanyMemberRank::CHIEF],
'test2@testnir.ru' => ['name' => 'Петров Петр Петрович', 'position' => 'Заместитель генерального директора', 'rank' => CompanyMemberRank::VICE]
]
]
];
public string $import = '';
public function run() {
collect($this->companies)->each(function($data, $inn) {
$company = Company::query()->firstOrCreate(['inn' => $inn]);
(new DaDataService($inn))->saveToCompany($company);
$company->update(collect($data)->except('departments', 'members', 'phone', 'email')->all());
$company->setEmail($data['email'] ?? null);
$company->setPhone($data['phone'] ?? null);
$this->syncMembers($company->rootDepartment, $data['members'] ?? []);
$this->syncDepartments($company->rootDepartment, $data['departments'] ?? []);
});
if ($this->import && Storage::exists($this->import)) Excel::import(new CompaniesImport(), Storage::path($this->import));
}
public function syncDepartments(Department $parent, $data) {
collect($data)->each(function($data, $name) use($parent) {
if ($department = $parent->addChildren($name, $data['title'] ?? null)) {
$this->syncMembers($department, $data['members'] ?? []);
$this->syncDepartments($department, $data['departments'] ?? []);
}
});
}
public function syncMembers(Department $department, $data) {
collect($data)->each(function($data, $email) use($department) {
$user = User::getByData(['email' => $email, 'name' => $data['name'] ?? '']);
$member = $department->addMember($user, $data['position'] ?? '');
$member->update(['rank' => $data['rank'] ?? CompanyMemberRank::EMPLOYEE]);
});
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace Database\Seeders\Companies;
use Illuminate\Database\Seeder;
class CompaniesTablesSeeder extends Seeder {
public function run() {
$this->call(CompaniesTableSeeder::class);
}
}

View File

@ -2,6 +2,8 @@
namespace Database\Seeders; namespace Database\Seeders;
use Database\Seeders\Advisories\AdvisoriesTablesSeeder;
use Database\Seeders\Companies\CompaniesTablesSeeder;
use Database\Seeders\Dictionaries\DictionariesTablesSeeder; use Database\Seeders\Dictionaries\DictionariesTablesSeeder;
use Database\Seeders\Objects\ObjectsTablesSeeder; use Database\Seeders\Objects\ObjectsTablesSeeder;
use Database\Seeders\Pages\PagesTableSeeder; use Database\Seeders\Pages\PagesTableSeeder;
@ -17,5 +19,7 @@ class DatabaseSeeder extends Seeder {
$this->call(ObjectsTablesSeeder::class); $this->call(ObjectsTablesSeeder::class);
$this->call(DictionariesTablesSeeder::class); $this->call(DictionariesTablesSeeder::class);
$this->call(PagesTableSeeder::class); $this->call(PagesTableSeeder::class);
$this->call(CompaniesTablesSeeder::class);
$this->call(AdvisoriesTablesSeeder::class);
} }
} }

View File

@ -37,6 +37,14 @@ class DictionariesTableSeeder extends Seeder {
'title' => 'Тип изображения', 'title' => 'Тип изображения',
'items' => ['full-width' => 'во всю ширину', 'tiles' => 'плиткой'] 'items' => ['full-width' => 'во всю ширину', 'tiles' => 'плиткой']
], ],
'activities' => [
'title' => 'Направления деятельности',
'items' => ['products' => 'Продукция в строительстве', 'services' => 'Работы и услуги', 'management' => 'СМК']
],
'research-types' => [
'title' => 'Виды исследовательских работ',
'items' => ['nir' => 'НИР', 'niokr' => 'НИОКР']
]
]; ];
public function run() { public function run() {

View File

@ -156,25 +156,122 @@ class FieldsTableSeeder extends Seeder {
'required' => true, 'required' => true,
], ],
'laboratory-name' => [ 'company-name' => [
'title' => 'Наименование лаборатории', 'title' => 'Наименование организации',
'type' => FieldType::STRING, 'type' => FieldType::STRING,
'required' => true 'required' => true
], ],
'certifier-name' => [ 'activities' => [
'title' => 'Наименование органа по сертификации', 'title' => 'Объект сертификации',
'type' => FieldType::RELATION,
'required' => true,
'multiple' => true,
'params' => [
'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class,
'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'activities']]],
]
],
'applicant-name' => [
'title' => 'Заявитель',
'type' => FieldType::STRING, 'type' => FieldType::STRING,
'required' => true 'required' => true
], ],
'expert-name' => [ 'applicant-address' => [
'title' => 'ФИО эксперта', 'title' => 'Адрес заявителя',
'type' => FieldType::STRING, 'type' => FieldType::STRING
],
'applicant-email' => [
'title' => 'Электронная почта заявителя',
'type' => FieldType::STRING
],
'applicant-phone' => [
'title' => 'Телефон заявителя',
'type' => FieldType::STRING
],
'producer-name' => [
'title' => 'Производитель',
'type' => FieldType::STRING
],
'producer-address' => [
'title' => 'Адрес производителя',
'type' => FieldType::STRING
],
'producer-email' => [
'title' => 'Электронная почта производителя',
'type' => FieldType::STRING
],
'producer-phone' => [
'title' => 'Телефон производителя',
'type' => FieldType::STRING
],
'company-address' => [
'title' => 'Адрес',
'type' => FieldType::STRING
],
'company-site' => [
'title' => 'Сайт',
'type' => FieldType::STRING
],
'company-email' => [
'title' => 'Электронная почта',
'type' => FieldType::STRING
],
'company-phone' => [
'title' => 'Телефон',
'type' => FieldType::STRING
],
'primary-developer' => [
'title'=> 'Основной исполнитель',
'type' => FieldType::STRING
],
'funding-source' => [
'title' => 'Источник финансирования',
'type' => FieldType::STRING
],
'plan-year' => [
'title' => 'Год плана',
'type' => FieldType::INTEGER
],
'discussion-start-date' => [
'title' => 'Дата начала обсуждения',
'type' => FieldType::DATE
],
'discussion-finish-date' => [
'title' => 'Дата окончания обсуждения',
'type' => FieldType::DATE
],
'research-type' => [
'title' => 'Вид работы',
'type' => FieldType::RELATION,
'required' => true,
'params' => [
'appearance' => 'radio',
'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class,
'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'research-types']]]
]
],
'research-objective' => [
'title' => 'Цель исследования',
'type' => FieldType::TEXT
],
'technical-conclusion' => [
'title' => 'Техническое заключение',
'type' => FieldType::DOCUMENT,
'required' => true 'required' => true
], ],
'certificate-number' => [ 'developer-name' => [
'title' => 'Номер сертификата', 'title' => 'Разработчик',
'type' => FieldType::STRING, 'type' => FieldType::STRING
'required' => true ],
'developer-address' => [
'title' => 'Адрес разработчика',
'type' => FieldType::STRING
], ],
'operation-type' => [ 'operation-type' => [

View File

@ -68,23 +68,34 @@ class ObjectTypeFieldsTableSeeder extends Seeder {
], ],
'entry-properties-laboratory' => [ 'entry-properties-laboratory' => [
'common' => [ 'common' => ['fields' => ['company-name', 'activities']]
'fields' => ['laboratory-name']
]
], ],
'entry-properties-certifier' => [ 'entry-properties-certifier' => [
'common' => [ 'common' => ['fields' => ['company-name', 'activities']]
'fields' => ['certifier-name']
]
], ],
'entry-properties-expert' => [ 'entry-properties-expert' => [
'common' => [ 'common' => ['fields' => []]
'fields' => ['expert-name']
]
], ],
'entry-properties-certificate' => [ 'entry-properties-certificate' => [
'common' => [ 'common' => [
'fields' => ['certificate-number'] 'fields' => ['applicant-name', 'applicant-address', 'applicant-email', 'applicant-phone', 'producer-name', 'producer-address', 'producer-email', 'producer-phone']
]
],
'entry-properties-company' => [
'common' => ['fields' => ['company-address', 'company-email', 'company-phone']]
],
'entry-properties-development' => [
'common' => ['fields' => ['operation-type', 'primary-developer', 'funding-source', 'plan-year']]
],
'entry-properties-discussion' => [
'common' => ['fields' => ['discussion-start-date', 'discussion-finish-date', 'funding-source']]
],
'entry-properties-research' => [
'common' => ['fields' => ['research-type', 'research-objective', 'plan-year']]
],
'entry-properties-technical-certificate' => [
'common' => [
'fields' => ['technical-conclusion', 'developer-name', 'developer-address', 'company-site', 'company-email', 'company-phone', 'producer-name', 'producer-address']
] ]
], ],

View File

@ -78,6 +78,21 @@ class ObjectTypesTableSeeder extends Seeder {
], ],
'entry-properties-certificate' => [ 'entry-properties-certificate' => [
'title' => 'Сертификат соответствия' 'title' => 'Сертификат соответствия'
],
'entry-properties-company' => [
'title' => 'Организация'
],
'entry-properties-development' => [
'title' => 'Разработка'
],
'entry-properties-discussion' => [
'title' => 'Обсуждение'
],
'entry-properties-research' => [
'title' => 'Исследование'
],
'entry-properties-technical-certificate' => [
'title' => 'Техническое свидетельство'
] ]
] ]
], ],

View File

@ -37,8 +37,8 @@ class PagesTableSeeder extends Seeder
'Закупки' => [], 'Закупки' => [],
'Противодействие коррупции' => [ 'Противодействие коррупции' => [
'children' => [ 'children' => [
'ФЗ, указы, постановления' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'ФЗ, указы, постановления' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CATEGORIZED],
'Ведомственные нормативные правовые акты' => [], 'Ведомственные нормативные правовые акты' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE],
'Внутренние нормативные документы' => [], 'Внутренние нормативные документы' => [],
'Антикоррупционная экспертиза' => [], 'Антикоррупционная экспертиза' => [],
'Методические материалы' => [], 'Методические материалы' => [],
@ -56,15 +56,15 @@ class PagesTableSeeder extends Seeder
'Нормирование и стандартизация' => [ 'Нормирование и стандартизация' => [
'children' => [ 'children' => [
'Реестр сводов правил' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::RULESET], 'Реестр сводов правил' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::RULESET],
'Разработка сводов правил' => [], 'Разработка сводов правил' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::DEVELOPMENTS],
'Прикладные исследования' => [], 'Прикладные исследования' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::RESEARCHES],
'Реестр нормативно-технической документации' => [], 'Реестр нормативно-технической документации' => [],
'Методические материалы' => [], 'Методические материалы' => [],
] ]
], ],
'Оценка пригодности' => [ 'Оценка пригодности' => [
'children' => [ 'children' => [
'Реестр технических свидетельств' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Реестр технических свидетельств' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::TECHNICAL_CERTIFICATES],
'Заявка на оформление' => [], 'Заявка на оформление' => [],
'Предварительная заявка' => [], 'Предварительная заявка' => [],
] ]
@ -73,9 +73,9 @@ class PagesTableSeeder extends Seeder
'children' => [ 'children' => [
'Руководство' => [], 'Руководство' => [],
'Секретариат' => [], 'Секретариат' => [],
'Структура' => [], 'Структура' => ['type' => PageType::TK_STRUCTURE],
'Состав' => [], 'Состав' => [],
'Документы' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Документы' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CATEGORIZED],
'АИС ТК 465 «Строительство»' => [], 'АИС ТК 465 «Строительство»' => [],
] ]
], ],
@ -95,14 +95,14 @@ class PagesTableSeeder extends Seeder
'Добровольная сертификация' => [ 'Добровольная сертификация' => [
'children' => [ 'children' => [
'О системе' => [], 'О системе' => [],
'Основополагающие документы' => [], 'Основополагающие документы' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CATEGORIZED],
'Решения ЦОС' => [], 'Решения ЦОС' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE],
'Руководящие документы' => [], 'Руководящие документы' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE],
'Реестр органов по сертификации' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFIERS], 'Реестр органов по сертификации' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFIERS],
'Реестр испытательных лабораторий' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::LABORATORIES], 'Реестр испытательных лабораторий' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::LABORATORIES],
'Реестр экспертов' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::EXPERTS], 'Реестр экспертов' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::EXPERTS],
'Реестр сертификатов соответствия' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFICATES], 'Реестр сертификатов соответствия' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFICATES],
'Бланки документов' => [], 'Бланки документов' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE],
] ]
], ],
'Международная деятельность' => [ 'Международная деятельность' => [

View File

@ -78,4 +78,14 @@ Route::group(['middleware' => ['auth:api']], function() {
Route::put('publications/published/{id}', 'Api\Publications\PublicationsController@published'); Route::put('publications/published/{id}', 'Api\Publications\PublicationsController@published');
Route::delete('publications/{id}', 'Api\Publications\PublicationsController@destroy'); Route::delete('publications/{id}', 'Api\Publications\PublicationsController@destroy');
Route::apiResource('companies', 'Api\Companies\CompaniesController');
Route::apiResource('members', 'Api\Companies\MembersController');
Route::apiResource('departments', 'Api\Companies\DepartmentsController');
Route::apiResource('advisories', 'Api\Advisories\AdvisoriesController');
Route::get('advisories/{id}/siblings', 'Api\Advisories\AdvisoriesController@siblings');
Route::apiResource('advisory-companies', 'Api\Advisories\AdvisoryCompaniesController');
Route::apiResource('advisory-members', 'Api\Advisories\AdvisoryMembersController');
}); });

File diff suppressed because one or more lines are too long