Compare commits

...

104 Commits

Author SHA1 Message Date
Kristina Lim
61c581ae52 Update all locales with the latest Transifex translations 2019-11-01 20:38:13 +08:00
Luis Ramos
db8e2891d4 Merge pull request #4417 from Matt-Yorkley/shopfront_patchination
Ensure variants returned in #variant_relation are DISTINCT
2019-11-01 12:16:01 +00:00
Luis Ramos
a947d8df6c Merge pull request #4397 from luisramos0/delete_option_types_page
Remove option types menu entry
2019-11-01 12:14:59 +00:00
Maikel
818d41ffac Merge pull request #4418 from AndrewCleve/readme-grammar-fix
Improve readability of README.md
2019-11-01 16:48:12 +11:00
Maikel
14f67053c8 Merge pull request #4400 from coopdevs/task-to-remove-enterprise-limit
Task to remove limit of ent. that can be created
2019-11-01 15:57:12 +11:00
Luis Ramos
bef745378e Merge pull request #4395 from luisramos0/delete_prototypes
Delete prototypes tables and all references in pages
2019-10-31 20:06:38 +00:00
luisramos0
a6cb5903d6 Delete prototypes tables and all references in pages 2019-10-31 13:23:42 +00:00
Luis Ramos
d1b36aded0 Merge pull request #4359 from daningenthron/daningenthron/required-fields-new-order-cycle
Add asterisks to required fields in New Order Cycle form
2019-10-31 12:50:48 +00:00
Luis Ramos
9c3c74aa93 Merge pull request #4394 from luisramos0/fix_product_sub_menu
Merge duplicated product_sub_menu partials
2019-10-31 12:48:27 +00:00
Matt-Yorkley
67a5a1cdc2 Fix incorrectly ordered entries with duplicate product names in OC and custom taxon ordering applied 2019-10-31 12:14:14 +00:00
Matt-Yorkley
9723e2cd49 Add failing spec for taxon ordering issue 2019-10-31 12:07:16 +00:00
Pau Pérez Fabregat
4af014df6b Merge pull request #4342 from JacksonBates/edit-button-new-window
makes edit button action open a new tab
2019-10-31 11:45:11 +01:00
Pau Pérez Fabregat
be6c64db75 Merge pull request #4354 from agustinariq/3832-WYSIWYG-highlight-links
#3832 - Added color to links in WYSIWYG editor
2019-10-31 11:44:11 +01:00
AndrewCleve
1aebc30128 Improve readability of README.md
Made minor changes to grammar to improve consistency and readability.
2019-10-30 19:43:38 -07:00
Matt-Yorkley
f8209ac7d5 Ensure results in #products_relation are DISTINCT 2019-10-30 19:04:28 +00:00
Matt-Yorkley
6d50176e6b Ensure results in #variants_relation are DISTINCT 2019-10-30 17:13:52 +00:00
Pau Pérez Fabregat
d6d2c19dc7 Merge pull request #4398 from Matt-Yorkley/db_indexes
Add order_cycle_id and distributor_id indexes to spree_orders table
2019-10-30 16:36:23 +01:00
Pau Pérez Fabregat
f897478736 Merge pull request #4402 from coopdevs/task-to-remove-unused-enterprise
Task to remove an unused enterprise
2019-10-30 16:34:28 +01:00
Pau Pérez Fabregat
064b86da5d Merge pull request #4407 from luisramos0/fix_sample_data
Add tax category to sample products
2019-10-30 15:37:53 +01:00
Pau Pérez Fabregat
f7b58300f9 Merge pull request #4362 from openfoodfoundation/dependabot/bundler/activerecord-import-1.0.3
Bump activerecord-import from 1.0.2 to 1.0.3
2019-10-30 15:13:47 +01:00
Luis Ramos
1a0e99dce2 Merge pull request #4414 from openfoodfoundation/dependabot/bundler/fuubar-2.5.0
Bump fuubar from 2.4.1 to 2.5.0
2019-10-30 10:12:19 +00:00
dependabot-preview[bot]
d7caf91de1 Bump fuubar from 2.4.1 to 2.5.0
Bumps [fuubar](https://github.com/thekompanee/fuubar) from 2.4.1 to 2.5.0.
- [Release notes](https://github.com/thekompanee/fuubar/releases)
- [Changelog](https://github.com/thekompanee/fuubar/blob/master/CHANGELOG.md)
- [Commits](https://github.com/thekompanee/fuubar/compare/releases/v2.4.1...releases/v2.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-29 19:30:45 +00:00
Luis Ramos
1e2ab27cda Merge pull request #4327 from kristinalim/feature/4315-prefill_dates_in_orders_and_fulfillment_report
4315 Set default date range for Orders and Fulfillment report
2019-10-29 11:11:59 +00:00
Luis Ramos
3e7bd7dc19 Merge pull request #4376 from luisramos0/ghosts
Remove product from Order Cycles if product supplier changes
2019-10-28 21:17:48 +00:00
Luis Ramos
688dad2334 Merge pull request #4384 from chaserx/4378_display_customer_name_on_orders_table
adds the full_name of the customer ordering beneath email
2019-10-28 15:52:54 +00:00
Luis Ramos
6d419d60ae Merge pull request #4405 from openfoodfoundation/dependabot/bundler/bugsnag-6.12.2
Bump bugsnag from 6.12.1 to 6.12.2
2019-10-28 11:37:30 +00:00
luisramos0
0dc8ae1561 Merging find_product and find_variant into one single method
This fixes rubocop issue, class has too many lines
2019-10-27 20:09:42 +00:00
luisramos0
f396f6bebd Add tax category to sample products 2019-10-27 19:59:35 +00:00
luisramos0
07fcc8f361 Refactor ExchangeVariantDeleter.new.delete out of update_product_only_attributes into correct place update_product
Also extracted find_product from update_attributes and find_variant out of create_or_update_variant to make code simpler
2019-10-27 19:13:57 +00:00
Pau Pérez Fabregat
237cd5438b Merge pull request #4373 from openfoodfoundation/dependabot/bundler/i18n-js-3.4.0
Bump i18n-js from 3.3.0 to 3.4.0
2019-10-25 13:47:25 +02:00
Pau Pérez Fabregat
4e366d0f2e Merge pull request #4390 from Matt-Yorkley/3831_flaky_spec
Fix flaky product import spec
2019-10-25 13:42:54 +02:00
dependabot-preview[bot]
fb3af77d0b Bump bugsnag from 6.12.1 to 6.12.2
Bumps [bugsnag](https://github.com/bugsnag/bugsnag-ruby) from 6.12.1 to 6.12.2.
- [Release notes](https://github.com/bugsnag/bugsnag-ruby/releases)
- [Changelog](https://github.com/bugsnag/bugsnag-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bugsnag/bugsnag-ruby/compare/v6.12.1...v6.12.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-24 19:19:06 +00:00
Luis Ramos
1fa6e4bea8 Merge pull request #4385 from chaserx/4304_fixes_missing_translation
adds missing :spree to i18n scopes
2019-10-24 17:06:50 +01:00
Luis Ramos
498a2b7462 Merge pull request #4386 from andrewjprice/missing-translations-inventory-page
Missing translations inventory page
2019-10-24 17:06:43 +01:00
Pau Perez
80edfe469c Task to remove limit of ent. that can be created
It does so by updating a user's enterprise_limit attribute to the
maximum integer the database supports.

This is used at least in Katuma to remove the limitation of the number
of enterprises a user can create. This is the agreement the community
reached for the pricing plans.

Eventually, this logic could be triggered with a button from the UI but
for now this is for internal usage only.
2019-10-24 15:53:43 +02:00
Pau Perez
b2616d317f Task to remove an unused enterprise
Note this task is still rather naive and only covers the simple case
where an enterprise was created but never used and thus, does not have
any associated entities like orders.

This is enough for the case I have at hand where a hub's manager created
an enterprise while he wanted to create a user account #ux. He ended up
with an enterprise named after him and now he asked us to clean that up.
2019-10-24 15:23:54 +02:00
Matt-Yorkley
0ac0bdc381 Update all locales with the latest Transifex translations 2019-10-23 21:20:11 +01:00
Matt-Yorkley
1a756cbc6b Merge pull request #4387 from openfoodfoundation/transifex
Transifex
2019-10-23 21:17:20 +01:00
Matt-Yorkley
34466c8218 Add order_cycle_id and distributor_id indexes to spree_orders table 2019-10-23 18:29:34 +01:00
Matt-Yorkley
00e869f40c Merge pull request #4393 from mkllnk/4392-rescue-network-fails
Avoid asking the cloud if an image exists
2019-10-23 16:55:49 +01:00
luisramos0
42cd9a5152 Remove menu entry option types because this page is not really usable
We keep the underlying data structures because option types and option values are used internally to keep units in OFN: weight, volume and items, but otherwise, custom option types are no longer possible in OFN
2019-10-23 12:57:47 +01:00
luisramos0
cc342387cc Make all calls to content_for use dash not equals when setting content_for 2019-10-23 12:42:29 +01:00
luisramos0
6715f872e3 Merge duplicated product_sub_menu partials and make all references point to the one located in the spree folder (we keep this one because we still have some views in spree backend referencing this partial 2019-10-23 12:26:18 +01:00
Transifex-Openfoodnetwork
e849c4867b Updating translations for config/locales/nb.yml 2019-10-23 18:58:07 +11:00
Maikel Linke
ada34d27ca Avoid asking the cloud if an image exists
https://github.com/openfoodfoundation/openfoodnetwork/issues/4392

Amazon's DNS is failing at the moment and some users can't access the
admin panel because of this error.

While `exists?` asks the storage server if the file is actually there,
`file?` just checks if we have the file name stored in the database
and the file should be there. It's much faster and less error prone.
2019-10-23 11:36:20 +11:00
Dan Ingenthron
40c329ba68 Distinguish between simple create form and full interface in OC feature spec 2019-10-22 17:41:38 -05:00
Dan Ingenthron
3c7af90dfa Revert I18n change and reflect correct required fields on OC form 2019-10-22 17:41:38 -05:00
Dan Ingenthron
241e581779 Add required fields to order cycle spec 2019-10-22 17:41:38 -05:00
Dan Ingenthron
85dede84cc Update order cycle forms & en.yml to include asterisks 2019-10-22 17:41:37 -05:00
Transifex-Openfoodnetwork
0288dfc992 Updating translations for config/locales/ar.yml 2019-10-23 07:18:46 +11:00
luisramos0
3372339907 Fix default stock translation by using t filter instead of t function 2019-10-22 17:29:04 +01:00
Matt-Yorkley
f7bb609546 Fix flaky product import spec 2019-10-22 12:02:11 +01:00
Luis Ramos
02c0b89fa0 Merge pull request #4345 from Matt-Yorkley/shopfront_pagination
Shopfront pagination
2019-10-21 16:02:12 +01:00
luisramos0
f57c9d4a25 Fix rubocop issue in product_set.update_product_only_attributes: method has too many lines 2019-10-21 15:20:53 +01:00
luisramos0
783c3c9e90 Add spec to product set to cover case where product and variants attributes are both provided and the product supplier is not, in that case, ExchangeVariantDeleter would not execute and update_product_only_attributes would return nil cancelling update_product_variants from being executed. Now, update_product_only_attributes always returns true if product.save suceeeds, no matter what ExchangeVariantDeleter returns 2019-10-21 14:45:27 +01:00
luisramos0
44753d0320 Add spec coverage for case in product_set where variants_attributes are used 2019-10-21 13:27:21 +01:00
luisramos0
dd7d5803ba Add new context to spec so that some basic setup can be shared with new specs that will be added, it's mostly indentation here 2019-10-21 13:01:39 +01:00
Luis Ramos
c9e23154d8 Merge pull request #4352 from tkusuki/fix-translation-in-enterprise-welcome-email
Add missing translation in non English enterprise welcome email
2019-10-21 11:41:53 +01:00
Rachel Arnould
279b633513 Add welcome board to the contributing page 2019-10-21 12:19:01 +02:00
Transifex-Openfoodnetwork
9d0ac79983 Updating translations for config/locales/pt_BR.yml 2019-10-21 11:29:14 +11:00
Andrew
deb17f47a7 Add default_stock to en.yml and _products_variants 2019-10-19 16:33:31 -07:00
Chase Southard
61ee0f04a6 adds missing :spree to i18n scopes 2019-10-19 13:55:11 -04:00
Chase Southard
353804a3fa adds the full_name of the customer ordering beneath email 2019-10-19 12:32:59 -04:00
Andrew
598426a5e9 Add Save Changes button translation 2019-10-18 22:18:54 -07:00
Matt-Yorkley
7b0c55e15a Ensure producer properties are included in properties results 2019-10-18 21:15:13 +01:00
Matt-Yorkley
cbe2477d04 Fix property filters and improve test coverage 2019-10-18 21:15:13 +01:00
Matt-Yorkley
c730958fe4 Restrict search params passed to ProductsRenderer 2019-10-18 21:15:13 +01:00
Matt-Yorkley
37e5e1923c Improve filter buttons UX 2019-10-18 21:15:13 +01:00
Matt-Yorkley
542c1bf684 #slice :params in controller and rename to :args in service context 2019-10-18 21:15:13 +01:00
Matt-Yorkley
06c896b93b Add spec for Api::ProductSerializer 2019-10-18 21:15:13 +01:00
Matt-Yorkley
6433d69d02 Add comments on scoping ProductsRenderer results 2019-10-18 21:15:13 +01:00
Matt-Yorkley
bf8c632fce Refactor ProductsCtrl request params 2019-10-18 21:15:13 +01:00
Matt-Yorkley
b3c89a9d6c Move OpenFoodNetwork::ProductsRenderer (lib) to ProductsRenderer (service) and refactor 2019-10-18 21:15:13 +01:00
Matt-Yorkley
d45403f1d4 Add specs for Api::OrderCyclesController 2019-10-18 21:15:13 +01:00
Matt-Yorkley
f2affe80cd Reduce assignment branching and complexity for ProductsRenderer#products 2019-10-18 21:15:13 +01:00
Matt-Yorkley
573a69477f Fix filters not updating on OC change 2019-10-18 21:15:13 +01:00
Matt-Yorkley
c6ce516129 Fix prices not updating with new exchange fees when changing OC 2019-10-18 21:15:13 +01:00
Matt-Yorkley
2539b84b33 Fix product.meta_keywords not searchable 2019-10-18 21:15:13 +01:00
Matt-Yorkley
dd6d0d25da Fix problematic feature specs 2019-10-18 21:15:13 +01:00
Matt-Yorkley
c54cff10d4 Adjust API endpoint params 2019-10-18 21:15:13 +01:00
Matt-Yorkley
ab330e882e Remove product cache 2019-10-18 21:15:11 +01:00
luisramos0
a50ae3f8ce Clarify the API of product_set class by making all other methods to private 2019-10-18 10:37:23 +01:00
luisramos0
9f3b4100c3 Improve code by incorporating code review feedback 2019-10-18 10:26:03 +01:00
luisramos0
b625ea0c61 Extract to class ExchangeVariantDeleter 2019-10-17 19:13:45 +01:00
luisramos0
8857404ddf Remove product variants from all Order Cycles if supplier is changed 2019-10-17 19:12:24 +01:00
luisramos0
49f98422fd Remove product from Order Cycles if supplier changes as with a new supplier the rules/permissions to add a product to an Order Cycle may be different 2019-10-17 17:47:15 +01:00
Jackson Bates
4d49dc3689 adds line breaks to methods for readability 2019-10-16 23:01:38 +11:00
Jackson Bates
8d30dc997f adds better description to specs and refactors editProductUrl and confirm_unsaved_changes 2019-10-16 21:55:52 +11:00
dependabot-preview[bot]
5a84a3688b Bump i18n-js from 3.3.0 to 3.4.0
Bumps [i18n-js](https://github.com/fnando/i18n-js) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/fnando/i18n-js/releases)
- [Changelog](https://github.com/fnando/i18n-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fnando/i18n-js/compare/v3.3.0...v3.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-15 04:57:00 +00:00
dependabot-preview[bot]
614dc5d255 Bump activerecord-import from 1.0.2 to 1.0.3
Bumps [activerecord-import](https://github.com/zdennis/activerecord-import) from 1.0.2 to 1.0.3.
- [Release notes](https://github.com/zdennis/activerecord-import/releases)
- [Changelog](https://github.com/zdennis/activerecord-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zdennis/activerecord-import/compare/v1.0.2...v1.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-09 21:47:12 +00:00
Matt-Yorkley
da7456e6e0 Remove old shop/products route, action, and spec 2019-10-09 17:27:00 +01:00
Matt-Yorkley
f134cd9473 Extract tag_rule filtering into separate service 2019-10-09 17:26:58 +01:00
Matt-Yorkley
e96252f2ed Add tag_rules logic to main query before pagination 2019-10-08 10:11:24 +01:00
Matt-Yorkley
06e1f56ae9 Extract filter list fetching into a separate endpoint 2019-10-08 10:11:24 +01:00
Matt-Yorkley
fe0de98821 Add pagination in Angular and views 2019-10-08 10:11:22 +01:00
Thais Kusuki
d997b8f5ee Change translations from enterprise_mailer to lazy lookup 2019-10-07 23:29:11 -03:00
agustina
cf3f321632 Added color to links in WYSIWYG editor 2019-10-07 12:15:37 -03:00
Thais Kusuki
797a3ad091 Add missing translation in non English enterprise welcome email 2019-10-05 12:50:12 -03:00
Matt-Yorkley
01d1e8243c Add pagination to ProductsRenderer 2019-10-04 10:38:43 +01:00
Matt-Yorkley
a1a5c3b7fe Add new Angular OrderCycleResource 2019-10-04 10:38:41 +01:00
Matt-Yorkley
bc826f73a1 Add temporary placeholder for API endpoint 2019-10-03 18:11:40 +01:00
Jackson Bates
7c264af0c2 updates specs for new edit button behaviour 2019-10-03 22:32:43 +10:00
Jackson Bates
4c4bdd78e7 makes edit button action open a new tab 2019-10-01 22:13:28 +10:00
Kristina Lim
bb56e9a5b9 Set default date range for Orders and Fulfillment report 2019-09-28 02:39:41 +08:00
160 changed files with 4698 additions and 2984 deletions

View File

@@ -139,7 +139,6 @@ Metrics/LineLength:
- lib/open_food_network/payments_report.rb
- lib/open_food_network/permalink_generator.rb
- lib/open_food_network/products_cache.rb
- lib/open_food_network/products_renderer.rb
- lib/open_food_network/reports/bulk_coop_allocation_report.rb
- lib/open_food_network/reports/line_items.rb
- lib/open_food_network/sales_tax_report.rb
@@ -249,13 +248,10 @@ Metrics/LineLength:
- spec/helpers/order_cycles_helper_spec.rb
- spec/helpers/spree/admin/base_helper_spec.rb
- spec/jobs/confirm_order_job_spec.rb
- spec/jobs/products_cache_integrity_checker_job_spec.rb
- spec/jobs/refresh_products_cache_job_spec.rb
- spec/jobs/subscription_confirm_job_spec.rb
- spec/jobs/subscription_placement_job_spec.rb
- spec/lib/open_food_network/address_finder_spec.rb
- spec/lib/open_food_network/bulk_coop_report_spec.rb
- spec/lib/open_food_network/cached_products_renderer_spec.rb
- spec/lib/open_food_network/customers_report_spec.rb
- spec/lib/open_food_network/enterprise_fee_applicator_spec.rb
- spec/lib/open_food_network/enterprise_fee_calculator_spec.rb
@@ -272,7 +268,6 @@ Metrics/LineLength:
- spec/lib/open_food_network/permissions_spec.rb
- spec/lib/open_food_network/products_and_inventory_report_spec.rb
- spec/lib/open_food_network/products_cache_spec.rb
- spec/lib/open_food_network/products_renderer_spec.rb
- spec/lib/open_food_network/proxy_order_syncer_spec.rb
- spec/lib/open_food_network/scope_variant_to_hub_spec.rb
- spec/lib/open_food_network/subscription_payment_updater_spec.rb
@@ -615,7 +610,6 @@ Metrics/MethodLength:
- lib/open_food_network/payments_report.rb
- lib/open_food_network/permissions.rb
- lib/open_food_network/products_and_inventory_report.rb
- lib/open_food_network/products_renderer.rb
- lib/open_food_network/rack_request_blocker.rb
- lib/open_food_network/reports/bulk_coop_allocation_report.rb
- lib/open_food_network/reports/bulk_coop_supplier_report.rb
@@ -670,7 +664,6 @@ Metrics/ModuleLength:
- spec/controllers/api/orders_controller_spec.rb
- spec/controllers/spree/api/products_controller_spec.rb
- spec/lib/open_food_network/address_finder_spec.rb
- spec/lib/open_food_network/cached_products_renderer_spec.rb
- spec/lib/open_food_network/customers_report_spec.rb
- spec/lib/open_food_network/enterprise_fee_calculator_spec.rb
- spec/lib/open_food_network/option_value_namer_spec.rb

View File

@@ -19,6 +19,10 @@ If you want to run the whole test suite, we recommend using a free CI service to
bundle exec rspec spec
## Which issue to pick first?
We have curated all issues interesting for new members of the community within the [Welcome New Developers project board][welcome-dev]. Have a look and pick the one you would prefer working on!
## Internationalisation (i18n)
The locale `en` is maintained in the source code, but other locales are managed at [Transifex][ofn-transifex]. Read more about [internationalisation][i18n] in the developer wiki.
@@ -62,3 +66,4 @@ From here, your pull request will progress through the [Review, Test, Merge & De
[slack-dev]: https://openfoodnetwork.slack.com/messages/C2GQ45KNU
[ofn-transifex]: https://www.transifex.com/open-food-foundation/open-food-network/
[i18n]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/i18n
[welcome-dev]: https://github.com/openfoodfoundation/openfoodnetwork/projects/27

View File

@@ -3,7 +3,7 @@ ruby "2.1.9"
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
gem 'i18n', '~> 0.6.11'
gem 'i18n-js', '~> 3.3.0'
gem 'i18n-js', '~> 3.4.0'
gem 'rails', '~> 3.2.22'
gem 'rails-i18n', '~> 3.0.0'
gem 'rails_safe_tasks', '~> 1.0'
@@ -136,7 +136,7 @@ group :test, :development do
gem 'capybara', '>= 2.15.4'
gem 'database_cleaner', '0.7.1', require: false
gem "factory_bot_rails", require: false
gem 'fuubar', '~> 2.4.1'
gem 'fuubar', '~> 2.5.0'
gem 'json_spec', '~> 1.1.4'
gem 'knapsack'
gem 'letter_opener', '>= 1.4.1'

View File

@@ -129,7 +129,7 @@ GEM
activesupport (= 3.2.22.5)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activerecord-import (1.0.2)
activerecord-import (1.0.3)
activerecord (>= 3.2)
activeresource (3.2.22.5)
activemodel (= 3.2.22.5)
@@ -164,7 +164,7 @@ GEM
bcrypt-ruby (3.1.5)
bcrypt (>= 3.1.3)
blockenspiel (0.5.0)
bugsnag (6.12.1)
bugsnag (6.12.2)
concurrent-ruby (~> 1.0)
builder (3.0.4)
byebug (9.0.6)
@@ -424,7 +424,7 @@ GEM
foundation-rails (5.5.2.1)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
fuubar (2.4.1)
fuubar (2.5.0)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
geocoder (1.1.8)
@@ -437,7 +437,7 @@ GEM
httparty (0.16.2)
multi_xml (>= 0.5.2)
i18n (0.6.11)
i18n-js (3.3.0)
i18n-js (3.4.0)
i18n (>= 0.6.6)
immigrant (0.3.6)
activerecord (>= 3.0)
@@ -757,12 +757,12 @@ DEPENDENCIES
foundation-icons-sass-rails
foundation-rails
foundation_rails_helper!
fuubar (~> 2.4.1)
fuubar (~> 2.5.0)
geocoder
gmaps4rails
haml
i18n (~> 0.6.11)
i18n-js (~> 3.3.0)
i18n-js (~> 3.4.0)
immigrant
jquery-migrate-rails
jquery-rails (= 3.0.4)

View File

@@ -3,20 +3,20 @@
# Open Food Network
The Open Food Network is an online marketplace for local food. It enables a network of independent online food stores that connect farmers and food hubs (including coops, online farmers' markets, independent food businesses etc); with individuals and local businesses. It gives farmers and food hubs an easier and fairer way to distribute their food.
The Open Food Network is an online marketplace for local food. It enables a network of independent online food stores that connects farmers and food hubs (including co-ops, online farmers markets, independent food businesses, etc) with individuals and local businesses. It gives farmers and food hubs an easier and fairer way to distribute their food.
Supported by the Open Food Foundation and a network of global affiliates, we are proudly open source and not-for-profit - we're trying to seriously disrupt the concentration of power in global agri-food systems, and we need as many smart people working together on this as possible.
We're part of global movement - get involved!
* Join the conversation [on Slack][slack-invite]. Make sure you introduce yourself in the #general channel
* Join the conversation [on Slack][slack-invite]. Make sure you introduce yourself in the #general channel.
* Head to [https://openfoodnetwork.org](https://openfoodnetwork.org) for more information about the global OFN project.
* Check out the [User Guide](https://guide.openfoodnetwork.org/) for a list of features and tutorials.
* Join our [discussion forum](https://community.openfoodnetwork.org).
## Contributing
If you are interested in contributing to the OFN in any capacity, please introducing yourself [on Slack][slack-invite], and have a look through our [Contributor Guide][contributor-guide]
If you are interested in contributing to the OFN in any capacity, please introduce yourself [on Slack][slack-invite], and have a look through our [Contributor Guide][contributor-guide].
Our [GETTING_STARTED](GETTING_STARTED.md) and [CONTRIBUTING](CONTRIBUTING.md) guides are the best place to start for developers looking to set up a development environment and make contributions to the codebase.

View File

@@ -108,9 +108,15 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
$scope.categoryFilter = "0"
$scope.importDateFilter = "0"
confirm_unsaved_changes = () ->
(DirtyProducts.count() > 0 and confirm(t("unsaved_changes_confirmation"))) or (DirtyProducts.count() == 0)
editProductUrl = (product, variant) ->
"/admin/products/" + product.permalink_live + ((if variant then "/variants/" + variant.id else "")) + "/edit"
$scope.editWarn = (product, variant) ->
if (DirtyProducts.count() > 0 and confirm(t("unsaved_changes_confirmation"))) or (DirtyProducts.count() == 0)
window.location = "/admin/products/" + product.permalink_live + ((if variant then "/variants/" + variant.id else "")) + "/edit"
if confirm_unsaved_changes()
window.open(editProductUrl(product, variant), "_blank")
$scope.toggleShowAllVariants = ->

View File

@@ -1,4 +1,4 @@
Darkswarm.controller "OrderCycleCtrl", ($scope, $timeout, OrderCycle) ->
Darkswarm.controller "OrderCycleCtrl", ($scope, $rootScope, $timeout, OrderCycle) ->
$scope.order_cycle = OrderCycle.order_cycle
$scope.OrderCycle = OrderCycle
@@ -6,11 +6,12 @@ Darkswarm.controller "OrderCycleCtrl", ($scope, $timeout, OrderCycle) ->
# This is a hack. We should probably write our own "popover" directive
# That takes an expression instead of a trigger, and binds to that
$timeout =>
$rootScope.$broadcast 'orderCycleSelected'
if !$scope.OrderCycle.selected()
$("#order_cycle_id").trigger("openTrigger")
Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $timeout, OrderCycle, Products, Variants, Cart, ChangeableOrdersAlert) ->
Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $rootScope, $timeout, OrderCycle, Products, Variants, Cart, ChangeableOrdersAlert) ->
# Track previous order cycle id for use with revertOrderCycle()
$scope.previous_order_cycle_id = OrderCycle.order_cycle.order_cycle_id
$scope.$watch 'order_cycle.order_cycle_id', (newValue, oldValue)->
@@ -32,3 +33,4 @@ Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $timeout, OrderCycle, Prod
Products.update()
Cart.reloadFinalisedLineItems()
ChangeableOrdersAlert.reload()
$rootScope.$broadcast 'orderCycleSelected'

View File

@@ -1,41 +1,65 @@
Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, OrderCycle, FilterSelectorsService, Cart, Taxons, Properties) ->
Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, OrderCycle, OrderCycleResource, FilterSelectorsService, Cart, Dereferencer, Taxons, Properties, currentHub, $timeout) ->
$scope.Products = Products
$scope.Cart = Cart
$scope.query = ""
$scope.taxonSelectors = FilterSelectorsService.createSelectors()
$scope.propertySelectors = FilterSelectorsService.createSelectors()
$scope.filtersActive = true
$scope.limit = 10
$scope.page = 1
$scope.per_page = 10
$scope.order_cycle = OrderCycle.order_cycle
# $scope.infiniteDisabled = true
$scope.supplied_taxons = null
$scope.supplied_properties = null
# All of this logic basically just replicates the functionality filtering an ng-repeat
# except that it allows us to filter a separate list before rendering, meaning that
# we can get much better performance when applying filters by resetting the limit on the
# number of products being rendered each time a filter is changed.
$rootScope.$on "orderCycleSelected", ->
$scope.update_filters()
$scope.clearAll()
$scope.$watch "Products.loading", (newValue, oldValue) ->
$scope.updateFilteredProducts()
$scope.$broadcast("loadFilterSelectors") if !newValue
$scope.update_filters = ->
order_cycle_id = OrderCycle.order_cycle.order_cycle_id
$scope.incrementLimit = ->
if $scope.limit < Products.products.length
$scope.limit += 10
$scope.updateVisibleProducts()
return unless order_cycle_id
$scope.$watch 'query', -> $scope.updateFilteredProducts()
$scope.$watchCollection 'activeTaxons', -> $scope.updateFilteredProducts()
$scope.$watchCollection 'activeProperties', -> $scope.updateFilteredProducts()
params = {
id: order_cycle_id,
distributor: currentHub.id
}
OrderCycleResource.taxons params, (data)=>
$scope.supplied_taxons = {}
data.map( (taxon) ->
$scope.supplied_taxons[taxon.id] = Taxons.taxons_by_id[taxon.id]
)
OrderCycleResource.properties params, (data)=>
$scope.supplied_properties = {}
data.map( (property) ->
$scope.supplied_properties[property.id] = Properties.properties_by_id[property.id]
)
$scope.updateFilteredProducts = ->
$scope.limit = 10
f1 = $filter('products')(Products.products, $scope.query)
f2 = $filter('taxons')(f1, $scope.activeTaxons)
$scope.filteredProducts = $filter('properties')(f2, $scope.activeProperties)
$scope.updateVisibleProducts()
$scope.loadMore = ->
if ($scope.page * $scope.per_page) <= Products.products.length
$scope.loadMoreProducts()
$scope.updateVisibleProducts = ->
$scope.visibleProducts = $filter('limitTo')($scope.filteredProducts, $scope.limit)
$scope.$watch 'query', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.$watchCollection 'activeTaxons', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.$watchCollection 'activeProperties', (newValue, oldValue) -> $scope.loadProducts() if newValue != oldValue
$scope.loadProducts = ->
$scope.page = 1
Products.update($scope.queryParams())
$scope.loadMoreProducts = ->
Products.update($scope.queryParams($scope.page + 1), true)
$scope.page += 1
$scope.queryParams = (page = null) ->
{
id: $scope.order_cycle.order_cycle_id,
page: page || $scope.page,
per_page: $scope.per_page,
'q[name_or_meta_keywords_or_supplier_name_cont]': $scope.query,
'q[properties_id_or_supplier_properties_id_in_any][]': $scope.activeProperties,
'q[primary_taxon_id_in_any][]': $scope.activeTaxons
}
$scope.searchKeypress = (e)->
code = e.keyCode || e.which

View File

@@ -0,0 +1,21 @@
Darkswarm.factory 'OrderCycleResource', ($resource) ->
$resource('/api/order_cycles/:id', {}, {
'products':
method: 'GET'
isArray: true
url: '/api/order_cycles/:id/products'
params:
id: '@id'
'taxons':
method: 'GET'
isArray: true
url: '/api/order_cycles/:id/taxons'
params:
id: '@id'
'properties':
method: 'GET'
isArray: true
url: '/api/order_cycles/:id/properties'
params:
id: '@id'
})

View File

@@ -1,26 +1,34 @@
Darkswarm.factory 'Products', ($resource, Shopfront, Dereferencer, Taxons, Properties, Cart, Variants) ->
Darkswarm.factory 'Products', (OrderCycleResource, OrderCycle, Shopfront, currentHub, Dereferencer, Taxons, Properties, Cart, Variants) ->
new class Products
constructor: ->
@update()
# TODO: don't need to scope this into object
# Already on object as far as controller scope is concerned
products: null
products: []
fetched_products: []
loading: true
update: =>
update: (params = {}, load_more = false) =>
@loading = true
@products = []
$resource("/shop/products").query (products)=>
@products = products
order_cycle_id = OrderCycle.order_cycle.order_cycle_id
if order_cycle_id == undefined
@loading = false
return
params['id'] = order_cycle_id
params['distributor'] = currentHub.id
OrderCycleResource.products params, (data)=>
@products = [] unless load_more
@fetched_products = data
@extend()
@dereference()
@registerVariants()
@products = @products.concat(@fetched_products)
@loading = false
extend: ->
for product in @products
for product in @fetched_products
if product.variants?.length > 0
prices = (v.price for v in product.variants)
product.price = Math.min.apply(null, prices)
@@ -30,7 +38,7 @@ Darkswarm.factory 'Products', ($resource, Shopfront, Dereferencer, Taxons, Prope
product.largeImage = product.images[0]?.large_url if product.images
dereference: ->
for product in @products
for product in @fetched_products
product.supplier = Shopfront.producers_by_id[product.supplier.id]
Dereferencer.dereference product.taxons, Taxons.taxons_by_id
@@ -40,7 +48,7 @@ Darkswarm.factory 'Products', ($resource, Shopfront, Dereferencer, Taxons, Prope
# May return different objects! If the variant has already been registered
# by another service, we fetch those
registerVariants: ->
for product in @products
for product in @fetched_products
if product.variants
product.variant_names = ""
product.variants = for variant in product.variants

View File

@@ -17,7 +17,7 @@
.small-4.medium-2.large-2.columns.variant-price
.table-cell.price
%i.ofn-i_009-close
{{ ::variant.price_with_fees | localizeCurrency }}
{{ variant.price_with_fees | localizeCurrency }}
-# Now in a template in app/assets/javascripts/templates !
%price-breakdown{"price-breakdown" => "_", variant: "variant",

View File

@@ -255,6 +255,9 @@ text-angular {
background-color: #4583bf;
}
}
a {
color: $spree-green
}
}
span.required {

View File

@@ -1,27 +0,0 @@
require 'open_food_network/products_cache_integrity_checker'
module Admin
class CacheSettingsController < Spree::Admin::BaseController
def edit
@results = Exchange.cachable.map do |exchange|
checker = OpenFoodNetwork::ProductsCacheIntegrityChecker
.new(exchange.receiver, exchange.order_cycle)
{
distributor: exchange.receiver,
order_cycle: exchange.order_cycle,
status: checker.ok?,
diff: checker.diff
}
end
end
def update
Spree::Config.set(params[:preferences])
respond_to do |format|
format.html { redirect_to main_app.edit_admin_cache_settings_path }
end
end
end
end

View File

@@ -0,0 +1,88 @@
module Api
class OrderCyclesController < BaseController
include EnterprisesHelper
respond_to :json
skip_authorization_check
def products
products = ProductsRenderer.new(
distributor,
order_cycle,
customer,
search_params
).products_json
render json: products
rescue ProductsRenderer::NoProducts
render status: :not_found, json: ''
end
def taxons
taxons = Spree::Taxon.
joins(:products).
where(spree_products: { id: distributed_products }).
select('DISTINCT spree_taxons.*')
render json: ActiveModel::ArraySerializer.new(taxons, each_serializer: Api::TaxonSerializer)
end
def properties
render json: ActiveModel::ArraySerializer.new(
product_properties | producer_properties, each_serializer: Api::PropertySerializer
)
end
private
def product_properties
Spree::Property.
joins(:products).
where(spree_products: { id: distributed_products }).
select('DISTINCT spree_properties.*')
end
def producer_properties
producers = Enterprise.
joins(:supplied_products).
where(spree_products: { id: distributed_products })
Spree::Property.
joins(:producer_properties).
where(producer_properties: { producer_id: producers }).
select('DISTINCT spree_properties.*')
end
def search_params
permitted_search_params = params.slice :q, :page, :per_page
if permitted_search_params.key? :q
permitted_search_params[:q].slice!(*permitted_ransack_params)
end
permitted_search_params
end
def permitted_ransack_params
[:name_or_meta_keywords_or_supplier_name_cont,
:properties_id_or_supplier_properties_id_in_any,
:primary_taxon_id_in_any]
end
def distributor
Enterprise.find_by_id(params[:distributor])
end
def order_cycle
OrderCycle.find_by_id(params[:id])
end
def customer
@current_api_user.andand.customer_of(distributor) || nil
end
def distributed_products
OrderCycleDistributedProducts.new(distributor, order_cycle, customer).products_relation
end
end
end

View File

@@ -1,5 +1,3 @@
require 'open_food_network/cached_products_renderer'
class ShopController < BaseController
layout "darkswarm"
before_filter :require_distributor_chosen, :set_order_cycles, except: :changeable_orders_alert
@@ -9,19 +7,6 @@ class ShopController < BaseController
redirect_to main_app.enterprise_shop_path(current_distributor)
end
def products
renderer = OpenFoodNetwork::CachedProductsRenderer.new(current_distributor,
current_order_cycle)
# If we add any more filtering logic, we should probably
# move it all to a lib class like 'CachedProductsFilterer'
products_json = filter(renderer.products_json)
render json: products_json
rescue OpenFoodNetwork::CachedProductsRenderer::NoProducts
render status: :not_found, json: ''
end
def order_cycle
if request.post?
if oc = OrderCycle.with_distributor(@distributor).active.find_by_id(params[:order_cycle_id])
@@ -39,27 +24,4 @@ class ShopController < BaseController
def changeable_orders_alert
render layout: false
end
private
def filtered_json(products_json)
if applicator.rules.any?
filter(products_json)
else
products_json
end
end
def filter(products_json)
products_hash = JSON.parse(products_json)
applicator.filter!(products_hash)
JSON.unparse(products_hash)
end
def applicator
return @applicator unless @applicator.nil?
@applicator = OpenFoodNetwork::TagRuleApplicator.new(current_distributor,
"FilterProducts",
current_customer.andand.tag_list)
end
end

View File

@@ -46,8 +46,11 @@ Spree::Admin::ProductsController.class_eval do
end
def update
original_supplier_id = @product.supplier_id
delete_stock_params_and_set_after do
super
ExchangeVariantDeleter.new.delete(@product) if original_supplier_id != @product.supplier_id
end
end

View File

@@ -109,7 +109,7 @@ Spree::Admin::ReportsController.class_eval do
end
def orders_and_fulfillment
params[:q] ||= {}
params[:q] ||= orders_and_fulfillment_default_filters
# -- Prepare Form Options
permissions = OpenFoodNetwork::Permissions.new(spree_current_user)
@@ -278,4 +278,10 @@ Spree::Admin::ReportsController.class_eval do
def timestamp
Time.zone.now.strftime("%Y%m%d")
end
def orders_and_fulfillment_default_filters
now = Time.zone.now
{ completed_at_gt: (now - 1.month).beginning_of_day,
completed_at_lt: (now + 1.day).beginning_of_day }
end
end

View File

@@ -1,30 +0,0 @@
require 'open_food_network/products_cache_integrity_checker'
ProductsCacheIntegrityCheckerJob = Struct.new(:distributor_id, :order_cycle_id) do
def perform
unless checker.ok?
exception = RuntimeError.new(
"Products JSON differs from cached version for distributor: #{distributor_id}, " \
"order cycle: #{order_cycle_id}"
)
Bugsnag.notify(exception) do |report|
report.add_tab(:products_cache, diff: checker.diff.to_s(:text))
end
end
end
private
def checker
OpenFoodNetwork::ProductsCacheIntegrityChecker.new(distributor, order_cycle)
end
def distributor
Enterprise.find distributor_id
end
def order_cycle
OrderCycle.find order_cycle_id
end
end

View File

@@ -1,21 +0,0 @@
require 'open_food_network/products_renderer'
RefreshProductsCacheJob = Struct.new(:distributor_id, :order_cycle_id) do
def perform
Rails.cache.write(key, products_json)
rescue ActiveRecord::RecordNotFound
true
end
private
def key
"products-json-#{distributor_id}-#{order_cycle_id}"
end
def products_json
distributor = Enterprise.find distributor_id
order_cycle = OrderCycle.find order_cycle_id
OpenFoodNetwork::ProductsRenderer.new(distributor, order_cycle).products_json
end
end

View File

@@ -1,13 +1,4 @@
class CoordinatorFee < ActiveRecord::Base
belongs_to :order_cycle
belongs_to :enterprise_fee
after_save :refresh_products_cache
after_destroy :refresh_products_cache
private
def refresh_products_cache
order_cycle.refresh_products_cache
end
end

View File

@@ -10,10 +10,6 @@ class EnterpriseFee < ActiveRecord::Base
has_many :exchange_fees, dependent: :destroy
has_many :exchanges, through: :exchange_fees
after_save :refresh_products_cache
# After destroy, the products cache is refreshed via the after_destroy hook for
# coordinator_fees and exchange_fees
attr_accessible :enterprise_id, :fee_type, :name, :tax_category_id, :calculator_type, :inherits_tax_category
FEE_TYPES = %w(packing transport admin sales fundraising).freeze
@@ -59,8 +55,4 @@ class EnterpriseFee < ActiveRecord::Base
end
true
end
def refresh_products_cache
OpenFoodNetwork::ProductsCache.enterprise_fee_changed self
end
end

View File

@@ -23,9 +23,6 @@ class Exchange < ActiveRecord::Base
validates :order_cycle, :sender, :receiver, presence: true
validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] }
after_save :refresh_products_cache
after_destroy :refresh_products_cache_from_destroy
accepts_nested_attributes_for :variants
scope :in_order_cycle, lambda { |order_cycle| where(order_cycle_id: order_cycle) }
@@ -98,12 +95,4 @@ class Exchange < ActiveRecord::Base
def participant
incoming? ? sender : receiver
end
def refresh_products_cache
OpenFoodNetwork::ProductsCache.exchange_changed self
end
def refresh_products_cache_from_destroy
OpenFoodNetwork::ProductsCache.exchange_destroyed self
end
end

View File

@@ -1,13 +1,4 @@
class ExchangeFee < ActiveRecord::Base
belongs_to :exchange
belongs_to :enterprise_fee
after_save :refresh_products_cache
after_destroy :refresh_products_cache
private
def refresh_products_cache
exchange.refresh_products_cache
end
end

View File

@@ -1,5 +1,3 @@
require 'open_food_network/products_cache'
class InventoryItem < ActiveRecord::Base
attr_accessible :enterprise, :enterprise_id, :variant, :variant_id, :visible
@@ -13,12 +11,4 @@ class InventoryItem < ActiveRecord::Base
scope :visible, -> { where(visible: true) }
scope :hidden, -> { where(visible: false) }
after_save :refresh_products_cache
private
def refresh_products_cache
OpenFoodNetwork::ProductsCache.inventory_item_changed self
end
end

View File

@@ -23,8 +23,6 @@ class OrderCycle < ActiveRecord::Base
validates :name, :coordinator_id, presence: true
validate :orders_close_at_after_orders_open_at?
after_save :refresh_products_cache
preference :product_selection_from_coordinator_inventory_only, :boolean, default: false
scope :active, lambda {
@@ -247,10 +245,6 @@ class OrderCycle < ActiveRecord::Base
coordinator.users.include? user
end
def refresh_products_cache
OpenFoodNetwork::ProductsCache.order_cycle_changed self
end
def items_bought_by_user(user, distributor)
# The Spree::Order.complete scope only checks for completed_at date
# it does not ensure state is "complete"

View File

@@ -4,9 +4,6 @@ class ProducerProperty < ActiveRecord::Base
default_scope order("#{table_name}.position")
after_save :refresh_products_cache
after_destroy :refresh_products_cache_from_destroy
scope :ever_sold_by, ->(shop) {
joins(producer: { supplied_products: { variants: { exchanges: :order_cycle } } }).
merge(Exchange.outgoing).
@@ -29,14 +26,4 @@ class ProducerProperty < ActiveRecord::Base
Spree::Property.create(name: name, presentation: name)
end
end
private
def refresh_products_cache
OpenFoodNetwork::ProductsCache.producer_property_changed self
end
def refresh_products_cache_from_destroy
OpenFoodNetwork::ProductsCache.producer_property_destroyed self
end
end

View File

@@ -2,16 +2,9 @@ Spree::Classification.class_eval do
belongs_to :product, class_name: "Spree::Product", touch: true
before_destroy :dont_destroy_if_primary_taxon
after_destroy :refresh_products_cache
after_save :refresh_products_cache
private
def refresh_products_cache
product = Spree::Product.with_deleted.find(product_id) if product.blank?
product.refresh_products_cache
end
def dont_destroy_if_primary_taxon
if product.primary_taxon == taxon
errors.add :base, I18n.t(:spree_classification_primary_taxon_error, taxon: taxon.name, product: product.name)

View File

@@ -1,7 +1,4 @@
Spree::Image.class_eval do
after_save :refresh_products_cache
after_destroy :refresh_products_cache
# Spree stores attachent definitions in JSON. This converts the style name and format to
# strings. However, when paperclip encounters these, it doesn't recognise the format.
# Here we solve that problem by converting format and style name to symbols.
@@ -23,10 +20,4 @@ Spree::Image.class_eval do
end
reformat_styles
private
def refresh_products_cache
viewable.try :refresh_products_cache
end
end

View File

@@ -1,12 +1,5 @@
module Spree
OptionType.class_eval do
has_many :products, through: :product_option_types
after_save :refresh_products_cache
private
def refresh_products_cache
products(:reload).each(&:refresh_products_cache)
end
end
end

View File

@@ -1,18 +0,0 @@
module Spree
OptionValue.class_eval do
after_save :refresh_products_cache
around_destroy :refresh_products_cache_from_destroy
private
def refresh_products_cache
variants(:reload).each(&:refresh_products_cache)
end
def refresh_products_cache_from_destroy
vs = variants(:reload).to_a
yield
vs.each(&:refresh_products_cache)
end
end
end

View File

@@ -1,30 +0,0 @@
require 'open_food_network/products_cache'
module Spree
Preference.class_eval do
after_save :refresh_products_cache
# When the setting preferred_product_selection_from_inventory_only has changed, we want to
# refresh all active exchanges for this enterprise.
def refresh_products_cache
if product_selection_from_inventory_only_changed?
OpenFoodNetwork::ProductsCache.distributor_changed(enterprise)
end
end
private
def product_selection_from_inventory_only_changed?
!!(key =~ product_selection_from_inventory_only_regex)
end
def enterprise
enterprise_id = key.match(product_selection_from_inventory_only_regex)[1]
Enterprise.find(enterprise_id)
end
def product_selection_from_inventory_only_regex
/^enterprise\/product_selection_from_inventory_only\/(\d+)$/
end
end
end

View File

@@ -2,8 +2,6 @@ module Spree
Price.class_eval do
acts_as_paranoid without_default_scope: true
after_save :refresh_products_cache
# Allow prices to access associated soft-deleted variants.
def variant
Spree::Variant.unscoped { super }
@@ -16,9 +14,5 @@ module Spree
self.currency = Spree::Config[:currency]
end
end
def refresh_products_cache
variant.andand.refresh_products_cache
end
end
end

View File

@@ -38,7 +38,6 @@ Spree::Product.class_eval do
after_save :remove_previous_primary_taxon_from_taxons
after_save :ensure_standard_variant
after_save :update_units
after_save :refresh_products_cache
# -- Joins
scope :with_order_cycles_outer, -> {
@@ -192,23 +191,17 @@ Spree::Product.class_eval do
def destroy_with_delete_from_order_cycles
transaction do
OpenFoodNetwork::ProductsCache.product_deleted(self) do
touch_distributors
touch_distributors
ExchangeVariant.
where('exchange_variants.variant_id IN (?)', variants_including_master.with_deleted.
select(:id)).destroy_all
ExchangeVariant.
where('exchange_variants.variant_id IN (?)', variants_including_master.with_deleted.
select(:id)).destroy_all
destroy_without_delete_from_order_cycles
end
destroy_without_delete_from_order_cycles
end
end
alias_method_chain :destroy, :delete_from_order_cycles
def refresh_products_cache
OpenFoodNetwork::ProductsCache.product_changed self
end
private
def set_available_on_to_now

View File

@@ -1,10 +1,5 @@
module Spree
ProductProperty.class_eval do
belongs_to :product, class_name: "Spree::Product", touch: true
after_save :refresh_products_cache
after_destroy :refresh_products_cache
delegate :refresh_products_cache, to: :product
end
end

View File

@@ -3,6 +3,20 @@ class Spree::ProductSet < ModelSet
super(Spree::Product, [], attributes, proc { |attrs| attrs[:product_id].blank? })
end
def save
@collection_hash.each_value.all? do |product_attributes|
update_attributes(product_attributes)
end
end
def collection_attributes=(attributes)
@collection = Spree::Product
.where(id: attributes.each_value.map { |product| product[:id] })
@collection_hash = attributes
end
private
# A separate method of updating products was required due to an issue with
# the way Rails' assign_attributes and updates_attributes behave when
# delegated attributes of a nested object are updated via the parent object
@@ -19,14 +33,11 @@ class Spree::ProductSet < ModelSet
def update_attributes(attributes)
split_taxon_ids!(attributes)
found_model = @collection.find do |model|
model.id.to_s == attributes[:id].to_s && model.persisted?
end
if found_model.nil?
product = find_model(@collection, attributes[:id])
if product.nil?
@klass.new(attributes).save unless @reject_if.andand.call(attributes)
else
update_product(found_model, attributes)
update_product(product, attributes)
end
end
@@ -34,28 +45,34 @@ class Spree::ProductSet < ModelSet
attributes[:taxon_ids] = attributes[:taxon_ids].split(',') if attributes[:taxon_ids].present?
end
def update_product(found_model, attributes)
update_product_only_attributes(found_model, attributes) &&
update_product_variants(found_model, attributes) &&
update_product_master(found_model, attributes)
def update_product(product, attributes)
original_supplier = product.supplier_id
return false unless update_product_only_attributes(product, attributes)
ExchangeVariantDeleter.new.delete(product) if original_supplier != product.supplier_id
update_product_variants(product, attributes) &&
update_product_master(product, attributes)
end
def update_product_only_attributes(product, attributes)
variant_related_attrs = [:id, :variants_attributes, :master_attributes]
product_related_attrs = attributes.except(*variant_related_attrs)
return true if product_related_attrs.blank?
product.assign_attributes(product_related_attrs)
product.variants.each do |variant|
validate_presence_of_unit_value(product, variant)
end
validate_presence_of_unit_value_in_product(product)
product.save if errors.empty?
product.errors.empty? && product.save
end
def validate_presence_of_unit_value(product, variant)
def validate_presence_of_unit_value_in_product(product)
product.variants.each do |variant|
validate_presence_of_unit_value_in_variant(product, variant)
end
end
def validate_presence_of_unit_value_in_variant(product, variant)
return unless %w(weight volume).include?(product.variant_unit)
return if variant.unit_value.present?
@@ -79,12 +96,9 @@ class Spree::ProductSet < ModelSet
end
def create_or_update_variant(product, variant_attributes)
found_variant = product.variants_including_master.find do |variant|
variant.id.to_s == variant_attributes[:id].to_s && variant.persisted?
end
if found_variant.present?
found_variant.update_attributes(variant_attributes.except(:id))
variant = find_model(product.variants_including_master, variant_attributes[:id])
if variant.present?
variant.update_attributes(variant_attributes.except(:id))
else
create_variant(product, variant_attributes)
end
@@ -115,15 +129,9 @@ class Spree::ProductSet < ModelSet
end
end
def collection_attributes=(attributes)
@collection = Spree::Product
.where(id: attributes.each_value.map { |product| product[:id] })
@collection_hash = attributes
end
def save
@collection_hash.each_value.all? do |product_attributes|
update_attributes(product_attributes)
def find_model(collection, model_id)
collection.find do |model|
model.id.to_s == model_id.to_s && model.persisted?
end
end
end

View File

@@ -20,19 +20,8 @@ module Spree
merge(OrderCycle.active)
}
after_save :refresh_products_cache
# When a Property is destroyed, dependent-destroy will destroy all ProductProperties,
# which will take care of refreshing the products cache
def property
self
end
private
def refresh_products_cache
product_properties(:reload).each(&:refresh_products_cache)
end
end
end

View File

@@ -1,10 +0,0 @@
Spree::StockMovement.class_eval do
after_save :refresh_products_cache
private
def refresh_products_cache
return if stock_item.variant.blank?
OpenFoodNetwork::ProductsCache.variant_changed stock_item.variant
end
end

View File

@@ -4,8 +4,6 @@ Spree::Taxon.class_eval do
attachment_definitions[:icon][:path] = 'public/images/spree/taxons/:id/:style/:basename.:extension'
attachment_definitions[:icon][:url] = '/images/spree/taxons/:id/:style/:basename.:extension'
after_save :refresh_products_cache
# Indicate which filters should be used for this taxon
def applicable_filters
fs = []
@@ -49,10 +47,4 @@ Spree::Taxon.class_eval do
ts[t.enterprise_id.to_i] << t.id
end
end
private
def refresh_products_cache
products(:reload).each(&:refresh_products_cache)
end
end

View File

@@ -1,7 +1,6 @@
require 'open_food_network/enterprise_fee_calculator'
require 'open_food_network/variant_and_line_item_naming'
require 'concerns/variant_stock'
require 'open_food_network/products_cache'
Spree::Variant.class_eval do
extend Spree::LocalizedNumber
@@ -30,7 +29,6 @@ Spree::Variant.class_eval do
before_validation :update_weight_from_unit_value, if: ->(v) { v.product.present? }
after_save :update_units
after_save :refresh_products_cache
around_destroy :destruction
scope :with_order_cycles_inner, -> { joins(exchanges: :order_cycle) }
@@ -108,14 +106,6 @@ Spree::Variant.class_eval do
OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor, order_cycle).fees_by_type_for self
end
def refresh_products_cache
if is_master?
product.refresh_products_cache
else
OpenFoodNetwork::ProductsCache.variant_changed self
end
end
private
def update_weight_from_unit_value
@@ -123,21 +113,7 @@ Spree::Variant.class_eval do
end
def destruction
if is_master?
exchange_variants(:reload).destroy_all
yield
product.refresh_products_cache
else
OpenFoodNetwork::ProductsCache.variant_destroyed(self) do
# Remove this association here instead of using dependent: :destroy because
# dependent-destroy acts before this around_filter is called, so ProductsCache
# has no way of knowing which exchanges the variant was a member of.
exchange_variants(:reload).destroy_all
# Destroy the variant
yield
end
end
exchange_variants(:reload).destroy_all
yield
end
end

View File

@@ -12,9 +12,6 @@ class VariantOverride < ActiveRecord::Base
# Default stock can be nil, indicating stock should not be reset or zero, meaning reset to zero. Need to ensure this can be set by the user.
validates :default_stock, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true
after_save :refresh_products_cache_from_save
after_destroy :refresh_products_cache_from_destroy
default_scope where(permission_revoked_at: nil)
scope :for_hubs, lambda { |hubs|
@@ -73,14 +70,4 @@ class VariantOverride < ActiveRecord::Base
end
self
end
private
def refresh_products_cache_from_save
OpenFoodNetwork::ProductsCache.variant_override_changed self
end
def refresh_products_cache_from_destroy
OpenFoodNetwork::ProductsCache.variant_override_destroyed self
end
end

View File

@@ -62,7 +62,7 @@ class Api::Admin::EnterpriseSerializer < ActiveModel::Serializer
# # medium: LOGO_MEDIUM_URL
# # }
def attachment_urls(attachment, versions)
return unless attachment.exists?
return unless attachment.file?
versions.each_with_object({}) do |version, urls|
urls[version] = attachment.url(version)

View File

@@ -1,43 +1,11 @@
require 'open_food_network/scope_variant_to_hub'
class Api::ProductSerializer < ActiveModel::Serializer
# TODO
# Prices can't be cached? How?
def serializable_hash
cached_serializer_hash.merge(uncached_serializer_hash)
end
private
def cached_serializer_hash
Api::CachedProductSerializer.new(object, @options).serializable_hash
end
def uncached_serializer_hash
Api::UncachedProductSerializer.new(object, @options).serializable_hash
end
end
class Api::UncachedProductSerializer < ActiveModel::Serializer
attributes :price
def price
if options[:enterprise_fee_calculator]
object.master.price + options[:enterprise_fee_calculator].indexed_fees_for(object.master)
else
object.master.price_with_fees(options[:current_distributor], options[:current_order_cycle])
end
end
end
class Api::CachedProductSerializer < ActiveModel::Serializer
# cached
# delegate :cache_key, to: :object
include ActionView::Helpers::SanitizeHelper
attributes :id, :name, :permalink, :meta_keywords
attributes :group_buy, :notes, :description, :description_html
attributes :properties_with_values
attributes :properties_with_values, :price
has_many :variants, serializer: Api::VariantSerializer
has_one :master, serializer: Api::VariantSerializer
@@ -70,4 +38,12 @@ class Api::CachedProductSerializer < ActiveModel::Serializer
def master
options[:master_variants][object.id].andand.first
end
def price
if options[:enterprise_fee_calculator]
object.master.price + options[:enterprise_fee_calculator].indexed_fees_for(object.master)
else
object.master.price_with_fees(options[:current_distributor], options[:current_order_cycle])
end
end
end

View File

@@ -0,0 +1,7 @@
class ExchangeVariantDeleter
def delete(product)
ExchangeVariant.
where(variant_id: product.variants.select(:id)).
delete_all
end
end

View File

@@ -1,36 +1,42 @@
# Returns a (paginatable) AR object for the products or variants in stock for a given shop and OC.
# The stock-checking includes on_demand and stock level overrides from variant_overrides.
class OrderCycleDistributedProducts
def initialize(distributor, order_cycle)
def initialize(distributor, order_cycle, customer)
@distributor = distributor
@order_cycle = order_cycle
@customer = customer
end
def products_relation
Spree::Product.where(id: stocked_products)
Spree::Product.where(id: stocked_products).group("spree_products.id")
end
def variants_relation
@order_cycle.
variants_distributed_by(@distributor).
merge(stocked_variants_and_overrides)
order_cycle.
variants_distributed_by(distributor).
merge(stocked_variants_and_overrides).
select("DISTINCT spree_variants.*")
end
private
attr_reader :distributor, :order_cycle, :customer
def stocked_products
@order_cycle.
variants_distributed_by(@distributor).
order_cycle.
variants_distributed_by(distributor).
merge(stocked_variants_and_overrides).
select("DISTINCT spree_variants.product_id")
end
def stocked_variants_and_overrides
Spree::Variant.
stocked_variants = Spree::Variant.
joins("LEFT OUTER JOIN variant_overrides ON variant_overrides.variant_id = spree_variants.id
AND variant_overrides.hub_id = #{@distributor.id}").
AND variant_overrides.hub_id = #{distributor.id}").
joins(:stock_items).
where(query_stock_with_overrides)
ProductTagRulesFilterer.new(distributor, customer, stocked_variants).call
end
def query_stock_with_overrides

View File

@@ -0,0 +1,111 @@
# Takes a Spree::Variant AR object and filters results based on applicable tag rules.
# Tag rules exists in the context of enterprise, customer, and variant_overrides,
# and are applied to variant_overrides only. Returns a Spree::Variant AR object.
class ProductTagRulesFilterer
def initialize(distributor, customer, variants_relation)
@distributor = distributor
@customer = customer
@variants_relation = variants_relation
end
def call
return variants_relation unless distributor_rules.any?
filter(variants_relation)
end
private
attr_accessor :distributor, :customer, :variants_relation
def distributor_rules
@distributor_rules ||= TagRule::FilterProducts.prioritised.for(distributor).all
end
def filter(variants_relation)
return variants_relation unless overrides_to_hide.any?
variants_relation.where(query_with_tag_rules)
end
def query_with_tag_rules
"#{variant_not_overriden} OR ( #{variant_overriden}
AND ( #{override_not_hidden_by_rule}
OR #{override_shown_by_rule} ) )"
end
def variant_not_overriden
"variant_overrides.id IS NULL"
end
def variant_overriden
"variant_overrides.id IS NOT NULL"
end
def override_not_hidden_by_rule
return "FALSE" unless overrides_to_hide.any?
"variant_overrides.id NOT IN (#{overrides_to_hide.join(',')})"
end
def override_shown_by_rule
return "FALSE" unless overrides_to_show.any?
"variant_overrides.id IN (#{overrides_to_show.join(',')})"
end
def overrides_to_hide
@overrides_to_hide ||= VariantOverride.where(hub_id: distributor.id).
tagged_with(default_rule_tags + hide_rule_tags, any: true).
pluck(:id)
end
def overrides_to_show
@overrides_to_show ||= VariantOverride.where(hub_id: distributor.id).
tagged_with(show_rule_tags, any: true).
pluck(:id)
end
def default_rule_tags
default_rules.map(&:preferred_variant_tags)
end
def hide_rule_tags
hide_rules.map(&:preferred_variant_tags)
end
def show_rule_tags
show_rules.map(&:preferred_variant_tags)
end
def default_rules
# These rules hide a variant_override with tag X and apply to all customers
distributor_rules.select(&:is_default?)
end
def non_default_rules
# These rules show or hide a variant_override with tag X for customer with tag Y
distributor_rules.reject(&:is_default?)
end
def customer_applicable_rules
# Rules which apply specifically to the current customer
@customer_applicable_rules ||= non_default_rules.select{ |rule| customer_tagged?(rule) }
end
def hide_rules
@hide_rules ||= customer_applicable_rules.
select{ |rule| rule.preferred_matched_variants_visibility == 'hidden' }
end
def show_rules
customer_applicable_rules - hide_rules
end
def customer_tagged?(rule)
customer_tag_list.include? rule.preferred_customer_tags
end
def customer_tag_list
customer.andand.tag_list || []
end
end

View File

@@ -0,0 +1,98 @@
require 'open_food_network/scope_product_to_hub'
class ProductsRenderer
class NoProducts < RuntimeError; end
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 10
def initialize(distributor, order_cycle, customer, args = {})
@distributor = distributor
@order_cycle = order_cycle
@customer = customer
@args = args
end
def products_json
raise NoProducts unless order_cycle && distributor && products
ActiveModel::ArraySerializer.new(products,
each_serializer: Api::ProductSerializer,
current_order_cycle: order_cycle,
current_distributor: distributor,
variants: variants_for_shop_by_id,
master_variants: master_variants_for_shop_by_id,
enterprise_fee_calculator: enterprise_fee_calculator).to_json
end
private
attr_reader :order_cycle, :distributor, :customer, :args
def products
return unless order_cycle
@products ||= begin
results = distributed_products.products_relation.order(taxon_order)
filter_and_paginate(results).
each { |product| product_scoper.scope(product) } # Scope results with variant_overrides
end
end
def product_scoper
OpenFoodNetwork::ScopeProductToHub.new(distributor)
end
def enterprise_fee_calculator
OpenFoodNetwork::EnterpriseFeeCalculator.new distributor, order_cycle
end
def filter_and_paginate(query)
query.
ransack(args[:q]).
result.
page(args[:page] || DEFAULT_PAGE).
per(args[:per_page] || DEFAULT_PER_PAGE)
end
def distributed_products
OrderCycleDistributedProducts.new(distributor, order_cycle, customer)
end
def taxon_order
if distributor.preferred_shopfront_taxon_order.present?
distributor
.preferred_shopfront_taxon_order
.split(",").map { |id| "spree_products.primary_taxon_id=#{id} DESC" }
.join(", ") + ", spree_products.name ASC, spree_products.id ASC"
else
"spree_products.name ASC"
end
end
def variants_for_shop
@variants_for_shop ||= begin
scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor)
distributed_products.variants_relation.
includes(:default_price, :stock_locations, :product).
where(product_id: products).
each { |v| scoper.scope(v) } # Scope results with variant_overrides
end
end
def variants_for_shop_by_id
index_by_product_id variants_for_shop.reject(&:is_master)
end
def master_variants_for_shop_by_id
index_by_product_id variants_for_shop.select(&:is_master)
end
def index_by_product_id(variants)
variants.each_with_object({}) do |v, vs|
vs[v.product_id] ||= []
vs[v.product_id] << v
end
end
end

View File

@@ -1,31 +0,0 @@
- content_for :page_title do
= t(:cache_settings)
= form_tag main_app.admin_cache_settings_path, :method => :put do
.field
= hidden_field_tag 'preferences[enable_products_cache?]', '0'
= check_box_tag 'preferences[enable_products_cache?]', '1', Spree::Config[:enable_products_cache?]
= label_tag nil, t('.enable_products_cache')
.form-buttons
= button t(:update), 'icon-refresh'
%br
%br
%h4= t(:cache_state)
%br
%table.index
%thead
%tr
%th= t('.distributor')
%th= t('.order_cycle')
%th= t('.status')
%th= t('.diff')
%tbody
- @results.each do |result|
%tr
%td= result[:distributor].name
%td= result[:order_cycle].name
%td= result[:status] ? t(:ok) : t('.error')
%td
%pre= result[:diff].to_s(:text)

View File

@@ -1,4 +1,4 @@
= content_for :page_title do
- content_for :page_title do
= t 'admin_enterprise_groups'
- if admin_user?

View File

@@ -1,6 +1,7 @@
.row
.alpha.two.columns
= f.label :name, t('.name')
%span.required *
.six.columns.omega
- if viewing_as_coordinator_of?(@order_cycle)
= f.text_field :name, 'ng-model' => 'order_cycle.name', 'required' => true, 'ng-disabled' => '!loaded()'

View File

@@ -3,6 +3,7 @@
.row
.alpha.two.columns
= label_tag t('.ready_for')
%span.required *
.six.columns
= text_field_tag 'order_cycle_outgoing_exchange_0_pickup_time', '', 'id' => 'order_cycle_outgoing_exchange_0_pickup_time', 'required' => 'required', 'placeholder' => t('.ready_for_placeholder'), 'ng-model' => 'outgoing_exchange.pickup_time', 'size' => 30, 'maxlength' => 35
%span.icon-question-sign{'ofn-with-tip' => t('admin.order_cycles.exchange_form.pickup_time_tip')}

View File

@@ -1,4 +1,4 @@
= content_for :page_title do
- content_for :page_title do
= t :admin_order_cycles
- content_for :main_ng_app_name do

View File

@@ -2,7 +2,7 @@
#{t('admin.product_import.title')}
= render partial: 'ams_data'
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'
.import-wrapper{ng: {app: 'admin.productImport', controller: 'ImportFormCtrl'}}

View File

@@ -1,7 +1,7 @@
- content_for :page_title do
#{t('admin.product_import.title')}
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'
= render 'upload_sidebar'

View File

@@ -1,4 +1,4 @@
= content_for :sub_menu do
- content_for :sub_menu do
%ul#sub_nav.inline-menu{"data-hook" => "admin_enterprise_sub_tabs"}
= tab :enterprises, url: main_app.admin_enterprises_path
= tab :enterprise_relationships, url: main_app.admin_enterprise_relationships_path

View File

@@ -1,8 +0,0 @@
= content_for :sub_menu do
%ul#sub_nav.inline-menu
= tab :products, match_path: '/products'
= tab :option_types, match_path: '/option_types'
= tab :properties
= tab :prototypes
= tab :variant_overrides, url: main_app.admin_inventory_path, match_path: '/inventory'
= tab :import, url: main_app.admin_product_import_path, match_path: '/product_import'

View File

@@ -1,4 +1,4 @@
= content_for :sub_menu do
- content_for :sub_menu do
%ul#sub_nav.inline-menu{"data-hook" => "admin_user_sub_tabs"}
= tab :users, url: spree.admin_users_path
= tab :roles, url: main_app.admin_enterprise_roles_path, match_path: '/enterprise_roles'

View File

@@ -5,4 +5,4 @@
%h1.page-title= t("admin.variant_overrides.index.title")
%a.with-tip{ 'data-powertip' => "#{t("admin.variant_overrides.index.description")}" }=t('admin.whats_this')
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'

View File

@@ -1,6 +1,6 @@
%form{ name: 'variant_overrides_form', ng: { show: "views.inventory.visible" } }
%save-bar{ dirty: "customers_form.$dirty", persist: "false" }
%input.red{ type: "button", value: "Save Changes", ng: { click: "update()", disabled: "!variant_overrides_form.$dirty" } }
%input.red{ type: "button", value: t(:save_changes), ng: { click: "update()", disabled: "!variant_overrides_form.$dirty" } }
%table.index.bulk#variant-overrides
%col.producer{ width: "20%", ng: { show: 'columns.producer.visible' } }
%col.product{ width: "20%", ng: { show: 'columns.product.visible' } }

View File

@@ -14,7 +14,7 @@
%td.reset{ ng: { show: 'columns.reset.visible' } }
%input{name: 'variant-overrides-{{ variant.id }}-resettable', type: 'checkbox', ng: {model: 'variantOverrides[hub_id][variant.id].resettable'}, placeholder: '{{ variant.resettable }}', 'ofn-track-variant-override' => 'resettable'}
%td.reset{ ng: { show: 'columns.reset.visible' } }
%input{name: 'variant-overrides-{{ variant.id }}-default_stock', type: 'text', ng: {model: 'variantOverrides[hub_id][variant.id].default_stock'}, placeholder: '{{ variant.default_stock ? variant.default_stock : "Default stock"}}', 'ofn-track-variant-override' => 'default_stock'}
%input{name: 'variant-overrides-{{ variant.id }}-default_stock', type: 'text', ng: {model: 'variantOverrides[hub_id][variant.id].default_stock'}, placeholder: '{{ variant.default_stock ? variant.default_stock : ("admin.variant_overrides.index.default_stock" | t)}}', 'ofn-track-variant-override' => 'default_stock'}
%td.inheritance{ ng: { show: 'columns.inheritance.visible' } }
%input.field{ :type => 'checkbox', name: 'variant-overrides-{{ variant.id }}-inherit', ng: { model: 'inherit' }, 'track-inheritance' => true }
%td.tags{ ng: { show: 'columns.tags.visible' } }

View File

@@ -1,18 +1,17 @@
%h3
= "#{t(:email_welcome)}!"
= "#{t(".email_welcome")}!"
%p.lead
%strong
= @enterprise.name
= "#{t(:email_registered)} #{ Spree::Config.site_name }!"
= "#{t(".email_registered")} #{ Spree::Config.site_name }!"
%p
= t :email_userguide_html, link: link_to('Open Food Network User Guide', ContentConfig.user_guide_link)
= t(".email_userguide_html", link: link_to(t(".userguide"), ContentConfig.user_guide_link))
%p
= t(".email_admin_html", link: link_to(t(".admin_panel"), spree.admin_url))
%p
= t :email_admin_html, link: link_to('Admin Panel', spree.admin_url)
%p
= t :email_community_html, link: link_to(t(:join_community), ContentConfig.community_forum_url)
= t(".email_community_html", link: link_to(t(".join_community"), ContentConfig.community_forum_url))
= render 'shared/mailers/signoff'

View File

@@ -1,5 +1,5 @@
.filter-shopfront.taxon-selectors.text-right
%single-line-selectors{ selectors: "taxonSelectors", objects: "Products.products | products:query | properties:activeProperties | taxonsOf", "active-selectors" => "activeTaxons"}
.filter-shopfront.taxon-selectors.text-right{ng: {show: 'supplied_taxons != null'}}
%single-line-selectors{ selectors: "taxonSelectors", objects: "supplied_taxons", "active-selectors" => "activeTaxons"}
.filter-shopfront.property-selectors.text-right
%single-line-selectors{ selectors: "propertySelectors", objects: "Products.products | products:query | taxons:activeTaxons | propertiesOf", "active-selectors" => "activeProperties"}
.filter-shopfront.property-selectors.text-right{ng: {show: 'supplied_properties != null'}}
%single-line-selectors{ selectors: "propertySelectors", objects: "supplied_properties", "active-selectors" => "activeProperties"}

View File

@@ -22,14 +22,14 @@
.small-12.medium-6.large-5.columns
%input#search.text{"ng-model" => "query",
placeholder: t(:products_search),
"ng-debounce" => "100",
"ng-debounce" => "200",
"ofn-disable-enter" => true}
.small-12.medium-6.large-6.large-offset-1.columns
= render partial: "shop/products/filters"
%div.pad-top{ "infinite-scroll" => "incrementLimit()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'filteredProducts.length <= limit' }
%product.animate-repeat{"ng-controller" => "ProductNodeCtrl", "ng-repeat" => "product in visibleProducts track by product.id", "id" => "product-{{ product.id }}"}
%div.pad-top{ "infinite-scroll" => "loadMore()", "infinite-scroll-distance" => "1", "infinite-scroll-disabled" => 'Products.loading' }
%product.animate-repeat{"ng-controller" => "ProductNodeCtrl", "ng-repeat" => "product in Products.products track by product.id", "id" => "product-{{ product.id }}"}
= render "shop/products/summary"
%shop-variant{variant: 'variant', "ng-repeat" => "variant in product.variants | orderBy: ['name_to_display','unit_value'] track by variant.id", "id" => "variant-{{ variant.id }}", "ng-class" => "{'out-of-stock': !variant.on_demand && variant.on_hand == 0}"}
@@ -41,7 +41,7 @@
.small-12.columns.text-center
%img.spinner{ src: "/assets/spinning-circles.svg" }
%div{"ng-show" => "filteredProducts.length == 0 && !Products.loading"}
%div{"ng-show" => "Products.products.length == 0 && !Products.loading"}
.row.summary
.small-12.columns
%p.no-results

View File

@@ -10,7 +10,7 @@
= line_item.single_money.to_html
%td.item-qty-show.align-center
- item.states.each do |state,count|
= "#{count} x #{t(state.humanize.downcase)}"
= "#{count} x #{t(state.humanize.downcase, scope: [:spree, :shipment_states], default: [:missing, "none"])}"
- unless shipment.shipped?
%td.item-qty-edit.hidden
= number_field_tag :quantity, item.quantity, :min => 0, :class => "line_item_quantity", :size => 5

View File

@@ -73,6 +73,8 @@
{{'js.admin.orders.shipment_states.' + order.shipment_state | t}}
%td
= mail_to "{{order.email}}"
%br
{{order.full_name}}
%td.align-center
%span{'ng-bind-html' => 'order.display_total'}
%td.actions

View File

@@ -8,14 +8,10 @@
%ul.tollbar.inline-menu
%li
= link_to_add_fields Spree.t(:add_product_properties), 'tbody#product_properties', class: 'icon-plus button'
%li
%span#new_ptype_link
= link_to Spree.t(:select_from_prototype), available_admin_prototypes_url, remote: true, 'data-update' => 'prototypes', class: 'button icon-copy'
= form_for @product, url: admin_product_url(@product), method: :put do |f|
%fieldset.no-border-top
.add_product_properties
#prototypes
= image_tag 'select2-spinner.gif', plugin: 'spree', style: 'display:none;', id: 'busy_indicator'
%table.index.sortable{"data-sortable-link" => update_positions_admin_product_product_properties_url}

View File

@@ -1,4 +1,4 @@
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'
= render :partial => 'spree/admin/shared/product_tabs', :locals => { :current => 'Group Buy Options' }
= render :partial => 'spree/shared/error_messages', :locals => { :target => @product }

View File

@@ -7,6 +7,6 @@
%li#new_product_link
= button_link_to t(:new_product), new_object_url, { :remote => true, :icon => 'icon-plus', :id => 'admin_new_product' }
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'
%div#new_product(data-hook)

View File

@@ -101,19 +101,3 @@
angular.element(document.getElementById("new_product")).ready(function() {
angular.bootstrap(document.getElementById("new_product"), ['admin.products']);
});
:javascript
(function($){
var base_url = "#{admin_prototypes_url}";
var prototype_select = $('#product_prototype_id');
prototype_select.change(function() {
var id = prototype_select.val();
if (id.length) {
$('#product-from-prototype').load([ base_url, id ].join("/"));
} else {
$('#product-from-prototype').empty();
}
})
if (prototype_select.html() == "") {
prototype_select.change();
}
})(jQuery);

View File

@@ -1,4 +1,4 @@
= render partial: 'admin/shared/product_sub_menu'
= render partial: 'spree/admin/shared/product_sub_menu'
= render :partial => 'spree/admin/shared/product_tabs', :locals => { :current => t(:Search) }
= render :partial => 'spree/shared/error_messages', :locals => { :target => @product }

View File

@@ -21,7 +21,6 @@
= configurations_sidebar_menu_item Spree.t(:shipping_categories), admin_shipping_categories_path
= configurations_sidebar_menu_item t(:enterprise_fees), main_app.admin_enterprise_fees_path
= configurations_sidebar_menu_item Spree.t(:analytics_trackers), admin_trackers_path
= configurations_sidebar_menu_item t('admin.cache_settings.edit.title'), main_app.edit_admin_cache_settings_path
= configurations_sidebar_menu_item t('admin.contents.edit.title'), main_app.edit_admin_contents_path
= configurations_sidebar_menu_item t('admin.invoice_settings.edit.title'), main_app.edit_admin_invoice_settings_path
= configurations_sidebar_menu_item t('admin.matomo_settings.edit.title'), main_app.edit_admin_matomo_settings_path

View File

@@ -33,14 +33,14 @@
%dd#shipment_status
- shipment_state_classes = "state #{@order.shipment_state}"
%span{ class: shipment_state_classes }
= t(@order.shipment_state, scope: :shipment_states, default: [:missing, "none"])
= t(@order.shipment_state, scope: [:spree, :shipment_states], default: [:missing, "none"])
%dt
= t(:payment)
\:
%dd#payment_status
- payment_state_classes = "state #{@order.payment_state}"
%span{ class: payment_state_classes }
= t(@order.payment_state, scope: :payment_states, default: [:missing, "none"])
= t(@order.payment_state, scope: [:spree, :payment_states], default: [:missing, "none"])
%dt
= t(:date_completed)
\:

View File

@@ -1,6 +1,6 @@
- content_for :sub_menu do
%ul#sub_nav.inline-menu
= tab :products, match_path: '/products'
= tab :option_types, match_path: '/option_types'
= tab :properties
= tab :prototypes
= tab :variant_overrides, url: main_app.admin_inventory_path, match_path: '/inventory'
= tab :import, url: main_app.admin_product_import_path, match_path: '/product_import'

View File

@@ -1,12 +1,12 @@
= content_for :page_title do
- content_for :page_title do
= Spree.t(:editing_product)
= "\"#{@product.name}\""
= content_for :sidebar_title do
- content_for :sidebar_title do
%span.sku
= @product.sku
= content_for :sidebar do
- content_for :sidebar do
%nav.menu
%ul
- if can?(:admin, Spree::Product)

View File

@@ -1,5 +1,5 @@
= tab :dashboard, :route => :admin, :icon => 'icon-dashboard'
= tab :products , :option_types, :properties, :prototypes, :variants, :product_properties, :taxons, :url => admin_products_path, :icon => 'icon-th-large'
= tab :products, :option_types, :properties, :variants, :product_properties, :taxons, :url => admin_products_path, :icon => 'icon-th-large'
= tab :order_cycles, :url => main_app.admin_order_cycles_path, :icon => 'icon-refresh'
= tab :orders, :payments, :creditcard_payments, :shipments, :credit_cards, :return_authorizations, :url => admin_orders_path('q[s]' => 'completed_at desc'), :icon => 'icon-shopping-cart'
= tab :reports, :icon => 'icon-file'

View File

@@ -1,7 +1,7 @@
= content_for :page_title do
- content_for :page_title do
= Spree.t(:new_user)
= content_for :page_actions do
- content_for :page_actions do
%li
= button_link_to Spree.t(:back_to_users_list), spree.admin_users_path, icon: 'icon-arrow-left'

3144
config/locales/ar.yml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -111,6 +111,14 @@ ca:
subject: "Sisplau, confirma l'adreça electrònica d'%{enterprise}"
welcome:
subject: "%{enterprise} és ara %{sitename}"
email_welcome: "Benvinguda"
email_registered: "ara forma part de"
email_userguide_html: "La Guia d'usuari amb suport detallat per configurar una productora o grup de consum és aquí: %{link}"
userguide: "Guia d'usuaris d'Open Food Network"
email_admin_html: "Pots gestionar el teu compte iniciant sessió a l'%{link} o fent clic a la pestanya a la part superior dreta de la pàgina d'inici i seleccionant Administració."
admin_panel: "Tauler dadministració"
email_community_html: "També tenim un fòrum en línia per debats de la comunitat relacionada amb el programari OFN i els desafiaments únics de triar endavant una organització alimentària. T'animem a unir-t'hi. Estem en constant evolució i les teves contribucions en aquest fòrum donaran forma al que passi a en el futur. %{link}"
join_community: "Uneix-te a la comunitat"
invite_manager:
subject: "%{enterprise} t'ha convidat a ser administrador"
producer_mailer:
@@ -320,15 +328,6 @@ ca:
number_localization:
number_localization_settings: "Configuració de localització numèrica"
enable_localized_number: "Utilitzeu l'estàndard internacional per separar milers/decimals"
cache_settings:
edit:
title: "Emmagatzematge ocult"
distributor: "Distribuïdora"
order_cycle: "Cicle de comanda"
status: "Estat"
diff: "Diferència"
error: "Error"
enable_products_cache: "Habilitar la memòria cau de productes?"
invoice_settings:
edit:
title: "Configuració de la factura"
@@ -536,6 +535,7 @@ ca:
title: Inventari
description: Utilitzeu aquesta pàgina per administrar els inventaris de la vostres organitzacions. Tots els detalls del producte aquí establerts substituiran els establerts a la pàgina "Productes"
enable_reset?: Habilitar la restauració de valors de stock?
default_stock: "Estoc per defecte"
inherit?: Heredar?
add: Afegeix
hide: Amaga
@@ -1379,13 +1379,7 @@ ca:
products_in: "en %{oc}"
products_at: "a %{distributor}"
products_elsewhere: "Productes trobats en altres llocs"
email_welcome: "Benvinguda"
email_confirmed: "Gràcies per confirmar la teva adreça de correu electrònic."
email_registered: "ara forma part de"
email_userguide_html: "La Guia d'usuari amb suport detallat per configurar una productora o grup de consum és aquí: %{link}"
email_admin_html: "Pots gestionar el teu compte iniciant sessió a l'%{link} o fent clic a la pestanya a la part superior dreta de la pàgina d'inici i seleccionant Administració."
email_community_html: "També tenim un fòrum en línia per debats de la comunitat relacionada amb el programari OFN i els desafiaments únics de triar endavant una organització alimentària. T'animem a unir-t'hi. Estem en constant evolució i les teves contribucions en aquest fòrum donaran forma al que passi a en el futur. %{link}"
join_community: "Uneix-te a la comunitat"
email_confirmation_activate_account: "Abans de poder activar el compte nou hem de confirmar la teva adreça de correu electrònic."
email_confirmation_greeting: "Hola, %{contact}!"
email_confirmation_profile_created: "S'ha creat exitosament un perfil per %{name}. Per activar el teu perfil hem de confirmar aquesta adreça de correu electrònic."
@@ -2814,7 +2808,6 @@ ca:
products: "Productes "
option_types: "Tipus d'opcions"
properties: "Propietats"
prototypes: "Prototips"
variant_overrides: "Inventari"
reports: "Informes"
configuration: "Configuració"

View File

@@ -111,6 +111,10 @@ de_DE:
subject: "Bitte bestätigen Sie die E-Mail-Adresse für %{enterprise}"
welcome:
subject: "%{enterprise} ist jetzt auf %{sitename}"
email_welcome: "Willkommen"
email_registered: "ist jetzt Teil von"
email_community_html: "Wir haben auch ein Online-Forum für Community-Diskussionen in Bezug auf OFN-Software und die einzigartigen Herausforderungen eines Lebensmittelunternehmens. Reden Sie doch mit. Wir entwickeln uns ständig weiter und Ihr Beitrag in diesem Forum prägt, was als nächstes passiert. %{link}"
join_community: "Treten Sie der Community bei"
invite_manager:
subject: "%{enterprise} hat Sie eingeladen, ein Manager zu sein"
producer_mailer:
@@ -320,15 +324,6 @@ de_DE:
number_localization:
number_localization_settings: "Nummernlokalisierungseinstellungen"
enable_localized_number: "Verwenden Sie die internationale Tausendertrennungslogik"
cache_settings:
edit:
title: "Cachen"
distributor: "Verteiler"
order_cycle: "Bestellrunde"
status: "Status"
diff: "Diff"
error: "Fehler"
enable_products_cache: "Produktcache aktivieren?"
invoice_settings:
edit:
title: "Rechnungseinstellungen"
@@ -1379,13 +1374,7 @@ de_DE:
products_in: "in %{oc}"
products_at: "bei %{distributor}"
products_elsewhere: "Produkte an anderer Stelle"
email_welcome: "Willkommen"
email_confirmed: "Vielen Dank für die Bestätigung Ihrer E-Mail-Adresse."
email_registered: "ist jetzt Teil von"
email_userguide_html: "Das Benutzerhandbuch mit ausführlicher Unterstützung für die Einrichtung Ihres Producer oder Hub finden Sie hier: %{link}"
email_admin_html: "Sie können Ihr Konto verwalten, indem Sie sich bei %{link} anmelden oder indem Sie oben rechts auf der Startseite auf das Zahnrad klicken und Administration auswählen."
email_community_html: "Wir haben auch ein Online-Forum für Community-Diskussionen in Bezug auf OFN-Software und die einzigartigen Herausforderungen eines Lebensmittelunternehmens. Reden Sie doch mit. Wir entwickeln uns ständig weiter und Ihr Beitrag in diesem Forum prägt, was als nächstes passiert. %{link}"
join_community: "Treten Sie der Community bei"
email_confirmation_activate_account: "Bevor wir Ihr neues Konto aktivieren können, müssen wir Ihre E-Mail-Adresse bestätigen."
email_confirmation_greeting: "Hallo, %{contact}!"
email_confirmation_profile_created: "Ein Profil für %{name} wurde erfolgreich erstellt! Um Ihr Profil zu aktivieren, müssen wir diese E-Mail-Adresse bestätigen."
@@ -2814,7 +2803,6 @@ de_DE:
products: "Produkte"
option_types: "Optionstypen"
properties: "Eigenschaften"
prototypes: "Prototypen"
variant_overrides: "Katalog"
reports: "Berichte"
configuration: "Aufbau"

View File

@@ -136,6 +136,14 @@ en:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
userguide: "Open Food Network User Guide"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
admin_panel: "Admin Panel"
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -365,16 +373,6 @@ en:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -592,6 +590,7 @@ en:
title: Inventory
description: Use this page to manage inventories for your enterprises. Any product details set here will override those set on the 'Products' page
enable_reset?: Enable Stock Reset?
default_stock: "Default stock"
inherit?: Inherit?
add: Add
hide: Hide
@@ -1476,15 +1475,7 @@ en:
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here:
%{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next.
%{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created!
@@ -2972,7 +2963,6 @@ See the %{link} to find out more about %{sitename}'s features and to start using
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,12 @@ en_AU:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -319,15 +325,6 @@ en_AU:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1376,13 +1373,7 @@ en_AU:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2805,7 +2796,6 @@ en_AU:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -110,6 +110,12 @@ en_BE:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -317,15 +323,6 @@ en_BE:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1297,12 +1294,12 @@ en_BE:
home_shop: Shop Now
brandstory_headline: "Food, unincorporated."
brandstory_intro: "Sometimes the best way to fix the system is to start a new one…"
brandstory_part1: "We begin from the ground up. With farmers and growers ready to tell their stories proudly and truly. With distributors ready to connect people with products fairly and honestly. With buyers who believe that better weekly shopping decisions can seriously change the world."
brandstory_part2: "Then we need a way to make it real. A way to empower everyone who grows, sells and buys food. A way to tell all the stories, to handle all the logistics. A way to turn transaction into transformation every day."
brandstory_part3: "So we build an online marketplace that levels the playing field. Its transparent, so it creates real relationships. Its open source, so its owned by everyone. It scales to regions and nations, so people start versions across the world."
brandstory_part4: "It works everywhere. It changes everything."
brandstory_part1: "This is what we do by creating a platform that wants to connect:\n● passionate farmers, committed to sustainable and regenerative agriculture,\n● distributors of local products, followers of short circuits, who act in complete transparency and ensure fair remuneration of producers,\n● buyers who want to change the world by eating better,"
brandstory_part2: "This platform is called the Open Food Network."
brandstory_part3: "Transparent and open source, it promotes fair relations between farmers and consumers. Its objective is to create a quality food network thanks to an efficient and constantly evolving IT tool.\nIt is deployed in several countries. In Belgium, it is developed by Oxfam-World Stores to empower those who grow, sell and buy food."
brandstory_part4: "You are\n● A producer: register and present your products to promote them in your region. You energize the platform and connect with new customers.\n● A distributor: register and present your project to make it known and convince new customers.\n● A consumer: find products near you and discover their stories."
brandstory_part5_strong: "We call it Open Food Network."
brandstory_part6: "We all love food. Now we can love our food system too."
brandstory_part6: "We can all participate in the construction of a fairer food system that respects mankind and preserves the planet."
learn_body: "Explore models, stories and resources to support you to develop your fair food business or organisation. Find training, events and other opportunities to learn from peers."
learn_cta: "Get Inspired"
connect_body: "Search our full directories of producers, hubs and groups to find fair food traders near you. List your business or organisation on the OFN so buyers can find you. Join the community to get advice and solve problems together."
@@ -1370,13 +1367,7 @@ en_BE:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2798,7 +2789,6 @@ en_BE:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,12 @@ en_CA:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -320,15 +326,6 @@ en_CA:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1377,13 +1374,7 @@ en_CA:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2809,7 +2800,6 @@ en_CA:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,14 @@ en_GB:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
userguide: "Open Food Network User Guide"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on 'Profile' in the top right hand side of the homepage, and selecting Administration."
admin_panel: "Admin Panel"
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -320,15 +328,6 @@ en_GB:
number_localization:
number_localization_settings: "Number Localisation Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1377,13 +1376,7 @@ en_GB:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on 'Profile' in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2815,7 +2808,6 @@ en_GB:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,14 @@ en_NZ:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
userguide: "Open Food Network User Guide"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
admin_panel: "Admin Panel"
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -178,7 +186,7 @@ en_NZ:
cancel_order: "Cancel Order"
confirm_send_invoice: "An invoice for this order will be sent to the customer. Are you sure you want to continue?"
confirm_resend_order_confirmation: "Are you sure you want to resend the order confirmation email?"
must_have_valid_business_number: "%{enterprise_name} must have a valid IRD number before invoices can be sent."
must_have_valid_business_number: "%{enterprise_name} must have a valid GST number before invoices can be sent."
invoice: "Invoice"
more: "More"
say_no: "No"
@@ -320,15 +328,6 @@ en_NZ:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -536,6 +535,7 @@ en_NZ:
title: Inventory
description: Use this page to manage inventories for your enterprises. Any product details set here will override those set on the 'Products' page
enable_reset?: Enable Stock Reset?
default_stock: "Default stock"
inherit?: Inherit?
add: Add
hide: Hide
@@ -595,7 +595,7 @@ en_NZ:
desc_long: About Us
desc_long_placeholder: Tell customers about yourself. This information appears on your public profile.
business_details:
abn: 'IRD number '
abn: 'GST No. '
abn_placeholder: eg. 99 -99-99
acn: NZBN
acn_placeholder: eg. 123 456 789
@@ -768,7 +768,7 @@ en_NZ:
change_type_form:
producer_profile: Producer Profile
connect_ofn: Connect through OFN
always_free: ALWAYS FREE
always_free: See ABOUT in the menu
producer_description_text: Add your products to Open Food Network, allowing hubs to stock your products in their stores.
producer_shop: Producer Shop
sell_your_produce: Sell your own produce
@@ -1115,7 +1115,7 @@ en_NZ:
footer_legal_tos: "Terms and conditions"
footer_legal_visit: "Find us on"
footer_legal_text_html: "Open Food Network is a free and open source software platform. Our content is licensed with %{content_license} and our code with %{code_license}."
footer_data_text_with_privacy_policy_html: "We take good care of your data. See our %{privacy_policy} and %{cookies_policy}"
footer_data_text_with_privacy_policy_html: "We take good care of your data. See our %{privacy_policy} "
footer_data_text_without_privacy_policy_html: "We take good care of your data. See our %{cookies_policy}"
footer_data_privacy_policy: "privacy policy"
footer_data_cookies_policy: "cookies policy"
@@ -1145,7 +1145,7 @@ en_NZ:
tax_total: "Total tax (%{rate}):"
total_excl_tax: "Total (Excl. tax):"
total_incl_tax: "Total (Incl. tax):"
abn: "IRD Number:"
abn: "GST No.:"
acn: "NZBN:"
invoice_issued_on: "Invoice issued on:"
order_number: "Invoice number:"
@@ -1377,13 +1377,7 @@ en_NZ:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -1780,7 +1774,7 @@ en_NZ:
enterprise_long_desc: "Long Description"
enterprise_long_desc_placeholder: "This is your opportunity to tell the story of your enterprise - what makes you different and wonderful? We'd suggest keeping your description to under 600 characters or 150 words."
enterprise_long_desc_length: "%{num} characters / up to 600 recommended"
enterprise_abn: "IRD Number"
enterprise_abn: "GST No."
enterprise_abn_placeholder: "eg. 99-99-99"
enterprise_acn: "NZBN"
enterprise_acn_placeholder: "eg. 123 456 789"
@@ -2311,7 +2305,7 @@ en_NZ:
saving: SAVING
enterprise_package:
hub_profile: Hub Profile
hub_profile_cost: "COST: See About in the menu"
hub_profile_cost: "COST: See ABOUT in the menu"
hub_profile_text1: >
People can find and contact you on the Open Food Network. Your enterprise
will be visible on the map, and will be searchable in listings.
@@ -2337,7 +2331,7 @@ en_NZ:
Click on an option to see more detailed information about each package,
and hit the red SAVE button when you are done!
profile_only: Profile Only
profile_only_cost: "COST: See About in the menu"
profile_only_cost: "COST: See ABOUT in the menu"
profile_only_text1: >
A profile makes you visible and contactable to others and is a way to
share your story.
@@ -2368,7 +2362,7 @@ en_NZ:
so no matter your situation, we want to provide the tools you need to
run your organisation or local food business.
get_listing: Get a listing
always_free: See About in the menu
always_free: See ABOUT in the menu
sell_produce_others: Sell produce from others
sell_own_produce: Sell your own produce
sell_both: Sell produce from self and others
@@ -2809,7 +2803,6 @@ en_NZ:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,12 @@ en_US:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise}is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -320,15 +326,6 @@ en_US:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1377,13 +1374,7 @@ en_US:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2809,7 +2800,6 @@ en_US:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,12 @@ en_ZA:
subject: "Please confirm the email address for %{enterprise}"
welcome:
subject: "%{enterprise} is now on %{sitename}"
email_welcome: "Welcome"
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
invite_manager:
subject: "%{enterprise} has invited you to be a manager"
producer_mailer:
@@ -319,15 +325,6 @@ en_ZA:
number_localization:
number_localization_settings: "Number Localisation Settings"
enable_localized_number: "Use the international thousand/decimal separator logic"
cache_settings:
edit:
title: "Caching"
distributor: "Distributor"
order_cycle: "Order Cycle"
status: "Status"
diff: "Diff"
error: "Error"
enable_products_cache: "Enable Products Cache?"
invoice_settings:
edit:
title: "Invoice Settings"
@@ -1376,13 +1373,7 @@ en_ZA:
products_in: "in %{oc}"
products_at: "at %{distributor}"
products_elsewhere: "Products found elsewhere"
email_welcome: "Welcome"
email_confirmed: "Thank you for confirming your email address."
email_registered: "is now part of"
email_userguide_html: "The User Guide with detailed support for setting up your Producer or Hub is here: %{link}"
email_admin_html: "You can manage your account by logging into the %{link} or by clicking on the cog in the top right hand side of the homepage, and selecting Administration."
email_community_html: "We also have an online forum for community discussion related to OFN software and the unique challenges of running a food enterprise. You are encouraged to join in. We are constantly evolving and your input into this forum will shape what happens next. %{link}"
join_community: "Join the community"
email_confirmation_activate_account: "Before we can activate your new account, we need to confirm your email address."
email_confirmation_greeting: "Hi, %{contact}!"
email_confirmation_profile_created: "A profile for %{name} has been successfully created! To activate your Profile we need to confirm this email address."
@@ -2812,7 +2803,6 @@ en_ZA:
products: "Products"
option_types: "Option Types"
properties: "Properties"
prototypes: "Prototypes"
variant_overrides: "Inventory"
reports: "Reports"
configuration: "Configuration"

View File

@@ -111,6 +111,14 @@ es:
subject: "Confirma la dirección de correo electrónico de %{enterprise}"
welcome:
subject: "%{enterprise} está ahora en %{sitename}"
email_welcome: "Bienvenido"
email_registered: "ahora es parte de"
email_userguide_html: "La Guía de Usuario con soporte detallado para configurar su Productora o Grupo de Consumo está aquí: %{link}"
userguide: "Guía de usuario de Open Food Network"
email_admin_html: "Puede administrar su cuenta iniciando sesión en %{link} o haciendo clic en el engrane arriba a la derecha de la página de inicio, y seleccionando Administración."
admin_panel: "Panel de administración"
email_community_html: "También tenemos un foro en líea para la discusión comunal relacionada con el programa OFN y los retos únicos del funcionamiento de una organización de alimentación. Lo invitamos a unirse. Estamos evolucionando de forma constante y su aporte en este formo le dará forma a lo que pase luego. %{link}"
join_community: "Unirse a la comunidad"
invite_manager:
subject: "%{enterprise} te ha invitado a ser administrador"
producer_mailer:
@@ -320,15 +328,6 @@ es:
number_localization:
number_localization_settings: "Number Localization Settings"
enable_localized_number: "Usar la logica internacional separador miles/decimales"
cache_settings:
edit:
title: "Almacenando"
distributor: "Distribuidora"
order_cycle: "Ciclo de Pedido"
status: "Estado"
diff: "Diff"
error: "Error"
enable_products_cache: "¿Habilitar caché de productos?"
invoice_settings:
edit:
title: "Configuración de Factura"
@@ -536,6 +535,7 @@ es:
title: Inventario
description: Utilice esta página para administrar inventarios para sus organizaciones. Todos los detalles del producto establecidos aquí anularán los establecidos en la página de 'Productos'
enable_reset?: ¿Activar Reset del Stock?
default_stock: "Stock predeterminado"
inherit?: ¿Heredado?
add: Añadir
hide: Ocultar
@@ -1379,13 +1379,7 @@ es:
products_in: "en %{oc}"
products_at: "en %{distributor}"
products_elsewhere: "Productos encontrados en otros lugares"
email_welcome: "Bienvenido"
email_confirmed: "Gracias por confirmar la dirección de correo electrónico."
email_registered: "ahora es parte de"
email_userguide_html: "La Guía de Usuario con soporte detallado para configurar su Productora o Grupo de Consumo está aquí: %{link}"
email_admin_html: "Puede administrar su cuenta iniciando sesión en %{link} o haciendo clic en el engrane arriba a la derecha de la página de inicio, y seleccionando Administración."
email_community_html: "También tenemos un foro en líea para la discusión comunal relacionada con el programa OFN y los retos únicos del funcionamiento de una organización de alimentación. Lo invitamos a unirse. Estamos evolucionando de forma constante y su aporte en este formo le dará forma a lo que pase luego. %{link}"
join_community: "Unirse a la comunidad"
email_confirmation_activate_account: "Antes de que podamos activar su nueva cuenta, necesitamos confirmar su dirección de correo electrónico."
email_confirmation_greeting: "Hola, %{contact}!"
email_confirmation_profile_created: "¡Se creó un un perfil para %{name} con éxito! Para activar su Perfil necesitamos que confirme esta dirección de correos."
@@ -2815,7 +2809,6 @@ es:
products: "Productos"
option_types: "Tipos de opciones"
properties: "Propiedades"
prototypes: "Prototipos"
variant_overrides: "Inventario"
reports: "Informes"
configuration: "Configuración"

View File

@@ -110,7 +110,15 @@ fr:
confirmation_instructions:
subject: "Confirmez l'adresse email pour %{enterprise}"
welcome:
subject: "Dernière étape pour créer%{enterprise} sur %{sitename}"
subject: "Dernière étape pour créer %{enterprise} sur %{sitename}"
email_welcome: "Vous y êtes presque..."
email_registered: "va, dès que vous aurez choisi un type de profil, être créé sur"
email_userguide_html: "Le Guide Utilisateur est là pour vous accompagner dans la prise en main de la plateforme. Vous y trouverez les informations détaillées de paramétrage de votre profil entreprise, de vos produits si vous êtes producteurs, et de votre boutique si vous avez choisi un type de profil comprenant une boutique. Pour accéder au guide en français, cliquez ici : %{link}"
userguide: "Guide utilisateur"
email_admin_html: "Pour choisir le type de profil, rendez-vous sur l%{link}. Vous pouvez aussi y accéder depuis la page daccueil du site, en haut à droite, Profil > Administration. Il vous est alors proposé de choisir le type de profil désiré. Le type de profil peut aussi être choisi via le menu “Entreprises” depuis linterface dadministration, colonne “Type de profil”. Linterface dadministration est lendroit où vous gérez vos entreprises, produits, commandes, etc."
admin_panel: "interface d'administration"
email_community_html: "Nous avons aussi un forum de discussion en ligne pour échanger avec la communauté sur des questions liées à la plateforme ou aux défis de la gestion d'un circuit court. Nous vous invitons à y participer ! %{link}"
join_community: "Accéder au forum"
invite_manager:
subject: "%{enterprise} vous a invité comme gestionnaire"
producer_mailer:
@@ -320,15 +328,6 @@ fr:
number_localization:
number_localization_settings: "Gestion localisation des nombres"
enable_localized_number: "Utiliser le traitement international des séparateurs de milliers/centimes"
cache_settings:
edit:
title: "Mise en cache"
distributor: "Distributeur"
order_cycle: "Cycle de Vente"
status: "Statut"
diff: "Diff"
error: "Erreur"
enable_products_cache: "Autoriser Cache Produits ?"
invoice_settings:
edit:
title: "Paramètres de facturation"
@@ -536,6 +535,7 @@ fr:
title: Catalogue boutique
description: Utilisez cette page pour gérer le catalogue de votre entreprise. Les détails produits saisis ici remplaceront ceux de la page "Produit" pour votre entreprise uniquement.
enable_reset?: Autoriser réinitialisation du stock (retour configurations par défaut)?
default_stock: "Stock par défaut"
inherit?: Hériter?
add: Ajouter
hide: Masquer
@@ -1378,13 +1378,7 @@ fr:
products_in: "dans %{oc}"
products_at: "à %{distributor}"
products_elsewhere: "Produits trouvés ailleurs"
email_welcome: "Vous y êtes presque..."
email_confirmed: "Veuillez confirmer votre adresse email."
email_registered: "va, dès que vous aurez choisi un type de profil, être créé sur"
email_userguide_html: "Le Guide Utilisateur est là pour vous accompagner dans la prise en main de la plateforme. Vous y trouverez les informations détaillées de paramétrage de votre profil entreprise, de vos produits si vous êtes producteurs, et de votre boutique si vous avez choisi un type de profil comprenant une boutique. Pour accéder au guide en français, cliquez ici : %{link}"
email_admin_html: "Pour choisir le type de profil, rendez-vous sur l%{link}. Vous pouvez aussi y accéder depuis la page daccueil du site, en haut à droite, Profil > Administration. Il vous est alors proposé de choisir le type de profil désiré. Le type de profil peut aussi être choisi via le menu “Entreprises” depuis linterface dadministration, colonne “Type de profil”. Linterface dadministration est lendroit où vous gérez vos entreprises, produits, commandes, etc."
email_community_html: "Nous avons aussi un forum de discussion en ligne pour échanger avec la communauté sur des questions liées à la plateforme ou aux défis de la gestion d'un circuit court. Nous vous invitons à y participer ! %{link}"
join_community: "Accéder au forum"
email_confirmation_activate_account: "Avant de pouvoir activer votre compte, nous devons nous assurer de la validité de votre adresse email."
email_confirmation_greeting: "Bonjour %{contact}!"
email_confirmation_profile_created: "Le profil pour %{name} a été créé avec succès! Pour activer votre Profil nous devons vérifier cette adresse email."
@@ -2838,7 +2832,6 @@ fr:
products: "Produits"
option_types: "Types d'options"
properties: "Propriétés / labels"
prototypes: "Prototypes"
variant_overrides: "Catalogue boutique"
reports: "Rapports"
configuration: "Configuration"

View File

@@ -110,6 +110,12 @@ fr_BE:
subject: "Confirmez l'adresse email pour %{enterprise}"
welcome:
subject: "%{enterprise} est maintenant sur %{sitename}"
email_welcome: "Bienvenue"
email_registered: "fait maintenant partie de"
email_userguide_html: "Le Guide Utilisateur expliquant comment mettre en place son profil producteur ou son comptoir est accessible ici: %{link}"
email_admin_html: "Vous pouvez gérer votre compte en vous connectant ici %{link} ou en cliquant sur la roue en haut à droite de la page d'accueil et en sélectionnant Administration."
email_community_html: "Nous avons aussi un forum de discussion en ligne (en anglais) pour échanger avec la communauté sur des questions liées au logiciel OFN et aux défis de la gestion d'un food hub. Nous vous invitons à y participer. Nous sommes en constante évolution et vos contributions à ce forum vont façonner les prochaines étapes. %{link}"
join_community: "Rejoindre la communauté"
invite_manager:
subject: "%{enterprise} vous a invité comme manager"
producer_mailer:
@@ -162,7 +168,7 @@ fr_BE:
home: "OFN"
title: Open Food Network
welcome_to: 'Bienvenue sur '
site_meta_description: "Tout commence dans le sol. Avec ces paysans, agriculteurs, producteurs, engagés pour une agriculture durable et régénératrice, et désireux de partager leur histoire et leur passion avec fierté. Avec ces distributeurs souhaitant reconnecter les individus à leurs aliments et aux gens qui les produisent, soutenir les prises de conscience, dans une démarche de transparence, d'honnêteté, en assurant une juste rémunération des producteurs. Avec ces acheteurs qui croient que de meilleures décisions d'achats peuvent ..."
site_meta_description: "Cest ce que nous faisons en créant une plateforme qui veut mettre en contact :\n● des paysans passionnés, engagés pour une agriculture durable et régénératrice,\n● des distributeurs de produits locaux, adeptes de circuits courts, qui agissent en toute transparence et assurent une juste rémunération des producteurs,\n● des acheteurs qui veulent changer le monde en mangeant mieux,"
search_by_name: Recherche par nom ou province...
producers_join: Les producteurs et autres magasins basés en Belgique sont invités à rejoindre Open Food Network.
charges_sales_tax: Soumis à la TVA?
@@ -317,15 +323,6 @@ fr_BE:
number_localization:
number_localization_settings: "Gestion localisation des nombres"
enable_localized_number: "Utiliser le traitement international des séparateurs de milliers/centimes"
cache_settings:
edit:
title: "Mise en cache"
distributor: "Distributeur"
order_cycle: "Cycle de vente"
status: "Statut"
diff: "Diff"
error: "Erreur"
enable_products_cache: "Permettre des produits en approvisionnement? "
invoice_settings:
edit:
title: "Paramètres de facturation"
@@ -1119,7 +1116,7 @@ fr_BE:
signup: "s'inscrire"
contact: "contacter"
require_customer_login: "Seuls les clients approuvés peuvent accéder à ce comptoir."
require_login_html: "Si vous êtes déjà un client approuvé, %{login}ou %{signup}si vous souhaitez continuer. Voulez-vous commencer à faire vos courses ici? S'il vous plaît %{contact}%{enterprise}et demandez à rejoindre."
require_login_html: "Si vous êtes déjà un client approuvé, %{login} ou %{signup}si vous souhaitez continuer. Voulez-vous commencer à faire vos courses ici? S'il vous plaît %{contact} %{enterprise}et demandez à rejoindre."
require_customer_html: "Si vous souhaitez commencer à magasiner ici, veuillez %{contact}%{enterprise}demander si vous souhaitez vous inscrire."
card_could_not_be_updated: La carte bancaire n'a pas pu être mise à jour
card_could_not_be_saved: la carte n'a pas pu être sauvegardée
@@ -1296,14 +1293,14 @@ fr_BE:
cookies_policy_link: "politique de cookies"
cookies_accept_button: "Accepter les cookies"
home_shop: Faire mes courses
brandstory_headline: "Des aliments porteurs de sens."
brandstory_headline: "Votre assiette peut faire la différence."
brandstory_intro: "Parfois, le meilleur moyen de réparer le système, c'est d'en inventer un autre..."
brandstory_part1: "Tout commence dans le sol. Avec ces paysans, agriculteurs, producteurs, engagés pour une agriculture durable et régénératrice, et désireux de partager leur histoire et leur passion avec fierté. Avec ces distributeurs souhaitant reconnecter les individus à leurs aliments et aux gens qui les produisent, soutenir les prises de conscience, dans une démarche de transparence, d'honnêteté, en assurant une juste rémunération des producteurs. Avec ces acheteurs qui croient que de meilleures décisions d'achats peuvent véritablement changer le monde."
brandstory_part2: "Nous avons besoin d'un outil pour rendre tout ça réel. Un moyen de redonner le pouvoir à ceux qui cultivent, vendent et achètent la nourriture. Un moyen de raconter les histoires, de gérer la logistique. Un moyen de transformer chaque jour les transactions en actions porteuses de changement."
brandstory_part3: "C'est pour cela que nous construisons cette plateforme, ce \"marché en ligne\", afin de rééquilibrer les échanges et redistribuer le pouvoir. Elle est transparente, pour assurer des relations équitables et favoriser les prises de conscience. Elle est «open source» et donc libre daccès. Elle est déployée dans plusieurs régions ou pays. "
brandstory_part4: "Elle fonctionne partout. Elle change tout."
brandstory_part2: "Cette plateforme sappelle Open Food Network."
brandstory_part3: "Transparente et “open source” elle promeut des relations équitables entre agriculteurs et consommateurs. Son objectif est de créer un réseau alimentaire de qualité grâce à un outil informatique performant en constante évolution."
brandstory_part4: "Vous êtes\n● Un producteur : inscrivez-vous et présentez vos produits pour les faire connaître dans votre région. Vous dynamisez la plateforme et entrez en contact avec de nouveaux clients.\n● Un distributeur : inscrivez-vous et présentez votre projet pour le faire connaître et convaincre de nouveaux clients.\n● Un consommateur : trouvez des produits près de chez vous et allez à la découverte de leurs histoires."
brandstory_part5_strong: "Cette plateforme s'appelle Open Food Network."
brandstory_part6: "Nous aimons notre nourriture. Maintenant nous pouvons aussi aimer notre système alimentaire."
brandstory_part6: "Nous pouvons toutes et tous participer à la construction dun système alimentaire plus juste, respectueux de lHomme qui préserve la planète."
learn_body: "Explorer les modèles, les histoires et les ressources disponibles pour vous aider à développer votre propre initiative de commerce/organisation oeuvrant pour un système alimentaire équitable et juste. Trouver des outils pour vous former, des événements et autres opportunités d'apprendre de vos pairs."
learn_cta: "Découvrir "
connect_body: "Rechercher dans le répertoire des producteurs, des comptoirs et des groupes pour trouver des commerçants éthiques à côté de chez vous. Inscrivez votre commerce ou organisation sur OFFrance pour que les acheteurs puissent vous trouver. Rejoignez la communauté pour recevoir du soutien et résoudre ensemble les problèmes."
@@ -1371,13 +1368,7 @@ fr_BE:
products_in: "dans %{oc}"
products_at: "à %{distributor}"
products_elsewhere: "Produits trouvés ailleurs"
email_welcome: "Bienvenue"
email_confirmed: "Veuillez confirmer votre adresse email."
email_registered: "fait maintenant partie de"
email_userguide_html: "Le Guide Utilisateur expliquant comment mettre en place son profil producteur ou son comptoir est accessible ici: %{link}"
email_admin_html: "Vous pouvez gérer votre compte en vous connectant ici %{link} ou en cliquant sur la roue en haut à droite de la page d'accueil et en sélectionnant Administration."
email_community_html: "Nous avons aussi un forum de discussion en ligne (en anglais) pour échanger avec la communauté sur des questions liées au logiciel OFN et aux défis de la gestion d'un food hub. Nous vous invitons à y participer. Nous sommes en constante évolution et vos contributions à ce forum vont façonner les prochaines étapes. %{link}"
join_community: "Rejoindre la communauté"
email_confirmation_activate_account: "Avant de pouvoir activer votre compte, nous devons nous assurer de la validité de votre adresse email."
email_confirmation_greeting: "Bonjour %{contact}!"
email_confirmation_profile_created: "Le profil pour %{name} a été créé avec succès! Pour activer votre Profil nous devons vérifier cette adresse email."
@@ -2812,7 +2803,6 @@ fr_BE:
products: "Produits"
option_types: "Option Types "
properties: "Labels / propriétés"
prototypes: "Prototypes"
variant_overrides: "Catalogue du magasin"
reports: "Rapports"
configuration: "Configuration"

View File

@@ -112,6 +112,12 @@ fr_CA:
subject: "Confirmez l'adresse email pour %{enterprise}"
welcome:
subject: "%{enterprise} est maintenant sur %{sitename}"
email_welcome: "Bienvenue"
email_registered: "fait maintenant partie de"
email_userguide_html: "Le Guide Utilisateur expliquant comment mettre en place son profil producteur ou son hub est accessible ici: %{link}"
email_admin_html: "Vous pouvez gérer votre compte en vous connectant ici %{link} ou en cliquant sur la roue en haut à droite de la page d'accueil et en sélectionnant Administration."
email_community_html: "Nous avons aussi un forum de discussion en ligne (en anglais) pour échanger avec la communauté sur des questions liées au logiciel OFN et aux défis de la gestion d'un food hub. Nous vous invitons à y participer. Nous sommes en constante évolution et vos contributions à ce forum vont façonner les prochaines étapes. %{link}"
join_community: "Rejoindre la communauté"
invite_manager:
subject: "%{enterprise} vous a invité comme manager"
producer_mailer:
@@ -321,15 +327,6 @@ fr_CA:
number_localization:
number_localization_settings: "Paramètres de localisation de numéro"
enable_localized_number: "Utiliser le traitement international des séparateurs de milliers/centimes"
cache_settings:
edit:
title: "Mise en cache"
distributor: "Hub-distributeur"
order_cycle: "Cycle de vente"
status: "Statut"
diff: "Diff"
error: "Erreur"
enable_products_cache: "Autoriser Cache Produits ?"
invoice_settings:
edit:
title: "Paramètres de facturation"
@@ -1378,13 +1375,7 @@ fr_CA:
products_in: "dans %{oc}"
products_at: "à %{distributor}"
products_elsewhere: "Produits trouvés ailleurs"
email_welcome: "Bienvenue"
email_confirmed: "Veuillez confirmer votre adresse email."
email_registered: "fait maintenant partie de"
email_userguide_html: "Le Guide Utilisateur expliquant comment mettre en place son profil producteur ou son hub est accessible ici: %{link}"
email_admin_html: "Vous pouvez gérer votre compte en vous connectant ici %{link} ou en cliquant sur la roue en haut à droite de la page d'accueil et en sélectionnant Administration."
email_community_html: "Nous avons aussi un forum de discussion en ligne (en anglais) pour échanger avec la communauté sur des questions liées au logiciel OFN et aux défis de la gestion d'un food hub. Nous vous invitons à y participer. Nous sommes en constante évolution et vos contributions à ce forum vont façonner les prochaines étapes. %{link}"
join_community: "Rejoindre la communauté"
email_confirmation_activate_account: "Avant de pouvoir activer votre compte, nous devons nous assurer de la validité de votre adresse email."
email_confirmation_greeting: "Bonjour %{contact}!"
email_confirmation_profile_created: "Le profil pour %{name} a été créé avec succès! Pour activer votre Profil nous devons vérifier cette adresse email."
@@ -2820,7 +2811,6 @@ fr_CA:
products: "Produits"
option_types: "Types d'options"
properties: "Labels / propriétés"
prototypes: "Prototypes"
variant_overrides: "Catalogue boutique"
reports: "Rapports"
configuration: "Configuration"

View File

@@ -104,6 +104,12 @@ it:
subject: "Per favore conferma l'indirizzo email per %{enterprise}"
welcome:
subject: "%{enterprise} è ora su %{sitename}"
email_welcome: "Benvenuto"
email_registered: "è ora parte di"
email_userguide_html: "La Guida Utente con supporto dettagliato per l'impostazione del tuo Produttore o Hub è qui: %{link}"
email_admin_html: "Puoi gestire il tuo profilo facendo il log in al link %{link} o cliccando sull'ingranaggio in alto a destra della homepage, e selezionando Amministrazione"
email_community_html: "Abbiamo anche un forum on-line per le discussioni della comunità sul software OFN e le sfide uniche legate all'avere un'impresa del cibo. Sei invitato ad unirti. Ci evolviamo in continuo e il tuo contributo in questo forum plasmerà ciò che sarà. %{link}"
join_community: "Unisciti alla community"
invite_manager:
subject: "%{enterprise} ti a invitato ad essere un referente"
producer_mailer:
@@ -311,15 +317,6 @@ it:
number_localization:
number_localization_settings: "Settaggi del Numero di Localizzazione"
enable_localized_number: "Usa la logica internazionale di separazione migliaia/decimali"
cache_settings:
edit:
title: "Immagazzinando"
distributor: "Distributore"
order_cycle: "Ciclo di richieste"
status: "Stato"
diff: "Diff"
error: "Errore"
enable_products_cache: "Abilita la cache dei prodotti?"
invoice_settings:
edit:
title: "Impostazioni fatturazione"
@@ -1342,13 +1339,7 @@ it:
products_in: "in %{oc}"
products_at: "presso %{distributor}"
products_elsewhere: "Prodotti trovati altrove"
email_welcome: "Benvenuto"
email_confirmed: "Grazie per aver confermato il tuo indirizzo email"
email_registered: "è ora parte di"
email_userguide_html: "La Guida Utente con supporto dettagliato per l'impostazione del tuo Produttore o Hub è qui: %{link}"
email_admin_html: "Puoi gestire il tuo profilo facendo il log in al link %{link} o cliccando sull'ingranaggio in alto a destra della homepage, e selezionando Amministrazione"
email_community_html: "Abbiamo anche un forum on-line per le discussioni della comunità sul software OFN e le sfide uniche legate all'avere un'impresa del cibo. Sei invitato ad unirti. Ci evolviamo in continuo e il tuo contributo in questo forum plasmerà ciò che sarà. %{link}"
join_community: "Unisciti alla community"
email_confirmation_activate_account: "Prima di attivare il tuo nuovo account, dobbiamo verificare il tuo indirizzo email"
email_confirmation_greeting: "Ciao, %{contact}!"
email_confirmation_profile_created: "Un profilo per %{name} è stato creato con successo! Per attivare il tuo Profilo abbiamo bisogno di confermare questo indirizzo email."
@@ -2746,7 +2737,6 @@ it:
products: "Prodotti"
option_types: "Tipi di opzioni"
properties: "Proprietà"
prototypes: "prototipi"
variant_overrides: "Inventario"
reports: "Resoconti"
configuration: "Configurazione"

View File

@@ -111,6 +111,14 @@ nb:
subject: "Vennligst bekreft epostadressen til %{enterprise}"
welcome:
subject: "%{enterprise} er nå på %{sitename}"
email_welcome: "Velkommen"
email_registered: "er nå en del av"
email_userguide_html: "Brukerhåndboken med detaljert støtte om hvordan man kommer i gang som Produsent eller Hub finnes her: %{link}"
userguide: "Brukermanual for Open Food Network"
email_admin_html: "Du kan administrere din konto ved å logge inn på %{link} eller ved klikke på tannhjulet øverst til høyre på hjemmesiden og velge Administrasjon."
admin_panel: "Administrasjonspanel"
email_community_html: "Vi har også et online forum for diskusjon relatert til OFN programvaren og de forskjellige utfordringene med å drive et matfirma. Vi oppfordrer deg til å bli med. Vi utvikler oss hele tiden og dine innspill til dette forumet vil forme det som skjer videre. %{link}"
join_community: "Bli med"
invite_manager:
subject: "%{enterprise} har invitert deg til å være en administrator"
producer_mailer:
@@ -320,15 +328,6 @@ nb:
number_localization:
number_localization_settings: "Innstillinger for nummerlokalisering"
enable_localized_number: "Bruk internasjonale tusen- og desimalskilletegn"
cache_settings:
edit:
title: "Mellomlagring"
distributor: "Distributør"
order_cycle: "Bestillingsrunde"
status: "Status"
diff: "Forskjell"
error: "Feil"
enable_products_cache: "Aktiver Mellomlagring for Produkter?"
invoice_settings:
edit:
title: "Fakturainnstillinger"
@@ -536,6 +535,7 @@ nb:
title: Varelager
description: Bruk denne siden til å administrere varelager for dine bedrifter. Eventuelle produktdetaljer satt her vil overstyre de som er satt på 'Produkter'-siden
enable_reset?: Aktiver Nullstilling av Varebeholdning
default_stock: "Standard lagerbeholdning"
inherit?: Arve?
add: Legg til
hide: Skjul
@@ -1377,13 +1377,7 @@ nb:
products_in: "i %{oc}"
products_at: "hos %{distributor}"
products_elsewhere: "Produkter funnet andre steder"
email_welcome: "Velkommen"
email_confirmed: "Takk for at du bekrefter din epostadresse"
email_registered: "er nå en del av"
email_userguide_html: "Brukerhåndboken med detaljert støtte om hvordan man kommer i gang som Produsent eller Hub finnes her: %{link}"
email_admin_html: "Du kan administrere din konto ved å logge inn på %{link} eller ved klikke på tannhjulet øverst til høyre på hjemmesiden og velge Administrasjon."
email_community_html: "Vi har også et online forum for diskusjon relatert til OFN programvaren og de forskjellige utfordringene med å drive et matfirma. Vi oppfordrer deg til å bli med. Vi utvikler oss hele tiden og dine innspill til dette forumet vil forme det som skjer videre. %{link}"
join_community: "Bli med"
email_confirmation_activate_account: "Før vi kan aktivere den nye kontoen din, må vi bekrefte epostadressen din."
email_confirmation_greeting: "Hei, %{contact}!"
email_confirmation_profile_created: "En profil for %{name} har blitt opprettet! For å aktivere din profil må du bekrefte denne epostadressen."
@@ -2808,7 +2802,6 @@ nb:
products: "Produkter"
option_types: "Valgtyper"
properties: "Egenskaper"
prototypes: "Prototyper"
variant_overrides: "Varelager"
reports: "Rapporter"
configuration: "Konfigurasjon"

View File

@@ -110,6 +110,12 @@ nl_BE:
subject: "Bevestig a.u.b. het e-mailadres voor %{enterprise}"
welcome:
subject: "%{enterprise} is nu aan %{sitename}"
email_welcome: "Welkom"
email_registered: "maakt nu deel uit van"
email_userguide_html: "De gebruikershandleiding met gedetailleerde ondersteuning om de Producenten of z'n groep klaar te zetten is hier: %{link}"
email_admin_html: "Je kan je account beheren door in te logen in de %{link} of door het tabblad te klikken in de rechter bovenhoek van de startpagina, en Administratie te selecteren."
email_community_html: "We hebben ook een online forum voor discussies betreffende het OFN software en de unieke uitdagingen om een etenswaaronderneming te leiden. We moedigen je aan om er deel van uit te maken. We evolueren constant en je opmerkingen in dit forum zullen bepalen wat er straks gebeurt. %{link}"
join_community: "Maak deel uit van de community"
invite_manager:
subject: "%{enterprise} heeft u uitgenodigd om manager te worden"
producer_mailer:
@@ -162,7 +168,7 @@ nl_BE:
home: "OFN"
title: Open Food Network
welcome_to: 'Welkom op '
site_meta_description: "We beginnen vanaf de grond af aan. Met boeren en telers klaar om hun verhaal trots en waarachtig te vertellen. Met distributeurs die klaar staan om mensen op een eerlijke en eerlijke manier in contact te brengen met producten. Met kopers die geloven dat betere wekelijkse boodschappenbeslissingen....."
site_meta_description: "Dit is wat we doen door een platform te creëren dat verbinding wil maken:\n● gepassioneerde boeren, die zich inzetten voor duurzame en regeneratieve landbouw,\n● handelaren van lokale producten, aanhangers van kortsluitingen, die in volledige transparantie handelen en een eerlijke vergoeding van de producenten garanderen,\n● kopers die de wereld willen veranderen door beter te eten,"
search_by_name: Zoeken op naam of voorstad....
producers_join: Belgische producenten zijn nu welkom om zich aan te sluiten bij het Open Food Network.
charges_sales_tax: Kosten GST?
@@ -317,15 +323,6 @@ nl_BE:
number_localization:
number_localization_settings: "Aantal Lokalisatie-instellingen"
enable_localized_number: "Gebruik de internationale duizend/decimale scheidingslogica"
cache_settings:
edit:
title: "Caching"
distributor: "Distributeur"
order_cycle: "Bestelcyclus"
status: "Status"
diff: "Diffuus"
error: "Fout"
enable_products_cache: "Produkten in voorraad toelaten? "
invoice_settings:
edit:
title: "Factuur instellingen"
@@ -1259,7 +1256,7 @@ nl_BE:
cookies_policy:
header: "Hoe We Cookies Gebruiken"
desc_part_1: "Cookies zijn héél kleine tekstbestandjes die opgeslagen worden op je computer wanneer je bepaalde websites bezoekt."
desc_part_2: "In het OFN respecteren we je privacy volledig. We gebruiken ook enkel de cookies die noodzakelijk zijn om je de diensten te leveren om het voedsel online te verkopen/ kopen. We verkopen geen enkele data van je. Het is mogelijk dat we in de toekomst zullen voorstellen om bepaalde gegevens van je te delen om nieuwe commons diensten te bouwen die zouden kunnen worden gebruikt voor het ecosysteem (zoals logistiek diensten voor korte keten voedselsystemen) maar op dat punt zijn we nog niet beland, en we doen het niet zonder jouw toestemming :-)"
desc_part_2: "Het wordt in verschillende landen ingezet. In België is het ontwikkeld door Oxfam-World Stores om mensen die voedsel verbouwen, verkopen en kopen in staat te stellen om hun eigen kracht te ontwikkelen."
desc_part_3: "We gebruiken cookies hoofdzakelijk om te onthouden wie je bent wanneer op het portaal inlogt, of om in staat te zijn de artikels te onthouden die je aan je winkelwagentje hebt toegevoegd zelfs wanneer je niet ingelogd bent. Als je op de website blijft navigeren zonder geklikt te hebben op 'Accepteer cookies', dan veronderstellen we dat je ons de toestemming geeft om cookies te bewaren die essentieel zijn voor het functioneren van de website. Hier is een lijst van cookies die we gebruiken!"
essential_cookies: "Essentiële Cookies"
essential_cookies_desc: "De volgende cookies zijn absoluut nodig voor de werking van onze website"
@@ -1301,11 +1298,11 @@ nl_BE:
brandstory_headline: "Zinvol voedsel"
brandstory_intro: "De beste manier om een systeem te herstellen is om een nieuwe te starten..."
brandstory_part1: "We beginnen vanuit de aarde. Met landbouwers en produkteurs, bereid om hun verhaal, werkelijk en met trots, te doen. Met verdelers, bereid om de mensen naar eerlijke en rechtvaardige produkten te richten. Met kopers die geloven dat betere wekelijks aankoopbeslissingen, de wereld echt kunnen veranderen. "
brandstory_part2: "Dan moeten we een manier vinden om de daad bij het woord voegen. Een manier te vinden om iedereen die voedsel groeit, verkoopt of koopt terug controle te geven . Een manier om een verhaal te vertellen, om de logistieke kant te regelen. Een manier om een kleine koop om te zetten in een transitie."
brandstory_part3: "Dus bouwen we een online markt die de regels voor iedereen gelijk stelt. Het is transparant, dus het creëert echte banden. Het is opensource, dus het is van iedereen. Het is opschaalbaar op het niveau van regio's en naties, dus over de hele wereld passen mensen en gemeenschappen het toe."
brandstory_part4: "Het werkt overal, het verandert alles."
brandstory_part2: "Dit platform wordt het Open Food Network genoemd."
brandstory_part3: "Het is transparant en open source en bevordert eerlijke relaties tussen boeren en consumenten. Het doel is om een netwerk van kwaliteitsvoedingsmiddelen te creëren dankzij een efficiënte en voortdurend evoluerende IT-tool."
brandstory_part4: "U bent\n● Een producent: registreer en presenteer uw producten om ze in uw regio te promoten. U geeft het platform energie en maakt contact met nieuwe klanten.\n● Een distributeur: registreer en presenteer uw project om het bekend te maken en nieuwe klanten te overtuigen.\n● Een consument: vind producten bij u in de buurt en ontdek hun verhalen."
brandstory_part5_strong: "Wij noemen het Open Food Network."
brandstory_part6: "Wij houden allen van eten, nu kunnen we ook van ons eetsysteem houden. "
brandstory_part6: "We kunnen allemaal meewerken aan de opbouw van een eerlijker voedselsysteem dat de mensheid respecteert en de planeet in stand houdt."
learn_body: "Verken rolmodellen, verhalen en bronnen om je te ondersteunen in de ontwikkeling van een eerlijke voedselzaak of organisatie. Vind opleidingen, evenementen, en andere mogelijkheden om te leren van mensen zoals jij."
learn_cta: "Vind Inspiratie"
connect_body: "Zoek in onze volledige lijst van producenten, hubs en groepen om een eerlijke voedselhandelaar te vinden bij jou in de buurt. Maak je zaak or organisatie deel van het OFN zodat klanten je kunnen vinden. Maak deel van de gemeenschap om advies te krijgen en samen moeilijkheden te overkomen."
@@ -1373,13 +1370,7 @@ nl_BE:
products_in: "in %{oc}"
products_at: "bij %{distributor}"
products_elsewhere: "Producten die ergens anders gevonden zijn"
email_welcome: "Welkom"
email_confirmed: "Bedankt om je E-mailadres te bevestigen."
email_registered: "maakt nu deel uit van"
email_userguide_html: "De gebruikershandleiding met gedetailleerde ondersteuning om de Producenten of z'n groep klaar te zetten is hier: %{link}"
email_admin_html: "Je kan je account beheren door in te logen in de %{link} of door het tabblad te klikken in de rechter bovenhoek van de startpagina, en Administratie te selecteren."
email_community_html: "We hebben ook een online forum voor discussies betreffende het OFN software en de unieke uitdagingen om een etenswaaronderneming te leiden. We moedigen je aan om er deel van uit te maken. We evolueren constant en je opmerkingen in dit forum zullen bepalen wat er straks gebeurt. %{link}"
join_community: "Maak deel uit van de community"
email_confirmation_activate_account: "Voor we je nieuwe account kunnen activeren, moet je je E-mailadres bevestigen."
email_confirmation_greeting: "Hallo, %{contact}!"
email_confirmation_profile_created: "Het profiel aanmaken voor %{name} is goed gelukt! Om je Profiel te activeren moet je nu nog slechts je E-mailadres bevestigen."
@@ -2807,7 +2798,6 @@ nl_BE:
products: "Producten"
option_types: "Optietypen"
properties: "Eigenschappen"
prototypes: "Prototypes "
variant_overrides: "Inventarisatie"
reports: "Rapporten"
configuration: "Instelling"

View File

@@ -104,6 +104,12 @@ pt:
subject: "Por favor confirme o endereço de email de %{enterprise}"
welcome:
subject: "%{enterprise} está agora em %{sitename}"
email_welcome: "Bem-vindo"
email_registered: "é agora parte de"
email_userguide_html: "O Manual do Utilizador com suporte detalhado para gerir a sua loja está aqui: %{link}"
email_admin_html: "Pode gerir a sua conta entrando no %{link} ou clicando na roda dentada no canto superior direito da página, e selecionando Administração."
email_community_html: "Também temos um fórum online para discussão sobre a plataforma e os desafios de se manter uma iniciativa de produção e consumo local. Está convidado/a a participar! Estamos constantemente a evoluir e as suas ideias vão ajudar-nos a melhorar.\n%{link}"
join_community: "Junte-se à comunidade"
invite_manager:
subject: "%{enterprise} convidou-o/a para gestor/a"
producer_mailer:
@@ -311,15 +317,6 @@ pt:
number_localization:
number_localization_settings: "Definições de Localização de Números"
enable_localized_number: "Utilizar a lógica do separador de milhares/décimas internacional"
cache_settings:
edit:
title: "Cache"
distributor: "Distribuidor"
order_cycle: "Ciclo de Encomendas"
status: "Estado"
diff: "Diff"
error: "Erro"
enable_products_cache: "Activar Cache?"
invoice_settings:
edit:
title: "Configuração de Faturas"
@@ -1348,13 +1345,7 @@ pt:
products_in: "em %{oc}"
products_at: "em %{distributor}"
products_elsewhere: "Produtos encontrados em outros lugares"
email_welcome: "Bem-vindo"
email_confirmed: "Obrigado por confirmar o seu endereço de email."
email_registered: "é agora parte de"
email_userguide_html: "O Manual do Utilizador com suporte detalhado para gerir a sua loja está aqui: %{link}"
email_admin_html: "Pode gerir a sua conta entrando no %{link} ou clicando na roda dentada no canto superior direito da página, e selecionando Administração."
email_community_html: "Também temos um fórum online para discussão sobre a plataforma e os desafios de se manter uma iniciativa de produção e consumo local. Está convidado/a a participar! Estamos constantemente a evoluir e as suas ideias vão ajudar-nos a melhorar.\n%{link}"
join_community: "Junte-se à comunidade"
email_confirmation_activate_account: "Antes de podermos activar a sua conta, precisamos de confirmar o seu endereço de email."
email_confirmation_greeting: "Olá, %{contact}!"
email_confirmation_profile_created: "Um perfil para %{name} foi criado com sucesso!\nPara ativar o seu Perfil precisamos que confirme este endereço de email."
@@ -2754,7 +2745,6 @@ pt:
products: "Produtos"
option_types: "Tipos de Opções"
properties: "Propriedades"
prototypes: "Protótipos"
variant_overrides: "Inventário"
reports: "Relatórios"
configuration: "Configuração"

View File

@@ -111,6 +111,12 @@ pt_BR:
subject: "Por favor confirme o endereço de e-mail para %{enterprise}"
welcome:
subject: "%{enterprise} está agora em %{sitename}"
email_welcome: "Bem-vindo"
email_registered: "é agora parte de"
email_userguide_html: "O Guia do Usuário com suporte detalhado para gerenciar sua loja está aqui: %{link}"
email_admin_html: "Você pode gerenciar sua conta entrando no %{link} ou clicando na engrenagem no canto superior direito da página, e selecionando Administração."
email_community_html: "Nós também temos um fórum online para discussão da comunidade sobre a plataforma e os desafios únicos de gerir organizações de alimentos. Você está convidado a participar. Estamos evoluindo constantemente e suas contribuições irão moldar o que acontece a seguir. %{link}"
join_community: "Faça parte da comunidade"
invite_manager:
subject: "%{enterprise}convidou você para ser um gerente"
producer_mailer:
@@ -320,15 +326,6 @@ pt_BR:
number_localization:
number_localization_settings: "Configurações de localização de número"
enable_localized_number: "Usar a lógica internacional de separação de casas decimais e milhares"
cache_settings:
edit:
title: "Cache"
distributor: "Distribuidor"
order_cycle: "Ciclo de pedidos"
status: "Status"
diff: "Comparar"
error: "Erro"
enable_products_cache: "Ativar cache de produtos?"
invoice_settings:
edit:
title: "Configuração da fatura"
@@ -1377,13 +1374,7 @@ pt_BR:
products_in: "em %{oc}"
products_at: "em %{distributor}"
products_elsewhere: "Produtos encontrados em outros lugares"
email_welcome: "Bem-vindo"
email_confirmed: "Obrigado por confirmar seu e-mail"
email_registered: "é agora parte de"
email_userguide_html: "O Guia do Usuário com suporte detalhado para gerenciar sua loja está aqui: %{link}"
email_admin_html: "Você pode gerenciar sua conta entrando no %{link} ou clicando na engrenagem no canto superior direito da página, e selecionando Administração."
email_community_html: "Nós também temos um fórum online para discussão da comunidade sobre a plataforma e os desafios únicos de gerir organizações de alimentos. Você está convidado a participar. Estamos evoluindo constantemente e suas contribuições irão moldar o que acontece a seguir. %{link}"
join_community: "Faça parte da comunidade"
email_confirmation_activate_account: "Antes de podermos ativar sua nova conta, precisamos confirmar seu endereço de e-mail."
email_confirmation_greeting: "Olá, %{contact}!"
email_confirmation_profile_created: "Um perfil para %{name} foi criado com sucesso!\nPara ativar seu Perfil precisamos que você confirme seu endereço de e-mail."
@@ -2784,6 +2775,7 @@ pt_BR:
discount_amount: "Valor do desconto"
email: E-mail
account_updated: "Conta atualizada!"
email_updated: "A conta vai ser atualizada assim que o email for confirmado."
my_account: "Minha conta"
date: "Data"
time: "Tempo"
@@ -2810,7 +2802,6 @@ pt_BR:
products: "Produtos"
option_types: "Tipos de opção"
properties: "Propriedades"
prototypes: "Protótipos"
variant_overrides: "Inventário"
reports: "Relatórios"
configuration: "Configuração"
@@ -2938,9 +2929,11 @@ pt_BR:
product_name: "Nome do Produto"
units: "Tamanho da Unidade"
value: "Valor"
unit_name: "Nome da Unidade"
price: "Preço"
on_hand: "Disponível"
on_demand: "Sob Encomenda"
product_description: "Descrição do Produto"
image: "Imagem"
or: "ou"
unit_name_placeholder: 'por exemplo. cachos'

View File

@@ -33,6 +33,12 @@ sv:
subject: "Vänligen bekräfta e-postadressen för %{enterprise}"
welcome:
subject: "%{enterprise} är nu på %{sitename}"
email_welcome: "Välkommen"
email_registered: "är nu del av"
email_userguide_html: "Användarhandboken med detaljerade uppgifter hur du skall skapa din Producer eller Hub finns här: %{link}"
email_admin_html: "Du kan sköta ditt konto genom att logga in %{link} eller att klicka på kuggen i det övre högra hörnet på hemsidan och välja Administration."
email_community_html: "Vi har också ett internetforum för gemensamma diskussioner som är relaterade till OFN programvara och den unika utmaningen att använda ett matföretag. Vi utvecklas ständigt och dina inlägg till detta forum påverkar vad som händer i fortsättningen. %{link}"
join_community: "Gå med i gemenskapen"
producer_mailer:
order_cycle:
subject: "Sammanställning över beställningsperiod för %{producer}"
@@ -150,14 +156,6 @@ sv:
embedded_shopfront_settings: "Inställningar för inbäddning av nätbutik"
enable_embedded_shopfronts: "Aktivera inbäddning av butiker"
embedded_shopfronts_whitelist: "Lista av tillåtna externa domäner"
cache_settings:
edit:
title: "Inkomst"
distributor: "Distributör"
order_cycle: "Beställningsomgång"
status: "Status"
diff: "Differens"
error: "Fel"
invoice_settings:
edit:
title: "Fakturainställningar"
@@ -827,13 +825,7 @@ sv:
products_in: "i %{oc}"
products_at: "hos %{distributor}"
products_elsewhere: "Produkter funna annorstädes"
email_welcome: "Välkommen"
email_confirmed: "Tack för att du bekräftat din e-postadress."
email_registered: "är nu del av"
email_userguide_html: "Användarhandboken med detaljerade uppgifter hur du skall skapa din Producer eller Hub finns här: %{link}"
email_admin_html: "Du kan sköta ditt konto genom att logga in %{link} eller att klicka på kuggen i det övre högra hörnet på hemsidan och välja Administration."
email_community_html: "Vi har också ett internetforum för gemensamma diskussioner som är relaterade till OFN programvara och den unika utmaningen att använda ett matföretag. Vi utvecklas ständigt och dina inlägg till detta forum påverkar vad som händer i fortsättningen. %{link}"
join_community: "Gå med i gemenskapen"
email_confirmation_greeting: "Hej, %{contact}!"
email_confirmation_profile_created: "En profil för %{name} har skapats! För att aktivera din profil behöver vi få en bekräftelse på din e-postadress."
email_confirmation_click_link: "Var vänlig att klicka på länken nedan för att bekräfta din e-postadress och fortsätt att skapa din profil."

View File

@@ -33,7 +33,6 @@ Openfoodnetwork::Application.routes.draw do
end
resource :shop, controller: "shop" do
get :products
post :order_cycle
get :order_cycle
get :changeable_orders_alert

View File

@@ -75,8 +75,6 @@ Openfoodnetwork::Application.routes.draw do
resource :contents
resource :cache_settings
resources :column_preferences, only: [], format: :json do
put :bulk_update, on: :collection
end

View File

@@ -44,6 +44,10 @@ Openfoodnetwork::Application.routes.draw do
resources :order_cycles do
get :managed, on: :collection
get :accessible, on: :collection
get :products, on: :member
get :taxons, on: :member
get :properties, on: :member
end
resource :status do

View File

@@ -12,10 +12,6 @@ job_type :run_file, "cd :path; :environment_variable=:environment bundle exec sc
job_type :enqueue_job, "cd :path; :environment_variable=:environment bundle exec script/enqueue :task :priority :output"
every 1.day, at: '01:00am' do
rake 'ofn:cache:check_products_integrity'
end
every 1.day, at: '2:45am' do
rake 'db2fog:clean' if ENV['S3_BACKUPS_BUCKET']
end

Some files were not shown because too many files have changed in this diff Show More