diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md
index 45b44be4b6..93cff8dad0 100644
--- a/GETTING_STARTED.md
+++ b/GETTING_STARTED.md
@@ -114,7 +114,7 @@ $ createdb open_food_network_test --owner=ofn
If these commands succeed, you should be able to [continue the setup process](#get-it-running).
[developer-wiki]: https://github.com/openfoodfoundation/openfoodnetwork/wiki
-[sierra]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-macOS-(Sierra)
+[sierra]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup%3A-macOS-%28Sierra%2C-HighSierra-and-Mojave%29
[el-capitan]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-OS-X-(El-Capitan)
[ubuntu]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-Ubuntu
[wiki]: https://github.com/openfoodfoundation/openfoodnetwork/wiki
diff --git a/Gemfile.lock b/Gemfile.lock
index c0914e10d1..8bc71e7279 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -497,7 +497,7 @@ GEM
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
kgio (2.11.2)
- knapsack (1.16.0)
+ knapsack (1.17.1)
rake
launchy (2.4.3)
addressable (~> 2.3)
diff --git a/app/assets/stylesheets/darkswarm/base/colors.css.scss b/app/assets/stylesheets/darkswarm/base/colors.css.scss
index 4b36b9cb9b..fddcbc9f6a 100644
--- a/app/assets/stylesheets/darkswarm/base/colors.css.scss
+++ b/app/assets/stylesheets/darkswarm/base/colors.css.scss
@@ -1,4 +1,13 @@
+@import 'darkswarm/branding';
+
$modal-background-color: #efefef;
$modal-content-background-color: #fff;
$modal-alert-link-color: #fff;
$modal-alert-link-hover-color: rgba(255, 255, 255, .7);
+
+$cookies-banner-background-color: $dark-grey;
+$cookies-banner-button-background-color: $clr-turquoise;
+$cookies-banner-text-color: $white;
+$cookies-policy-modal-background-color: $disabled-light;
+$cookies-policy-modal-border-bottom-color: $disabled-light;
+$cookies-policy-modal-table-tr-even-background-color: $disabled-very-light;
diff --git a/app/controllers/shops_controller.rb b/app/controllers/shops_controller.rb
index aa0d2f8f33..8a657990d8 100644
--- a/app/controllers/shops_controller.rb
+++ b/app/controllers/shops_controller.rb
@@ -4,5 +4,11 @@ class ShopsController < BaseController
before_filter :enable_embedded_shopfront
def index
+ @enterprises = Enterprise
+ .activated
+ .includes(address: :state)
+ .includes(:properties)
+ .includes(supplied_products: :properties)
+ .all
end
end
diff --git a/app/helpers/injection_helper.rb b/app/helpers/injection_helper.rb
index f4e857607e..dfcf2bb6ff 100644
--- a/app/helpers/injection_helper.rb
+++ b/app/helpers/injection_helper.rb
@@ -1,8 +1,13 @@
require 'open_food_network/enterprise_injection_data'
module InjectionHelper
- def inject_enterprises
- inject_json_ams "enterprises", Enterprise.activated.includes(address: :state).all, Api::EnterpriseSerializer, enterprise_injection_data
+ def inject_enterprises(enterprises = Enterprise.activated.includes(address: :state).all)
+ inject_json_ams(
+ 'enterprises',
+ enterprises,
+ Api::EnterpriseSerializer,
+ enterprise_injection_data
+ )
end
def inject_enterprise_and_relatives
diff --git a/app/models/spree/property_decorator.rb b/app/models/spree/property_decorator.rb
index 7349436a2b..5950212149 100644
--- a/app/models/spree/property_decorator.rb
+++ b/app/models/spree/property_decorator.rb
@@ -26,6 +26,9 @@ module Spree
# 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
diff --git a/app/serializers/api/cached_enterprise_serializer.rb b/app/serializers/api/cached_enterprise_serializer.rb
new file mode 100644
index 0000000000..4070cfa7d5
--- /dev/null
+++ b/app/serializers/api/cached_enterprise_serializer.rb
@@ -0,0 +1,161 @@
+require 'open_food_network/property_merge'
+
+module Api
+ class CachedEnterpriseSerializer < ActiveModel::Serializer
+ include SerializerHelper
+
+ cached
+
+ def cache_key
+ object.andand.cache_key
+ end
+
+ attributes :name, :id, :description, :latitude, :longitude,
+ :long_description, :website, :instagram, :linkedin, :twitter,
+ :facebook, :is_primary_producer, :is_distributor, :phone, :visible,
+ :email_address, :hash, :logo, :promo_image, :path, :pickup, :delivery,
+ :icon, :icon_font, :producer_icon_font, :category, :producers, :hubs
+
+ attributes :taxons, :supplied_taxons
+
+ has_one :address, serializer: AddressSerializer
+
+ has_many :supplied_properties, serializer: PropertySerializer
+ has_many :distributed_properties, serializer: PropertySerializer
+
+ def pickup
+ services = data.shipping_method_services[object.id]
+ services ? services[:pickup] : false
+ end
+
+ def delivery
+ services = data.shipping_method_services[object.id]
+ services ? services[:delivery] : false
+ end
+
+ def email_address
+ object.email_address.to_s.reverse
+ end
+
+ def hash
+ object.to_param
+ end
+
+ def logo
+ object.logo(:medium) if object.logo?
+ end
+
+ def promo_image
+ object.promo_image(:large) if object.promo_image?
+ end
+
+ def path
+ enterprise_shop_path(object)
+ end
+
+ def producers
+ relatives = data.relatives[object.id]
+ ids_to_objs(relatives.andand[:producers])
+ end
+
+ def hubs
+ relatives = data.relatives[object.id]
+ ids_to_objs(relatives.andand[:distributors])
+ end
+
+ def taxons
+ if active
+ ids_to_objs data.current_distributed_taxons[object.id]
+ else
+ ids_to_objs data.all_distributed_taxons[object.id]
+ end
+ end
+
+ def supplied_taxons
+ ids_to_objs data.supplied_taxons[object.id]
+ end
+
+ def supplied_properties
+ (product_properties + producer_properties).uniq do |property_object|
+ property_object.property.presentation
+ end
+ end
+
+ def distributed_properties
+ # This results in 3 queries per enterprise
+
+ if active
+ product_properties = Spree::Property.currently_sold_by(object)
+ producer_property_ids = ProducerProperty.currently_sold_by(object).pluck(:property_id)
+
+ else
+ product_properties = Spree::Property.ever_sold_by(object)
+ producer_property_ids = ProducerProperty.ever_sold_by(object).pluck(:property_id)
+ end
+
+ producer_properties = Spree::Property.where(id: producer_property_ids)
+
+ OpenFoodNetwork::PropertyMerge.merge product_properties, producer_properties
+ end
+
+ def active
+ data.active_distributors.andand.include? object
+ end
+
+ # Map svg icons.
+ def icon
+ icons = {
+ hub: "/assets/map_005-hub.svg",
+ hub_profile: "/assets/map_006-hub-profile.svg",
+ producer_hub: "/assets/map_005-hub.svg",
+ producer_shop: "/assets/map_003-producer-shop.svg",
+ producer: "/assets/map_001-producer-only.svg",
+ }
+ icons[object.category]
+ end
+
+ # Choose regular icon font for enterprises.
+ def icon_font
+ icon_fonts = {
+ hub: "ofn-i_063-hub",
+ hub_profile: "ofn-i_064-hub-reversed",
+ producer_hub: "ofn-i_063-hub",
+ producer_shop: "ofn-i_059-producer",
+ producer: "ofn-i_059-producer",
+ }
+ icon_fonts[object.category]
+ end
+
+ # Choose producer page icon font - yes, sadly its got to be different.
+ # This duplicates some code but covers the producer page edge case where
+ # producer-hub has a producer icon without needing to duplicate the category logic in angular.
+ def producer_icon_font
+ icon_fonts = {
+ hub: "",
+ hub_profile: "",
+ producer_hub: "ofn-i_059-producer",
+ producer_shop: "ofn-i_059-producer",
+ producer: "ofn-i_059-producer",
+ }
+ icon_fonts[object.category]
+ end
+
+ private
+
+ def product_properties
+ enterprise.supplied_products.flat_map(&:properties)
+ end
+
+ def producer_properties
+ enterprise.properties
+ end
+
+ def enterprise
+ object
+ end
+
+ def data
+ options[:data]
+ end
+ end
+end
diff --git a/app/serializers/api/enterprise_serializer.rb b/app/serializers/api/enterprise_serializer.rb
index e3829174a2..fa0b09762a 100644
--- a/app/serializers/api/enterprise_serializer.rb
+++ b/app/serializers/api/enterprise_serializer.rb
@@ -18,161 +18,3 @@ class Api::EnterpriseSerializer < ActiveModel::Serializer
Api::UncachedEnterpriseSerializer.new(object, @options).serializable_hash || {}
end
end
-
-class Api::UncachedEnterpriseSerializer < ActiveModel::Serializer
- include SerializerHelper
-
- attributes :orders_close_at, :active
-
- def orders_close_at
- options[:data].earliest_closing_times[object.id]
- end
-
- def active
- options[:data].active_distributors.andand.include? object
- end
-end
-
-class Api::CachedEnterpriseSerializer < ActiveModel::Serializer
- include SerializerHelper
-
- cached
- #delegate :cache_key, to: :object
-
- def cache_key
- object.andand.cache_key
- end
-
-
- attributes :name, :id, :description, :latitude, :longitude,
- :long_description, :website, :instagram, :linkedin, :twitter,
- :facebook, :is_primary_producer, :is_distributor, :phone, :visible,
- :email_address, :hash, :logo, :promo_image, :path, :pickup, :delivery,
- :icon, :icon_font, :producer_icon_font, :category, :producers, :hubs
-
- attributes :taxons, :supplied_taxons
-
- has_one :address, serializer: Api::AddressSerializer
-
- has_many :supplied_properties, serializer: Api::PropertySerializer
- has_many :distributed_properties, serializer: Api::PropertySerializer
-
- def pickup
- services = options[:data].shipping_method_services[object.id]
- services ? services[:pickup] : false
- end
-
- def delivery
- services = options[:data].shipping_method_services[object.id]
- services ? services[:delivery] : false
- end
-
- def email_address
- object.email_address.to_s.reverse
- end
-
- def hash
- object.to_param
- end
-
- def logo
- object.logo(:medium) if object.logo?
- end
-
- def promo_image
- object.promo_image(:large) if object.promo_image?
- end
-
- def path
- enterprise_shop_path(object)
- end
-
- def producers
- relatives = options[:data].relatives[object.id]
- ids_to_objs(relatives.andand[:producers])
- end
-
- def hubs
- relatives = options[:data].relatives[object.id]
- ids_to_objs(relatives.andand[:distributors])
- end
-
- def taxons
- if active
- ids_to_objs options[:data].current_distributed_taxons[object.id]
- else
- ids_to_objs options[:data].all_distributed_taxons[object.id]
- end
- end
-
- def supplied_taxons
- ids_to_objs options[:data].supplied_taxons[object.id]
- end
-
- def supplied_properties
- # This results in 3 queries per enterprise
- product_properties = Spree::Property.applied_by(object)
- producer_properties = object.properties
-
- OpenFoodNetwork::PropertyMerge.merge product_properties, producer_properties
- end
-
- def distributed_properties
- # This results in 3 queries per enterprise
-
- if active
- product_properties = Spree::Property.currently_sold_by(object)
- producer_property_ids = ProducerProperty.currently_sold_by(object).pluck(:property_id)
-
- else
- product_properties = Spree::Property.ever_sold_by(object)
- producer_property_ids = ProducerProperty.ever_sold_by(object).pluck(:property_id)
- end
-
- producer_properties = Spree::Property.where(id: producer_property_ids)
-
- OpenFoodNetwork::PropertyMerge.merge product_properties, producer_properties
- end
-
- def active
- options[:data].active_distributors.andand.include? object
- end
-
- # Map svg icons.
- def icon
- icons = {
- :hub => "/assets/map_005-hub.svg",
- :hub_profile => "/assets/map_006-hub-profile.svg",
- :producer_hub => "/assets/map_005-hub.svg",
- :producer_shop => "/assets/map_003-producer-shop.svg",
- :producer => "/assets/map_001-producer-only.svg",
- }
- icons[object.category]
- end
-
- # Choose regular icon font for enterprises.
- def icon_font
- icon_fonts = {
- :hub => "ofn-i_063-hub",
- :hub_profile => "ofn-i_064-hub-reversed",
- :producer_hub => "ofn-i_063-hub",
- :producer_shop => "ofn-i_059-producer",
- :producer => "ofn-i_059-producer",
- }
- icon_fonts[object.category]
- end
-
- # Choose producer page icon font - yes, sadly its got to be different.
- # This duplicates some code but covers the producer page edge case where
- # producer-hub has a producer icon without needing to duplicate the category logic in angular.
- def producer_icon_font
- icon_fonts = {
- :hub => "",
- :hub_profile => "",
- :producer_hub => "ofn-i_059-producer",
- :producer_shop => "ofn-i_059-producer",
- :producer => "ofn-i_059-producer",
- }
- icon_fonts[object.category]
- end
-end
diff --git a/app/serializers/api/uncached_enterprise_serializer.rb b/app/serializers/api/uncached_enterprise_serializer.rb
new file mode 100644
index 0000000000..bad8808533
--- /dev/null
+++ b/app/serializers/api/uncached_enterprise_serializer.rb
@@ -0,0 +1,15 @@
+module Api
+ class UncachedEnterpriseSerializer < ActiveModel::Serializer
+ include SerializerHelper
+
+ attributes :orders_close_at, :active
+
+ def orders_close_at
+ options[:data].earliest_closing_times[object.id]
+ end
+
+ def active
+ options[:data].active_distributors.andand.include? object
+ end
+ end
+end
diff --git a/app/views/shops/_hubs.html.haml b/app/views/shops/_hubs.html.haml
index 3e477b9551..aa41f3f229 100644
--- a/app/views/shops/_hubs.html.haml
+++ b/app/views/shops/_hubs.html.haml
@@ -1,4 +1,4 @@
-= inject_enterprises
+= inject_enterprises(@enterprises)
#hubs.hubs{"ng-controller" => "EnterprisesCtrl", "ng-cloak" => true}
.row
diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml
index 0dc6c94f35..9ee5b8e1f2 100644
--- a/config/locales/de_DE.yml
+++ b/config/locales/de_DE.yml
@@ -1145,7 +1145,7 @@ de_DE:
menu_3_title: "Erzeuger"
menu_3_url: "/ producers"
menu_4_title: "Gruppen"
- menu_4_url: "/ groups"
+ menu_4_url: "/groups"
menu_5_title: "Über Uns"
menu_5_url: "http://www.openfoodnetwork.org/"
menu_6_title: "Verbinden"
@@ -1790,7 +1790,6 @@ de_DE:
enterprise_long_desc: "Ausführliche Beschreibung"
enterprise_long_desc_placeholder: "Dies ist Ihre Chance, die Geschichte Ihres Unternehmens zu erzählen - was macht Sie anders und wundervoll? Wir empfehlen, Ihre Beschreibung auf unter 600 Zeichen oder 150 Wörter zu beschränken."
enterprise_long_desc_length: "%{num} Zeichen / bis zu 600 empfohlen"
- enterprise_limit: Unternehmensgrenze
enterprise_abn: "USt-IdNr."
enterprise_abn_placeholder: "z.B. 99 123 456 789"
enterprise_acn: "St.-Nr."
@@ -2593,6 +2592,14 @@ de_DE:
bulk_coop_packing_sheets: 'Massenkoop - Verpackungsblätter'
bulk_coop_customer_payments: 'Massenkoop - Kundenzahlungen'
users:
+ index:
+ user: "Benutzer"
+ search: "Suche"
+ email: "E-Mail"
+ form:
+ email: "E-Mail"
+ roles: "Rollen"
+ password: "Passwort"
email_confirmation:
confirmation_pending: "E-Mail-Bestätigung steht aus. Wir haben eine Bestätigungs-E-Mail an %{address} gesendet."
variants:
diff --git a/config/locales/en_BE.yml b/config/locales/en_BE.yml
index 07e3544e9a..02ef98adab 100644
--- a/config/locales/en_BE.yml
+++ b/config/locales/en_BE.yml
@@ -1793,7 +1793,6 @@ en_BE:
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_limit: Enterprise Limit
enterprise_abn: "ABN"
enterprise_abn_placeholder: "eg. 99 123 456 789"
enterprise_acn: "ACN"
@@ -2598,6 +2597,16 @@ en_BE:
bulk_coop_packing_sheets: 'Bulk Co-op - Packing Sheets'
bulk_coop_customer_payments: 'Bulk Co-op - Customer Payments'
users:
+ index:
+ user: "User"
+ enterprise_limit: "Enterprise Limit"
+ search: "Search"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Enterprise Limit"
+ password: "Password"
email_confirmation:
confirmation_pending: "Email confirmation is pending. We've sent a confirmation email to %{address}."
variants:
diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml
index 3389d97ac2..5ea952bea7 100644
--- a/config/locales/en_GB.yml
+++ b/config/locales/en_GB.yml
@@ -195,6 +195,7 @@ en_GB:
admin_and_handling: Admin & Handling
profile: Profile
supplier_only: Supplier Only
+ has_shopfront: Has Shopfront
weight: Weight
volume: Volume
items: Items
@@ -219,6 +220,7 @@ en_GB:
password_confirmation: Password Confirmation
reset_password_token: Reset password
expired: has expired, please request a new one
+ back_to_payments_list: "Back to Payments List"
actions:
create_and_add_another: "Create and Add Another"
admin:
@@ -572,6 +574,7 @@ en_GB:
tip: "Use this page to alter product quantities across multiple orders. Products may also be removed from orders entirely, if required."
shared: "Shared Resource?"
order_no: "Order No."
+ order_date: "Completed at"
max: "Max"
product_unit: "Product: Unit"
weight_volume: "Weight/Volume"
@@ -1793,7 +1796,6 @@ en_GB:
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_limit: Enterprise Limit
enterprise_abn: "Company Number"
enterprise_abn_placeholder: "eg. 99 123 456 789"
enterprise_acn: "Charity Number"
@@ -2235,6 +2237,7 @@ en_GB:
validation_msg_relationship_already_established: "^That relationship is already established."
validation_msg_at_least_one_hub: "^At least one hub must be selected"
validation_msg_product_category_cant_be_blank: "^Product Category cant be blank"
+ validation_msg_tax: "^Tax Category is required"
validation_msg_tax_category_cant_be_blank: "^Tax Category can't be blank"
validation_msg_is_associated_with_an_exising_customer: "is associated with an existing customer"
content_configuration_pricing_table: "(TODO: Pricing table)"
@@ -2604,6 +2607,23 @@ en_GB:
bulk_coop_packing_sheets: 'Bulk Co-op - Packing Sheets'
bulk_coop_customer_payments: 'Bulk Co-op - Customer Payments'
users:
+ index:
+ listing_users: "Listing Users"
+ new_user: "New User"
+ user: "User"
+ enterprise_limit: "Enterprise Limit"
+ search: "Search"
+ email: "Email"
+ edit:
+ editing_user: "Editing User"
+ back_to_users_list: "Back To Users List"
+ general_settings: "General Settings"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Enterprise Limit"
+ confirm_password: "Confirm Password"
+ password: "Password"
email_confirmation:
confirmation_pending: "Email confirmation is pending. We've sent a confirmation email to %{address}."
variants:
diff --git a/config/locales/en_US.yml b/config/locales/en_US.yml
index f15b111dd9..3ede2a5dc4 100644
--- a/config/locales/en_US.yml
+++ b/config/locales/en_US.yml
@@ -1793,7 +1793,6 @@ en_US:
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_limit: Enterprise Limit
enterprise_abn: "Tax ID Number or EIN (optional)"
enterprise_abn_placeholder: "eg. 123456789"
enterprise_acn: "Legal Business Name"
@@ -2598,6 +2597,16 @@ en_US:
bulk_coop_packing_sheets: 'Bulk Co-op - Packing Sheets'
bulk_coop_customer_payments: 'Bulk Co-op - Customer Payments'
users:
+ index:
+ user: "User"
+ enterprise_limit: "Enterprise Limit"
+ search: "Search"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Enterprise Limit"
+ password: "Password"
email_confirmation:
confirmation_pending: "Email confirmation is pending. We've sent a confirmation email to %{address}."
variants:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 7de3ec5c0b..773c965e41 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1788,7 +1788,6 @@ es:
enterprise_long_desc: "Descripción larga"
enterprise_long_desc_placeholder: "Esta es tu oportunidad de contar la historia de tu organización - ¿qué la hace diferente? Sugerimos mantener la descripción en menos de 600 caracteres o 150 palabras."
enterprise_long_desc_length: "%{num} caracteres / recomentdamos hasta 600"
- enterprise_limit: Límite de la Organización
enterprise_abn: "NIF"
enterprise_abn_placeholder: "eg. 99 123 456 789"
enterprise_acn: "ACN"
@@ -2592,6 +2591,16 @@ es:
bulk_coop_packing_sheets: 'Bulk Co-op - Hojas de Empaquetado'
bulk_coop_customer_payments: 'Bulk Co-op - Pagos de las Consumidoras'
users:
+ index:
+ user: "Usuaria"
+ enterprise_limit: "Límite de la Organización"
+ search: "Buscar"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Límite de la Organización"
+ password: "Contraseña"
email_confirmation:
confirmation_pending: "La confirmación por correo electrónico está pendiente. Hemos enviado un correo electrónico de confirmación a %{address}."
variants:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index fd92012b19..1919989fe3 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -74,7 +74,7 @@ fr:
welcome:
subject: "%{enterprise} est maintenant sur %{sitename}"
invite_manager:
- subject: "%{enterprise} vous a invité comme manager"
+ subject: "%{enterprise} vous a invité comme gestionnaire"
order_mailer:
cancel_email:
dear_customer: "Cher Acheteur,"
@@ -195,6 +195,7 @@ fr:
admin_and_handling: Frais si par commande
profile: Profil
supplier_only: Uniquement Producteur
+ has_shopfront: (gère une boutique)
weight: Poids
volume: Volume
items: Pièces
@@ -217,6 +218,9 @@ fr:
pick_up: Retrait
copy: Copier
password_confirmation: Confirmation de mot de passe
+ reset_password_token: La demande de réinitialisation du mot de passe
+ expired: a expiré, veuillez faire une nouvelle demande.
+ back_to_payments_list: "Retour à la liste des paiements"
actions:
create_and_add_another: "Créer et ajouter nouveau"
admin:
@@ -499,6 +503,7 @@ fr:
no_permission: vous n'avez pas l'autorisation de gérer cette entreprise
not_found: l'entreprise n'a pas été trouvée dans la base de données
no_name: Pas de nom
+ blank_enterprise: certains produits n'ont pas d'entreprise associée
reset_absent?: Mettre à zéro le produits absents du fichier
reset_absent_tip: Remettre le sock à zero pour les produits non présents dans le fichier.
overwrite_all: Modifier pour tous
@@ -569,6 +574,7 @@ fr:
tip: "Utilisez cette page pour changer les quantités d'un produit sur plusieurs commandes. Les produits peuvent aussi être supprimés de toutes les commandes, si nécessaire."
shared: "Ressource partagée?"
order_no: "N° commande"
+ order_date: "Passée le"
max: "Max"
product_unit: "Produit: Unité"
weight_volume: "Poids/Volume"
@@ -735,18 +741,18 @@ fr:
users:
email_confirmation_notice_html: "L'email de confirmation n'a pas encore été validé. Il a été envoyé à %{email}."
resend: Renvoyer
- owner: 'Manager principal'
+ owner: 'Gestionnaire principal'
contact: "Contact"
- contact_tip: "Le manager qui recevra les emails de confirmation de commande et autres notifications de l'entreprise. Il doit avoir confirmé son adresse email pour pouvoir être sélectionné."
- owner_tip: Manager principal de cette entreprise.
+ contact_tip: "Le gestionnaire qui recevra les emails de confirmation de commande et autres notifications de l'entreprise. Il doit avoir confirmé son adresse email pour pouvoir être sélectionné."
+ owner_tip: Gestionnaire principal de cette entreprise.
notifications: Notifications
notifications_tip: Une notification de commande sera envoyée à cette adresse email pour chaque commande passée dans votre boutique.
notifications_placeholder: 'ex: bernard@maferme.fr'
notifications_note: 'A noter: si vous saisissez une nouvelle adresse, un email de confirmation sera envoyé à cette adresse avec un lien de validation à cliquer.'
- managers: Managers
+ managers: Gestionnaires
managers_tip: Sélectionner ici les utilisateurs ayant la permission de gérer cette entreprise. Ils doivent avoir un compte sur Open Food France pour être sélectionnés.
- invite_manager: "Inviter un manager"
- invite_manager_tip: "Inviter un nouvel utilisateur à créer son compte et le nommer comme manager de cette entreprise."
+ invite_manager: "Inviter un gestionnaire"
+ invite_manager_tip: "Inviter un nouvel utilisateur à créer son compte et le nommer comme gestionnaire de cette entreprise."
add_unregistered_user: "Ajouter un nouvel utilisateur"
email_confirmed: "Email confirmé"
email_not_confirmed: "Email non confirmé"
@@ -764,7 +770,7 @@ fr:
role: Role
sells: Produits vendus
visible: Visible?
- owner: Manager principal
+ owner: Gestionnaire principal
producer: Producteur
change_type_form:
producer_profile: Profil producteur
@@ -796,8 +802,8 @@ fr:
package: "Pack"
status: "Statut"
new_form:
- owner: Manager principal
- owner_tip: Le manager principal est l'individu qui porte la responsabilité principale de l'entreprise dans le contexte de l'utilisation d'Open Food France.
+ owner: Gestionnaire principal
+ owner_tip: Le gestionnaire principal est l'individu qui porte la responsabilité principale de l'entreprise dans le contexte de l'utilisation d'Open Food France.
i_am_producer: Je suis un producteur
contact_name: Nom du contact principal
edit:
@@ -967,8 +973,8 @@ fr:
name: Total des Ventes
description: Total des Ventes pour toutes les Commandes
users_and_enterprises:
- name: Managers & Entreprises
- description: Managers de l'Entreprise & Droits
+ name: Gestionnaires & Entreprises
+ description: Gestionnaires de l'Entreprise & Droits
order_cycle_management:
name: Gestion des Cycles de Vente
sales_tax:
@@ -1452,8 +1458,8 @@ fr:
enterprises_next_closing: "Clôture des commandes pour ce cycle"
enterprises_ready_for: "Prêt pour"
enterprises_choose: "Choisissez votre option:"
- maps_open: "Ouvre"
- maps_closed: "Fermée"
+ maps_open: "Ouvert"
+ maps_closed: "Fermé"
hubs_buy: "Acheter:"
hubs_shopping_here: "Achats en cours"
hubs_orders_closed: "Boutique fermée"
@@ -1791,7 +1797,6 @@ fr:
enterprise_long_desc: "Description longue"
enterprise_long_desc_placeholder: "Vous pouvez ici raconter l'histoire de votre organisation - votre projet, les valeurs que vous défendez. Nous vous conseillons de ne pas dépasser 600 caractères ou 150 mots."
enterprise_long_desc_length: "%{num} caractères / inférieur à 600 recommandé"
- enterprise_limit: Nombre max d'entreprises
enterprise_abn: "SIRET"
enterprise_abn_placeholder: "ex: 404 833 048 00022"
enterprise_acn: "n° TVA intracommunautaire"
@@ -1900,10 +1905,10 @@ fr:
admin_enterprise_relationships_button_create: "Créer"
admin_enterprise_groups: "Groupes d'entreprises"
admin_enterprise_groups_name: "Produit/Variante"
- admin_enterprise_groups_owner: "Manager principal"
+ admin_enterprise_groups_owner: "Gestionnaire principal"
admin_enterprise_groups_on_front_page: "Sur la page d'accueil?"
admin_enterprise_groups_enterprise: "Entreprises"
- admin_enterprise_groups_data_powertip: "Le manager principal en charge de ce groupe."
+ admin_enterprise_groups_data_powertip: "Le gestionnaire principal en charge de ce groupe."
admin_enterprise_groups_data_powertip_logo: "Il s'agit du logo du groupe"
admin_enterprise_groups_data_powertip_promo_image: "Cette image est affichée en haut du profil Groupe."
admin_enterprise_groups_contact: "Contact"
@@ -2054,7 +2059,7 @@ fr:
report_all: 'tous'
report_order_cycle: "Cycle de vente:"
report_enterprises: "Entreprises:"
- report_users: "Managers:"
+ report_users: "Utilisateurs :"
report_tax_rates: TVA par taux
report_tax_types: TVA par type de produit/service
report_header_order_cycle: Cycle de Vente
@@ -2207,11 +2212,11 @@ fr:
unsaved_changes_confirmation: "Les changements non sauvegardés seront perdus. Continuer?"
one_product_unsaved: "Des changements sur un produit n'ont pas été sauvegardés."
products_unsaved: "Des changements sur %{n} produits n'ont pas été sauvegardés."
- is_already_manager: "est déjà manager!"
+ is_already_manager: "est déjà gestionnaire !"
no_change_to_save: "Pas de changement à sauvegarder"
user_invited: "%{email}a été invité à gérer cette entreprise"
add_manager: "Ajouter un utilisateur existant"
- users: "Managers"
+ users: "Utilisateurs"
about: "A propos"
images: "Images"
web: "Web"
@@ -2233,12 +2238,13 @@ fr:
validation_msg_relationship_already_established: "^Un lien est déjà établi entre ces entreprises."
validation_msg_at_least_one_hub: "^Sélectionnez au moins un hub"
validation_msg_product_category_cant_be_blank: "^Veuillez sélectionner la catégorie produit"
+ validation_msg_tax: "^La TVA applicable est requise"
validation_msg_tax_category_cant_be_blank: "^Veuillez sélectionner la TVA applicable"
validation_msg_is_associated_with_an_exising_customer: "est associé à un acheteur existant"
content_configuration_pricing_table: "(A FAIRE : Tableau des tarifs)"
content_configuration_case_studies: "(A FAIRE : Etudes de Cas)"
content_configuration_detail: "(A FAIRE : Détails)"
- enterprise_name_error: "est déjà utilisé. Si vous êtes le gérant de cette entreprise et que vous souhaitez demander le transfert du compte, ou bien si vous souhaitez distribuer les produits de cette entreprise, merci de contacter le manager actuel du profil à %{email}."
+ enterprise_name_error: "est déjà utilisé. Si vous êtes le gérant de cette entreprise et que vous souhaitez demander le transfert du compte, ou bien si vous souhaitez distribuer les produits de cette entreprise, merci de contacter le gestionnaire principal du profil à %{email}."
enterprise_owner_error: "^ %{email} ne peut pas créer de nouvelles entreprises (limite actuelle : %{enterprise_limit} entreprises )."
enterprise_role_uniqueness_error: "^Ce rôle existe déjà."
inventory_item_visibility_error: doit être vrai ou faux
@@ -2607,6 +2613,23 @@ fr:
bulk_coop_packing_sheets: 'Achats groupés - Feuilles de préparation des paniers'
bulk_coop_customer_payments: 'Achats groupés - Paiement des acheteurs'
users:
+ index:
+ listing_users: "Liste des utilisateurs"
+ new_user: "Nouvel utilisateur"
+ user: "Utilisateur"
+ enterprise_limit: "Nombre max d'entreprises"
+ search: "Rechercher"
+ email: "Email"
+ edit:
+ editing_user: "Modifier l'utilisateur"
+ back_to_users_list: "Retour à la liste utilisateurs"
+ general_settings: "Configurations générales"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Nombre max d'entreprises"
+ confirm_password: "Confirmez votre mot de passe"
+ password: "Mot de passe"
email_confirmation:
confirmation_pending: "L'email de confirmation n'a pas encore été validé. Il a été envoyé à %{address}."
variants:
diff --git a/config/locales/fr_BE.yml b/config/locales/fr_BE.yml
index 7b9ef12587..5122a5a750 100644
--- a/config/locales/fr_BE.yml
+++ b/config/locales/fr_BE.yml
@@ -7,7 +7,7 @@ fr_BE:
shipment_state: Statut livraison
completed_at: 'Passée à '
number: N° commande
- email: Email acheteur
+ email: Adresse électronique acheteur
spree/payment:
amount: Montant
order_cycle:
@@ -17,7 +17,7 @@ fr_BE:
spree/user:
attributes:
email:
- taken: "Un compte existe déjà pour cet e-mail. Connectez-vous ou demandez un nouveau mot de passe."
+ taken: "Un compte existe déjà pour cette adresse électronique. Connectez-vous ou demandez un nouveau mot de passe."
spree/order:
no_card: Aucune carte de paiement autorisée disponible
order_cycle:
@@ -55,7 +55,7 @@ fr_BE:
user_registrations:
spree_user:
signed_up_but_unconfirmed: "Un message avec un lien de confirmation a été envoyé à l'adresse email indiquée. Veuillez cliquer sur ce lien pour activer votre compte."
- unknown_error: "Une erreur s'est glissée lors de la création de votre compte. Vérifiez votre addresse email et recommencez."
+ unknown_error: "Une erreur s'est glissée lors de la création de votre compte. Vérifiez votre adresse email et recommencez."
failure:
invalid: |
Email / mot de passe incorrect.
@@ -289,7 +289,7 @@ fr_BE:
finalise_invoice: "Finaliser les factures"
auto_finalise_invoices: "Finaliser automatiquement les factures le 2 de chaque mois à 01:30"
manually_run_task: "Tâche exécutée manuellement"
- update_user_invoice_explained: "Cliquez ici pour mettre à jour immédiatement les factures pour le mois en cours pour toutes les entreprises utilisant le système. Cette tache peut être définie pour s'effectuer automatiquement chaque nuit."
+ update_user_invoice_explained: "Cliquez ici pour mettre à jour immédiatement les factures pour le mois en cours pour toutes les entreprises utilisant le système. Cette tâche peut être définie pour s'effectuer automatiquement chaque nuit."
finalise_user_invoices: "Finaliser les factures utilisateurs"
finalise_user_invoice_explained: "Cliquez ici pour finaliser toutes les factures pour le mois calendaire précédent. Cette tâche peut-être définie pour être opérée automatiquement une fois par mois."
update_user_invoices: "Mettre à jour les factures utilisateurs"
@@ -435,7 +435,7 @@ fr_BE:
import_date: Importé
upload_an_image: Importer une image
product_search_keywords: Mots-clés de recherche produits
- product_search_tip: Saisissez des mots qui peuvent simplifier la recherche de vo produits dans les boutiques. Laissez un espace entre chaque mot-clé.
+ product_search_tip: Saisissez des mots qui peuvent simplifier la recherche de vos produits dans les boutiques. Laissez un espace entre chaque mot-clé.
SEO_keywords: Mot-clés de référencement web
seo_tip: Saisissez des mots qui peuvent simplifier la recherche de vos produits sur le web. Laissez un espace entre chaque mot-clé.
Search: Rechercher
@@ -511,56 +511,56 @@ fr_BE:
entries_with_errors: Certaines lignes contiennent des erreurs et les produits correspondant ne seront pas importés
products_to_create: Ces produits vont être crées
products_to_update: Ces produits vont être mis à jour
- inventory_to_create: Ces produits vont être ajoutés au catalogue boutique
- inventory_to_update: Les informations de ces produits dans le catalogue boutique vont être mises à jour
+ inventory_to_create: Ces produits vont être ajoutés au catalogue du magasin
+ inventory_to_update: Les informations de ces produits dans le catalogue du magasin vont être mises à jour
products_to_reset: Le stock des produits existants va être remis à zero
- inventory_to_reset: Dans le catalogue boutique, le stock des produits existants va être remis à zéro
+ inventory_to_reset: Dans le catalogue du magasin, le stock des produits existants va être remis à zéro
line: Ligne
item_line: Ligne produit concernée
import_review:
not_updatable_tip: "Les champs suivants ne peuvent pas être mis à jour pour des produits existants via la fonctionnalité d'import de fichier produits :"
fields_ignored: Ces champs seront ignorés à l'enregistrement des produits importés.
entries_table:
- not_updatable: Ce champs ne peut pas être mis à jour pour des produits existants via la fonctionnalité d'import de fichier produits
+ not_updatable: Ce champ ne peut pas être mis à jour pour des produits existants via la fonctionnalité d'import de fichier produits
save_results:
final_results: Importer les informations produits confirmées
products_created: produits crées
products_updated: produits mis à jour
- inventory_created: produits ajoutés dans le catalogue boutique
- inventory_updated: produits mis à jour dans le catalogue boutique
+ inventory_created: produits ajoutés dans le catalogue du magasin
+ inventory_updated: produits mis à jour dans le catalogue du magasin
products_reset: produits ont vu leur niveau de stock remis à zéro
- inventory_reset: produits ont vu leur niveau de stock remis à zéro dans le catalogue boutique
+ inventory_reset: produits ont vu leur niveau de stock remis à zéro dans le catalogue du magasin
all_saved: "Tous les produits ont été sauvegardés avec succès"
some_saved: "produits sauvegardés avec succès"
save_errors: Sauvegarder les erreurs
import_again: Importer un autre fichier
view_products: Aller à la page Produits
- view_inventory: Aller à la page Catalogues Boutiques
+ view_inventory: Aller à la page Catalogues Magasins
variant_overrides:
loading_flash:
- loading_inventory: Catalogue boutique en cours de chargement...
+ loading_inventory: Catalogue du magasin en cours de chargement...
index:
- title: Catalogue boutique
+ title: Catalogue du magasin
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)?
inherit?: Hériter?
add: Ajouter
hide: Masquer
import_date: Importé
- select_a_shop: Choisir une boutique
+ select_a_shop: Choisir un magasin
review_now: Vérifier maintenant
new_products_alert_message: Il y a %{new_product_count} nouveaux produits disponibles pouvant être ajoutés à votre catalogue.
currently_empty: Votre catalogue est actuellement vide
no_matching_products: Pas de produits correspondants dans votre catalogue
no_hidden_products: Aucun produit masqué dans ce catalogue
- no_matching_hidden_products: Aucune produit masqué ne répond à la recherche
+ no_matching_hidden_products: Aucun produit masqué ne répond à la recherche
no_new_products: Pas de nouveaux produits à ajouter à ce catalogue
no_matching_new_products: Pas de nouveaux produits répondant à la recherche
inventory_powertip: Ceci est votre catalogue produits. Pour ajouter des produits à votre catalogue, sélectionnez "Nouveaux Produits" dans le menu déroulant.
hidden_powertip: Ces produits ont été masqués de votre catalogue, vous ne pourrez pas les proposer dans votre boutique. Vous pouvez cliquer sur "Ajouter" pour ajouter un produit à votre catalogue.
new_powertip: Ces produits peuvent être ajoutés à votre catalogue. Cliquez sur "Ajouter" pour ajouter un produit à votre catalogue, ou 'Masquer" pour ne plus l'afficher. Vous pourrez changer d'avis plus tard!
controls:
- back_to_my_inventory: Retour à mon catalogue boutique
+ back_to_my_inventory: Retour à mon catalogue magasin
orders:
invoice_email_sent: 'L''email de facturation a bien été envoyé'
order_email_resent: 'L''email de commande a de nouveau été envoyé'
@@ -631,15 +631,15 @@ fr_BE:
promo_image_note3: La bannière est affichée en haut de la page de votre entreprise et dans sa version condensée (pop-up).
inventory_settings:
text1: Vous pouvez choisir de gérer vos stocks et prix via votre
- inventory: catalogue boutique
+ inventory: catalogue magasin
text2: >
- Si vous utilisez l'outil "catalogue boutique", vous pouvez choisir si
+ Si vous utilisez l'outil "catalogue magasin", vous pouvez choisir si
les nouveaux produits ajoutés par vos fournisseurs doivent être référencés
- dans votre catalogue boutique avant qu'ils puissent mis en vente dans
- votre boutique. Si vous n'utilisez pas cet outil, choisissez l'option
+ dans votre catalogue magasin avant qu'ils puissent être mis en vente
+ dans votre magasin Si vous n'utilisez pas cet outil, choisissez l'option
indiquant "recommandé" ci-dessous:
- preferred_product_selection_from_inventory_only_yes: Les nouveaux produits des producteurs peuvent être ajoutés à ma boutique en ligne (recommandé)
- preferred_product_selection_from_inventory_only_no: Les nouveaux produits des producteurs doivent être ajoutés à mon catalogue boutique avant de pouvoir être ajoutés à ma boutique en ligne
+ preferred_product_selection_from_inventory_only_yes: Les nouveaux produits des producteurs peuvent être ajoutés à mon magasin en ligne (recommandé)
+ preferred_product_selection_from_inventory_only_no: Les nouveaux produits des producteurs doivent être ajoutés à mon catalogue magasin avant de pouvoir être ajoutés à mon magasin en ligne
payment_methods:
name: Nom
applies: Active?
@@ -662,13 +662,13 @@ fr_BE:
sells: Produits vendus
sells_tip: "Aucun - l'entreprise ne vend pas en direct aux acheteurs.
Les miens - l'entreprise vend ses propres produits aux acheteurs.
Tous - l'entreprise vend ses propres produits et/ou les produits d'autres entreprises.
"
visible_in_search: Apparaît sur la plateforme?
- visible_in_search_tip: Indiquez si vous souhaitez ou ne souhaitez pas que votre entreprise apparaisse sur la carte et dans la liste des boutiques.
+ visible_in_search_tip: Indiquez si vous souhaitez ou ne souhaitez pas que votre entreprise apparaisse sur la carte et dans la liste des magasins.
visible: Visible
not_visible: Invisible
permalink: Nom pour URL (sans espace)
- permalink_tip: "Ce nom permanent est utilisé pour créer l'url de votre boutique: %{link}ma-boutique/shop"
- link_to_front: Lien URL de la boutique
- link_to_front_tip: C'est le lien qui permet d'accéder en direct à votre boutique sur Open Food Network.
+ permalink_tip: "Ce nom permanent est utilisé pour créer l'url de votre magasin: %{link}ma-boutique/shop"
+ link_to_front: Lien URL du magasin
+ link_to_front_tip: C'est le lien qui permet d'accéder en direct à votre magasin sur Open Food Network.
shipping_methods:
name: Nom
applies: Active?
@@ -677,8 +677,8 @@ fr_BE:
create_one_button: En créer une maintenant
no_method_yet: Vous n'avez pas encore paramétré de méthode de livraison.
shop_preferences:
- shopfront_requires_login: "Boutique visible par tous?"
- shopfront_requires_login_tip: "Choisissez si les acheteurs doivent être connectés pour voir la boutique ou si la boutique est visible par tout le monde."
+ shopfront_requires_login: "Magasin visible par tous?"
+ shopfront_requires_login_tip: "Choisissez si les acheteurs doivent être connectés pour voir le magasin ou si le magasin est visible par tout le monde."
shopfront_requires_login_false: "Visible par tous"
shopfront_requires_login_true: "Visible uniquement pour les acheteurs logués"
recommend_require_login: "Nous recommandons de demander aux utilisateurs de se connecter si vous souhaitez leur permettre de modifier leur commande."
@@ -694,16 +694,15 @@ fr_BE:
enable_subscriptions_tip: "Activer la fonction abonnements?"
enable_subscriptions_false: "Désactivé"
enable_subscriptions_true: "Activé"
- shopfront_message: Message d'accueil boutique ouverte
+ shopfront_message: Message d'accueil magasin ouvert
shopfront_message_placeholder: >
- Vous pouvez ici expliquer à vos acheteurs comment votre boutique fonctionne.
- Ce texte s'affiche dans votre boutique, au-dessus de la liste de produits.
- shopfront_closed_message: Message d'accueil boutique fermée
+ Vous pouvez ici expliquer à vos acheteurs comment votre magasin fonctionne.
+ Ce texte s'affiche dans votre magasin, au-dessus de la liste de produits.
+ shopfront_closed_message: Message d'accueil magasin fermé
shopfront_closed_message_placeholder: >
- Vous pouvez ici expliquer à vos acheteurs pourquoi votre boutique est
- fermée et/ou quand elle ouvrira. Ce texte s'affiche uniquement quand
- il n'y a pas de cycle de vente en cours (donc quand votre boutique est
- fermée).
+ Vous pouvez ici expliquer à vos acheteurs pourquoi votre magasin est
+ fermé et/ou quand il ouvrira. Ce texte s'affiche uniquement quand il
+ n'y a pas de cycle de vente en cours (donc quand votre magasin est fermé).
shopfront_category_ordering: Ordre d'affichage des catégories
open_date: Date d'ouverture
close_date: Date de fermeture
@@ -716,7 +715,7 @@ fr_BE:
disconnect: "Déconnecter le compte"
confirm_modal:
title: Connecter avec Stripe
- part1: Stripe est un système de paiement qui permet aux boutiques sur Open Food France d'accepter des paiements par carte bancaire de leurs acheteurs.
+ part1: Stripe est un système de paiement qui permet aux magasins sur Open Food France d'accepter des paiements par carte bancaire de leurs acheteurs.
part2: Pour utiliser cette fonctionnalité, vous devez connecter votre compte Stripe à Open Food France. En cliquant sur "J'accepte" ci-dessous, vous serez redirigé vers le site internet de Stripe, où vous pourrez connecter votre compte existant ou en créer un si vous n'en avez pas encore.
part3: Cela permettra à Open Food Network d'accepter en votre nom les paiements par carte de crédit en provenance de vos acheteurs. Veuillez noter que c'est à vous de gérer votre compte Stripe, de payer les frais dus à Stripe et de gérer les éventuels remboursements et le service après vente.
i_agree: J'accepte
@@ -739,7 +738,7 @@ fr_BE:
contact_tip: "Le manager qui recevra les emails de confirmation de commande et autres notifications de l'entreprise. Il doit avoir confirmé son adresse email pour pouvoir être sélectionné."
owner_tip: Manager principal de cette entreprise.
notifications: Notifications
- notifications_tip: Une notification de commande sera envoyée à cette adresse email pour chaque commande passée dans votre boutique.
+ notifications_tip: Une notification de commande sera envoyée à cette adresse email pour chaque commande passée dans votre magasin.
notifications_placeholder: 'ex: bernard@maferme.fr'
notifications_note: 'A noter: si vous saisissez une nouvelle adresse, un email de confirmation sera envoyé à cette adresse avec un lien de validation à cliquer.'
managers: Managers
@@ -769,20 +768,20 @@ fr_BE:
producer_profile: Profil producteur
connect_ofn: Gagnez en visibilité via OFFrance
always_free: GRATUIT
- producer_description_text: Saisissez votre catalogue produits sur Open Food Network, ce qui permettra aux hubs-distributeurs utilisant la plateforme de les proposer dans leurs boutiques (sur votre autorisation).
- producer_shop: Boutique Producteur
+ producer_description_text: Saisissez votre catalogue produits sur Open Food Network, ce qui permettra aux hubs-distributeurs utilisant la plateforme de les proposer dans leurs magasins (sur votre autorisation).
+ producer_shop: Magasin Producteur
sell_your_produce: Vendez vos propres produits
- producer_shop_description_text: Vendez vos produits en direct aux mangeurs/restaurateurs/etc. via votre propre Boutique Producteur sur Open Food Network.
- producer_shop_description_text2: Une Boutique Producteur vous permet de vendre uniquement vos propres produits. Si vous voulez vendre d'autres produits, sélectionnez "Hub Producteur"
+ producer_shop_description_text: Vendez vos produits en direct aux consommateurs via votre propre Magasin Producteur sur Open Food Network.
+ producer_shop_description_text2: Un Magasin Producteur vous permet de vendre uniquement vos propres produits. Si vous voulez vendre d'autres produits, sélectionnez "Hub Producteur"
producer_hub: Hub Producteur
producer_hub_text: Vendez vos produits et ceux d'autres fournisseurs
- producer_hub_description_text: Vous vendez non seulement vos produits, mais aussi des produits d'autres producteurs de votre région, artisans, ou distributeurs afin de proposer une offre complète dans votre boutique. Vous soutenez ainsi le développement de votre système alimentaire territorial !
+ producer_hub_description_text: Vous vendez non seulement vos produits, mais aussi des produits d'autres producteurs de votre région, artisans, ou distributeurs afin de proposer une offre complète dans votre magasin. Vous soutenez ainsi le développement de votre système alimentaire territorial !
profile: Profil uniquement
get_listing: Référencez votre hub/point de vente
profile_description_text: Les visiteurs peuvent vous trouver sur Open Food Network et vous contacter. Votre entreprise sera visible sur la carte.
hub_shop: Magasin Hub
hub_shop_text: Vendez des produits de multiples fournisseurs différents
- hub_shop_description_text: Vous proposez des produits de différents producteurs de votre région, artisans, ou distributeurs afin de proposer une offre complète dans votre boutique. Vous soutenez ainsi le développement de votre système alimentaire territorial !
+ hub_shop_description_text: Vous proposez des produits de différents producteurs de votre région, artisans, ou distributeurs afin de proposer une offre complète dans votre magasin. Vous soutenez ainsi le développement de votre système alimentaire territorial !
choose_option: Veuilliez choisir l'une des options ci-dessus.
change_now: Changer
enterprise_user_index:
@@ -839,8 +838,8 @@ fr_BE:
add_distributor: 'Ajouter un distributeur'
advanced_settings:
title: Paramétrages avancés
- choose_product_tip: Vous pouvez choisir de limiter le choix des produits pouvant être mis en vente dans votre boutique à ceux figurant dans le catalogue boutique de %{inventory}.
- preferred_product_selection_from_coordinator_inventory_only_here: Uniquement les produits du catalogue boutique
+ choose_product_tip: Vous pouvez choisir de limiter le choix des produits pouvant être mis en vente dans votre magasin à ceux figurant dans le catalogue magasin de %{inventory}.
+ preferred_product_selection_from_coordinator_inventory_only_here: Uniquement les produits du catalogue magasin
preferred_product_selection_from_coordinator_inventory_only_all: Tous les produits disponibles dans les catalogues producteurs
save_reload: Sauvegarder et rafraichir la page
coordinator_fees:
@@ -894,7 +893,7 @@ fr_BE:
products: Produits
fees: Commissions
destroy_errors:
- orders_present: Ce cycle de vente a déjà été utilisé par un acheteur et ne peut être supprimé. Pour empêcher aux acheteurs d'y accéder, veuillez plutôt le fermer.
+ orders_present: Ce cycle de vente a déjà été utilisé par un acheteur et ne peut être supprimé. Pour empêcher les acheteurs d'y accéder, veuillez plutôt le fermer.
schedule_present: Ce cycle de vente est lié à un rythme d'abonnement et ne peut pas être supprimé. Veuillez d'abord supprimer ce lien ou supprimer le rythme d'abonnement.
bulk_update:
no_data: Une erreur s'est produite. Aucune donnée trouvée.
@@ -1074,7 +1073,7 @@ fr_BE:
checkout: "Poursuivre la commande"
already_ordered_products: "Déjà commandé dans ce cycle de vente"
register_call:
- selling_on_ofn: "Vous souhaitez proposer vos produits sur Open Food Network?"
+ selling_on_ofn: "Intéressé à participer à Open Food Network?"
register: "Démarrez ici"
footer:
footer_global_headline: "OFN Global"
@@ -1138,8 +1137,8 @@ fr_BE:
ticket_column_item: "Produit"
ticket_column_unit_price: "Prix unitaire"
ticket_column_total_price: "Prix total"
- menu_1_title: "Boutiques"
- menu_1_url: "/shops"
+ menu_1_title: "Magasins"
+ menu_1_url: "/magasins"
menu_2_title: "Carte"
menu_2_url: "/map"
menu_3_title: "Producteurs"
@@ -1194,7 +1193,7 @@ fr_BE:
unconfirmed: non confirmé
days: jours
label_shop: "Boutique"
- label_shops: "Boutiques"
+ label_shops: "Magasins"
label_map: "Carte"
label_producer: "Producteur"
label_producers: "Producteurs"
@@ -1575,16 +1574,16 @@ fr_BE:
sell_producers: "Producteurs"
sell_hubs: "Hubs"
sell_groups: "Groupes"
- sell_producers_detail: "Créer un profil pour votre entreprise sur OFN en quelques minutes. A tout moment vous pourrez créer une boutique en ligne pour vendre vos produits en direct aux acheteurs."
+ sell_producers_detail: "Créer un profil pour votre entreprise sur OFN en quelques minutes. A tout moment vous pourrez créer un magasin en ligne pour vendre vos produits en direct aux acheteurs."
sell_hubs_detail: "Créer un profil pour votre entreprise de distribution ou organisation sur OFN. A tout moment vous pourrez créer une boutique multi-fournisseurs."
sell_groups_detail: "Créer un répertoire sur mesure (regroupant différents producteurs et hubs de distribution) pour votre région ou votre organisation."
sell_user_guide: "En savoir plus en explorant le guide utilisateur."
- sell_listing_price: "La création d'un profil sur OFN, ouvrir, gérer une boutique ou créer un groupe pour votre organisation ou réseau régional sur l'OFN est à contribution libre. Afin de maintenir et développer ce commun numérique, nous avons besoin de compétences et des fonds. Nous vous invitons à contribuer au commun \"en compétences\" (développement de fonctionnalités, recherche de financement, support utilisateur, etc.) ou \"en argent\" d'un montant fixe par mois et/ou 2% de votre chiffre d'affaires par les mois. "
+ sell_listing_price: "La création d'un profil sur OFN, ouvrir, gérer un magasin ou créer un groupe pour votre organisation ou réseau régional sur l'OFN est à contribution libre. Afin de maintenir et développer ce commun numérique, nous avons besoin de compétences et des fonds. Nous vous invitons à contribuer au commun \"en compétences\" (développement de fonctionnalités, recherche de financement, support utilisateur, etc.) ou \"en argent\" d'un montant fixe par mois et/ou 2% de votre chiffre d'affaires par les mois. "
sell_embed: "Nous pouvons aussi intégrer votre boutique OFN dans votre propre site web ou construire un site web d'alimentation locale sur mesure pour votre région."
sell_ask_services: "Nous consulter sur les services des partenaires OFN."
shops_title: Boutiques
shops_headline: Des achats qui transforment.
- shops_text: Les aliments poussent selon des cycles naturels, les fermiers récoltent en cycles, nous achetons aussi en cycles. Si un cycle de vente est terminé, attendez le suivant ou demandez des infos à votre la boutique préférée.
+ shops_text: Les aliments poussent selon des cycles naturels, les fermiers récoltent en cycles, nous achetons aussi en cycles. Si un cycle de vente est terminé, attendez le suivant ou demandez des infos à votre magasin préféré.
shops_signup_title: S'inscrire en tant que hub
shops_signup_headline: Des hubs divers et variés
shops_signup_motivation: Quel que soit votre modèle, vous pouvez vous appuyer sur Open Food France. Si vous voulez le faire évoluer, nous sommes là pour vous aider. Nous agissons selon des principes de non-lucrativité, d'indépendance, et de transparence. Et nous faisons tout notre possible pour répondre à vos besoins et vous accompagner en toute circonstance.
@@ -1790,7 +1789,6 @@ fr_BE:
enterprise_long_desc: "Description longue"
enterprise_long_desc_placeholder: "Vous pouvez ici raconter l'histoire de votre organisation - votre projet, les valeurs que vous défendez. Nous vous conseillons de ne pas dépasser 600 caractères ou 150 mots."
enterprise_long_desc_length: "%{num} caractères / inférieur à 600 recommandé"
- enterprise_limit: Nombre max d'entreprises
enterprise_abn: "SIRET"
enterprise_abn_placeholder: "ex: 404 833 048 00022"
enterprise_acn: "n° TVA intracommunautaire"
@@ -2606,6 +2604,16 @@ fr_BE:
bulk_coop_packing_sheets: 'Achats groupés - Feuilles de préparation des paniers'
bulk_coop_customer_payments: 'Achats groupés - Paiement des acheteurs'
users:
+ index:
+ user: "Utilisateur"
+ enterprise_limit: "Nombre max d'entreprises"
+ search: "Rechercher"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Nombre max d'entreprises"
+ password: "Mot de passe"
email_confirmation:
confirmation_pending: "L'email de confirmation n'a pas encore été validé. Il a été envoyé à %{address}."
variants:
@@ -2733,7 +2741,7 @@ fr_BE:
cards:
authorised_shops: Boutiques autorisées.
authorised_shops_popover: Voilà la liste des boutiques que vous avez autorisées à débiter votre carte de paiement par défaut dans le cadre de vos abonnements en cours (commandes récurrentes). Les informations concernant votre carte de paiement sont sécurisées et ne sont pas accessibles par le gérant de la boutique. Vous recevrez systématiquement une notification avant tout débit sur votre carte.
- saved_cards_popover: Voilà la liste des cartes de paiement que vous avez enregistrées. Votre carte par défaut sera automatiquement sélectionnée au moment de la finalisation d'une commande, et pourra être débitée par les boutiques auxquelles vous avez donné cette autorisation (voir à droite).
+ saved_cards_popover: Voilà la liste des cartes de paiement que vous avez enregistrées. Votre carte par défaut sera automatiquement sélectionnée au moment de la finalisation d'une commande, et pourra être débitée par les magasins auxquels vous avez donné cette autorisation (voir à droite).
authorised_shops:
shop_name: "Nom de la boutique"
allow_charges?: "Autoriser les prélèvements ?"
diff --git a/config/locales/fr_CA.yml b/config/locales/fr_CA.yml
index c3c0d26789..c2a4733820 100644
--- a/config/locales/fr_CA.yml
+++ b/config/locales/fr_CA.yml
@@ -1780,7 +1780,6 @@ fr_CA:
enterprise_long_desc: "Description longue"
enterprise_long_desc_placeholder: "Vous pouvez ici raconter l'histoire de votre organisation - votre projet, les valeurs que vous défendez. Nous vous conseillons de ne pas dépasser 600 caractères ou 150 mots."
enterprise_long_desc_length: "%{num} caractères / inférieur à 600 recommandé"
- enterprise_limit: Nombre max d'entreprises
enterprise_abn: "SIRET"
enterprise_abn_placeholder: "ex: 404 833 048 00022"
enterprise_acn: "n° TVA intracommunautaire"
@@ -2584,6 +2583,16 @@ fr_CA:
bulk_coop_packing_sheets: 'Achats groupés - Feuilles de préparation des paniers'
bulk_coop_customer_payments: 'Achats groupés - Paiement des acheteurs'
users:
+ index:
+ user: "Utilisateur"
+ enterprise_limit: "Nombre max d'entreprises"
+ search: "Chercher"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Roles"
+ enterprise_limit: "Nombre max d'entreprises"
+ password: "Mot de passe"
email_confirmation:
confirmation_pending: "L'email de confirmation n'a pas encore été validé. Il a été envoyé à %{address}."
variants:
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 305d0a3690..9da5f3d19f 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -1455,7 +1455,6 @@ it:
enterprise_long_desc: "Descrizione lunga"
enterprise_long_desc_placeholder: "Questa è la tua opportunità per raccontare la storia della tua azienda - cosa ti rende differente e fantastico? Ti suggeriamo di mantenere la descrizione sotto i 600 caratteri o le 150 parole."
enterprise_long_desc_length: "%{num} caratteri / fino a 600 raccomandati"
- enterprise_limit: Limite azienda
enterprise_abn: "Partita IVA"
enterprise_abn_placeholder: "es. 99 123 456 789"
enterprise_acn: "Codice fiscale"
@@ -2065,6 +2064,16 @@ it:
table:
select_and_search: "Seleziona i filtri e clicca su CERCA per accedere ai tuoi dati"
users:
+ index:
+ user: "Utente"
+ enterprise_limit: "Limite azienda"
+ search: "Cerca"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Ruoli"
+ enterprise_limit: "Limite azienda"
+ password: "Password"
email_confirmation:
confirmation_pending: "Email di conferma in sospeso. Abbiamo inviato una mail di conferma a %{address}."
variants:
diff --git a/config/locales/nb.yml b/config/locales/nb.yml
index b5e2a08cad..b058a2b44f 100644
--- a/config/locales/nb.yml
+++ b/config/locales/nb.yml
@@ -170,7 +170,7 @@ nb:
remove: Fjern
or: eller
collapse_all: Skjul alle
- expand_all: Vis alle
+ expand_all: Utvid alle
loading: Laster...
show_more: Vis mer
show_all: Vis alle
@@ -314,8 +314,8 @@ nb:
bill_calculation_settings: "Kalkulatorinnstillinger for Regninger"
bill_calculation_settings_tip: "Tilpass hvor mye bedrifter skal faktureres for hver måned for bruken av OFN."
shop_trial_length: "Lengde på prøveperiode for butikker (dager)"
- shop_trial_length_tip: "Antall dager prøveperiode for en bedrift som er satt opp som butikk."
- fixed_monthly_charge: "Fast månedlig belastning"
+ shop_trial_length_tip: "Hvor lang tid (i dager) bedrifter som er satt opp som butikker, kan kjøre som prøveperiode."
+ fixed_monthly_charge: "Fast Månedlig Belastning"
fixed_monthly_charge_tip: "En fast månedlig belastning for alle bedrifter som er satt opp som butikk og har overskredet minimum fakturert omsetning (hvis konfigurert)."
percentage_of_turnover: "Prosent av omsetning"
percentage_of_turnover_tip: "Når større enn null, gjelder denne raten (0.0 - 1.0) på total omsetning for hver butikk og lagt til enhver fast rate (til venstre) for å beregne den månedlige fakturaen."
@@ -572,6 +572,7 @@ nb:
tip: "Bruk denne siden for å endre produktantall på tvers av flere bestillinger. Produkter kan også fjernes fra bestillinger helt, hvis påkrevd."
shared: "Delt Ressurs?"
order_no: "Bestillingsnr."
+ order_date: "Fullført på"
max: "Max"
product_unit: "Produkt: Enhet"
weight_volume: "Vekt/Volum"
@@ -1491,7 +1492,7 @@ nb:
products_update_error_data: "Lagring mislyktes på grunn av ugyldige data:"
products_changes_saved: "Endringene er lagret."
search_no_results_html: "Beklager, ingen treff på %{query}. Prøv på nytt?"
- components_profiles_popover: "Profiler har ikke butikkvindu på Open Food Network men kan ha sin egen fysiske butikk eller nettbutikk et annet sted"
+ components_profiles_popover: "Profiler har ikke butikk på Open Food Network men kan ha sin egen fysiske butikk eller nettbutikk et annet sted"
components_profiles_show: "Vis profiler"
components_filters_nofilters: "Ingen filter"
components_filters_clearfilters: "Fjern alle filtre"
@@ -1793,7 +1794,6 @@ nb:
enterprise_long_desc: "Lang beskrivelse"
enterprise_long_desc_placeholder: "Dette er muligheten din til å fortelle historien om din virksomhet - hva gjør deg annerledes og flott? Vi vil foreslå å holde din beskrivelse til under 600 tegn eller 150 ord."
enterprise_long_desc_length: "%{num} tegn / opptil 600 anbefales"
- enterprise_limit: Bedriftsgrense
enterprise_abn: "Org. nr."
enterprise_abn_placeholder: "f.eks. 999 000 123"
enterprise_acn: "MVA nr."
@@ -2597,6 +2597,16 @@ nb:
bulk_coop_packing_sheets: 'Bulk Co-op - Pakkseddel'
bulk_coop_customer_payments: 'Bulk Co-op - Kunde Betalinger'
users:
+ index:
+ user: "Bruker"
+ enterprise_limit: "Bedriftsgrense"
+ search: "Søk"
+ email: "Epost"
+ form:
+ email: "Epost"
+ roles: "Roller"
+ enterprise_limit: "Bedriftsgrense"
+ password: "Passord"
email_confirmation:
confirmation_pending: "Epostbekreftelse venter. Vi har sendt en bekreftelses-epost til %{address}."
variants:
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 1f1605f2a0..61af3615a1 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -1651,7 +1651,6 @@ pt:
enterprise_long_desc: "Descrição Longa"
enterprise_long_desc_placeholder: "Esta é a oportunidade para contar a história da sua organização - o quê que a torna diferente e maravilhosa? Sugerimos um parágrafo com 600 caracteres ou 150 palavras, no máximo. "
enterprise_long_desc_length: "%{num} caracteres / recomendamos até 600"
- enterprise_limit: Limite da Organização
enterprise_abn: "NIPC"
enterprise_abn_placeholder: "ex: 99 123 456 789"
enterprise_acn: "NIF"
@@ -2423,6 +2422,17 @@ pt:
bulk_coop_allocation: 'Cooperativa por Atacado - Alocação'
bulk_coop_packing_sheets: 'Cooperativa por Atacado - Folhas de Empacotamento'
bulk_coop_customer_payments: 'Cooperativa por Atacado - Pagamentos do Consumidor'
+ users:
+ index:
+ user: "Utilizador"
+ enterprise_limit: "Limite da Organização"
+ search: "Procurar"
+ email: "Email"
+ form:
+ email: "Email"
+ roles: "Papeis"
+ enterprise_limit: "Limite da Organização"
+ password: "Palavra-passe"
variants:
autocomplete:
producer_name: Produtor
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 813db2fbb5..d5490cc2ad 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -1215,7 +1215,6 @@ sv:
enterprise_long_desc: "Lång beskrivning"
enterprise_long_desc_placeholder: "Detta är ditt tillfälle att beskriva ditt företag - vad som gör dig speciell och intressant. Vi föreslår att du begränsar beskrivningen till 600 tecken eller 150 ord."
enterprise_long_desc_length: "%{num} tecken / upp till 600 rekommenderas"
- enterprise_limit: Företagets gräns
enterprise_abn: "ABN"
enterprise_abn_placeholder: "t.ex. 99 123 456 789"
enterprise_acn: "ACN"
@@ -1912,6 +1911,17 @@ sv:
bulk_coop_allocation: 'Bulk Co-op - Allokering'
bulk_coop_packing_sheets: 'Bulk Co-op - Förpackningssedlar'
bulk_coop_customer_payments: 'Bulk Co-op - kundbetalningar'
+ users:
+ index:
+ user: "Användare"
+ enterprise_limit: "Företagets gräns"
+ search: "Sök"
+ email: "E-post"
+ form:
+ email: "E-post"
+ roles: "Uppgifter"
+ enterprise_limit: "Företagets gräns"
+ password: "Lösenord"
variants:
autocomplete:
producer_name: Producent
diff --git a/engines/web/app/assets/stylesheets/web/pages/cookies_banner.css.scss b/engines/web/app/assets/stylesheets/web/pages/cookies_banner.css.scss
index a655c513a8..6d204e1d4e 100644
--- a/engines/web/app/assets/stylesheets/web/pages/cookies_banner.css.scss
+++ b/engines/web/app/assets/stylesheets/web/pages/cookies_banner.css.scss
@@ -1,18 +1,18 @@
-@import 'darkswarm/branding';
+@import 'darkswarm/base/colors';
.cookies-banner {
- background: $dark-grey;
+ background: $cookies-banner-background-color;
bottom: 0;
position: fixed;
top: 15% !important;
z-index: 100000;
button {
- background-color: $clr-turquoise;
+ background-color: $cookies-banner-button-background-color;
}
p {
- color: $white;
+ color: $cookies-banner-text-color;
font-size: .75rem;
}
diff --git a/engines/web/app/assets/stylesheets/web/pages/cookies_policy_modal.css.scss b/engines/web/app/assets/stylesheets/web/pages/cookies_policy_modal.css.scss
index 490fe6e529..4c3706d8d7 100644
--- a/engines/web/app/assets/stylesheets/web/pages/cookies_policy_modal.css.scss
+++ b/engines/web/app/assets/stylesheets/web/pages/cookies_policy_modal.css.scss
@@ -1,14 +1,14 @@
-@import 'darkswarm/branding';
+@import 'darkswarm/base/colors';
.cookies-policy-modal {
- background: $disabled-light;
- border-bottom-color: $disabled-light;
+ background: $cookies-policy-modal-background-color;
+ border-bottom-color: $cookies-policy-modal-border-bottom-color;
table {
width: 100%;
tr:nth-of-type(even) {
- background-color: $disabled-very-light;
+ background-color: $cookies-policy-modal-table-tr-even-background-color;
}
p {
diff --git a/lib/open_food_network/property_merge.rb b/lib/open_food_network/property_merge.rb
index 9c21fb7b0d..82bf92eaee 100644
--- a/lib/open_food_network/property_merge.rb
+++ b/lib/open_food_network/property_merge.rb
@@ -1,18 +1,9 @@
module OpenFoodNetwork
class PropertyMerge
def self.merge(primary, secondary)
- primary + secondary.reject do |secondary_p|
- primary.any? do |primary_p|
- property_of(primary_p).presentation == property_of(secondary_p).presentation
- end
+ (primary + secondary).uniq do |property_object|
+ property_object.property.presentation
end
end
-
-
- private
-
- def self.property_of(p)
- p.respond_to?(:property) ? p.property : p
- end
end
end
diff --git a/spec/controllers/shops_controller_spec.rb b/spec/controllers/shops_controller_spec.rb
index 400fa2f563..44f896d5f3 100644
--- a/spec/controllers/shops_controller_spec.rb
+++ b/spec/controllers/shops_controller_spec.rb
@@ -2,16 +2,17 @@ require 'spec_helper'
describe ShopsController, type: :controller do
render_views
+
let!(:distributor) { create(:distributor_enterprise) }
let!(:invisible_distributor) { create(:distributor_enterprise, visible: false) }
before do
- Enterprise.stub_chain("distributors_with_active_order_cycles.ready_for_checkout") { [distributor] }
+ allow(Enterprise).to receive_message_chain(:distributors_with_active_order_cycles, :ready_for_checkout) { [distributor] }
end
# Exclusion from actual rendered view handled in features/consumer/home
it "shows JSON for invisible hubs" do
get :index
- response.body.should have_content invisible_distributor.name
+ expect(response.body).to have_content(invisible_distributor.name)
end
end
diff --git a/spec/features/consumer/producers_spec.rb b/spec/features/consumer/producers_spec.rb
index 514c71d7c4..ca8321dda7 100644
--- a/spec/features/consumer/producers_spec.rb
+++ b/spec/features/consumer/producers_spec.rb
@@ -30,7 +30,7 @@ feature %q{
end
- it "searches by URL" do
+ pending "searches by URL" do
visit producers_path(anchor: "/?query=xyzzy")
expect(page).to have_content "Sorry, no results found for xyzzy"
end
diff --git a/spec/features/consumer/shops_spec.rb b/spec/features/consumer/shops_spec.rb
index 5e28f8ae50..186508532d 100644
--- a/spec/features/consumer/shops_spec.rb
+++ b/spec/features/consumer/shops_spec.rb
@@ -17,7 +17,7 @@ feature 'Shops', js: true do
producer.set_producer_property 'Organic', 'NASAA 12345'
end
- it "searches by URL" do
+ pending "searches by URL" do
visit shops_path(anchor: "/?query=xyzzy")
expect(page).to have_content "Sorry, no results found for xyzzy"
end
diff --git a/spec/lib/open_food_network/property_merge_spec.rb b/spec/lib/open_food_network/property_merge_spec.rb
index 85f4200ab0..37568e706c 100644
--- a/spec/lib/open_food_network/property_merge_spec.rb
+++ b/spec/lib/open_food_network/property_merge_spec.rb
@@ -2,23 +2,31 @@ require 'spec_helper'
module OpenFoodNetwork
describe PropertyMerge do
- let(:p1a) { create(:property, presentation: 'One') }
- let(:p1b) { create(:property, presentation: 'One') }
- let(:p2) { create(:property, presentation: 'Two') }
+ let(:property) { create(:property, presentation: 'One') }
+ let(:duplicate_property) { create(:property, presentation: 'One') }
+ let(:different_property) { create(:property, presentation: 'Two') }
describe "merging Spree::Properties" do
it "merges properties" do
- expect(PropertyMerge.merge([p1a], [p1b, p2])).to eq [p1a, p2]
+ merge = PropertyMerge.merge(
+ [property],
+ [duplicate_property, different_property]
+ )
+ expect(merge).to eq [property, different_property]
end
end
describe "merging ProducerProperties and Spree::ProductProperties" do
- let(:pp1a) { create(:product_property, property: p1a) }
- let(:pp1b) { create(:producer_property, property: p1b) }
- let(:pp2) { create(:producer_property, property: p2) }
+ let(:product_property) { create(:product_property, property: property) }
+ let(:duplicate_product_property) { create(:producer_property, property: duplicate_property) }
+ let(:producer_property) { create(:producer_property, property: different_property) }
it "merges properties" do
- expect(PropertyMerge.merge([pp1a], [pp1b, pp2])).to eq [pp1a, pp2]
+ merge = PropertyMerge.merge(
+ [product_property],
+ [duplicate_product_property, producer_property]
+ )
+ expect(merge).to eq [product_property, producer_property]
end
end
end
diff --git a/spec/serializers/api/cached_enterprise_serializer_spec.rb b/spec/serializers/api/cached_enterprise_serializer_spec.rb
new file mode 100644
index 0000000000..bea4b79bca
--- /dev/null
+++ b/spec/serializers/api/cached_enterprise_serializer_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe Api::CachedEnterpriseSerializer do
+ let(:cached_enterprise_serializer) { described_class.new(enterprise) }
+ let(:enterprise) { create(:enterprise) }
+
+ describe '#supplied_properties' do
+ let(:property) { create(:property, presentation: 'One') }
+ let(:duplicate_property) { create(:property, presentation: 'One') }
+ let(:different_property) { create(:property, presentation: 'Two') }
+
+ let(:enterprise) do
+ create(:enterprise, properties: [duplicate_property, different_property])
+ end
+
+ before do
+ product = create(:product, properties: [property])
+ enterprise.supplied_products << product
+ end
+
+ it "removes duplicate product and producer properties" do
+ properties = cached_enterprise_serializer.supplied_properties
+ expect(properties).to eq([property, different_property])
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index a4765ec963..b0ae2a685c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -91,7 +91,6 @@ RSpec.configure do |config|
config.after(:each, js:true) do
Capybara.reset_sessions!
RackRequestBlocker.wait_for_requests_complete
- DatabaseCleaner.clean
end
def restart_phantomjs