Maikel Linke
9f859f420d
Remove unnecessary error creation
2024-11-21 15:58:56 +11:00
Maikel Linke
0d8df5d2a8
Replace Bugsnag calls with Alert.raise
2024-11-21 15:58:55 +11:00
Maikel Linke
2201d2e8c2
VariantOverride with on_demand now overriding stock
...
Otherwise we would try to take stock from the producer stock level
without respecting their on-demand settings. So from now on:
If stock level or on_demand are set on the override then it's not using
producer stock levels.
2024-08-02 14:40:17 +10:00
Maikel Linke
e9f89362f4
Remove validation of positive stock when on demand
...
We weren't allowing negative stock to stop any bug from accidentally
drawing too much stock. But now we want to implement a backordering
logic that depends on negative stock levels to know how much is needed
to replenish stock levels.
2024-08-02 14:40:17 +10:00
cyrillefr
6d22652dfa
Requested changes on VariantOverrride
...
- change was not exactly equivalent, so reverting +
rubo comment
2024-07-09 16:06:45 +02:00
cyrillefr
ce8a2b3251
Fixes Rails/SkipsModelValidations offenses
...
- increments! & decrement! skip validations
- replaced increment! method calls
- one call was for a redefined increment! method
- the other for a regular(ActiveRecord::Persistence)
- removes increments/decrements definition now useless
2024-07-05 16:35:40 +02:00
Maikel
8837f1caa2
Revert "Allow negative stock levels for on-demand products"
2024-06-19 15:18:57 +10:00
Maikel Linke
d391faac64
Remove validation of positive stock when on demand
...
We weren't allowing negative stock to stop any bug from accidentally
drawing too much stock. But now we want to implement a backordering
logic that depends on negative stock levels to know how much is needed
to replenish stock levels.
2024-05-31 16:37:15 +10:00
cyrillefr
46cd60aa3c
Fix RedundantPresenceValidationOnBelongs on two files
...
- presence: true is redundant since Rails 5.0 BUT applies
with new default config of
belongs_to_required_by_default to true.
Lots of files with belongs_to_required_by_default = false
(backward compatibility).
So: deleting this setting implies to adding optional: true
- added 'NOT NULL' constraints so model constraints match
with contraints on DB tables.
- corresponding migration files to match AR Models &
DB tables
- rake tasks to check corrupt data (ie: NULL/nil in id fields)
- updated the todo
2024-05-22 09:44:02 +02:00
Neal Chambers
06e217c527
Safely autocorrect Rails/WhereNot
...
Inspecting 1483 files
........................................................................................................................C..................................................................................................................C...........CC.C..........................................C......C..........C.........................C......................CC..........C........................................................................................................................C.......................................................................................................C........................................................C...........................................................................................................................................C......................................C.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Offenses:
app/controllers/spree/admin/products_controller.rb:183:11: C: [Corrected] Rails/WhereNot: Use where.not(spree_variants: { import_date: nil }) instead of manually constructing negated SQL in where.
where('spree_variants.import_date IS NOT NULL').
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/concerns/permalink_generator.rb:37:26: C: [Corrected] Rails/WhereNot: Use where.not(id: id) instead of manually constructing negated SQL in where.
scope_with_deleted.where('id != ?', id)
^^^^^^^^^^^^^^^^^^^^
app/models/concerns/permalink_generator.rb:37:40: C: [Corrected] Style/HashSyntax: Omit the hash value.
scope_with_deleted.where.not(id: id)
^^
app/models/enterprise.rb:152:7: C: [Corrected] Rails/WhereNot: Use where.not(enterprises: { id: ready_enterprises }) instead of manually constructing negated SQL in where.
where("enterprises.id NOT IN (?)", ready_enterprises)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/enterprise.rb:158:31: C: [Corrected] Rails/WhereNot: Use where.not(sells: 'none') instead of manually constructing negated SQL in where.
scope :is_distributor, -> { where('sells != ?', 'none') }
^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/enterprise.rb:479:17: C: [Corrected] Rails/WhereNot: Use where.not(id: id) instead of manually constructing negated SQL in where.
dups = dups.where('id != ?', id) unless new_record?
^^^^^^^^^^^^^^^^^^^^
app/models/enterprise.rb:534:43: C: [Corrected] Rails/WhereNot: Use where.not(enterprises: { id: self }) instead of manually constructing negated SQL in where.
enterprises = owner.owned_enterprises.where('enterprises.id != ?', self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/enterprise.rb:583:7: C: [Corrected] Rails/WhereNot: Use where.not(enterprises: { id: id }) instead of manually constructing negated SQL in where.
where('enterprises.id != ?', id).
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/enterprise_fee.rb:40:24: C: [Corrected] Rails/WhereNot: Use where.not(spree_calculators: { type: PER_ORDER_CALCULATORS }) instead of manually constructing negated SQL in where.
joins(:calculator).where('spree_calculators.type NOT IN (?)', PER_ORDER_CALCULATORS)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/enterprise_relationship.rb:78:19: C: [Corrected] Rails/WhereNot: Use where.not(name: perms) instead of manually constructing negated SQL in where.
permissions.where('name NOT IN (?)', perms).destroy_all
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/product_import/inventory_reset_strategy.rb:27:16: C: [Corrected] Rails/WhereNot: Use where.not(id: excluded_items_ids) instead of manually constructing negated SQL in where.
relation.where('id NOT IN (?)', excluded_items_ids)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/proxy_order.rb:19:25: C: [Corrected] Rails/WhereNot: Use where.not(proxy_orders: { canceled_at: nil }) instead of manually constructing negated SQL in where.
scope :canceled, -> { where('proxy_orders.canceled_at IS NOT NULL') }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/spree/credit_card.rb:26:39: C: [Corrected] Rails/WhereNot: Use where.not(gateway_customer_profile_id: nil) instead of manually constructing negated SQL in where.
scope :with_payment_profile, -> { where('gateway_customer_profile_id IS NOT NULL') }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/spree/product.rb:166:9: C: [Corrected] Rails/WhereNot: Use where.not(order_cycles: { id: nil }) instead of manually constructing negated SQL in where.
where('order_cycles.id IS NOT NULL')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/spree/variant.rb:94:30: C: [Corrected] Rails/WhereNot: Use where.not(deleted_at: nil) instead of manually constructing negated SQL in where.
scope :deleted, lambda { where('deleted_at IS NOT NULL') }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/spree/variant.rb:165:43: C: [Corrected] Rails/WhereNot: Use where.not(spree_prices: { amount: nil }) instead of manually constructing negated SQL in where.
where('spree_prices.amount IS NOT NULL').
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/spree/zone.rb:141:19: C: [Corrected] Rails/WhereNot: Use where.not(id: id) instead of manually constructing negated SQL in where.
Spree::Zone.where('id != ?', id).update_all(default_tax: false) if default_tax
^^^^^^^^^^^^^^^^^^^^
app/models/spree/zone.rb:141:33: C: [Corrected] Style/HashSyntax: Omit the hash value.
Spree::Zone.where.not(id: id).update_all(default_tax: false) if default_tax
^^
app/models/variant_override.rb:32:7: C: [Corrected] Rails/WhereNot: Use where.not(variant_overrides: { import_date: nil }) instead of manually constructing negated SQL in where.
where('variant_overrides.import_date IS NOT NULL').
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/services/cap_quantity.rb:45:22: C: [Corrected] Rails/WhereNot: Use where.not(variant_id: available_variants_for.select(&:id)) instead of manually constructing negated SQL in where.
order.line_items.where('variant_id NOT IN (?)', available_variants_for.select(&:id))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
engines/catalog/app/services/catalog/product_import/products_reset_strategy.rb:32:18: C: [Corrected] Rails/WhereNot: Use where.not(spree_variants: { id: excluded_items_ids }) instead of manually constructing negated SQL in where.
relation.where('spree_variants.id NOT IN (?)', excluded_items_ids)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
engines/order_management/app/services/order_management/subscriptions/proxy_order_syncer.rb:78:18: C: [Corrected] Rails/WhereNot: Use where.not(order_cycle_id: order_cycle_ids) instead of manually constructing negated SQL in where.
orphaned.where('order_cycle_id NOT IN (?)', order_cycle_ids)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/reporting/reports/users_and_enterprises/base.rb:27:14: C: [Corrected] Rails/WhereNot: Use where.not(enterprises: { id: nil }) instead of manually constructing negated SQL in where.
.where("enterprises.id IS NOT NULL")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/reporting/reports/users_and_enterprises/base.rb:39:14: C: [Corrected] Rails/WhereNot: Use where.not(enterprise_id: nil) instead of manually constructing negated SQL in where.
.where("enterprise_id IS NOT NULL")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/reporting/reports/users_and_enterprises/base.rb:40:14: C: [Corrected] Rails/WhereNot: Use where.not(user_id: nil) instead of manually constructing negated SQL in where.
.where("user_id IS NOT NULL")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/data/anonymize_data.rake:50:16: C: [Corrected] Rails/WhereNot: Use where.not(user_id: nil) instead of manually constructing negated SQL in where.
Customer.where("user_id IS NOT NULL")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1483 files inspected, 26 offenses detected, 26 offenses corrected
2023-08-20 12:33:43 +09:00
Maikel Linke
8ef6966891
Declare old belongs_to default on remaining models
...
It would take ages to go through all files now and assess all belongs_to
associations. So I just declare the old default and then we can move on
and apply the new default for the application while these classes still
use the old one. All new models will then use the new default which is
the goal of this excercise and we can refactor old classes when we touch
them anyway.
2023-08-11 10:14:43 +10:00
Neal Chambers
1e4034534c
Fix Layout/LineLength
2023-06-23 09:08:04 +09:00
Guido Oliveira
65b760b119
Add validations to variant_override model
2021-06-04 14:11:22 -03:00
Maikel Linke
1364b878fe
Add ApplicationRecord for customisations
...
Rails 5 introduced this new class to confine application-specific monkey
patches to our models only, and not leak into other libraries using
ActiveRecord::Base.
https://bigbinary.com/blog/application-record-in-rails-5
2021-04-15 15:59:03 +10:00
Matt-Yorkley
26ed44412f
Update #validates definitions
...
Where the presence of an object is being validated and that object comes from an *association*, we should use `validates :object, presence: true` instead of `validates :object_id, presence: true`.
This does not apply in the same way to validations on uniqueness of certain attributes, such as `validates :object_id, uniqueness...`
2021-03-24 15:43:09 +00:00
Luis Ramos
13b8b3d4a5
Fix rubocop issues
2021-03-22 23:24:01 +00:00
Matt-Yorkley
bdbeb2feb8
Require missing dependency in VariantOverride
2021-03-18 21:53:00 +00:00
Pau Perez
060530cda8
Do not fetch VOs with deleted variant
...
In the line below we filter them out in Ruby so it's a waste of
resources. The fundamental difference is that `#includes` and
`#references` results in LEFT JOINs, whereas `#joins` results in INNER
JOIN, and because there's a default scope on `deleted_at IS NULL`, these
are not included in the result set.
This however, requires us to move away from the current algorithm but
unfortunately we can't refactor it completely yet.
Before:
```sql
SELECT *
FROM "variant_overrides"
LEFT OUTER
JOIN "spree_variants"
ON "spree_variants"."id" = "variant_overrides"."variant_id"
AND "spree_variants"."deleted_at" IS NULL
LEFT OUTER
JOIN "spree_products"
ON "spree_products"."id" = "spree_variants"."product_id"
AND "spree_products"."deleted_at" IS NULL
WHERE "variant_overrides"."permission_revoked_at" IS NULL
AND "variant_overrides"."hub_id" IN (
SELECT "enterprises"."id"
FROM "enterprises"
INNER
JOIN "enterprise_roles"
ON "enterprise_roles"."enterprise_id" = "enterprises"."id"
WHERE (enterprise_roles.user_id = ?)
AND (sells != 'none')
ORDER BY name)
```
After:
```sql
SELECT "variant_overrides".*
FROM "variant_overrides"
INNER
JOIN "spree_variants"
ON "spree_variants"."id" = "variant_overrides"."variant_id"
AND "spree_variants"."deleted_at" IS NULL
INNER
JOIN "spree_products"
ON "spree_products"."id" = "spree_variants"."product_id"
AND "spree_products"."deleted_at" IS NULL
WHERE "variant_overrides"."permission_revoked_at" IS NULL
AND "variant_overrides"."hub_id" IN (
SELECT "enterprises"."id"
FROM "enterprises"
INNER
JOIN "enterprise_roles"
ON "enterprise_roles"."enterprise_id" = "enterprises"."id"
WHERE (enterprise_roles.user_id = ?)
AND (sells != 'none')
ORDER BY name)
```
This is covered in the test suite by
spec/controllers/admin/variant_overrides_controller_spec.rb:72. It keeps
passing so we're good to go.
2021-02-01 14:47:51 +01:00
Luis Ramos
8a9dae0ee2
Run rubocop autocorrect
...
This is the result of bundle exec rubocop --auto-correct
2020-06-22 12:23:10 +01:00
Matt-Yorkley
d4311a848e
Fix default_scope deprecated syntax
2020-01-15 12:57:38 +01:00
Matt-Yorkley
ab330e882e
Remove product cache
2019-10-18 21:15:11 +01:00
luisramos0
b325cea6cb
Merge branch 'master' into 2-0-stable-Mar6
2019-03-06 09:19:53 +00:00
luisramos0
0b1ea1beda
Rename VariantOverride.use_producer_settings to VariantOverride.use_producer_stock_settings
2019-02-22 09:57:21 +00:00
luisramos0
45e5fed609
Improve scope_variant_to_hub code and spec by testing an invalid data state
2019-02-21 11:25:01 +00:00
luisramos0
ef786adcfc
Make variant_override.stock_overridden? simpler and add comment to explain relationship between count_on_hand and on_demand in a VO
2019-02-20 13:07:21 +00:00
luisramos0
75a79717cf
Adapt scope_variant_to_hub to new VO rules where on_demand nil is seen as use_producer_settings
2019-02-15 14:05:24 +00:00
luisramos0
e28f9a7c84
Merge branch 'master' into 2-0-stable-jan-8th
2019-01-08 14:29:50 +00:00
Kristina Lim
c873a7b8e3
Move stock settings override validation to concern
2018-12-09 23:29:36 +08:00
Kristina Lim
34313c94ca
Make reset stock settings for VO force limited stock
2018-12-09 21:47:05 +08:00
Kristina Lim
83b6973bc2
Require compatible VO on_demand and count_on_hand
2018-12-07 14:39:36 +08:00
luisramos0
d962358f15
Fix rubocop and transpec models/variant_override and its spec
2018-11-30 00:43:55 +00:00
luisramos0
0577011f5b
Refactor variant override model and its spec: simplify move_stock and remove unused methods
2018-11-30 00:22:04 +00:00
luisramos0
6156aca467
Delegate stock_location.move to variant, and override it in the variant overrides scope
2018-11-29 19:32:52 +00:00
niko
3ae38178a3
Move query from variant_overrides_controller to its model scope
2018-10-04 02:43:02 +02:00
Matt-Yorkley
a2a65a8900
PI inventories and overhaul
2018-05-26 19:34:19 +01:00
Pierre de Lacroix
2cd570383f
Use localize_number in models
2017-12-01 13:37:24 +11:00
Rob Harrington
7bb58342fc
Rubocop: Auto-correct Style/EmptyLineBetweenDefs offences
2017-06-23 16:49:08 +10:00
Rob Harrington
b6f4ce373e
Preloading variants for VariantOverride.indexed
2017-05-18 15:34:22 +10:00
Rob Harrington
348ab81c42
Overriding #increment! using variant overrides
2017-05-05 14:20:57 +10:00
Rob Harrington
3f8420b0e9
Adding tags to variant overrides
2016-05-27 16:23:26 +10:00
Rohan Mitchell
422061f137
Merge branch 'master' into products-caching
...
Conflicts:
app/controllers/shop_controller.rb
app/models/enterprise_fee.rb
app/models/order_cycle.rb
app/models/variant_override.rb
db/schema.rb
lib/open_food_network/products_renderer.rb
spec/lib/open_food_network/products_renderer_spec.rb
2016-03-03 09:42:52 +11:00
Rob Harrington
4bf27982f4
Applying variant override permissions when they are added or removed
...
Also remove variant overrides with revoked permissions from the default scope
2016-03-02 12:10:49 +11:00
Rohan Mitchell
5f188650d8
Trigger cache refresh on VariantOverride save/destroy
2016-02-24 15:05:01 +11:00
Rob Harrington
669642292b
Refactoring VariantOverridesController#bulk_reset to only reset VOs for a specified hub
2016-01-15 09:07:51 +11:00
Steve Pettitt
e423e890e0
Changed name enable_reset to resettable in Variant Overrides table & updated views, specs accordingly
2016-01-15 09:07:50 +11:00
Steve Pettitt
0ee078e232
Added toggle to enable/disable reset stock. Updated specs
2016-01-15 09:07:48 +11:00
Steve Pettitt
34c603a9c3
Added angular service tests for variant overrides stock reset
2016-01-15 09:07:48 +11:00
Rob Harrington
53d97dab08
WIP: Adding view and routes for resetting variant_overrides count_on_hand
2016-01-15 09:07:48 +11:00
Rohan Mitchell
aa0a031fa0
Fetch indexed variant overrides in one go
2015-06-18 15:03:24 +10:00
Rohan Mitchell
dd2f6d6430
Extract VariantOverride fetching into ScopeVariantToHub#scope
2015-06-18 14:45:40 +10:00