Commit 527bed43 authored by tonytheferg's avatar tonytheferg
Browse files

Issue #3193124 by tonytheferg, ericchew: Allow duplicating groups

parent 7a8d6e4d
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
 *       "default" = "Drupal\commerce_vado\Form\VadoGroupForm",
 *       "add" = "Drupal\commerce_vado\Form\VadoGroupForm",
 *       "edit" = "Drupal\commerce_vado\Form\VadoGroupForm",
 *       "duplicate" = "Drupal\commerce_vado\Form\VadoGroupForm",
 *       "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
 *     },
 *     "local_task_provider" = {
@@ -51,6 +52,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
 *     "canonical" = "/admin/commerce/vado-groups/{commerce_vado_group}",
 *     "add-form" = "/admin/commerce/vado-groups/add",
 *     "edit-form" = "/admin/commerce/vado-groups/{commerce_vado_group}/edit",
 *     "duplicate-form" = "/admin/commerce/vado-groups/{commerce_vado_group}/duplicate",
 *     "delete-form" = "/admin/commerce/vado-groups/{commerce_vado_group}/delete",
 *     "delete-multiple-form" = "/admin/commerce/vado-groups/delete",
 *     "collection" = "/admin/commerce/vado-groups",
@@ -60,6 +62,27 @@ use Drupal\Core\Field\BaseFieldDefinition;
 */
class VadoGroup extends ContentEntityBase implements VadoGroupInterface {

  /**
   * Duplicates commerce vado groups and their group items.
   */
  public function createDuplicate() {
    $duplicate_group = parent::createDuplicate();
    /** @var \Drupal\commerce_vado\Entity\VadoGroupInterface $duplicate_group */
    $duplicate_group_items = [];
    foreach ($duplicate_group->getItems() as $group_item) {
      // Create a duplicate for each group_item so it has a new id.
      $duplicate_group_item = $group_item->createDuplicate();
      // Set the group_id for the duplicate_group_item.
      $duplicate_group_item->set('group_id', $duplicate_group->id());
      // Add the duplicate_group_item to the duplicate_group_items array.
      $duplicate_group_items[] = $duplicate_group_item;
    }
    // Set the duplicate_group_items to the duplicate_group.
    $duplicate_group->setItems($duplicate_group_items);

    return $duplicate_group;
  }

  /**
   * {@inheritdoc}
   */
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ interface VadoGroupInterface extends ContentEntityInterface {
  public function hasItems();

  /**
   * Adds an group item.
   * Adds a group item.
   *
   * @param \Drupal\commerce_vado\Entity\VadoGroupItemInterface $group_item
   *   The group item.
+6 −1
Original line number Diff line number Diff line
@@ -10,12 +10,15 @@ use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\entity\Form\EntityDuplicateFormTrait;

/**
 * Provides the group form.
 */
class VadoGroupForm extends ContentEntityForm {

  use EntityDuplicateFormTrait;

  /**
   * The vado group widget plugin manager.
   *
@@ -89,7 +92,9 @@ class VadoGroupForm extends ContentEntityForm {
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $this->entity->save();
    $group = $this->getEntity();
    $group->save();
    $this->postSave($group, $this->operation);
    $this->messenger()->addMessage($this->t('The variation add-on group %label has been successfully saved.', ['%label' => $this->entity->label()]));
    $form_state->setRedirect('entity.commerce_vado_group.collection');
  }
+251 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\commerce_vado\Kernel\Entity;

use Drupal\commerce_vado\Entity\VadoGroup;
use Drupal\commerce_vado\Entity\VadoGroupItem;
use Drupal\commerce_product\Entity\ProductVariation;
use Drupal\Tests\commerce_cart\Kernel\CartKernelTestBase;

/**
 * Tests the Group entity.
 *
 * @group commerce_vado
 */
class VadoGroupTest extends CartKernelTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = [
    'commerce_vado',
  ];

  /**
   * The vado field manager.
   *
   * @var \Drupal\commerce_vado\VadoFieldManagerInterface
   */
  protected $vadoFieldManager;

  /**
   * A sample user.
   *
   * @var \Drupal\user\UserInterface
   */
  protected $user;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->installEntitySchema('commerce_vado_group_item');
    $this->installEntitySchema('commerce_vado_group');
    $this->installConfig(['commerce_vado']);

    $this->vadoFieldManager = $this->container->get('commerce_vado.field_manager');
    $this->vadoFieldManager->installField('variation_groups', 'default');

    $user = $this->createUser([], ['administer commerce_vado_group']);
    $this->user = $this->reloadEntity($user);
    $this->container->get('current_user')->setAccount($user);

    $this->variation1 = ProductVariation::create([
      'type' => 'default',
      'sku' => strtolower($this->randomMachineName()),
      'title' => $this->randomString(),
      'status' => 0,
    ]);
    $this->variation1->save();

    $this->variation2 = ProductVariation::create([
      'type' => 'default',
      'sku' => strtolower($this->randomMachineName()),
      'title' => $this->randomString(),
      'status' => 1,
    ]);
    $this->variation2->save();

    $this->group_item1 = VadoGroupItem::create();
    $this->group_item1->save();
    $this->group_item1->set('variation', $this->variation1);
    $this->group_item1->save();
    // setItems() and addItem() do not seem to set the group_id backreference.
    $this->group_item1->set('group_id', 1);
    $this->group_item1->save();

    $this->group_item2 = VadoGroupItem::create();
    $this->group_item2->save();
    $this->group_item2->set('variation', $this->variation2);
    $this->group_item2->save();
    // setItems() and addItem() do not seem to set the group_id backreference.
    $this->group_item2->set('group_id', 1);
    $this->group_item2->save();

    $this->group_items = [
      $this->group_item1,
      $this->group_item2,
    ];

    $this->group = VadoGroup::create();
    $this->group->save();
    $this->group->set('title', 'Group 1');
    $this->group->save();
  }

  /**
   * The vado group test.
   */
  public function testVadoGroup() {

    $this->group->setCreatedTime(635879700);
    $this->assertEquals(635879700, $this->group->getCreatedTime());

    $this->group->setRequired(TRUE);
    $this->group->save();
    $this->assertTrue($this->group->isRequired());
    $this->group->setRequired(FALSE);
    $this->group->save();
    $this->assertFalse($this->group->isRequired());

    $this->group->setGroupDiscount(10);
    $this->group->save();
    $this->assertTrue($this->group->hasGroupDiscount());
    $this->assertEquals(10, $this->group->getGroupDiscount());
    $this->assertEquals(.9, $this->group->getGroupDiscountMultiplier());
    $this->assertEquals(.1, $this->group->getGroupDiscountAmountMultiplier());
    $this->group->setGroupDiscount(NULL);
    $this->group->save();
    $this->assertFalse($this->group->hasGroupDiscount());
  }

  /**
   * The vado group item group test.
   */
  public function testVadoGroupItemGroup() {

    $this->group->addItem($this->group_item1);
    $this->group->save();
    $this->assertTrue($this->group->hasItems());
    $this->assertTrue($this->group->hasItem($this->group_item1));
    $this->assertEquals(1, $this->group_item1->id());
    $this->assertEquals(1, $this->group_item1->getGroupId());
    $this->assertNotNull($this->group_item1->getGroup());
    $this->group->RemoveItem($this->group_item1);
    $this->group->save();
    $this->assertFalse($this->group->hasItems());
    $this->assertFalse($this->group->hasItem($this->group_item1));

    $this->group->setItems($this->group_items);
    $this->group->save();
    $this->assertTrue($this->group->hasItems());
    $this->assertTrue($this->group->hasItem($this->group_item1));
    $this->assertTrue($this->group->hasItem($this->group_item2));
    $this->assertEquals(1, $this->group_item1->id());
    $this->assertEquals(2, $this->group_item2->id());
    $this->assertEquals(1, $this->group_item1->getGroupId());
    $this->assertEquals(1, $this->group_item2->getGroupId());
    $this->assertNotNull($this->group_item1->getGroup());
    $this->assertNotNull($this->group_item2->getGroup());
  }

  /**
   * The vado group duplicate test.
   */
  public function testVadoGroupDuplicate() {

    // Set the group values to duplicate.
    $this->group->setRequired(TRUE);
    $this->group->save();
    $this->assertTrue($this->group->isRequired());

    $this->group->setGroupDiscount(10);
    $this->group->save();
    $this->assertTrue($this->group->hasGroupDiscount());
    $this->assertEquals(10, $this->group->getGroupDiscount());
    $this->assertEquals(.9, $this->group->getGroupDiscountMultiplier());
    $this->assertEquals(.1, $this->group->getGroupDiscountAmountMultiplier());

    $this->group->setItems($this->group_items);
    $this->group->save();

    $this->assertTrue($this->group->hasItems());
    $this->assertTrue($this->group->hasItem($this->group_item1));
    $this->assertTrue($this->group->hasItem($this->group_item2));
    $this->assertNotNull($this->group_item1->getGroup());
    $this->assertEquals(1, $this->group_item1->getGroupId());
    $this->assertNotNull($this->group_item2->getGroup());
    $this->assertEquals(1, $this->group_item2->getGroupId());
    $this->assertEquals(1, $this->group_item1->getVariationId());
    $this->assertEquals(2, $this->group_item2->getVariationId());

    // Create the duplicate group, and check it's values.
    $duplicate_group = $this->group->createDuplicate();
    $duplicate_group->save();
    $this->assertEquals('Group 1', $duplicate_group->label());
    $this->assertTrue($duplicate_group->isRequired());
    $this->assertEquals(10, $duplicate_group->getGroupDiscount());
    $this->assertTrue($duplicate_group->hasItems());
    $this->assertFalse($duplicate_group->hasItem($this->group_item1));
    $this->assertFalse($duplicate_group->hasItem($this->group_item2));

    // @todo Figure out a better way to identify the 2 duplicate group items.
    $duplicate_group_items = $duplicate_group->getItems();
    foreach ($duplicate_group_items as $duplicate_group_item) {
      if ($duplicate_group_item->id() == 3) {
        $duplicate_group_item1 = $duplicate_group_item;
      }
      if ($duplicate_group_item->id() == 4) {
        $duplicate_group_item2 = $duplicate_group_item;
      }
    }

    // Check that the duplicate group item id's are new, and successive.
    $this->assertTrue($duplicate_group->hasItem($duplicate_group_item1));
    $this->assertTrue($duplicate_group->hasItem($duplicate_group_item2));
    $this->assertEquals(2, $duplicate_group_item1->getGroupId());
    $this->assertNotNull($duplicate_group_item1->getGroup());
    $this->assertEquals(2, $duplicate_group_item2->getGroupId());
    $this->assertNotNull($duplicate_group_item2->getGroup());
    $this->assertNotEquals(1, $duplicate_group_item1->id());
    $this->assertNotEquals(2, $duplicate_group_item2->id());
    $this->assertEquals(3, $duplicate_group_item1->id());
    $this->assertEquals(4, $duplicate_group_item2->id());
    $this->assertEquals(1, $duplicate_group_item1->getVariationId());
    $this->assertEquals(2, $duplicate_group_item2->getVariationId());

    // Set the discount on original #1 and make sure duplicate #1 is still NULL.
    $this->group_item1->set('group_item_discount', 10);
    $this->group_item1->save();
    $this->assertEquals(10, $this->group_item1->getGroupItemDiscount());
    $this->assertNull($duplicate_group_item1->getGroupItemDiscount());

    // Remove duplicate #1 and make sure original #1 is still there.
    $duplicate_group->RemoveItem($duplicate_group_item1);
    $duplicate_group->save();
    $this->assertTrue($this->group->hasItem($this->group_item1));
    $this->assertFalse($duplicate_group->hasItem($duplicate_group_item1));
    $this->assertTrue($duplicate_group->hasItem($duplicate_group_item2));

    // Set the discount on duplicate #2 and make sure original #2 is still NULL.
    $duplicate_group_item2->set('group_item_discount', 10);
    $duplicate_group_item2->save();
    $this->assertEquals(10, $duplicate_group_item2->getGroupItemDiscount());
    $this->assertNull($this->group_item2->getGroupItemDiscount());

    // Delete the duplicate group and make sure the original group stays.
    $duplicate_group->delete();
    $this->assertTrue($this->group->hasItems());
    $this->assertTrue($this->group->hasItem($this->group_item1));
    $this->assertTrue($this->group->hasItem($this->group_item2));
    $this->assertNotNull($this->group_item1->getGroup());
    $this->assertEquals(1, $this->group_item1->getGroupId());
    $this->assertNotNull($this->group_item2->getGroup());
    $this->assertEquals(1, $this->group_item2->getGroupId());
  }

}