diff --git a/app/Http/routes.php b/app/Http/routes.php index 663488f0..e7a1c18b 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -201,7 +201,6 @@ Route::group([ Route::delete('', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitAttendeesApiController@deleteAttendeeTicket']); Route::put('reassign/{other_member_id}', [ 'middleware' => 'auth.user:administrators|summit-front-end-administrators', 'uses' => 'OAuth2SummitAttendeesApiController@reassignAttendeeTicket']); }); - }); }); }); diff --git a/app/Models/Foundation/Summit/Attendees/SummitAttendee.php b/app/Models/Foundation/Summit/Attendees/SummitAttendee.php index c68bada0..efbad768 100644 --- a/app/Models/Foundation/Summit/Attendees/SummitAttendee.php +++ b/app/Models/Foundation/Summit/Attendees/SummitAttendee.php @@ -118,7 +118,7 @@ class SummitAttendee extends SilverstripeBaseModel } /** - * @ORM\OneToMany(targetEntity="SummitAttendeeTicket", mappedBy="owner", cascade={"persist"}, orphanRemoval=true) + * @ORM\OneToMany(targetEntity="SummitAttendeeTicket", mappedBy="owner", cascade={"persist", "remove"}) * @var SummitAttendeeTicket[] */ private $tickets; diff --git a/app/Models/Foundation/Summit/Factories/SummitAttendeeTicketFactory.php b/app/Models/Foundation/Summit/Factories/SummitAttendeeTicketFactory.php index 4857bfff..8f8958de 100644 --- a/app/Models/Foundation/Summit/Factories/SummitAttendeeTicketFactory.php +++ b/app/Models/Foundation/Summit/Factories/SummitAttendeeTicketFactory.php @@ -30,6 +30,7 @@ final class SummitAttendeeTicketFactory public static function build(SummitAttendee $attendee, SummitTicketType $type, array $data){ $ticket = new SummitAttendeeTicket(); $attendee->addTicket($ticket); + if(isset($data['external_order_id'])) $ticket->setExternalOrderId($data['external_order_id']); if(isset($data['external_attendee_id'])) diff --git a/app/Services/Model/AttendeeService.php b/app/Services/Model/AttendeeService.php index e7c4ad34..7bcd4c36 100644 --- a/app/Services/Model/AttendeeService.php +++ b/app/Services/Model/AttendeeService.php @@ -311,13 +311,17 @@ final class AttendeeService extends AbstractService implements IAttendeeService if(is_null($ticket)){ throw new EntityNotFoundException("ticket not found"); } + $new_owner = $this->attendee_repository->getBySummitAndMember($summit, $other_member); if(is_null($new_owner)){ $new_owner = SummitAttendeeFactory::build($summit, $other_member, []); $this->attendee_repository->add($new_owner); } - $new_owner->addTicket($ticket); + $attendee->removeTicket($ticket); + + $new_owner->addTicket($ticket); + if(!$attendee->hasTickets()){ $this->attendee_repository->delete($attendee); } diff --git a/tests/OAuth2AttendeesApiTest.php b/tests/OAuth2AttendeesApiTest.php index e6ed6b74..0ace6801 100644 --- a/tests/OAuth2AttendeesApiTest.php +++ b/tests/OAuth2AttendeesApiTest.php @@ -292,4 +292,35 @@ class OAuth2AttendeesApiTest extends ProtectedApiTest $this->assertResponseStatus(204); } + + public function testReassignAttendeeTicket($summit_id = 25){ + $params = [ + 'id' => $summit_id, + 'attendee_id' => 14938, + 'ticket_id' => 15070, + 'other_member_id' => 13867, + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "PUT", + "OAuth2SummitAttendeesApiController@reassignAttendeeTicket", + $params, + [], + [], + [], + $headers, + '' + ); + + $content = $response->getContent(); + $this->assertResponseStatus(201); + $ticket = json_decode($content); + $this->assertTrue(!is_null($ticket)); + return $ticket; + } } \ No newline at end of file