From 948257a0006daa053b4de5f3cd9af924e12fd225 Mon Sep 17 00:00:00 2001 From: Aleix Quintana <22647-kinta@users.noreply.drupalcode.org> Date: Fri, 19 Jan 2024 10:48:59 +0000 Subject: [PATCH 1/5] Provide activate operation to tickets list --- src/CommerceTicketListBuilder.php | 11 +++- src/CommerceTicketRouteProvider.php | 36 +++++++++++ src/Entity/CommerceTicket.php | 4 +- src/Form/CommerceTicketActivateForm.php | 79 +++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/Form/CommerceTicketActivateForm.php diff --git a/src/CommerceTicketListBuilder.php b/src/CommerceTicketListBuilder.php index 1fbae3e..ba40922 100644 --- a/src/CommerceTicketListBuilder.php +++ b/src/CommerceTicketListBuilder.php @@ -153,12 +153,21 @@ class CommerceTicketListBuilder extends EntityListBuilder { if ($this->currentUser->hasPermission('administer commerce_ticketing') && $entity->getState()->getId() == 'active') { $operations['resend_ticket'] = [ - 'title' => $this->t('Resend ticket receipt'), + 'title' => $this->t('Send ticket receipt'), 'weight' => 20, 'url' => $entity->toUrl('resend-ticket-form'), ]; } + if ($this->currentUser->hasPermission('administer commerce_ticketing') + && $entity->getState()->getId() == 'created') { + $operations['activate_ticket'] = [ + 'title' => $this->t('Activate ticket'), + 'weight' => 20, + 'url' => $entity->toUrl('activate-ticket-form'), + ]; + } + $destination = $this->redirectDestination->getAsArray(); foreach ($operations as $key => $operation) { $operations[$key]['query'] = $destination; diff --git a/src/CommerceTicketRouteProvider.php b/src/CommerceTicketRouteProvider.php index 63c13d6..8360c19 100644 --- a/src/CommerceTicketRouteProvider.php +++ b/src/CommerceTicketRouteProvider.php @@ -101,6 +101,10 @@ class CommerceTicketRouteProvider extends AdminHtmlRouteProvider { $collection->add('entity.commerce_ticket.resend_ticket_form', $resend_ticket_form_route); } + if ($activate_ticket_form_route = $this->getActivateTicketFormRoute($entity_type)) { + $collection->add('entity.commerce_ticket.activate_ticket_form', $activate_ticket_form_route); + } + if ($admin_collection_route = $this->getAdminCollectionRoute($entity_type)) { $collection->add('entity.commerce_ticket.admin-collection', $admin_collection_route); } @@ -161,4 +165,36 @@ class CommerceTicketRouteProvider extends AdminHtmlRouteProvider { return $route; } + /** + * Gets the activate-form route. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * The entity type. + * + * @return \Symfony\Component\Routing\Route|null + * The generated route, if available. + */ + protected function getActivateTicketFormRoute(EntityTypeInterface $entity_type) { + $route = new Route($entity_type->getLinkTemplate('activate-ticket-form')); + $route + ->addDefaults([ + '_entity_form' => 'commerce_ticket.activate-ticket', + '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::title', + ]) + ->setRequirement('_permission', 'administer commerce_ticketing') + ->setRequirement('commerce_order', '\d+') + ->setRequirement('commerce_ticket', '\d+') + ->setOption('parameters', [ + 'commerce_order' => [ + 'type' => 'entity:commerce_order', + ], + 'commerce_ticket' => [ + 'type' => 'entity:commerce_ticket', + ], + ]) + ->setOption('_admin_route', TRUE); + + return $route; + } + } diff --git a/src/Entity/CommerceTicket.php b/src/Entity/CommerceTicket.php index 7a0ce68..612a2dc 100644 --- a/src/Entity/CommerceTicket.php +++ b/src/Entity/CommerceTicket.php @@ -31,7 +31,8 @@ use Drupal\user\UserInterface; * "add" = "Drupal\commerce_ticketing\Form\CommerceTicketForm", * "edit" = "Drupal\commerce_ticketing\Form\CommerceTicketForm", * "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm", - * "resend-ticket" = "Drupal\commerce_ticketing\Form\CommerceTicketReceiptResendForm" + * "resend-ticket" = "Drupal\commerce_ticketing\Form\CommerceTicketReceiptResendForm", + * "activate-ticket" = "Drupal\commerce_ticketing\Form\CommerceTicketActivateForm" * }, * "route_provider" = { * "html" = "Drupal\commerce_ticketing\CommerceTicketRouteProvider", @@ -50,6 +51,7 @@ use Drupal\user\UserInterface; * "canonical" = "/commerce_ticket/{commerce_ticket}", * "add-page" = "/admin/commerce/orders/{commerce_order}/tickets/add", * "resend-ticket-form" = "/admin/commerce/orders/{commerce_order}/{commerce_ticket}/resend", + * "activate-ticket-form" = "/admin/commerce/orders/{commerce_order}/{commerce_ticket}/activate", * "collection" = "/admin/commerce/orders/{commerce_order}/tickets", * "admin-collection" = "/admin/commerce/tickets", * "add-form" = "/admin/commerce/orders/{commerce_order}/tickets/add/{commerce_ticket_type}", diff --git a/src/Form/CommerceTicketActivateForm.php b/src/Form/CommerceTicketActivateForm.php new file mode 100644 index 0000000..c2e0126 --- /dev/null +++ b/src/Form/CommerceTicketActivateForm.php @@ -0,0 +1,79 @@ +get('entity.repository'), + $container->get('entity_type.bundle.info'), + $container->get('datetime.time') + ); + } + + /** + * {@inheritdoc} + */ + public function getQuestion() { + return $this->t('Are you sure you want to activate the ticket %label?', [ + '%label' => $this->entity->label(), + ]); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return $this->t('Activate ticket'); + } + + /** + * {@inheritdoc} + */ + public function getCancelUrl() { + return $this->entity->toUrl('collection'); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + /** @var \Drupal\commerce_ticketing\CommerceTicketInterface $ticket */ + $ticket = $this->entity; + $ticket_state = $ticket->getState(); + $ticket_state_transitions = $ticket_state->getTransitions(); + $ticket_state->applyTransition($ticket_state_transitions['activate']); + $ticket->save(); + + // Probe it is active to show message. + if ($ticket->getState()->getId() == 'active') { + $this->messenger()->addMessage($this->t('Ticket @id activated.', ['@id' => $ticket->id()])); + } + } + +} -- GitLab From 6ea9accc4a5386077e6b9bfc1f5471744bbb9220 Mon Sep 17 00:00:00 2001 From: Aleix Quintana <22647-kinta@users.noreply.drupalcode.org> Date: Fri, 19 Jan 2024 11:37:17 +0000 Subject: [PATCH 2/5] Allow multiple order states to autoactivate --- commerce_ticketing.module | 3 ++- config/schema/commerce_ticketing.schema.yml | 4 +++- src/EventSubscriber/OrderEventSubscriber.php | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/commerce_ticketing.module b/commerce_ticketing.module index 06ed4c4..881bc34 100644 --- a/commerce_ticketing.module +++ b/commerce_ticketing.module @@ -68,7 +68,8 @@ function commerce_ticketing_form_commerce_product_variation_type_form_alter(arra '#type' => 'select', '#title' => t('Activate ticket on order state'), '#options' => $options, - '#default_value' => $order_state ?: 'completed', + '#default_value' => $order_state ?: ['completed'], + '#multiple' => TRUE, '#required' => TRUE, '#states' => [ 'visible' => [ diff --git a/config/schema/commerce_ticketing.schema.yml b/config/schema/commerce_ticketing.schema.yml index 1597beb..f65a581 100644 --- a/config/schema/commerce_ticketing.schema.yml +++ b/config/schema/commerce_ticketing.schema.yml @@ -9,8 +9,10 @@ commerce_product.commerce_product_variation_type.*.third_party.commerce_ticketin type: boolean label: 'Auto activate ticket' order_state: - type: string + type: sequence label: 'Create the ticket when the order is in the following state' + sequence: + type: string commerce_order.commerce_order_type.*.third_party.commerce_ticketing: type: mapping diff --git a/src/EventSubscriber/OrderEventSubscriber.php b/src/EventSubscriber/OrderEventSubscriber.php index bfcb5c3..c9fac33 100644 --- a/src/EventSubscriber/OrderEventSubscriber.php +++ b/src/EventSubscriber/OrderEventSubscriber.php @@ -205,7 +205,7 @@ class OrderEventSubscriber implements EventSubscriberInterface { $variation_type = ProductVariationType::load($ticket->getPurchasedEntity()->bundle()); $order_state = $variation_type->getThirdPartySetting('commerce_ticketing', 'order_state'); $auto_activate_ticket = $variation_type->getThirdPartySetting('commerce_ticketing', 'auto_activate_ticket'); - if ($auto_activate_ticket && $order->getState()->getId() == $order_state && $ticket->getState()->getId() == 'created') { + if ($auto_activate_ticket && in_array($order->getState()->getId(), $order_state) && $ticket->getState()->getId() == 'created') { $ticket_state = $ticket->getState(); $ticket_state_transitions = $ticket_state->getTransitions(); $ticket_state->applyTransition($ticket_state_transitions['activate']); -- GitLab From b666764286376f4dd9b4bc89745877f49501131e Mon Sep 17 00:00:00 2001 From: Aleix Quintana <22647-kinta@users.noreply.drupalcode.org> Date: Fri, 19 Jan 2024 12:52:14 +0000 Subject: [PATCH 3/5] Add change to schema --- commerce_ticketing.install | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/commerce_ticketing.install b/commerce_ticketing.install index 58b3f07..0739a27 100644 --- a/commerce_ticketing.install +++ b/commerce_ticketing.install @@ -25,3 +25,21 @@ function commerce_ticketing_update_9001() { $config_source = new FileStorage($config_path); $config_installer->installOptionalConfig($config_source); } + +/** + * Convert allowed order types to sequence. + */ +function example_update_9002() { + $config_factory = \Drupal::configFactory(); + foreach ($config_factory->listAll('commerce_product.commerce_product_variation_type.') as $variation_type_config_name) { + $variation_type_config = $config_factory->getEditable($variation_type_config_name); + + $order_state_val = $variation_type_config->get('third_party_settings.commerce_ticketing.order_state'); + if (!is_array($order_state_val)) { + $variation_type_config->set('third_party_settings.commerce_ticketing.order_state', [$order_state_val]); + $variation_type_config->save(TRUE); + } + } + $message = "Conversion of order types states for ticketing done"; + return $message; +} -- GitLab From 5a47479ce374280fba3122db79bbcdccf9d8b859 Mon Sep 17 00:00:00 2001 From: Aleix Quintana <22647-kinta@users.noreply.drupalcode.org> Date: Fri, 19 Jan 2024 15:02:26 +0000 Subject: [PATCH 4/5] check allowed states when create tickets. Fix included config --- ...commerce_product.commerce_product_variation_type.ticket.yml | 3 ++- src/CommerceTicketCreateTickets.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/install/commerce_product.commerce_product_variation_type.ticket.yml b/config/install/commerce_product.commerce_product_variation_type.ticket.yml index 6ba63c0..3e5e94c 100644 --- a/config/install/commerce_product.commerce_product_variation_type.ticket.yml +++ b/config/install/commerce_product.commerce_product_variation_type.ticket.yml @@ -4,7 +4,8 @@ third_party_settings: commerce_ticketing: auto_create_ticket: true auto_activate_ticket: true - order_state: completed + order_state: + - completed id: ticket label: Ticket orderItemType: default diff --git a/src/CommerceTicketCreateTickets.php b/src/CommerceTicketCreateTickets.php index 19cfdb5..1c489b1 100644 --- a/src/CommerceTicketCreateTickets.php +++ b/src/CommerceTicketCreateTickets.php @@ -47,7 +47,7 @@ trait CommerceTicketCreateTickets { $auto_activate_ticket = $variation_type->getThirdPartySetting('commerce_ticketing', 'auto_activate_ticket'); $default_state = 'created'; - if ($auto_activate_ticket && $order->getState()->getId() == $order_state) { + if ($auto_activate_ticket && in_array($order->getState()->getId(), $order_state)) { $default_state = 'active'; } -- GitLab From 02cb603e60f3eb99107124cc4c5ebfcd9a2cd8e3 Mon Sep 17 00:00:00 2001 From: Aleix Quintana <22647-kinta@users.noreply.drupalcode.org> Date: Fri, 19 Jan 2024 15:38:19 +0000 Subject: [PATCH 5/5] treat default order_state as empty array when not defined in form --- commerce_ticketing.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commerce_ticketing.module b/commerce_ticketing.module index 881bc34..6c1ece6 100644 --- a/commerce_ticketing.module +++ b/commerce_ticketing.module @@ -91,7 +91,7 @@ function commerce_ticketing_variation_type_form_submit(array $form, FormStateInt $auto_create_ticket = !empty($form_state->getValue('auto_create_ticket')) ? $form_state->getValue('auto_create_ticket') : FALSE; $auto_activate_ticket = !empty($form_state->getValue('auto_activate_ticket')) ? $form_state->getValue('auto_activate_ticket') : FALSE; - $order_state = !empty($form_state->getValue('order_state')) ? $form_state->getValue('order_state') : ''; + $order_state = !empty($form_state->getValue('order_state')) ? $form_state->getValue('order_state') : ['']; $variation_type->setThirdPartySetting('commerce_ticketing', 'auto_create_ticket', $auto_create_ticket); $variation_type->setThirdPartySetting('commerce_ticketing', 'auto_activate_ticket', $auto_activate_ticket); -- GitLab