diff --git a/.gitignore b/.gitignore index 2ea8568..dc3cf74 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules .ideas # Ignore files generated by PhpStorm -/*/*/.idea/ \ No newline at end of file +/*/*/.idea/ +patch \ No newline at end of file diff --git a/commerce_pos.links.task.yml b/commerce_pos.links.task.yml index 89da886..e547b25 100644 --- a/commerce_pos.links.task.yml +++ b/commerce_pos.links.task.yml @@ -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 diff --git a/commerce_pos.permissions.yml b/commerce_pos.permissions.yml index 1517321..ce148f5 100755 --- a/commerce_pos.permissions.yml +++ b/commerce_pos.permissions.yml @@ -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' diff --git a/commerce_pos.routing.yml b/commerce_pos.routing.yml index bd50cc1..3a7ceae 100644 --- a/commerce_pos.routing.yml +++ b/commerce_pos.routing.yml @@ -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: diff --git a/src/Form/POSForm.php b/src/Form/POSForm.php index 991480b..5724bb5 100644 --- a/src/Form/POSForm.php +++ b/src/Form/POSForm.php @@ -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' => '
Register: ' . $current_register . '
', + ]; $number_formatter_factory = \Drupal::service('commerce_price.number_formatter_factory'); $number_formatter = $number_formatter_factory->createInstance(); diff --git a/src/Form/RegisterSelectForm.php b/src/Form/RegisterSelectForm.php index b0fe09c..c4dfde8 100755 --- a/src/Form/RegisterSelectForm.php +++ b/src/Form/RegisterSelectForm.php @@ -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(); } diff --git a/src/Plugin/Derivative/DynamicSelectRegister.php b/src/Plugin/Derivative/DynamicSelectRegister.php new file mode 100644 index 0000000..59c4b90 --- /dev/null +++ b/src/Plugin/Derivative/DynamicSelectRegister.php @@ -0,0 +1,32 @@ +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 ''; + } + +} + diff --git a/tests/src/FunctionalJavascript/SelectRegisterTest.php b/tests/src/FunctionalJavascript/SelectRegisterTest.php new file mode 100644 index 0000000..74ad2f0 --- /dev/null +++ b/tests/src/FunctionalJavascript/SelectRegisterTest.php @@ -0,0 +1,96 @@ +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'); + } + +}