Compare commits

...

120 Commits

Author SHA1 Message Date
Transifex-Openfoodnetwork
6c69eebcbf Updating translations for config/locales/nb.yml [skip ci] 2017-06-27 05:41:31 +10:00
Transifex-Openfoodnetwork
63e453e2c7 Updating translations for config/locales/fr.yml [skip ci] 2017-06-23 18:09:39 +10:00
Maikel Linke
ec53d9df7a Merge tag 'v1.8.11' into transifex 2017-06-15 09:59:59 +10:00
sseerrggii
18c7b03f3d Add plurals 2017-05-26 16:51:29 +10:00
Rob Harrington
8b560e6cee Cleaning up angular variant units controllers a little bit 2017-05-24 15:05:33 +10:00
Matt-Yorkley
7974ac45f2 Add unit description placeholder 2017-05-24 15:05:33 +10:00
Matt-Yorkley
41b5cf10dd Quick testing update 2017-05-24 15:05:33 +10:00
Matt-Yorkley
b6955cb98c Updated variant feature spec 2017-05-24 15:05:33 +10:00
Matt-Yorkley
6c36c269c8 Product Edit UX adjustments 2017-05-24 15:05:33 +10:00
Pierre de Lacroix
b879ea5a96 add comments 2017-05-24 14:37:54 +10:00
Pierre de Lacroix
a6ed4a2c6a fix bad return value
in method Spree::Adjustment#find_closest_tax_rates_from_included_tax
2017-05-24 14:37:54 +10:00
Pierre de Lacroix
6972822c49 fix escaping problems on ticket view 2017-05-24 13:35:59 +10:00
Pierre de Lacroix
db63f30a76 cosmetic fixes to the ticket view 2017-05-24 13:35:59 +10:00
Rob Harrington
848193434b Show item single_display_amount instead of variant price in order details table
Also has the effect of taking the inventory price into account (since it is stored against the line item price)
2017-05-19 17:27:04 +10:00
stveep
570f0344da Remove unused method in wrong controller ^_^ 2017-05-19 16:14:22 +10:00
stveep
38c25c412f Remove duplicated spec, better error message suppression, fix shipping test to wait correctly 2017-05-19 16:14:22 +10:00
stveep
3b4ffe1f70 Suppress line item validation error for newly-created orders 2017-05-19 16:10:06 +10:00
stveep
4699c654fc Fix feature specs for new 'new admin order' flow 2017-05-19 16:10:06 +10:00
stveep
c1c5d00f45 Add new view to set distribution, ensure the scoped variant single item price is used. 2017-05-19 16:10:06 +10:00
stveep
220693f4e3 Starting alternative flow for new manual order 2017-05-19 16:06:43 +10:00
stveep
fcce858ea4 Fix OC with override factory 2017-05-19 16:06:43 +10:00
stveep
1f9698f7a2 Test to reproduce bug with overridden price not being displayed when an order is added manually 2017-05-19 16:06:43 +10:00
Rob Harrington
1766da9d60 Adding ng-cloak directive to changeable orders banner 2017-05-19 15:54:55 +10:00
Rob Harrington
15ee62aaa8 Fixing race condition on link click in spec/features/consumer/shops_spec.rb 2017-05-19 13:29:47 +10:00
Rob Harrington
6fc4a297a0 Fixing race condition on link click in spec/features/consumer/shopping/products_spec.rb 2017-05-19 13:15:30 +10:00
Rob Harrington
74d8dc48b4 Rewriting shopfront alert regarding changeable orders to be dynamic 2017-05-18 15:35:07 +10:00
Rob Harrington
b6f4ce373e Preloading variants for VariantOverride.indexed 2017-05-18 15:34:22 +10:00
Rob Harrington
c9f186f48f Fixing SlideOutUp animation for darkswarm 2017-05-18 15:33:14 +10:00
Rob Harrington
daab0dfd7a Refactor: Splitting changeable_order_from_number out into separate method 2017-05-17 12:38:17 +10:00
Rob Harrington
22b5dafad2 Further tweaks to LineItemsController 2017-05-17 12:27:29 +10:00
Transifex-Openfoodnetwork
110f74eee8 Updating translations for config/locales/es.yml [skip ci] 2017-05-12 20:49:15 +10:00
Rob Harrington
61cb78fc93 Tweaks to LineItemsController, renaming #index to #bought 2017-05-12 16:29:15 +10:00
Rob Harrington
38d3b446cc Removing unused #tag_list method on VariantSerializer 2017-05-12 16:11:16 +10:00
Rob Harrington
e47e10d267 Removing n+1 query from #items_bought_by_user 2017-05-12 16:11:16 +10:00
Rob Harrington
77c8c85775 Memoizing the result of OrdersController#order_to_update 2017-05-12 16:11:16 +10:00
Rob Harrington
fab6d70832 Changeable orders only returns orders if the shop allows changes 2017-05-12 16:11:16 +10:00
Rob Harrington
9586666248 Updating translation for allow_changes option 2017-05-12 16:11:16 +10:00
Continuous Integration
f5ab9a3445 Merge remote-tracking branch 'origin/master' into HEAD 2017-05-12 10:39:06 +10:00
Continuous Integration
1ac8c85113 Merge remote-tracking branch 'origin/master' into HEAD 2017-05-12 09:55:25 +10:00
Rob Harrington
56c2350d36 Updating enterprise fees on completed order from OrdersController#update 2017-05-10 12:04:32 +10:00
Transifex-Openfoodnetwork
6eafed00f5 Updating translations for config/locales/fr.yml [skip ci] 2017-05-05 21:35:28 +10:00
Transifex-Openfoodnetwork
74661c0b77 Updating translations for config/locales/nb.yml [skip ci] 2017-05-05 18:10:25 +10:00
Rob Harrington
c4fbcb19d0 Only show Admin & Handling fees once on completed order form 2017-05-05 15:28:01 +10:00
Rob Harrington
08e391856c Ask user to confirm cancellation of order 2017-05-05 15:17:14 +10:00
Rob Harrington
8c8b40c5a8 Showing order cycle close time on banner when multiple open orders are present 2017-05-05 14:20:57 +10:00
Rob Harrington
c3eda435eb Hiding 'Back to Cart' and 'Back to Store' buttons on completed orders when distributor does not match cart 2017-05-05 14:20:57 +10:00
Rob Harrington
5eadb33db9 Using changes_allowed? to authorize cancellation of line_items 2017-05-05 14:20:57 +10:00
Rob Harrington
f977a05b08 Fixing broken spec for fetching list of bought items as json 2017-05-05 14:20:57 +10:00
Rob Harrington
217eda8362 Shipping and payment fees are updated for completed orders when the order changes 2017-05-05 14:20:57 +10:00
Rob Harrington
579f3bf90a Changing quantity and deleting line_items of completed orders works with inventory where present 2017-05-05 14:20:57 +10:00
Rob Harrington
348ab81c42 Overriding #increment! using variant overrides 2017-05-05 14:20:57 +10:00
Rob Harrington
3df629bc6e Prevent users from removing the final line item of an order, suggest cancelling instead 2017-05-05 14:20:57 +10:00
Rob Harrington
07b2f0a7c2 Showing banner for distributor of order on order summary, regardless of current_distributor 2017-05-05 14:20:57 +10:00
Rob Harrington
c0445d46f3 Changeable orders ignores cancelled orders 2017-05-05 14:20:57 +10:00
Rob Harrington
6c90b4e6d0 Adding alert to order summary, notifying user of remaining time to make changes 2017-05-05 14:20:57 +10:00
Rob Harrington
e79a23a554 Disabling save button on order page until changes are made to the order 2017-05-05 14:20:57 +10:00
Rob Harrington
314ccc2f27 Ensuring that #items_bought_by_user doesn't return items from cancelled orders 2017-05-05 14:20:57 +10:00
Rob Harrington
68c8759af1 Count of items in cart form looks is consistent with rest of UI (ie. uses quantities) 2017-05-05 14:20:57 +10:00
Rob Harrington
314e9a4f15 Open shopfront existing orders flash link in a new window 2017-05-05 14:20:57 +10:00
Rob Harrington
0029a1b6cf Ensure order adjustments are displayed in edit form for customers 2017-05-05 14:20:57 +10:00
Rob Harrington
bfcde72855 Use explicit format for dates on front-end account page 2017-05-05 14:20:57 +10:00
Rob Harrington
3d0ada803f Test presence of 'Edit' link for previous orders in cart 2017-05-05 14:20:57 +10:00
Rob Harrington
840c936a6f OrderSerializer#changes_allowed_until returns 'Not allowed' unless changes are allowed 2017-05-05 14:20:57 +10:00
Rob Harrington
7ea74ccf4a Order confirmation redirects 'Back to Cart' if cart is non-empty 2017-05-05 14:20:57 +10:00
Rob Harrington
b55036e165 Adding alert to shopfront to alert user to presence of orders open for editing 2017-05-05 14:20:57 +10:00
Rob Harrington
47011e11ff order_cycle.items_bought_by_user actually scopes to the current distributor 2017-05-05 14:20:57 +10:00
Rob Harrington
ae28d7a96b Adding a link in cart to allow user to edit existing + open orders for same OC 2017-05-05 14:20:57 +10:00
Rob Harrington
0dd8959bf7 Use an actual completed order for OrdersController#order_to_update spec 2017-05-05 14:20:57 +10:00
Rob Harrington
316b0915e4 Just display the date that orders can be changed until
No fancy moment.js stuff
2017-05-05 14:20:57 +10:00
Rob Harrington
e21bfd95f4 Renaming order.editable? to order.changes_allowed? 2017-05-05 14:20:57 +10:00
Rob Harrington
893331c7bb Adding 'Open Orders' section to the top of customer accounts page 2017-05-05 14:20:57 +10:00
Rob Harrington
b94bcd697f Restructuring customer accounts spec 2017-05-05 14:19:32 +10:00
Rob Harrington
b0ff7ca767 Making accounts page orders listing full-width 2017-05-05 14:19:32 +10:00
Rob Harrington
493a537f2c Making out-of-stock products in the cart more visible 2017-05-05 14:19:32 +10:00
Rob Harrington
cda43f075b Moving bought items listing up into main section of cart 2017-05-05 14:19:32 +10:00
Rob Harrington
5d9f92eaa7 Adding 'Cancel Order' button to order confimation interface 2017-05-05 14:19:32 +10:00
Rob Harrington
c6afa1849c Basic routing for front-end OrdersController#cancel action 2017-05-05 14:19:32 +10:00
Rob Harrington
eec3a21c89 Allow editing of completed orders from confirmation page where distributor allows it 2017-05-05 14:19:32 +10:00
Rob Harrington
768240a5ba Reorganising darkswarm order views into partials 2017-05-05 14:19:32 +10:00
Rob Harrington
5af8668560 Rewriting Spree::Taxons.distributed_taxons for better performance 2017-05-05 14:19:32 +10:00
Rob Harrington
630b8a2577 Add OrdersController#order_to_update method, to allow updating a complete order where appropriate 2017-05-05 14:19:32 +10:00
Maikel Linke
12a6f652ad Warn when allowing guest orders and order changes 2017-05-05 14:19:32 +10:00
Maikel Linke
db4a528ba3 Update shipment to re-calculate included tax
And re-create tax charges on the order. (untested)
2017-05-05 14:19:32 +10:00
Maikel Linke
479c7ba24b Update transaction fees of completed orders
The adjustments associated to incomplete payments are re-calculated when
a line item is removed from a completed order.
2017-05-05 14:19:32 +10:00
Maikel Linke
1f08729df3 Update shipping fees after removing item
After removing an item from a completed order, update the shipping fees
of all shipments that are pending or ready (not completed).
2017-05-05 14:19:32 +10:00
Maikel Linke
811671661e Remove item from dropdown cart after deletion 2017-05-05 14:19:32 +10:00
Maikel Linke
936df71d0d Link to bought products on cart page
The checkout page was just linking to the cart page, but not scrolling
down.
2017-05-05 14:19:32 +10:00
Maikel Linke
f3f6714472 Add message about previous orders on checkout page
The message appears if the user ordered before within the same order
cycle and the shop allows to change previous orders.
2017-05-05 14:19:32 +10:00
Maikel Linke
3bce2eb7b5 Rename translation key checkout to avoid conflicts
A top-level translation key `checkout` can't co-exist with translation
keys in the path `checkout`. Moving the old key to
`shared.menu.cart.checkout` avoids conflicts. It also structures the
locale better by view.
2017-05-05 14:19:32 +10:00
Maikel Linke
bf05866f92 Change headline of already ordered items 2017-05-05 14:19:32 +10:00
Maikel Linke
219ad4a3a7 Reload bought products after choosing order cycle 2017-05-05 14:19:32 +10:00
Maikel Linke
a7d8028d5a Add retry: 3 to intermittently failing spec 2017-05-05 14:19:32 +10:00
Maikel Linke
d49469a3e6 Show bought items only if changes are allowed
An enterprise can decide to allow changes to orders in open order
cycles. The items of these orders are then displayed in the shopping
cart and can be removed on the cart edit page.
2017-05-05 14:19:32 +10:00
Maikel Linke
4835ef067f Add feature to remove line items from open order cycle
- Add JS controller to send delete requests.
- Add resource controller to destroy items.
- Add authorisation check to abilities.
- Update fees after removing line item.
2017-05-05 14:19:32 +10:00
Maikel Linke
4112c3cc75 Set auth token for all JS HTTP requests 2017-05-05 14:19:32 +10:00
Maikel Linke
0fe4030d71 Display bought items only if present 2017-05-05 14:19:32 +10:00
Maikel Linke
e8d2d4d96f Display already bought items in edit cart view 2017-05-05 14:19:32 +10:00
Maikel Linke
88c3f414fb Handle missing order in cart 2017-05-05 14:18:20 +10:00
Maikel Linke
c0d6b68233 Apply some style guidelines to older code 2017-05-05 14:18:20 +10:00
Maikel Linke
65f62c42b9 Display products already ordered in this oc
Github issue #1083, part of standing orders.

For now, just display already bought products within the same order
cycle in the popup cart view. The edit cart view should follow. Later,
it should be possible to remove items as well.
2017-05-05 14:18:20 +10:00
Maikel Linke
fe7bd5e2cd Serialise tag_list only for variant overrides
Don't try to call tag_list on just variants since that will fail.

Normally, all variants of `current_order` should be extended to
VariantOverrides of the current order cycle. But in development
environment, it can happen that the variants are reloaded without being
extended again.
2017-05-05 14:18:20 +10:00
Maikel Linke
e1b40142b8 Remove unused translations 2017-05-05 14:18:20 +10:00
Maikel Linke
963b4617a9 Add allow-order-changes option to enterprise 2017-05-05 14:18:20 +10:00
Maikel Linke
95ddfc4e40 Merge tag 'v1.8.10' into transifex 2017-05-05 12:28:16 +10:00
François Turbelin
01746ed470 Add missing translations on views 2017-05-04 21:33:17 +02:00
Julius Pabrinkis
f25e3bc6f7 Implement with_currency rspec helper for money amounts 2017-05-04 18:02:38 +01:00
Julius Pabrinkis
e63f1c2991 Refactor time and currency symbol getters 2017-05-03 12:59:16 +01:00
Lynne
29e2886b05 Update contributing.md
Include link to discourse post: How to raise a github issue
2017-05-03 11:50:07 +01:00
Julius Pabrinkis
a97bcf74de Use more simple getter to retrieve currency symbol 2017-05-03 11:25:37 +01:00
Julius Pabrinkis
1e6f4aa73d Restore bundler version 2017-05-03 11:25:37 +01:00
Julius Pabrinkis
7c7933f8bb Use local time zone in tests instead of hardcoded 2017-05-03 11:25:37 +01:00
Julius Pabrinkis
dc69c6e825 Use currency symbol from config in tests 2017-05-03 11:25:37 +01:00
Julius Pabrinkis
41e91765ca Add capybara-screenshot gem for integration tests debugging 2017-05-03 11:25:37 +01:00
Julius Pabrinkis
19569f9316 #1291 Fix dropdown font-size not to zoom in iOS 2017-05-03 10:57:23 +01:00
Maikel Linke
d91c3d1241 Format reset password instructions like Spree 2017-05-03 11:06:48 +10:00
Maikel Linke
b302deb7a3 Add UserMailer specs adapted from Spree code 2017-05-03 11:06:48 +10:00
François Turbelin
2fae467e9a Translate ResetPasswordConfirmation mail 2017-05-03 11:06:48 +10:00
Transifex-Openfoodnetwork
6a5e4bb592 Updating translations for config/locales/sv.yml [skip ci] 2017-04-30 23:38:53 +10:00
Transifex-Openfoodnetwork
507e12adba Updating translations for config/locales/fr.yml [skip ci] 2017-04-20 22:05:19 +10:00
Transifex-Openfoodnetwork
5fa45c0716 Updating translations for config/locales/es.yml [skip ci] 2017-04-08 01:22:10 +10:00
129 changed files with 3309 additions and 972 deletions

View File

@@ -1,3 +1,6 @@
See this here post on raising a github issue:
https://community.openfoodnetwork.org/t/how-to-raise-a-github-issue/912
# Contributing
We love pull requests from everyone. Here are some instructions for

View File

@@ -115,7 +115,6 @@ end
group :test do
gem 'webmock'
# See spec/spec_helper.rb for instructions
#gem 'perftools.rb'
end

View File

@@ -0,0 +1,24 @@
angular.module("admin.products").controller "editUnitsCtrl", ($scope, VariantUnitManager) ->
$scope.product =
variant_unit: angular.element('#variant_unit').val()
variant_unit_scale: angular.element('#variant_unit_scale').val()
$scope.variant_unit_options = VariantUnitManager.variantUnitOptions()
if $scope.product.variant_unit == 'items'
$scope.variant_unit_with_scale = 'items'
else
$scope.variant_unit_with_scale = $scope.product.variant_unit + '_' + $scope.product.variant_unit_scale
$scope.setFields = ->
if $scope.variant_unit_with_scale == 'items'
variant_unit = 'items'
variant_unit_scale = null
else
options = $scope.variant_unit_with_scale.split('_')
variant_unit = options[0]
variant_unit_scale = options[1]
$scope.product.variant_unit = variant_unit
$scope.product.variant_unit_scale = variant_unit_scale

View File

@@ -0,0 +1,14 @@
angular.module("admin.products").controller "variantUnitsCtrl", ($scope, VariantUnitManager, $timeout) ->
$scope.unitName = (scale, type) ->
VariantUnitManager.getUnitName(scale, type)
$scope.scale = angular.element('#product_variant_unit_scale').val()
$scope.updateValue = ->
unit_value_human = angular.element('#unit_value_human').val()
$scope.unit_value = unit_value_human * $scope.scale
variant_unit_value = angular.element('#variant_unit_value').val()
$scope.unit_value_human = variant_unit_value / $scope.scale
$timeout -> $scope.updateValue()

View File

@@ -1,8 +1,8 @@
$ ->
if ($ 'form#update-cart').is('*')
($ 'form#update-cart a.delete').show().one 'click', ->
($ this).parents('.line-item').first().find('input.line_item_quantity').val 0
($ this).parents('form').first().submit()
if $('form#update-cart').is('*') || $('form#update-order').is('*')
$('form#update-cart a.delete, form#update-order a.delete').show().one 'click', ->
$(this).parents('.line-item').first().find('input.line_item_quantity').val 0
$(this).parents('form').first().submit()
false
($ 'form#update-cart').submit ->

View File

@@ -0,0 +1,12 @@
Darkswarm.controller "EditBoughtOrderController", ($scope, $resource, Cart) ->
$scope.showBought = false
$scope.deleteLineItem = (id) ->
params = {id: id}
success = (response) ->
$(".line-item-" + id).remove()
Cart.removeFinalisedLineItem(id)
fail = (error) ->
console.log error
$resource("/line_items/:id").delete(params, success, fail)

View File

@@ -10,7 +10,7 @@ Darkswarm.controller "OrderCycleCtrl", ($scope, $timeout, OrderCycle) ->
$("#order_cycle_id").trigger("openTrigger")
Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $timeout, OrderCycle, Products, Variants, Cart) ->
Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $timeout, OrderCycle, Products, Variants, Cart, ChangeableOrdersAlert) ->
# Track previous order cycle id for use with revertOrderCycle()
$scope.previous_order_cycle_id = OrderCycle.order_cycle.order_cycle_id
$scope.$watch 'order_cycle.order_cycle_id', (newValue, oldValue)->
@@ -30,3 +30,5 @@ Darkswarm.controller "OrderCycleChangeCtrl", ($scope, $timeout, OrderCycle, Prod
Variants.clear()
Cart.clear()
Products.update()
Cart.reloadFinalisedLineItems()
ChangeableOrdersAlert.reload()

View File

@@ -11,8 +11,7 @@ window.Darkswarm = angular.module("Darkswarm", ["ngResource",
'angularFileUpload',
'angularSlideables'
]).config ($httpProvider, $tooltipProvider, $locationProvider, $anchorScrollProvider) ->
$httpProvider.defaults.headers.post['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content')
$httpProvider.defaults.headers.put['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content')
$httpProvider.defaults.headers['common']['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content')
$httpProvider.defaults.headers['common']['X-Requested-With'] = 'XMLHttpRequest'
$httpProvider.defaults.headers.common.Accept = "application/json, text/javascript, */*"

View File

@@ -0,0 +1,5 @@
Darkswarm.directive "changeableOrdersAlert", (ChangeableOrdersAlert) ->
restrict: "C"
scope: true
link: (scope, element, attrs) ->
scope.alert = ChangeableOrdersAlert

View File

@@ -0,0 +1,9 @@
Darkswarm.directive "confirmLinkClick", ($window) ->
restrict: 'A'
scope:
confirmMsg: '@confirmLinkClick'
link: (scope, elem, attr) ->
elem.bind 'click', (event) ->
unless confirm(scope.confirmMsg)
event.preventDefault()
event.stopPropagation()

View File

@@ -6,7 +6,11 @@ Darkswarm.directive "ofnOnHand", ->
# In cases where this field gets its value from the HTML element rather than the model,
# initialise the model with the HTML value.
if scope.$eval(attr.ngModel) == undefined
ngModel.$setViewValue elem.val()
# Don't dirty the model when we do this
setDirty = ngModel.$setDirty
ngModel.$setDirty = angular.noop
ngModel.$setViewValue(elem.val())
ngModel.$setDirty = setDirty
ngModel.$parsers.push (viewValue) ->
on_hand = parseInt(attr.ofnOnHand)

View File

@@ -1,4 +1,4 @@
Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $rootScope, localStorageService)->
Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $rootScope, $resource, localStorageService) ->
# Handles syncing of current cart/order state to server
new class Cart
dirty: false
@@ -6,11 +6,15 @@ Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $roo
update_enqueued: false
order: CurrentOrder.order
line_items: CurrentOrder.order?.line_items || []
line_items_finalised: CurrentOrder.order?.finalised_line_items || []
constructor: ->
for line_item in @line_items
line_item.variant.line_item = line_item
Variants.register line_item.variant
for line_item in @line_items_finalised
line_item.variant.line_item = line_item
Variants.extend line_item.variant
adjust: (line_item) =>
line_item.total_price = line_item.variant.price_with_fees * line_item.quantity
@@ -115,3 +119,15 @@ Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $roo
clear: ->
@line_items = []
localStorageService.clearAll() # One day this will have to be moar GRANULAR
removeFinalisedLineItem: (id) =>
@line_items_finalised = @line_items_finalised.filter (item) ->
item.id != id
reloadFinalisedLineItems: =>
@line_items_finalised = []
$resource("/line_items/bought").query (items) =>
for line_item in items
line_item.variant.line_item = line_item
Variants.extend line_item.variant
@line_items_finalised = items

View File

@@ -0,0 +1,14 @@
Darkswarm.factory 'ChangeableOrdersAlert', ($http) ->
new class ChangeableOrdersAlert
html: ''
visible: true
constructor: ->
@reload()
reload: ->
$http.get('/shop/changeable_orders_alert').then (response) =>
@html = response.data.trim()
close: =>
@visible = false

View File

