Skip to content
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
node_modules
.ideas
# Ignore files generated by PhpStorm
/*/*/.idea/
/*/*/.idea/
patch
4 changes: 4 additions & 0 deletions commerce_pos.links.task.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ commerce_pos.close_register:
route_name: 'commerce_pos.close_register'
base_route: 'commerce_pos.main'
description: 'Close Register'

commerce_pos.select_register:
deriver: 'Drupal\commerce_pos\Plugin\Derivative\DynamicSelectRegister'
weight: 100
2 changes: 2 additions & 0 deletions commerce_pos.permissions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@
title: 'Use the commerce point of sale standard functionality'
'access commerce pos order lookup':
title: 'Use the commerce point of sale order lookup'
'change commerce pos active register':
title: 'Change the active commerce point of sale register'
8 changes: 8 additions & 0 deletions commerce_pos.routing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ commerce_pos.order_lookup:
requirements:
_permission: 'access commerce pos order lookup'

commerce_pos.select_register:
path: '/admin/commerce/pos/register'
defaults:
_form: '\Drupal\commerce_pos\Form\RegisterSelectForm'
_title: 'Point of Sale Select Register'
requirements:
_permission: 'modify commerce pos register'

commerce_pos.parked_order_lookup:
path: '/admin/commerce/pos/orders/parked'
defaults:
Expand Down
4 changes: 4 additions & 0 deletions src/Form/POSForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,10 @@ protected function addTotalsDisplay(array &$form, FormStateInterface $form_state
$form['totals'] = [
'#type' => 'container',
];
$current_register = \Drupal::service('commerce_pos.current_register')->get()->getName();
$form['totals']['register'] = [
'#markup' => '<div class="current-register">Register: ' . $current_register . '</div>',
];

$number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory');
$number_formatter = $number_formatter_factory->createInstance();
Expand Down
2 changes: 1 addition & 1 deletion src/Form/RegisterSelectForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
return $form;
}

$register_options = ['' => '-'];
$register_options = [];
foreach ($registers as $id => $register) {
$register_options[$id] = $register->getName();
}
Expand Down
32 changes: 32 additions & 0 deletions src/Plugin/Derivative/DynamicSelectRegister.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Drupal\commerce_pos\Plugin\Derivative;

use Drupal\commerce_pos\Registers;
use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\StringTranslation\StringTranslationTrait;

/**
* Defines dynamic local tasks for select register.
*/
class DynamicSelectRegister extends DeriverBase {
use StringTranslationTrait;

/**
* {@inheritdoc}
*/
public function getDerivativeDefinitions($base_plugin_definition) {
$registers = new Registers();
$registers = $registers->getRegisters();
if (count($registers) > 1) {
$this->derivatives['select_register'] = $base_plugin_definition;
$this->derivatives['select_register']['title'] = $this->t("Select Register");
$this->derivatives['select_register']['base_route'] = 'commerce_pos.main';
$this->derivatives['select_register']['route_name'] = 'commerce_pos.select_register';
return $this->derivatives;
}
return '';
}

}

96 changes: 96 additions & 0 deletions tests/src/FunctionalJavascript/SelectRegisterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

namespace Drupal\Tests\commerce_pos\FunctionalJavascript;

use Drupal\commerce_pos\Entity\Register;
use Drupal\commerce_price\Price;
use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
use Drupal\Tests\commerce_pos\Functional\CommercePosCreateStoreTrait;

/**
* Tests the Register selection.
*
* @group commerce_pos
*/
class SelectRegisterTest extends JavascriptTestBase {
use CommercePosCreateStoreTrait;

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

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

$test_store = $this->setUpStore();
$register = Register::create([
'store_id' => $test_store->id(),
'name' => 'Other register',
'default_float' => new Price('100.00', 'USD'),
]);
$register->save();
$this->drupalLogin($this->rootUser);
}

/**
* Tests adding and removing products from the POS form.
*/
public function testRegisterSelection() {
$web_assert = $this->assertSession();
$this->drupalGet('admin/commerce/pos/main');

$this->getSession()->getPage()->fillField('register', '1');
$this->getSession()->getPage()->fillField('float[number]', '10.00');
$this->getSession()->getPage()->findButton('Open Register')->click();
$current_register_name = Register::load($this->getSession()->getCookie('commerce_pos_register'))->getName();

// Now we should be able to select order items.
$autocomplete_field = $this->getSession()->getPage()->findField('order_items[target_id][product_selector]');
$autocomplete_field->setValue('Jum');
$this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), 'p');
$web_assert->waitOnAutocomplete();
$results = $this->getSession()->getPage()->findAll('css', '.ui-autocomplete li');
$this->assertCount(3, $results);
// Click on of the auto-complete.
$results[0]->click();
$web_assert->assertWaitOnAjaxRequest();

// Assert that the product is listed as expected.
$web_assert->pageTextContains('Jumper');
$web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
$web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
$web_assert->pageTextContains('Total $50.00');
$web_assert->pageTextContains('To Pay $50.00');

// Goto register seletion page.
$this->drupalGet('admin/commerce/pos/register');

// Asserting current register.
$field = $this->assertSession()->optionExists('register', 1)->getText();
$this->assertEquals($field, $current_register_name);
$this->getSession()->getPage()->fillField('register', '2');
$this->getSession()->getPage()->fillField('float[number]', '10.00');
$this->getSession()->getPage()->findButton('Open Register')->click();

$this->drupalGet('admin/commerce/pos/main');
$web_assert->pageTextNotContains("Register: $current_register_name");
$current_register_name = Register::load($this->getSession()->getCookie('commerce_pos_register'))->getName();
$web_assert->pageTextContains("Register: $current_register_name");

// Assert that the product is listed as expected.
$web_assert->pageTextContains('Jumper');
$web_assert->fieldValueEquals('order_items[target_id][order_items][0][quantity]', '1.00');
$web_assert->fieldValueEquals('order_items[target_id][order_items][0][unit_price][number]', '50.00');
$web_assert->pageTextContains('Total $50.00');
$web_assert->pageTextContains('To Pay $50.00');
}

}