diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php index 660f7b81a..a64201c14 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php @@ -15,6 +15,7 @@ use App\Http\Utils\EpochCellFormatter; use App\Jobs\Emails\InviteAttendeeTicketEditionMail; use App\Jobs\Emails\SummitAttendeeAllTicketsEditionEmail; +use App\Jobs\Emails\SummitAttendeeRegistrationIncompleteReminderEmail; use App\Jobs\Emails\SummitAttendeeTicketRegenerateHashEmail; use App\Jobs\SynchAllAttendeesStatus; use App\ModelSerializers\SerializerUtils; @@ -847,7 +848,8 @@ public function send($summit_id) 'email_flow_event' => 'required|string|in:' . join(',', [ SummitAttendeeTicketRegenerateHashEmail::EVENT_SLUG, InviteAttendeeTicketEditionMail::EVENT_SLUG, - SummitAttendeeAllTicketsEditionEmail::EVENT_SLUG + SummitAttendeeAllTicketsEditionEmail::EVENT_SLUG, + SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG ]), 'attendees_ids' => 'sometimes|int_array', ]); diff --git a/app/Jobs/Emails/Registration/Attendees/SummitAttendeeRegistrationIncompleteReminderEmail.php b/app/Jobs/Emails/Registration/Attendees/SummitAttendeeRegistrationIncompleteReminderEmail.php new file mode 100644 index 000000000..919b7fcd6 --- /dev/null +++ b/app/Jobs/Emails/Registration/Attendees/SummitAttendeeRegistrationIncompleteReminderEmail.php @@ -0,0 +1,80 @@ +getFullName(); + $payload['owner_company'] = $attendee->getCompanyName(); + $payload['owner_email'] = $attendee->getEmail(); + + if(empty($payload['owner_full_name'])){ + $payload['owner_full_name'] = $payload['owner_email']; + } + + $summit = $attendee->getSummit(); + + $payload['summit_name'] = $summit->getName(); + $payload['summit_logo'] = $summit->getLogoUrl(); + $payload['summit_virtual_site_url'] = $summit->getVirtualSiteUrl(); + $payload['summit_marketing_site_url'] = $summit->getMarketingSiteUrl(); + + $base_url = Config::get("registration.dashboard_base_url", null); + if (empty($base_url)) + throw new \InvalidArgumentException("missing dashboard_base_url value"); + + $back_url = Config::get("registration.dashboard_back_url", null); + if (empty($back_url)) + throw new \InvalidArgumentException("missing dashboard_back_url value"); + + $payload['manage_orders_url'] = sprintf($back_url, $base_url); + + $support_email = $summit->getSupportEmail(); + $payload['support_email'] = !empty($support_email) ? $support_email: Config::get("registration.support_email", null); + + if (empty($payload['support_email'])) + throw new \InvalidArgumentException("missing support_email value"); + + $template_identifier = $this->getEmailTemplateIdentifierFromEmailEvent($summit); + Log::debug(sprintf("SummitAttendeeRegistrationIncompleteReminderEmail::__construct payload %s template %s", + json_encode($payload), $template_identifier)); + + parent::__construct($payload, $template_identifier, $payload['owner_email'] ); + } + + protected function getEmailEventSlug(): string + { + return self::EVENT_SLUG; + } + + // metadata + const EVENT_SLUG = 'SUMMIT_REGISTRATION_INCOMPLETE_ATTENDEE_REMINDER'; + const EVENT_NAME = 'SUMMIT_REGISTRATION_INCOMPLETE_ATTENDEE_REMINDER'; + const DEFAULT_TEMPLATE = 'SUMMIT_REGISTRATION_INCOMPLETE_ATTENDEE_REMINDER'; +} \ No newline at end of file diff --git a/app/Services/Model/Strategies/EmailActions/EmailActionsStrategyFactory.php b/app/Services/Model/Strategies/EmailActions/EmailActionsStrategyFactory.php index fda60d98a..ed252569a 100644 --- a/app/Services/Model/Strategies/EmailActions/EmailActionsStrategyFactory.php +++ b/app/Services/Model/Strategies/EmailActions/EmailActionsStrategyFactory.php @@ -14,6 +14,7 @@ use App\Jobs\Emails\InviteAttendeeTicketEditionMail; use App\Jobs\Emails\SummitAttendeeAllTicketsEditionEmail; +use App\Jobs\Emails\SummitAttendeeRegistrationIncompleteReminderEmail; use App\Jobs\Emails\SummitAttendeeTicketRegenerateHashEmail; /** @@ -33,6 +34,8 @@ public function build(String $flow_event): ?AbstractEmailAction { return new SummitAttendeeTicketEmailStrategy($flow_event); case SummitAttendeeAllTicketsEditionEmail::EVENT_SLUG: return new SummitAttendeeAllCurrentTicketsEmailStrategy($flow_event); + case SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG: + return new SummitAttendeeRegistrationIncompleteReminderStrategy($flow_event); default: return null; } diff --git a/app/Services/Model/Strategies/EmailActions/SummitAttendeeRegistrationIncompleteReminderStrategy.php b/app/Services/Model/Strategies/EmailActions/SummitAttendeeRegistrationIncompleteReminderStrategy.php new file mode 100644 index 000000000..785783dbf --- /dev/null +++ b/app/Services/Model/Strategies/EmailActions/SummitAttendeeRegistrationIncompleteReminderStrategy.php @@ -0,0 +1,54 @@ +isComplete()) { + Log::debug + ( + sprintf + ( + "SummitAttendeeRegistrationIncompleteReminderStrategy::sending reminder to attendee %s - flow event %s", + $attendee->getEmail(), + $this->flow_event + ) + ); + SummitAttendeeRegistrationIncompleteReminderEmail::dispatch($attendee); + } else { + Log::debug + ( + sprintf + ( + "SummitAttendeeRegistrationIncompleteReminderStrategy::nothing to send due to attendee (%s) status is complete", + $attendee->getEmail() + ) + ); + } + } +} \ No newline at end of file diff --git a/database/migrations/model/Version20220216144229.php b/database/migrations/model/Version20220216144229.php new file mode 100644 index 000000000..af5204da0 --- /dev/null +++ b/database/migrations/model/Version20220216144229.php @@ -0,0 +1,60 @@ +getRepository(SummitEmailFlowType::class); + $flow = $repository->findOneBy([ + "name" => "Registration" + ]); + SummitEmailFlowTypeSeeder::createEventsTypes( + [ + [ + 'name' => SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_NAME, + 'slug' => SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG, + 'default_email_template' => SummitAttendeeRegistrationIncompleteReminderEmail::DEFAULT_TEMPLATE + ] + ], + $flow + ); + $em->persist($flow); + $em->flush(); + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema): void + { + + } +} diff --git a/database/migrations/model/Version20220218124421.php b/database/migrations/model/Version20220218124421.php new file mode 100644 index 000000000..bf80387d0 --- /dev/null +++ b/database/migrations/model/Version20220218124421.php @@ -0,0 +1,47 @@ +getRepository(Summit::class); + $summits = $repository->findAll(); + foreach($summits as $summit){ + $summit->seedDefaultEmailFlowEvents(); + $em->persist($summit); + } + $em->flush(); + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema): void + { + + } +} diff --git a/database/seeders/SummitEmailFlowTypeSeeder.php b/database/seeders/SummitEmailFlowTypeSeeder.php index b2e47a9a3..1ba3a92b4 100644 --- a/database/seeders/SummitEmailFlowTypeSeeder.php +++ b/database/seeders/SummitEmailFlowTypeSeeder.php @@ -11,6 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + +use App\Jobs\Emails\SummitAttendeeRegistrationIncompleteReminderEmail; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use App\Models\Foundation\Summit\EmailFlows\SummitEmailFlowType; @@ -129,6 +131,11 @@ public static function seed(){ 'slug' => SummitTicketReminderEmail::EVENT_SLUG, 'default_email_template' => SummitTicketReminderEmail::DEFAULT_TEMPLATE ], + [ + 'name' => SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_NAME, + 'slug' => SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG, + 'default_email_template' => SummitAttendeeRegistrationIncompleteReminderEmail::DEFAULT_TEMPLATE + ], // refunds [ 'name' => SummitOrderRefundAccepted::EVENT_NAME, diff --git a/tests/AttendeeServiceTest.php b/tests/AttendeeServiceTest.php index c4c45b9a3..7226e5300 100644 --- a/tests/AttendeeServiceTest.php +++ b/tests/AttendeeServiceTest.php @@ -13,6 +13,7 @@ **/ use App\Jobs\Emails\SummitAttendeeAllTicketsEditionEmail; +use App\Jobs\Emails\SummitAttendeeRegistrationIncompleteReminderEmail; use App\Models\Foundation\Main\IGroup; use App\Services\Model\IAttendeeService; use Illuminate\Support\Facades\App; @@ -71,4 +72,16 @@ public function testSendAllAttendeeTicketsByAttendeeIds() { $service->send(self::$summit->getId(), $payload); } + + public function testSendRegistrationIncompleteReminderByAttendeeIds() { + + $service = App::make(IAttendeeService::class); + + $payload = [ + "email_flow_event" => SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG, + "attendees_ids" => [self::$summit->getAttendees()[0]->getId()], + ]; + + $service->send(self::$summit->getId(), $payload); + } } \ No newline at end of file