mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-30 21:27:17 +00:00
Merge pull request #3524 from luisramos0/2-0-stable-Feb20
[Spree Upgrade] Merging master into 2-0-stable (3rd run in Feb2019)
This commit is contained in:
21
.github/ISSUE_TEMPLATE/tech-debt-template.md
vendored
Normal file
21
.github/ISSUE_TEMPLATE/tech-debt-template.md
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: Tech debt template
|
||||
about: File a refactoring task that aids future development
|
||||
title: ''
|
||||
labels: tech debt
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### What we should change and why (this is tech debt)
|
||||
<!-- The use of X changed and part y is now redundant. We can remove it and... -->
|
||||
|
||||
|
||||
|
||||
### Context
|
||||
<!-- This came up in PR #3451#issuecomment-461616636. -->
|
||||
|
||||
|
||||
|
||||
### Impact and timeline
|
||||
<!-- Example: This simplifies the upgrade to Spree 3 and should be done after upgrading to Spree 2. -->
|
||||
2
Gemfile
2
Gemfile
@@ -5,7 +5,7 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
||||
gem 'rails', '~> 3.2.22'
|
||||
gem 'rails-i18n', '~> 3.0.0'
|
||||
gem 'i18n', '~> 0.6.11'
|
||||
gem 'i18n-js', '~> 3.1.0'
|
||||
gem 'i18n-js', '~> 3.2.1'
|
||||
|
||||
# Patched version. See http://rubysec.com/advisories/CVE-2015-5312/.
|
||||
gem 'nokogiri', '>= 1.6.7.1'
|
||||
|
||||
20
Gemfile.lock
20
Gemfile.lock
@@ -195,7 +195,7 @@ GEM
|
||||
bcrypt-ruby (3.1.5)
|
||||
bcrypt (>= 3.1.3)
|
||||
blockenspiel (0.5.0)
|
||||
bugsnag (4.1.0)
|
||||
bugsnag (5.5.0)
|
||||
builder (3.0.4)
|
||||
byebug (9.0.6)
|
||||
cancan (1.6.10)
|
||||
@@ -251,7 +251,7 @@ GEM
|
||||
css_parser (1.6.0)
|
||||
addressable
|
||||
daemons (1.3.1)
|
||||
dalli (2.7.2)
|
||||
dalli (2.7.9)
|
||||
database_cleaner (0.7.1)
|
||||
db2fog (0.9.0)
|
||||
activerecord (>= 3.2.0, < 5.0)
|
||||
@@ -293,7 +293,7 @@ GEM
|
||||
faraday (0.15.4)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ffaker (1.22.1)
|
||||
ffi (1.9.25)
|
||||
ffi (1.10.0)
|
||||
figaro (1.1.1)
|
||||
thor (~> 0.14)
|
||||
fission (0.5.0)
|
||||
@@ -489,8 +489,8 @@ GEM
|
||||
httparty (0.16.2)
|
||||
multi_xml (>= 0.5.2)
|
||||
i18n (0.6.11)
|
||||
i18n-js (3.1.0)
|
||||
i18n (>= 0.6.6, < 2)
|
||||
i18n-js (3.2.1)
|
||||
i18n (>= 0.6.6)
|
||||
immigrant (0.3.6)
|
||||
activerecord (>= 3.0)
|
||||
io-like (0.3.0)
|
||||
@@ -660,7 +660,7 @@ GEM
|
||||
rspec-mocks (3.8.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.8.0)
|
||||
rspec-rails (3.8.1)
|
||||
rspec-rails (3.8.2)
|
||||
actionpack (>= 3.0)
|
||||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
@@ -692,9 +692,9 @@ GEM
|
||||
select2-rails (3.4.9)
|
||||
sass-rails
|
||||
thor (~> 0.14)
|
||||
selenium-webdriver (3.12.0)
|
||||
selenium-webdriver (3.141.0)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.2)
|
||||
rubyzip (~> 1.2, >= 1.2.2)
|
||||
shellany (0.0.1)
|
||||
shoulda-matchers (2.8.0)
|
||||
activesupport (>= 3.0.0)
|
||||
@@ -705,7 +705,7 @@ GEM
|
||||
simplecov-html (0.10.2)
|
||||
skylight (1.7.2)
|
||||
activesupport (>= 3.0.0)
|
||||
spinjs-rails (1.3)
|
||||
spinjs-rails (1.4)
|
||||
rails (>= 3.1)
|
||||
spreadsheet (1.1.7)
|
||||
ruby-ole (>= 1.0)
|
||||
@@ -812,7 +812,7 @@ DEPENDENCIES
|
||||
guard-rspec (~> 4.7.3)
|
||||
haml
|
||||
i18n (~> 0.6.11)
|
||||
i18n-js (~> 3.1.0)
|
||||
i18n-js (~> 3.2.1)
|
||||
immigrant
|
||||
jquery-migrate-rails
|
||||
jquery-rails (= 3.0.0)
|
||||
|
||||
@@ -1 +1 @@
|
||||
angular.module("admin.subscriptions", ['ngResource','admin.indexUtils','admin.dropdown'])
|
||||
angular.module("admin.subscriptions", ['ngResource','admin.indexUtils','admin.dropdown', 'admin.utils'])
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
angular.module("admin.utils").filter "localizeCurrency", (currencyConfig)->
|
||||
# Convert number to string currency using injected currency configuration.
|
||||
(amount) ->
|
||||
# Set country code (eg. "US").
|
||||
currency_code = if currencyConfig.display_currency then " " + currencyConfig.currency else ""
|
||||
# Set decimal points, 2 or 0 if hide_cents.
|
||||
decimals = if currencyConfig.hide_cents == "true" then 0 else 2
|
||||
# Set format if the currency symbol should come after the number, otherwise (default) use the locale setting.
|
||||
format = if currencyConfig.symbol_position == "after" then "%n %u" else undefined
|
||||
# We need to use parseFloat as the amount should come in as a string.
|
||||
amount = parseFloat(amount)
|
||||
|
||||
# Build the final price string.
|
||||
I18n.toCurrency(amount, {precision: decimals, unit: currencyConfig.symbol, format: format}) + currency_code
|
||||
@@ -84,7 +84,8 @@ module Admin
|
||||
directory = 'tmp/product_import'
|
||||
Dir.mkdir(directory) unless File.exist?(directory)
|
||||
File.open(Rails.root.join(directory, filename + extension), 'wb') do |f|
|
||||
f.write(upload.read)
|
||||
data = UploadSanitizer.new(upload.read).call
|
||||
f.write(data)
|
||||
f.path
|
||||
end
|
||||
end
|
||||
|
||||
@@ -54,9 +54,7 @@ Spree::Admin::OrdersController.class_eval do
|
||||
end
|
||||
|
||||
def invoice
|
||||
pdf = render_to_string pdf: "invoice-#{@order.number}.pdf",
|
||||
template: invoice_template,
|
||||
formats: [:html], encoding: "UTF-8"
|
||||
pdf = InvoiceRenderer.new.render_to_string(@order)
|
||||
|
||||
Spree::OrderMailer.invoice_email(@order.id, pdf).deliver
|
||||
flash[:success] = t('admin.orders.invoice_email_sent')
|
||||
@@ -65,7 +63,7 @@ Spree::Admin::OrdersController.class_eval do
|
||||
end
|
||||
|
||||
def print
|
||||
render pdf: "invoice-#{@order.number}", template: invoice_template, encoding: "UTF-8"
|
||||
render InvoiceRenderer.new.args(@order)
|
||||
end
|
||||
|
||||
def print_ticket
|
||||
@@ -78,10 +76,6 @@ Spree::Admin::OrdersController.class_eval do
|
||||
|
||||
private
|
||||
|
||||
def invoice_template
|
||||
Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice"
|
||||
end
|
||||
|
||||
def require_distributor_abn
|
||||
unless @order.distributor.abn.present?
|
||||
flash[:error] = t(:must_have_valid_business_number, enterprise_name: @order.distributor.name)
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
Spree::Api::OrdersController.class_eval do
|
||||
|
||||
# We need to add expections for collection actions other than :index here
|
||||
# because Spree's API controller causes authorize_read! to be called, which
|
||||
# results in an ActiveRecord::NotFound Exception as the order object is not
|
||||
# defined for collection actions
|
||||
end
|
||||
@@ -65,6 +65,10 @@ module Admin
|
||||
admin_inject_json_ams_array opts[:module], "columns", column_preferences, Api::Admin::ColumnPreferenceSerializer
|
||||
end
|
||||
|
||||
def admin_inject_currency_config
|
||||
admin_inject_json_ams 'admin.utils', "currencyConfig", {}, Api::CurrencyConfigSerializer
|
||||
end
|
||||
|
||||
def admin_inject_enterprise_permissions
|
||||
permissions =
|
||||
{can_manage_shipping_methods: can?(:manage_shipping_methods, @enterprise),
|
||||
|
||||
@@ -175,7 +175,7 @@ module ProductImport
|
||||
assign_errors product.errors.full_messages, entry.line_number
|
||||
end
|
||||
|
||||
@already_created[entry.enterprise_id] = { entry.name => product.id }
|
||||
@already_created.deep_merge! entry.enterprise_id => { entry.name => product.id }
|
||||
end
|
||||
|
||||
def save_variant(entry)
|
||||
@@ -212,12 +212,20 @@ module ProductImport
|
||||
case setting['mode']
|
||||
when 'overwrite_all'
|
||||
object.assign_attributes(attribute => setting['value'])
|
||||
# In case of new products, some attributes are saved on the variant.
|
||||
# We write them to the entry here to be copied to the variant later.
|
||||
if entry.respond_to? "#{attribute}="
|
||||
entry.public_send("#{attribute}=", setting['value'])
|
||||
end
|
||||
when 'overwrite_empty'
|
||||
if object.public_send(attribute).blank? ||
|
||||
((attribute == 'on_hand' || attribute == 'count_on_hand') &&
|
||||
entry.on_hand_nil)
|
||||
|
||||
object.assign_attributes(attribute => setting['value'])
|
||||
if entry.respond_to? "#{attribute}="
|
||||
entry.public_send("#{attribute}=", setting['value'])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/ insert_before "div#wrapper"
|
||||
|
||||
= admin_inject_currency_config
|
||||
@@ -1,5 +1,4 @@
|
||||
class BulkInvoiceService
|
||||
include WickedPdf::PdfHelper
|
||||
attr_reader :id
|
||||
|
||||
def initialize
|
||||
@@ -11,10 +10,7 @@ class BulkInvoiceService
|
||||
orders = Spree::Order.where(id: order_ids)
|
||||
|
||||
orders.each do |order|
|
||||
invoice = renderer.render_to_string pdf: "invoice-#{order.number}.pdf",
|
||||
template: invoice_template,
|
||||
formats: [:html], encoding: "UTF-8",
|
||||
locals: { :@order => order }
|
||||
invoice = renderer.render_to_string(order)
|
||||
|
||||
pdf << CombinePDF.parse(invoice)
|
||||
end
|
||||
@@ -42,11 +38,7 @@ class BulkInvoiceService
|
||||
end
|
||||
|
||||
def renderer
|
||||
ApplicationController.new
|
||||
end
|
||||
|
||||
def invoice_template
|
||||
Spree::Config.invoice_style2? ? "spree/admin/orders/invoice2" : "spree/admin/orders/invoice"
|
||||
@renderer ||= InvoiceRenderer.new
|
||||
end
|
||||
|
||||
def file_directory
|
||||
|
||||
29
app/services/invoice_renderer.rb
Normal file
29
app/services/invoice_renderer.rb
Normal file
@@ -0,0 +1,29 @@
|
||||
class InvoiceRenderer
|
||||
def render_to_string(order)
|
||||
renderer.render_to_string(args(order))
|
||||
end
|
||||
|
||||
def args(order)
|
||||
{
|
||||
pdf: "invoice-#{order.number}.pdf",
|
||||
template: invoice_template,
|
||||
formats: [:html],
|
||||
encoding: "UTF-8",
|
||||
locals: { :@order => order }
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def renderer
|
||||
ApplicationController.new
|
||||
end
|
||||
|
||||
def invoice_template
|
||||
if Spree::Config.invoice_style2?
|
||||
"spree/admin/orders/invoice2"
|
||||
else
|
||||
"spree/admin/orders/invoice"
|
||||
end
|
||||
end
|
||||
end
|
||||
18
app/services/upload_sanitizer.rb
Normal file
18
app/services/upload_sanitizer.rb
Normal file
@@ -0,0 +1,18 @@
|
||||
# Formats uploaded files to UTF-8 encoding and strips unexpected BOM characters.
|
||||
# Takes an open File object as input
|
||||
class UploadSanitizer
|
||||
def initialize(upload)
|
||||
@data = upload
|
||||
end
|
||||
|
||||
def call
|
||||
@data.force_encoding('UTF-8')
|
||||
strip_bom_character
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def strip_bom_character
|
||||
@data.gsub("\xEF\xBB\xBF".force_encoding("UTF-8"), '')
|
||||
end
|
||||
end
|
||||
@@ -19,7 +19,7 @@
|
||||
%div{ ng: { bind: "::orderCycleCloses(proxyOrder.order_cycle_id)" } }
|
||||
%td.text-center
|
||||
%span.state{ ng: { class: "proxyOrder.state", bind: 'stateText(proxyOrder.state)' } }
|
||||
%td.text-center{ ng: { bind: '(proxyOrder.total || subscription.estimatedTotal()) | currency' } }
|
||||
%td.text-center{ ng: { bind: '(proxyOrder.total || subscription.estimatedTotal()) | localizeCurrency' } }
|
||||
%td.actions
|
||||
%a.edit-order.icon-edit.no-text{ href: '{{::proxyOrder.edit_path}}', target: '_blank', 'ofn-with-tip' => t(:edit_order), confirm_order_edit: true }
|
||||
%a.cancel-order.icon-remove.no-text{ href: 'javascript:void(0)', ng: { hide: "proxyOrder.state == 'canceled'", click: "cancelOrder(proxyOrder)" }, 'ofn-with-tip' => t(:cancel_order) }
|
||||
|
||||
@@ -75,9 +75,9 @@
|
||||
.description {{ item.description }}
|
||||
.not-in-open-and-upcoming-order-cycles-warning{ ng: { if: '!item.in_open_and_upcoming_order_cycles' } }
|
||||
= t(".no_open_or_upcoming_order_cycle")
|
||||
%td.price.align-center {{ item.price_estimate | currency }}
|
||||
%td.price.align-center {{ item.price_estimate | localizeCurrency }}
|
||||
%td.quantity {{ item.quantity }}
|
||||
%td.total.align-center {{ (item.price_estimate * item.quantity) | currency }}
|
||||
%td.total.align-center {{ (item.price_estimate * item.quantity) | localizeCurrency }}
|
||||
%tbody#subtotal.no-border-top{"data-hook" => "admin_order_form_subtotal"}
|
||||
%tr#subtotal-row
|
||||
%td{:colspan => "3"}
|
||||
@@ -85,7 +85,7 @@
|
||||
= t(:subtotal)
|
||||
\:
|
||||
%td.total.align-center
|
||||
%span {{ subscription.estimatedSubtotal() | currency }}
|
||||
%span {{ subscription.estimatedSubtotal() | localizeCurrency }}
|
||||
%tbody#order-total.grand-total.no-border-top{"data-hook" => "admin_order_form_total"}
|
||||
%tr
|
||||
%td{:colspan => "3"}
|
||||
@@ -93,6 +93,6 @@
|
||||
= t(:order_total_price)
|
||||
\:
|
||||
%td.total.align-center
|
||||
%span#order_form_total {{ subscription.estimatedTotal() | currency }}
|
||||
%span#order_form_total {{ subscription.estimatedTotal() | localizeCurrency }}
|
||||
%p.notice
|
||||
= t "this_is_an_estimate", scope: 'admin.subscriptions.subscription_line_items'
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
.description {{ item.description }}
|
||||
.not-in-open-and-upcoming-order-cycles-warning{ ng: { if: '!item.in_open_and_upcoming_order_cycles' } }
|
||||
= t(".not_in_open_and_upcoming_order_cycles_warning")
|
||||
%td.price.align-center {{ item.price_estimate | currency }}
|
||||
%td.price.align-center {{ item.price_estimate | localizeCurrency }}
|
||||
%td.quantity
|
||||
%input{ name: 'quantity', type: 'number', min: 0, ng: { model: 'item.quantity' } }
|
||||
%td.total.align-center {{ (item.price_estimate * item.quantity) | currency }}
|
||||
%td.total.align-center {{ (item.price_estimate * item.quantity) | localizeCurrency }}
|
||||
%td.actions
|
||||
%a.delete-item.icon-trash.no-text{ ng: { click: 'removeSubscriptionLineItem(item)'}, :href => "javascript:void(0)" }
|
||||
%tbody#subtotal.no-border-top{"data-hook" => "admin_order_form_subtotal"}
|
||||
@@ -32,7 +32,7 @@
|
||||
= t(:subtotal)
|
||||
\:
|
||||
%td.total.align-center
|
||||
%span#order_subtotal {{ subscription.estimatedSubtotal() | currency }}
|
||||
%span#order_subtotal {{ subscription.estimatedSubtotal() | localizeCurrency }}
|
||||
%td.actions
|
||||
%tbody#fees.no-border-top{ ng: { show: "subscription.estimatedFees() > 0" } }
|
||||
%tr#fees-row
|
||||
@@ -41,7 +41,7 @@
|
||||
= t(:fees)
|
||||
\:
|
||||
%td.total.align-center
|
||||
%span#order_fees {{ subscription.estimatedFees() | currency }}
|
||||
%span#order_fees {{ subscription.estimatedFees() | localizeCurrency }}
|
||||
%td.actions
|
||||
%tbody#order-total.grand-total.no-border-top{"data-hook" => "admin_order_form_total"}
|
||||
%tr
|
||||
@@ -50,7 +50,7 @@
|
||||
= t(:order_total_price)
|
||||
\:
|
||||
%td.total.align-center
|
||||
%span#order_form_total {{ subscription.estimatedTotal() | currency }}
|
||||
%span#order_form_total {{ subscription.estimatedTotal() | localizeCurrency }}
|
||||
%td.actions
|
||||
%p.notice
|
||||
= t ".this_is_an_estimate"
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
%tr
|
||||
%td
|
||||
= render 'spree/shared/line_item_name', line_item: item
|
||||
%br
|
||||
%small
|
||||
%em= raw(item.variant.product.supplier.name)
|
||||
%td{:align => "right"}
|
||||
= item.quantity
|
||||
%td{:align => "right"}
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
%tr
|
||||
%td
|
||||
= render 'spree/shared/line_item_name', line_item: item
|
||||
%br
|
||||
%small
|
||||
%em= raw(item.variant.product.supplier.name)
|
||||
%td{:align => "right"}
|
||||
= item.quantity
|
||||
%td{:align => "right"}
|
||||
|
||||
@@ -442,6 +442,7 @@ ca:
|
||||
tax_category: Categoria d'impostos
|
||||
inherits_properties?: Hereda propietats?
|
||||
available_on: Disponible el
|
||||
av_on: "Disp. via"
|
||||
import_date: S'ha importat
|
||||
upload_an_image: Penja una imatge
|
||||
product_search_keywords: Paraules clau de cerca de producte
|
||||
@@ -475,6 +476,8 @@ ca:
|
||||
inventory_no_permission: no tens el permís per crear inventari per a aquesta productora
|
||||
none_saved: no s'han desat cap producte amb èxit
|
||||
line_number: "Línia %{number}:"
|
||||
encoding_error: "Comproveu la configuració de l'idioma del vostre fitxer d'origen i assegureu-vos que es desa amb la codificació UTF-8"
|
||||
unexpected_error: "La importació de productes ha detectat un error inesperat mentre obria el fitxer: %{error_message}"
|
||||
index:
|
||||
select_file: Selecciona un full de càlcul per pujar-lo
|
||||
spreadsheet: Full de càlcul
|
||||
@@ -966,6 +969,9 @@ ca:
|
||||
orders_and_distributors:
|
||||
name: Comandes i distribuïdores
|
||||
description: Comandes amb detalls de la distribuïdora
|
||||
bulk_coop:
|
||||
name: Compra grupal
|
||||
description: Informes per a comandes de compra grupal
|
||||
payments:
|
||||
name: Informes de pagament
|
||||
description: Informes per a pagaments
|
||||
@@ -1023,6 +1029,7 @@ ca:
|
||||
this_is_an_estimate: |
|
||||
Els preus que es mostren són només una estimació i es calculen en el moment en què es canvia la subscripció.
|
||||
Si canvieu els preus o les comissions, les comandes s'actualitzaran, però la subscripció continuarà mostrant els valors anteriors.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "No hi ha cicles de comandes oberts o futurs per a aquest producte."
|
||||
details:
|
||||
details: Detalls
|
||||
invalid_error: Oops! Si us plau ompliu tots els camps obligatoris ...
|
||||
@@ -1037,6 +1044,7 @@ ca:
|
||||
details: Detalls
|
||||
address: Adreça
|
||||
products: 'Productes '
|
||||
no_open_or_upcoming_order_cycle: "No hi ha cap cicle de comandes proper"
|
||||
product_already_in_order: Aquest producte ja s'ha afegit a la comanda. Editeu-ne la quantitat directament.
|
||||
orders:
|
||||
number: Número
|
||||
@@ -1128,6 +1136,7 @@ ca:
|
||||
card_could_not_be_saved: no s'ha pogut desar la targeta
|
||||
spree_gateway_error_flash_for_checkout: "Hi ha hagut un problema amb la vostra informació de pagament: %{error}"
|
||||
invoice_billing_address: "Adreça de facturació:"
|
||||
invoice_column_tax: "IVA"
|
||||
invoice_column_price: "Preu"
|
||||
invoice_column_item: "Article"
|
||||
invoice_column_qty: "Quantitat"
|
||||
@@ -1136,10 +1145,13 @@ ca:
|
||||
invoice_column_price_with_taxes: "Preu total (IVA inclòs)"
|
||||
invoice_column_price_without_taxes: "Preu total (sense impostos)"
|
||||
invoice_column_tax_rate: "Taxa d'impost"
|
||||
invoice_tax_total: "Total IVA:"
|
||||
tax_invoice: "FACTURA D'IMPOSTOS"
|
||||
tax_total: "Impost total (%{rate}):"
|
||||
total_excl_tax: "Total (impostos exclòs):"
|
||||
total_incl_tax: "Total (impost inclòs):"
|
||||
abn: "NIF:"
|
||||
acn: "IVA intracomunitari:"
|
||||
invoice_issued_on: "Factura emesa el:"
|
||||
order_number: "Nombre de factura:"
|
||||
date_of_transaction: "Data de la transacció:"
|
||||
@@ -1233,6 +1245,7 @@ ca:
|
||||
card_securitycode: "Codi de seguretat"
|
||||
card_expiry_date: Data de caducitat
|
||||
card_masked_digit: "X"
|
||||
card_expiry_abbreviation: "Exp"
|
||||
new_credit_card: "Nova targeta de crèdit"
|
||||
my_credit_cards: Les meves targetes de crèdit
|
||||
add_new_credit_card: 'Afegeix una nova targeta de crèdit '
|
||||
@@ -1275,6 +1288,7 @@ ca:
|
||||
cookie_analytics_utmc_desc: "No s'utilitza a ga.js. Estableix la interoperabilitat amb urchin.js. Històricament, aquesta cookie funcionava juntament amb la cookie __utmb per determinar si l'usuari estava en una nova sessió / visita."
|
||||
cookie_analytics_utmz_desc: "Emmagatzema l'origen del codi o la campanya que explica com l'usuari ha arribat al vostre lloc. La cookie es crea quan s'executa i s'actualitza la biblioteca javascript cada vegada que s'envien dades a Google Analytics."
|
||||
cookie_matomo_basics_desc: "Les primeres cookies de Matomo per recollir estadístiques."
|
||||
cookie_matomo_heatmap_desc: "Galeta d'enregistrament de sessió i heatmap de Matomo"
|
||||
cookie_matomo_ignore_desc: "La cookie usada per excloure l'usuari de ser seguit."
|
||||
disabling_cookies_header: "Advertència sobre la desactivació de cookies"
|
||||
disabling_cookies_desc: "Com a usuari sempre podeu permetre, bloquejar o eliminar les cookies Open Food Network o qualsevol altra pàgina web sempre que vulgueu mitjançant el control de configuració del vostre navegador. Cada navegador té una operativa diferent. Aquests són els enllaços:"
|
||||
@@ -1586,6 +1600,7 @@ ca:
|
||||
sell_hubs_detail: "Configura un perfil per a la teva organització alimentària a Katuma. En qualsevol moment, pots modificar i convertir el teu perfil en una botiga de diverses productores."
|
||||
sell_groups_detail: "Configura un directori personalitzat d'empreses (productores i altres empreses alimentàries) per a la teva regió o per a la teva xarxa, organització."
|
||||
sell_user_guide: "Troba més informació a la nostra Guia d'usuari."
|
||||
sell_listing_price: "Aparèixer a OFN és gratuït. Obrir i executar una botiga a OFN és gratuït. La configuració d'un directori de grup d'OFN per a la vostra organització o xarxa regional és gratuït."
|
||||
sell_embed: "També podem incrustar una botiga OFN al vostre web personalitzat o crear un lloc web personalitzat de la xarxa alimentària per a la teva regió."
|
||||
sell_ask_services: "Pregunta'ns sobre els serveis d'OFN."
|
||||
shops_title: Botigues
|
||||
@@ -1608,6 +1623,7 @@ ca:
|
||||
orders_edit_continue: Continuar comprant
|
||||
orders_edit_checkout: Realitza la compra
|
||||
orders_form_empty_cart: "Cistella buida"
|
||||
orders_form_subtotal: Subtotal
|
||||
orders_form_admin: Administració i manipulació
|
||||
orders_form_total: Total
|
||||
orders_oc_expired_headline: S'han tancat les comandes per a aquest cicle de comanda
|
||||
@@ -1672,6 +1688,7 @@ ca:
|
||||
error_not_found_in_database: "%{name} no s'ha trobat a la base de dades"
|
||||
error_not_primary_producer: "%{name} no està habilitat com a productora"
|
||||
error_no_permission_for_enterprise: "\"%{name}\": no tens permís per gestionar els productes d'aquesta organització"
|
||||
item_handling_fees: "Comissions de gestió d'articles (incloses en els totals d'articles)"
|
||||
january: "Gener"
|
||||
february: "Febrer"
|
||||
march: "Març"
|
||||
@@ -1693,6 +1710,7 @@ ca:
|
||||
confirm_password: "Confirma la contrassenya"
|
||||
action_signup: "Registra't ara"
|
||||
welcome_to_ofn: "Benvingut a la xarxa Open Food Network!"
|
||||
signup_or_login: "Comenceu registrant-vos (o iniciant sessió)"
|
||||
have_an_account: "Ja tens un compte?"
|
||||
action_login: "Inicia la sessió ara."
|
||||
forgot_password: "Has oblidat la contrasenya?"
|
||||
@@ -1806,6 +1824,7 @@ ca:
|
||||
enterprise_final_step: "Pas final!"
|
||||
enterprise_social_text: "Com poden la gent trobar %{enterprise}en línia?"
|
||||
website: "Lloc web"
|
||||
website_placeholder: "per exemple: katuma.org"
|
||||
facebook: "Facebook"
|
||||
facebook_placeholder: "p .ex: www.facebook.com/NomDeLaPàgina"
|
||||
linkedin: "LinkedIn"
|
||||
@@ -1831,6 +1850,7 @@ ca:
|
||||
registration_finished_headline: "Acabat!"
|
||||
registration_finished_thanks: "Gràcies per omplir els detalls de%{enterprise}."
|
||||
registration_finished_login: "Pots canviar o actualitzar la teva organització en qualsevol moment accedint a Katuma i anant a Admin."
|
||||
registration_finished_action: "Inici"
|
||||
registration_contact_name: 'Nom de contacte'
|
||||
registration_type_headline: "El darrer pas per afegir %{enterprise}!"
|
||||
registration_type_question: "Ets productora?"
|
||||
@@ -1865,11 +1885,14 @@ ca:
|
||||
accounts_and_billing_start_task_notice: "Tasca en cua"
|
||||
fees: "Tarifes"
|
||||
item_cost: "Cost de l'article"
|
||||
bulk: "A granel"
|
||||
shop_variant_quantity_min: "min"
|
||||
shop_variant_quantity_max: "màx"
|
||||
follow: "Segueix"
|
||||
shop_for_products_html: "Compra productes de <span class = \"turquesa\"> %{enterprise} </ span> a:"
|
||||
change_shop: "Canvia la botiga a:"
|
||||
shop_at: "Compra ara a:"
|
||||
price_breakdown: "Desglossament complet del preu"
|
||||
admin_fee: "Comissió d'administració"
|
||||
sales_fee: "Comissió de venda"
|
||||
packing_fee: "Comissió d'embalatge"
|
||||
@@ -1877,17 +1900,21 @@ ca:
|
||||
fundraising_fee: "Comissió d'autogestió"
|
||||
price_graph: "Gràfic de preus"
|
||||
included_tax: "Impostos incloses"
|
||||
balance: "Balanç"
|
||||
transaction: "Transacció"
|
||||
transaction_date: "Data"
|
||||
payment_state: "Estat del pagament"
|
||||
shipping_state: "Estat d'enviament"
|
||||
value: "Valor"
|
||||
balance_due: "A pagar"
|
||||
credit: "Crèdit"
|
||||
Paid: "Pagat"
|
||||
Ready: "Llest"
|
||||
ok: D'acord
|
||||
not_visible: no visible
|
||||
you_have_no_orders_yet: "Encara no tens comandes"
|
||||
running_balance: "Balanç corrent"
|
||||
outstanding_balance: "Balanç pendent"
|
||||
admin_enterprise_relationships: "Permisos de l'organització"
|
||||
admin_enterprise_relationships_everything: "Marcar tots"
|
||||
admin_enterprise_relationships_permits: "Permet"
|
||||
@@ -1896,6 +1923,7 @@ ca:
|
||||
admin_enterprise_groups: "Grups d'organització"
|
||||
admin_enterprise_groups_name: "Nom"
|
||||
admin_enterprise_groups_owner: "Propietària"
|
||||
admin_enterprise_groups_on_front_page: "A la primera pàgina?"
|
||||
admin_enterprise_groups_enterprise: "Organitzacions"
|
||||
admin_enterprise_groups_data_powertip: "La usuària principal responsable d'aquest grup."
|
||||
admin_enterprise_groups_data_powertip_logo: "Això és el logotip del grup"
|
||||
@@ -1920,6 +1948,7 @@ ca:
|
||||
supplier: "Proveïdora"
|
||||
product_name: "Nom del producte"
|
||||
product_description: "Descripció del producte"
|
||||
units: "Mida d'unitat"
|
||||
coordinator: "Coordinador"
|
||||
distributor: "Distribuïdora"
|
||||
enterprise_fees: "Honoraris de l'organització"
|
||||
@@ -1934,6 +1963,7 @@ ca:
|
||||
flat_rate_per_item: "Tarifa fixa (per article)"
|
||||
flat_rate_per_order: "Tarifa fixa (per comanda)"
|
||||
flexible_rate: "Tarifa Flexible"
|
||||
price_sack: "Preu sac"
|
||||
new_order_cycles: "Nou cicle de comanda"
|
||||
new_order_cycle: "Nou cicle de comanda"
|
||||
select_a_coordinator_for_your_order_cycle: "Selecciona una coordinadora per al vostre cicle de comanda"
|
||||
@@ -1978,21 +2008,29 @@ ca:
|
||||
spree_admin_overview_check_your_inbox: "Si us plat comproveu la vostra safata d'entrada per obtenir més instruccions. Gràcies!"
|
||||
spree_admin_unit_value: Valor de la unitat
|
||||
spree_admin_unit_description: Descripció de la unitat
|
||||
spree_admin_variant_unit: Unitat de variants
|
||||
spree_admin_variant_unit_scale: Escala de unitat de variants
|
||||
spree_admin_supplier: Proveïdora
|
||||
spree_admin_product_category: Categoria del producte
|
||||
spree_admin_variant_unit_name: Nom de unitat de variants
|
||||
change_package: "Canvia el perfil"
|
||||
spree_admin_single_enterprise_hint: "Suggeriment: per permetre que la gent us trobi, activeu la vostra visibilitat"
|
||||
spree_admin_eg_pickup_from_school: "p. ex: 'Recollida al local del grup de consum'"
|
||||
spree_admin_eg_collect_your_order: "p. ex: \"Recolliu la vostra comanda al c/Ample, n. 123'"
|
||||
spree_classification_primary_taxon_error: "El taxó %{taxon} és el principal taxó d'%{product} i no es pot eliminar"
|
||||
spree_order_availability_error: "La distribuïdora o el cicle de comanda no pot subministrar els productes de la vostra cistella"
|
||||
spree_order_populator_error: "Aquesta distribuïdora o cicle de comanda no pot subministrar tots els productes de la vostra cistella. Si us plau trieu-ne d'altres."
|
||||
spree_order_populator_availability_error: "Aquest producte no està disponible des de la distribuïdora o cicle de comanda seleccionat."
|
||||
spree_distributors_error: "Cal seleccionar almenys un grup"
|
||||
spree_user_enterprise_limit_error: "^ %{email} no està autoritzat a tenir més organitzacions (el límit és %{enterprise_limit})."
|
||||
spree_variant_product_error: ha de tenir com a mínim una variant
|
||||
your_profil_live: "El teu perfil online"
|
||||
on_ofn_map: "al mapa d'Open Food Network"
|
||||
see: "Veure"
|
||||
live: "online"
|
||||
manage: "Gestiona"
|
||||
resend: "Reenviar"
|
||||
trial: Prova
|
||||
add_and_manage_products: "Afegeix & gestiona productes"
|
||||
add_and_manage_order_cycles: "Afegeix & gestiona cicles de comanda"
|
||||
manage_order_cycles: "Gestiona els cicles de comanda"
|
||||
@@ -2001,10 +2039,16 @@ ca:
|
||||
edit_profile_details_etc: "Canvia la descripció del perfil, les imatges, etc."
|
||||
order_cycle: "Cicle de Comanda"
|
||||
order_cycles: "Cicles de comanda"
|
||||
enterprise_relationships: "Permisos d'organització"
|
||||
remove_tax: "Suprimeix comissions"
|
||||
first_name_begins_with: "El nom comença amb"
|
||||
last_name_begins_with: "El cognom comença amb"
|
||||
enterprise_tos_link: "Enllaç a les condicions d'ús de l'organització"
|
||||
enterprise_tos_message: "Volem treballar amb persones que comparteixen els nostres objectius i valors. Com a tal, demanem a les noves organitzacions que acceptin la nostra"
|
||||
enterprise_tos_link_text: "Termes del servei."
|
||||
enterprise_tos_agree: "Accepto els Termes i condicions anteriors"
|
||||
tax_settings: "Configuració fiscal"
|
||||
products_require_tax_category: "els productes requereixen una categoria fiscal"
|
||||
admin_shared_address_1: "Adreça"
|
||||
admin_shared_address_2: "Adreça (cont.)"
|
||||
admin_share_city: "Municipi"
|
||||
@@ -2075,11 +2119,16 @@ ca:
|
||||
report_header_special_instructions: Instruccions especials
|
||||
report_header_order_number: Número de comanda
|
||||
report_header_date: Data
|
||||
report_header_confirmation_date: Data de confirmació
|
||||
report_header_tags: Etiquetes
|
||||
report_header_items: Articles
|
||||
report_header_items_total: "Total d'articles %{currency_symbol}"
|
||||
report_header_taxable_items_total: "Total d'articles subjectes a impostos (%{currency_symbol})"
|
||||
report_header_sales_tax: "Impost sobre vendes (%{currency_symbol})"
|
||||
report_header_delivery_charge: "Càrrec de lliurament (%{currency_symbol})"
|
||||
report_header_tax_on_delivery: "Impost sobre el lliurament (%{currency_symbol})"
|
||||
report_header_tax_on_fees: "Impost sobre les tarifes (%{currency_symbol})"
|
||||
report_header_total_tax: "Impost total (%{currency_symbol})"
|
||||
report_header_enterprise: Organització
|
||||
report_header_customer: Consumidora
|
||||
report_header_customer_code: Codi de la consumidora
|
||||
@@ -2092,23 +2141,32 @@ ca:
|
||||
report_header_variant_unit: Unitat de la variant
|
||||
report_header_total_available: Total disponible
|
||||
report_header_unallocated: Sense assignar
|
||||
report_header_max_quantity_excess: Quantitat màxima d'excés
|
||||
report_header_taxons: Taxons
|
||||
report_header_supplier: Proveïdora
|
||||
report_header_producer: Productora
|
||||
report_header_producer_suburb: barri de la productora
|
||||
report_header_unit: Unitat
|
||||
report_header_group_buy_unit_quantity: Quantitat de la unitat de compra del grup
|
||||
report_header_cost: Cost
|
||||
report_header_shipping_cost: Despeses d'enviament
|
||||
report_header_curr_cost_per_unit: Cost per unitat
|
||||
report_header_total_shipping_cost: Cost total d'enviament
|
||||
report_header_payment_method: Mètode de pagament
|
||||
report_header_sells: Ven
|
||||
report_header_visible: Visible
|
||||
report_header_price: Preu
|
||||
report_header_unit_size: Mida d'unitat
|
||||
report_header_distributor: Distribuïdora
|
||||
report_header_distributor_address: Adreça de la distribuïdora
|
||||
report_header_distributor_city: Ciutat de la distribuïdora
|
||||
report_header_distributor_postcode: Codi postal de la distribuïdora
|
||||
report_header_delivery_address: Adreça de lliurament
|
||||
report_header_delivery_postcode: Codi postal de lliurament
|
||||
report_header_bulk_unit_size: Mida de la unitat a granel
|
||||
report_header_weight: Pes
|
||||
report_header_sum_total: Suma total
|
||||
report_header_date_of_order: Data de la comanda
|
||||
report_header_amount_owing: Import adeutat
|
||||
report_header_amount_paid: Import pagat
|
||||
report_header_units_required: Unitats necessàries
|
||||
@@ -2124,20 +2182,47 @@ ca:
|
||||
report_header_payment_state: Estat del pagament
|
||||
report_header_payment_type: Tipus de pagament
|
||||
report_header_item_price: "Article (%{currency})"
|
||||
report_header_item_fees_price: "Article + Comissions (%{currency})"
|
||||
report_header_admin_handling_fees: "Administració i manipulació (%{currency})"
|
||||
report_header_ship_price: "Enviar (%{currency})"
|
||||
report_header_pay_fee_price: "Pagar comissió (%{currency})"
|
||||
report_header_total_price: "Total (%{currency})"
|
||||
report_header_product_total_price: "Total del producte (%{currency})"
|
||||
report_header_shipping_total_price: "Enviament total (%{currency})"
|
||||
report_header_outstanding_balance_price: "Balanç pendent (%{currency})"
|
||||
report_header_eft_price: "Transferència (%{currency})"
|
||||
report_header_paypal_price: "PayPal (%{currency})"
|
||||
report_header_sku: Número de referència (SKU)
|
||||
report_header_amount: Import
|
||||
report_header_balance: Balanç
|
||||
report_header_total_cost: "Cost total"
|
||||
report_header_total_ordered: Total demanat
|
||||
report_header_total_max: Máx Total
|
||||
report_header_total_units: Unitats totals
|
||||
report_header_sum_max_total: "Suma Max Total"
|
||||
report_header_total_excl_vat: "Total excl. impostos (%{currency_symbol})"
|
||||
report_header_total_incl_vat: "Total incl. impostos (%{currency_symbol})"
|
||||
report_header_temp_controlled: Control de temperatura?
|
||||
report_header_is_producer: Productor?
|
||||
report_header_not_confirmed: No confirmat
|
||||
report_header_gst_on_income: IVA sobre ingressos
|
||||
report_header_gst_free_income: Ingressos sense IVA
|
||||
report_header_total_untaxable_produce: Total de productes no tributables (sense impostos)
|
||||
report_header_total_taxable_produce: Total de productes tributables (IVA inclòs)
|
||||
report_header_total_untaxable_fees: Total de comissions no tributables (sense impostos)
|
||||
report_header_total_taxable_fees: Total de les comissions imposables (IVA inclòs)
|
||||
report_header_delivery_shipping_cost: Cost de l'enviament (impostos inclosos)
|
||||
report_header_transaction_fee: Comissió de transacció (sense impostos)
|
||||
report_header_total_untaxable_admin: Total d'ajustaments d'administració no imputables (sense impostos)
|
||||
report_header_total_taxable_admin: Total d'ajustaments administratius imposables (impostos inclosos)
|
||||
initial_invoice_number: "Número de la comanda inicial:"
|
||||
invoice_date: "Data del comprovant de compra:"
|
||||
due_date: "Data de venciment:"
|
||||
account_code: "Codi del compte:"
|
||||
equals: "És igual a"
|
||||
contains: "conté"
|
||||
discount: "Descompte"
|
||||
filter_products: "Productes de filtre"
|
||||
delete_product_variant: "L'última variant no es pot esborrar!"
|
||||
progress: "progressió"
|
||||
saving: "Desant..."
|
||||
@@ -2168,12 +2253,19 @@ ca:
|
||||
tag_rules: "Regles d'etiqueta"
|
||||
shop_preferences: "Preferències de la botiga"
|
||||
enterprise_fee_whole_order: Comanda sencera
|
||||
enterprise_fee_by: "Comissió %{type} per %{role} %{enterprise_name}"
|
||||
validation_msg_relationship_already_established: "^ Aquesta relació ja està establerta."
|
||||
validation_msg_at_least_one_hub: "^ Cal seleccionar com a mínim un grup"
|
||||
validation_msg_product_category_cant_be_blank: "^ La categoria de producte no pot estar en blanc"
|
||||
validation_msg_tax: "^ La categoria d'impostos és obligatòria"
|
||||
validation_msg_tax_category_cant_be_blank: "^ La categoria d'impostos no es pot deixar en blanc"
|
||||
validation_msg_is_associated_with_an_exising_customer: "Està associada amb una consumidora existent"
|
||||
content_configuration_pricing_table: "(TODO: Taula de preus)"
|
||||
content_configuration_case_studies: "(TODO: Casos d'estudi)"
|
||||
content_configuration_detail: "(TODO: detall)"
|
||||
enterprise_name_error: "ja ha estat agafat. Si aquesta és la vostra organització i voleu reclamar-ne la propietat o si voleu comerciar amb aquesta organització, poseu-vos en contacte amb l'administradora actual d'aquest perfil %{email}."
|
||||
enterprise_owner_error: "^ %{email} no està autoritzat a tenir més organitzacions (el límit és %{enterprise_limit})."
|
||||
enterprise_role_uniqueness_error: "^ Aquest rol ja està present."
|
||||
inventory_item_visibility_error: ha de ser veritable o falsa
|
||||
product_importer_file_error: "error: no s'ha carregat cap fitxer"
|
||||
product_importer_spreadsheet_error: "no s'ha pogut processar el fitxer: tipus de fitxer no vàlid"
|
||||
@@ -2182,7 +2274,17 @@ ca:
|
||||
product_import_no_data_in_spreadsheet_notice: 'No s''ha trobat cap dada al full de càlcul'
|
||||
order_choosing_hub_notice: El teu grup ha estat seleccionat.
|
||||
order_cycle_selecting_notice: S'ha seleccionat el teu cicle de comanda.
|
||||
adjustments_tax_rate_error: "^ Si us plau, comproveu que el tipus impositiu d'aquest ajust és correcte."
|
||||
active_distributors_not_ready_for_checkout_message_singular: >-
|
||||
El grup %{distributor_names} apareix en un cicle de comanda actiu, però no té
|
||||
mètodes de pagament i enviament vàlids. Fins que no ho configureu, els clients
|
||||
no podran comprar en aquest grup.
|
||||
active_distributors_not_ready_for_checkout_message_plural: >-
|
||||
Els grups %{distributor_names} s'enumeren en un cicle de comandes actiu, però
|
||||
no tenen mètodes de pagament i enviament vàlids. Fins que no ho configureu,
|
||||
els clients no podran comprar en aquests grups.
|
||||
enterprise_fees_update_notice: S'han actualitzat les comissions de l'organització.
|
||||
enterprise_fees_destroy_error: "Aquesta comissió d'organització no es pot eliminar perquè està referenciat per una distribució de producte: %{id} - %{name}."
|
||||
enterprise_register_package_error: "Si us plau, selecciona un perfil"
|
||||
enterprise_register_error: "No es pot completar el registre de %{enterprise}"
|
||||
enterprise_register_success_notice: "Enhorabona! El registre de %{enterprise} s'ha completat!"
|
||||
@@ -2221,6 +2323,7 @@ ca:
|
||||
choose: Escull
|
||||
resolve_errors: Si us plau, resol els errors següents
|
||||
more_items: "+ %{count} Més"
|
||||
default_card_updated: Targeta predeterminada actualitzada
|
||||
admin:
|
||||
enterprise_limit_reached: "Has assolit el límit estàndard d'organitzacions per compte. Escriu a %{contact_email} si necessites augmentar-lo."
|
||||
modals:
|
||||
@@ -2337,6 +2440,8 @@ ca:
|
||||
non_producer_desc: Totes les altres organitzacions alimentàries
|
||||
non_producer_example: 'p. ex: botigues de queviures, cooperatives d''aliments, grups de compra...'
|
||||
enterprise_status:
|
||||
status_title: "%{name} està configurat i llest!"
|
||||
severity: Severitat
|
||||
description: Descripció
|
||||
resolve: Resoldre
|
||||
new_tag_rule_dialog:
|
||||
@@ -2344,6 +2449,11 @@ ca:
|
||||
orders:
|
||||
index:
|
||||
per_page: "%{results} per pàgina"
|
||||
view_file: Mostra el fitxer
|
||||
compiling_invoices: Generant factures
|
||||
bulk_invoice_created: S'ha creat la factura conjunta
|
||||
bulk_invoice_failed: No s'ha pogut crear la factura conjunta
|
||||
please_wait: Espereu fins que el PDF estigui preparat abans de tancar aquesta finestra.
|
||||
resend_user_email_confirmation:
|
||||
resend: "Reenviar"
|
||||
sending: "Reenviar..."
|
||||
@@ -2368,6 +2478,9 @@ ca:
|
||||
hidden_products: "Productes ocults"
|
||||
new_products: "Nous productes"
|
||||
reset_stock_levels: Restablir els nivells d'existències a valors predeterminats
|
||||
changes_to: Canvis a
|
||||
one_override: una sobreescriptura
|
||||
overrides: sobreescriptures
|
||||
remain_unsaved: romanen sense desar.
|
||||
no_changes_to_save: No hi ha canvis per desar.
|
||||
no_authorisation: "No he pogut obtenir l'autorització per guardar aquests canvis, de manera que romanen sense desar."
|
||||
@@ -2391,6 +2504,10 @@ ca:
|
||||
add_products_to_inventory: "afegeix productes a l'inventari"
|
||||
resources:
|
||||
could_not_delete_customer: 'No s''ha pogut eliminar la consumidora'
|
||||
product_import:
|
||||
confirmation: |
|
||||
Això establirà el nivell d'estoc a zero en tots els productes per aquesta
|
||||
organització que no estan presents al fitxer carregat.
|
||||
order_cycles:
|
||||
create_failure: "No s'ha pogut crear el cicle de comanda"
|
||||
update_success: 'S''ha actualitzat el cicle de comanda.'
|
||||
@@ -2420,8 +2537,12 @@ ca:
|
||||
header:
|
||||
store: Botiga
|
||||
admin:
|
||||
product_properties:
|
||||
index:
|
||||
inherits_properties_checkbox_hint: "heredar propietats de %{supplier}? (llevat que es sobreescrigui a dalt)"
|
||||
orders:
|
||||
index:
|
||||
listing_orders: "Llistant comandes"
|
||||
new_order: "Nova comanda"
|
||||
capture: "Captura"
|
||||
ship: "Enviament"
|
||||
@@ -2429,11 +2550,13 @@ ca:
|
||||
note: "Nota"
|
||||
first: "Primer"
|
||||
last: "Últim"
|
||||
previous: "Anterior"
|
||||
next: "Següent"
|
||||
loading: "S'està carregant"
|
||||
no_orders_found: "No s'ha trobat cap comanda"
|
||||
results_found: "%{number} Resultats trobats."
|
||||
viewing: "Veient %{start} a %{end}."
|
||||
print_invoices: "Imprimir factures"
|
||||
invoice:
|
||||
issued_on: Publicat a
|
||||
tax_invoice: FACTURA D'IMPOSTOS
|
||||
@@ -2467,6 +2590,7 @@ ca:
|
||||
stripe_disabled_msg: Els pagaments de Stripe han estat inhabilitat per l'administrador del sistema.
|
||||
request_failed_msg: Ho sentim. S'ha produït un error en provar de verificar els detalls del compte amb Stripe...
|
||||
account_missing_msg: No hi ha cap compte de Stripe per a aquesta organització.
|
||||
connect_one: Connecta un
|
||||
access_revoked_msg: S'ha revocat l'accés a aquest compte de Stripe, si us plau torna a connectar el teu compte.
|
||||
status: Estat
|
||||
connected: Connectat
|
||||
@@ -2481,6 +2605,7 @@ ca:
|
||||
products:
|
||||
new:
|
||||
title: 'Nou producte'
|
||||
unit_name_placeholder: 'per exemple: manat'
|
||||
index:
|
||||
header:
|
||||
title: Edició de productes en bloc
|
||||
@@ -2496,15 +2621,27 @@ ca:
|
||||
tax_category: Categoria d'impostos
|
||||
inherits_properties?: Hereda propietats?
|
||||
available_on: Disponible el
|
||||
av_on: "Disp. via"
|
||||
import_date: "Data d'importació"
|
||||
products_variant:
|
||||
variant_has_n_overrides: "Aquesta variant té %{n} sobreescriptura/es"
|
||||
new_variant: "Nova variant"
|
||||
product_name: Nom del producte
|
||||
primary_taxon_form:
|
||||
product_category: Categoria del producte
|
||||
group_buy_form:
|
||||
group_buy: "Compra en grup?"
|
||||
bulk_unit_size: Mida de la unitat a granel
|
||||
display_as:
|
||||
display_as: Mostra com
|
||||
reports:
|
||||
table:
|
||||
select_and_search: "Seleccioneu els filtres i feu clic a %{option} per accedir a les vostres dades."
|
||||
bulk_coop:
|
||||
bulk_coop_supplier_report: 'Compra grupal - Totals per proveïdor'
|
||||
bulk_coop_allocation: 'Compra grupal - Assignació'
|
||||
bulk_coop_packing_sheets: 'Compra grupal - Fulls de preparació de cistelles'
|
||||
bulk_coop_customer_payments: 'Compra grupal - Pagaments de les consumidores'
|
||||
users:
|
||||
index:
|
||||
listing_users: "Llistat d'usuàries"
|
||||
@@ -2530,10 +2667,13 @@ ca:
|
||||
producer_name: Productor
|
||||
general_settings:
|
||||
edit:
|
||||
legal_settings: "Paràmetres legals"
|
||||
cookies_consent_banner_toggle: "Mostra banner de consentiment de cookies"
|
||||
privacy_policy_url: "URL de la política de privacitat "
|
||||
enterprises_require_tos: "Les organitzacions han d'acceptar les condicions del servei"
|
||||
cookies_policy_matomo_section: "Mostra la secció de Matomo a la pàgina de política de cookies"
|
||||
cookies_policy_ga_section: "Mostra la secció de Google Analytics a la pàgina de política de cookies"
|
||||
footer_tos_url: "URL de les condicions d'ús"
|
||||
checkout:
|
||||
payment:
|
||||
stripe:
|
||||
@@ -2542,6 +2682,9 @@ ca:
|
||||
used_saved_card: "Utilitza una targeta desada:"
|
||||
or_enter_new_card: "O bé introdueix els detalls d'una nova targeta:"
|
||||
remember_this_card: Recordar aquesta targeta?
|
||||
date_picker:
|
||||
format: '%d-% m-% Y'
|
||||
js_format: 'dd-mm-yy'
|
||||
inventory: Inventari
|
||||
orders:
|
||||
edit:
|
||||
@@ -2574,7 +2717,9 @@ ca:
|
||||
paused: en pausa
|
||||
canceled: cancel·lat
|
||||
payment_states:
|
||||
balance_due: a pagar
|
||||
completed: completat
|
||||
checkout: fer comanda
|
||||
credit_owed: crèdit a deure
|
||||
failed: error
|
||||
paid: pagat
|
||||
|
||||
@@ -2711,6 +2711,8 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
date_end_before_start_error: "must be after start"
|
||||
parameter_not_allowed_error: "You are not authorized to use one or more selected filters for this report."
|
||||
fee_calculated_on_transfer_through_all: "All"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Entire Orders through %{distributor}"
|
||||
tax_category_various: "Various"
|
||||
fee_type:
|
||||
payment_method: "Payment Transaction"
|
||||
shipping_method: "Shipment"
|
||||
|
||||
@@ -31,6 +31,16 @@ en_GB:
|
||||
on_demand_but_count_on_hand_set: "must be blank if on demand"
|
||||
limited_stock_but_no_count_on_hand: "must be specified because forcing limited stock"
|
||||
activemodel:
|
||||
attributes:
|
||||
order_management/reports/enterprise_fee_summary/parameters:
|
||||
start_at: "Start"
|
||||
end_at: "End"
|
||||
distributor_ids: "Hubs"
|
||||
producer_ids: "Pricing"
|
||||
order_cycle_ids: "Order Cycles"
|
||||
enterprise_fee_ids: "Fees Names"
|
||||
shipping_method_ids: "Shipping Methods"
|
||||
payment_method_ids: "Payment Methods"
|
||||
errors:
|
||||
models:
|
||||
subscription_validator:
|
||||
@@ -74,6 +84,13 @@ en_GB:
|
||||
models:
|
||||
order_cycle:
|
||||
cloned_order_cycle_name: "COPY OF %{order_cycle}"
|
||||
validators:
|
||||
date_time_string_validator:
|
||||
not_string_error: "must be a string"
|
||||
invalid_format_error: "must be valid"
|
||||
integer_array_validator:
|
||||
not_array_error: "must be an array"
|
||||
invalid_element_error: "must contain only valid integers"
|
||||
enterprise_mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm the email address for %{enterprise}"
|
||||
@@ -994,6 +1011,9 @@ en_GB:
|
||||
description: Invoices for import into Xero
|
||||
packing:
|
||||
name: Packing Reports
|
||||
enterprise_fee_summary:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
@@ -1027,6 +1047,7 @@ en_GB:
|
||||
this_is_an_estimate: |
|
||||
The displayed prices are only an estimate and calculated at the time the subscription is changed.
|
||||
If you change prices or fees, orders will be updated, but the subscription will still display the old values.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "There are no open or upcoming order cycles for this product."
|
||||
details:
|
||||
details: Details
|
||||
invalid_error: Oops! Please fill in all of the required fields...
|
||||
@@ -1041,6 +1062,7 @@ en_GB:
|
||||
details: Details
|
||||
address: Address
|
||||
products: Products
|
||||
no_open_or_upcoming_order_cycle: "No Upcoming Order Cycle"
|
||||
product_already_in_order: This product has already been added to the order. Please edit the quantity directly.
|
||||
orders:
|
||||
number: Number
|
||||
@@ -1159,8 +1181,8 @@ en_GB:
|
||||
menu_1_url: "/shops"
|
||||
menu_2_title: "Map"
|
||||
menu_2_url: "/map"
|
||||
menu_3_title: "Services"
|
||||
menu_3_url: "https://about.openfoodnetwork.org.uk/services"
|
||||
menu_3_title: "Pricing"
|
||||
menu_3_url: "https://about.openfoodnetwork.org.uk/pricing-and-plans"
|
||||
menu_4_title: "Groups"
|
||||
menu_4_url: "/groups"
|
||||
menu_5_title: "About"
|
||||
@@ -1996,7 +2018,6 @@ en_GB:
|
||||
spree_admin_enterprises_none_text: "You don't have any enterprises yet"
|
||||
spree_admin_enterprises_tabs_hubs: "HUBS"
|
||||
spree_admin_enterprises_producers_manage_products: "MANAGE PRODUCTS"
|
||||
spree_admin_enterprises_any_active_products_text: "You don't have any active products."
|
||||
spree_admin_enterprises_create_new_product: "CREATE A NEW PRODUCT"
|
||||
spree_admin_single_enterprise_alert_mail_confirmation: "Please confirm the email address for"
|
||||
spree_admin_single_enterprise_alert_mail_sent: "We've sent an email to"
|
||||
@@ -2525,6 +2546,45 @@ en_GB:
|
||||
producers:
|
||||
signup:
|
||||
start_free_profile: "Start with a free profile, and expand when you're ready!"
|
||||
order_management:
|
||||
reports:
|
||||
enterprise_fee_summary:
|
||||
date_end_before_start_error: "must be after start"
|
||||
parameter_not_allowed_error: "You are not authorised to use one or more selected filters for this report."
|
||||
fee_calculated_on_transfer_through_all: "All"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Entire Orders through %{distributor}"
|
||||
tax_category_various: "Various"
|
||||
fee_type:
|
||||
payment_method: "Payment Transaction"
|
||||
shipping_method: "Shipment"
|
||||
fee_placements:
|
||||
supplier: "Incoming"
|
||||
distributor: "Outgoing"
|
||||
coordinator: "Coordinator"
|
||||
tax_category_name:
|
||||
shipping_instance_rate: "Platform Rate"
|
||||
formats:
|
||||
csv:
|
||||
header:
|
||||
fee_type: "Fee Type"
|
||||
enterprise_name: "Enterprise Owner"
|
||||
fee_name: "Fee Name"
|
||||
customer_name: "Customer"
|
||||
fee_placement: "Fee Placement"
|
||||
fee_calculated_on_transfer_through_name: "Fee Calc on Transfer Through"
|
||||
tax_category_name: "Tax Category"
|
||||
total_amount: "$$ SUM"
|
||||
html:
|
||||
header:
|
||||
fee_type: "Fee Type"
|
||||
enterprise_name: "Enterprise Owner"
|
||||
fee_name: "Fee Name"
|
||||
customer_name: "Customer"
|
||||
fee_placement: "Fee Placement"
|
||||
fee_calculated_on_transfer_through_name: "Fee Calc on Transfer Through"
|
||||
tax_category_name: "Tax Category"
|
||||
total_amount: "$$ SUM"
|
||||
invalid_filter_parameters: "The filters you selected for this report are invalid."
|
||||
spree:
|
||||
email: Email
|
||||
account_updated: "Account updated!"
|
||||
@@ -2568,6 +2628,11 @@ en_GB:
|
||||
distributor: "Distributor:"
|
||||
order_cycle: "Order cycle:"
|
||||
overview:
|
||||
products:
|
||||
active_products:
|
||||
zero: "You don't have any active products."
|
||||
one: "You have one active product"
|
||||
other: "You have %{count} active products"
|
||||
order_cycles:
|
||||
order_cycles: "Order Cycles"
|
||||
order_cycles_tip: "Order cycles determine when and where your products are available to customers."
|
||||
@@ -2641,6 +2706,14 @@ en_GB:
|
||||
bulk_coop_allocation: 'Bulk Co-op - Allocation'
|
||||
bulk_coop_packing_sheets: 'Bulk Co-op - Packing Sheets'
|
||||
bulk_coop_customer_payments: 'Bulk Co-op - Customer Payments'
|
||||
enterprise_fee_summaries:
|
||||
filters:
|
||||
date_range: "Date Range"
|
||||
report_format_csv: "Download as CSV"
|
||||
generate_report: "Generate Report"
|
||||
report:
|
||||
none: "None"
|
||||
select_and_search: "Select filters and click on GENERATE REPORT to access your data."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Listing Users"
|
||||
|
||||
@@ -31,6 +31,16 @@ en_US:
|
||||
on_demand_but_count_on_hand_set: "must be blank if on demand"
|
||||
limited_stock_but_no_count_on_hand: "must be specified because forcing limited stock"
|
||||
activemodel:
|
||||
attributes:
|
||||
order_management/reports/enterprise_fee_summary/parameters:
|
||||
start_at: "Start"
|
||||
end_at: "End"
|
||||
distributor_ids: "Hubs"
|
||||
producer_ids: "Producers"
|
||||
order_cycle_ids: "Order Cycles"
|
||||
enterprise_fee_ids: "Fee Names"
|
||||
shipping_method_ids: "Shipping Methods"
|
||||
payment_method_ids: "Payment Methods"
|
||||
errors:
|
||||
models:
|
||||
subscription_validator:
|
||||
@@ -74,6 +84,13 @@ en_US:
|
||||
models:
|
||||
order_cycle:
|
||||
cloned_order_cycle_name: "COPY OF %{order_cycle}"
|
||||
validators:
|
||||
date_time_string_validator:
|
||||
not_string_error: "must be a string"
|
||||
invalid_format_error: "must be valid"
|
||||
integer_array_validator:
|
||||
not_array_error: "must be an array"
|
||||
invalid_element_error: "must contain only valid integers"
|
||||
enterprise_mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Please confirm the email address for %{enterprise}"
|
||||
@@ -994,6 +1011,9 @@ en_US:
|
||||
description: Invoices for import into Xero
|
||||
packing:
|
||||
name: Packing Reports
|
||||
enterprise_fee_summary:
|
||||
name: "Enterprise Fee Summary"
|
||||
description: "Summary of Enterprise Fees collected"
|
||||
subscriptions:
|
||||
subscriptions: Subscriptions
|
||||
new: New Subscription
|
||||
@@ -1027,6 +1047,7 @@ en_US:
|
||||
this_is_an_estimate: |
|
||||
The displayed prices are only an estimate and calculated at the time the subscription is changed.
|
||||
If you change prices or fees, orders will be updated, but the subscription will still display the old values.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "There are no open or upcoming order cycles for this product."
|
||||
details:
|
||||
details: Details
|
||||
invalid_error: Oops! Please fill in all of the required fields...
|
||||
@@ -1041,6 +1062,7 @@ en_US:
|
||||
details: Details
|
||||
address: Address
|
||||
products: Products
|
||||
no_open_or_upcoming_order_cycle: "No Upcoming Order Cycles"
|
||||
product_already_in_order: This product has already been added to the order. Please edit the quantity directly.
|
||||
orders:
|
||||
number: Number
|
||||
@@ -1996,7 +2018,6 @@ en_US:
|
||||
spree_admin_enterprises_none_text: "You don't have any enterprises yet"
|
||||
spree_admin_enterprises_tabs_hubs: "HUBS"
|
||||
spree_admin_enterprises_producers_manage_products: "MANAGE PRODUCTS"
|
||||
spree_admin_enterprises_any_active_products_text: "You don't have any active products."
|
||||
spree_admin_enterprises_create_new_product: "CREATE A NEW PRODUCT"
|
||||
spree_admin_single_enterprise_alert_mail_confirmation: "Please confirm the email address for"
|
||||
spree_admin_single_enterprise_alert_mail_sent: "We've sent an email to"
|
||||
@@ -2519,6 +2540,45 @@ en_US:
|
||||
producers:
|
||||
signup:
|
||||
start_free_profile: "Start with a free profile, and expand when you're ready!"
|
||||
order_management:
|
||||
reports:
|
||||
enterprise_fee_summary:
|
||||
date_end_before_start_error: "must be after start"
|
||||
parameter_not_allowed_error: "You are not authorized to use one or more selected filters for this report."
|
||||
fee_calculated_on_transfer_through_all: "All"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Entire Orders through %{distributor}"
|
||||
tax_category_various: "Various"
|
||||
fee_type:
|
||||
payment_method: "Payment Transaction"
|
||||
shipping_method: "Shipment"
|
||||
fee_placements:
|
||||
supplier: "Incoming"
|
||||
distributor: "Outgoing"
|
||||
coordinator: "Coordinator"
|
||||
tax_category_name:
|
||||
shipping_instance_rate: "Platform Rate"
|
||||
formats:
|
||||
csv:
|
||||
header:
|
||||
fee_type: "Fee Type"
|
||||
enterprise_name: "Enterprise Owner"
|
||||
fee_name: "Fee Name"
|
||||
customer_name: "Customer"
|
||||
fee_placement: "Fee Placement"
|
||||
fee_calculated_on_transfer_through_name: "Fee Calc on Transfer Through"
|
||||
tax_category_name: "Tax Category"
|
||||
total_amount: "$$ SUM"
|
||||
html:
|
||||
header:
|
||||
fee_type: "Fee Type"
|
||||
enterprise_name: "Enterprise Owner"
|
||||
fee_name: "Fee Name"
|
||||
customer_name: "Customer"
|
||||
fee_placement: "Fee Placement"
|
||||
fee_calculated_on_transfer_through_name: "Fee Calc on Transfer Through"
|
||||
tax_category_name: "Tax Category"
|
||||
total_amount: "$$ SUM"
|
||||
invalid_filter_parameters: "The filters you selected for this report are invalid."
|
||||
spree:
|
||||
email: Email
|
||||
account_updated: "Account updated!"
|
||||
@@ -2562,6 +2622,11 @@ en_US:
|
||||
distributor: "Distributor:"
|
||||
order_cycle: "Order cycle:"
|
||||
overview:
|
||||
products:
|
||||
active_products:
|
||||
zero: "You don't have any active products."
|
||||
one: "You have one active product"
|
||||
other: "You have %{count} active products"
|
||||
order_cycles:
|
||||
order_cycles: "Order Cycles"
|
||||
order_cycles_tip: "Order cycles determine when and where your products are available to customers."
|
||||
@@ -2635,6 +2700,14 @@ en_US:
|
||||
bulk_coop_allocation: 'Bulk Co-op - Allocation'
|
||||
bulk_coop_packing_sheets: 'Bulk Co-op - Packing Sheets'
|
||||
bulk_coop_customer_payments: 'Bulk Co-op - Customer Payments'
|
||||
enterprise_fee_summaries:
|
||||
filters:
|
||||
date_range: "Date Range"
|
||||
report_format_csv: "Download as CSV"
|
||||
generate_report: "Generate Report"
|
||||
report:
|
||||
none: "None"
|
||||
select_and_search: "Select filters and click on GENERATE REPORT to access your data."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Listing Users"
|
||||
|
||||
@@ -476,6 +476,8 @@ es:
|
||||
inventory_no_permission: no tienes permiso para crear inventario para esta productora
|
||||
none_saved: No se guardó ningún producto con éxito
|
||||
line_number: "Línea %{number}:"
|
||||
encoding_error: "Verifique la configuración de idioma de su archivo fuente y asegúrese de que esté guardado con la codificación UTF-8"
|
||||
unexpected_error: "La importación de productos encontró un error inesperado al abrir el archivo: %{error_message}"
|
||||
index:
|
||||
select_file: Selecciona una hoja de cálculo para subir
|
||||
spreadsheet: Hoja de cálculo
|
||||
@@ -1027,6 +1029,7 @@ es:
|
||||
this_is_an_estimate: |
|
||||
Los precios mostrados son solo una estimación y se calculan en el momento en que se cambia la suscripción.
|
||||
Si cambias precios o tarifas, los pedidos se actualizarán pero la suscripción seguirá mostrando los valores anteriores.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "No hay ciclos de pedidos abiertos o próximos para este producto."
|
||||
details:
|
||||
details: Detalles
|
||||
invalid_error: Ups! Por favor complete todos los campos requeridos ...
|
||||
@@ -1041,6 +1044,7 @@ es:
|
||||
details: Detalles
|
||||
address: Dirección
|
||||
products: Productos
|
||||
no_open_or_upcoming_order_cycle: "No hay ciclo de pedido próximo"
|
||||
product_already_in_order: Este producto ya ha sido agregado a la orden. Por favor edite la cantidad directamente.
|
||||
orders:
|
||||
number: Número
|
||||
@@ -2020,7 +2024,7 @@ es:
|
||||
spree_distributors_error: "Se debe seleccionar al menos un Grupo"
|
||||
spree_user_enterprise_limit_error: "^ %{email} no está autorizado a tener más organizaciones (el límite es %{enterprise_limit})."
|
||||
spree_variant_product_error: Debes tener al menos una variante
|
||||
your_profil_live: "Tu perfil en directo"
|
||||
your_profil_live: "Tu perfil online"
|
||||
on_ofn_map: "en el mapa Open Food Network"
|
||||
see: "Ver"
|
||||
live: "En directo"
|
||||
@@ -2037,6 +2041,8 @@ es:
|
||||
order_cycles: "Ciclos de Pedidos"
|
||||
enterprise_relationships: "Permisos de la organización"
|
||||
remove_tax: "Eliminar impuesto"
|
||||
first_name_begins_with: "El nombre comienza con"
|
||||
last_name_begins_with: "El apellido comienza con"
|
||||
enterprise_tos_link: "Enlace a los Términos del Servicio de la Organización"
|
||||
enterprise_tos_message: "Queremos trabajar con personas que compartan nuestros objetivos y valores. Por ello, pedimos a las nuevas organizaciones que acepten"
|
||||
enterprise_tos_link_text: "Términos del Servicio."
|
||||
@@ -2184,7 +2190,7 @@ es:
|
||||
report_header_product_total_price: "Producto Total (%{currency})"
|
||||
report_header_shipping_total_price: "Total envíos (%{currency})"
|
||||
report_header_outstanding_balance_price: "Saldo pendiente (%{currency})"
|
||||
report_header_eft_price: "EFT (%{currency})"
|
||||
report_header_eft_price: "Transferencia (%{currency})"
|
||||
report_header_paypal_price: "PayPal (%{currency})"
|
||||
report_header_sku: SKU
|
||||
report_header_amount: Cantidad
|
||||
@@ -2444,6 +2450,11 @@ es:
|
||||
orders:
|
||||
index:
|
||||
per_page: "%{results} por página"
|
||||
view_file: Ver archivo
|
||||
compiling_invoices: Generando facturas
|
||||
bulk_invoice_created: Factura conjunta creada
|
||||
bulk_invoice_failed: Error al crear la factura conjunta
|
||||
please_wait: Por favor, espere hasta que el PDF esté listo antes de cerrar esta ventana.
|
||||
resend_user_email_confirmation:
|
||||
resend: "Reenviar"
|
||||
sending: "Reenviar..."
|
||||
@@ -2546,6 +2557,7 @@ es:
|
||||
no_orders_found: "No se encontraron pedidos"
|
||||
results_found: "%{number} Resultados encontrados."
|
||||
viewing: "Viendo de %{start}a %{end}."
|
||||
print_invoices: "Imprimir facturas"
|
||||
invoice:
|
||||
issued_on: Emitido el
|
||||
tax_invoice: FACTURA DE IMPUESTOS
|
||||
@@ -2624,6 +2636,8 @@ es:
|
||||
display_as:
|
||||
display_as: Mostrar como
|
||||
reports:
|
||||
table:
|
||||
select_and_search: "Seleccione filtros y haga clic en %{option} para acceder a sus datos."
|
||||
bulk_coop:
|
||||
bulk_coop_supplier_report: 'Bulk Co-op - Totales por Proveedor'
|
||||
bulk_coop_allocation: 'Bulk Co-op - Asignación'
|
||||
|
||||
@@ -31,6 +31,16 @@ fr:
|
||||
on_demand_but_count_on_hand_set: "doit être vide si \"à volonté\""
|
||||
limited_stock_but_no_count_on_hand: "doit être spécifié car pas \"à volonté\""
|
||||
activemodel:
|
||||
attributes:
|
||||
order_management/reports/enterprise_fee_summary/parameters:
|
||||
start_at: "Début"
|
||||
end_at: "Fin"
|
||||
distributor_ids: "Hubs"
|
||||
producer_ids: "Producteurs"
|
||||
order_cycle_ids: "Cycles de vente"
|
||||
enterprise_fee_ids: "Nom des marges et commissions"
|
||||
shipping_method_ids: "Méthodes de livraison"
|
||||
payment_method_ids: "Méthodes de paiement"
|
||||
errors:
|
||||
models:
|
||||
subscription_validator:
|
||||
@@ -74,6 +84,13 @@ fr:
|
||||
models:
|
||||
order_cycle:
|
||||
cloned_order_cycle_name: "Copie de %{order_cycle}"
|
||||
validators:
|
||||
date_time_string_validator:
|
||||
not_string_error: "doit être une série"
|
||||
invalid_format_error: "doit être valide"
|
||||
integer_array_validator:
|
||||
not_array_error: "doit être une séquence"
|
||||
invalid_element_error: "doit contenir uniquement des nombres entiers"
|
||||
enterprise_mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmez l'adresse email pour %{enterprise}"
|
||||
@@ -995,6 +1012,9 @@ fr:
|
||||
description: Factures pour import dans Xero
|
||||
packing:
|
||||
name: Rapports de préparation des paniers
|
||||
enterprise_fee_summary:
|
||||
name: "Résumé des marges et commissions"
|
||||
description: "Résumé des marges et commissions collectées"
|
||||
subscriptions:
|
||||
subscriptions: Abonnements
|
||||
new: Nouvel abonnement
|
||||
@@ -1028,6 +1048,7 @@ fr:
|
||||
this_is_an_estimate: |
|
||||
Les prix affichés ne sont qu'une estimation calculée au moment de la dernière modification de l'abonnement.
|
||||
Si vous modifiez les prix ou marges et commissions appliquées, les commandes seront mises à jour, mais l'abonnement affichera toujours les anciennes valeurs.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "Il n'y a pas de cycle de vente ouvert ou à venir pour ce produit."
|
||||
details:
|
||||
details: Informations
|
||||
invalid_error: Oups! Veuillez remplir tous les champs obligatoires...
|
||||
@@ -1042,6 +1063,7 @@ fr:
|
||||
details: Informations
|
||||
address: Adresse
|
||||
products: Produits
|
||||
no_open_or_upcoming_order_cycle: "Pas de cycles de vente prévus."
|
||||
product_already_in_order: Ce produit a déjà été ajouté à la commande. Veuillez directement modifier la quantité.
|
||||
orders:
|
||||
number: Nombre
|
||||
@@ -1997,7 +2019,6 @@ fr:
|
||||
spree_admin_enterprises_none_text: "Vous n'avez pas encore d'entreprise"
|
||||
spree_admin_enterprises_tabs_hubs: "HUBS"
|
||||
spree_admin_enterprises_producers_manage_products: "GÉRER LES PRODUITS"
|
||||
spree_admin_enterprises_any_active_products_text: "Vous n'avez aucun produit actif."
|
||||
spree_admin_enterprises_create_new_product: "CRÉER UN NOUVEAU PRODUIT"
|
||||
spree_admin_single_enterprise_alert_mail_confirmation: "Veuillez confirmer l'adresse mail pour"
|
||||
spree_admin_single_enterprise_alert_mail_sent: "Email envoyé à "
|
||||
@@ -2531,6 +2552,45 @@ fr:
|
||||
producers:
|
||||
signup:
|
||||
start_free_profile: "Commencez par créer votre profil entreprise, et changez de formule quand vous êtes prêt !"
|
||||
order_management:
|
||||
reports:
|
||||
enterprise_fee_summary:
|
||||
date_end_before_start_error: "doit être après date début"
|
||||
parameter_not_allowed_error: "Vous n'êtes pas authorisé.e à utiliser un ou plusieurs des filtres sélectionnés pour ce rapport."
|
||||
fee_calculated_on_transfer_through_all: "Tous"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Commandes complètes via %{distributor}"
|
||||
tax_category_various: "Multiples"
|
||||
fee_type:
|
||||
payment_method: "Méthodes de paiement"
|
||||
shipping_method: "Livraison"
|
||||
fee_placements:
|
||||
supplier: "Produits entrants (pouvant être mis en vente par les hubs)"
|
||||
distributor: "Produits sortants (mis en vente par/via un ou plusieurs hubs)"
|
||||
coordinator: "Coordinateur"
|
||||
tax_category_name:
|
||||
shipping_instance_rate: "Marge de la plateforme"
|
||||
formats:
|
||||
csv:
|
||||
header:
|
||||
fee_type: "Type de marge"
|
||||
enterprise_name: "Gestionnaire de l'entreprise"
|
||||
fee_name: "Nom de la marge/commission"
|
||||
customer_name: "Acheteur"
|
||||
fee_placement: "Capture des frais"
|
||||
fee_calculated_on_transfer_through_name: "Calc. des frais sur les transferts via"
|
||||
tax_category_name: "TVA applicable"
|
||||
total_amount: "€ total"
|
||||
html:
|
||||
header:
|
||||
fee_type: "Type de marge"
|
||||
enterprise_name: "Gestionnaire de l'entreprise"
|
||||
fee_name: "Nom de la marge/commission"
|
||||
customer_name: "Acheteur"
|
||||
fee_placement: "Saisie de la marge"
|
||||
fee_calculated_on_transfer_through_name: "Calc. des frais sur les transferts via"
|
||||
tax_category_name: "TVA applicable"
|
||||
total_amount: "€ total"
|
||||
invalid_filter_parameters: "Les filtres sélectionnés pour ce rapport sont invalides."
|
||||
spree:
|
||||
email: Email
|
||||
account_updated: "Compte mis à jour!"
|
||||
@@ -2574,6 +2634,11 @@ fr:
|
||||
distributor: "Distributeur : "
|
||||
order_cycle: "Cycle de vente : "
|
||||
overview:
|
||||
products:
|
||||
active_products:
|
||||
zero: "Vous n'avez aucun produit actif."
|
||||
one: "Vous avez un produit actif"
|
||||
other: "Vous avez %{count} produits actifs"
|
||||
order_cycles:
|
||||
order_cycles: "Cycles de vente"
|
||||
order_cycles_tip: "Les cycles de vente définissent quand et où vos produits peuvent être commandés par vos acheteurs."
|
||||
@@ -2647,6 +2712,14 @@ fr:
|
||||
bulk_coop_allocation: 'Achats groupés - Allocation'
|
||||
bulk_coop_packing_sheets: 'Achats groupés - Feuilles de préparation des paniers'
|
||||
bulk_coop_customer_payments: 'Achats groupés - Paiement des acheteurs'
|
||||
enterprise_fee_summaries:
|
||||
filters:
|
||||
date_range: "Période"
|
||||
report_format_csv: "Télécharger le CSV"
|
||||
generate_report: "Générer le rapport"
|
||||
report:
|
||||
none: "Aucun"
|
||||
select_and_search: "Sélectionnez les filtres et cliquez sur \"générer le rapport\" pour accéder aux données."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Liste des utilisateurs"
|
||||
|
||||
@@ -31,6 +31,16 @@ fr_CA:
|
||||
on_demand_but_count_on_hand_set: "doit être vide si \"à volonté\""
|
||||
limited_stock_but_no_count_on_hand: "doit être spécifié car pas \"à volonté\""
|
||||
activemodel:
|
||||
attributes:
|
||||
order_management/reports/enterprise_fee_summary/parameters:
|
||||
start_at: "Début"
|
||||
end_at: "Fin"
|
||||
distributor_ids: "Hubs"
|
||||
producer_ids: "Producteurs"
|
||||
order_cycle_ids: "Cycles de Vente"
|
||||
enterprise_fee_ids: "Nom des marges et commissions"
|
||||
shipping_method_ids: "Méthodes de livraison"
|
||||
payment_method_ids: "Méthodes de paiement"
|
||||
errors:
|
||||
models:
|
||||
subscription_validator:
|
||||
@@ -75,6 +85,13 @@ fr_CA:
|
||||
models:
|
||||
order_cycle:
|
||||
cloned_order_cycle_name: "Copie de %{order_cycle}"
|
||||
validators:
|
||||
date_time_string_validator:
|
||||
not_string_error: "doit être une série"
|
||||
invalid_format_error: "doit être valide"
|
||||
integer_array_validator:
|
||||
not_array_error: "doit être une séquence"
|
||||
invalid_element_error: "doit contenir uniquement des nombres entiers"
|
||||
enterprise_mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Confirmez l'adresse email pour %{enterprise}"
|
||||
@@ -996,6 +1013,9 @@ fr_CA:
|
||||
description: Factures pour import dans Xero
|
||||
packing:
|
||||
name: Rapports de préparation des paniers
|
||||
enterprise_fee_summary:
|
||||
name: "Résumé des marges et commissions"
|
||||
description: "Résumé des marges et commissions collectées"
|
||||
subscriptions:
|
||||
subscriptions: Abonnements
|
||||
new: Nouvel abonnement
|
||||
@@ -1028,6 +1048,7 @@ fr_CA:
|
||||
subscription_line_items:
|
||||
this_is_an_estimate: |
|
||||
Les prix affichés ne sont qu'une estimation calculée au moment de la dernière modification de l'abonnement.Si vous modifiez les prix ou marges et commissions appliquées, les commandes seront mises à jour, mais l'abonnement affichera toujours les anciennes valeurs.
|
||||
not_in_open_and_upcoming_order_cycles_warning: "Il n'y a pas de cycle de vente ouvert ou à venir pour ce produit."
|
||||
details:
|
||||
details: Informations
|
||||
invalid_error: Oups! Veuillez remplir tous les champs obligatoires...
|
||||
@@ -1042,6 +1063,7 @@ fr_CA:
|
||||
details: Informations
|
||||
address: Adresse
|
||||
products: Produits
|
||||
no_open_or_upcoming_order_cycle: "Pas de cycles de vente prévus."
|
||||
product_already_in_order: Ce produit a déjà été ajouté à la commande. Veuillez directement modifier la quantité.
|
||||
orders:
|
||||
number: Nombre
|
||||
@@ -1997,7 +2019,6 @@ fr_CA:
|
||||
spree_admin_enterprises_none_text: "Vous n'avez pas encore d'entreprise"
|
||||
spree_admin_enterprises_tabs_hubs: "HUBS"
|
||||
spree_admin_enterprises_producers_manage_products: "GÉRER LES PRODUITS"
|
||||
spree_admin_enterprises_any_active_products_text: "Vous n'avez aucun produit actif."
|
||||
spree_admin_enterprises_create_new_product: "CRÉER UN NOUVEAU PRODUIT"
|
||||
spree_admin_single_enterprise_alert_mail_confirmation: "Veuillez confirmer l'adresse mail pour"
|
||||
spree_admin_single_enterprise_alert_mail_sent: "Email envoyé à "
|
||||
@@ -2531,6 +2552,45 @@ fr_CA:
|
||||
producers:
|
||||
signup:
|
||||
start_free_profile: "Commencez par créer votre profil entreprise, c'est gratuit, et changez de formule quand vous êtes prêt !"
|
||||
order_management:
|
||||
reports:
|
||||
enterprise_fee_summary:
|
||||
date_end_before_start_error: "doit être après date début"
|
||||
parameter_not_allowed_error: "Vous n'êtes pas authorisé.e à utiliser un ou plusieurs des filtres sélectionnés pour ce rapport."
|
||||
fee_calculated_on_transfer_through_all: "Tous"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Commandes complètes via %{distributor}"
|
||||
tax_category_various: "Multiples"
|
||||
fee_type:
|
||||
payment_method: "Méthodes de paiement"
|
||||
shipping_method: "Livraison"
|
||||
fee_placements:
|
||||
supplier: "Produits entrants (pouvant être mis en vente par les hubs)"
|
||||
distributor: "Produits sortants (mis en vente par/via un ou plusieurs hubs)"
|
||||
coordinator: "Coordinateur"
|
||||
tax_category_name:
|
||||
shipping_instance_rate: "Marge de la plateforme"
|
||||
formats:
|
||||
csv:
|
||||
header:
|
||||
fee_type: "Type de commissions"
|
||||
enterprise_name: "Gestionnaire de l'entreprise"
|
||||
fee_name: "Nom de la marge/commission"
|
||||
customer_name: "Acheteur"
|
||||
fee_placement: "Capture des frais"
|
||||
fee_calculated_on_transfer_through_name: "Calc. des frais sur les transferts via"
|
||||
tax_category_name: "Type de taxe"
|
||||
total_amount: "$$ TOTAL"
|
||||
html:
|
||||
header:
|
||||
fee_type: "Type de commissions"
|
||||
enterprise_name: "Gestionnaire de l'entreprise"
|
||||
fee_name: "Nom de la marge/commission"
|
||||
customer_name: "Acheteur"
|
||||
fee_placement: "Saisie de la marge"
|
||||
fee_calculated_on_transfer_through_name: "Calc. des frais sur les transferts via"
|
||||
tax_category_name: "Type de taxe"
|
||||
total_amount: "$$ TOTAL"
|
||||
invalid_filter_parameters: "Les filtres sélectionnés pour ce rapport sont invalides."
|
||||
spree:
|
||||
email: Email
|
||||
account_updated: "Compte mis à jour!"
|
||||
@@ -2574,6 +2634,11 @@ fr_CA:
|
||||
distributor: "Distributeur : "
|
||||
order_cycle: "Cycle de vente : "
|
||||
overview:
|
||||
products:
|
||||
active_products:
|
||||
zero: "Vous n'avez aucun produit actif."
|
||||
one: "Vous avez un produit actif"
|
||||
other: "Vous avez %{count}produits actifs"
|
||||
order_cycles:
|
||||
order_cycles: "Cycles de vente"
|
||||
order_cycles_tip: "Les cycles de vente définissent quand et où vos produits peuvent être commandés par vos acheteurs."
|
||||
@@ -2647,6 +2712,14 @@ fr_CA:
|
||||
bulk_coop_allocation: 'Achats groupés - Allocation'
|
||||
bulk_coop_packing_sheets: 'Achats groupés - Feuilles de préparation des paniers'
|
||||
bulk_coop_customer_payments: 'Achats groupés - Paiement des acheteurs'
|
||||
enterprise_fee_summaries:
|
||||
filters:
|
||||
date_range: "Période"
|
||||
report_format_csv: "Télécharger en csv"
|
||||
generate_report: "Générer le rapport"
|
||||
report:
|
||||
none: "Aucun"
|
||||
select_and_search: "Sélectionnez les filtres et cliquez sur \"générer le rapport\" pour accéder aux données."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Liste des utilisateurs"
|
||||
|
||||
@@ -31,6 +31,16 @@ nb:
|
||||
on_demand_but_count_on_hand_set: "må være tom hvis på forespørsel"
|
||||
limited_stock_but_no_count_on_hand: "må spesifiseres fordi det tvinger begrenset lager"
|
||||
activemodel:
|
||||
attributes:
|
||||
order_management/reports/enterprise_fee_summary/parameters:
|
||||
start_at: "Start"
|
||||
end_at: "Slutt"
|
||||
distributor_ids: "Hubs"
|
||||
producer_ids: "Produsenter"
|
||||
order_cycle_ids: "Bestillingsrunder"
|
||||
enterprise_fee_ids: "Avgiftsnavn"
|
||||
shipping_method_ids: "Leveringsmetoder"
|
||||
payment_method_ids: "Betalingsmetoder"
|
||||
errors:
|
||||
models:
|
||||
subscription_validator:
|
||||
@@ -74,6 +84,13 @@ nb:
|
||||
models:
|
||||
order_cycle:
|
||||
cloned_order_cycle_name: "KOPI AV %{order_cycle}"
|
||||
validators:
|
||||
date_time_string_validator:
|
||||
not_string_error: "må være en streng"
|
||||
invalid_format_error: "må være gyldig"
|
||||
integer_array_validator:
|
||||
not_array_error: "må være en tabell"
|
||||
invalid_element_error: "må kun inneholde gyldige heltall"
|
||||
enterprise_mailer:
|
||||
confirmation_instructions:
|
||||
subject: "Vennligst bekreft epostadressen til %{enterprise}"
|
||||
@@ -256,7 +273,7 @@ nb:
|
||||
shop: Butikk
|
||||
sku: SKU
|
||||
status_state: Tilstand
|
||||
tags: Merker
|
||||
tags: Merkelapper
|
||||
variant: Variant
|
||||
weight: Vekt
|
||||
volume: Volum
|
||||
@@ -314,7 +331,7 @@ nb:
|
||||
embedded_shopfronts_whitelist: "Hviteliste for Eksterne Domener"
|
||||
number_localization:
|
||||
number_localization_settings: "Innstillinger for nummerlokalisering"
|
||||
enable_localized_number: "Bruk den internasjonale tusen/desimal tegn-logikken"
|
||||
enable_localized_number: "Bruk internasjonale tusen- og desimalskilletegn"
|
||||
business_model_configuration:
|
||||
edit:
|
||||
business_model_configuration: "Forretningsmodell"
|
||||
@@ -747,7 +764,7 @@ nb:
|
||||
no_rules_yet: Ingen regler gjelder for dette emnet ennå
|
||||
for_customers_tagged: 'For kunder merket:'
|
||||
add_new_rule: '+ Legg til En Ny Regel'
|
||||
add_new_tag: '+ Legg til Et Nytt Merke'
|
||||
add_new_tag: '+ Legg til ny Merkelapp'
|
||||
users:
|
||||
email_confirmation_notice_html: "Epostbekreftelse venter. Vi har sendt en bekreftelsesepost til %{email}."
|
||||
resend: Send på nytt
|
||||
@@ -875,7 +892,7 @@ nb:
|
||||
outgoing: Utgående
|
||||
distributor: Distributør
|
||||
products: Produkter
|
||||
tags: Merker
|
||||
tags: Merkelapper
|
||||
add_a_tag: Legg til en merkelapp
|
||||
delivery_details: Hente-/Leveringsdetaljer
|
||||
debug_info: Debuginformasjon
|
||||
@@ -994,6 +1011,9 @@ nb:
|
||||
description: Fakturaer for import til Xero
|
||||
packing:
|
||||
name: Pakkerapporter
|
||||
enterprise_fee_summary:
|
||||
name: "Sammendrag Bedriftsavgift"
|
||||
description: "Sammendrag av bedriftsavgifter innsamlet"
|
||||
subscriptions:
|
||||
subscriptions: Abonnement
|
||||
new: Nytt abonnement
|
||||
@@ -1998,7 +2018,6 @@ nb:
|
||||
spree_admin_enterprises_none_text: "Du har ingen bedrifter ennå"
|
||||
spree_admin_enterprises_tabs_hubs: "HUBS"
|
||||
spree_admin_enterprises_producers_manage_products: "ADMINISTRER PRODUKTER"
|
||||
spree_admin_enterprises_any_active_products_text: "Du har ingen aktive produkter."
|
||||
spree_admin_enterprises_create_new_product: "OPPRETT NYTT PRODUKT"
|
||||
spree_admin_single_enterprise_alert_mail_confirmation: "Vennligst bekreft epostadressen for"
|
||||
spree_admin_single_enterprise_alert_mail_sent: "Vi har sendt epost til"
|
||||
@@ -2520,6 +2539,45 @@ nb:
|
||||
producers:
|
||||
signup:
|
||||
start_free_profile: "Start med en gratis profil, og utvid når du er klar!"
|
||||
order_management:
|
||||
reports:
|
||||
enterprise_fee_summary:
|
||||
date_end_before_start_error: "må være etter start"
|
||||
parameter_not_allowed_error: "Du er ikke autorisert til å bruke ett eller flere utvalgte filtre for denne rapporten."
|
||||
fee_calculated_on_transfer_through_all: "Alle"
|
||||
fee_calculated_on_transfer_through_entire_orders: "Hele bestillinger gjennom %{distributor}"
|
||||
tax_category_various: "Diverse"
|
||||
fee_type:
|
||||
payment_method: "Betalingstransaksjon"
|
||||
shipping_method: "Leveranse"
|
||||
fee_placements:
|
||||
supplier: "Innkommende"
|
||||
distributor: "Utgående"
|
||||
coordinator: "Koordinator"
|
||||
tax_category_name:
|
||||
shipping_instance_rate: "Plattformrate"
|
||||
formats:
|
||||
csv:
|
||||
header:
|
||||
fee_type: "Avfgiftstype"
|
||||
enterprise_name: "Bedriftseier"
|
||||
fee_name: "Avgiftsnavn"
|
||||
customer_name: "Kunde"
|
||||
fee_placement: "Avgiftsplassering"
|
||||
fee_calculated_on_transfer_through_name: "Avgift beregnes ved overføring gjennom"
|
||||
tax_category_name: "Avgiftskategori"
|
||||
total_amount: "$$ SUM"
|
||||
html:
|
||||
header:
|
||||
fee_type: "Avfgiftstype"
|
||||
enterprise_name: "Bedriftseier"
|
||||
fee_name: "Avgiftsnavn"
|
||||
customer_name: "Kunde"
|
||||
fee_placement: "Avgiftsplassering"
|
||||
fee_calculated_on_transfer_through_name: "Avgift beregnes ved overføring gjennom"
|
||||
tax_category_name: "Avgiftskategori"
|
||||
total_amount: "$$ SUM"
|
||||
invalid_filter_parameters: "Filtrene du valgte for denne rapporten er ugyldige."
|
||||
spree:
|
||||
email: Epost
|
||||
account_updated: "Konto oppdatert!"
|
||||
@@ -2563,6 +2621,11 @@ nb:
|
||||
distributor: "Distributør:"
|
||||
order_cycle: "Bestillingsrunde:"
|
||||
overview:
|
||||
products:
|
||||
active_products:
|
||||
zero: "Du har ingen aktive produkter."
|
||||
one: "Du har ett aktivt produkt"
|
||||
other: "Du har %{count} aktive produkter"
|
||||
order_cycles:
|
||||
order_cycles: "Bestillingsrunder"
|
||||
order_cycles_tip: "Bestillingsrundene bestemmer når og hvor produktene dine er tilgjengelige for kundene."
|
||||
@@ -2636,6 +2699,14 @@ nb:
|
||||
bulk_coop_allocation: 'Bulk Co-op - Allokering'
|
||||
bulk_coop_packing_sheets: 'Bulk Co-op - Pakkseddel'
|
||||
bulk_coop_customer_payments: 'Bulk Co-op - Kunde Betalinger'
|
||||
enterprise_fee_summaries:
|
||||
filters:
|
||||
date_range: "Datointervall"
|
||||
report_format_csv: "Last ned som CSV"
|
||||
generate_report: "Generer rapport"
|
||||
report:
|
||||
none: "Ingen"
|
||||
select_and_search: "Velg filtre og klikk på GENERER RAPPORT for å få tilgang til dataene dine."
|
||||
users:
|
||||
index:
|
||||
listing_users: "Lister opp brukere"
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for coordinator fees
|
||||
# in an order cycle.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class CoordinatorFee
|
||||
include UsingEnterpriseFee
|
||||
|
||||
def fee_calculated_on_transfer_through_name
|
||||
i18n_translate("fee_calculated_on_transfer_through_all")
|
||||
end
|
||||
|
||||
def tax_category_name
|
||||
return data["tax_category_name"] if data["tax_category_name"].present?
|
||||
i18n_translate("tax_category_various") if inherits_tax_category?
|
||||
end
|
||||
|
||||
def inherits_tax_category?
|
||||
data["enterprise_fee_inherits_tax_category"] == "t"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for exchange fees
|
||||
# that use order-based calculators.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class ExchangeOrderFee
|
||||
include UsingEnterpriseFee
|
||||
|
||||
def fee_calculated_on_transfer_through_name
|
||||
i18n_translate("fee_calculated_on_transfer_through_entire_orders",
|
||||
distributor: data["adjustment_source_distributor_name"])
|
||||
end
|
||||
|
||||
def tax_category_name
|
||||
data["tax_category_name"] || i18n_translate("tax_category_various")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for incoming
|
||||
# exchange fees that use line item -based calculators.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class IncomingExchangeLineItemFee
|
||||
include UsingEnterpriseFee
|
||||
|
||||
def fee_calculated_on_transfer_through_name
|
||||
data["incoming_exchange_enterprise_name"]
|
||||
end
|
||||
|
||||
def tax_category_name
|
||||
data["tax_category_name"] || data["product_tax_category_name"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for outgoing
|
||||
# exchange fees that use line item -based calculators.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class OutgoingExchangeLineItemFee
|
||||
include UsingEnterpriseFee
|
||||
|
||||
def fee_calculated_on_transfer_through_name
|
||||
data["outgoing_exchange_enterprise_name"]
|
||||
end
|
||||
|
||||
def tax_category_name
|
||||
data["tax_category_name"] || data["product_tax_category_name"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,38 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for payment method
|
||||
# fees.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class PaymentMethodFee
|
||||
include WithI18n
|
||||
|
||||
attr_reader :data
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def fee_type
|
||||
i18n_translate("fee_type.payment_method")
|
||||
end
|
||||
|
||||
def enterprise_name
|
||||
data["hub_name"]
|
||||
end
|
||||
|
||||
def fee_name
|
||||
data["payment_method_name"]
|
||||
end
|
||||
|
||||
def fee_placement; end
|
||||
|
||||
def fee_calculated_on_transfer_through_name; end
|
||||
|
||||
def tax_category_name; end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
# This module provides EnterpriseFeeSummary::Scope DB result to report mappings for shipping method
|
||||
# fees.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
class ShippingMethodFee
|
||||
include WithI18n
|
||||
|
||||
attr_reader :data
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def fee_type
|
||||
i18n_translate("fee_type.shipping_method")
|
||||
end
|
||||
|
||||
def enterprise_name
|
||||
data["hub_name"]
|
||||
end
|
||||
|
||||
def fee_name
|
||||
data["shipping_method_name"]
|
||||
end
|
||||
|
||||
def fee_placement; end
|
||||
|
||||
def fee_calculated_on_transfer_through_name; end
|
||||
|
||||
def tax_category_name
|
||||
i18n_translate("tax_category_name.shipping_instance_rate")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
# Different EnterpriseFeeSummary::Scope DB result attributes are checked when dealing with
|
||||
# enterprise fees that are attached to an order cycle in different ways.
|
||||
#
|
||||
# This module provides DB result to report mappings that are common among all rows for enterprise
|
||||
# fees. These mappings are not complete and should be supplemented with mappings that are specific
|
||||
# to the way that the enterprise fee is attached to the order cycle.
|
||||
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
module UsingEnterpriseFee
|
||||
include WithI18n
|
||||
|
||||
attr_reader :data
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def fee_type
|
||||
data["fee_type"].try(:capitalize)
|
||||
end
|
||||
|
||||
def enterprise_name
|
||||
data["enterprise_name"]
|
||||
end
|
||||
|
||||
def fee_name
|
||||
data["fee_name"]
|
||||
end
|
||||
|
||||
def fee_placement
|
||||
i18n_translate("fee_placements.#{data['placement_enterprise_role']}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,15 @@
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
module DataRepresentations
|
||||
module WithI18n
|
||||
private
|
||||
|
||||
def i18n_translate(translation_key, options = {})
|
||||
I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", options)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,87 +0,0 @@
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
class EnterpriseFeeTypeTotalSummarizer
|
||||
attr_accessor :data
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def fee_type
|
||||
if for_payment_method?
|
||||
i18n_translate("fee_type.payment_method")
|
||||
elsif for_shipping_method?
|
||||
i18n_translate("fee_type.shipping_method")
|
||||
else
|
||||
data["fee_type"].try(:capitalize)
|
||||
end
|
||||
end
|
||||
|
||||
def enterprise_name
|
||||
if for_payment_method?
|
||||
data["hub_name"]
|
||||
elsif for_shipping_method?
|
||||
data["hub_name"]
|
||||
else
|
||||
data["enterprise_name"]
|
||||
end
|
||||
end
|
||||
|
||||
def fee_name
|
||||
if for_payment_method?
|
||||
data["payment_method_name"]
|
||||
elsif for_shipping_method?
|
||||
data["shipping_method_name"]
|
||||
else
|
||||
data["fee_name"]
|
||||
end
|
||||
end
|
||||
|
||||
def customer_name
|
||||
data["customer_name"]
|
||||
end
|
||||
|
||||
def fee_placement
|
||||
return if for_payment_method? || for_shipping_method?
|
||||
|
||||
i18n_translate("fee_placements.#{data['placement_enterprise_role']}")
|
||||
end
|
||||
|
||||
def fee_calculated_on_transfer_through_name
|
||||
return if for_payment_method? || for_shipping_method?
|
||||
|
||||
transfer_through_all_string = i18n_translate("fee_calculated_on_transfer_through_all")
|
||||
|
||||
data["incoming_exchange_enterprise_name"] || data["outgoing_exchange_enterprise_name"] ||
|
||||
(transfer_through_all_string if data["placement_enterprise_role"] == "coordinator")
|
||||
end
|
||||
|
||||
def tax_category_name
|
||||
return if for_payment_method?
|
||||
return i18n_translate("tax_category_name.shipping_instance_rate") if for_shipping_method?
|
||||
|
||||
data["tax_category_name"] || data["product_tax_category_name"]
|
||||
end
|
||||
|
||||
def total_amount
|
||||
data["total_amount"]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def for_payment_method?
|
||||
data["payment_method_name"].present?
|
||||
end
|
||||
|
||||
def for_shipping_method?
|
||||
data["shipping_method_name"].present?
|
||||
end
|
||||
|
||||
def i18n_translate(translation_key)
|
||||
I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -25,7 +25,7 @@ module OrderManagement
|
||||
|
||||
def enterprise_fee_type_total_list
|
||||
enterprise_fees_by_customer.map do |total_data|
|
||||
summarizer = EnterpriseFeeTypeTotalSummarizer.new(total_data)
|
||||
summarizer = Summarizer.new(total_data)
|
||||
|
||||
ReportData::EnterpriseFeeTypeTotal.new.tap do |total|
|
||||
enterprise_fee_type_summarizer_to_total_attributes.each do |attribute|
|
||||
|
||||
@@ -31,7 +31,8 @@ module OrderManagement
|
||||
include_payment_fee_details
|
||||
include_shipping_fee_details
|
||||
include_enterprise_fee_details
|
||||
include_line_item_details
|
||||
include_order_source_details
|
||||
include_line_item_source_details
|
||||
include_incoming_exchange_details
|
||||
include_outgoing_exchange_details
|
||||
|
||||
@@ -169,14 +170,38 @@ module OrderManagement
|
||||
)
|
||||
end
|
||||
|
||||
# If for line item - Use data only if spree_line_items.id is present
|
||||
# If for order source
|
||||
#
|
||||
# Includes:
|
||||
# * Source order
|
||||
# * Distributor
|
||||
def include_order_source_details
|
||||
join_scope(
|
||||
<<-JOIN_STRING.strip_heredoc
|
||||
LEFT OUTER JOIN spree_orders AS adjustment_source_orders
|
||||
ON (
|
||||
spree_adjustments.source_type = 'Spree::Order'
|
||||
AND adjustment_source_orders.id = spree_adjustments.source_id
|
||||
)
|
||||
JOIN_STRING
|
||||
)
|
||||
|
||||
join_scope(
|
||||
<<-JOIN_STRING.strip_heredoc
|
||||
LEFT OUTER JOIN enterprises AS adjustment_source_distributors
|
||||
ON (adjustment_source_distributors.id = adjustment_source_orders.distributor_id)
|
||||
JOIN_STRING
|
||||
)
|
||||
end
|
||||
|
||||
# If for line item source - Use data only if spree_line_items.id is present
|
||||
#
|
||||
# Includes:
|
||||
# * Line item
|
||||
# * Variant
|
||||
# * Product
|
||||
# * Tax category of product, if enterprise fee tells to inherit
|
||||
def include_line_item_details
|
||||
def include_line_item_source_details
|
||||
join_scope(
|
||||
<<-JOIN_STRING.strip_heredoc
|
||||
LEFT OUTER JOIN spree_line_items
|
||||
@@ -316,7 +341,8 @@ module OrderManagement
|
||||
group("enterprise_fees.id", "enterprises.id", "customers.id", "hubs.id",
|
||||
"spree_payment_methods.id", "spree_shipping_methods.id",
|
||||
"adjustment_metadata.enterprise_role", "spree_tax_categories.id",
|
||||
"product_tax_categories.id", "incoming_exchange_enterprises.id",
|
||||
"product_tax_categories.id", "spree_adjustments.source_type",
|
||||
"adjustment_source_distributors.id", "incoming_exchange_enterprises.id",
|
||||
"outgoing_exchange_enterprises.id")
|
||||
end
|
||||
end
|
||||
@@ -331,8 +357,11 @@ module OrderManagement
|
||||
enterprise_fees.fee_type AS fee_type, customers.name AS customer_name,
|
||||
customers.email AS customer_email, enterprise_fees.fee_type AS fee_type,
|
||||
enterprise_fees.name AS fee_name, spree_tax_categories.name AS tax_category_name,
|
||||
enterprise_fees.inherits_tax_category AS enterprise_fee_inherits_tax_category,
|
||||
product_tax_categories.name AS product_tax_category_name,
|
||||
adjustment_metadata.enterprise_role AS placement_enterprise_role,
|
||||
spree_adjustments.source_type AS adjustment_source_type,
|
||||
adjustment_source_distributors.name AS adjustment_source_distributor_name,
|
||||
incoming_exchange_enterprises.name AS incoming_exchange_enterprise_name,
|
||||
outgoing_exchange_enterprises.name AS outgoing_exchange_enterprise_name
|
||||
JOIN_STRING
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
module OrderManagement
|
||||
module Reports
|
||||
module EnterpriseFeeSummary
|
||||
class Summarizer
|
||||
attr_reader :data
|
||||
|
||||
delegate :fee_type, :enterprise_name, :fee_name, :fee_placement,
|
||||
:fee_calculated_on_transfer_through_name, :tax_category_name, to: :representation
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def customer_name
|
||||
data["customer_name"]
|
||||
end
|
||||
|
||||
def total_amount
|
||||
data["total_amount"]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def representation
|
||||
@representation ||= representation_klass.new(data)
|
||||
end
|
||||
|
||||
def representation_klass
|
||||
return DataRepresentations::PaymentMethodFee if for_payment_method?
|
||||
return DataRepresentations::ShippingMethodFee if for_shipping_method?
|
||||
enterprise_fee_adjustment_presentation_klass if for_enterprise_fee?
|
||||
end
|
||||
|
||||
def enterprise_fee_adjustment_presentation_klass
|
||||
return DataRepresentations::CoordinatorFee if for_coordinator_fee?
|
||||
return DataRepresentations::ExchangeOrderFee if for_order_adjustment_source?
|
||||
return unless for_line_item_adjustment_source?
|
||||
return DataRepresentations::IncomingExchangeLineItemFee if for_incoming_exchange?
|
||||
return DataRepresentations::OutgoingExchangeLineItemFee if for_outgoing_exchange?
|
||||
end
|
||||
|
||||
def for_payment_method?
|
||||
data["payment_method_name"].present?
|
||||
end
|
||||
|
||||
def for_shipping_method?
|
||||
data["shipping_method_name"].present?
|
||||
end
|
||||
|
||||
def for_enterprise_fee?
|
||||
data["fee_name"].present?
|
||||
end
|
||||
|
||||
def for_coordinator_fee?
|
||||
data["placement_enterprise_role"] == "coordinator"
|
||||
end
|
||||
|
||||
def for_incoming_exchange?
|
||||
data["placement_enterprise_role"] == "supplier"
|
||||
end
|
||||
|
||||
def for_outgoing_exchange?
|
||||
data["placement_enterprise_role"] == "distributor"
|
||||
end
|
||||
|
||||
def for_order_adjustment_source?
|
||||
data["adjustment_source_type"] == "Spree::Order"
|
||||
end
|
||||
|
||||
def for_line_item_adjustment_source?
|
||||
data["adjustment_source_type"] == "Spree::LineItem"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -124,9 +124,9 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
|
||||
["Payment Transaction", "Sample Distributor", "Sample Payment Method", "Sample Customer",
|
||||
nil, nil, nil, "4.00"],
|
||||
["Sales", "Sample Coordinator", "Coordinator Fee 2", "Another Customer",
|
||||
"Coordinator", "All", "Sample Product Tax", "1024.00"],
|
||||
"Coordinator", "All", "Various", "1024.00"],
|
||||
["Sales", "Sample Coordinator", "Coordinator Fee 2", "Sample Customer",
|
||||
"Coordinator", "All", "Sample Product Tax", "2048.00"],
|
||||
"Coordinator", "All", "Various", "2048.00"],
|
||||
["Sales", "Sample Distributor", "Distributor Fee 2", "Another Customer",
|
||||
"Outgoing", "Sample Distributor", "Sample Product Tax", "8.00"],
|
||||
["Sales", "Sample Distributor", "Distributor Fee 2", "Sample Customer",
|
||||
@@ -206,6 +206,98 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "with order-based enterprise fee calculator" do
|
||||
let!(:producer_fee) do
|
||||
tax_category = create(:tax_category, name: "Producer Tax A")
|
||||
create(:enterprise_fee, :flat_rate, name: "Producer Fee A", enterprise: producer,
|
||||
fee_type: "sales", tax_category: tax_category,
|
||||
amount: 10)
|
||||
end
|
||||
let!(:coordinator_fee) do
|
||||
tax_category = create(:tax_category, name: "Coordinator Tax A")
|
||||
create(:enterprise_fee, :flat_rate, name: "Coordinator Fee A", enterprise: coordinator,
|
||||
fee_type: "admin", tax_category: tax_category,
|
||||
amount: 15)
|
||||
end
|
||||
let!(:coordinator_fee_inheriting_product_tax_category) do
|
||||
create(:enterprise_fee, :flat_rate, name: "Coordinator Fee B", enterprise: coordinator,
|
||||
fee_type: "admin", inherits_tax_category: true,
|
||||
amount: 20)
|
||||
end
|
||||
let!(:coordinator_fee_without_tax) do
|
||||
create(:enterprise_fee, :flat_rate, name: "Coordinator Fee C", enterprise: coordinator,
|
||||
fee_type: "admin", inherits_tax_category: false,
|
||||
amount: 25)
|
||||
end
|
||||
let!(:distributor_fee) do
|
||||
tax_category = create(:tax_category, name: "Distributor Tax A")
|
||||
create(:enterprise_fee, :flat_rate, name: "Distributor Fee A", enterprise: distributor,
|
||||
fee_type: "admin", inherits_tax_category: false,
|
||||
amount: 30)
|
||||
end
|
||||
|
||||
let!(:coordinator_fees) do
|
||||
[
|
||||
coordinator_fee,
|
||||
coordinator_fee_inheriting_product_tax_category,
|
||||
coordinator_fee_without_tax
|
||||
]
|
||||
end
|
||||
|
||||
let!(:order_cycle) do
|
||||
create(:simple_order_cycle, coordinator: coordinator, coordinator_fees: coordinator_fees)
|
||||
end
|
||||
|
||||
let!(:variant_incoming_exchange_fees) { [producer_fee, coordinator_fee, distributor_fee] }
|
||||
let!(:variant_outgoing_exchange_fees) { [producer_fee, coordinator_fee, distributor_fee] }
|
||||
|
||||
let!(:variant) do
|
||||
prepare_variant(incoming_exchange_fees: variant_incoming_exchange_fees,
|
||||
outgoing_exchange_fees: variant_outgoing_exchange_fees)
|
||||
end
|
||||
|
||||
let!(:customer_order) { prepare_order(customer: customer) }
|
||||
|
||||
it "fetches data correctly" do
|
||||
totals = service.list
|
||||
|
||||
expect(totals.length).to eq(11)
|
||||
|
||||
entire_orders_text = i18n_translate("fee_calculated_on_transfer_through_entire_orders",
|
||||
distributor: "Sample Distributor")
|
||||
various_tax_categories_text = i18n_translate("tax_category_various")
|
||||
|
||||
expected_result = [
|
||||
["Admin", "Sample Coordinator", "Coordinator Fee A", "Sample Customer",
|
||||
"Coordinator", "All", "Coordinator Tax A", "15.00"],
|
||||
["Admin", "Sample Coordinator", "Coordinator Fee A", "Sample Customer",
|
||||
"Incoming", entire_orders_text, "Coordinator Tax A", "15.00"],
|
||||
["Admin", "Sample Coordinator", "Coordinator Fee A", "Sample Customer",
|
||||
"Outgoing", entire_orders_text, "Coordinator Tax A", "15.00"],
|
||||
["Admin", "Sample Coordinator", "Coordinator Fee B", "Sample Customer",
|
||||
"Coordinator", "All", various_tax_categories_text, "20.00"],
|
||||
["Admin", "Sample Coordinator", "Coordinator Fee C", "Sample Customer",
|
||||
"Coordinator", "All", nil, "25.00"],
|
||||
["Admin", "Sample Distributor", "Distributor Fee A", "Sample Customer",
|
||||
"Incoming", entire_orders_text, various_tax_categories_text, "30.00"],
|
||||
["Admin", "Sample Distributor", "Distributor Fee A", "Sample Customer",
|
||||
"Outgoing", entire_orders_text, various_tax_categories_text, "30.00"],
|
||||
["Payment Transaction", "Sample Distributor", "Sample Payment Method", "Sample Customer",
|
||||
nil, nil, nil, "2.00"],
|
||||
["Sales", "Sample Producer", "Producer Fee A", "Sample Customer",
|
||||
"Incoming", entire_orders_text, "Producer Tax A", "10.00"],
|
||||
["Sales", "Sample Producer", "Producer Fee A", "Sample Customer",
|
||||
"Outgoing", entire_orders_text, "Producer Tax A", "10.00"],
|
||||
["Shipment", "Sample Distributor", "Sample Shipping Method", "Sample Customer",
|
||||
nil, nil, "Platform Rate", "1.00"]
|
||||
]
|
||||
|
||||
expected_result.each_with_index do |expected_attributes, row_index|
|
||||
expect_total_attributes(totals[row_index], expected_attributes)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "filtering results based on permissions" do
|
||||
@@ -488,6 +580,10 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
|
||||
|
||||
# Helper methods for example group
|
||||
|
||||
def i18n_translate(translation_key, options = {})
|
||||
I18n.t("order_management.reports.enterprise_fee_summary.#{translation_key}", options)
|
||||
end
|
||||
|
||||
def expect_total_attributes(total, expected_attribute_list)
|
||||
actual_attribute_list = [total.fee_type, total.enterprise_name, total.fee_name,
|
||||
total.customer_name, total.fee_placement,
|
||||
|
||||
@@ -695,7 +695,7 @@ describe Admin::SubscriptionsController, type: :controller do
|
||||
end
|
||||
|
||||
context "when other payment methods exist" do
|
||||
let!(:stripe) { create(:stripe_payment_method, distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:stripe) { create(:stripe_payment_method, distributors: [shop]) }
|
||||
let!(:paypal) { Spree::Gateway::PayPalExpress.create!(name: "PayPalExpress", distributor_ids: [shop.id]) }
|
||||
let!(:bogus) { create(:bogus_payment_method, distributors: [shop]) }
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ describe Spree::Admin::PaymentsController, type: :controller do
|
||||
before { @request.env['HTTP_REFERER'] = spree.admin_order_payments_url(payment) }
|
||||
|
||||
context "that was processed by stripe" do
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop]) }
|
||||
# let!(:credit_card) { create(:credit_card, gateway_customer_profile_id: "cus_1", gateway_payment_profile_id: 'card_2') }
|
||||
let!(:payment) { create(:payment, order: order, state: 'completed', payment_method: payment_method, response_code: 'ch_1a2b3c', amount: order.total) }
|
||||
|
||||
@@ -76,7 +76,7 @@ describe Spree::Admin::PaymentsController, type: :controller do
|
||||
before { @request.env['HTTP_REFERER'] = spree.admin_order_payments_url(payment) }
|
||||
|
||||
context "that was processed by stripe" do
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop]) }
|
||||
let!(:payment) { create(:payment, order: order, state: 'completed', payment_method: payment_method, response_code: 'ch_1a2b3c', amount: order.total + 5) }
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
require 'spec_helper'
|
||||
require 'spree/api/testing_support/helpers'
|
||||
|
||||
module Spree
|
||||
describe Spree::Api::OrdersController, type: :controller do
|
||||
|
||||
end
|
||||
end
|
||||
@@ -531,6 +531,8 @@ FactoryBot.define do
|
||||
factory :stripe_payment_method, :class => Spree::Gateway::StripeConnect do
|
||||
name 'Stripe'
|
||||
environment 'test'
|
||||
distributors { [FactoryBot.create(:enterprise)] }
|
||||
preferred_enterprise_id { distributors.first.id }
|
||||
end
|
||||
|
||||
factory :stripe_account do
|
||||
|
||||
@@ -1,12 +1,23 @@
|
||||
attach_per_item_trait = proc do
|
||||
trait :per_item do
|
||||
transient { amount 1 }
|
||||
calculator { build(:calculator_per_item, preferred_amount: amount) }
|
||||
FactoryBot.define do
|
||||
factory :calculator_flat_rate, class: Spree::Calculator::FlatRate do
|
||||
preferred_amount { generate(:calculator_amount) }
|
||||
end
|
||||
end
|
||||
|
||||
FactoryBot.modify do
|
||||
factory :payment_method, &attach_per_item_trait
|
||||
factory :shipping_method, &attach_per_item_trait
|
||||
factory :enterprise_fee, &attach_per_item_trait
|
||||
attach_calculator_traits = proc do
|
||||
trait :flat_rate do
|
||||
transient { amount 1 }
|
||||
calculator { build(:calculator_flat_rate, preferred_amount: amount) }
|
||||
end
|
||||
|
||||
trait :per_item do
|
||||
transient { amount 1 }
|
||||
calculator { build(:calculator_per_item, preferred_amount: amount) }
|
||||
end
|
||||
end
|
||||
|
||||
factory :payment_method, &attach_calculator_traits
|
||||
factory :shipping_method, &attach_calculator_traits
|
||||
factory :enterprise_fee, &attach_calculator_traits
|
||||
end
|
||||
|
||||
@@ -98,7 +98,7 @@ feature %q{
|
||||
before do
|
||||
click_link 'Enterprises'
|
||||
click_link 'Test Enterprise'
|
||||
within('.side_menu') { click_link 'Users' }
|
||||
navigate_to_enterprise_users
|
||||
expect(page).to have_selector "table.managers"
|
||||
end
|
||||
|
||||
@@ -131,7 +131,8 @@ feature %q{
|
||||
it "shows changes to enterprise contact or owner" do
|
||||
select2_select user2.email, from: 'receives_notifications_dropdown'
|
||||
within('#save-bar') { click_button 'Update' }
|
||||
within('.side_menu') { click_link 'Users' }
|
||||
navigate_to_enterprise_users
|
||||
expect(page).to have_selector "table.managers"
|
||||
|
||||
within 'table.managers' do
|
||||
within "tr#manager-#{user1.id}" do
|
||||
@@ -156,6 +157,9 @@ feature %q{
|
||||
click_button I18n.t('js.admin.modals.close')
|
||||
end
|
||||
|
||||
expect(page).not_to have_selector "#invite-manager-modal"
|
||||
expect(page).to have_selector "table.managers"
|
||||
|
||||
new_user = Spree::User.find_by_email_and_confirmed_at(new_email, nil)
|
||||
expect(Enterprise.managed_by(new_user)).to include enterprise
|
||||
|
||||
@@ -170,9 +174,14 @@ feature %q{
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def navigate_to_enterprise_users
|
||||
within ".side_menu" do
|
||||
click_link "Users"
|
||||
end
|
||||
end
|
||||
|
||||
def have_relationship(user, enterprise)
|
||||
have_table_row [user.email, 'manages', enterprise.name, '']
|
||||
end
|
||||
|
||||
@@ -153,7 +153,7 @@ xfeature 'Subscriptions' do
|
||||
let!(:order_cycle) { create(:simple_order_cycle, coordinator: shop, orders_open_at: 2.days.from_now, orders_close_at: 7.days.from_now) }
|
||||
let!(:outgoing_exchange) { order_cycle.exchanges.create(sender: shop, receiver: shop, variants: [test_variant, shop_variant], enterprise_fees: [enterprise_fee]) }
|
||||
let!(:schedule) { create(:schedule, order_cycles: [order_cycle]) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, name: 'Credit Card', distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, name: 'Credit Card', distributors: [shop]) }
|
||||
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
|
||||
|
||||
before do
|
||||
@@ -300,7 +300,7 @@ xfeature 'Subscriptions' do
|
||||
let!(:variant3_oc) { create(:simple_order_cycle, coordinator: shop, orders_open_at: 2.days.from_now, orders_close_at: 7.days.from_now) }
|
||||
let!(:variant3_ex) { variant3_oc.exchanges.create(sender: shop, receiver: shop, variants: [variant3]) }
|
||||
let!(:payment_method) { create(:payment_method, distributors: [shop]) }
|
||||
let!(:stripe_payment_method) { create(:stripe_payment_method, name: 'Credit Card', distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:stripe_payment_method) { create(:stripe_payment_method, name: 'Credit Card', distributors: [shop]) }
|
||||
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
|
||||
let!(:subscription) {
|
||||
create(:subscription,
|
||||
@@ -438,7 +438,7 @@ xfeature 'Subscriptions' do
|
||||
let!(:enterprise_fee) { create(:enterprise_fee, amount: 1.75) }
|
||||
let!(:order_cycle) { create(:simple_order_cycle, coordinator: shop) }
|
||||
let!(:schedule) { create(:schedule, order_cycles: [order_cycle]) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop], preferred_enterprise_id: shop.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [shop]) }
|
||||
let!(:shipping_method) { create(:shipping_method, distributors: [shop]) }
|
||||
|
||||
before do
|
||||
|
||||
@@ -159,10 +159,7 @@ feature "As a consumer I want to check out my cart", js: true, retry: 3 do
|
||||
|
||||
context "with Stripe" do
|
||||
let!(:stripe_pm) do
|
||||
create(:stripe_payment_method,
|
||||
distributors: [distributor],
|
||||
name: "Stripe",
|
||||
preferred_enterprise_id: distributor.id)
|
||||
create(:stripe_payment_method, distributors: [distributor])
|
||||
end
|
||||
|
||||
let!(:saved_card) do
|
||||
|
||||
@@ -249,6 +249,7 @@ xdescribe ProductImport::ProductImporter do
|
||||
csv_data = CSV.generate do |csv|
|
||||
csv << ["name", "producer", "category", "on_hand", "price", "units", "unit_type", "display_name", "shipping_category_id"]
|
||||
csv << ["Potatoes", "User Enterprise", "Vegetables", "5", "3.50", "500", "g", "Small Bag", shipping_category_id_str]
|
||||
csv << ["Chives", "User Enterprise", "Vegetables", "6", "4.50", "500", "g", "Small Bag", shipping_category_id_str]
|
||||
csv << ["Potatoes", "User Enterprise", "Vegetables", "6", "5.50", "2", "kg", "Big Bag", shipping_category_id_str]
|
||||
end
|
||||
File.write('/tmp/test-m.csv', csv_data)
|
||||
@@ -262,17 +263,17 @@ xdescribe ProductImport::ProductImporter do
|
||||
@importer.validate_entries
|
||||
entries = JSON.parse(@importer.entries_json)
|
||||
|
||||
expect(filter('valid', entries)).to eq 2
|
||||
expect(filter('valid', entries)).to eq 3
|
||||
expect(filter('invalid', entries)).to eq 0
|
||||
expect(filter('create_product', entries)).to eq 2
|
||||
expect(filter('create_product', entries)).to eq 3
|
||||
end
|
||||
|
||||
it "saves and updates" do
|
||||
@importer.save_entries
|
||||
|
||||
expect(@importer.products_created_count).to eq 2
|
||||
expect(@importer.products_created_count).to eq 3
|
||||
expect(@importer.updated_ids).to be_a(Array)
|
||||
expect(@importer.updated_ids.count).to eq 2
|
||||
expect(@importer.updated_ids.count).to eq 3
|
||||
|
||||
small_bag = Spree::Variant.find_by_display_name('Small Bag')
|
||||
expect(small_bag.product.name).to eq 'Potatoes'
|
||||
|
||||
@@ -794,7 +794,7 @@ describe Spree::Order do
|
||||
describe "determining checkout steps for an order" do
|
||||
let!(:enterprise) { create(:enterprise) }
|
||||
let!(:order) { create(:order, distributor: enterprise) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributor_ids: [enterprise.id], preferred_enterprise_id: enterprise.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributor_ids: [enterprise.id]) }
|
||||
let!(:payment) { create(:payment, order: order, payment_method: payment_method) }
|
||||
|
||||
it "does not include the :confirm step" do
|
||||
|
||||
@@ -8,7 +8,7 @@ describe "checking out an order with a Stripe Connect payment method", type: :re
|
||||
let!(:enterprise) { create(:distributor_enterprise) }
|
||||
let!(:exchange) { create(:exchange, order_cycle: order_cycle, sender: order_cycle.coordinator, receiver: enterprise, incoming: false, pickup_time: "Monday") }
|
||||
let!(:shipping_method) { create(:shipping_method, calculator: Spree::Calculator::FlatRate.new(preferred_amount: 0), distributors: [enterprise]) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [enterprise], preferred_enterprise_id: enterprise.id) }
|
||||
let!(:payment_method) { create(:stripe_payment_method, distributors: [enterprise]) }
|
||||
let!(:stripe_account) { create(:stripe_account, enterprise: enterprise) }
|
||||
let!(:line_item) { create(:line_item, price: 12.34) }
|
||||
let!(:order) { line_item.order }
|
||||
|
||||
@@ -11,6 +11,16 @@ describe BulkInvoiceService do
|
||||
|
||||
expect(Delayed::Job.last.payload_object.method_name).to eq :start_pdf_job_without_delay
|
||||
end
|
||||
|
||||
it "creates a PDF invoice" do
|
||||
order = create(:completed_order_with_fees)
|
||||
order.bill_address = order.ship_address
|
||||
order.save!
|
||||
|
||||
service.start_pdf_job_without_delay([order.id])
|
||||
|
||||
expect(service.invoice_created?(service.id)).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe "#invoice_created?" do
|
||||
|
||||
20
spec/services/invoice_renderer_spec.rb
Normal file
20
spec/services/invoice_renderer_spec.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe InvoiceRenderer do
|
||||
let(:service) { described_class.new }
|
||||
|
||||
it "creates a PDF invoice with two different templates" do
|
||||
order = create(:completed_order_with_fees)
|
||||
order.bill_address = order.ship_address
|
||||
order.save!
|
||||
|
||||
result = service.render_to_string(order)
|
||||
expect(result).to match /^%PDF/
|
||||
|
||||
allow(Spree::Config).to receive(:invoice_style2?).and_return true
|
||||
|
||||
alternative = service.render_to_string(order)
|
||||
expect(alternative).to match /^%PDF/
|
||||
expect(alternative).to_not eq result
|
||||
end
|
||||
end
|
||||
20
spec/services/upload_sanitizer_spec.rb
Normal file
20
spec/services/upload_sanitizer_spec.rb
Normal file
@@ -0,0 +1,20 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe UploadSanitizer do
|
||||
describe "#call" do
|
||||
let(:upload) do
|
||||
File.open("/tmp/unsanitized.csv", 'wb:ascii-8bit') do |f|
|
||||
f << "\xEF\xBB\xBF"
|
||||
f << "Test"
|
||||
end
|
||||
end
|
||||
let(:service) { UploadSanitizer.new(File.open(upload).read) }
|
||||
|
||||
it "sanitizes the uploaded file" do
|
||||
sanitized_upload = service.call
|
||||
|
||||
expect(sanitized_upload.encoding.name).to eq "UTF-8"
|
||||
expect(sanitized_upload.to_s).to eq "Test"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user