@@ -3,10 +3,12 @@ Darkswarm.factory 'Orders', (orders_by_distributor, currencyConfig, CurrentHub,
constructor: ->
# Populate Orders.orders from json in page.
@orders_by_distributor = orders_by_distributor
@changeable_orders = []
@currency_symbol = currencyConfig.symbol
for distributor in @orders_by_distributor
@updateRunningBalance(distributor.distributed_orders)
@findChangeableOrders(distributor.distributed_orders)
@updateRunningBalance(distributor.distributed_orders)
updateRunningBalance: (orders) ->
@@ -14,3 +16,7 @@ Darkswarm.factory 'Orders', (orders_by_distributor, currencyConfig, CurrentHub,
balances = orders.slice(i,orders.length).map (o) -> parseFloat(o.outstanding_balance)
running_balance = balances.reduce (a,b) -> a+b
order.running_balance = running_balance.toFixed(2)
findChangeableOrders: (orders) ->
for order in orders when order.changes_allowed
@changeable_orders.push(order)

View File

@@ -1,4 +1,4 @@
%div{ ng: { show: "data.length > limit" } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'limit = limit + increment' } }
or
%input{ type: 'button', value: t(:show_more_with_more, num: '{{ data.length - limit }}'), ng: { click: 'limit = data.length' } }
%input{ type: 'button', value: t(:show_all_with_more, num: '{{ data.length - limit }}'), ng: { click: 'limit = data.length' } }

View File

@@ -0,0 +1,3 @@
form[name="enterprise_form"] div.row.warning {
color: #DA7F52;
}

View File

@@ -19,7 +19,7 @@
height: 100px
width: 100px
margin-right: 12px
location
@include headingFont
@media all and (max-width: 768px)
@@ -30,7 +30,7 @@
margin-top: 0
@media all and (max-width: 768px)
margin-bottom: 8px
ordercycle
text-align: right
@@ -47,24 +47,26 @@
p
max-width: 100%
float: right
form.custom
form.custom
text-align: right
& > strong
line-height: 2.5
font-size: 1.29em
padding-right: 14px
@media all and (max-width: 768px)
select
select
width: inherit
display: inline-block
border-width: 1px
border-color: #999
color: #666
font-size: 1em
font-size: 1em
margin-bottom: 0
padding: 8px 20px 8px 12px
@media all and (max-width: 768px)
font-size: 0.875em
@media screen and (-webkit-min-device-pixel-ratio:0)
font-size: 16px
closing
@include headingFont
@media all and (max-width: 768px)

View File

@@ -1,16 +1,14 @@
@import "branding";
@import "mixins";
.account-summary {
color: #4a4a4a;
}
.orders {
@include sidepaddingSm;
@include panepadding;
padding-top: 10px;
h3 {
padding-top: 2em;
}
margin-top: 50px;
margin-bottom: 100px;
a {
color: $clr-brick;
@@ -26,6 +24,12 @@
height: auto;
}
.active_table_row {
h3 {
margin-top: 0.5em;
}
}
i.ofn-i_059-producer, i.ofn-i_060-producer-reversed {
font-size: 3rem;
display: inline-block;
@@ -61,6 +65,7 @@
.transaction-group {}
table {
width: 100%;
border-radius: 0.5em 0.5em 0 0;
tr:nth-of-type(even) {

View File

@@ -33,7 +33,9 @@
@-webkit-keyframes slideOutUp {
0% {
opacity: 1;
-webkit-transform: translateY(0);
-ms-transform: translateY(0);
transform: translateY(0);
}
@@ -46,10 +48,18 @@
@keyframes slideOutUp {
0% {
opacity: 1;
-webkit-transform: translateY(0);
-ms-transform: translateY(0);
transform: translateY(0);
}
100% {
opacity: 0;
-webkit-transform: translateY(-20px);
-ms-transform: translateY(-20px);
transform: translateY(-20px);
}
}
@-webkit-keyframes fadeIn {

View File

@@ -6,23 +6,25 @@
background-color: #e1f0f5
padding: 1em
width: 100%
border: none
color: inherit
checkout
display: block
@media all and (max-width: 640px)
&.row .row
@media all and (max-width: 640px)
&.row .row
margin-left: 0
margin-right: 0
orderdetails
.button, table
width: 100%
@media all and (max-width: 640px)
@media all and (max-width: 640px)
form.edit_order
border: 1px solid $disabled-bright
margin-bottom: 2rem
#details, #billing, #shipping, #payment
border: 0
margin: 1em 0
@@ -34,20 +36,20 @@ checkout
margin: 0
padding: 0.65em
background: #f7f7f7
.label
.label
font-size: 1em
padding: 0.3rem 0.35rem 0.275rem
// Logic to turn on & off the alerts for success against each fieldset
label, label.alert, label.success, &.valid label.alert, &.dirty label.success
label, label.alert, label.success, &.valid label.alert, &.dirty label.success
display: none
&.dirty label.alert
&.dirty label.alert
display: inline
&.dirty.valid label.alert
display: none
&.dirty.valid label.alert
display: none
&.valid label.success
display: inline
@@ -60,7 +62,7 @@ checkout
text-align: left
// Logic to swap out up / down accordion icons
//Foundation overrides
//Foundation overrides
dd > a
@include csstrans
background: $disabled-light !important
@@ -68,7 +70,7 @@ checkout
dd > a:hover
background: $disabled-v-dark !important
color: white
dd
span.accordion-up
display: none
@@ -79,4 +81,3 @@ checkout
display: inline
span.accordion-down
display: none

View File

@@ -110,6 +110,10 @@
}
}
.alert-box.changeable-orders-alert {
margin-bottom: 0px;
}
.alert-box.shopfront-message {
border: 2px solid $clr-turquoise;
border-radius: 5px;

View File

@@ -72,11 +72,35 @@
// Shopping cart
#cart-detail {
.cart-item-delete {
a.delete {
.cart-item-delete, .bought-item-delete {
a {
font-size: 1.125em;
}
}
.out-of-stock {
color: $clr-brick;
}
button, .button {
margin: 0;
}
.toggle-bought {
cursor: pointer;
}
tr.bought td {
color: $med-grey;
h5 {
color: $med-grey;
}
.already-confirmed {
float: right;
}
}
}
.item-thumb-image {
@@ -90,9 +114,3 @@
height: 36px;
}
}
#edit-cart {
button, .button {
margin: 0;
}
}

View File

@@ -0,0 +1,48 @@
class LineItemsController < BaseController
respond_to :json
before_filter :load_line_item, only: :destroy
def bought
respond_with bought_items, each_serializer: Api::LineItemSerializer
end
def destroy
authorize! :destroy, @line_item
destroy_with_lock @line_item
respond_with(@line_item)
end
private
def load_line_item
@line_item = Spree::LineItem.find_by_id(params[:id])
not_found unless @line_item
end
# List all items the user already ordered in the current order cycle
def bought_items
return [] unless current_order_cycle && spree_current_user && current_distributor
current_order_cycle.items_bought_by_user(spree_current_user, current_distributor)
end
def unauthorized
status = spree_current_user ? 403 : 401
render nothing: true, status: status and return
end
def not_found
render nothing: true, status: 404 and return
end
def destroy_with_lock(item)
order = item.order
order.with_lock do
item.destroy
order.update_shipping_fees!
order.update_payment_fees!
order.update_distribution_charge!
order.create_tax_charge!
end
end
end

View File

@@ -37,6 +37,10 @@ class ShopController < BaseController
end
end
def changeable_orders_alert
render layout: false
end
private
def filtered_json(products_json)

View File

@@ -12,6 +12,9 @@ Spree::Admin::OrdersController.class_eval do
before_filter :load_distribution_choices, only: [:new, :edit, :update]
# Ensure that the distributor is set for an order when
before_filter :ensure_distribution, only: :new
# After updating an order, the fees should be updated as well
# Currently, adding or deleting line items does not trigger updating the
# fees! This is a quick fix for that.
@@ -131,4 +134,16 @@ Spree::Admin::OrdersController.class_eval do
ocs.closed +
ocs.undated
end
def ensure_distribution
unless @order
@order = Spree::Order.new
@order.generate_order_number
@order.save!
end
unless @order.distribution_set?
render 'set_distribution', locals: { order: @order }
end
end
end

View File

@@ -231,7 +231,7 @@ Spree::Admin::ReportsController.class_eval do
@report_types = REPORT_TYPES[:orders_and_fulfillment]
@report_type = params[:report_type]
@include_blank = 'All'
@include_blank = I18n.t(:all)
# -- Build Report with Order Grouper
@report = OpenFoodNetwork::OrdersAndFulfillmentsReport.new spree_current_user, params

View File

@@ -8,10 +8,12 @@ Spree::OrdersController.class_eval do
prepend_before_filter :require_order_cycle, only: :edit
prepend_before_filter :require_distributor_chosen, only: :edit
before_filter :check_hub_ready_for_checkout, only: :edit
before_filter :check_at_least_one_line_item, only: :update
include OrderCyclesHelper
layout 'darkswarm'
respond_to :json
# Patching to redirect to shop if order is empty
def edit
@@ -32,7 +34,7 @@ Spree::OrdersController.class_eval do
def update
@insufficient_stock_lines = []
@order = current_order
@order = order_to_update
unless @order
flash[:error] = t(:order_not_found)
redirect_to root_path and return
@@ -43,12 +45,19 @@ Spree::OrdersController.class_eval do
render :edit and return unless apply_coupon_code
fire_event('spree.order.contents_changed')
if @order == current_order
fire_event('spree.order.contents_changed')
else
@order.update_distribution_charge!
end
respond_with(@order) do |format|
format.html do
if params.has_key?(:checkout)
@order.next_transition.run_callbacks if @order.cart?
redirect_to checkout_state_path(@order.checkout_steps.first)
elsif @order.complete?
redirect_to order_path(@order)
else
redirect_to cart_path
end
@@ -162,6 +171,18 @@ Spree::OrdersController.class_eval do
@order_cycle = OrderCycle.find session[:expired_order_cycle_id]
end
def cancel
@order = Spree::Order.find_by_number!(params[:id])
authorize! :cancel, @order
if @order.cancel
flash[:success] = I18n.t(:orders_your_order_has_been_cancelled)
else
flash[:error] = I18n.t(:orders_could_not_cancel)
end
redirect_to request.referer || order_path(@order)
end
private
@@ -202,4 +223,30 @@ Spree::OrdersController.class_eval do
def wrap_json_infinity(n)
n == Float::INFINITY ? 2147483647 : n
end
def order_to_update
return @order_to_update if defined? @order_to_update
return @order_to_update = current_order unless params[:id]
@order_to_update = changeable_order_from_number
end
# If a specific order is requested, return it if it is COMPLETE and
# changes are allowed and the user has access. Return nil if not.
def changeable_order_from_number
order = Spree::Order.complete.find_by_number(params[:id])
return nil unless order.andand.changes_allowed? && can?(:update, order)
order
end
def check_at_least_one_line_item
return unless order_to_update.andand.complete?
items = params[:order][:line_items_attributes]
.andand.select{ |k,attrs| attrs["quantity"].to_i > 0 }
if items.empty?
flash[:error] = I18n.t(:orders_cannot_remove_the_final_item)
redirect_to order_path(order_to_update)
end
end
end

View File

@@ -16,7 +16,7 @@ module CheckoutHelper
enterprise_fee_adjustments = adjustments.select { |a| a.originator_type == 'EnterpriseFee' && a.source_type != 'Spree::LineItem' }
adjustments.reject! { |a| a.originator_type == 'EnterpriseFee' && a.source_type != 'Spree::LineItem' }
unless exclude.include? :admin_and_handling
adjustments << Spree::Adjustment.new(label: 'Admin & Handling', amount: enterprise_fee_adjustments.sum(&:amount))
adjustments << Spree::Adjustment.new(label: I18n.t(:orders_form_admin), amount: enterprise_fee_adjustments.sum(&:amount))
end
adjustments
@@ -55,7 +55,6 @@ module CheckoutHelper
def display_adjustment_tax_rates(adjustment)
tax_rates = adjustment.tax_rates
return "" if adjustment.amount == adjustment.included_tax
tax_rates.map { |tr| number_to_percentage(tr.amount * 100, :precision => 1) }.join(", ")
end

View File

@@ -88,4 +88,12 @@ module EnterprisesHelper
def remaining_trial_days(enterprise)
distance_of_time_in_words(Time.zone.now, enterprise.shop_trial_start_date + Spree::Config[:shop_trial_length_days].days)
end
def order_changes_allowed?
current_order.andand.distributor.andand.allow_order_changes?
end
def show_bought_items?
order_changes_allowed? && current_order.finalised_line_items.present?
end
end

View File

@@ -16,5 +16,31 @@ module Spree
def cart_count
current_order.andand.line_items.andand.count || 0
end
def changeable_orders
# Only returns open order for the current user + shop + oc combo
return @changeable_orders unless @changeable_orders.nil?
return @changeable_orders = [] unless spree_current_user && current_distributor && current_order_cycle
return @changeable_orders = [] unless current_distributor.allow_order_changes?
@changeable_orders = Spree::Order.complete.where(
state: 'complete',
user_id: spree_current_user.id,
distributor_id: current_distributor.id,
order_cycle_id: current_order_cycle.id)
end
def changeable_orders_link_path
changeable_orders.one? ? spree.order_path(changeable_orders.first) : spree.account_path
end
def shop_changeable_orders_alert_html
return "" unless changeable_orders.any?
t(:shop_changeable_orders_alert_html,
count: changeable_orders.count,
path: changeable_orders_link_path,
order: changeable_orders.first.number,
shop: current_distributor.name,
oc_close: l(current_order_cycle.orders_close_at, format: "%A, %b %d, %Y @ %H:%M"))
end
end
end

View File

@@ -4,7 +4,7 @@ module OpenFoodNetwork
attr_accessible :preferred_per_kg
def self.description
"Weight (per kg)"
I18n.t('spree.weight')
end
def compute(object)

View File

@@ -250,6 +250,13 @@ class OrderCycle < ActiveRecord::Base
OpenFoodNetwork::ProductsCache.order_cycle_changed self
end
def items_bought_by_user(user, distributor)
# The Spree::Order.complete scope only checks for completed_at date, does not ensure state is "complete"
orders = Spree::Order.complete.where(state: "complete", user_id: user, distributor_id: distributor, order_cycle_id: self)
scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor)
items = Spree::LineItem.joins(:order).merge(orders)
items.each { |li| scoper.scope(li.variant) }
end
private

View File

@@ -4,6 +4,7 @@ class AbilityDecorator
# All abilites are allocated from this initialiser, currently in 5 chunks.
# Spree also defines other abilities.
def initialize(user)
add_shopping_abilities user
add_base_abilities user if is_new_user? user
add_enterprise_management_abilities user if can_manage_enterprises? user
add_group_management_abilities user if can_manage_groups? user
@@ -50,6 +51,16 @@ class AbilityDecorator
can_manage_enterprises? user
end
def add_shopping_abilities(user)
can [:destroy], Spree::LineItem do |item|
user == item.order.user &&
item.order.changes_allowed?
end
can [:cancel], Spree::Order do |order|
order.user == user
end
end
# New users can create an enterprise, and gain other permissions from doing this.
def add_base_abilities(user)
can [:create], Enterprise
@@ -184,6 +195,7 @@ class AbilityDecorator
can [:admin , :for_line_items], Enterprise
can [:admin, :index, :create], Spree::LineItem
can [:destroy, :update], Spree::LineItem do |item|
order = item.order
user.admin? || user.enterprises.include?(order.distributor) || order.order_cycle.andand.coordinated_by?(user)
end

View File

@@ -34,6 +34,7 @@ module Spree
included_tax > 0
end
# @return [Array<Spree::TaxRate>]
def tax_rates
case originator
when Spree::TaxRate
@@ -47,14 +48,17 @@ module Spree
return originator.tax_category ? originator.tax_category.tax_rates.match(source) : []
end
else
[find_closest_tax_rate_from_included_tax]
find_closest_tax_rates_from_included_tax
end
end
def find_closest_tax_rate_from_included_tax
# shipping fees and adjustments created from the admin panel have
# taxes set at creation in the included_tax field without relation
# to the corresponding TaxRate, so we look for the closest one
def find_closest_tax_rates_from_included_tax
approximation = (included_tax / (amount - included_tax))
return nil if approximation.infinite? or approximation.zero?
Spree::TaxRate.order("ABS(amount - #{approximation})").first
return [] if approximation.infinite? or approximation.zero?
[Spree::TaxRate.order("ABS(amount - #{approximation})").first]
end

View File

@@ -94,8 +94,41 @@ Spree::LineItem.class_eval do
(final_weight_volume || 0) / quantity
end
# MONKEYPATCH of Spree method
# Enables scoping of variant to hub/shop, stock drawn down from inventory
def update_inventory
return true unless order.completed?
scoper.scope(variant) # this line added
if new_record?
Spree::InventoryUnit.increase(order, variant, quantity)
elsif old_quantity = self.changed_attributes['quantity']
if old_quantity < quantity
Spree::InventoryUnit.increase(order, variant, (quantity - old_quantity))
elsif old_quantity > quantity
Spree::InventoryUnit.decrease(order, variant, (old_quantity - quantity))
end
end
end
# MONKEYPATCH of Spree method
# Enables scoping of variant to hub/shop, stock replaced to inventory
def remove_inventory
return true unless order.completed?
scoper.scope(variant) # this line added
Spree::InventoryUnit.decrease(order, variant, quantity)
end
private
def scoper
return @scoper unless @scoper.nil?
@scoper = OpenFoodNetwork::ScopeVariantToHub.new(order.distributor)
end
def calculate_final_weight_volume
if final_weight_volume.present? && quantity_was > 0
self.final_weight_volume = final_weight_volume * quantity / quantity_was

View File

@@ -9,7 +9,7 @@ end
Spree::Order.class_eval do
belongs_to :order_cycle
belongs_to :distributor, :class_name => 'Enterprise'
belongs_to :distributor, class_name: 'Enterprise'
belongs_to :cart
belongs_to :customer
@@ -21,6 +21,9 @@ Spree::Order.class_eval do
before_validation :associate_customer, unless: :customer_id?
before_validation :ensure_customer, unless: :customer_is_valid?
before_save :update_shipping_fees!, if: :complete?
before_save :update_payment_fees!, if: :complete?
checkout_flow do
go_to_state :address
go_to_state :delivery
@@ -39,7 +42,6 @@ Spree::Order.class_eval do
remove_transition :from => :delivery, :to => :confirm
end
# -- Scopes
scope :managed_by, lambda { |user|
if user.has_spree_role?('admin')
@@ -88,7 +90,7 @@ Spree::Order.class_eval do
unless self.order_cycle == order_cycle
self.order_cycle = order_cycle
self.distributor = nil unless order_cycle.nil? || order_cycle.has_distributor?(distributor)
self.empty!
empty!
save!
end
end
@@ -99,7 +101,6 @@ Spree::Order.class_eval do
current_item.andand.destroy
end
# Overridden to support max_quantity
def add_variant(variant, quantity = 1, max_quantity = nil, currency = nil)
line_items(:reload)
@@ -126,7 +127,7 @@ Spree::Order.class_eval do
current_item.currency = currency unless currency.nil?
current_item.save
else
current_item = Spree::LineItem.new(:quantity => quantity, max_quantity: max_quantity)
current_item = Spree::LineItem.new(quantity: quantity, max_quantity: max_quantity)
current_item.variant = variant
if currency
current_item.currency = currency unless currency.nil?
@@ -134,13 +135,31 @@ Spree::Order.class_eval do
else
current_item.price = variant.price
end
self.line_items << current_item
line_items << current_item
end
self.reload
reload
current_item
end
# After changing line items of a completed order
def update_shipping_fees!
shipments.each do |shipment|
next if shipment.shipped?
update_adjustment! shipment.adjustment
shipment.save # updates included tax
end
end
# After changing line items of a completed order
def update_payment_fees!
payments.each do |payment|
next if payment.completed?
update_adjustment! payment.adjustment
payment.save
end
end
def cap_quantity_at_stock!
line_items.each &:cap_quantity_at_stock!
end
@@ -158,6 +177,10 @@ Spree::Order.class_eval do
save!
end
def distribution_set?
distributor && order_cycle
end
def update_distribution_charge!
with_lock do
EnterpriseFee.clear_all_adjustments_on_order self
@@ -195,6 +218,12 @@ Spree::Order.class_eval do
line_items.map(&:variant)
end
# Show already bought line items of this order cycle
def finalised_line_items
return [] unless order_cycle && user && distributor
order_cycle.items_bought_by_user(user, distributor)
end
def admin_and_handling_total
adjustments.eligible.where("originator_type = ? AND source_type != ?", 'EnterpriseFee', 'Spree::LineItem').sum(&:amount)
end
@@ -205,26 +234,26 @@ Spree::Order.class_eval do
# Does this order have shipments that can be shipped?
def ready_to_ship?
self.shipments.any?{|s| s.can_ship?}
shipments.any?(&:can_ship?)
end
# Ship all pending orders
def ship
self.shipments.each do |s|
shipments.each do |s|
s.ship if s.can_ship?
end
end
def shipping_tax
adjustments(:reload).shipping.sum &:included_tax
adjustments(:reload).shipping.sum(&:included_tax)
end
def enterprise_fee_tax
adjustments(:reload).enterprise_fee.sum &:included_tax
adjustments(:reload).enterprise_fee.sum(&:included_tax)
end
def total_tax
(adjustments + price_adjustments).sum &:included_tax
(adjustments + price_adjustments).sum(&:included_tax)
end
def tax_adjustments
@@ -254,11 +283,12 @@ Spree::Order.class_eval do
# Overrride of Spree method, that allows us to send separate confirmation emails to user and shop owners
# And separately, to skip sending confirmation email completely for user invoice orders
def deliver_order_confirmation_email
unless account_invoice?
Delayed::Job.enqueue ConfirmOrderJob.new(id)
end
Delayed::Job.enqueue ConfirmOrderJob.new(id) unless account_invoice?
end
def changes_allowed?
complete? && distributor.andand.allow_order_changes? && order_cycle.andand.open?
end
private
@@ -272,9 +302,9 @@ Spree::Order.class_eval do
self.ship_address = distributor.address.clone
if bill_address
self.ship_address.firstname = bill_address.firstname
self.ship_address.lastname = bill_address.lastname
self.ship_address.phone = bill_address.phone
ship_address.firstname = bill_address.firstname
ship_address.lastname = bill_address.lastname
ship_address.phone = bill_address.phone
end
end
end
@@ -286,11 +316,11 @@ Spree::Order.class_eval do
end
def product_distribution_for(line_item)
line_item.variant.product.product_distribution_for self.distributor
line_item.variant.product.product_distribution_for distributor
end
def require_customer?
return true unless new_record? or state == 'cart'
return true unless new_record? || state == 'cart'
end
def customer_is_valid?
@@ -313,4 +343,11 @@ Spree::Order.class_eval do
self.customer = Customer.create(enterprise: distributor, email: email_for_customer, user: user, name: customer_name, bill_address: bill_address.andand.clone, ship_address: ship_address.andand.clone)
end
end
def update_adjustment!(adjustment)
locked = adjustment.locked
adjustment.locked = false
adjustment.update!(self)
adjustment.locked = locked
end
end

View File

@@ -37,13 +37,14 @@ Spree::Taxon.class_eval do
#
# Format: {enterprise_id => [taxon_id, ...]}
def self.distributed_taxons(which_taxons=:all)
# TODO: Why can't we merge(Spree::Product.with_order_cycles_inner) here?
taxons = Spree::Taxon.
joins(products: {variants_including_master: {exchanges: :order_cycle}}).
merge(Exchange.outgoing).
select('spree_taxons.*, exchanges.receiver_id AS enterprise_id')
ents_and_vars = ExchangeVariant.joins(exchange: :order_cycle).merge(Exchange.outgoing)
.select("DISTINCT variant_id, receiver_id AS enterprise_id")
taxons = taxons.merge(OrderCycle.active) if which_taxons == :current
ents_and_vars = ents_and_vars.merge(OrderCycle.active) if which_taxons == :current
taxons = Spree::Taxon
.select("DISTINCT spree_taxons.id, ents_and_vars.enterprise_id").joins(products: :variants_including_master)
.joins("INNER JOIN (#{ents_and_vars.to_sql}) AS ents_and_vars ON spree_variants.id = ents_and_vars.variant_id")
taxons.inject({}) do |ts, t|
ts[t.enterprise_id.to_i] ||= Set.new

View File

@@ -19,7 +19,7 @@ class VariantOverride < ActiveRecord::Base
def self.indexed(hub)
Hash[
for_hubs(hub).map { |vo| [vo.variant, vo] }
for_hubs(hub).preload(:variant).map { |vo| [vo.variant, vo] }
]
end
@@ -58,6 +58,14 @@ class VariantOverride < ActiveRecord::Base
end
end
def increment_stock!(quantity)
if stock_overridden?
increment! :count_on_hand, quantity
else
Bugsnag.notify RuntimeError.new "Attempting to decrement stock level on a VariantOverride without a count_on_hand specified."
end
end
def default_stock?
default_stock.present?
end

View File

@@ -1,38 +1,3 @@
/ insert_before "[data-hook='admin_order_form_buttons']"
%fieldset.no-border-bottom
%legend{align: 'center'} Distribution
- if @order.complete?
.alpha.six.columns
%p
%b Distributor:
= f.object.distributor.andand.name || "None"
= f.hidden_field :distributor_id
.omega.six.columns
%p
%b Order cycle:
= f.object.order_cycle.andand.name || "None"
= f.hidden_field :order_cycle_id
- else
.alpha.six.columns
.field
%label{for: "order_distributor_id"} Distributor
%input.ofn-select2.fullwidth{id: "order_distributor_id",
type: 'number',
name: "order[distributor_id]",
"ng-model" => 'distributor_id',
data: "shops" }
.omega.six.columns
.field
%label{ for: "order_order_cycle_id"} Order Cycle
%input.ofn-select2.fullwidth{id: "order_order_cycle_id",
type: 'number',
name: "order[order_cycle_id]",
"ng-model" => 'order_cycle_id',
"ng-disabled" => "!distributor_id",
data: "orderCycles",
text: "name_and_status",
filter: "validOrderCycle" }
= render partial: 'spree/admin/orders/_form/distribution_fields'

View File

@@ -0,0 +1,3 @@
/ replace 'code[erb-loud]:contains(\'f.object.variant.display_amount\')'
= f.object.single_money

View File

@@ -0,0 +1,6 @@
/ replace "code[erb-loud]:contains(\'error_messages\')"
-# Suppress errors when manually creating a new order - needs to proceed to edit page
-# without having line items (which otherwise gives a validation error)
- unless params["suppress_error_msg"]
= render partial: "spree/shared/error_messages", :locals => { :target => @order }

View File

@@ -1,16 +1,17 @@
/ insert_top "[data-hook='admin_product_form_right']"
= f.field_container :variant_unit do
= f.label :variant_unit, 'Variant unit'
= f.select :variant_unit, product_variant_unit_options, {:include_blank => true}, {:class => "select2 fullwidth"}
= f.error_message_on :variant_unit
.variant_units_form{ 'ng-app' => 'admin.products', 'ng-controller' => 'editUnitsCtrl' }
= f.field_container :variant_unit_scale do
= f.label :variant_unit_scale, 'Variant unit scale'
= f.text_field :variant_unit_scale
= f.error_message_on :variant_unit_scale
= f.field_container :units do
= f.label :variant_unit_with_scale, :units
%select.select2.fullwidth{ id: 'product_variant_unit_with_scale', 'ng-model' => 'variant_unit_with_scale', 'ng-change' => 'setFields()', 'ng-options' => 'unit[1] as unit[0] for unit in variant_unit_options' }
%option{'value' => ''}
= f.field_container :variant_unit_name do
= f.label :variant_unit_name, 'Variant unit name'
= f.text_field :variant_unit_name
= f.error_message_on :variant_unit_name
= f.text_field :variant_unit, {'id' => 'variant_unit', 'ng-value' => 'product.variant_unit', 'hidden' => true}
= f.text_field :variant_unit_scale, {'id' => 'variant_unit_scale', 'ng-value' => 'product.variant_unit_scale', 'hidden' => true}
.variant_unit_name{'ng-show' => 'product.variant_unit == "items"'}
= f.field_container :variant_unit_name do
= f.label :variant_unit_name, 'Variant unit name'
= f.text_field :variant_unit_name, {placeholder: t('admin.products.unit_name_placeholder')}
= f.error_message_on :variant_unit_name

View File

@@ -34,7 +34,7 @@
.three.columns.omega{ 'ng-show' => "product.variant_unit_with_scale == 'items'" }
= f.field_container :unit_name do
= f.label :product_variant_unit_name, t(:unit_name)
%input.fullwidth{ id: 'product_variant_unit_name','ng-model' => 'product.variant_unit_name', :name => 'product[variant_unit_name]', :placeholder => 'eg. bunches', :type => 'text' }
%input.fullwidth{ id: 'product_variant_unit_name','ng-model' => 'product.variant_unit_name', :name => 'product[variant_unit_name]', :placeholder => t('admin.products.unit_name_placeholder'), :type => 'text' }
.twelve.columns.alpha
.six.columns.alpha
= render 'spree/admin/products/primary_taxon_form', f: f

View File

@@ -0,0 +1,3 @@
/ replace_contents 'tr[data-hook="order_details_line_item_row"] td.price'
= item.single_display_amount

View File

@@ -1,3 +1,3 @@
/ insert_bottom "[data-hook='admin_product_sub_tabs']"
= tab :variant_overrides, label: "Inventory", url: main_app.admin_inventory_path, match_path: '/inventory'
= tab :variant_overrides, url: main_app.admin_inventory_path, match_path: '/inventory'

View File

@@ -1,10 +1,13 @@
/ insert_top "[data-hook='admin_variant_form_fields']"
- if product_has_variant_unit_option_type?(@product)
.field{"data-hook" => "unit_value"}
= f.label :unit_value, "Unit Value"
= f.text_field :unit_value, class: "fullwidth"
- if @product.variant_unit != 'items'
.field{"data-hook" => "unit_value", 'ng-controller' => 'variantUnitsCtrl'}
= f.label :unit_value, "#{t('admin.'+@product.variant_unit)} ({{unitName(#{@product.variant_unit_scale}, '#{@product.variant_unit}')}})"
= hidden_field_tag 'product_variant_unit_scale', @product.variant_unit_scale
= text_field_tag :unit_value_human, nil, {class: "fullwidth", 'ng-model' => 'unit_value_human', 'ng-change' => 'updateValue()'}
= f.text_field :unit_value, {hidden: true, 'ng-value' => 'unit_value'}
.field{"data-hook" => "unit_description"}
= f.label :unit_description, "Unit Description"
= f.text_field :unit_description, class: "fullwidth"
.field{"data-hook" => "unit_description"}
= f.label :unit_description, "Unit Description"
= f.text_field :unit_description, class: "fullwidth", placeholder: t('admin.products.unit_name_placeholder')

View File

@@ -0,0 +1,14 @@
/ replace "[data-hook='admin_variant_form_additional_fields']"
.right.six.columns.omega.label-block{"data-hook" => "admin_variant_form_additional_fields"}
- if @product.variant_unit != 'weight'
.field{"data-hook" => 'weight'}
= f.label 'weight', t('weight')+' (kg)'
- value = number_with_precision(@variant.weight, :precision => 2)
= f.text_field 'weight', :value => value, :class => 'fullwidth'
- [:height, :width, :depth].each do |field|
.field{"data-hook" => field}
= f.label field, t(field)
- value = number_with_precision(@variant.send(field), :precision => 2)
= f.text_field field, :value => value, :class => 'fullwidth'

View File

@@ -4,7 +4,7 @@ class Api::Admin::EnterpriseSerializer < ActiveModel::Serializer
attributes :preferred_shopfront_message, :preferred_shopfront_closed_message, :preferred_shopfront_taxon_order, :preferred_shopfront_order_cycle_order
attributes :preferred_product_selection_from_inventory_only
attributes :owner, :users, :tag_groups, :default_tag_group
attributes :require_login
attributes :require_login, :allow_guest_orders, :allow_order_changes
has_one :owner, serializer: Api::Admin::UserSerializer
has_many :users, serializer: Api::Admin::UserSerializer

View File

@@ -1,11 +1,12 @@
class Api::CurrentOrderSerializer < ActiveModel::Serializer
attributes :id, :item_total, :email, :shipping_method_id,
:display_total, :payment_method_id
:display_total, :payment_method_id
has_one :bill_address, serializer: Api::AddressSerializer
has_one :ship_address, serializer: Api::AddressSerializer
has_many :line_items, serializer: Api::LineItemSerializer
has_many :finalised_line_items, serializer: Api::LineItemSerializer
def payment_method_id
object.payments.first.andand.payment_method_id

View File

@@ -1,11 +1,26 @@
module Api
class OrderSerializer < ActiveModel::Serializer
attributes :number, :completed_at, :total, :state, :shipment_state, :payment_state, :outstanding_balance, :payments, :path
attributes :number, :completed_at, :total, :state, :shipment_state, :payment_state
attributes :outstanding_balance, :payments, :path, :cancel_path, :changes_allowed, :changes_allowed_until
attributes :shop_name, :item_count
has_many :payments, serializer: Api::PaymentSerializer
def shop_name
object.distributor.andand.name
end
def item_count
object.line_items.sum(&:quantity)
end
def completed_at
object.completed_at.blank? ? "" : I18n.l(object.completed_at, format: :long)
object.completed_at.blank? ? "" : I18n.l(object.completed_at, format: "%b %d, %Y %H:%M")
end
def changes_allowed_until
return I18n.t(:not_allowed) unless object.changes_allowed?
I18n.l(object.order_cycle.andand.orders_close_at, format: "%b %d, %Y %H:%M")
end
def total
@@ -25,7 +40,16 @@ module Api
end
def path
Spree::Core::Engine.routes_url_helpers.order_url(object.number, only_path: true)
Spree::Core::Engine.routes_url_helpers.order_path(object)
end
def cancel_path
return nil unless object.changes_allowed?
Spree::Core::Engine.routes_url_helpers.cancel_order_path(object)
end
def changes_allowed
object.changes_allowed?
end
end
end

View File

@@ -1,7 +1,6 @@
class Api::VariantSerializer < ActiveModel::Serializer
attributes :id, :is_master, :count_on_hand, :name_to_display, :unit_to_display
attributes :options_text, :on_demand, :price, :fees, :price_with_fees, :product_name
attributes :tag_list
def price
object.price

View File

@@ -25,7 +25,7 @@
%col{ width: '62.5%' }
%col{ width: '12.5%' }
%thead
%th Date
%th= t('admin.date')
%th= t(:description)
%th= t(:charge)
- if order = invoice.order

View File

@@ -20,7 +20,7 @@
.filter_select.five.columns.alpha
%label{ :for => 'quick_search', ng: {class: '{disabled: !shop_id}'} }=t('admin.quick_search')
%br
%input.fullwidth{ :type => "text", :id => 'quick_search', ng: { model: 'quickSearch', disabled: '!shop_id' }, :placeholder => "Search by email/code..." }
%input.fullwidth{ :type => "text", :id => 'quick_search', ng: { model: 'quickSearch', disabled: '!shop_id' }, :placeholder => t('.search_by_email') }
.filter_select.four.columns
%label{ :for => 'hub_id', ng: { bind: "shop_id ? '#{t('admin.shop')}' : '#{t('admin.variant_overrides.index.select_a_shop')}'" } }
%br
@@ -94,6 +94,6 @@
-# %show-more.text-center{ data: "filteredCustomers", limit: "customerLimit", increment: "20" }
%div.text-center{ ng: { show: "filteredCustomers.length > customerLimit" } }
%input{ type: 'button', value: 'Show More', ng: { click: 'customerLimit = customerLimit + 20' } }
%input{ type: 'button', value: t(:show_more), ng: { click: 'customerLimit = customerLimit + 20' } }
or
%input{ type: 'button', value: "Show All ({{ filteredCustomers.length - customerLimit }} More)", ng: { click: 'customerLimit = filteredCustomers.length' } }
%input{ type: 'button', value: t(:show_all_with_more, num: '{{ filteredCustomers.length - customerLimit }}'), ng: { click: 'customerLimit = filteredCustomers.length' } }

View File

@@ -23,11 +23,11 @@
= f.label :charges_sales_tax, t(:say_no), value: 'false'
.row
.alpha.three.columns
= f.label :display_invoice_logo, 'Display logo in invoices'
= f.label :display_invoice_logo, t('.display_invoice_logo')
.omega.eight.columns
= f.check_box :display_invoice_logo
.row
.alpha.three.columns
= f.label :invoice_text, 'Add customized text at the end of invoices'
= f.label :invoice_text, t('.invoice_text')
.omega.eight.columns
= f.text_area :invoice_text, style: "width: 100%; height: 100px;"

View File

@@ -10,7 +10,7 @@
%tr{ ng: { controller: 'shippingMethodsCtrl', init: "findShippingMethodByID(#{shipping_method.id})" } }
%td= shipping_method.name
%td= f.check_box :shipping_method_ids, { :multiple => true, 'ng-model' => 'ShippingMethod.selected' }, shipping_method.id, nil
%td= link_to "Edit", edit_admin_shipping_method_path(shipping_method)
%td= link_to t(:edit), edit_admin_shipping_method_path(shipping_method)
%br
.row
.six.columns.alpha

View File

@@ -1,7 +1,7 @@
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label "enterprise_preferred_shopfront_message", t(:shopfront_message)
= f.label "enterprise_preferred_shopfront_message", t('.shopfront_message')
.eight.columns.omega
%text-angular{'ng-model' => 'Enterprise.preferred_shopfront_message', 'id' => 'enterprise_preferred_shopfront_message', 'name' => 'enterprise[preferred_shopfront_message]', 'class' => 'text-angular',
'ta-toolbar' => "[['h1','h2','h3','h4','p'],['bold','italics','underline','clear'],['insertLink']]",
@@ -9,7 +9,7 @@
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label "enterprise_preferred_shopfront_closed_message", t(:shopfront_closed_message)
= f.label "enterprise_preferred_shopfront_closed_message", t('.shopfront_closed_message')
.eight.columns.omega
%text-angular{'ng-model' => 'Enterprise.preferred_shopfront_closed_message', 'id' => 'enterprise_preferred_shopfront_closed_message', 'name' => 'enterprise[preferred_shopfront_closed_message]', 'class' => 'text-angular',
'ta-toolbar' => "[['h1','h2','h3','h4','p'],['bold','italics','underline','clear'],['insertLink']]",
@@ -17,7 +17,7 @@
.row
.alpha.eleven.columns
.three.columns.alpha
= f.label "enterprise_preferred_shopfront_taxon_order", t(:shopfront_category_ordering)
= f.label "enterprise_preferred_shopfront_taxon_order", t('.shopfront_category_ordering')
%br
(top to bottom)
.eight.columns.omega
@@ -51,9 +51,27 @@
%label= t '.allow_guest_orders'
%div{'ofn-with-tip' => t('.allow_guest_orders_tip')}
%a= t 'admin.whats_this'
.eight.columns.omega
.row
.three.columns.alpha
= f.radio_button :allow_guest_orders, true, "ng-model" => "Enterprise.allow_guest_orders", "ng-value" => "true"
= f.label :allow_guest_orders, t('.allow_guest_orders_true'), value: :true
.five.columns.omega
= f.radio_button :allow_guest_orders, false, "ng-model" => "Enterprise.allow_guest_orders", "ng-value" => "false"
= f.label :allow_guest_orders, t('.allow_guest_orders_false'), value: :false
.row.warning{ng: {show: 'Enterprise.allow_guest_orders && Enterprise.allow_order_changes'}}
.eight.columns.alpha.omega
%i.icon-warning-sign
= t '.recommend_require_login'
.row
.alpha.eleven.columns
.three.columns.alpha
%label= t '.allow_order_changes'
%div{'ofn-with-tip' => t('.allow_order_changes_tip')}
%a= t 'admin.whats_this'
.three.columns
= f.radio_button :allow_guest_orders, true
= f.label :allow_guest_orders, t('.allow_guest_orders_true'), value: :true
= f.radio_button :allow_order_changes, false, "ng-model" => "Enterprise.allow_order_changes", "ng-value" => "false"
= f.label :allow_order_changes, t('.allow_order_changes_false'), value: :false
.five.columns.omega
= f.radio_button :allow_guest_orders, false
= f.label :allow_guest_orders, t('.allow_guest_orders_false'), value: :false
= f.radio_button :allow_order_changes, true, "ng-model" => "Enterprise.allow_order_changes", "ng-value" => "true"
= f.label :allow_order_changes, t('.allow_order_changes_true'), value: :true

View File

@@ -11,7 +11,7 @@
.filter_select.four.columns
%label{ :for => 'producer_filter', ng: {class: '{disabled: !hub_id}'} }=t('admin.producer')
%br
%input.ofn-select2.fullwidth{ :id => 'producer_filter', type: 'number', data: 'producers', blank: "{id: 0, name: 'All'}", ng: { model: 'producerFilter', disabled: '!hub_id' } }
%input.ofn-select2.fullwidth{ :id => 'producer_filter', type: 'number', data: 'producers', blank: "{id: 0, name: '#{t(:all)}'}", ng: { model: 'producerFilter', disabled: '!hub_id' } }
-# .filter_select{ :class => "three columns" }
-# %label{ :for => 'distributor_filter' }Hub
-# %br

View File

@@ -0,0 +1,2 @@
%p.alert-box.info
= t '.message_html', cart: link_to(t('.cart'), "#{cart_path}#bought-products")

View File

@@ -11,6 +11,7 @@
= render "checkout/billing", f: f
= render "checkout/shipping", f: f
= render "checkout/payment", f: f
= render "checkout/already_ordered", f: f if show_bought_items?
%p
%button.button.primary{type: :submit}
= t :checkout_send

View File

@@ -8,6 +8,10 @@
= inject_shop_enterprises
%shop.darkswarm
.alert-box.changeable-orders-alert.info.animate-show{ ng: { show: "alert.visible && alert.html", cloak: true } }
%span{ ng: { bind: { html: "alert.html" } } }
%a.close{ ng: { click: "alert.close()" } } &times;
- content_for :order_cycle_form do
%div{"ng-controller" => "OrderCycleChangeCtrl", "ng-cloak" => true}

View File

@@ -38,7 +38,7 @@
.small-12.medium-6.medium-offset-3.columns.text-center
%h2
= t :producers_signup_cta_headline
%p.text-big Start with a free profile, and expand when you're ready!
%p.text-big= t('.start_free_profile')
%a.button.transparent{href: "/register"}
= t :producers_signup_cta_action

View File

@@ -15,7 +15,7 @@
%a.button.secondary.tiny.add_to_cart{ href: cart_path, type: :submit, "ng-disabled" => "Cart.dirty || Cart.empty()", "ng-class" => "{ dirty: Cart.dirty }" }
= "{{ Cart.dirty ? '#{t(:cart_updating)}' : (Cart.empty() ? '#{t(:cart_empty)}' : '#{t(:cart_edit)}' ) }}"
%a.button.primary.tiny{href: checkout_path, "ng-disabled" => "Cart.dirty || Cart.empty()"}
= t 'checkout'
= t '.checkout'
%table
%tr.product-cart{"ng-repeat" => "line_item in Cart.line_items", "id" => "cart-variant-{{ line_item.variant.id }}"}
%td
@@ -47,4 +47,25 @@
%a.button.secondary.tiny.add_to_cart{ href: cart_path, type: :submit, "ng-disabled" => "Cart.dirty || Cart.empty()", "ng-class" => "{ dirty: Cart.dirty }" }
= "{{ Cart.dirty ? '#{t(:cart_updating)}' : (Cart.empty() ? '#{t(:cart_empty)}' : '#{t(:cart_edit)}' ) }}"
%a.button.primary.tiny{href: checkout_path, "ng-disabled" => "Cart.dirty || Cart.empty()"}
= t 'checkout'
= t '.checkout'
- if order_changes_allowed?
%h5{"ng-if" => "Cart.line_items_finalised.length", style: 'margin-top: 1em'}
= t '.already_ordered_products'
%table
%tr.product-cart{"ng-repeat" => "line_item in Cart.line_items_finalised",
"id" => "cart-variant-{{ line_item.variant.id }}"}
%td
%small
%strong
{{ line_item.variant.extended_name }}
%td.text-right
%small
%span.quantity {{ line_item.quantity }}
%i.ofn-i_009-close
%span.price {{ line_item.variant.price_with_fees | localizeCurrency }}
%td
%small
\=
%strong
.total-price.right {{ line_item.total_price | localizeCurrency }}

View File

@@ -0,0 +1 @@
= shop_changeable_orders_alert_html

View File

@@ -6,7 +6,7 @@
.row.summary
.small-10.medium-10.large-11.columns.summary-header
%h3
%a{"ng-click" => "triggerProductModal()"}
%a{"ng-click" => "triggerProductModal()", href: 'javascript:void(0)'}
%span{"ng-bind" => "::product.name"}
%i.ofn-i_057-expand
%small

View File

@@ -1,14 +1,18 @@
- distributor = @order.andand.distributor || current_distributor
%navigation
%distributor.details.row
.small-12.medium-6.large-6.columns
#distributor_title
- if current_distributor.logo?
%img.left{src: current_distributor.logo.url(:thumb)}
- if distributor.logo?
%img.left{src: distributor.logo.url(:thumb)}
%h3
= current_distributor.name
%location= current_distributor.address.city
= distributor.name
%location= distributor.address.city
/ Will this needs to be a drop-down to choose either pick-up point or delivery once shipping methods are implemented
.small-12.medium-6.large-6.columns
= render partial: "shopping_shared/order_cycles"
= render partial: "shopping_shared/tabs"
= render partial: "shopping_shared/tabs" if distributor == current_distributor

View File

@@ -0,0 +1,35 @@
%fieldset.no-border-bottom
%legend{align: 'center'} Distribution
- if @order.complete?
.alpha.six.columns
%p
%b Distributor:
= @order.distributor.andand.name || "None"
%input{type: "hidden", id: "order_distributor_id", value: @order.distributor.andand.id}
.omega.six.columns
%p
%b Order cycle:
= @order.order_cycle.andand.name || "None"
%input{type: "hidden", id: "order_order_cycle_id", value: @order.order_cycle.andand.id}
- else
.alpha.six.columns
.field
%label{for: "order_distributor_id"} Distributor
%input.ofn-select2.fullwidth{id: "order_distributor_id",
type: 'number',
name: "order[distributor_id]",
"ng-model" => 'distributor_id',
data: "shops" }
.omega.six.columns
.field
%label{ for: "order_order_cycle_id"} Order Cycle
%input.ofn-select2.fullwidth{id: "order_order_cycle_id",
type: 'number',
name: "order[order_cycle_id]",
"ng-model" => 'order_cycle_id',
"ng-disabled" => "!distributor_id",
data: "orderCycles",
text: "name_and_status",
filter: "validOrderCycle" }

View File

@@ -31,21 +31,21 @@
%label{ :for => 'supplier_filter' }
= t("admin.producer")
%br
%input#supplier_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'suppliers', blank: "{ id: 0, name: 'All' }", ng: { model: 'supplierFilter' } }
%input#supplier_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'suppliers', blank: "{ id: 0, name: '#{t(:all)}' }", ng: { model: 'supplierFilter' } }
.filter_select{ :class => "three columns" }
%label{ :for => 'distributor_filter' }
= t("admin.shop")
%br
%input#distributor_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'distributors', blank: "{ id: 0, name: 'All' }", ng: { model: 'distributorFilter' } }
%input#distributor_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'distributors', blank: "{ id: 0, name: '#{t(:all)}' }", ng: { model: 'distributorFilter' } }
.filter_select{ :class => "three columns" }
%label{ :for => 'order_cycle_filter' }
= t("admin.order_cycle")
%br
%input#order_cycle_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'orderCycles', blank: "{ id: 0, name: 'All' }", on: { selecting: "confirmRefresh" }, ng: { model: 'orderCycleFilter', change: 'refreshData()' } }
%input#order_cycle_filter.ofn-select2.fullwidth{ type: 'number', 'min-search' => 5, data: 'orderCycles', blank: "{ id: 0, name: '#{t(:all)}' }", on: { selecting: "confirmRefresh" }, ng: { model: 'orderCycleFilter', change: 'refreshData()' } }
.filter_clear{ :class => "two columns omega" }
%label{ :for => 'clear_all_filters' }
%br
%input.red.fullwidth{ :type => 'button', :id => 'clear_all_filters', :value => "Clear All", 'ng-click' => "resetSelectFilters()" }
%input.red.fullwidth{ :type => 'button', :id => 'clear_all_filters', :value => t('admin.clear_all'), 'ng-click' => "resetSelectFilters()" }
%hr.divider.sixteen.columns.alpha.omega{ ng: { show: 'unitsVariantSelected()' } }
@@ -59,7 +59,7 @@
%h6{ :class => "eight columns alpha", 'ng-hide' => 'sharedResource', style: 'text-align: center;' } {{ selectedUnitsVariant.full_name }}
%div{ :class => "four columns omega" }
%h6{ :class => "four columns alpha", :style => 'text-align: right;' }
%a{ :href => '#', 'ng-click' => 'selectedUnitsVariant = {};selectedUnitsProduct = {};sharedResource=false;' } Clear
%a{ :href => '#', 'ng-click' => 'selectedUnitsVariant = {};selectedUnitsProduct = {};sharedResource=false;' }= t('admin.clear')
%hr
.row
.one.column.alpha &nbsp;

View File

@@ -0,0 +1,24 @@
- content_for :page_title do
= t(:new)
- content_for :page_actions do
%li= button_link_to t(:back_to_orders_list), spree.admin_orders_path, :icon => 'icon-arrow-left'
= admin_inject_shops 'admin.orders'
= admin_inject_order_cycles
= render 'spree/admin/shared/order_tabs', :current => 'Order Details'
= csrf_meta_tags
%div{"data-hook" => "admin_order_new_header"}
= render 'spree/shared/error_messages', :target => @order
%div{"ng-app" => "admin.orders", "ng-controller" => "ordersCtrl"}
= form_for @order, url: admin_order_url(@order), method: :put do |f|
= render 'spree/admin/orders/_form/distribution_fields'
-# This param passed to stop validation error in next page due to no line items in order yet:
= hidden_field_tag 'suppress_error_msg', "true"
= button_tag :class => 'secondary radius expand small', :id => 'update-button' do
%i.icon-arrow-right
= t(:next)

View File

@@ -13,24 +13,24 @@
'\x1B' + '\x74' + '\x10',
'\x1B' + '\x61' + '\x31', // center align
'\x1B' + '\x21' + '\x30', // em mode on
'#{@order.distributor.name}' + '\x0A',
'#{j(@order.distributor.name)}' + '\x0A',
'\x1B' + '\x21' + '\x0A' + '\x1B' + '\x45' + '\x0A', // em mode off
'\x0A',
'#{@order.distributor.address.address_part1}' + '\x0A', // text and line break
'#{@order.distributor.address.address_part2}' + '\x0A',
'#{@order.distributor.email}' + '\x0A',
'#{j(@order.distributor.address.address_part1)}' + '\x0A', // text and line break
'#{j(@order.distributor.address.address_part2)}' + '\x0A',
'#{j(@order.distributor.email)}' + '\x0A',
'\x0A', // line break
'\x1B' + '\x61' + '\x32', // right align
'#{l Time.zone.now.to_date}' + '\x0A',
'#{@order.number}' + '\x0A',
'#{j(l(Time.zone.now.to_date))}' + '\x0A',
'#{j(@order.number)}' + '\x0A',
'\x1B' + '\x61' + '\x30', // left align
'\x0A',
'\x1B' + '\x4D' + '\x31', // small text
"#{'%6s %-23s%12s%12s' %
[t(:ticket_column_qty),
t(:ticket_column_item),
t(:ticket_column_unit_price),
t(:ticket_column_total_price)]}",
"#{'%6s %-26s%10s%10s' %
[j(t(:ticket_column_qty)),
j(t(:ticket_column_item)),
j(t(:ticket_column_unit_price)),
j(t(:ticket_column_total_price))]}",
'\x0A',
'\x1B' + '\x4D' + '\x30', // normal text
'__________________________________________' + '\x0A',
@@ -38,36 +38,34 @@
.sort_by{ |line_item| line_item.product.name }
.map { |line_item| '%5d %-19.19s%8.8s%8.8s' %
[line_item.quantity,
line_item.product.name,
line_item.single_display_amount_with_adjustments.money.format(symbol: false),
line_item.display_amount_with_adjustments.money.format(symbol: false)] }
j(line_item.product.name),
j(line_item.single_display_amount_with_adjustments.format(symbol: false, with_currency: false)),
j(line_item.display_amount_with_adjustments.format(symbol: false, with_currency: false))] }
.join('" + \'\x0A\' + "')}",
'\x0A',
"#{checkout_adjustments_for(@order, exclude: [:line_item])
.reject{ |a| a.amount == 0 }
.reverse.map { |adjustment| '%5s %-27.27s%8.8s' %
["",
raw(adjustment.label),
display_adjustment_amount(adjustment).money.format(symbol: false)] }
.join('" + \'\x0A\' + "')}",
'\x0A',
j(raw(adjustment.label)),
j(display_adjustment_amount(adjustment).format(symbol: false, with_currency: false))] +
'" + \'\x0A\' + "'}.join }",
'__________________________________________' + '\x0A',
'\x0A',
'\x1B' + '\x45' + '\x0D', // bold on
"#{'%31s%10s' %
[t(:total_incl_tax),
@order.display_total]}",
[j(t(:total_incl_tax)),
j(@order.display_total.format(with_currency: false))]}",
'\x1B' + '\x45' + '\x0A', // bold off
'\x0A',
"#{display_checkout_taxes_hash(@order).map { |tax_rate, tax_value|
'%31s%10s' %
[t(:tax_total, rate: tax_rate),
tax_value] }
.join('" + \'\x0A\' + "')}",
'\x0A',
[j(t(:tax_total, rate: tax_rate)),
j(tax_value.format(with_currency: false))] +
'" + \'\x0A\' + "'}.join }",
"#{'%31s%10s' %
[t(:total_excl_tax),
display_checkout_total_less_tax(@order)]}",
[j(t(:total_excl_tax)),
j(display_checkout_total_less_tax(@order).format(with_currency: false))]}",
'\x0A',
'\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A' + '\x0A',
'\x1B' + '\x69', // cut paper

