Merge branch 'master' into 2-0-stable-dec-10th

This commit is contained in:
luisramos0
2018-12-10 16:41:29 +00:00
31 changed files with 488 additions and 289 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,4 +1,4 @@
= inject_enterprises
= inject_enterprises(@enterprises)
#hubs.hubs{"ng-controller" => "EnterprisesCtrl", "ng-cloak" => true}
.row

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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.<br />Les miens - l'entreprise vend ses propres produits aux acheteurs.<br />Tous - l'entreprise vend ses propres produits et/ou les produits d'autres entreprises.<br />"
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 ?"

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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