- π¬π§United Kingdom Rob-PS
I have tried option using OR to test if the negate is picking up
customer buys 1
set to product
product A (the cart product(s) )custiomer gets 1
set to product
product B (the cart add-on product(s) )
add on is set to "100% off" so is Free.------- I use in the 'plus' select block --------
product variation = "product X within A" --> Negate
(There is nothing here to place "OR")
-----------------------------------------
The result should be "not a free add-on". But the result is a free add-on.------- I use in the 'plus' select block --------
product variation = "product Z within A"
-----------------------------------------
The result is "not a free add-on", which is correct.So negate fails.
- π¬π§United Kingdom Rob-PS
Would it be possible to use an attribute to select on?
Then negating things is not always needed (still has to be solved for case like "not dollar currency".------- the 'plus' select block --------------
attribute = "free product"
-----------------------------------------
Hence if a product attribute is set to "Charged" then the product is not free. - π¬π§United Kingdom Rob-PS
Imagines there are 500 shirt products with the same discount. Only 2 have a different offer.
You don't to create 498 variation entries, and then new promotions for the other two.I tested creating a promo with order group x "discount all" then give 2 poducts of that group a different discount. That does not work, the result is always all get discounted.
Proposal:
Add the option to add AND / OR between the offers to create a combined offer like this.
OFFER 1 --- discount all products
OR if
OFFER 2 --- discount this separate (of that product group in OFFER 1)
OR if
OFFER 3 --- discount this separate (of that product group in OFFER 1)
-----------------------------------------
Create AND/OR and drag to position-------standard condition block -------------
conditions with AND / OR options
all conditions must pass or only one <--- this seems to apply only to the condition area.
-----------------------------------------Would be helpful if also the offers groups can be dragged to reorder.
- π¬π§United Kingdom Rob-PS
Thanks for the response, apologies for "hyjacking" the issue.
Is there still work done on the 'negate' issue not working in the condition interface or temporary delayed?
I tried several ways using "Order contains specific product variations" with the OR option to see if that works. I need this and what ever I try nothing works, in all cases the negate is ignored.In the interface I have something set which should NOT be applied when there is an item in the condition interface like 1 Product variation, this to create an exception.
Thanks!
- πΊπΈUnited States nicxvan
Ok I've installed and applied this patch, it seems to work for adding negated conditions to promotions. I'll test further if it actually works, but the form interface seems clean to me.
- last update
about 1 year ago 6 pass - @nicxvan opened merge request.
- Status changed to RTBC
about 1 year ago 2:23pm 7 September 2023 - πΊπΈUnited States nicxvan
I've tested this with roles and everything works!
I've also converted it to an MR and removed some unused code.
- Status changed to Needs work
about 1 year ago 2:53pm 7 September 2023 For this to work, the conditions need to be able to be nested under the AND and OR conditions.
As it is right now they do work with out nesting, they don't work with nesting. To reproduce, put whatever conditions you are checking nested under an AND condition, and they don't work.
Also noticed in removing the added AND operator and and resaving the promotion, I get the following error:
The website encountered an unexpected error. Please try again later. TypeError: Drupal\commerce_conditions_plus\ConditionsEvaluator::evaluateConditionGroup(): Argument #2 ($operator) must be of type string, null given, called in /var/www/html/web/modules/contrib/commerce_conditions_plus/src/ConditionsEvaluator.php on line 65 in Drupal\commerce_conditions_plus\ConditionsEvaluator->evaluateConditionGroup() (line 86 of modules/contrib/commerce_conditions_plus/src/ConditionsEvaluator.php). Drupal\commerce_conditions_plus\ConditionsEvaluator->execute(Array, 'AND', Array) (Line: 39) Drupal\commerce_conditions_plus\Entity\Promotion->applies(Object) (Line: 131) Drupal\commerce_promotion\PromotionOrderProcessor->process(Object) (Line: 189) Drupal\commerce_order\OrderRefresh->refresh(Object) (Line: 113) Drupal\commerce_order\OrderStorage->doOrderPreSave(Object) (Line: 78) Drupal\commerce_order\OrderStorage->invokeHook('presave', Object) (Line: 529) Drupal\Core\Entity\EntityStorageBase->doPreSave(Object) (Line: 753) Drupal\Core\Entity\ContentEntityStorageBase->doPreSave(Object) (Line: 483) Drupal\Core\Entity\EntityStorageBase->save(Object) (Line: 806) Drupal\Core\Entity\Sql\SqlContentEntityStorage->save(Object) (Line: 159) Drupal\commerce_order\OrderStorage->save(Object) (Line: 339) Drupal\Core\Entity\EntityBase->save() (Line: 280) Drupal\commerce_cart\Plugin\views\field\EditQuantity->viewsFormSubmit(Array, Object) (Line: 183) Drupal\views\Form\ViewsFormMainForm->submitForm(Array, Object) (Line: 190) Drupal\views\Form\ViewsForm->submitForm(Array, Object) call_user_func_array(Array, Array) (Line: 114) Drupal\Core\Form\FormSubmitter->executeSubmitHandlers(Array, Object) (Line: 52) Drupal\Core\Form\FormSubmitter->doSubmitForm(Array, Object) (Line: 597) Drupal\Core\Form\FormBuilder->processForm('views_form_commerce_cart_form_default_8997', Array, Object) (Line: 325) Drupal\Core\Form\FormBuilder->buildForm(Object, Object) (Line: 224) Drupal\Core\Form\FormBuilder->getForm(Object, Object, Array) (Line: 2269) Drupal\views\Plugin\views\display\DisplayPluginBase->elementPreRender(Array) call_user_func_array(Array, Array) (Line: 111) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 377) Drupal\Core\Render\Renderer->doRender(Array) (Line: 449) Drupal\Core\Render\Renderer->doRender(Array) (Line: 449) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 238) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 583) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 231) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 128) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 111) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 187) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 76) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 106) Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 85) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 50) Drupal\ban\BanMiddleware->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object, 1, 1) (Line: 704) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)