View File

@@ -15,4 +15,4 @@
.filter_clear.three.columns.omega
%label{ :for => 'clear_all_filters' }
%br
%input.fullwidth.red{ :type => 'button', :id => 'clear_all_filters', :value => "Clear Filters", 'ng-click' => "resetSelectFilters()" }
%input.fullwidth.red{ :type => 'button', :id => 'clear_all_filters', :value => t('admin.clear_filters'), 'ng-click' => "resetSelectFilters()" }

View File

@@ -20,7 +20,7 @@
%tr{ ng: { controller: "ColumnsCtrl" } }
%th.left-actions
%a{ 'ng-click' => 'toggleShowAllVariants()', :style => 'color: red' }
Expand All
= t(:expand_all)
%th.producer{ 'ng-show' => 'columns.producer.visible' }=t('admin.producer')
%th.sku{ 'ng-show' => 'columns.sku.visible' }=t('admin.sku')
%th.name{ 'ng-show' => 'columns.name.visible' }=t('admin.name')

View File

@@ -26,7 +26,7 @@
%input.fullwidth{ :type => 'text', id: "p{{product.id}}_category_id", 'ng-model' => 'product.category_id', 'ofn-taxon-autocomplete' => '', 'ofn-track-product' => 'category_id', 'multiple-selection' => 'false', placeholder: 'Category' }
%td.tax_category{ 'ng-if' => 'columns.tax_category.visible' }
%select.select2{ name: 'product_tax_category_id', 'ofn-track-product' => 'tax_category_id', ng: {model: 'product.tax_category_id', options: 'tax_category.id as tax_category.name for tax_category in tax_categories'} }
%option{value: ''} None
%option{value: ''}= t(:none)
%td.inherits_properties{ 'ng-show' => 'columns.inherits_properties.visible' }
%input{ 'ng-model' => 'product.inherits_properties', :name => 'inherits_properties', 'ofn-track-product' => 'inherits_properties', type: "checkbox" }
%td.available_on{ 'ng-show' => 'columns.available_on.visible' }

View File

@@ -1,3 +1,3 @@
%div.sixteen.columns.alpha{ 'ng-hide' => 'loading || products.length == 0', style: "margin-bottom: 10px" }
%div.four.columns.alpha
%input.four.columns.alpha{ :type => 'button', :value => 'Save Changes', 'ng-click' => 'submitProducts()'}
%input.four.columns.alpha{ :type => 'button', :value => t(:save_changes), 'ng-click' => 'submitProducts()'}

View File

@@ -4,7 +4,7 @@
.row
.four.columns.alpha
= label_tag nil, "Distributor: "
= f.collection_select(:distributor_id_eq, @distributors, :id, :name, {:include_blank => 'All'}, {:class => "select2 fullwidth"})
= f.collection_select(:distributor_id_eq, @distributors, :id, :name, {:include_blank => t(:all)}, {:class => "select2 fullwidth"})
= label_tag nil, "Report Type: "
%br
= select_tag(:report_type, options_for_select([['Bulk Co-op - Totals by Supplier',:bulk_coop_supplier_report],['Bulk Co-op - Allocation',:bulk_coop_allocation],['Bulk Co-op - Packing Sheets',:bulk_coop_packing_sheets],['Bulk Co-op - Customer Payments',:bulk_coop_customer_payments]], @report_type))

View File

@@ -4,7 +4,7 @@
.row
.four.columns.alpha
= label_tag nil, t(:report_distributor)
= f.collection_select(:distributor_id_eq, @distributors, :id, :name, {:include_blank => 'All'}, {:class => "select2 fullwidth"})
= f.collection_select(:distributor_id_eq, @distributors, :id, :name, {:include_blank => t(:all)}, {:class => "select2 fullwidth"})
= label_tag nil, t(:report_customers_type)
%br
= select_tag(:report_type, options_for_select([[t(:report_tax_types),:tax_types],[t(:report_tax_rates),:tax_rates]], @report_type))

View File

@@ -0,0 +1,35 @@
%tbody{ ng: { controller: 'EditBoughtOrderController' } }
%tr
%td.toggle-bought{ colspan: 2, ng: { click: 'showBought=!showBought' } }
%h5.brick
%i{ ng: { class: "{ 'ofn-i_007-caret-right': !showBought, 'ofn-i_005-caret-down': showBought}"} }
= t(:orders_bought_items_notice, count: @order.finalised_line_items.sum(&:quantity))
%td.text-right{ colspan: 3 }
%a.edit-finalised.button.radius.expand.small{ href: changeable_orders_link_path, ng: { class: "{secondary: !showBought, primary: showBought}" } }
= t(:orders_bought_edit_button)
%i.ofn-i_007-caret-right
- @order.finalised_line_items.each do |line_item|
- variant = line_item.variant
%tr.bought.line-item{class: "line-item-#{line_item.id} variant-#{variant.id}", ng: { show: 'showBought'} }
%td.cart-item-description
%div.item-thumb-image
- if variant.images.length == 0
= link_to mini_image(variant.product), variant.product
- else
= link_to image_tag(variant.images.first.attachment.url(:mini)), variant.product
= render 'spree/shared/line_item_name', line_item: line_item
%span.already-confirmed= t(:orders_bought_already_confirmed)
%td.text-right.cart-item-price
= line_item.single_display_amount_with_adjustments.to_html
%td.text-center.cart-item-quantity
= line_item.quantity
%td.cart-item-total.text-right
= line_item.display_amount_with_adjustments.to_html unless line_item.quantity.nil?
%td.bought-item-delete.text-center
%a{ng: {click: "deleteLineItem(#{line_item.id})"}}
%i.ofn-i_026-trash

View File

