diff --git a/app/Http/Controllers/Api/Registries/EntriesController.php b/app/Http/Controllers/Api/Registries/EntriesController.php index 5387ad6..d52d097 100644 --- a/app/Http/Controllers/Api/Registries/EntriesController.php +++ b/app/Http/Controllers/Api/Registries/EntriesController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use App\Models\Registries\Category; use App\Models\Registries\Entry; use App\Models\Registries\Registry; +use App\Services\Filters\FiltersService; use App\Transformers\Registries\EntryTransformer; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -18,9 +19,13 @@ class EntriesController extends Controller { } public function index(Request $request): JsonResponse { + $filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : [])->filter(function($val) {return $val;}); $registry = Registry::byUuid($request->get('registry'))->first(); $category = Category::byUuid($request->get('category'))->first(); - $query = $this->model->query()->where(['registry_id' => $registry->id ?? 0, 'category_id' => $category->id ?? 0]); + $query = $this->model->query()->where(['registry_id' => $registry->id ?? 0]); + if ($filters->isEmpty()) $query->where(['category_id' => $category->id ?? 0]); + $service = FiltersService::getService('registryEntries'); + $service->applyFilters($query, $filters); $paginator = $query->paginate(config('app.pagination_limit')); return fractal($paginator, new EntryTransformer())->respond(); } diff --git a/app/Listeners/SendFeedbackMessage.php b/app/Listeners/SendFeedbackMessage.php index db02dc2..7977e54 100644 --- a/app/Listeners/SendFeedbackMessage.php +++ b/app/Listeners/SendFeedbackMessage.php @@ -13,7 +13,7 @@ class SendFeedbackMessage { try { Mail::to($event->email)->send(new FeedbackSender($event->data)); } catch (\Exception $exception) { - mail('sergey@bodin.ru', 'Error', $exception->getMessage()); + var_dump($exception); } } } diff --git a/app/Models/Registries/Entry.php b/app/Models/Registries/Entry.php index e4399d8..75622df 100644 --- a/app/Models/Registries/Entry.php +++ b/app/Models/Registries/Entry.php @@ -18,7 +18,10 @@ class Entry extends Model { protected $dates = [ 'active_since', - 'active_till' + 'active_till', + 'suspended_since', + 'suspended_till', + 'cancelled_at' ]; protected $fillable = [ @@ -29,7 +32,10 @@ class Entry extends Model { 'number', 'name', 'active_since', - 'active_till' + 'active_till', + 'suspended_since', + 'suspended_till', + 'cancelled_at' ]; protected $hidden = [ @@ -50,7 +56,24 @@ class Entry extends Model { } public function operations(): MorphToMany { - return $this->objects()->reorder()->applyOrders(['order-date' => 'desc']); + return $this->objectsByGroup('operations')->reorder()->applyOrders(['order-date' => 'desc']); + } + + + public function getPropertiesAttribute(): ?Model { + return ($type = $this->registry->parsedType['options']['properties'] ?? null) ? $this->getObject($type, 'properties') : null; + } + + public function getStateAttribute(): ?array { + $state = null; + if ($this->active_since) { + $state = ($this->active_since <= now()) ? EntryState::ACTIVE : EntryState::AWAITING; + if ($this->active_till && ($this->active_till <= now())) $state = EntryState::EXPIRED; + elseif ($this->suspended_since && ($this->suspended_since <= now())) { + + } + } + return $state ? ['name' => $state, 'title' => EntryState::TITLES[$state] ?? null] : null; } diff --git a/app/Models/Registries/EntryState.php b/app/Models/Registries/EntryState.php new file mode 100644 index 0000000..d74c453 --- /dev/null +++ b/app/Models/Registries/EntryState.php @@ -0,0 +1,19 @@ + 'Вводится в действие', + self::ACTIVE => 'Действует', + self::EXPIRED => 'Архив', + self::SUSPENDED => 'Приостановлено', + self::CANCELLED => 'Отменено' + ]; +} \ No newline at end of file diff --git a/app/Models/Registries/Registry.php b/app/Models/Registries/Registry.php index 2a8fab2..163cf3c 100644 --- a/app/Models/Registries/Registry.php +++ b/app/Models/Registries/Registry.php @@ -19,8 +19,7 @@ class Registry extends Model { protected $fillable = [ 'uuid', 'page_id', - 'type', - 'name' + 'type' ]; protected $hidden = [ @@ -47,7 +46,7 @@ class Registry extends Model { public function getParsedTypeAttribute(): array { - return ['name' => $this->type, 'title' => RegistryType::TITLES[$this->type] ?? null]; + return ['name' => $this->type, 'title' => RegistryType::TITLES[$this->type] ?? null, 'options' => RegistryType::OPTIONS[$this->type] ?? []]; } diff --git a/app/Models/Registries/RegistryType.php b/app/Models/Registries/RegistryType.php index 213e78f..0c0228e 100644 --- a/app/Models/Registries/RegistryType.php +++ b/app/Models/Registries/RegistryType.php @@ -3,9 +3,28 @@ namespace App\Models\Registries; class RegistryType { - public const DOCUMENTS = 'documents'; + public const SIMPLE = 'simple'; + public const RULESET = 'ruleset'; + public const LABORATORIES = 'laboratories'; + public const CERTIFIERS = 'certifiers'; + public const EXPERTS = 'experts'; + public const CERTIFICATES = 'certificates'; public const TITLES = [ - self::DOCUMENTS => 'Реестр документов' + self::SIMPLE => 'Простой реестр', + self::RULESET => 'Реестр сводов правил', + self::LABORATORIES => 'Реестр испытательных лабораторий', + self::CERTIFIERS => 'Реестр органов по сертификации', + self::EXPERTS => 'Реестр экспертов', + self::CERTIFICATES => 'Реестр сертификатов соответствия' + ]; + + public const OPTIONS = [ + self::SIMPLE => [], + self::RULESET => ['categories' => true, 'operations' => true, 'states' => true], + self::LABORATORIES => ['properties' => 'entry-properties-laboratory', 'states' => true], + self::CERTIFIERS => ['properties' => 'entry-properties-certifier', 'states' => true], + self::EXPERTS => ['categories' => true, 'properties' => 'entry-properties-expert', 'states' => true], + self::CERTIFICATES => ['categories' => true, 'properties' => 'entry-properties-certificate', 'states' => true] ]; } \ No newline at end of file diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index e05d2d0..87b5596 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -42,7 +42,7 @@ class AppServiceProvider extends ServiceProvider public function boot() { Carbon::setLocale(config('app.locale')); - if ($this->app->environment('local')) Mail::alwaysTo('panabonic@yandex.ru'); + // if ($this->app->environment('local')) Mail::alwaysTo('panabonic@yandex.ru'); Relation::enforceMorphMap([ 'asset' => Asset::class, diff --git a/app/Services/Filters/FiltersService.php b/app/Services/Filters/FiltersService.php index bc4b0ed..be6e76c 100644 --- a/app/Services/Filters/FiltersService.php +++ b/app/Services/Filters/FiltersService.php @@ -2,12 +2,14 @@ namespace App\Services\Filters; +use App\Services\Filters\Registries\RegistryFiltersServices; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Date; class FiltersService { public static array $services = [ + RegistryFiltersServices::class ]; diff --git a/app/Services/Filters/Registries/EntryFilters.php b/app/Services/Filters/Registries/EntryFilters.php new file mode 100644 index 0000000..dae37a5 --- /dev/null +++ b/app/Services/Filters/Registries/EntryFilters.php @@ -0,0 +1,71 @@ + 'common', + 'title' => 'Общие параметры', + 'fields' => $this->nativeFields($filters) + ] + ]; + $query = Entry::query(); + $this->applyFilters($query, $filters); + return ['groups' => ['data' => $groups], 'total' => $query->count()]; + } + + public function nativeFields(Collection $filters): array { + return [ + [ + 'name' => 'listings', + 'title' => 'Вхождение в перечень ПП', + 'type' => FieldType::RELATION, + 'represented' => $this->getListings($filters), + 'value' => ($val = $filters->get('listings')) ? fractal(DictionaryItem::byUuids($val)->get(), new DictionaryItemTransformer()) : null + ] + ]; + } + + + public function getListings(Collection $filters): Fractal { + return fractal(Dictionary::byName('listings')->first()->items, new DictionaryItemTransformer()); + } + + + 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, ['name', 'number']); + } + } + + + public function applyPermissionsFilters(Builder $query) { + } + + + + +} diff --git a/app/Services/Filters/Registries/RegistryFiltersServices.php b/app/Services/Filters/Registries/RegistryFiltersServices.php new file mode 100644 index 0000000..c04a860 --- /dev/null +++ b/app/Services/Filters/Registries/RegistryFiltersServices.php @@ -0,0 +1,9 @@ + EntryFilters::class + ]; +} diff --git a/app/Services/Forms/Feedback/FeedbackForms.php b/app/Services/Forms/Feedback/FeedbackForms.php index fa8bb97..0d29362 100644 --- a/app/Services/Forms/Feedback/FeedbackForms.php +++ b/app/Services/Forms/Feedback/FeedbackForms.php @@ -23,9 +23,7 @@ class FeedbackForms extends FormsService { public function store(array $data) { - var_dump($data); - $email = 'sergey@bodin.ru'; - event(new FeedbackSender($email, $data)); + event(new FeedbackSender($data['mailto'], $data)); return null; } diff --git a/app/Services/Forms/Registries/EntryForms.php b/app/Services/Forms/Registries/EntryForms.php index 8eb6f68..71517c7 100644 --- a/app/Services/Forms/Registries/EntryForms.php +++ b/app/Services/Forms/Registries/EntryForms.php @@ -4,11 +4,14 @@ namespace App\Services\Forms\Registries; use App\Models\Asset; use App\Models\Objects\FieldType; +use App\Models\Objects\ObjectType; use App\Models\Registries\Category; use App\Models\Registries\Entry; use App\Models\Registries\Registry; use App\Services\Forms\FormsService; use App\Transformers\Assets\AssetTransformer; +use App\Transformers\Objects\FieldTransformer; +use App\Transformers\Objects\ObjectPropertyTransformer; use App\Transformers\Registries\EntryTransformer; use Illuminate\Http\JsonResponse; @@ -16,40 +19,48 @@ class EntryForms extends FormsService { public array $formTitles = ['create' => 'Создание записи', 'update' => 'Редактирование записи']; public function form(?string $id = null, array $data = []): array { + $registry = Registry::byUuid($data['registry'] ?? null)->firstOrFail(); $model = Entry::byUuid($id)->first(); $groups = [ - ['name' => 'common', 'fields' => $this->commonGroupFields($model)] + ['name' => 'common', 'title' => 'Общие сведения', 'fields' => $this->commonGroupFields($model)] ]; + if ($registry->parsedType['options']['states'] ?? null) $groups[] = ['name' => 'dates', 'title' => 'Сроки действия', 'fields' => $this->datesGroupFields($model)]; + if ($objectType = $registry->parsedType['options']['properties'] ?? null) $groups[] = ['name' => 'specific', 'title' => 'Подробности', 'fields' => $this->specificGroupFields($objectType, $model)]; return ['title' => $this->formTitle($model), 'data' => $groups]; } public function commonGroupFields(?Entry $model): array { $fields = [ - [ - 'name' => 'number', - 'title' => 'Номер записи', - 'type' => FieldType::STRING, - 'required' => true, - 'value' => $model->number ?? null - ], [ 'name' => 'name', - 'title' => 'Название', + 'title' => 'Наименование записи', 'type' => FieldType::STRING, 'required' => true, 'value' => $model->name ?? null ], + [ + 'name' => 'number', + 'title' => 'Номер записи', + 'type' => FieldType::STRING, + 'value' => $model->number ?? null + ], [ 'name' => 'asset', 'title' => 'Документ', 'type' => FieldType::DOCUMENT, - 'required' => true, 'value' => ($asset = $model->asset ?? null) ? fractal($asset, new AssetTransformer()) : null - ], + ] + ]; + return ['data' => $fields]; + } + + public function datesGroupFields(?Entry $model): array { + $fields = [ [ 'name' => 'active_since', 'title' => 'Дата начала действия', 'type' => FieldType::DATE, + 'required' => true, 'value' => ($v = $model->active_since ?? null) ? $v->toIso8601String() : null ], [ @@ -63,20 +74,30 @@ class EntryForms extends FormsService { } + public function specificGroupFields(string $objectType, ?Entry $model): array { + $object = $model->properties ?? null; + return $object ? fractal($object->groups->first()->fields, new ObjectPropertyTransformer($object))->toArray() : + fractal(ObjectType::byName($objectType)->first()->groups()->first()->fields, new FieldTransformer())->toArray(); + } + + + public function store(array $data): ?JsonResponse { $registry = Registry::byUuid($data['registry'] ?? null)->firstOrFail(); $category = Category::byUuid($data['category'] ?? null)->first(); - $data['asset_id'] = ($asset = Asset::byUuid($data['asset'])->first()) ? $asset->id : null; + $data['asset_id'] = ($asset = Asset::byUuid($data['asset'] ?? null)->first()) ? $asset->id : null; $data['category_id'] = $category->id ?? 0; $model = $registry->entries()->create($data); + if ($object = $model->properties ?? null) $object->setValues($data); return fractal($model, new EntryTransformer())->respond(); } public function update(string $id, array $data): ?JsonResponse { $model = Entry::byUuid($id)->firstOrFail(); - $data['asset_id'] = ($asset = Asset::byUuid($data['asset'])->first()) ? $asset->id : null; + $data['asset_id'] = ($asset = Asset::byUuid($data['asset'] ?? null)->first()) ? $asset->id : null; $model->update($data); + if ($object = $model->properties ?? null) $object->setValues($data); return fractal($model->fresh(), new EntryTransformer())->respond(); } } diff --git a/app/Support/HasObjectsTrait.php b/app/Support/HasObjectsTrait.php index 8e0ea3a..6590171 100644 --- a/app/Support/HasObjectsTrait.php +++ b/app/Support/HasObjectsTrait.php @@ -22,8 +22,11 @@ trait HasObjectsTrait { } - public function getObject($typeName): ?Model { - return ($type = ObjectType::byName($typeName)->first()) ? $this->objects()->firstOrCreate(['type_id' => $type->id]) : null; + public function getObject($typeName, $group = null): ?Model { + if ($type = ObjectType::byName($typeName)->first()) { + return $this->objectsByGroup($group ?? 'default')->where(['type_id' => $type->id])->first() ?? $this->createObject($typeName, null, $group ?? 'default'); + } + return null; } public function createObject($typeName, $ord = null, $group = null): ?Model { diff --git a/app/Transformers/Registries/EntryTransformer.php b/app/Transformers/Registries/EntryTransformer.php index 50ed8a8..51b455c 100644 --- a/app/Transformers/Registries/EntryTransformer.php +++ b/app/Transformers/Registries/EntryTransformer.php @@ -17,7 +17,7 @@ class EntryTransformer extends TransformerAbstract { ]; protected array $availableIncludes = [ - 'registry', 'category', 'asset', 'operations' + 'registry', 'category', 'asset', 'operations', 'properties' ]; public function transform(Entry $model): array { @@ -25,6 +25,7 @@ class EntryTransformer extends TransformerAbstract { 'id' => $model->uuid, 'number' => $model->number, 'name' => $model->name, + 'state' => $model->state, 'active_since' => $model->active_since ? $model->active_since->toIso8601String() : null, 'active_till' => $model->active_till ? $model->active_till->toIso8601String() : null, 'created_at' => $model->created_at ? $model->created_at->toIso8601String() : null, @@ -48,6 +49,10 @@ class EntryTransformer extends TransformerAbstract { return $this->collection($model->operations, new ObjectTransformer()); } + public function includeProperties(Entry $model): ?Item { + return $model->properties ? $this->item($model->properties, new ObjectTransformer()) : null; + } + public function includePermissions(Entry $model): Primitive { return $this->primitive((new PermissionsService($model))->get()); } diff --git a/database/migrations/2023_06_14_143616_create_registries_table.php b/database/migrations/2023_06_14_143616_create_registries_table.php index 4dbba1a..108a120 100644 --- a/database/migrations/2023_06_14_143616_create_registries_table.php +++ b/database/migrations/2023_06_14_143616_create_registries_table.php @@ -18,7 +18,6 @@ class CreateRegistriesTable extends Migration $table->char('uuid', 36)->index()->unique(); $table->integer('page_id')->index()->nullable(); $table->string('type')->index()->nullable(); - $table->string('name')->index()->nullable(); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/migrations/2023_06_21_195350_create_registry_entries_table.php b/database/migrations/2023_06_21_195350_create_registry_entries_table.php index 44c2ba3..6f0cc40 100644 --- a/database/migrations/2023_06_21_195350_create_registry_entries_table.php +++ b/database/migrations/2023_06_21_195350_create_registry_entries_table.php @@ -23,6 +23,9 @@ class CreateRegistryEntriesTable extends Migration $table->string('name')->index()->nullable(); $table->date('active_since')->index()->nullable(); $table->date('active_till')->index()->nullable(); + $table->date('suspended_since')->index()->nullable(); + $table->date('suspended_till')->index()->nullable(); + $table->date('cancelled_at')->index()->nullable(); $table->timestamps(); $table->softDeletes(); }); diff --git a/database/seeders/Objects/FieldsTableSeeder.php b/database/seeders/Objects/FieldsTableSeeder.php index 144491a..a558c06 100644 --- a/database/seeders/Objects/FieldsTableSeeder.php +++ b/database/seeders/Objects/FieldsTableSeeder.php @@ -169,6 +169,27 @@ class FieldsTableSeeder extends Seeder { 'required' => true, ], + 'laboratory-name' => [ + 'title' => 'Наименование лаборатории', + 'type' => FieldType::STRING, + 'required' => true + ], + 'certifier-name' => [ + 'title' => 'Наименование органа по сертификации', + 'type' => FieldType::STRING, + 'required' => true + ], + 'expert-name' => [ + 'title' => 'ФИО эксперта', + 'type' => FieldType::STRING, + 'required' => true + ], + 'certificate-number' => [ + 'title' => 'Номер сертификата', + 'type' => FieldType::STRING, + 'required' => true + ], + 'operation-type' => [ 'title' => 'Вид работы', 'type' => FieldType::RELATION, diff --git a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php index b3e1647..c806919 100644 --- a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php +++ b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php @@ -75,6 +75,28 @@ class ObjectTypeFieldsTableSeeder extends Seeder { 'fields' => ['feedback-email', 'feedback-name', 'feedback-type', 'feedback-message'] ] ], + + 'entry-properties-laboratory' => [ + 'common' => [ + 'fields' => ['laboratory-name'] + ] + ], + 'entry-properties-certifier' => [ + 'common' => [ + 'fields' => ['certifier-name'] + ] + ], + 'entry-properties-expert' => [ + 'common' => [ + 'fields' => ['expert-name'] + ] + ], + 'entry-properties-certificate' => [ + 'common' => [ + 'fields' => ['certificate-number'] + ] + ], + 'entry-operation' => [ 'common' => [ 'fields' => ['operation-type', 'order-name', 'order-date', 'order-document', 'listings', 'active-since', 'active-till', 'developer'] diff --git a/database/seeders/Objects/ObjectTypesTableSeeder.php b/database/seeders/Objects/ObjectTypesTableSeeder.php index cbafd89..881b0af 100644 --- a/database/seeders/Objects/ObjectTypesTableSeeder.php +++ b/database/seeders/Objects/ObjectTypesTableSeeder.php @@ -59,6 +59,24 @@ class ObjectTypesTableSeeder extends Seeder { ] ], + 'registry-entry-properties' => [ + 'title' => 'Специфические свойства записи реестра', + 'children' => [ + 'entry-properties-laboratory' => [ + 'title' => 'Испытательная лаборатория' + ], + 'entry-properties-certifier' => [ + 'title' => 'Орган по сертификации' + ], + 'entry-properties-expert' => [ + 'title' => 'Эксперт' + ], + 'entry-properties-certificate' => [ + 'title' => 'Сертификат соответствия' + ] + ] + ], + 'entry-operation' => [ 'title' => 'Действие с записью в реестре' ] diff --git a/database/seeders/Pages/PagesTableSeeder.php b/database/seeders/Pages/PagesTableSeeder.php index c420636..f2a1a7f 100644 --- a/database/seeders/Pages/PagesTableSeeder.php +++ b/database/seeders/Pages/PagesTableSeeder.php @@ -5,6 +5,7 @@ namespace Database\Seeders\Pages; use App\Models\Pages\Page; use App\Models\Pages\PageSubType; use App\Models\Pages\PageType; +use App\Models\Registries\RegistryType; use Illuminate\Database\Seeder; use Illuminate\Support\Str; @@ -16,11 +17,11 @@ class PagesTableSeeder extends Seeder 'Руководство' => [], 'Документы' => [ 'children' => [ - 'Документы об учреждении' => [], - 'Закупки' => [], + 'Документы об учреждении' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], + 'Закупки' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Бухгалтерская отчетность' => [], 'Государственное задание' => [], - 'Нормативные правовые акты' => [], + 'Нормативные правовые акты' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Антимонопольное законодательство' => [], 'Специальная оценка условий труда' => [] ] @@ -30,13 +31,13 @@ class PagesTableSeeder extends Seeder 'children' => [ 'Структура' => [], 'Документы' => [], - 'Решения' => [] + 'Решения' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE] ] ], 'Закупки' => [], 'Противодействие коррупции' => [ 'children' => [ - 'ФЗ, указы, постановления' => [], + 'ФЗ, указы, постановления' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Ведомственные нормативные правовые акты' => [], 'Внутренние нормативные документы' => [], 'Антикоррупционная экспертиза' => [], @@ -54,7 +55,7 @@ class PagesTableSeeder extends Seeder 'children' => [ 'Нормирование и стандартизация' => [ 'children' => [ - 'Реестр сводов правил' => [], + 'Реестр сводов правил' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::RULESET], 'Разработка сводов правил' => [], 'Прикладные исследования' => [], 'Реестр нормативно-технической документации' => [], @@ -63,7 +64,7 @@ class PagesTableSeeder extends Seeder ], 'Оценка пригодности' => [ 'children' => [ - 'Реестр технических свидетельств' => [], + 'Реестр технических свидетельств' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'Заявка на оформление' => [], 'Предварительная заявка' => [], ] @@ -74,7 +75,7 @@ class PagesTableSeeder extends Seeder 'Секретариат' => [], 'Структура' => [], 'Состав' => [], - 'Документы' => [], + 'Документы' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::SIMPLE], 'АИС ТК 465 «Строительство»' => [], ] ], @@ -97,7 +98,10 @@ class PagesTableSeeder extends Seeder 'Основополагающие документы' => [], 'Решения ЦОС' => [], 'Руководящие документы' => [], - 'Реестры' => [], + 'Реестр органов по сертификации' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFIERS], + 'Реестр испытательных лабораторий' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::LABORATORIES], + 'Реестр экспертов' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::EXPERTS], + 'Реестр сертификатов соответствия' => ['type' => PageType::REGISTRY, 'registry_type' => RegistryType::CERTIFICATES], 'Бланки документов' => [], ] ], @@ -151,8 +155,7 @@ class PagesTableSeeder extends Seeder ] ]; - public function run() - { + public function run() { $ord = 0; collect($this->pages)->each(function ($data, $name) use (&$ord) { $data['ord'] = $ord++; @@ -160,16 +163,12 @@ class PagesTableSeeder extends Seeder }); } - public function importPage($name, $data, ?Page $parent = null) - { + public function importPage($name, $data, ?Page $parent = null) { $slug = Str::slug(Str::transliterate($name)); + $data += ['type' => $data['type'] ?? PageType::CONTENT, 'name' => $name]; $page = Page::firstOrCreate(['parent_id' => $parent->id ?? 0, 'slug' => $slug]); - $page->update([ - 'name' => $name, - 'type' => $data['type'] ?? PageType::CONTENT, - 'sub_type' => $data['sub_type'] ?? null - ]); - if ($v = collect($data)->except('children')->all()) $page->update($v); + if ($v = collect($data)->except('children', 'registry_type')->all()) $page->update($v); + if ($page->type === PageType::REGISTRY) $page->registry->update(['type' => $data['registry_type'] ?? RegistryType::SIMPLE]); $ord = 0; collect($data['children'] ?? [])->each(function ($data, $name) use ($page, &$ord) { $data['ord'] = $ord++; diff --git a/resources/views/mail/feedback/support.blade.php b/resources/views/mail/feedback/support.blade.php index e78dfef..47ed0d5 100644 --- a/resources/views/mail/feedback/support.blade.php +++ b/resources/views/mail/feedback/support.blade.php @@ -2,8 +2,8 @@ @section('content')
Поступило обращение с сайта.
-Email отправителя: {{$data['feedback-email']}}
-Имя отправителя: {{$data['feedback-name']}}
-Тема сообщения: {{$data['feedback-type']}}
-Сообщение: {{$data['feedback-message']}}
+Email отправителя: {{$data['feedback-email'] ?? '-'}}
+Имя отправителя: {{$data['feedback-name'] ?? '-'}}
+Тема сообщения: {{$data['feedback-type'] ?? '-'}}
+Сообщение: {!! nl2br($data['feedback-message'] ?? '-') !!}
@endsection \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index e2044a7..192ca75 100644 --- a/routes/api.php +++ b/routes/api.php @@ -23,6 +23,14 @@ Route::get('publications', 'Api\Publications\PublicationsController@index'); Route::get('publications/find', 'Api\Publications\PublicationsController@find'); Route::get('publications/{id}', 'Api\Publications\PublicationsController@show'); +Route::apiResource('object-types', 'Api\Objects\ObjectTypesController'); + +Route::group(['prefix' => 'forms'], function() { + Route::get('/{target}/{type?}/{id?}', 'Api\Forms\FormsController@get'); + Route::post('/{target}/{type?}/{id?}', 'Api\Forms\FormsController@save'); +}); + + Route::group(['prefix' => 'registries'], function() { Route::get('/categories', 'Api\Registries\CategoriesController@index'); Route::get('/categories/{id}', 'Api\Registries\CategoriesController@show'); @@ -39,6 +47,8 @@ Route::group(['prefix' => 'registries'], function() { }); }); +Route::get('filters/{type}', 'Api\Forms\FormsController@filters'); + Route::group(['middleware' => ['auth:api']], function() { Route::apiResource('users', 'Api\Users\UsersController'); Route::apiResource('roles', 'Api\Users\RolesController'); @@ -63,13 +73,6 @@ Route::group(['middleware' => ['auth:api']], function() { Route::put('objects/move/{id}', 'Api\Objects\ObjectsController@move'); Route::apiResource('objects', 'Api\Objects\ObjectsController'); - Route::apiResource('object-types', 'Api\Objects\ObjectTypesController'); - - Route::group(['prefix' => 'forms'], function() { - Route::get('/{target}/{type?}/{id?}', 'Api\Forms\FormsController@get'); - Route::post('/{target}/{type?}/{id?}', 'Api\Forms\FormsController@save'); - }); - Route::get('filters/{type}', 'Api\Forms\FormsController@filters'); Route::get('dadata/{inn}', 'Api\Companies\CompaniesController@getDataByInn');