diff --git a/app/Events/Feedback/FeedbackFormSubmitted.php b/app/Events/Feedback/FeedbackFormSubmitted.php new file mode 100644 index 0000000..46330cd --- /dev/null +++ b/app/Events/Feedback/FeedbackFormSubmitted.php @@ -0,0 +1,20 @@ +object = $object; + $this->mailto = $mailto; + } +} diff --git a/app/Events/FeedbackSender.php b/app/Events/FeedbackSender.php deleted file mode 100644 index 8298436..0000000 --- a/app/Events/FeedbackSender.php +++ /dev/null @@ -1,19 +0,0 @@ -email = $email; - $this->data = $data; - } -} diff --git a/app/Listeners/Feedback/SendFeedbackFormNotifications.php b/app/Listeners/Feedback/SendFeedbackFormNotifications.php new file mode 100644 index 0000000..4ae0113 --- /dev/null +++ b/app/Listeners/Feedback/SendFeedbackFormNotifications.php @@ -0,0 +1,20 @@ +mailto)->send(new NotifyFeedbackFormSubmitted($event->object)); + } catch (\Exception $exception) { + var_dump($exception); + } + } +} diff --git a/app/Listeners/SendFeedbackMessage.php b/app/Listeners/SendFeedbackMessage.php deleted file mode 100644 index 7977e54..0000000 --- a/app/Listeners/SendFeedbackMessage.php +++ /dev/null @@ -1,19 +0,0 @@ -email)->send(new FeedbackSender($event->data)); - } catch (\Exception $exception) { - var_dump($exception); - } - } -} diff --git a/app/Mail/Feedback/NotifyFeedbackFormSubmitted.php b/app/Mail/Feedback/NotifyFeedbackFormSubmitted.php new file mode 100644 index 0000000..0d8082e --- /dev/null +++ b/app/Mail/Feedback/NotifyFeedbackFormSubmitted.php @@ -0,0 +1,27 @@ +object = $object; + } + + public function build(): NotifyFeedbackFormSubmitted { + $this->subject('Поступило новое обращение')->view('mail.feedback.submitted'); + $this->object->attachedFiles->each(function($asset) { + $this->attachFromStorage($asset->path); + }); + return $this; + } +} diff --git a/app/Mail/FeedbackSender.php b/app/Mail/FeedbackSender.php deleted file mode 100644 index afe83ee..0000000 --- a/app/Mail/FeedbackSender.php +++ /dev/null @@ -1,22 +0,0 @@ -data = $data; - } - - public function build() { - return $this->subject('Поступило новое обращение')->view('mail.feedback.support'); - } -} diff --git a/app/Models/Objects/Field.php b/app/Models/Objects/Field.php index 848c946..edd66fb 100644 --- a/app/Models/Objects/Field.php +++ b/app/Models/Objects/Field.php @@ -89,6 +89,10 @@ class Field extends Model { return new $transformer; } + public function getIsFileAttribute(): bool { + return in_array($this->type, [FieldType::DOCUMENT, FieldType::IMAGE]); + } + public function getRepresented($filters = [], ?FiltersService $service = null): ?Collection { diff --git a/app/Models/Objects/NirObject.php b/app/Models/Objects/NirObject.php index 2d098e9..e42ced1 100644 --- a/app/Models/Objects/NirObject.php +++ b/app/Models/Objects/NirObject.php @@ -148,6 +148,28 @@ class NirObject extends Model { return $result; } + public function parsedValue($fieldName): ?string { + if ($field = $this->type->getField($fieldName)) return $field->getValue($this->id)->map(function($val) use($field) { + if ($field->type === FieldType::BOOLEAN) return $val ? 'Да' : 'Нет'; + elseif ($field->type === FieldType::DATE) return $val ? $val->format('d.m.Y') : null; + elseif ($field->type === FieldType::TIME) return $val ? $val->format('H:i') : null; + elseif ($field->type === FieldType::DATETIME) return $val ? $val->format('d.m.Y H:i') : null; + else return $val->caption ?? $val->title ?? $val->name ?? $val; + })->implode('; '); + return null; + } + + public function getAttachedFilesAttribute(): Collection { + $result = collect(); + $this->properties->each(function($group) use(&$result) { + $group->fields->each(function($field) use(&$result) { + if ($field->isFile) $this->getValue($field->name)->each(function($asset) use(&$result) {$result->push($asset);}); + }); + }); + return $result; + } + + public function setValues(array $values): Collection { return collect($values)->map(function($value, $fieldName) { return $this->setValue($fieldName, $value); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 57ff795..11f7fed 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -4,12 +4,12 @@ namespace App\Providers; use App\Events\Applications\ApplicationExpertChanged; use App\Events\Applications\ApplicationStatusChanged; -use App\Events\FeedbackSender; +use App\Events\Feedback\FeedbackFormSubmitted; use App\Events\PasswordRecovered; use App\Events\UserRegistered; use App\Listeners\Applications\SendApplicationExpertChangedNotifications; use App\Listeners\Applications\SendApplicationStatusChangedNotifications; -use App\Listeners\SendFeedbackMessage; +use App\Listeners\Feedback\SendFeedbackFormNotifications; use App\Listeners\SendPasswordRecoveredNotification; use App\Listeners\SendRegistrationNotification; use Illuminate\Auth\Events\Registered; @@ -27,8 +27,8 @@ class EventServiceProvider extends ServiceProvider { PasswordRecovered::class => [ SendPasswordRecoveredNotification::class ], - FeedbackSender::class => [ - SendFeedbackMessage::class + FeedbackFormSubmitted::class => [ + SendFeedbackFormNotifications::class ], ApplicationStatusChanged::class => [ diff --git a/app/Services/Forms/Feedback/FeedbackForms.php b/app/Services/Forms/Feedback/FeedbackForms.php index 0d29362..301642f 100644 --- a/app/Services/Forms/Feedback/FeedbackForms.php +++ b/app/Services/Forms/Feedback/FeedbackForms.php @@ -2,32 +2,20 @@ namespace App\Services\Forms\Feedback; -use App\Events\FeedbackSender; -use App\Models\Objects\NirObject; +use App\Events\Feedback\FeedbackFormSubmitted; +use App\Models\Objects\ObjectType; use App\Services\Forms\FormsService; +use App\Transformers\Objects\ObjectTransformer; +use Illuminate\Http\JsonResponse; class FeedbackForms extends FormsService { - public array $formTitles = ['create' => 'Создание операции', 'update' => 'Редактирование операции']; - - public function form(?string $id = null, array $data = []): array { - $model = NirObject::byUuid($id)->first(); - $groups = [ - ['name' => 'common', 'fields' => $this->commonGroupFields($model)] - ]; - return ['title' => $this->formTitle($model), 'data' => $groups]; - } - - public function commonGroupFields(?NirObject $model): array { - return []; - } - - - public function store(array $data) { - event(new FeedbackSender($data['mailto'], $data)); - return null; - } - - public function update(string $id, array $data) { + public function store(array $data): ?JsonResponse { + if ($objectType = ObjectType::byUuid($data['type'] ?? null)->first()) { + $object = $objectType->objects()->create(); + $object->setValues($data); + if (!empty($data['mailto'])) event(new FeedbackFormSubmitted($object, $data['mailto'])); + return fractal($object, new ObjectTransformer())->respond(); + } return null; } } diff --git a/resources/views/mail/feedback/submitted.blade.php b/resources/views/mail/feedback/submitted.blade.php new file mode 100644 index 0000000..d9d5988 --- /dev/null +++ b/resources/views/mail/feedback/submitted.blade.php @@ -0,0 +1,10 @@ +@extends('mail.layouts.layout') + +@section('content') +
Поступило обращение с сайта {{env('APP_URL')}}.
+ @foreach($object->properties as $group) + @foreach($group->fields as $field) + @if(!$field->isFile){{$field->title}}: {{$object->parsedValue($field->name)}}
@endif + @endforeach + @endforeach +@endsection \ No newline at end of file diff --git a/resources/views/mail/feedback/support.blade.php b/resources/views/mail/feedback/support.blade.php deleted file mode 100644 index bec7160..0000000 --- a/resources/views/mail/feedback/support.blade.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends('mail.layouts.layout') - -@section('content') -Поступило обращение с сайта {{env('APP_URL')}}.
-Email отправителя: {{$data['feedback-email'] ?? '-'}}
-Имя отправителя: {{$data['feedback-name'] ?? '-'}}
-Сообщение: {!! nl2br($data['feedback-message'] ?? '-') !!}
-@endsection \ No newline at end of file