@@ -20,19 +20,10 @@
= order_form.fields_for :line_items do |item_form|
= render :partial => 'line_item', :locals => { :variant => item_form.object.variant, :line_item => item_form.object, :item_form => item_form }
= render 'bought' if show_bought_items? && @order.cart?
%tfoot#edit-cart
%tr
%td{colspan:"2"}
%td
= button_tag :class => 'secondary radius expand small', :id => 'update-button' do
%i.ofn-i_023-refresh
= t(:update)
%td
%td#empty-cart.text-center
%span#clear_cart_link{"data-hook" => ""}
= link_to t(:orders_form_empty_cart), empty_cart_path, method: :put, :class => 'not-bold small'
-#= form_tag empty_cart_path, :method => :put do
-#= submit_tag t(:empty_cart), :class => 'button alert expand small'
= render 'spree/orders/form/cart_actions_row' if @order.cart?
/ This is the fees row which we want to replace with the pop-over
-# - unless @order.adjustments.eligible.blank?
@@ -52,6 +43,14 @@
%span.order-total.distribution-total= display_checkout_admin_and_handling_adjustments_total_for(@order)
%td
- checkout_adjustments_for(@order, exclude: [:line_item, :admin_and_handling]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
%tr.order-adjustment
%td.text-right{:colspan => "3"}
= adjustment.label
%td.text-right.total
%span= adjustment.display_amount.to_html
%td
%tr
%td.text-right{colspan:"3"}
%h5

View File

@@ -17,7 +17,7 @@
= render 'spree/shared/line_item_name', line_item: line_item
- if @insufficient_stock_lines.include? line_item
- if @insufficient_stock_lines.andand.include? line_item
%span.out-of-stock
= variant.in_stock? ? t(:insufficient_stock, :on_hand => variant.on_hand) : t(:out_of_stock)
%br/
@@ -35,6 +35,5 @@
= line_item.display_amount_with_adjustments.to_html unless line_item.quantity.nil?
%td.cart-item-delete.text-center{"data-hook" => "cart_item_delete"}
{{ quantity }}
%a.delete{href: "#", id: "delete_#{dom_id(line_item)}"}
%i.delete.ofn-i_026-trash

View File

@@ -0,0 +1,65 @@
%table#line-items{"data-hook" => "order_details"}
%col{valign: "middle"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%thead{"data-hook" => ""}
%tr{"data-hook" => "order_details_line_items_headers"}
%th= t(:item)
%th.price= t(:price)
%th.text-center.qty= t(:qty)
%th.text-right.total
%span= t(:total)
%tbody{"data-hook" => ""}
- order.line_items.each do |item|
%tr.line_item{"data-hook" => "order_details_line_item_row", class: "variant-#{item.variant.id}" }
%td(data-hook = "order_item_description")
%div.item-thumb-image{"data-hook" => "order_item_image"}
- if item.variant.images.length == 0
= link_to mini_image(item.variant.product), item.variant.product
- else
= link_to image_tag(item.variant.images.first.attachment.url(:mini)), item.variant.product
= render 'spree/shared/line_item_name', line_item: item
%td.text-right.price{"data-hook" => "order_item_price"}
%span= item.single_display_amount_with_adjustments.to_html
%td.text-center{"data-hook" => "order_item_qty"}= item.quantity
%td.text-right.total{"data-hook" => "order_item_total"}
%span= item.display_amount_with_adjustments.to_html
%tfoot
#subtotal{"data-hook" => "order_details_subtotal"}
%tr#subtotal-row.total
%td.text-right{colspan: "3"}
%strong
= t :order_produce
%td.text-right.total
%span= display_checkout_subtotal(order)
#order-charges{"data-hook" => "order_details_adjustments"}
- checkout_adjustments_for(order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
%tr.total
%td.text-right{:colspan => "3"}
%strong
= adjustment.label
%td.text-right.total
%span= adjustment.display_amount.to_html
#order-total{"data-hook" => "order_details_total"}
%tr.total
%td.text-right{colspan: "3"}
%h5
= t :order_total_price
%td.text-right.total
%h5#order_total= order.display_total.to_html
- if order.total_tax > 0
#tax{"data-hook" => "order_details_tax"}
%tr#tax-row.total
%td.text-right{colspan: "3"}
= t :order_includes_tax
%td.text-right.total
%span= display_checkout_tax_total(order)

View File

@@ -31,17 +31,6 @@
.row
= render :partial => 'form', :locals => { :order_form => order_form }
.links{'data-hook' => "cart_buttons"}
.row
.columns.large-8{"data-hook" => ""}
%a.button.large.secondary{href: main_app.shop_path}
%i.ofn-i_008-caret-left
= t :orders_edit_continue
.columns.large-4.text-right
%a#checkout-link.button.large.primary{href: main_app.checkout_path}
= t :orders_edit_checkout
%i.ofn-i_007-caret-right
= render "spree/orders/form/cart_links"
= render partial: "shared/footer"

View File

@@ -0,0 +1,10 @@
%tr
%td{colspan:"2"}
%td
= button_tag :class => 'secondary radius expand small', :id => 'update-button' do
%i.ofn-i_023-refresh
= t(:update)
%td
%td#empty-cart.text-center
%span#clear_cart_link{"data-hook" => ""}
= link_to t(:orders_form_empty_cart), empty_cart_path, method: :put, :class => 'not-bold small'

View File

@@ -0,0 +1,9 @@
.row.links{'data-hook' => "cart_buttons"}
.columns.large-8{"data-hook" => ""}
%a.button.large.secondary{href: main_app.shop_path}
%i.ofn-i_008-caret-left
= t :orders_edit_continue
.columns.large-4.text-right
%a#checkout-link.button.large.primary{href: main_app.checkout_path}
= t :orders_edit_checkout
%i.ofn-i_007-caret-right

View File

@@ -0,0 +1,24 @@
.row
.columns.small-12.medium-3
- if current_order.andand.distributor == @order.distributor
- if current_order.line_items.present?
= link_to spree.cart_path, :class => "button expand" do
%i.ofn-i_008-caret-left
= t(:order_back_to_cart)
- else
= link_to main_app.shop_path, :class => "button expand" do
%i.ofn-i_008-caret-left
= t(:order_back_to_store)
- else
&nbsp;
- if order.changes_allowed?
.columns.show-for-medium-up.medium-3 &nbsp;
.columns.small-12.medium-3
= link_to spree.cancel_order_path(@order), method: :put, :class => "button secondary expand", "confirm-link-click" => t('orders_confirm_cancel') do
%i.ofn-i_009-close
= t(:cancel_order)
.columns.small-12.medium-3
= button_tag :class => 'button primary radius expand', :id => 'update-button', "ng-disabled" => 'update_order_form.$pristine' do
%i.ofn-i_051-check-big
%span{ ng: { show: 'update_order_form.$dirty' } }= t(:save_changes)
%span{ ng: { hide: 'update_order_form.$dirty' } }= t(:order_saved)

View File

@@ -10,8 +10,15 @@
.row
.columns.large-12.text-center
%h2
= t :orders_show_number
= " #" + @order.number
= t(:orders_show_order_number, number: @order.number)
- if @order.canceled?
%span.brick
= t(:orders_show_cancelled)
%i.ofn-i_009-close
- elsif @order.complete?
%span.turquoise
= t(:orders_show_confirmed)
%i.ofn-i_051-check-big
#order{"data-hook" => ""}
- if params.has_key? :checkout_complete
@@ -19,12 +26,5 @@
= render 'spree/shared/order_details', order: @order
.row
.columns.large-12
= link_to t(:back_to_store), main_app.shop_path, :class => "button"
- unless params.has_key? :checkout_complete
- if try_spree_current_user && respond_to?(:spree_account_path)
= link_to t(:my_account), spree_account_path, :class => "button"
= render partial: "shared/footer"

View File

@@ -1,5 +1,5 @@
%div{:data-hook => "product_source"}
%h6.product-section-title SUPPLIER
%h6.product-section-title= t(:supplier)
%table#product-source.table-display{:width => "100%"}
%tbody
- if @product.supplier
@@ -7,7 +7,7 @@
%td= link_to @product.supplier.name, [main_app, @product.supplier]
- if false
%br/
%h6.product-section-title DISTRIBUTORS
%h6.product-section-title= t(:distributors)
%table#product-source.table-display{:width => "100%"}
%tbody
- order = current_order(false)
@@ -18,11 +18,11 @@
%td
%b= link_to(distributor.name, [main_app, distributor])
%td
%b Current
%b= t(:current)
- elsif order.nil? || validator.can_change_to_distributor?(distributor)
%tr.even
%td= link_to distributor.name, [main_app, distributor]
%td Available
%td= t(:available)
- else
%tr.even
%td= link_to distributor.name, [main_app, distributor]

View File

@@ -86,68 +86,14 @@
%br
.row
.columns.large-12
%table#line-items{"data-hook" => "order_details"}
%col{valign: "middle"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%col{halign: "center", valign: "middle", width: "5%"}/
%thead{"data-hook" => ""}
%tr{"data-hook" => "order_details_line_items_headers"}
%th= t(:item)
%th.price= t(:price)
%th.text-center.qty= t(:qty)
%th.text-right.total
%span= t(:total)
%tbody{"data-hook" => ""}
- order.line_items.each do |item|
%tr{"data-hook" => "order_details_line_item_row"}
%td(data-hook = "order_item_description")
- if order.changes_allowed?
.alert-box.order-summary{ "ofn-inline-alert" => true, "ng-show" => "visible" }
= t(:orders_changeable_orders_alert_html, oc_close: l(order.order_cycle.orders_close_at, format: "%b %d, %Y %H:%M"))
%a.close{ "ng-click" => "close()" } &times;
%div.item-thumb-image{"data-hook" => "order_item_image"}
- if item.variant.images.length == 0
= link_to mini_image(item.variant.product), item.variant.product
- else
= link_to image_tag(item.variant.images.first.attachment.url(:mini)), item.variant.product
= render 'spree/shared/line_item_name', line_item: item
%td.text-right.price{"data-hook" => "order_item_price"}
%span= item.single_display_amount_with_adjustments.to_html
%td.text-center{"data-hook" => "order_item_qty"}= item.quantity
%td.text-right.total{"data-hook" => "order_item_total"}
%span= item.display_amount_with_adjustments.to_html
%tfoot
#subtotal{"data-hook" => "order_details_subtotal"}
%tr#subtotal-row.total
%td.text-right{colspan: "3"}
%strong
= t :order_produce
%td.text-right.total
%span= display_checkout_subtotal(order)
#order-charges{"data-hook" => "order_details_adjustments"}
- checkout_adjustments_for(order, exclude: [:line_item]).reject{ |a| a.amount == 0 }.reverse_each do |adjustment|
%tr.total
%td.text-right{:colspan => "3"}
%strong
= adjustment.label
%td.text-right.total
%span= adjustment.display_amount.to_html
#order-total{"data-hook" => "order_details_total"}
%tr.total
%td.text-right{colspan: "3"}
%h5
= t :order_total_price
%td.text-right.total
%h5#order_total= order.display_total.to_html
- if order.total_tax > 0
#tax{"data-hook" => "order_details_tax"}
%tr#tax-row.total
%td.text-right{colspan: "3"}
= t :order_includes_tax
%td.text-right.total
%span= display_checkout_tax_total(order)
= form_for order, html: {id: 'update-order', name: 'update_order_form' } do |order_form|
- if order.changes_allowed?
= render 'spree/orders/form', order_form: order_form
-else
= render 'spree/orders/summary', order: order
= render 'spree/orders/form/update_buttons', order: order

View File

@@ -0,0 +1,4 @@
<%= t('.welcome', email: @email) %>
<%= t('.text') %>
<%= @confirmation_url %>

View File

@@ -0,0 +1,7 @@
<%= t('.request_sent_text') %>
<%= t('.link_text') %>
<%= @edit_password_reset_url %>
<%= t('.issue_text') %>

View File

@@ -0,0 +1,23 @@
.row
.small-12.columns
%table
%tr
%th.order1= t('.order')
%th.order2= t('.shop')
%th.order3.show-for-large-up= t('.changes_allowed_until')
%th.order4.show-for-large-up= t('.items')
%th.order5.text-right= t('.total')
%th.order6.text-right.show-for-large-up= t('.edit')
%th.order7.text-right= t('.cancel')
%tbody.transaction-group{"ng-repeat" => "order in Orders.changeable_orders", "ng-class-odd"=>"'odd'", "ng-class-even"=>"'even'"}
%tr.order-row
%td.order1
%a{"ng-href" => "{{::order.path}}", "ng-bind" => "::order.number"}
%td.order2{"ng-bind" => "::order.shop_name"}
%td.order3.show-for-large-up{"ng-bind" => "order.changes_allowed_until"}
%td.order4.show-for-large-up{"ng-bind" => "::order.item_count"}
%td.order5.text-right{"ng-class" => "{'credit' : order.total < 0, 'debit' : order.total > 0, 'paid' : order.total == 0}","ng-bind" => "::order.total | localizeCurrency"}
%td.order6.text-right.show-for-large-up.brick
%a{"ng-href" => "{{::order.path}}" }= t('.edit')
%td.order7.text-right
= link_to t('.cancel'), "", method: :put, "ng-href" => "{{::order.cancel_path}}", "confirm-link-click" => t('orders_confirm_cancel')

View File

@@ -1,12 +1,10 @@
.row.active_table_row.skinny-head.margin-top{"ng-click" => "toggle($event)", "ng-class" => "{'closed' : !open()}"}
.columns.small-2
%span.margin-top
%img.account-logo{"logo-fallback" => true, "ng-src" => "{{distributor.logo}}"}
.columns.small-10.medium-5
%span.margin-top
%strong{"ng-bind" => "::distributor.name"}
.columns.small-8.small-offset-2.medium-3.text-right
%span.margin-top.distributor-balance{"ng-bind" => "::distributor.balance | formatBalance", "ng-class" => "{'credit' : distributor.balance < 0, 'debit' : distributor.balance > 0, 'paid' : distributor.balance == 0}" }
.columns.small-2.medium-2.text-right
%span.margin-top
%img.margin-top.account-logo{"logo-fallback" => true, "ng-src" => "{{distributor.logo}}"}
.columns.small-5
%h3.margin-top{"ng-bind" => "::distributor.name"}
.columns.small-4.text-right
%h3.margin-top.distributor-balance{"ng-bind" => "::distributor.balance | formatBalance", "ng-class" => "{'credit' : distributor.balance < 0, 'debit' : distributor.balance > 0, 'paid' : distributor.balance == 0}" }
.columns.small-1.text-right
%h3.margin-top
%i{"ng-class" => "{'ofn-i_005-caret-down' : !open(), 'ofn-i_006-caret-up' : open()}"}

View File

@@ -3,22 +3,26 @@
.row.pad-top
.small-12.columns.pad-top
%h2= accurate_title
.account-summary{"data-hook" => "account_summary"}
= @user.email
(#{link_to t(:edit), spree.edit_account_path})
%h3= t(:my_orders)
%h2
= accurate_title
%span.account-summary{"data-hook" => "account_summary"}
= @user.email
(#{link_to t(:edit), spree.edit_account_path})
.orders{"ng-controller" => "OrdersCtrl", "ng-cloak" => true}
.row
.small-12.columns
.active_table
%distributor.active_table_node.row.animate-repeat{"ng-if" => "Orders.orders_by_distributor.length > 0", "ng-repeat" => "(key, distributor) in Orders.orders_by_distributor",
"ng-controller" => "DistributorNodeCtrl",
"ng-class" => "{'closed' : !open(), 'open' : open(), 'inactive' : !distributor.active}",
id: "{{distributor.hash}}"}
.small-12.columns
= render partial: "spree/users/skinny"
= render partial: "spree/users/fat"
.message{"ng-if" => "Orders.orders_by_distributor.length == 0", "ng-bind" => "::'you_have_no_orders_yet' | t"}
.my-open-orders{ ng: { show: 'Orders.changeable_orders.length > 0' } }
%h3= t(:open_orders)
= render 'open_orders'
.active_table
%h3.my-orders= t(:transaction_history)
%distributor.active_table_node.row.animate-repeat{"ng-if" => "Orders.orders_by_distributor.length > 0", "ng-repeat" => "(key, distributor) in Orders.orders_by_distributor",
"ng-controller" => "DistributorNodeCtrl",
"ng-class" => "{'closed' : !open(), 'open' : open(), 'inactive' : !distributor.active}",
id: "{{distributor.hash}}"}
.small-12.columns
= render partial: "spree/users/skinny"
= render partial: "spree/users/fat"
.message{"ng-if" => "Orders.orders_by_distributor.length == 0", "ng-bind" => "::'you_have_no_orders_yet' | t"}
= render partial: "shared/footer"

View File

@@ -80,6 +80,21 @@ en:
show_all: Show all
show_all_with_more: "Show All (%{num} More)"
cancel: Cancel
edit: Edit
distributors: Distributors
order_cycles: Order Cycles
enterprise_limit: Enterprise Limit
bulk_order_management: Bulk Order Management
enterprises: Enterprises
enterprise_groups: Groups
reports: Reports
variant_overrides: Inventory
more: More
spree_products: Spree Products
all: All
current: Current
available: Available
dashboard: Dashboard
admin:
# Common properties / models
@@ -99,6 +114,9 @@ en:
sku: SKU
tags: Tags
variant: Variant
weight: Weight
volume: Volume
items: Items
# General form elements
quick_search: Quick Search
@@ -107,6 +125,8 @@ en:
end_date: "End Date"
unsaved_changes: "You have unsaved changes"
form_invalid: "Form contains missing or invalid fields"
clear_filters: Clear Filters
clear: Clear
columns: Columns
actions: Actions
@@ -190,6 +210,7 @@ en:
edit: 'Edit'
update_address: 'Update Address'
confirm_delete: 'Sure to delete?'
search_by_email: "Search by email/code..."
cache_settings:
show:
@@ -218,6 +239,7 @@ en:
new_button: New Enterprise Group
products:
unit_name_placeholder: 'eg. bunches'
bulk_edit:
unit: Unit
display_as: Display As
@@ -299,6 +321,8 @@ en:
abn_placeholder: eg. 99 123 456 789
acn: ACN
acn_placeholder: eg. 123 456 789
display_invoice_logo: Display logo in invoices
invoice_text: Add customized text at the end of invoices
contact:
name: Name
name_placeholder: eg. Gustav Plum
@@ -371,17 +395,25 @@ en:
shopfront_requires_login_tip: "Choose whether customers must login to view the shopfront or if it's visible to everybody."
shopfront_requires_login_false: "Public"
shopfront_requires_login_true: "Visible to registered customers only"
recommend_require_login: "We recommend to require users to login when orders can be changed."
allow_guest_orders: "Guest orders"
allow_guest_orders_tip: "Allow checkout as guest or require a registered user."
allow_guest_orders_false: "Require login to order"
allow_guest_orders_true: "Allow guest checkout"
allow_order_changes: "Change orders"
allow_order_changes_tip: "Allow customers to change their order as long the order cycle is open."
allow_order_changes_false: "Placed orders cannot be changed / cancelled"
allow_order_changes_true: "Customers can change / cancel orders while order cycle is open"
shopfront_message: Shopfront Message
shopfront_message_placeholder: >
An optional explanation for customers detailing how your shopfront works,
to be displayed above the product list on your shop page.
shopfront_closed_message: Shopfront Closed Message
shopfront_closed_message_placeholder: >
A message which provides a more detailed explanation about why your shop is
closed and/or when customers can expect it to open again. This is displayed
on your shop only when you have no active order cycles (ie. shop is closed).
shopfront_category_ordering: Shopfront Category Ordering
open_date: Open Date
close_date: Close Date
social:
@@ -523,12 +555,25 @@ en:
invoice_style2?: Use the alternative invoice model that includes total tax breakdown per rate and tax rate info per item (not yet suitable for countries displaying prices excluding tax)
enable_receipt_printing?: Show options for printing receipts using thermal printers in order dropdown?
# Frontend views
#
# These keys are referenced relatively like `t('.message')` in
# app/views/checkout/_already_ordered.html.haml.
#
checkout:
already_ordered:
cart: "cart"
message_html: "You have an order for this order cycle already. Check the %{cart} to see the items you ordered before. You can also cancel items as long as the order cycle is open."
home:
hubs:
show_closed_shops: "Show closed shops"
hide_closed_shops: "Hide closed shops"
show_on_map: "Show all on the map"
shared:
menu:
cart:
checkout: "Checkout now"
already_ordered_products: "Already ordered in this order cycle"
register_call:
selling_on_ofn: "Interested in getting on the Open Food Network?"
register: "Register here"
@@ -604,6 +649,7 @@ en:
terms_of_service: "Terms of service"
on_demand: On demand
none: None
not_allowed: Not allowed
label_shops: "Shops"
label_map: "Map"
@@ -626,7 +672,6 @@ en:
items: "items"
cart_headline: "Your shopping cart"
total: "Total"
checkout: "Checkout now"
cart_updating: "Updating cart..."
cart_empty: "Cart empty"
cart_edit: "Edit your cart"
@@ -635,15 +680,6 @@ en:
card_securitycode: "Security Code"
card_expiry_date: Expiry Date
ofn_cart_headline: "Current cart for:"
ofn_cart_distributor: "Distributor:"
ofn_cart_oc: "Order cycle:"
ofn_cart_from: "From:"
ofn_cart_to: "To:"
ofn_cart_product: "Product:"
ofn_cart_quantitiy: "Quantity:"
ofn_cart_send: "Buy me"
ie_warning_headline: "Your browser is out of date :-("
ie_warning_text: "For the best Open Food Network experience, we strongly recommend upgrading your browser:"
ie_warning_chrome: Download Chrome
@@ -743,6 +779,7 @@ en:
order_billing_address: Billing address
order_delivery_on: Delivery on
order_delivery_address: Delivery address
order_delivery_time: Delivery time
order_special_instructions: "Your notes:"
order_pickup_time: Ready for collection
order_pickup_instructions: Collection Instructions
@@ -751,6 +788,8 @@ en:
order_includes_tax: (includes tax)
order_payment_paypal_successful: Your payment via PayPal has been processed successfully.
order_hub_info: Hub Info
order_back_to_store: Back To Store
order_back_to_cart: Back To Cart
bom_tip: "Use this page to alter product quantities across multiple orders. Products may also be removed from orders entirely, if required."
@@ -860,6 +899,11 @@ See the %{link} to find out more about %{sitename}'s features and to start using
hubs_distance: Closest to
hubs_distance_filter: "Show me shops near %{location}"
shop_changeable_orders_alert_html:
one: Your order with <a href='%{path}' target='_blank'>%{shop} / %{order}</a> is open for review. You can make changes until %{oc_close}.
other: You have <a href='%{path}' target='_blank'>%{count} orders with %{shop}</a> currently open for review. You can make changes until %{oc_close}.
orders_changeable_orders_alert_html: This order has been confirmed, but you can make changes until <strong>%{oc_close}</strong>.
products_clear_all: Clear all
products_showing: "Showing:"
products_with: with
@@ -1005,7 +1049,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
orders_edit_checkout: Checkout
orders_form_empty_cart: "Empty cart"
orders_form_subtotal: Produce subtotal
orders_form_admin: Admin and handling
orders_form_admin: Admin & Handling
orders_form_total: Total
orders_oc_expired_headline: Orders have closed for this order cycle
orders_oc_expired_text: "Sorry, orders for this order cycle closed %{time} ago! Please contact your hub directly to see if they can accept late orders."
@@ -1015,7 +1059,18 @@ See the %{link} to find out more about %{sitename}'s features and to start using
orders_oc_expired_phone: "Phone:"
orders_show_title: Order Confirmation
orders_show_time: Order ready on
orders_show_number: Order confirmation
orders_show_order_number: "Order #%{number}"
orders_show_cancelled: Cancelled
orders_show_confirmed: Confirmed
orders_your_order_has_been_cancelled: "Your order has been cancelled"
orders_could_not_cancel: "Sorry, the order could not be cancelled"
orders_cannot_remove_the_final_item: "Cannot remove the final item from an order, please cancel the order instead."
orders_bought_items_notice:
one: An additional item is already confirmed for this order cycle
other: "%{count} additional items already confirmed for this order cycle"
orders_bought_edit_button: Edit confirmed items
orders_bought_already_confirmed: "* already confirmed"
orders_confirm_cancel: Are you sure you want to cancel this order?
products_cart_distributor_choice: "Distributor for your order:"
products_cart_distributor_change: "Your distributor for this order will be changed to %{name} if you add this product to your cart."
@@ -1122,6 +1177,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
enterprise_long_desc: "Long Description"
enterprise_long_desc_placeholder: "This is your opportunity to tell the story of your enterprise - what makes you different and wonderful? We'd suggest keeping your description to under 600 characters or 150 words."
enterprise_long_desc_length: "%{num} characters / up to 600 recommended"
enterprise_limit: Enterprise Limit
enterprise_abn: "ABN"
enterprise_abn_placeholder: "eg. 99 123 456 789"
enterprise_acn: "ACN"
@@ -1262,6 +1318,7 @@ Please follow the instructions there to make your enterprise visible on the Open
calculator_values: "Calculator values"
flat_percent_per_item: "Flat Percent (per item)"
new_order_cycles: "New Order Cycles"
new_order_cycle: "New Order Cycle"
select_a_coordinator_for_your_order_cycle: "Select a coordinator for your order cycle"
edit_order_cycle: "Edit Order Cycle"
roles: "Roles"
@@ -1282,6 +1339,7 @@ Please follow the instructions there to make your enterprise visible on the Open
price: "Price"
on_hand: "On hand"
save_changes: "Save Changes"
order_saved: "Order Saved"
spree_admin_overview_enterprises_header: "My Enterprises"
spree_admin_overview_enterprises_footer: "MANAGE MY ENTERPRISES"
spree_admin_enterprises_hubs_name: "Name"
@@ -1324,6 +1382,8 @@ Please follow the instructions there to make your enterprise visible on the Open
edit_profile_details: "Edit profile details"
edit_profile_details_etc: "Change your profile description, images, etc."
order_cycle: "Order Cycle"
order_cycles: "Order Cycles"
enterprises: "Enterprises"
remove_tax: "Remove tax"
enterprise_terms_of_service: "Enterprise Terms of Service"
enterprises_require_tos: "Enterprises must accept Terms of Service"
@@ -1542,6 +1602,10 @@ Please follow the instructions there to make your enterprise visible on the Open
now_out_of_stock: is now out of stock.
only_n_remainging: "now only has %{num} remaining."
producers:
signup:
start_free_profile: "Start with a free profile, and expand when you're ready!"
spree:
admin:
products:
@@ -1558,7 +1622,11 @@ Please follow the instructions there to make your enterprise visible on the Open
date_picker:
format: ! '%Y-%m-%d'
js_format: 'yy-mm-dd'
inventory: Inventory
zipcode: Postcode
orders:
bought:
item: "Already ordered in this order cycle"
shipment_states:
backorder: backorder
partial: partial
@@ -1596,3 +1664,46 @@ Please follow the instructions there to make your enterprise visible on the Open
orders:
invoice:
tax_invoice: "TAX INVOICE: "
payment_states:
balance_due: balance due
completed: completed
checkout: checkout
credit_owed: credit owed
failed: failed
paid: paid
pending: pending
processing: processing
void: void
invalid: invalid
shipment_states:
backorder: backorder
partial: partial
pending: pending
ready: ready
shipped: shipped
user_mailer:
reset_password_instructions:
request_sent_text: |
A request to reset your password has been made.
If you did not make this request, simply ignore this email.
link_text: >
If you did make this request just click the link below:
issue_text: |
If the above URL does not work try copying and pasting it into your browser.
If you continue to have problems please feel free to contact us.
weight: Weight (per kg)
zipcode: Postcode
users:
show:
open_orders: Open Orders
transaction_history: Transaction History
open_orders:
order: Order
shop: Shop
changes_allowed_until: Changes Allowed Until
items: Items
total: Total
edit: Edit
cancel: Cancel
closed: Closed
until: Until

View File

@@ -8,7 +8,7 @@ es:
failure:
invalid: |
Correo o contraseña inválidos.
¿Fue un invitado la vez pasada? Tal vez necesite crear una cuenta o recuperar su contraseña.
¿Has sido invitada? Tal vez necesites crear una cuenta o recuperar tu contraseña.
enterprise_confirmations:
enterprise:
confirmed: Gracias, tu dirección de email ha sido confirmada.
@@ -83,9 +83,11 @@ es:
clear_all: Limpiar todo
start_date: "Fecha de inicio"
end_date: "Fecha de finalización"
form_invalid: "El formulario contiene campos vacíos o inválidos"
columns: Columnas
actions: Acciones
viewing: "Viendo: %{current_view_name}"
description: Descripción
whats_this: ¿Qué es esto?
tag_has_rules: "Reglas existentes para esta etiqueta: %{num}"
has_one_rule: "Tiene una regla"
@@ -189,6 +191,9 @@ es:
inherits_properties?: ¿Propiedades heredadas?
available_on: Disponible en
av_on: "Disp. en"
properties:
property_name: Nombre de la Propiedad
inherited_property: Propiedad Heredada
variants:
to_order_tip: "Los artículos hechos según demanda no tienen un nivel de stock, como por ejemplo panes hechos según demanda."
variant_overrides:
@@ -324,7 +329,7 @@ es:
create_one_button: Crear una ahora
no_method_yet: Todavía no tienes ningún método de envío.
shop_preferences:
shopfront_requires_login: "Publicidad visible en la tienda?"
shopfront_requires_login: "¿Visibilidad pública de la tienda?"
shopfront_requires_login_tip: "Elije si los clientes deben iniciar sesión para ver la tienda o si es visible para todos."
shopfront_requires_login_false: "Público"
shopfront_requires_login_true: "Visible solo para consumidores registrados"
@@ -396,7 +401,7 @@ es:
producer_hub_description_text: Tu organización es la columna vertebral de un sistema de consumo local. Agrega productos tuyos o de otras organizaciones y véndelo a través de tu tienda en Open Food Network.
profile: Solo perfil
get_listing: Obtener un listado
profile_description_text: La gente podrá encontrarte y ponerse en contacto contigo en Open Food Network. Su empresa será visible en el mapa y se podrá buscar en los listados.
profile_description_text: La gente podrá encontrarte y ponerse en contacto contigo en Open Food Network. Su organización será visible en el mapa y se podrá buscar en los listados.
hub_shop: Tienda
hub_shop_text: Vender la producción de otros
hub_shop_description_text: Tu organización es la columna vertebral de un sistema de consumo local. Agrega productos de otras organizaciones y véndelo a través de tu tienda en Open Food Network.
@@ -424,6 +429,16 @@ es:
next_step: Siguiente paso
choose_starting_point: 'Elige tu punto de partida:'
order_cycles:
edit:
advanced_settings: Configuración Avanzada
update_and_close: Actualizar y Cerrar
choose_products_from: 'Escoger Productos desde:'
pickup_time_tip: Cuándo estarán disponibles para el consumidor las ordenes de este ciclo
pickup_instructions_tip: Esta instrucciones se muestran a los consumidores después de que completen un pedido.
exchange_form:
pickup_instructions_placeholder: "Instrucciones de recogida"
pickup_time_placeholder: "Listo para ( Fecha / Hora)"
receival_instructions_placeholder: "Instrucciones de recepción"
advanced_settings:
title: Configuración Avanzada
choose_product_tip: Puedes optar por restringir todos los productos disponibles (entrantes y salientes), solo a los de %{inventory} inventario.
@@ -441,7 +456,7 @@ es:
distributor: Distribuidor
products: Productos
tags: Etiquetas
delivery_detaisl: Detalles de Recogida / Entrega
delivery_details: Detalles de Recogida / Entrega
debug_info: Información de Debug
name_and_timing_form:
name: Nombre
@@ -459,13 +474,7 @@ es:
customer_instructions_placeholder: Notas de la recogida o entrega
products: Productos
fees: Comisiones
edit:
advanced_settings: Configuración Avanzada
update_and_close: Actualizar y Cerrar
producer_properties:
form:
property: Propiedad
value: Valor
index:
title: Propiedades de la Productora
shared:
@@ -490,7 +499,7 @@ es:
login: "login"
register: "registro"
contact: "contactar"
require_customer_login: "Esta tienda es solo para usuarios registrados."
require_customer_login: "Esta tienda es solo para consumidores registrados."
require_login_html: "Haz %{login} si ya tienes una cuenta. De lo contrario puedes %{register}."
require_customer_html: "%{contact} %{enterprise} para convertirte en miembro."
invoice_billing_address: "Dirección de facturación:"
@@ -602,7 +611,7 @@ es:
footer_sites_community: "Comunidad"
footer_sites_userguide: "Guía de usuario"
footer_secure: "Seguro y de confianza."
footer_secure_text: "Open Food Network usa cifrado SSL (RSA de 2048 bit) en todo lado para mantener privada la información de compras y pagos. Nuestros servidores no almacenan los detalles de tarjetas de créditos y los pagos son procesados por servicios que cumplen con PCI."
footer_secure_text: "Open Food Network usa cifrado SSL (RSA de 2048 bit) en toda su plataforma para mantener privada la información de compras y pagos. Nuestros servidores no almacenan los detalles de tarjetas de créditos y los pagos son procesados por servicios que cumplen con PCI."
footer_contact_headline: "Mantenerse en contacto"
footer_contact_email: "Envíenos un correo"
footer_nav_headline: "Navegar"
@@ -619,7 +628,7 @@ es:
brandstory_part1: "Nosotros empezamos desde abajo. Con granjeros y productoras listas para contar sus historias con orgullo y autenticidad. Con distribuidoras listas para conectar gente con productos de forma justa y honesta. Con compradores que creen que mejores decisiones de compras semanales pueden seriamente cambiar el mundo."
brandstory_part2: "Luego necesitamos una forma de hacerlo real. Una forma de empoderar a todos los que producen, venden y compran comida. Una forma de contar todas las historias, de manejar todas las logísticas. Una forma de convertir transacción en transformación todos los días."
brandstory_part3: "Entonces contruímos un mercado que nivela el campo de juego. Es transparente, de forma que crea relaciones reales. Es de código abierto, de forma que todos son los dueños."
brandstory_part4: "Funciona en todo lado. Cambia todo."
brandstory_part4: "Funciona en cualquier lugar. Lo cambia todo."
brandstory_part5_strong: "Le llamamos Open Food Network."
brandstory_part6: "Todos amamos la comida. Ahora podemos amar nuestro sistema de comida también."
learn_body: "Explora modelos, historias y recursos para ayudarte a desarrollar tu organización. Encuentra formación, eventos y otras oportunidades para aprender de tus compañeros."
@@ -628,18 +637,18 @@ es:
connect_cta: "Explorar"
system_headline: "Compras - cómo funcionan."
system_step1: "1. Buscar"
system_step1_text: "Busque comida local y de temporada en nuestras tiendas diversas e independientes. Busque por barrio o categoría de comida, o si prefiere servicio de entrega o recogerla."
system_step1_text: "Busca comida local y de temporada en nuestras tiendas diversas e independientes. Busca por barrio y participa en un grupo de consumo."
system_step2: "2. Comprar"
system_step2_text: "Transforma tu consumo con comida local y asequible de diversas productoras ¡Conoce las historias detrás de tu comida y la gente que la hace!"
system_step3: "3. Recoger / Servicio de entrega"
system_step3_text: "Espere su entrega, o visite a su productora o grupo de consumo para una conexión más personal con su comida. Compra de comida tan diversa como la naturaleza lo previó."
system_step3: "3. Recogida"
system_step3_text: "Visita tu Grupo de Consumo para un vínculo más directo con las productoras y tus vecinos, también puedes comprar directamente a algunas productoras o centrales de compras. Compra tu comida de una manera tan diversa como la naturaleza."
cta_headline: "Compras que hacen el mundo un mejor lugar."
cta_label: "Estoy listo"
stats_headline: "Estamos creando un nuevo sistema de comida."
stats_producers: "productoras de comida"
stats_shops: "tiendas de comida"
stats_shoppers: "compradores de comida"
stats_orders: "pedidos de comida"
cta_label: "Estoy lista"
stats_headline: "Entre todas creamos un nuevo sistema de producción, distribución y consumo."
stats_producers: "productoras"
stats_shops: "tiendas"
stats_shoppers: "consumidoras"
stats_orders: "pedidos"
checkout_title: Revisar el carrito
checkout_now: Revisare el carrito ahora
checkout_order_ready: Pedido preparado para
@@ -690,14 +699,14 @@ es:
email_registered: "ahora es parte de"
email_userguide_html: "La Guía de Usuario con soporte detallado para configurar su Productora o Grupo de Consumo está aquí: %{link}"
email_admin_html: "Puede administrar su cuenta iniciando sesión en %{link} o haciendo clic en el engrane arriba a la derecha de la página de inicio, y seleccionando Administración."
email_community_html: "También tenemos un foro en líea para la discusión comunal relacionada con el programa OFN y los retos únicos del funcionamiento de una empresa de alimentación. Lo invitamos a unirse. Estamos evolucionando de forma constante y su aporte en este formo le dará forma a lo que pase luego. %{link}"
email_community_html: "También tenemos un foro en líea para la discusión comunal relacionada con el programa OFN y los retos únicos del funcionamiento de una organización de alimentación. Lo invitamos a unirse. Estamos evolucionando de forma constante y su aporte en este formo le dará forma a lo que pase luego. %{link}"
join_community: "Unirse a la comunidad"
email_help: "Si tiene dificultades, revise nuestras preguntas frecuentes, navegue el foro o haga una entrada de con tema de 'Soporte' y ¡alguien le ayudará!"
email_confirmation_greeting: "Hola, %{contact}!"
email_confirmation_profile_created: "¡Se creó un un perfil para %{name} con éxito! Para activar su Perfil necesitamos que confirme esta dirección de correos."
email_confirmation_click_link: "Por favor haga clic en el enlace de abajo para confirmar el correo electrónico y continuar configurando su perfil."
email_confirmation_link_label: "Confirmar este correo electrónico »"
email_confirmation_help_html: "Después de confirmar el correo electrónico puede accesar su cuenta de administración para esta empresa. Vea el %{link} para encontrar más acerca de las características de %{sitename} e iniciar a usar su perfil o tienda en línea."
email_confirmation_help_html: "Después de confirmar el correo electrónico puedes acceder a tu cuenta de administración para esta organización. Visita %{link} para encontrar más información sobre las características de %{sitename} y empieza a usar tu perfil o tienda online."
email_confirmation_userguide: "Guía de Usuario"
email_social: "Conecte con nosotros:"
email_contact: "Envíenos un correo electrónico:"
@@ -732,7 +741,7 @@ es:
email_signup_login: Su nombre de usuario
email_signup_email: Tu correo electrónico para el inicio de sesión es
email_signup_shop_html: "Puede empezar a comprar en línea ahora en %{link}."
email_signup_text: "Gracias por unirte a la red. Si eres un comprador, ¡esperamos presentarte a muchos agricultores, grupos de consumo y deliciosa comida! Si eres una productora o formas parte de una empresa de alimentos, estamos emocionados de que formes parte de la red."
email_signup_text: "Gracias por unirte a la red. Si eres un comprador, ¡esperamos presentarte a muchos agricultores, grupos de consumo y deliciosa comida! Si eres una productora o formas parte de una organización de alimentos, estamos emocionados de que formes parte de la red."
email_signup_help_html: "Agradecemos todas tus preguntas y feedback; puedes usar el botón de <em>Enviar Feedback</em> en el sitio o escribir un email a %{email}"
producer_mail_greeting: "Estimada"
producer_mail_text_before: "Ahora tenemos todas los pedidos de las consumidoras para la siguiente ronda."
@@ -750,7 +759,7 @@ es:
shopping_contact_social: "Seguir"
shopping_groups_part_of: "es parte de:"
shopping_producers_of_hub: "productoras de %{hub}:"
enterprises_next_closing: "Cerrando próximo pedido"
enterprises_next_closing: "Los pedidos se cerrarán"
enterprises_ready_for: "Listo para"
enterprises_choose: "Escoger cuando quieres tu pedido:"
hubs_buy: "Comprar:"
@@ -834,7 +843,7 @@ es:
modal_how_pickup: Recogida, entrega y gastos de envío
modal_how_pickup_explained: Algunos grupos de consumo hacen entregas hasta su puerta, mientras otros requieren que recojas las compras. Puedes ver que opciones están disponibles en su página de inicio, y seleccionar cuál te gustaría en las páginas de compras y revisión. Las entregas costarán más, y el precio cambia entre grupos de consumo. Cada grupo es un punto de venta con operaciones y logística independientes, las diferencias son normales y deseables.
modal_how_more: Aprender más
modal_how_more_explained: "Si quiere aprender más acerca del Open Food Network, cómo trabaja y colaborar, revise:"
modal_how_more_explained: "Si quieres saber más acerca de Open Food Network, cómo trabajamos y nos organizamos, visita:"
modal_producers: "Productoras"
modal_producers_explained: "Nuestras productoras hacen todos los deliciosos alimentos que puedes comprar en Open Food Network."
producers_about: Acerca de nosotras
@@ -852,7 +861,7 @@ es:
producers_signup_headline: Productoras de alimentos, empoderadas.
producers_signup_motivation: Venda sus alimentos y cuente sus historias en distintos nuevos mercados. Ahorre tiempo y dinero en costos administrativos. Apoyamos la innovación sin el riesgo. Hemos nivelado el campo de juego.
producers_signup_send: Únase ahora
producers_signup_enterprise: Cuentas de empresa
producers_signup_enterprise: Cuentas de organización
producers_signup_studies: Historias de nuestras productoras.
producers_signup_cta_headline: ¡Únase ahora!
producers_signup_cta_action: Únase ahora
@@ -885,7 +894,7 @@ es:
shops_signup_headline: Grupos de Consumo, sin límites.
shops_signup_motivation: Cualquiera que sea su modelo, lo apoyamos. De cualquier forma que cambie, estamos con usted. Somos una organización sin findes de lucro, independiente, y de código abierto. Somos los socios de software con los que ha soñado.
shops_signup_action: Únase ahora
shops_signup_pricing: Cuentas de empresa
shops_signup_pricing: Cuentas de organización
shops_signup_stories: Historias de nuestros grupos de consumo.
shops_signup_help: Estamos listos para ayudar.
shops_signup_help_text: Usted necesita un mejor retorno. Usted necesita nuevos compradores y socios de logística. Usted necesita que su historia sea contada a través de ventas al por mayor, al detalle y en la mesa de la cocina.
@@ -931,9 +940,9 @@ es:
going_back_to_home_page: "Le estamos llevando de vuelta a la página de inicio"
creating: Creando
updating: Actualizando
failed_to_create_enterprise: "Error al crear su empresa."
failed_to_create_enterprise_unknown: "Error al crear su empresa.\nAsegúrese que haya llenado todos los campos de forma completa."
failed_to_update_enterprise_unknown: "Error al actualizar su empresa.\nAsegurese que haya llenado todos los campos de forma completa."
failed_to_create_enterprise: "Error al crear tu organización."
failed_to_create_enterprise_unknown: "Error al crear tu organización.\nAsegúrate de haber rellenado todos los campos."
failed_to_update_enterprise_unknown: "Error al actualizar tu organización.\nAsegúrate de haber rellenado todos los campos."
order_not_saved_yet: "Su orden aun no ha sido guardada. ¡Denos unos cuantos segundos para terminar!"
filter_by: "Fitrar por"
hide_filters: "Esconder filtros"
@@ -982,7 +991,7 @@ es:
continue: "Continuar"
limit_reached_headline: "¡Ay no!"
limit_reached_message: "¡Ha alcanzado el límite!"
limit_reached_text: "Ha alcanzado el límite del número de empresas de las que puede ser dueño en el"
limit_reached_text: "Has alcanzado el límite de organizaciones de las que puedes gestionar en "
limit_reached_action: "Regresar a la página de inicio"
select_promo_image: "Paso 3. Seleccione una imagen promocional"
promo_image_tip: "Consejo: Se muestra como una pancarta, el tamaño preferido es 1200×260px"
@@ -1000,14 +1009,14 @@ es:
review_logo: "Paso 2. Revise su logo"
review_logo_tip: "Consejo: para mejores resultados, su logo debería llenar el espacio disponible"
logo_placeholder: "El logo aparecerá aquí para ser revisado cuando se haya subido"
enterprise_about_headline: Buena esa!"
enterprise_about_headline: Seguimos!"
enterprise_about_message: "Ahora vamos a profundizar en los detalles acerca de"
enterprise_success: Éxito! %{enterprise} se agregó a la Open Food Network "
enterprise_success: Felicidades! %{enterprise} se agregó a Open Food Network "
enterprise_registration_exit_message: "Si sale de este asistente en cualquier etapa, debe hacer clic en el enlace de confirmación el el correo electrónico que recibió. Esto lo llevará a la interfaz de administración en la que puede continuar configurando su perfil."
enterprise_description: "Descripción corta"
enterprise_description_placeholder: "Una oración corta que describa su empresa"
enterprise_description_placeholder: "Una frase corta que describa tu organización"
enterprise_long_desc: "Descripción larga"
enterprise_long_desc_placeholder: "Esta es su oportunidad de contar la historia de su empresa - ¿qué la hace diferente y asombrosa? Le sugerimos mantener la descripción en menos de 600 caracteres o 150 palabras."
enterprise_long_desc_placeholder: "Esta es tu oportunidad de contar la historia de tu organización - ¿qué la hace diferente? Sugerimos mantener la descripción en menos de 600 caracteres o 150 palabras."
enterprise_long_desc_length: "%{num} caracteres / recomentdamos hasta 600"
enterprise_abn: "ABN"
enterprise_abn_placeholder: "eg. 99 123 456 789"
@@ -1036,15 +1045,15 @@ es:
registration_logo: "Su imagen de logo"
registration_promo_image: "Imagen en formato apaisado para su perfil"
registration_about_us: "Texto 'Acerca de nosotras'"
registration_outcome_headline: "¿Qué recibo?"
registration_outcome_headline: "¿Para qué sirve?"
registration_outcome1_html: "Su perfil le ayuda a las personas a <strong>encontrarle</strong> y <strong>contactarle</strong> en la Open Food Network."
registration_outcome2: "Use este espacio para contar la historia de su empresa, para ayudar a dirigir conexiones a su presencia social y en línea."
registration_outcome3: "También es un primer paso para negociar en la Open Food Network, o abrir una tienda en línea."
registration_outcome2: "Usa este espacio para contar la historia de tu organización, para ayudar a crear vínculos con tu comunidad."
registration_outcome3: "También es el primer paso para empezar en Open Food Network, o abrir una tienda online."
registration_finished_headline: "¡Terminado!"
registration_finished_thanks: "Gracias por llenar los detalles de %{enterprise}."
registration_finished_login: "Puede cambiar o actualizar su negocio en cualquier etapa iniciando sesión en Open Food Network y yendo a Admin."
registration_finished_activate: "Activar %{enterprise}."
registration_finished_activate_instruction_html: "Hemos enviado un correo de confirmación a <strong>%{email}</strong> si no ha sido activado antes.<br/> Siga las instrucciones ahí para hacer su empresa visible en Open Food Network."
registration_finished_activate_instruction_html: "Hemos enviado un correo de confirmación a <strong>%{email}</strong> si no has activado tu cuenta ya.<br/> Sigue las instrucciones para hacer tu organización visible en Open Food Network."
registration_finished_action: "Página de inicio de Open Food Network"
registration_type_headline: "¡Último paso para agregar %{enterprise}!"
registration_type_question: "¿Eres una productora?"
@@ -1054,15 +1063,15 @@ es:
registration_type_producer_help: "Las productoras hacen cosas deliciosas para comer y/o beber. Eres una productora si lo cultivas, lo haces crecer, lo preparas, lo horneas, lo fermentas, lo ordeñas, ..."
registration_type_no_producer_help: "Si no eres una productora, probablemente conozcas a alguien que venda o distribuya comida. También podrías convertirte en un grupo de consumo u otro tipo de organización."
create_profile: "Crear Perfil"
registration_images_headline: Gracias!"
registration_images_description: "¡Suba algunas buenas fotografías así el perfil se verá muy bien! :)"
registration_images_headline: Ya casi lo tenemos!"
registration_images_description: "¡Sube algunas fotografías así el perfil se verá mucho mejor! :)"
registration_detail_headline: "Empecemos..."
registration_detail_enterprise: "¡Bien! Primero necesitamos saber un poco más acerca de tu organización:"
registration_detail_producer: "¡Bien! Primero necesitamos saber un poco más acerca de su productora:"
registration_detail_enterprise: "¡Bien! Primero necesitamos saber un poco más sobre tu organización:"
registration_detail_producer: "¡Bien! Primero necesitamos saber un poco más sobre tu productora:"
registration_detail_name_enterprise: "Nombre de la Organización:"
registration_detail_name_producer: "Nombre de la granja:"
registration_detail_name_placeholder: "e.j. Cooperativa de Consum Pastanaga Feliç"
registration_detail_name_error: "Por favor elija un nombre único para su empresa"
registration_detail_name_error: "Por favor elije un nombre único para tu organización"
registration_detail_address1: "Línea de dirección 1:"
registration_detail_address1_placeholder: "e.j. Torrent de l'Olla 24"
registration_detail_address1_error: "Ingrese una dirección"
@@ -1162,7 +1171,7 @@ es:
producer: "Productora"
product: "Producto"
price: "Precio"
on_hand: "En mano"
on_hand: "Disponibles"
save_changes: "Guardar Cambios"
spree_admin_overview_enterprises_header: "Mis Organizaciones"
spree_admin_overview_enterprises_footer: "GESTIONAR MIS ORGANIZACIONES"
@@ -1209,7 +1218,7 @@ es:
enterprise_terms_of_service: "Términos del Servicio de la Organización"
enterprises_require_tos: "Las organizaciones deben aceptar los Términos del Servicio"
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 empresas que acepten"
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."
enterprise_tos_agree: "Estoy de acuerdo con los Términos del Servicio"
tax_settings: "Configuración de Impuestos"
@@ -1354,10 +1363,9 @@ es:
Tu organización no se activará completamente hasta que selecciones un
paquete de las opciones de la izquierda.
choose_package_text2: >+
choose_package_text2: >
Haz click en una opción para ver información más detallada acerca de
cada paquete, y pulsa el botón rojo GUARDAR cuando hayas terminado.
profile_only: Solo perfil
profile_only_cost: "COSTE: GRATUITO PARA SIEMPRE"
profile_only_text1: >+
@@ -1484,3 +1492,13 @@ es:
orders:
invoice:
tax_invoice: "IMPUESTOS FACTURA:"
user_mailer:
reset_password_instructions:
request_sent_text: |
Se ha solicitado el cambio de tu contraseña.
Si tu no lo has solicitado simplemente ignora este email.
link_text: >
Si has solicitado esta acción haz click en el siguiente enlace:
issue_text: |
Si el enlace no funciona prueba a copiarlo y pegarlo en tu navegador.
Si los problemas continúan no dudes en contactarnos.

View File

@@ -24,7 +24,6 @@ fr:
welcome_to: 'Bienvenue sur '
site_meta_description: "Tout commence dans le sol. Avec ces paysans, agriculteurs, producteurs, engagés pour une agriculture durable et régénératrice, et désireux de partager leur histoire et leur passion avec fierté. Avec ces distributeurs souhaitant reconnecter les individus à leurs aliments et aux gens qui les produisent, soutenir les prises de conscience, dans une démarche de transparence, d'honnêteté, en assurant une juste rémunération des producteurs. Avec ces acheteurs qui croient que de meilleures décisions d'achats peuvent ..."
search_by_name: Recherche par nom ou département...
producers: 'Producteurs Français'
producers_join: Les producteurs et autres hubs basés en France sont invités à rejoindre Open Food France.
charges_sales_tax: Soumis à la TVA?
print_invoice: "Imprimer la facture"
@@ -62,6 +61,18 @@ fr:
show_all: Tout voir
show_all_with_more: "Voir tous (%{num} en plus)"
cancel: Annuler
edit: Modifier
distributors: Distributeurs
bulk_order_management: Gestion des commandes par lot
enterprise_groups: Groupes
reports: Rapports
variant_overrides: Catalogue boutique
more: Plus
spree_products: Produits
all: Tous
current: Actuel
available: Disponible
dashboard: Tableau de bord
admin:
date: Date
email: Email
@@ -79,13 +90,20 @@ fr:
sku: Référence produit
tags: Tags
variant: Variante
weight: Poids
volume: Volume
items: Pièce
quick_search: Recherche rapide
clear_all: Vider
start_date: "Date de début"
end_date: "Date de fin"
form_invalid: "Le formulaire contient des champs manquants ou invalides"
clear_filters: Annuler les filtres
clear: Annuler
columns: Colonnes
actions: Actions
viewing: "Vous regardez: %{current_view_name}"
description: Description
whats_this: Qu'est-ce que c'est?
tag_has_rules: "Règles existantes pour ce tag: %{num}"
has_one_rule: "a une règle"
@@ -158,6 +176,7 @@ fr:
edit: 'Modifier'
update_address: 'Mettre à jour l''adresse'
confirm_delete: 'Confirmer suppression?'
search_by_email: "Recherche par email/code..."
cache_settings:
show:
title: Mise en cache
@@ -181,6 +200,7 @@ fr:
index:
new_button: Nouveau groupe d'entreprises
products:
unit_name_placeholder: 'ex: botte'
bulk_edit:
unit: Unité
display_as: Affiché
@@ -189,13 +209,16 @@ fr:
inherits_properties?: Hériter des propriétés producteur?
available_on: Disponible sur
av_on: "Disp. sur"
properties:
property_name: Nom du label
inherited_property: Label producteur appliqué par défaut
variants:
to_order_tip: "Les articles fabriqués sur commande n'ont pas un niveau de stock défini, comme des pains faits à la main."
variant_overrides:
loading_flash:
loading_inventory: Catalogue boutique en cours de chargement...
index:
title: Stock
title: Catalogue boutique
description: Utilisez cette page pour gérer le catalogue de votre entreprise. Les détails produits saisis ici remplaceront ceux de la page "Produit" pour votre entreprise uniquement.
enable_reset?: Autoriser réinitialisation du stock (retour configurations par défaut)?
inherit?: Hériter?
@@ -249,12 +272,14 @@ fr:
desc_short: Description (en bref)
desc_short_placeholder: Parlez de votre entreprise en une ou deux phrases
desc_long: A propos
desc_long_placeholder: Parlez de vous à vos acheteurs! Ces informations seront visibles sur votre profil public.
desc_long_placeholder: Parlez de vous à vos acheteurs ! Ces informations seront visibles sur votre profil public.
business_details:
abn: SIRET
abn_placeholder: 'ex: 404 833 048 00022'
acn: n° TVA intracommunautaire
acn_placeholder: 'ex: 404 833 048'
display_invoice_logo: Afficher le logo sur la facture
invoice_text: Ajouter une mention spécifique en bas des factures
contact:
name: Nom
name_placeholder: 'ex: Bernard Michelet'
@@ -268,7 +293,7 @@ fr:
name: Nom
fee_type: Type de marge
manage_fees: Gérer les marges et commissions
no_fees_yet: Vous n'avez pas encore définies de commissions
no_fees_yet: Vous n'avez pas encore défini de commissions
create_button: Créer une commission
images:
logo: Logo
@@ -290,9 +315,9 @@ fr:
payment_methods:
name: Nom
applies: Active?
manage: Gérer les options de paiement
not_method_yet: Vous n'avez pas encore d'option de paiement.
create_button: Créer une nouvelle option de paiement
manage: Gérer les méthodes de paiement
not_method_yet: Vous n'avez pas encore de méthode de paiement.
create_button: Créer une nouvelle méthode de paiement
create_one_button: En créer une maintenant
primary_details:
name: Nom
@@ -312,7 +337,7 @@ fr:
visible_in_search_tip: Indiquez si vous souhaitez ou ne souhaitez pas que votre entreprise apparaisse sur la carte et dans la liste des boutiques.
visible: Visible
not_visible: Invisible
permalink: Nom affiché dans l'URL (sans espace)
permalink: Nom pour URL (sans espace)
permalink_tip: "Ce nom permanent est utilisé pour créer l'url de votre boutique: %{link}ma-boutique/shop"
link_to_front: Lien URL de la boutique
link_to_front_tip: C'est le lien qui permet d'accéder en direct à votre boutique sur Open Food France.
@@ -321,25 +346,33 @@ fr:
applies: Active?
manage: Gérer les méthodes de livraison
create_button: Créer nouvelle méthode de livraison
create_one_button: Créer une commission
create_one_button: En créer une maintenant
no_method_yet: Vous n'avez pas encore paramétré de méthode de livraison.
shop_preferences:
shopfront_requires_login: "Boutique visible par tous?"
shopfront_requires_login_tip: "Choisissez si les acheteurs doivent être connectés pour voir la boutique ou si la boutique est visible par tout le monde."
shopfront_requires_login_false: "Visible par tous"
shopfront_requires_login_true: "Visible uniquement pour les acheteurs logués"
recommend_require_login: "Nous recommandons de demander aux utilisateurs de se connecter si vous souhaitez leur permettre de modifier leur commande."
allow_guest_orders: "Commandes des invités"
allow_guest_orders_tip: "Autoriser la commande en tant qu'invité ou demander que l'acheteur soit logué."
allow_guest_orders_false: "Demander que l'acheteur se logue pour pouvoir commander"
allow_guest_orders_true: "Autoriser les commandes en mode invité"
allow_order_changes: "Modifier la commande"
allow_order_changes_tip: "Permettre aux acheteurs de modifier leur commande tant que le cycle de vente est ouvert."
allow_order_changes_false: "Les commandes validées ne peuvent plus être modifiées / annulées"
allow_order_changes_true: "Les acheteurs peuvent modifier / valider leurs commandes tant que le cycle de vente est ouvert"
shopfront_message: Message d'accueil boutique ouverte
shopfront_message_placeholder: >
Vous pouvez ici expliquer à vos acheteurs comment votre boutique fonctionne.
Ce texte s'affiche dans votre boutique, au-dessus de la liste de produits.
shopfront_closed_message: Message d'accueil boutique fermée
shopfront_closed_message_placeholder: >
Vous pouvez ici expliquer à vos acheteurs pourquoi votre boutique est
fermée et/ou quand elle ouvrira. Ce texte s'affiche uniquement quand
il n'y a pas de cycle de vente en cours (donc quand votre boutique est
fermée).
shopfront_category_ordering: Ordre d'affichage des catégories
open_date: Date d'ouverture
close_date: Date de fermeture
social:
@@ -423,6 +456,16 @@ fr:
next_step: Etape suivante
choose_starting_point: 'Choisissez par où commencer:'
order_cycles:
edit:
advanced_settings: Paramétrages avancés
update_and_close: Mettre à jour et fermer
choose_products_from: 'Choisir produits depuis :'
pickup_time_tip: Date/heure à laquelle les commandes pour ce cycle de vente seront à disposition de / livrées à l'acheteur.
pickup_instructions_tip: Ces instructions seront affichées à l'acheteur une fois sa commande passée.
exchange_form:
pickup_instructions_placeholder: "Modalités de retrait/livraison"
pickup_time_placeholder: "Prêt pour (ex : jour + créneau horaire)"
receival_instructions_placeholder: "Modalités de livraison"
advanced_settings:
title: Paramétrages avancés
choose_product_tip: Vous pouvez choisir de limiter le choix des produits pouvant être mis en vente dans votre boutique à ceux figurant dans le catalogue boutique de %{inventory}.
@@ -432,15 +475,15 @@ fr:
coordinator_fees:
add: Ajouter commission coordinateur
form:
incoming: Produits entrants (constitution du catalogue boutique pour le cycle de vente)
incoming: Produits entrants (pouvant être mis en vente par les hubs)
supplier: Fournisseur
receival_details: Détails livraison produits
fees: Commission
outgoing: Produits sortants (vendus via un ou plusieurs hubs)
outgoing: Produits sortants (mis en vente par/via un ou plusieurs hubs)
distributor: Hub (distributeur)
products: Produits
tags: Tags
delivery_detaisl: Détails de livraison / retrait
delivery_details: Précisions retrait / livraison
debug_info: Informations de débogage
name_and_timing_form:
name: Nom
@@ -458,13 +501,7 @@ fr:
customer_instructions_placeholder: Commentaires pour le retrait / la livraison
products: Produits
fees: Commissions
edit:
advanced_settings: Paramétrages avancés
update_and_close: Mettre à jour et fermer
producer_properties:
form:
property: Propriétés / labels
value: Détail
index:
title: Propriétés / labels du producteur
shared:
@@ -475,12 +512,20 @@ fr:
title: Paramètres de facturation
invoice_style2?: Utiliser le modèle de facture alternatif qui détaille le montant de TVA agrégé par taux et l'information du taux de TVA par produit (pas adapté pour les instances affichant les prix HT)
enable_receipt_printing?: Afficher les options d'impression de tickets de caisse dans le menu déroulant des commandes?
checkout:
already_ordered:
cart: "panier"
message_html: "Vous avez déjà passé une commande pour ce cycle de vente. Vérifiez votre %{cart} pour voir les produits commandés. Vous pouvez annuler ou modifier votre commande jusqu'à la fermeture du cycle de vente."
home:
hubs:
show_closed_shops: "Aficher les boutiques fermées"
hide_closed_shops: "Masquer les boutiques fermées"
show_on_map: "Tout afficher sur la carte"
shared:
menu:
cart:
checkout: "Finaliser la commande"
already_ordered_products: "Déjà commandé dans ce cycle de vente"
register_call:
selling_on_ofn: "Vous souhaitez proposer vos produits sur Open Food France?"
register: "Démarrez ici"
@@ -550,6 +595,7 @@ fr:
terms_of_service: "Conditions d'utilisation"
on_demand: A volonté
none: Aucun
not_allowed: Non autorisé
label_shops: "Boutiques"
label_map: "Carte"
label_producers: "Producteurs"
@@ -570,21 +616,12 @@ fr:
items: "produits"
cart_headline: "Votre panier"
total: "Total"
checkout: "Régler la commande"
cart_updating: "Mettre à jour le panier"
cart_empty: "Panier vide"
cart_edit: "Modifier votre panier"
card_number: Numéro de carte
card_securitycode: "Cryptogramme visuel"
card_expiry_date: Date d'expiration
ofn_cart_headline: "Panier actuel pour:"
ofn_cart_distributor: "Distributeur:"
ofn_cart_oc: "Cycle de vente:"
ofn_cart_from: "De:"
ofn_cart_to: "Pour:"
ofn_cart_product: "Produit:"
ofn_cart_quantitiy: "Quantité:"
ofn_cart_send: "Acheter"
ie_warning_headline: "Votre navigateur n'est pas à jour :-("
ie_warning_text: "Pour une expérience optimale sur Open Food France, nous vous recommandons fortement de mettre à jour votre navigateur:"
ie_warning_chrome: Télécharger Chrome
@@ -606,7 +643,7 @@ fr:
footer_contact_email: "Nous écrire"
footer_nav_headline: "Naviguer"
footer_join_headline: "Nous rejoindre"
footer_join_body: "Créer une liste, un répertoire de boutiques ou groupes sur Open Food France."
footer_join_body: "Créer un profil, une boutique ou un groupe sur Open Food France."
footer_join_cta: "Je veux en savoir plus!"
footer_legal_call: "Lire nos"
footer_legal_tos: "Termes et conditions"
@@ -639,19 +676,19 @@ fr:
stats_shops: "boutiques"
stats_shoppers: "acheteurs"
stats_orders: "commandes"
checkout_title: Paiement
checkout_now: Régler la commande
checkout_title: Finalisation commande
checkout_now: Passer la commande
checkout_order_ready: Commande prête pour
checkout_hide: Masquer
checkout_expand: Afficher
checkout_headline: "Ok, prêt pour le paiement?"
checkout_as_guest: "Régler en mode invité"
checkout_headline: "Ok, prêt à finaliser la commande?"
checkout_as_guest: "Passer commande en mode invité"
checkout_details: "Vos informations"
checkout_billing: "Informations de facturation"
checkout_default_bill_address: "Sauvegarder comme adresse de facturation par défaut"
checkout_shipping: Informations de livraison
checkout_default_ship_address: "Sauvegarder comme adresse de livraison par défaut"
checkout_method_free: Gratuit
checkout_method_free: Pas de frais supplémentaires
checkout_address_same: Adresse de livraison identique à l'adresse de facturation?
checkout_ready_for: "Prêt pour:"
checkout_instructions: "Commentaires ou demandes spécifiques?"
@@ -669,14 +706,17 @@ fr:
order_billing_address: Adresse de facturation
order_delivery_on: Livraison prévue
order_delivery_address: Adresse de livraison
order_delivery_time: Créneau de livraison/retrait
order_special_instructions: "Vos commentaires:"
order_pickup_time: Prêt à être retirer
order_pickup_instructions: Instructions de retrait
order_produce: Produit
order_total_price: Total
order_includes_tax: (TVA inclue)
order_includes_tax: (dont TVA)
order_payment_paypal_successful: Votre paiement via PayPal a été réalisé avec succès.
order_hub_info: Hub Info
order_back_to_store: Retour à la boutique
order_back_to_cart: Retour au panier
bom_tip: "Utilisez cette page pour modifier les quantités sur plusieurs commandes à la fois. Les produits peuvent aussi être supprimés des commandes si nécessaire."
unsaved_changes_warning: "Des modifications n'ont pas été enregistrées et seront perdues si vous continuez."
unsaved_changes_error: "Les champs entourés en rouge contiennent des erreurs."
@@ -739,7 +779,7 @@ fr:
producer_mail_delivery_instructions: "Modalités de livraison des produits:"
producer_mail_signoff: "Merci et belle fin de journée!"
shopping_oc_closed: La boutique est actuellement fermée
shopping_oc_closed_description: "Veuillez attendre l'ouverture du prochain cycle de vente (ou contactez-nous directement pour voir si nous pouvez accépter une commande tardive)"
shopping_oc_closed_description: "Veuillez attendre l'ouverture du prochain cycle de vente (ou contactez-nous directement pour voir si nous pouvons accepter une commande tardive)"
shopping_oc_last_closed: "Le dernier cycle de vente s'est terminé il y a %{distance_of_time}"
shopping_oc_next_open: "Le prochain cycle de vente ouvrira dans %{distance_of_time}"
shopping_tabs_about: "A propos de %{distributor}"
@@ -768,6 +808,10 @@ fr:
hubs_intro: Passez commande près de chez vous
hubs_distance: Le plus près de
hubs_distance_filter: "Afficher les boutiques près de %{location}"
shop_changeable_orders_alert_html:
one: Votre commande avec <a href='%{path}' target='_blank'>%{shop} / %{order}</a> est ouverte pour vérification. Vous pouvez effectuer des modification jusqu'à %{oc_close}.
other: Vous avez <a href='%{path}' target='_blank'>%{count} commandes avec %{shop}</a>ouvertes à la vérification. Vous pouvez effectuer des modifications jusqu'à %{oc_close}.
orders_changeable_orders_alert_html: Cette commande a été confirmée, mais vous pouvez effectuer des modifications jusqu'à <strong>%{oc_close}</strong>.
products_clear_all: Vider
products_showing: "Afficher:"
products_with: avec
@@ -775,7 +819,7 @@ fr:
products_loading: "Produits en cours de chargement..."
products_updating_cart: "Actualisation du panier..."
products_cart_empty: "Panier vide"
products_edit_cart: "Modifier votre panier"
products_edit_cart: "Valider votre panier"
products_from: de
products_change: "Aucun changement à sauvegarder."
products_update_error: "Échec de l'enregistrement dû à:"
@@ -874,9 +918,9 @@ fr:
sell_hubs_detail: "Créer un profil pour votre entreprise de distribution ou organisation sur OFFrance. A tout moment vous pourrez créer une boutique multi-fournisseurs."
sell_groups_detail: "Créer un répertoire sur mesure (regroupant différents producteurs et hubs de distribution) pour votre région ou votre organisation."
sell_user_guide: "En savoir plus en explorant le guide utilisateur."
sell_listing_price: "L'inscription sur OFFrance est gratuite. Ouvrir est gérer une boutique sur OFFrance ou créer un groupe sur OFFrance pour votre organisation ou réseau régional, n'est pas gratuit, mais le prix est libre: soit 2% du chiffre d'affaire (ou autre forme de contribution libre designée par votre hub), soit une contribution \"en compétences\" à Open Food France (développement de fonctionnalités, recherche de financement, support utilisateur, etc.), soit un mix des deux."
sell_listing_price: "La création d'un profil sur OFFrance est entièrement libre. Si vous ouvrez et gérez une boutique sur OFFrance, ou créez un groupe pour votre organisation ou réseau régional, nous vous invitons à contribuer au commun Open Food France que vous utilisez. En effet, faire tourner la plateforme Open Food France a un coût, et nous comptons sur VOUS pour contribuer à couvrir ces frais de fonctionnement (location et maintenance des serveurs, support utilisateur, nouveaux développements...). Par exemple, en reversant sous forme de don à l'association 2% de votre chiffre d'affaire, et/ou un montant fixe tous les mois. Vous pouvez aussi contribuer au commun \"en compétences\" (développement de fonctionnalités, recherche de financement, support utilisateur, etc.)"
sell_embed: "Nous pouvons aussi intégrer votre boutique OFFrance dans votre propre site web ou construire un site web d'alimentation locale sur mesure pour votre région."
sell_ask_services: "Nous consulter sur les services OFFrance."
sell_ask_services: "Nous consulter sur les services des partenaires OFFrance."
shops_title: Boutiques
shops_headline: Des achats qui transforment.
shops_text: Les aliments poussent selon des cycles naturels, les fermiers récoltent en cycles. Alors ici, nous achetons aussi en cycles. Si un cycle de vente est terminé, attendez le suivant ou demandez des infos au hub !
@@ -894,10 +938,10 @@ fr:
orders_edit_headline: Votre panier
orders_edit_time: Commande prête pour
orders_edit_continue: Poursuivre mes achats
orders_edit_checkout: Régler ma commande
orders_edit_checkout: Passer ma commande
orders_form_empty_cart: "Vider le panier"
orders_form_subtotal: Sous-total
orders_form_admin: Admin et opérations
orders_form_admin: Admin & traitements
orders_form_total: Total
orders_oc_expired_headline: Les commandes ne sont plus possibles pour ce cycle de vente.
orders_oc_expired_text: "Désolé, les commandes pour ce cycle de vente ont été clôturées il y a %{time}! Veuillez contacter directement le hub pour voir s'il accepte les commandes tardives."
@@ -907,7 +951,18 @@ fr:
orders_oc_expired_phone: "Téléphone:"
orders_show_title: Confirmation de commande
orders_show_time: Commande prête pour
orders_show_number: Confirmation de commande
orders_show_order_number: "Commande #%{number}"
orders_show_cancelled: Annulée
orders_show_confirmed: Confirmée
orders_your_order_has_been_cancelled: "Votre commande a été annulée"
orders_could_not_cancel: "Désolé, la commande n'a pas pu être annulée"
orders_cannot_remove_the_final_item: "Impossible de supprimer le dernier produit d'une commande, si vous souhaitez supprimer l'ensemble des produits, veuillez annuler la commande."
orders_bought_items_notice:
one: Un produit ajouté a bien été confirmé pour ce cycle de vente
other: '%{count} produits ajoutés ont été confirmés pour ce cycle de vente.'
orders_bought_edit_button: Modifier les produits confirmés
orders_bought_already_confirmed: "* déjà confirmé"
orders_confirm_cancel: Voulez-vous vraiment annuler cette commande ?
products_cart_distributor_choice: "Distributeur pour votre commande:"
products_cart_distributor_change: "Vore distributeur pour cette commande sera dorénavant %{name} si vous ajoutez ce produit à votre panier."
products_cart_distributor_is: "Votre distributeur pour cette commande est %{name}."
@@ -926,7 +981,7 @@ fr:
remember_me: Se souvenir de moi
are_you_sure: "Confirmer?"
orders_open: Boutique ouverte
closing: "Fermeture"
closing: "Fermeture "
going_back_to_home_page: "Retour à la page d'accueil"
creating: Création
updating: Mettre à jour
@@ -938,7 +993,7 @@ fr:
hide_filters: "Masquer les filtres"
one_filter_applied: "1 filtre appliqué"
x_filters_applied: "filtres appliqués"
submitting_order: "Votre commande est en cours d'envoi: veuillez patienter"
submitting_order: "Votre commande est en cours d'envoi : veuillez patienter"
confirm_hub_change: "Confirmer? Cette action modifiera la boutique sélectionnée et tous les articles de votre panier seront effacés."
confirm_oc_change: "Confirmer? Cette action modifiera le cycle de vente sélectionné et tous les articles de votre panier seront effacés."
location_placeholder: "Saisissez une localisation..."
@@ -1008,13 +1063,14 @@ fr:
enterprise_long_desc: "Description longue"
enterprise_long_desc_placeholder: "Vous pouvez ici raconter l'histoire de votre organisation - votre projet, les valeurs que vous défendez. Nous vous conseillons de ne pas dépasser 600 caractères ou 150 mots."
enterprise_long_desc_length: "%{num} caractères / inférieur à 600 recommandé"
enterprise_limit: Nombre max d'entreprises
enterprise_abn: "SIRET"
enterprise_abn_placeholder: "ex: 404 833 048 00022"
enterprise_acn: "n° TVA intracommunautaire"
enterprise_acn_placeholder: "ex: 404 833 048"
enterprise_tax_required: "Merci de choisir."
enterprise_final_step: "Dernière étape!"
enterprise_social_text: "Comment trouver la boutique en ligne %{enterprise}"
enterprise_social_text: "Comment trouver la boutique en ligne %{enterprise} ?"
website: "Site internet"
website_placeholder: "ex: openfoodfrance.fr"
facebook: "Facebook"
@@ -1106,7 +1162,7 @@ fr:
you_have_no_orders_yet: "Vous n'avez pas encore de commande"
running_balance: "Solde courant"
outstanding_balance: "Solde restant"
admin_entreprise_relationships: "Liens inter-entreprises"
admin_entreprise_relationships: "Permissions inter-entreprises"
admin_entreprise_relationships_everything: "Tout"
admin_entreprise_relationships_permits: "autorise"
admin_entreprise_relationships_seach_placeholder: "Chercher"
@@ -1116,7 +1172,7 @@ fr:
admin_entreprise_groups_owner: "Manager principal"
admin_entreprise_groups_on_front_page: "Sur la page d'accueil?"
admin_entreprise_groups_entreprise: "Entreprises"
admin_entreprise_groups_data_powertip: "L'utilisateur principal en charge de ce groupe."
admin_entreprise_groups_data_powertip: "Le manager principal en charge de ce groupe."
admin_entreprise_groups_data_powertip_logo: "Il s'agit du logo du groupe"
admin_entreprise_groups_data_powertip_promo_image: "Cette image est affichée en haut du profil Groupe."
admin_entreprise_groups_contact: "Contact"
@@ -1129,7 +1185,7 @@ fr:
admin_entreprise_groups_contact_state_id: "Département"
admin_entreprise_groups_contact_country_id: "Pays"
admin_entreprise_groups_web: "Liens web"
admin_entreprise_groups_web_twitter: "ex: @OpenFoodNet"
admin_entreprise_groups_web_twitter: "ex: @OpenFoodNet_fr"
admin_entreprise_groups_web_website_placeholder: "ex: www.monepicerieenligne.fr"
admin_order_cycles: "Gérer les cycles de vente"
open: "Ouvre"
@@ -1143,6 +1199,7 @@ fr:
calculator_values: "Valeurs applicables"
flat_percent_per_item: "Montant net (par produit)"
new_order_cycles: "Nouveau cycle de vente"
new_order_cycle: "Nouveau Cycle de Vente"
select_a_coordinator_for_your_order_cycle: "Choisissez un coordinateur pour votre cycle de vente"
edit_order_cycle: "Modifier le cycle de vente"
roles: "Roles"
@@ -1163,12 +1220,13 @@ fr:
price: "Prix"
on_hand: "En stock"
save_changes: "Sauvegarder les modifications"
order_saved: "Commande Sauvegardée"
spree_admin_overview_enterprises_header: "Mes entreprises"
spree_admin_overview_enterprises_footer: "GÉRER MES ENTREPRISES"
spree_admin_enterprises_hubs_name: "Nom"
spree_admin_enterprises_create_new: "CRÉER NOUVELLE"
spree_admin_enterprises_shipping_methods: "Options de livraison"
spree_admin_enterprises_fees: "Marges de l'entreprise"
spree_admin_enterprises_shipping_methods: "Méthodes de livraison"
spree_admin_enterprises_fees: "Marges et commissions"
spree_admin_enterprises_none_create_a_new_enterprise: "CRÉER UNE NOUVELLE ENTREPRISE"
spree_admin_enterprises_none_text: "Vous n'avez pas encore d'entreprise"
spree_admin_enterprises_producers_name: "Nom"
@@ -1177,7 +1235,7 @@ fr:
spree_admin_enterprises_producers_order_cycles: "Produits dans le cycle de vente"
spree_admin_enterprises_tabs_hubs: "HUBS"
spree_admin_enterprises_tabs_producers: "PRODUCTEURS"
spree_admin_enterprises_producers_manage_order_cycles: "GÉRER MES CYCLES DE VENTES"
spree_admin_enterprises_producers_manage_order_cycles: "GÉRER LES CYCLES DE VENTES"
spree_admin_enterprises_producers_manage_products: "GÉRER LES PRODUITS"
spree_admin_enterprises_producers_orders_cycle_text: "Vous n'avez pas de cycle de vente actif."
spree_admin_enterprises_any_active_products_text: "Vous n'avez aucun produit actif."
@@ -1189,12 +1247,12 @@ fr:
spree_admin_single_enterprise_alert_mail_sent: "Email envoyé à "
spree_admin_overview_action_required: "Action requise"
spree_admin_overview_check_your_inbox: "Veuillez vérifier votre boîte mail pour les prochaines étapes. Merci!"
change_package: "Changer de pack"
change_package: "Changer de type de compte"
spree_admin_single_enterprise_hint: "Astuce: Pour permettre aux gens de vous trouver, activez votre visibilité "
your_profil_live: "Votre profil en ligne"
on_ofn_map: "sur la carte Open Food France"
see: "Voir"
live: "En ligne"
live: "en ligne"
manage: "Gérer"
resend: "Renvoyer"
add_and_manage_products: "Ajouter & gérer des produits"
@@ -1204,6 +1262,8 @@ fr:
edit_profile_details: "Modifier les informations du profil"
edit_profile_details_etc: "Modifier la description, les images, etc."
order_cycle: "Cycle de vente"
order_cycles: "Cycles de Vente"
enterprises: "Entreprises"
remove_tax: "Retirer TVA"
enterprise_terms_of_service: "Conditions Générales d'Utilisation"
enterprises_require_tos: "Les entreprises doivent accepter les Conditions Générales d'Utilisation"
@@ -1214,7 +1274,7 @@ fr:
tax_settings: "Paramètres TVA"
products_require_tax_category: "vous devez choisir la TVA applicable"
admin_shared_address_1: "Adresse"
admin_shared_address_2: "Adresse (cont.)"
admin_shared_address_2: "Adresse (suite)"
admin_share_city: "Ville"
admin_share_zipcode: "Code postal"
admin_share_country: "Pays"
@@ -1265,7 +1325,7 @@ fr:
due_date: "Date d'échéance:"
account_code: "Code compte:"
equals: "Egal"
contains: "contients"
contains: "contient"
discount: "Réduction"
filter_products: "Filtrer les produits"
delete_product_variant: "La variante ne peut pas être supprimée!"
@@ -1287,14 +1347,14 @@ fr:
adrdress: "Adresse"
contact: "Contact"
social: "Réseaux sociaux"
business_details: "N° fiscaux"
properties: "Propriétés"
business_details: "Juridique"
properties: "Propriétés / labels"
shipping_methods: "Méthodes de livraison"
payment_methods: "Méthodes de paiement"
payment_method_fee: "Frais de transaction"
enterprise_fees: "Marges de l'entreprise"
inventory_settings: "Paramètres de stock"
tag_rules: "Règles des tags"
enterprise_fees: "Marges et commissions"
inventory_settings: "Catalogue boutique"
tag_rules: "Règles de tag"
shop_preferences: "Préférences boutique"
validation_msg_relationship_already_established: "^Un lien est déjà établi entre ces entreprises."
validation_msg_at_least_one_hub: "^Sélectionnez au moins un hub"
@@ -1309,7 +1369,7 @@ fr:
title: Règles de tag
overview: Aperçu
overview_text: >
Les règles de tags vous permettent de paramétrer ce qui est vu ou pas
Les règles de tag vous permettent de paramétrer ce qui est vu ou pas
par tel ou tel type d'acheteur. Par exemple des options de livraison,
des méthodes de paiement, des produits, ou des cycles de vente.
by_default_rules: "Règles à appliquer \"par défaut\""
@@ -1358,10 +1418,9 @@ fr:
fois votre choix fait, cliquez sur le bouton rouge ENREGISTRER !
profile_only: Profil uniquement
profile_only_cost: "COÛT: CONTRIBUTION LIBRE"
profile_only_text1: >+
profile_only_text1: >
Gagnez en visibilité, racontez votre histoire, et affichez vos coordonnées
pour pouvoir être contactés.
profile_only_text2: >
Si vous souhaitez vous concentrer sur votre activité de production,
et laisser à d'autre le soin de distribuer vos produits, vous n'avez
@@ -1407,7 +1466,7 @@ fr:
Un producteur peut aussi avoir d'autres rôles, comme par exemple stocker
et distribuer des produits d'autres producteurs à travers une boutique
sur Open Food France.
non_producer: Pas producteur
non_producer: Non-producteur
non_producer_text1: >
Les entreprises qui ne produisent pas ne peuvent pas créer leur propre
catalogue produits pour les vendre sur Open Food France.
@@ -1434,6 +1493,9 @@ fr:
à votre demande. Voilà les modifications opérées:
now_out_of_stock: est maintenant en rupture de stock.
only_n_remainging: "plus que %{num} en stock."
producers:
signup:
start_free_profile: "Commencez par créer votre profil entreprise, et changez de formule quand vous êtes prêt !"
spree:
admin:
products:
@@ -1442,7 +1504,7 @@ fr:
title: Edition des produits par lots
indicators:
title: CHARGEMENT DES PRODUITS
no_products: "Aucun produit trouvé. Pourquoi n'en ajouté vous pas quelques-uns ?"
no_products: "Aucun produit trouvé. Ajouter un produit ?"
no_results: "Désolé, aucun résultat trouvé"
variants:
autocomplete:
@@ -1450,24 +1512,7 @@ fr:
date_picker:
format: '%Y-%m-%d'
js_format: 'aa-mm-jj'
zipcode: Code postal
shipment_states:
backorder: réapprovisionnement
partial: partiel
pending: en attente
ready: prêt
shipped: envoyé
payment_states:
balance_due: solde dû
completed: effectué
checkout: Paiement
credit_owed: Crédit acheteur
failed: échec
paid: payé
pending: en attente
processing: en traitement
void: annuler
invalid: Invalide
inventory: Catalogue boutique
order_mailer:
invoice_email:
hi: "Bonjour %{name}"
@@ -1488,3 +1533,47 @@ fr:
orders:
invoice:
tax_invoice: "FACTURE"
payment_states:
balance_due: solde dû
completed: effectué
checkout: passer commande
credit_owed: crédit acheteur
failed: échec
paid: payé
pending: en attente
processing: en traitement
void: faire un avoir
invalid: invalide
shipment_states:
backorder: réapprovisionnement
partial: partiel
pending: en attente
ready: prêt
shipped: envoyé
user_mailer:
reset_password_instructions:
request_sent_text: |
Votre demande de nouveau mot de passe a bien été prise en compte.
Si vous n'avez pas demandé de nouveau mot de passe, veuillez ignorer cet e-mail.
link_text: >
Si vous êtes bien à l'origine de cette demande, veuillez cliquer sur le
lien ci-dessous :
issue_text: |
Si le lien ne fonctionne pas, essayez de le copier - coller dans la barre d'adresse de votre navigateur.
Si le problème persiste, n'hésitez pas à nous contacter.
weight: Poids (au kg)
zipcode: Code postal
users:
show:
open_orders: Commandes Ouvertes
transaction_history: Historique des Transactions
open_orders:
order: Commander
shop: Faire mes courses
changes_allowed_until: Modifications permises jusqu'à
items: Pièce
total: Total
edit: Modifier
cancel: Annuler
closed: Fermée
until: Jusqu'à

View File

@@ -2,7 +2,7 @@ nb:
activerecord:
attributes:
spree/order:
payment_state: Betallingsstatus
payment_state: Betalingsstatus
shipment_state: Sendingsstatus
devise:
failure:
@@ -24,7 +24,6 @@ nb:
welcome_to: 'Velkommen til '
site_meta_description: "Vi begynner fra grunnen. Med bønder og dyrkere klare til å fortelle sine historier, stolt og virkelig. Med distributører klare til å koble mennesker med produkter på en rettferdig og ærlig måte. Med kunder som tror på at ukentlige innkjøpsrutiner kan..."
search_by_name: Søk på navn eller sted...
producers: 'Norske Produsenter'
producers_join: Norske produsenter er nå velkommen til å bli med i Open Food Network.
charges_sales_tax: MVA-pliktig?
print_invoice: "Skriv ut Faktura"
@@ -62,6 +61,18 @@ nb:
show_all: Vis alle
show_all_with_more: "Vis Alle (%{num} Mer)"
cancel: Avbryt
edit: Endre
distributors: Distributører
bulk_order_management: Bulk ordrehåndtering
enterprise_groups: Grupper
reports: Rapporter
variant_overrides: Varelager
more: Mer
spree_products: Spree Produkter
all: Alle
current: Nåværende
available: Tilgjengelig
dashboard: Dashboard
admin:
date: Dato
email: Epost
@@ -79,13 +90,20 @@ nb:
sku: SKU
tags: Merker
variant: Variant
weight: Vekt
volume: Volum
items: Varer
quick_search: Hurtigsøk
clear_all: Fjern Alt
start_date: "Startdato"
end_date: "Sluttdato"
form_invalid: "Skjemaet inneholder manglende eller ugyldige felt"
clear_filters: Fjern filtre
clear: Fjern
columns: Kolonner
actions: Handlinger
viewing: "Viser: %{current_view_name}"
description: Beskrivelse
whats_this: Hva er dette?
tag_has_rules: "Gjeldende regler for denne merkelappen: %{num}"
has_one_rule: "har én regel"
@@ -158,6 +176,7 @@ nb:
edit: 'Redigere'
update_address: 'Oppdater Adresse'
confirm_delete: 'Sikker på å slette?'
search_by_email: "Søk på epost/kode..."
cache_settings:
show:
title: Mellomlagring
@@ -181,6 +200,7 @@ nb:
index:
new_button: Ny Bedriftsgruppe
products:
unit_name_placeholder: 'f.eks. bunter'
bulk_edit:
unit: Enhet
display_as: Vis som
@@ -189,6 +209,9 @@ nb:
inherits_properties?: Arver Egenskaper?
available_on: Tilgjengelig på
av_on: "Til. på"
properties:
property_name: Navn på egenskap
inherited_property: Arvet egenskap
variants:
to_order_tip: "Varer laget for bestilling har ikke et lagernivå, slik som ferske skiver brød laget for bestilling."
variant_overrides:
@@ -255,6 +278,8 @@ nb:
abn_placeholder: f.eks. 999 000 123
acn: Mva. nr.
acn_placeholder: f.eks. 999 000 123
display_invoice_logo: Vis logo i fakturaer
invoice_text: Legg til tilpasset tekst på slutten av fakturaer
contact:
name: Navn
name_placeholder: f.eks. Gustav Plum
@@ -327,18 +352,26 @@ nb:
shopfront_requires_login_tip: "Velg om kunder må logge inn for å se butikken eller om den er synlig for alle."
shopfront_requires_login_false: "Offentlig"
shopfront_requires_login_true: "Synlig kun for registrerte kunder."
recommend_require_login: "Vi anbefaler at brukerne logger på når bestillinger kan endres."
allow_guest_orders: "Gjestebestillinger"
allow_guest_orders_tip: "Tillat gjestebestillinger eller krev brukerregistrering."
allow_guest_orders_false: "Krev innlogging for å bestille"
allow_guest_orders_true: "Tillat gjestebestilling"
allow_order_changes: "Endre bestillinger"
allow_order_changes_tip: "Tillat at kundene kan endre bestillingen så lenge bestillingsrunden er åpen."
allow_order_changes_false: "Fullførte bestillinger kan ikke endres / kanselleres"
allow_order_changes_true: "Kunder kan endre / avbestille bestillinger mens bestillingsrunden er åpen"
shopfront_message: Melding Butikk
shopfront_message_placeholder: >
En valgfri forklaring for kunder med detaljer om hvordan din nettbutikk
fungerer, for å vises over produktlisten på din side.
shopfront_closed_message: Melding Butikk Stengt
shopfront_closed_message_placeholder: >
En melding som gir en mer detaljert forklaring om hvorfor din butikk
er stengt og/eller når kunder kan forvente at den åpner igjen. Dette
vises på din butikk kun når du ikke har noen aktive bestillingsrunder
(dvs. butikk er stengt).
shopfront_category_ordering: Kategorisortering Butikk
open_date: Åpningsdato
close_date: Stengedato
social:
@@ -422,6 +455,16 @@ nb:
next_step: Neste steg
choose_starting_point: 'Velg ditt startpunkt:'
order_cycles:
edit:
advanced_settings: Avanserte Innstillinger
update_and_close: Oppdater og Lukk
choose_products_from: 'Velg Produkter Fra:'
pickup_time_tip: Når bestillinger fra denne runden blir klar for kunden
pickup_instructions_tip: Disse instruksjonene vises til kunder etter de ferdigstiller en bestilling
exchange_form:
pickup_instructions_placeholder: "Henteinstruksjoner"
pickup_time_placeholder: "Klar til (dvs. Dato/Tid)"
receival_instructions_placeholder: "Mottaksinstruksjoner"
advanced_settings:
title: Avanserte Innstillinger
choose_product_tip: Du kan velge å begrense alle tilgjengelige produkter (både innkommende og utgående), til kun de i %{inventory}s varelager.
@@ -439,7 +482,7 @@ nb:
distributor: Distributør
products: Produkter
tags: Merker
delivery_detaisl: Hentings- / Leveringsdetaljer
delivery_details: Hente-/Leveringsdetaljer
debug_info: Debuginformasjon
name_and_timing_form:
name: Navn
@@ -457,13 +500,7 @@ nb:
customer_instructions_placeholder: Hente- eller leveringsmerknader
products: Produkter
fees: Avgifter
edit:
advanced_settings: Avanserte Innstillinger
update_and_close: Oppdater og Lukk
producer_properties:
form:
property: Egenskap
value: Verdi
index:
title: Produsentegenskaper
shared:
@@ -474,12 +511,20 @@ nb:
title: Fakturainnstillinger
invoice_style2?: Bruk den alternative fakturamodellen som inkluderer total avgiftsoppdeling pr rate og avgiftsrateinfo pr vare (passer ikke for land som viser priser ekskludert avgift)
enable_receipt_printing?: 'Vis valg for utskrift av kvitteringer ved bruk av kvitteringsprinter i nedtrekksmeny for bestillinger? '
checkout:
already_ordered:
cart: "handlekurv"
message_html: "Du har allerede en bestilling for denne bestillingsrunden. Sjekk %{cart}en for å se varene du bestilte før. Du kan også avbryte varer så lenge bestillingsrunden er åpen."
home:
hubs:
show_closed_shops: "Vis stengte butikker"
hide_closed_shops: "Skjul stengte butikker"
show_on_map: "Vis alle på kartet"
shared:
menu:
cart:
checkout: "Sjekk ut nå"
already_ordered_products: "Allerede bestilt i denne bestillingsrunden"
register_call:
selling_on_ofn: "Interessert i å bli med i Open Food Network?"
register: "Registrer her"
@@ -549,6 +594,7 @@ nb:
terms_of_service: "Vilkår"
on_demand: Ved forespørsel
none: Ingen
not_allowed: Ikke tillatt
label_shops: "Butikker"
label_map: "Kart"
label_producers: "Produsenter"
@@ -569,21 +615,12 @@ nb:
items: "varer"
cart_headline: "Din handlekurv"
total: "Sum"
checkout: "Gå til kassen"
cart_updating: "Oppdaterer handlekurv..."
cart_empty: "Handlekurven er tom"
cart_edit: "Rediger handlekurv"
card_number: Kortnummer
card_securitycode: "Sikkerhetskode"
card_expiry_date: Utløpsdato
ofn_cart_headline: "Gjeldende handlekurv for:"
ofn_cart_distributor: "Distributør:"
ofn_cart_oc: "Bestillingsrunde:"
ofn_cart_from: "Fra:"
ofn_cart_to: "Til:"
ofn_cart_product: "Produkt:"
ofn_cart_quantitiy: "Antall:"
ofn_cart_send: "Kjøp"
ie_warning_headline: "Din nettleser er for gammel :-("
ie_warning_text: "For den beste opplevelsen med Open Food Network anbefaler vi på det sterkeste å oppgradere nettleseren din:"
ie_warning_chrome: Last ned Chrome
@@ -668,6 +705,7 @@ nb:
order_billing_address: Fakturaadresse
order_delivery_on: Levering på
order_delivery_address: Leveringsadresse
order_delivery_time: Leveringstid
order_special_instructions: "Dine kommentarer:"
order_pickup_time: Klar for henting
order_pickup_instructions: Henteinstruksjoner
@@ -676,6 +714,8 @@ nb:
order_includes_tax: (inkludert MVA)
order_payment_paypal_successful: Din betaling via PayPal har blitt godkjent.
order_hub_info: Hub info
order_back_to_store: Tilbake til butikken
order_back_to_cart: Tilbake til handlekurven
bom_tip: "Bruk denne siden for å endre produktmengder på tvers av flere bestillinger. Produkter kan også fjernes fra bestillinger helt hvis påkrevd."
unsaved_changes_warning: "Ulagrede endringer finnes og vil gå tapt hvis du fortsetter."
unsaved_changes_error: "Felt med røde kanter inneholder feil."
@@ -767,6 +807,10 @@ nb:
hubs_intro: Handle lokalt
hubs_distance: Nærmest
hubs_distance_filter: "Vis meg butikker nær %{location}"
shop_changeable_orders_alert_html:
one: Din bestilling med <a href='%{path}' target='_blank'> %{shop} / %{order} </a> er åpen for vurdering. Du kan gjøre endringer til %{oc_close}.
other: Du har <a href='%{path}' target='_blank'> %{count} bestillinger med %{shop} </a> for øyeblikket åpen for gjennomgang. Du kan gjøre endringer til %{oc_close}.
orders_changeable_orders_alert_html: Denne bestillingen er bekreftet, men du kan gjøre endringer til <strong>%{oc_close}</strong>.
products_clear_all: Fjern alt
products_showing: "Viser:"
products_with: med
@@ -896,7 +940,7 @@ nb:
orders_edit_checkout: Kassen
orders_form_empty_cart: "Tøm handlekurv"
orders_form_subtotal: Delsum varer
orders_form_admin: Administrasjon og håndtering
orders_form_admin: Admin & Håndtering
orders_form_total: Total
orders_oc_expired_headline: Bestillinger stengt for denne runden
orders_oc_expired_text: "Beklager, bestillinger for denne runden stengte for %{time} siden! Kontakt din hub direkte for å høre om de tar i mot sene bestillinger."
@@ -906,7 +950,18 @@ nb:
orders_oc_expired_phone: "Telefon:"
orders_show_title: Ordrebekreftelse
orders_show_time: Bestilling klar for
orders_show_number: Ordrebekreftelse
orders_show_order_number: "Bestilling # %{number}"
orders_show_cancelled: Avbrutt
orders_show_confirmed: Bekreftet
orders_your_order_has_been_cancelled: "Din bestilling er avbrutt"
orders_could_not_cancel: "Beklager, bestillingen kunne ikke avbrytes"
orders_cannot_remove_the_final_item: "Kan ikke fjerne den siste varen fra en bestilling, vennligst avbryt bestillingen i stedet."
orders_bought_items_notice:
one: Et ekstra element er allerede bekreftet for denne bestillingsperioden
other: Ytterligere%{count} varer er allerede bekreftet for denne bestillingsrunden
orders_bought_edit_button: Rediger bekreftede varer
orders_bought_already_confirmed: "* allerede bekreftet"
orders_confirm_cancel: Er du sikker på at du vil avbryte denne bestillingen?
products_cart_distributor_choice: "Distributør for bestillingen:"
products_cart_distributor_change: "Din distributør for denne ordren vil bli endret til %{name} hvis du legger til dette produktet i handlekurven din."
products_cart_distributor_is: "Din distributør for denne ordren er %{name}."
@@ -1007,6 +1062,7 @@ nb:
enterprise_long_desc: "Lang beskrivelse"
enterprise_long_desc_placeholder: "Dette er muligheten din til å fortelle historien om din virksomhet - hva gjør deg annerledes og flott? Vi vil foreslå å holde din beskrivelse til under 600 tegn eller 150 ord."
enterprise_long_desc_length: "%{num} tegn / opptil 600 anbefales"
enterprise_limit: Bedriftsgrense
enterprise_abn: "ORG#"
enterprise_abn_placeholder: "f.eks. 999 000 123"
enterprise_acn: "MVA#"
@@ -1095,7 +1151,7 @@ nb:
balance: "Balanse"
transaction: "Transaksjon"
transaction_date: "Dato"
payment_state: "Betallingsstatus"
payment_state: "Betalingsstatus"
shipping_state: "Leveringsstatus"
value: "Verdi"
balance_due: "Balanse forfaller"
@@ -1142,6 +1198,7 @@ nb:
calculator_values: "Kalkulatorverdier"
flat_percent_per_item: "Prosent (per stk)"
new_order_cycles: "Nye Bestillingsrunder"
new_order_cycle: "Ny bestillingsrunde"
select_a_coordinator_for_your_order_cycle: "Velg en koordinator for denne syklus"
edit_order_cycle: "Endre Bestillingsrunde"
roles: "Roller"
@@ -1162,6 +1219,7 @@ nb:
price: "Pris"
on_hand: "På lager"
save_changes: "Lagre Endringer"
order_saved: "Bestilling lagret"
spree_admin_overview_enterprises_header: "Mine Bedrifter"
spree_admin_overview_enterprises_footer: "ADMINISTRER MINE BEDRIFTER"
spree_admin_enterprises_hubs_name: "Navn"
@@ -1203,6 +1261,8 @@ nb:
edit_profile_details: "Endre profildetaljer"
edit_profile_details_etc: "Endre din profilbeskrivelse, bilder, osv."
order_cycle: "Bestillingsrunde"
order_cycles: "Bestillingsrunder"
enterprises: "Bedrifter"
remove_tax: "Fjern avgift"
enterprise_terms_of_service: "Tjenestevilkår for Bedrifter"
enterprises_require_tos: "Bedrifter må godta Tjenestevilkår"
@@ -1423,6 +1483,9 @@ nb:
i din handlekurv gått ned. Her er hva som er endret.
now_out_of_stock: er nå ikke på lager.
only_n_remainging: "har nå kun %{num} igjen."
producers:
signup:
start_free_profile: "Start med en gratis profil, og utvid når du er klar!"
spree:
admin:
products:
@@ -1439,24 +1502,7 @@ nb:
date_picker:
format: '%Y-%m-%d'
js_format: 'åå-mm-dd'
zipcode: Postnummer
shipment_states:
backorder: restordre
partial: delvis
pending: ventende
ready: klar
shipped: sendt
payment_states:
balance_due: balanse forfaller
completed: fullført
checkout: kasse
credit_owed: kreditt skyldt
failed: feilet
paid: betalt
pending: ventende
processing: behandler
void: ugyldig
invalid: ugyldig
inventory: Varelager
order_mailer:
invoice_email:
hi: "Hei %{name}"
@@ -1477,3 +1523,46 @@ nb:
orders:
invoice:
tax_invoice: "AVGIFTSFAKTURA:"
payment_states:
balance_due: balanse forfaller
completed: fullført
checkout: kasse
credit_owed: kreditt skyldt
failed: feilet
paid: betalt
pending: ventende
processing: behandler
void: ugyldig
invalid: ugyldig
shipment_states:
backorder: restordre
partial: delvis
pending: ventende
ready: klar
shipped: sendt
user_mailer:
reset_password_instructions:
request_sent_text: |
En forespørsel om å nullstille ditt passord er utført.
Hvis det ikke var du som forespurte dette kan du se bort i fra denne eposten.
link_text: >
Hvis det var du som forespurte dette kan du klikke nedenfor:
issue_text: |
Hvis URL'en ovenfor ikke fungerer prøv å kopier og lim den inn i din nettleser.
Hvis du fortsatt har problemer vennligst ta kontakt.
weight: Vekt (per kg)
zipcode: Postnummer
users:
show:
open_orders: Åpne bestillinger
transaction_history: Betalingshistorie
open_orders:
order: Bestilling
shop: Butikk
changes_allowed_until: Endringer tillatt frem til
items: Varer
total: Total
edit: Endre
cancel: Avbryt
closed: Stengt
until: Inntil

View File

@@ -11,7 +11,7 @@ sv:
Var du gäst senast? Du behöver kanske skapa ett konto eller återställa ditt lösenord.
enterprise_confirmations:
enterprise:
confirmed: Tack, din e-postadress har bekräftats.
confirmed: Tack, din e-postadress har blivit bekräftad.
not_confirmed: Din e-postadress kunde inte bekräftas. Du kanske redan har genomfört det här steget?
confirmation_sent: "Bekräftelsemail skickat!"
confirmation_not_sent: "Kunde ej skicka bekräftelsemail."
@@ -28,6 +28,8 @@ sv:
producers_join: Svenska producenter kan nu gå med i Open Food Network. Välkomna!
charges_sales_tax: Debiterar Moms?
print_invoice: "Skriv ut faktura"
print_ticket: "Skriv ut kvitto"
select_ticket_printer: "Välj skrivare för bijetterna"
send_invoice: "Skicka faktura"
resend_confirmation: "Skicka bekräftelse igen"
view_order: "Se beställning"
@@ -49,6 +51,17 @@ sv:
say_yes: "Ja"
then:
sort_order_cycles_on_shopfront_by: "Sortera Cykler Av Ordrar På Skyltfönster Efter"
required_fields: Fält som måste fyllas i är märkta med en asterisk
select_continue: Välj och fortsätt
remove: Ta bort
or: eller
collapse_all: Minimera alla
expand_all: Expandera alla
loading: Laddning...
show_more: Visa mer
show_all: Visa alla
show_all_with_more: "Visa alla (%{num} More)"
cancel: Makulera
admin:
date: Datum
email: epost
@@ -73,55 +86,58 @@ sv:
columns: Kolumner
actions: Handlingar
viewing: "Tittar på: %{current_view_name}"
description: Beskrivning
whats_this: Vad är detta?
tag_has_rules: "Regler för denna tagg: %{num}"
has_one_rule: "har en regel"
has_n_rules: "har %{num} regler"
unsaved_confirm_leave: "Det finns ändringar på denna sida som ej sparats. Fortsätta utan att spara?"
unsaved_changes: "Du har ändringar som ej sparats"
accounts_and_billing_settings:
method_settings:
default_accounts_payment_method: "Default Accounts Payment Method"
default_accounts_shipping_method: "Default Accounts Shipping Method"
default_accounts_payment_method: "Standardkonto för bealningsmetod"
default_accounts_shipping_method: "Standardkonto för leveransmetod"
edit:
accounts_and_billing: "Konton och fakturering"
accounts_administration_distributor: "distributör av bokföringsadministration"
accounts_administration_distributor: "Kontoadministrations-distributör"
admin_settings: "Inställningar"
update_invoice: "Uppdatera fakturor"
finalise_invoice: "Slutför fakturor"
finalise_user_invoices: "Slutför användarafakturor"
finalise_user_invoice_explained: "Använd den här knappen för att slutföra alla fakturor i systemet för den gångna månaden. Denna uppgift ställas in så att den utförs automatiskt en gång per månad."
manually_run_task: "Manuellt utförda uppgifter"
auto_update_invoices: "Automatisk uppdatering av fakturor varje natt kl 01:00"
finalise_invoice: "Slutför fakturering"
auto_finalise_invoices: "Slutför automatiskt fakturor månadsvis den 2:a dagen kl 01;30"
manually_run_task: "Manuellt utförd bearbetning"
update_user_invoice_explained: "Använd denna knapp för att omedelbart uppdatera denna månads fakturor för varje företag i systemet. Denna bearbetning kan köras automatiskt varje natt."
finalise_user_invoices: "Slutför användarfakturor"
finalise_user_invoice_explained: "Använd denna knapp för att slutföra alla fakturor i systemet avseende föregående kalendermånad. Det går att ställa in denna bearbetning så att den utförs automatiskt en gång per månad."
update_user_invoices: "Uppdatera användarfakturor"
update_user_invoice_explained: "Använd denna knapp för att omedelbart uppdatera alla fakturor innevarande månad för alla företag i systemet. Den här uppgiften kan ställas in så att den automatiskt utförs varje natt."
auto_finalise_invoices: "Automatisk summering av fakturor den 2:a kl 01.30 "
auto_update_invoices: "Automatisk uppdatering av fakturor varje natt kl 01.00"
business_model_configuration:
edit:
business_model_configuration: "Konfigurera affärsmodell"
business_model_configuration_tip: "Configure the rate at which shops will be charged each month for use of the Open Food Network."
bill_calculation_settings: "Bill Calculation Settings"
bill_calculation_settings_tip: "Adjust the amount that enterprises will be billed each month for use of the OFN."
shop_trial_length: "Försökstiden är (dagar)"
shop_trial_length_tip: "The length of time (in days) that enterprises who are set up as shops can run as a trial period."
fixed_monthly_charge: "Fixed Monthly Charge"
fixed_monthly_charge_tip: "A fixed monthly charge for all enterprises who are set up as a shop and have exceeded the minimum billable turnover (if set)."
business_model_configuration: "Företagsmodell"
business_model_configuration_tip: "Beräkna det belopp som varje affär skall betala varje månad för användningen av OFN. "
bill_calculation_settings: "Inställningar för beräkning av fakturor"
bill_calculation_settings_tip: "Justera det belopp företag skall faktureras varje månad för användning av OFN."
shop_trial_length: "Försöksperiod (Dagar)"
shop_trial_length_tip: "Antal dagar som företag som definierats som affärer kan ha som försöksperiod."
fixed_monthly_charge: "Bestämd månadsavgift"
fixed_monthly_charge_tip: "En bestämd månadsavgift för alla företag som är definierade som affärer och som överskridit minsta fakturerade omsättningen (om sådan bestämts)."
percentage_of_turnover: "Procent av omsättning"
percentage_of_turnover_tip: "When greater than zero, this rate (0.0 - 1.0) will be applied to the total turnover of each shop and added to any fixed charges (to the left) to calculate the monthly bill."
monthly_cap_excl_tax: "månatligt tak (exkl. moms)"
monthly_cap_excl_tax_tip: "When greater than zero, this value will be used as a cap on the amount that shops will be charged each month."
tax_rate: "Tax Rate"
tax_rate_tip: "Tax rate that applies to the the monthly bill that enterprises are charged for using the system."
minimum_monthly_billable_turnover: "Minimum Monthly Billable Turnover"
minimum_monthly_billable_turnover_tip: "Minimum monthly turnover before a shopfront will be charged for using OFN. Enterprises turning over less than this amount in a month will not be charged, either as a percentage or fixed rate."
example_bill_calculator: "Example Bill Calculator"
example_bill_calculator_legend: "Alter the example turnover to visualise the effect of the settings to the left."
example_monthly_turnover: "Example Monthly Turnover"
example_monthly_turnover_tip: "An example monthly turnover for an enterprise which will be used to generate calculate an example monthly bill below."
cap_reached?: "Cap Reached ?"
cap_reached?_tip: "Whether the cap (specified to the left) has been reached, given the settings and the turnover provided."
included_tax: "Included tax"
included_tax_tip: "The total tax included in the example monthly bill, given the settings and the turnover provided."
total_monthly_bill_incl_tax: "Total Månadskostnad (Inkl. Skatter)"
total_monthly_bill_incl_tax_tip: "The example total monthly bill with tax included, given the settings and the turnover provided."
percentage_of_turnover_tip: "När den är större än noll, denna taxa (0,0 - 1,0) kommer att läggas till den totala omsättningen för varje affär och adderas till varje bestämd avgift (till vänster) vid beräkning av månadsavgiften."
monthly_cap_excl_tax: "månadstak (exkl. GST)"
monthly_cap_excl_tax_tip: "När det är större än noll, kommer detta värde att användas som tak för det belopp som affärer skall faktureras varje månad."
tax_rate: "Skattesats"
tax_rate_tip: "Skattesats som används på månadsfakturan som företag skall betala för att använda systemet."
minimum_monthly_billable_turnover: "Minsta månatliga fakturerbara omsättning"
minimum_monthly_billable_turnover_tip: "Minsta månadsomsättning i en en butiks skyltfönster får betala för att använda OFN. Företag vars omsättning understiger detta belopp under en månad behöver ej betala vare sig procentuellt eller med en fast taxa."
example_bill_calculator: "Exempel på beräkning av en faktura"
example_bill_calculator_legend: "Ändra omsättningen i exemplet för att åskådliggöra effekten av ändrade inställningar till vänster."
example_monthly_turnover: "Exempel på månatlig omsättning"
example_monthly_turnover_tip: "Ett exempel på månatlig omsättning för företaget som används för att beräkna en månatlig faktura i exemplet nedan."
cap_reached?: "Är taket nått?"
cap_reached?_tip: "Visar om taket (specificerat till vänster) har nåtts. med de givna inställningarna och omsättningen."
included_tax: "Skatten är inkluderad"
included_tax_tip: "All skatt är inkluderad i exemplets månadsfaktura enligt de inställningar och den omsättning som var angiven."
total_monthly_bill_incl_tax: "Total månadsfaktura (inkl skatt)"
total_monthly_bill_incl_tax_tip: "Exemplets totala månadsfaktura med skatt inkluderad enligt de inställningar och den omsättning som var angiven."
customers:
index:
add_customer: "Lägg till kund"
@@ -143,6 +159,28 @@ sv:
edit: 'Ändra'
update_address: 'Uppdatera Adress'
confirm_delete: 'Vill du verkligen radera?'
cache_settings:
show:
title: Inkomst
distributor: Distributör
order_cycle: Ordercykel
status: Status
diff: Differens
contents:
edit:
title: Innehåll
enterprise_fees:
index:
title: Företagsavgifter
enterprise: Företag
fee_type: Avgiftstyp
name: Namn
tax_category: Skattekategori
calculator: Beräkning
calculator_values: Beräknade summor
enterprise_groups:
index:
new_button: Ny företagsgrupp
products:
bulk_edit:
unit: Enhet
@@ -152,7 +190,14 @@ sv:
inherits_properties?: Ärva egenskaper?
available_on: 'Tillgänglig '
av_on: "Md. På"
properties:
property_name: Egendomens Namn
inherited_property: Ärvd Egendom
variants:
to_order_tip: "Varor som framställs för en order har inget eget varunummer, ex formbröd som värms vid en order."
variant_overrides:
loading_flash:
loading_inventory: LADDNING AV INVENTARIELISTA
index:
title: Lager
description: Använd den här sidan som inventarieförteckning för ditt företag. Varje produkt som du angett här gäller framför de som du skrivit på "produktsidan"
@@ -193,18 +238,95 @@ sv:
max_fulfilled_units: "Maximalt expedierade enheter"
order_error: "En del misstag måste korrigeras innan du kan uppdatera en order. Alla rödmarkerade fält innehåller fel."
variants_without_unit_value: "VARNING: På en del ställen saknas antalsuppgift"
order_cycles:
edit:
choose_products_from: "Välj Produkter Från:"
enterprise:
select_outgoing_oc_products_from: Välj utgående produkter i beställningsrunda från
enterprises:
index:
producer?: Producent?
title: Företag
new_enterprise: Nya företag
producer?: "Producent?"
package: Paket
status: Status
manage: Hantera
form:
about_us:
desc_short: Kort beskrivning
desc_short_placeholder: Berätta om ditt företag i en eller två meningar
desc_long: Om oss
desc_long_placeholder: Berätta om kunder om dig själv. Denna information kommer att stå i din allmänna profil.
business_details:
abn: ABN
abn_placeholder: ex 070 56 78 90
acn: ACN
acn_placeholder: ex 123 456 789
contact:
name: Namn
name_placeholder: ex. Gustav Persson
email_address: E-postadress
email_address_placeholder: ex gustav@telia.com
phone: Telefon
phone_placeholder: ex 123 456 789
website: Hemsida
website_placeholder: ex www.shop.com
enterprise_fees:
name: Namn
fee_type: Avgiftstyp
manage_fees: Skötsel av företagsavgifter
no_fees_yet: Du har inga företagsavgifter ännu.
create_button: Skapa en nu
images:
logo: Logotyp
promo_image_placeholder: 'Denna bild visas under "Om oss"'
promo_image_note1: 'VAR VÄNLIG OBSERVERA:'
promo_image_note2: Varje reklambild som laddas här kommer att beskäras till 1200 x 260.
promo_image_note3: Logotypen visas högst upp på företagets profilsida och i rullgardinsmenyer.
inventory_settings:
text1: Du kan välja att hantera ditt varulager och dina priser via din
inventory: Inventarielista
text2: >
Om använder inventeringsverktyget kan du välja huruvida nya produkter
som lagts till av dina leverantörer behöver blir tillagda till din lagerförteckning
innan de kan bli lagerförda. Om du inte använder din inventering för
att hantera dina produkter bör du välja det 'rekommenderade' alternativet
nedan:
preferred_product_selection_from_inventory_only_yes: Nya produkter kan placeras i mitt skyltfönster (rekommenderas)
preferred_product_selection_from_inventory_only_no: Ny produkter måste adderas till min inventarielista innan de kan placeras i mitt skyltfönster
payment_methods:
name: Namn
applies: Gäller?
manage: Bestäm betalningssätt
not_method_yet: Du har ännu inte bestämt betalningssätt
create_button: Skapa ett nytt betalningssätt
create_one_button: Skapa en nu
primary_details:
name: Namn
name_placeholder: t.ex. Professor Plums Biodynamiska Tryfflar
groups: Grupper
groups_tip: Bestäm i vilka grupper och områden du är medlem. Detta underlättar för kunder att hitta ditt företag.
groups_placeholder: Starta din sökning efter tillgängliga grupper...
primary_producer: Primär producent?
primary_producer_tip: Välj "Producent" om du är en primär producent av livsmedel.
producer: Producent
any: Vilken som helst
none: Ingen
own: Egen
sells: Säljer
sells_tip: "Inget - företag säljer direkt till kunderna.<br />Egna - Företag säljer egna produkter till kunder.<br />Några - Företag kan sälja egna eller andra företags produkter.<br />"
visible_in_search: Synlig vid sökning?
visible_in_search_tip: Bestämmer om detta företag kommer att bli synligt för kunder då man söker på hemsidan.
visible: Synlg
not_visible: Ej synlig
permalink: Permalänk (inga mellanrum)
permalink_tip: "Denna permalänk används för att skapa URL:en till din butik: %{link}din-butiks-namn/butik"
link_to_front: Länk till sitt skyltfönster
link_to_front_tip: En direkt länk till ditt skyltfönster på OFN
shipping_methods:
name: Namn
applies: Gäller?
manage: Bestäm leversmetoder
create_button: Skapa ny leveransmetod
create_one_button: Skapa en nu
no_method_yet: Du har inte bestämt leveransmetod ännu.
shop_preferences:
shopfront_requires_login: "Offentligt visat skyltfönster?"
shopfront_requires_login_tip: "Välj om kunderna måste logga in för att se skyltfönstret eller om det skall visas för alla."
@@ -214,6 +336,146 @@ sv:
allow_guest_orders_tip: "Tillåt leveranskontroll som gäst eller registrerad kund"
allow_guest_orders_false: "Kräv inloggning för att beställa"
allow_guest_orders_true: "Tillåt checkout för gäster"
shopfront_message_placeholder: >
En frivillig förklaring för kunder som beskriver hur ditt skyltfönster
skall användas. Den visas ovanför produktlistan i affärsfönstret.
shopfront_closed_message_placeholder: >
Ett meddelande som ger en mer detaljerad förklaring varför din affär
är stängd/eller när kunder kan förvänta att den öppnar igen. Detta visas
i din affär endast när du inte har en aktiv ordercykel (dvs när affären
är stängd).
open_date: Öppningsdatum
close_date: Stängningsdatum
social:
twitter_placeholder: t.ex. @the_prof
tag_rules:
default_rules:
by_default: Som standard
no_rules_yet: Standardregler har ännu ej fasttällts
add_new_button: '+ Lägg till ny standardregel'
no_tags_yet: Inga etiketter finns för detta företag ännu
no_rules_yet: Inga regler finns för denna etikett ännu
for_customers_tagged: 'För kunder taggade med:'
add_new_rule: '+ Lägg till en ny regel'
add_new_tag: '+ Lägg till en ny etikett'
users:
email_confirmation_notice_html: "E-post bekräftelse har inte kommit. Vi har sänt en bekräftande e-post till %{email}."
resend: Återsänd
owner: 'Ägare'
owner_tip: Den primära användaren är ansvarig för detta företag.
notifications: Meddelanden
notifications_tip: Meddelanden om order kommer att sändas till denna e-postadress,
notifications_placeholder: ex gustav@telia.com
notifications_note: 'Observera: En ny e-postadress behöver kanske bli bekräftad före användning'
managers: Chefer
managers_tip: Andra användare med tillstånd att leda detta företag.
actions:
edit_profile: Redigera profilen
properties: Egenskaper
payment_methods: Betalningssätt
payment_methods_tip: Detta företag har inga betalningssätt
shipping_methods: Transportsätt
shipping_methods_tip: Detta företag har inga transportsätt
enterprise_fees: Företagsavgifter
enterprise_fees_tip: Detta företag har inga avgifter
admin_index:
name: Namn
role: Roll
sells: Säljer
visible: Synligt?
owner: Ägare
producer: Producent
change_type_form:
producer_profile: Producentprofil
connect_ofn: Ansluten via OFN
always_free: ALLTID GRATIS
producer_description_text: 'Lägg till dina produkter till OFN, tillåt lagringscentraler att lagra dina varor i sina lokaler. '
producer_shop: Producentaffär
sell_your_produce: Sälj dina egna produkter
sell_description_text: Sälj dina egna produkter direkt till kunder via ditt eget OFN skyltfönster.
sell_description_text2: En producentaffär är enbart för din produkt, Om du önskar sälja produkter odlade/producerade på annat håll, välj "Producer Hub".
producer_hub: Producentcentral
producer_hub_text: Sälj produkter av egen eller annans tillverkning
producer_hub_description_text: Ditt företag är grunden i ert lokala livsmedelssystem. Du kan sälja av egen tillverkning likväl som varor samlade från andra företag genom ditt skyltfönster i OFN.
profile: Enbart profil
get_listing: Få en listning
profile_description_text: Folk kan hitta och kontakta dig i OFN. Ditt företag kommer att markeras på en karta och det går att söka i listor.
hub_shop: Affär vid leveranscentral
hub_shop_text: 'Sälj andras produkter '
hub_shop_description_text: Ditt företag är grunden i dit lokala livsmedelssystem. Du kan samla produkter från andra företag och sälja dem i din affär genom OFN.
choose_option: Var vänlig välj ett av förslagen ovan.
change_now: Ändra nu
enterprise_user_index:
loading_enterprises: LADDAR FÖRETAG
no_enterprises_found: Inget företag kunde hittas.
search_placeholder: Sök på namn
manage: Administrera
new_form:
owner: Ägare
owner_tip: Den primära användaren är ansvarig för detta företag.
i_am_producer: Jag är en Tillverkare
contact_name: Kontaktperson
edit:
editing: 'Redigera:'
back_link: Åter till företagslistan
new:
title: Nya företag
back_link: Åter till företagslistan
welcome:
welcome_title: Välkommen till OFN!
welcome_text: Du har korrekt slutfört en
next_step: Nästa steg
choose_starting_point: 'Välj din startpunkt:'
order_cycles:
advanced_settings:
title: Avancerade inställningar
choose_product_tip: Du kan välja att begränsa alla tillgängliga produkter (både inkommande och utgående), till enbart dem i %{inventory}'s inventory.
preferred_product_selection_from_coordinator_inventory_only_here: Enbart koordinatorns inventarielista
preferred_product_selection_from_coordinator_inventory_only_all: Alla tillgängliga produkter
save_reload: Spara och ladda om sidan
coordinator_fees:
add: Lägg till koordinatoravgift
form:
incoming: Inkommande
supplier: Leverantör
receival_details: Mottagna detaljer
fees: Avgifter
outgoing: Utgående
distributor: Distributör
products: Produkter
tags: Etiketter
delivery_detaisl: Hämtade/levererade detaljer
debug_info: Felinformation
name_and_timing_form:
name: Namn
orders_open: Order öppna till
coordinator: Koordinator
order_closes: Order stänger
row:
suppliers: leverantörer
distributors: distributörer
variants: varianter
simple_form:
ready_for: Klar för
ready_for_placeholder: Datum/tid
customer_instructions: Kundinstruktioner
customer_instructions_placeholder: Hämtnings eller leverans meddelanden
products: Produkter
fees: Avgifter
edit:
advanced_settings: Avancerade inställningar
update_and_close: Uppdatera och Stäng
producer_properties:
index:
title: Producentegenskaper
shared:
user_guide_link:
user_guide: Användarinstruktion
invoice_settings:
edit:
title: Fakturainställningar
invoice_style2?: Använd den alternativa faktureringsmodellen som inkluderar totala skattefördelning per beräkning och skatt per artikel (ännu inte passande för länder som visar priser exklusive skatt)
enable_receipt_printing?: 'Visa alternativ för att skriva ut recept genom att använda termiska skrivare i ordermenyn? '
home:
hubs:
show_closed_shops: "Visa stängda affärer"
@@ -231,10 +493,29 @@ sv:
require_customer_login: "Denna butik är endast för kunder."
require_login_html: "Var vänlig %{login} om du redan har ett konto. I annat fall %{register} för att bli kund."
require_customer_html: "Vänlig %{contact} %{enterprise} för att bli en kund."
invoice_column_item: "Artikel"
invoice_column_qty: "Antal"
invoice_billing_address: "Faktureringsadress"
invoice_column_tax: "VAT"
invoice_column_price: "Pris"
invoice_column_item: "Artikel"
invoice_column_qty: "Antal"
invoice_column_unit_price_with_taxes: "Styckpris (Inkl skatt)"
invoice_column_unit_price_without_taxes: "Styckpris (Exkl skatt)"
invoice_column_price_with_taxes: "Slutsumma (inkl skatt)"
invoice_column_price_without_taxes: "Slutsumma (Exkl skatt)"
invoice_column_tax_rate: "Skattesats"
tax_invoice: "SKATTEFAKTURA"
tax_total: "Summa skatter (%{rate}):"
total_excl_tax: "Summa (Exkl skatt):"
total_incl_tax: "Summa (Inkl skatt):"
abn: "ABN:"
acn: "ACN:"
invoice_issued_on: "Faktura utfärdad på:"
order_number: "Fakturanummer:"
date_of_transaction: "Transaktionsdatum:"
ticket_column_qty: "Kvantitet"
ticket_column_item: "Vara"
ticket_column_unit_price: "Styckpris"
ticket_column_total_price: "Summa"
logo: "Logotyp (640x130)"
logo_mobile: "Mobil logotyp (75x26)"
logo_mobile_svg: "Mobil logotyp (SVG)"
@@ -258,10 +539,13 @@ sv:
phone: Telefon
next: Näst
address: Adress
address_placeholder: eg. 123 High Street
address2: Adress (fortgående)
city: Ort
state: Region
city_placeholder: eg. Northcote
postcode: Postnummer
postcode_placeholder: eg. 3070
state: Region
country: Land
unauthorized: Obehörig
terms_of_service: "Användarvillkor "
@@ -394,6 +678,7 @@ sv:
order_includes_tax: (inkluderar skatter)
order_payment_paypal_successful: Din betalning via PayPal har gått bra.
order_hub_info: Hub-information
bom_tip: "Använd denna sida för att ändra produktkvantiteter på flera order samtidigt. Produkter kan också tas bort från fler order samtidigt, om så erfordras."
unsaved_changes_warning: "Osparade förändringar existerar och kommer förloras om du fortsätter."
unsaved_changes_error: "Fält med röda kanter innehåller fel."
products: "Produkter"
@@ -405,7 +690,7 @@ sv:
email_registered: "är nu del av"
email_userguide_html: "Användarhandboken med detaljerade uppgifter hur du skall skapa din Producer eller Hub finns här: %{link}"
email_admin_html: "Du kan sköta ditt konto genom att logga in %{link} eller att klicka på kuggen i det övre högra hörnet på hemsidan och välja Administration."
email_community_html: "Vi har också ett internetforum för gemensamma diskussioner som är relaterade till OFN programvara och den unika utmaningen att använda ett matföretag. Vi utvecklas ständigt och dina inlägg till detta forum påverkar vad som händer i fortsättningen."
email_community_html: "Vi har också ett internetforum för gemensamma diskussioner som är relaterade till OFN programvara och den unika utmaningen att använda ett matföretag. Vi utvecklas ständigt och dina inlägg till detta forum påverkar vad som händer i fortsättningen. %{link}"
join_community: "Gå med i gemenskapen"
email_help: "Om du hamnar i svårigheter, titta i vårt FAQ, sök igenom vårt forum eller skicka en fråga till Support och du kommer att få hjälp."
email_confirmation_greeting: "Hej, %{contact}!"
@@ -479,6 +764,7 @@ sv:
hubs_filter_by: "Filtrera med"
hubs_filter_type: "Typ"
hubs_filter_delivery: "Leverans"
hubs_filter_property: "Egenskaper"
hubs_matches: "Menade du?"
hubs_intro: Handla i ditt närområde
hubs_distance: Närmast till
@@ -493,7 +779,7 @@ sv:
products_edit_cart: "Redigera din varukorg "
products_from: från
products_change: "Inga ändringar att spara."
products_update_error: "Sparandet misslyckades med följande fel:"
products_update_error: "Sparandet misslyckades med följande fel(en):"
products_update_error_msg: "Sparandet misslyckades."
products_update_error_data: "Sparandet misslyckades beroende på felaktiga data."
products_changes_saved: "Ändringar sparade."
@@ -724,9 +1010,9 @@ sv:
enterprise_long_desc_placeholder: "Detta är ditt tillfälle att beskriva ditt företag - vad som gör dig speciell och intressant. Vi föreslår att du begränsar beskrivningen till 600 tecken eller 150 ord."
enterprise_long_desc_length: "%{num} tecken / upp till 600 rekommenderas"
enterprise_abn: "ABN"
enterprise_abn_placeholder: "ex 123 123 123"
enterprise_abn_placeholder: "t.ex. 99 123 456 789"
enterprise_acn: "ACN"
enterprise_acn_placeholder: "ex 123 123 123"
enterprise_acn_placeholder: "t.ex. 123 456 789"
enterprise_tax_required: "Du måste göra ett val"
enterprise_final_step: "Sista steget!"
enterprise_social_text: "Hur kan folk hitta %{enterprise} på nätet?"
@@ -744,7 +1030,7 @@ sv:
registration_intro: "Nu kan du skapa en profil för din producent eller matställe"
registration_action: "Låt oss börja!"
registration_checklist: "Du kommer att behöva"
registration_time: "5 - 10 minuter"
registration_time: "5-10 minuter"
registration_enterprise_address: "Företagets adress"
registration_contact_details: "Uppgifter hur man får kontakt"
registration_logo: "Din logotype"
@@ -785,7 +1071,7 @@ sv:
registration_detail_suburb_placeholder: "ex spånga"
registration_detail_suburb_error: "Var vänlig skriv in en förort"
registration_detail_postcode: "Postkod:"
registration_detail_postcode_placeholder: "ex 123 123"
registration_detail_postcode_placeholder: "t.ex. 3070"
registration_detail_postcode_error: "Postkod saknas"
registration_detail_state: "Land:"
registration_detail_state_error: "Land måste fyllas i "
@@ -835,12 +1121,12 @@ sv:
admin_entreprise_groups_data_powertip_logo: "Detta är logotypen för gruppen"
admin_entreprise_groups_data_powertip_promo_image: "Denna bild visas överst på gruppens profil"
admin_entreprise_groups_contact: "Kontakt"
admin_entreprise_groups_contact_phone_placeholder: "ex 123 123"
admin_entreprise_groups_contact_address1_placeholder: "ex Höga gatan"
admin_entreprise_groups_contact_phone_placeholder: "t.ex. 98 7654 3210"
admin_entreprise_groups_contact_address1_placeholder: "t.ex. 123 Höga gatan"
admin_entreprise_groups_contact_city: "Förort"
admin_entreprise_groups_contact_city_placeholder: "ex Norrberga"
admin_entreprise_groups_contact_zipcode: "Postnummer"
admin_entreprise_groups_contact_zipcode_placeholder: "ex 123"
admin_entreprise_groups_contact_zipcode_placeholder: "t.ex. 3070"
admin_entreprise_groups_contact_state_id: "Region"
admin_entreprise_groups_contact_country_id: "Land"
admin_entreprise_groups_web: "Webb resurser"
@@ -903,7 +1189,7 @@ sv:
spree_admin_single_enterprise_alert_mail_confirmation: "Var vänlig och fastställ e-postadressen för"
spree_admin_single_enterprise_alert_mail_sent: "Vi har sänt e-post till "
spree_admin_overview_action_required: "Ett ställningstagande behövs"
spree_admin_overview_check_your_inbox: "Var vänlig och kontrollera din inkorg för ytterligare instruktioner. Tack!"
spree_admin_overview_check_your_inbox: "Var vänlig kontrollera din inkorg för ytterligare instruktioner. Tack!"
change_package: "Ändra förpackning"
spree_admin_single_enterprise_hint: "Tips: För att folk skall hitta dig lättare, slå på din reklam under"
your_profil_live: "Din profil direkt"
@@ -920,6 +1206,12 @@ sv:
edit_profile_details_etc: "Ändra beskrivningen av din profil, bilder, etc"
order_cycle: "Ordercykel"
remove_tax: "Tag bort skatt"
enterprise_terms_of_service: "Företagets servicevillkor"
enterprises_require_tos: "Företag måste acceptera servicevillkoren"
enterprise_tos_link: "Länk till företagets servicevillkor"
enterprise_tos_message: "Vi vill arbeta med personer som delar våra mål och värderingar. Därför ber vi nya företag att samtycka med vår"
enterprise_tos_link_text: "Servicevillkor"
enterprise_tos_agree: "Jag samtycker med ovanstående servicevillkor "
tax_settings: "Skatteskalor"
products_require_tax_category: "produkter kräver skattekategori"
admin_shared_address_1: "Adress"
@@ -953,6 +1245,22 @@ sv:
report_order_cycle: "Beställningsrundor"
report_entreprises: "Företag:"
report_users: "Användare:"
report_tax_rates: "Skattesatser"
report_tax_types: "Typer av skatt"
report_header_order_number: "Ordernummer"
report_header_date: "Datum"
report_header_items: "Varor"
report_header_items_total: "Varusumma %{currency_symbol}"
report_header_taxable_items_total: "Skattepliktig varusumma (%{currency_symbol})"
report_header_sales_tax: "Skatt på försäljning (%{currency_symbol})"
report_header_delivery_charge: "Leveransavgift (%{currency_symbol})"
report_header_tax_on_delivery: "Leveransskatt (%{currency_symbol})"
report_header_tax_on_fees: "Skatt på avgifter (%{currency_symbol})"
report_header_total_tax: "Summa skatter (%{currency_symbol})"
report_header_customer: "Kund"
report_header_distributor: "Distributör"
report_header_total_excl_vat: "Summa exkl skatt (%{currency_symbol})"
report_header_total_incl_vat: "Summa inkl skatt (%{currency_symbol})"
initial_invoice_number: "Initialt fakturanummer"
invoice_date: "Fakturadatum:"
due_date: "Sista betalningsdag:"
@@ -994,7 +1302,141 @@ sv:
validation_msg_product_category_cant_be_blank: "^Produktkategori kan inte vara blank"
validation_msg_tax_category_cant_be_blank: "^Skattekategori kan inte vara blank"
validation_msg_is_associated_with_an_exising_customer: "är knuten till en existerande kund"
js:
admin:
modals:
got_it: Förstått
tag_rule_help:
title: Regler för etiketter
overview: Översikt
overview_text: >
Etikettreglerna är ett sätt att beskriva vilka varor visas eller inte
för olika kunder. Reglerna kan beröra leveransmetoder, betalningssätt,
produkt- eller ordercykler.
by_default_rules: "Regler för standard "
by_default_rules_text: >
Standardreglerna tillåter dig att dölja varor så att de ej visas som
standard. Denna metod kan sedan upphävas av en "ej-standard" regel för
de kunder som har särskilda etiketter.
customer_tagged_rules: "Regler för kundetiketter"
customer_tagged_rules_text: >
Genom att skapa regler för en speciell kundetikett kan du upphäva standardförfarandet
(vare sig det är att visa eller dölja varor) för kunder med den specifika
etiketten.
panels:
save: SPARA
saved: SPARAD
saving: SPARANDE
enterprise_package:
hub_profile: Hubbprofil
hub_profile_cost: "KOSTNAD: ALLTID GRATIS"
hub_profile_text1: >
Folk kan finna och kontakta dig på OFN. Ditt företag visas på en karta
och går att söka på i olika listor.
hub_profile_text2: >
Att ha en profil samt ha förbindelser inom ditt lokala livsmedelssystem
via OFN är alltid gratis.
hub_shop: Affär vid leveranscentral
hub_shop_text1: >
hej
hub_shop_text2: >
Centraler kan finnas i olika former, antingen kan de var en kooperation,
en inköpsgrupp, en vegan-box program eller en lokal speceriaffär.
hub_shop_text3: >
Om du också önskar att sälja dina egna produkter måste du ändra detta
företag till att vara en producent.
choose_package: Var vänlig välj en förpackning
choose_package_text1: >
Ditt företag kommer inte att var aktiverat förrän du valt förpackning
från listan till vänster.
choose_package_text2: >
Klicka på ett alternativ för att se mer detaljerad information om varje
förpackning och klicka på den röda SAVE knappen när du är klar!
profile_only: Enbart profil
profile_only_cost: "KOSTNAD: ALLTID GRATIS"
profile_only_text1: >
En profil gör att du blir synlig och kan kontaktas av andra och är ett
sätt att berätta din historia.
profile_only_text2: >
Om du föredrar att fokusera på att framställa mat och vill slippa arbetet
med försäljning till andra, behöver du inte en affär i OFN.
profile_only_text3: >
Lägg till dina produkter på OFN och tillåt centraler lagra dina produkter
i sina lokaler.
producer_shop: Producentaffär
producer_shop_text1: >
Sälj dina produkter direkt till kunder genom ditt alldeles egna OFN
skyltfönster.
producer_shop_text2: >
En producentaffär är enbart för din tillverkning, om du önskar sälja produkter
odlade/framställda på annat ställe, var vänlig välj "Producer Hub".
producer_hub: Producentcentral
producer_hub_text1: >
Ditt företag är grunden i ditt lokala livsmedelssystem. Du kan sälja
dina egna såväl som produkter inköpta från andra företag genom ditt
skyltfönster på OFN.
producer_hub_text2: >
Producentcentraler kan finnas i många former, antingen en CSA. en vegan-box
program, eller en kooperation med takträdgårdar.
producer_hub_text3: >
OFN försöker stödja så många olika former av centraler som möjligt,
så oavsett din situation så försöker vi förse dig med de verktyg du
behöver för att hantera din organisation eller lokala mataffär.
get_listing: Få en listning
always_free: ALLTID GRATIS
sell_produce_others: 'Sälj andras produkter '
sell_own_produce: Sälj dina egna produkter
sell_both: Sälj produkter av egen eller annans tillverkning
enterprise_producer:
producer: Producent
producer_text1: >
Producenter gör smaskiga saker att äta eller dricka. Du är en producent
om du odlar,brygger bakar, jäser, mjölkar eller mal.
producer_text2: >
Producenter kan också ha andra funktioner såsom att samla matvaror från
andra företag och sälja dem genom en affär på OFN.
non_producer: Icke-producenter
non_producer_text1: >
Icke-tllverkare kan inte framställa mat själva, vilket innebär att de
kan ej framställa sina egna produkter för försäljning via OFN.
non_producer_text2: >
I stället icke-tillverkare specialisera sig på att sammanföra producenter
med den slutliga köparen genom att plocka samman, sortera, förpacka
sälja eller leverera mat.
producer_desc: Producenter av mat
producer_example: ex ODLARE, BAGERIER, BRYGGERIER, TILLVERKARE
non_producer_desc: Andra matföretag
non_producer_example: t.ex. matbutiker, matkooperativ, köpgrupper
enterprise_status:
status_title: "%{name} är uppsatt och redo att användas!"
severity: Allvarlighet
description: Beskrivning
resolve: Besluta
new_tag_rule_dialog:
select_rule_type: "Välj en regeltyp:"
out_of_stock:
reduced_stock_available: Minska tillgängligt lager
out_of_stock_text: >
Under tiden du handlat har lagernivån för en eller flera produkter i din
kundvagn minskat. Detta har ändrats:
now_out_of_stock: Är nu slut
only_n_remainging: "nu återstår endast %{num}"
spree:
admin:
products:
bulk_edit:
header:
title: 'Redigera Omfång av Produkter '
indicators:
title: LADDAR PRODUKTER
no_products: "Inga produkter ännu. Varför lägger du inte till några?"
no_results: "Ledsen, inga resultat stämmer överens"
variants:
autocomplete:
producer_name: Producent
date_picker:
format: '%Y-%m-%d'
js_format: 'åå-mm-dd'
zipcode: Postkod
shipment_states:
backorder: restorder
@@ -1013,6 +1455,10 @@ sv:
processing: behandlas
void: annulerad
invalid: felaktig
order_mailer:
invoice_email:
hi: "Hi %{name}"
invoice_attached_text: Här är en faktura för din senaste order från
order_state:
address: adress
adjustments: justeringar
@@ -1026,3 +1472,6 @@ sv:
resumed: återupptagen
returned: returnerad
skrill: skrill
orders:
invoice:
tax_invoice: "SKATTEFAKTURA:"

View File

@@ -28,6 +28,7 @@ Openfoodnetwork::Application.routes.draw do
get :products
post :order_cycle
get :order_cycle
get :changeable_orders_alert
end
resources :producers, only: [:index] do
@@ -42,6 +43,10 @@ Openfoodnetwork::Application.routes.draw do
end
end
resources :line_items, only: [:destroy] do
get :bought, on: :collection
end
resources :groups, only: [:index, :show] do
collection do
get :signup
@@ -262,6 +267,7 @@ Spree::Core::Engine.routes.prepend do
resources :orders do
get :clear, :on => :collection
get :order_cycle_expired, :on => :collection
put :cancel, on: :member
end
end

View File

@@ -0,0 +1,5 @@
class AddAllowOrderChangesToEnterprise < ActiveRecord::Migration
def change
add_column :enterprises, :allow_order_changes, :boolean, default: false, null: false
end
end

View File

@@ -251,6 +251,7 @@ ActiveRecord::Schema.define(:version => 20161215230219) do
t.boolean "allow_guest_orders", :default => true, :null => false
t.text "invoice_text"
t.boolean "display_invoice_logo", :default => false
t.boolean "allow_order_changes", :default => false, :null => false
end
add_index "enterprises", ["address_id"], :name => "index_enterprises_on_address_id"

View File

@@ -47,6 +47,14 @@ module OpenFoodNetwork
end
end
def increment!(attribute, by=1)
if attribute == :count_on_hand && @variant_override.andand.stock_overridden?
@variant_override.increment_stock! by
else
super
end
end
def sku
@variant_override.andand.sku || super
end

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