2222use models \exceptions \ValidationException ;
2323use models \main \Member ;
2424use models \summit \ISponsorUserInfoGrantRepository ;
25+ use models \summit \ISummitAttendeeRepository ;
2526use models \summit \SponsorBadgeScan ;
2627use models \summit \SponsorUserInfoGrant ;
2728use models \summit \Summit ;
@@ -45,21 +46,29 @@ final class SponsorUserInfoGrantService
4546 */
4647 private $ badge_repository ;
4748
49+ /**
50+ * @var ISummitAttendeeRepository
51+ */
52+ private $ attendee_repository ;
53+
4854 /**
4955 * SponsorBadgeScanService constructor.
5056 * @param ISponsorUserInfoGrantRepository $repository
57+ * @param ISummitAttendeeRepository $attendee_repository
5158 * @param ISummitAttendeeBadgeRepository $badge_repository
5259 * @param ITransactionService $tx_service
5360 */
5461 public function __construct
5562 (
5663 ISponsorUserInfoGrantRepository $ repository ,
64+ ISummitAttendeeRepository $ attendee_repository ,
5765 ISummitAttendeeBadgeRepository $ badge_repository ,
5866 ITransactionService $ tx_service
5967 )
6068 {
6169 parent ::__construct ($ tx_service );
6270 $ this ->repository = $ repository ;
71+ $ this ->attendee_repository = $ attendee_repository ;
6372 $ this ->badge_repository = $ badge_repository ;
6473 }
6574
@@ -104,10 +113,53 @@ public function addGrant(Summit $summit, int $sponsor_id, Member $current_member
104113 public function addBadgeScan (Summit $ summit , Member $ current_member , array $ data ): SponsorBadgeScan
105114 {
106115 return $ this ->tx_service ->transaction (function () use ($ summit , $ current_member , $ data ){
116+ $ raw_qr_code = $ data ['qr_code ' ] ?? null ;
117+ $ raw_attendee_email = $ data ['attendee_email ' ] ?? null ;
118+ if (empty ($ raw_qr_code ) && empty ($ raw_attendee_email ))
119+ throw new ValidationException ("Missing required parameters (qr_code or attendee_email). " );
120+ $ ticket_number = null ;
121+ $ qr_code = null ;
122+ $ source = null ;
123+ if (!empty ($ raw_qr_code )) {
124+ $ qr_code = SummitAttendeeBadge::decodeQRCodeFor ($ summit , $ raw_qr_code );
125+ $ fields = SummitAttendeeBadge::parseQRCode ($ qr_code );
126+ $ prefix = $ fields ['prefix ' ];
127+ if ($ summit ->getBadgeQRPrefix () != $ prefix )
128+ throw new ValidationException
129+ (
130+ sprintf
131+ (
132+ "%s qr code is not valid for summit %s. " ,
133+ $ qr_code ,
134+ $ summit ->getId ()
135+ )
136+ );
137+ $ ticket_number = $ fields ['ticket_number ' ];
138+ $ source = SponsorBadgeScan::Source_QR;
139+ }
140+ else if (!empty ($ raw_attendee_email )) {
141+ if (!$ current_member ->isAdmin ())
142+ throw new ValidationException ("User should have admin rights. " );
143+
144+ $ attendee = $ this ->attendee_repository ->getBySummitAndEmail ($ summit , trim ($ raw_attendee_email ));
145+ if (is_null ($ attendee )){
146+ throw new EntityNotFoundException ("Attendee not found. " );
147+ }
148+ $ ticket = null ;
149+ foreach ($ attendee ->getTickets () as $ t ) {
150+ if ($ t ->isActive () && $ t ->hasBadge ()) { $ ticket = $ t ; break ; }
151+ }
152+
153+ if (is_null ($ ticket )){
154+ throw new EntityNotFoundException ("Ticket not found. " );
155+ }
156+ $ ticket_number = $ ticket ->getNumber ();
157+ $ badge = $ ticket ->getBadge ();
158+ // normalize qr code
159+ $ qr_code = SummitAttendeeBadge::decodeQRCodeFor ($ summit , $ badge ->getQRCode ());
160+ $ source = SponsorBadgeScan::Source_Attendee_Email;
161+ }
107162
108- $ qr_code = SummitAttendeeBadge::decodeQRCodeFor ($ summit , $ data ['qr_code ' ]);
109- $ fields = SummitAttendeeBadge::parseQRCode ($ qr_code );
110- $ prefix = $ fields ['prefix ' ];
111163 $ scan_date_epoch = intval ($ data ['scan_date ' ]);
112164 $ scan_date = new \DateTime ("@ $ scan_date_epoch " );
113165 $ begin_date = $ summit ->getBeginDate ();
@@ -117,24 +169,14 @@ public function addBadgeScan(Summit $summit, Member $current_member, array $data
117169 if(!($scan_date >= $begin_date && $scan_date <= $end_date))
118170 throw new ValidationException("scan_date is does not belong to summit period.");
119171 */
120-
121- if ($ summit ->getBadgeQRPrefix () != $ prefix )
122- throw new ValidationException
123- (
124- sprintf
125- (
126- "%s qr code is not valid for summit %s " ,
127- $ qr_code ,
128- $ summit ->getId ()
129- )
130- );
131-
132- $ ticket_number = $ fields ['ticket_number ' ];
172+ if (empty ($ ticket_number )){
173+ throw new ValidationException ("Ticket not found. " );
174+ }
133175
134176 $ badge = $ this ->badge_repository ->getBadgeByTicketNumber ($ ticket_number );
135177
136178 if (is_null ($ badge ))
137- throw new EntityNotFoundException ("badge not found " );
179+ throw new EntityNotFoundException ("badge not found. " );
138180
139181 $ sponsor = $ current_member ->getSponsorBySummit ($ summit );
140182
@@ -146,6 +188,7 @@ public function addBadgeScan(Summit $summit, Member $current_member, array $data
146188 $ scan ->setQRCode ($ qr_code );
147189 $ scan ->setUser ($ current_member );
148190 $ scan ->setBadge ($ badge );
191+ $ scan ->setSource ($ source );
149192 $ scan ->setNotes (isset ($ data ['notes ' ])? trim ($ data ['notes ' ]): "" );
150193
151194 $ sponsor ->addUserInfoGrant ($ scan );
@@ -228,4 +271,4 @@ public function getBadgeScan(Summit $summit, Member $current_member, int $scan_i
228271 return $ scan ;
229272 });
230273 }
231- }
274+ }
0 commit comments