mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-20 19:56:48 +00:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61c581ae52 | ||
|
|
db8e2891d4 | ||
|
|
a947d8df6c | ||
|
|
818d41ffac | ||
|
|
14f67053c8 | ||
|
|
bef745378e | ||
|
|
a6cb5903d6 | ||
|
|
d1b36aded0 | ||
|
|
9c3c74aa93 | ||
|
|
67a5a1cdc2 | ||
|
|
9723e2cd49 | ||
|
|
4af014df6b | ||
|
|
be6c64db75 | ||
|
|
1aebc30128 | ||
|
|
f8209ac7d5 | ||
|
|
6d50176e6b | ||
|
|
d6d2c19dc7 | ||
|
|
f897478736 | ||
|
|
064b86da5d | ||
|
|
f7b58300f9 | ||
|
|
1a0e99dce2 | ||
|
|
d7caf91de1 | ||
|
|
1e2ab27cda | ||
|
|
3e7bd7dc19 | ||
|
|
688dad2334 | ||
|
|
6d419d60ae | ||
|
|
0dc8ae1561 | ||
|
|
f396f6bebd | ||
|
|
07fcc8f361 | ||
|
|
237cd5438b | ||
|
|
4e366d0f2e | ||
|
|
fb3af77d0b | ||
|
|
1fa6e4bea8 | ||
|
|
498a2b7462 | ||
|
|
80edfe469c | ||
|
|
b2616d317f | ||
|
|
0ac0bdc381 | ||
|
|
1a756cbc6b | ||
|
|
34466c8218 | ||
|
|
00e869f40c | ||
|
|
42cd9a5152 | ||
|
|
cc342387cc | ||
|
|
6715f872e3 | ||
|
|
e849c4867b | ||
|
|
ada34d27ca | ||
|
|
40c329ba68 | ||
|
|
3c7af90dfa | ||
|
|
241e581779 | ||
|
|
85dede84cc | ||
|
|
0288dfc992 | ||
|
|
3372339907 | ||
|
|
f7bb609546 | ||
|
|
02c0b89fa0 | ||
|
|
f57c9d4a25 | ||
|
|
783c3c9e90 | ||
|
|
44753d0320 | ||
|
|
dd7d5803ba | ||
|
|
c9e23154d8 | ||
|
|
279b633513 | ||
|
|
9d0ac79983 | ||
|
|
deb17f47a7 | ||
|
|
61ee0f04a6 | ||
|
|
353804a3fa | ||
|
|
598426a5e9 | ||
|
|
7b0c55e15a | ||
|
|
cbe2477d04 | ||
|
|
c730958fe4 | ||
|
|
37e5e1923c | ||
|
|
542c1bf684 | ||
|
|
06c896b93b | ||
|
|
6433d69d02 | ||
|
|
bf8c632fce | ||
|
|
b3c89a9d6c | ||
|
|
d45403f1d4 | ||
|
|
f2affe80cd | ||
|
|
573a69477f | ||
|
|
c6ce516129 | ||
|
|
2539b84b33 | ||
|
|
dd6d0d25da | ||
|
|
c54cff10d4 | ||
|
|
ab330e882e | ||
|
|
a50ae3f8ce | ||
|
|
9f3b4100c3 | ||
|
|
b625ea0c61 | ||
|
|
8857404ddf | ||
|
|
49f98422fd | ||
|
|
4d49dc3689 | ||
|
|
8d30dc997f | ||
|
|
5a84a3688b | ||
|
|
614dc5d255 | ||
|
|
da7456e6e0 | ||
|
|
f134cd9473 | ||
|
|
e96252f2ed | ||
|
|
06e1f56ae9 | ||
|
|
fe0de98821 | ||
|
|
d997b8f5ee | ||
|
|
cf3f321632 | ||
|
|
797a3ad091 | ||
|
|
01d1e8243c | ||
|
|
a1a5c3b7fe | ||
|
|
bc826f73a1 | ||
|
|
7c264af0c2 | ||
|
|
4c4bdd78e7 | ||
|
|
bb56e9a5b9 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
4
Gemfile
4
Gemfile
@@ -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'
|
||||
|
||||
12
Gemfile.lock
12
Gemfile.lock
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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 = ->
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
})
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -255,6 +255,9 @@ text-angular {
|
||||
background-color: #4583bf;
|
||||
}
|
||||
}
|
||||
a {
|
||||
color: $spree-green
|
||||
}
|
||||
}
|
||||
|
||||
span.required {
|
||||
|
||||
@@ -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
|
||||
88
app/controllers/api/order_cycles_controller.rb
Normal file
88
app/controllers/api/order_cycles_controller.rb
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
7
app/services/exchange_variant_deleter.rb
Normal file
7
app/services/exchange_variant_deleter.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
class ExchangeVariantDeleter
|
||||
def delete(product)
|
||||
ExchangeVariant.
|
||||
where(variant_id: product.variants.select(:id)).
|
||||
delete_all
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
|
||||
111
app/services/product_tag_rules_filterer.rb
Normal file
111
app/services/product_tag_rules_filterer.rb
Normal 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
|
||||
98
app/services/products_renderer.rb
Normal file
98
app/services/products_renderer.rb
Normal 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
|
||||
@@ -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)
|
||||
@@ -1,4 +1,4 @@
|
||||
= content_for :page_title do
|
||||
- content_for :page_title do
|
||||
= t 'admin_enterprise_groups'
|
||||
|
||||
- if admin_user?
|
||||
|
||||
@@ -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()'
|
||||
|
||||
@@ -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')}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'}}
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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' } }
|
||||
|
||||
@@ -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' } }
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
\:
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
3144
config/locales/ar.yml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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 d’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"
|
||||
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ó"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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. It’s transparent, so it creates real relationships. It’s open source, so it’s 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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 d’accueil 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 l’interface d’administration, colonne “Type de profil”. L’interface d’administration est l’endroit 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 d’accueil 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 l’interface d’administration, colonne “Type de profil”. L’interface d’administration est l’endroit 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"
|
||||
|
||||
@@ -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: "C’est 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 d’accès. Elle est déployée dans plusieurs régions ou pays. "
|
||||
brandstory_part4: "Elle fonctionne partout. Elle change tout."
|
||||
brandstory_part2: "Cette plateforme s’appelle 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 d’un système alimentaire plus juste, respectueux de l’Homme 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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user