108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Form\Requests;
 | |
| 
 | |
| use App\Contribution\Contracts\HasContributionData;
 | |
| use App\Contribution\Data\MemberData;
 | |
| use App\Contribution\Documents\ContributionDocument;
 | |
| use App\Country;
 | |
| use App\Form\Editor\FormConditionResolver;
 | |
| use App\Form\Enums\SpecialType;
 | |
| use App\Form\Models\Form;
 | |
| use Carbon\Carbon;
 | |
| use Illuminate\Support\Collection;
 | |
| use Illuminate\Support\Facades\Validator;
 | |
| use Spatie\LaravelData\Data;
 | |
| 
 | |
| class FormCompileRequest extends Data implements HasContributionData {
 | |
| 
 | |
|     public function __construct(public Form $form) {}
 | |
| 
 | |
|     /**
 | |
|      * @return class-string<ContributionDocument>
 | |
|      */
 | |
|     public function type(): string
 | |
|     {
 | |
|         $payload = json_decode(rawurldecode(base64_decode(request()->input('payload'))), true);
 | |
| 
 | |
|         return $payload['type'];
 | |
|     }
 | |
| 
 | |
|     public function dateFrom(): Carbon
 | |
|     {
 | |
|         return $this->form->from;
 | |
|     }
 | |
| 
 | |
|     public function dateUntil(): Carbon
 | |
|     {
 | |
|         return $this->form->to;
 | |
|     }
 | |
| 
 | |
|     public function zipLocation(): string
 | |
|     {
 | |
|         return $this->form->zip.' '.$this->form->location;
 | |
|     }
 | |
| 
 | |
|     public function eventName(): string
 | |
|     {
 | |
|         return $this->form->name;
 | |
|     }
 | |
| 
 | |
|     public function members(): Collection
 | |
|     {
 | |
|         $members = [];
 | |
|         $fields = [
 | |
|             [SpecialType::FIRSTNAME, 'firstname'],
 | |
|             [SpecialType::LASTNAME, 'lastname'],
 | |
|             [SpecialType::BIRTHDAY, 'birthday'],
 | |
|             [SpecialType::GENDER, 'gender'],
 | |
|             [SpecialType::ADDRESS, 'address'],
 | |
|             [SpecialType::ZIP, 'zip'],
 | |
|             [SpecialType::LOCATION, 'location'],
 | |
|         ];
 | |
| 
 | |
|         foreach ($this->form->participants as $participant) {
 | |
|             $member = [];
 | |
|             foreach ($fields as [$type, $name]) {
 | |
|                 $f = $this->form->getFields()->findBySpecialType($type);
 | |
|                 if (!$f) {
 | |
|                     continue;
 | |
|                 }
 | |
|                 $member[$name] = $participant->getFields()->find($f)->value;
 | |
|             }
 | |
| 
 | |
|             $members[] = [
 | |
|                 'is_leader' => $participant->matchesCondition($participant->form->leader_conditions),
 | |
|                 'gender' => 'weiblich',
 | |
|                 ...$member,
 | |
|             ];
 | |
|         }
 | |
| 
 | |
|         return MemberData::fromApi($members);
 | |
|     }
 | |
| 
 | |
|     public function country(): ?Country
 | |
|     {
 | |
|         return Country::first();
 | |
|     }
 | |
| 
 | |
|     public function validateContribution(): void
 | |
|     {
 | |
|         Validator::make($this->form->toArray(), [
 | |
|             'zip' => 'required',
 | |
|             'location' => 'required'
 | |
|         ])
 | |
|             ->after(function($validator) {
 | |
|                 foreach ($this->type()::requiredFormSpecialTypes() as $type) {
 | |
|                     if (!$this->form->getFields()->hasSpecialType($type)) {
 | |
|                         $validator->errors()->add($type->name, 'Kein Feld für ' . $type->value . ' vorhanden.');
 | |
|                     }
 | |
|                 }
 | |
|                 if ($this->form->participants->count() === 0) {
 | |
|                     $validator->errors()->add('participants',  'Veranstaltung besitzt noch keine Teilnehmer*innen.');
 | |
|                 }
 | |
|             })
 | |
|             ->validate();
 | |
|     }
 | |
| }
 |