mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-20 19:56:48 +00:00
Compare commits
324 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1bfac5144 | ||
|
|
01f8aff3e0 | ||
|
|
7f9179193e | ||
|
|
3be0e1c13a | ||
|
|
18c020535a | ||
|
|
8d1fcc06fd | ||
|
|
2b6a72ffb4 | ||
|
|
157d86c94f | ||
|
|
d41de06809 | ||
|
|
d730f21dc7 | ||
|
|
49dfaa20ab | ||
|
|
bfeb892cab | ||
|
|
4b56422abd | ||
|
|
53e3e2b66d | ||
|
|
834140f0a2 | ||
|
|
0d95d83ef9 | ||
|
|
54d373c963 | ||
|
|
1dfd68c691 | ||
|
|
df9213e812 | ||
|
|
03a078a3a0 | ||
|
|
11da025247 | ||
|
|
07a9da901f | ||
|
|
4ac3853be9 | ||
|
|
eae7a9978c | ||
|
|
bdd8572fbf | ||
|
|
07422dac29 | ||
|
|
088ae496cc | ||
|
|
c83a619082 | ||
|
|
ca7d1b111a | ||
|
|
3c507c1727 | ||
|
|
b111d24488 | ||
|
|
4dc8b44e81 | ||
|
|
27a9ad7bcb | ||
|
|
fbd4d512d5 | ||
|
|
0f85db6d36 | ||
|
|
0f78b5b315 | ||
|
|
78e3bb1acd | ||
|
|
c5e1c057ae | ||
|
|
f34a3c3c02 | ||
|
|
546a32e97a | ||
|
|
abd269949d | ||
|
|
0d5f76b19e | ||
|
|
bfa77baae1 | ||
|
|
a2a1aac384 | ||
|
|
43ede7ba26 | ||
|
|
883e9fdf62 | ||
|
|
c625766af1 | ||
|
|
23730ab28f | ||
|
|
0c8bfea2f7 | ||
|
|
0306732a3d | ||
|
|
6842cbfda4 | ||
|
|
ecb4cb31ad | ||
|
|
dd47430f19 | ||
|
|
74f27544f7 | ||
|
|
5868765087 | ||
|
|
545d64a2e5 | ||
|
|
c69dee4c96 | ||
|
|
b367001b95 | ||
|
|
120fc4ca42 | ||
|
|
e4756a523a | ||
|
|
46843a5efa | ||
|
|
6377736f43 | ||
|
|
afe97bcc96 | ||
|
|
8af6fedf8a | ||
|
|
d8042b25e4 | ||
|
|
f97e71d054 | ||
|
|
d066f0b94d | ||
|
|
e9d389e4f1 | ||
|
|
e90403dbbe | ||
|
|
3dc3581e6b | ||
|
|
ff82f70e9a | ||
|
|
560f462f7b | ||
|
|
23b2b5ba56 | ||
|
|
11cb8cbbdc | ||
|
|
41799b2663 | ||
|
|
2f842bcbdd | ||
|
|
336a8b5825 | ||
|
|
d2f54f5bd2 | ||
|
|
8c81c14c8d | ||
|
|
1f6d872fa5 | ||
|
|
ae1b9b8dd5 | ||
|
|
1e1706d371 | ||
|
|
5ccaa521cf | ||
|
|
90bb9870ab | ||
|
|
70ac719725 | ||
|
|
08d540a761 | ||
|
|
304a3804bc | ||
|
|
f7726e552a | ||
|
|
a1ac4e85ed | ||
|
|
f8e5370b0b | ||
|
|
fb560089b9 | ||
|
|
341f6c9f62 | ||
|
|
b2e97fe1d2 | ||
|
|
e73584fef7 | ||
|
|
45ad4bbcf1 | ||
|
|
096847ea07 | ||
|
|
faf6a37c9f | ||
|
|
d4ec1bda54 | ||
|
|
325b97b683 | ||
|
|
7ab065e8cd | ||
|
|
aea0670268 | ||
|
|
5560a99423 | ||
|
|
0c4e191f3b | ||
|
|
cb914e4729 | ||
|
|
ab027d6af6 | ||
|
|
6a8ee544e8 | ||
|
|
2bb38619ea | ||
|
|
4b352da402 | ||
|
|
75243b8e6a | ||
|
|
7df2915fbd | ||
|
|
6427a3846b | ||
|
|
5169ee91ea | ||
|
|
5917accdd2 | ||
|
|
5dd24623f7 | ||
|
|
befb6f632f | ||
|
|
92e0f8349c | ||
|
|
ffbba01c41 | ||
|
|
5f9679655c | ||
|
|
6ded80d2c6 | ||
|
|
eb3c33b091 | ||
|
|
794216713a | ||
|
|
a2862e604c | ||
|
|
8429da3d2a | ||
|
|
381b0e78d5 | ||
|
|
2e63cd8116 | ||
|
|
52e0d84238 | ||
|
|
5725535715 | ||
|
|
05ed98aa0c | ||
|
|
fd021d4778 | ||
|
|
2b9f9fce86 | ||
|
|
81aac442f2 | ||
|
|
16e3af9b49 | ||
|
|
227bdd7d4c | ||
|
|
471a7903f6 | ||
|
|
37177e7207 | ||
|
|
5805104d13 | ||
|
|
e686a4f627 | ||
|
|
c7f80d86a8 | ||
|
|
19187583e1 | ||
|
|
f2c3b096a0 | ||
|
|
816d752dc8 | ||
|
|
0a880a2bf3 | ||
|
|
d6b3b0a3d3 | ||
|
|
ca38948e21 | ||
|
|
fe67c01e57 | ||
|
|
37053239c0 | ||
|
|
2bb5a4b11f | ||
|
|
cea3ee4ef9 | ||
|
|
90db52e5f5 | ||
|
|
b1896733ca | ||
|
|
a949422ac9 | ||
|
|
0243e5cbb8 | ||
|
|
ebdbfe0027 | ||
|
|
b680697af6 | ||
|
|
2e248744c0 | ||
|
|
82a6befce7 | ||
|
|
ccef65039a | ||
|
|
e4a670da5a | ||
|
|
c930b2ee60 | ||
|
|
4932e1dcb5 | ||
|
|
536281ec80 | ||
|
|
367cee593f | ||
|
|
99cf23df26 | ||
|
|
f49d4592a0 | ||
|
|
7f27544acb | ||
|
|
2aac44d95e | ||
|
|
8f921b8b08 | ||
|
|
dfe485b079 | ||
|
|
ad9096b5a8 | ||
|
|
e60a513c88 | ||
|
|
1f8e731594 | ||
|
|
d69ef31bf9 | ||
|
|
9ae7c5efbc | ||
|
|
902bbf7dc4 | ||
|
|
d29ef0d7b1 | ||
|
|
d2a3d9049f | ||
|
|
0cd6c53e0d | ||
|
|
5475b79cde | ||
|
|
8e24c655b0 | ||
|
|
bb5452ad26 | ||
|
|
ed6b7f1ab4 | ||
|
|
85b8e9b51f | ||
|
|
4453123944 | ||
|
|
3239c893ba | ||
|
|
17a0063b40 | ||
|
|
122ba385f7 | ||
|
|
75dc7af0ed | ||
|
|
cb15e28cef | ||
|
|
cbefa5f882 | ||
|
|
231f01dad2 | ||
|
|
c14ccdc21c | ||
|
|
fcf70c242e | ||
|
|
a0476be2c9 | ||
|
|
24a5407c8f | ||
|
|
66da72ccc2 | ||
|
|
6a342ae368 | ||
|
|
dd851edbdc | ||
|
|
2910cbf15c | ||
|
|
d24d7fce56 | ||
|
|
e485a4a8ef | ||
|
|
026942dd72 | ||
|
|
237ebd6ec4 | ||
|
|
a4d6e69309 | ||
|
|
29e04dd8c8 | ||
|
|
5a8e271037 | ||
|
|
5a16954bf6 | ||
|
|
43e41f4980 | ||
|
|
39156ec988 | ||
|
|
c71d4bce6a | ||
|
|
8d8abed529 | ||
|
|
55018260df | ||
|
|
cbdeef064a | ||
|
|
ac2c02a983 | ||
|
|
c71a4918a0 | ||
|
|
fd5e0fd60f | ||
|
|
dbd0d4a795 | ||
|
|
328381b732 | ||
|
|
de000228cf | ||
|
|
a2de86c23e | ||
|
|
415d86bff0 | ||
|
|
8b9083d28f | ||
|
|
7f5dddffa0 | ||
|
|
cfa4bde965 | ||
|
|
9e6ede4072 | ||
|
|
9a63f38790 | ||
|
|
69b91ea136 | ||
|
|
dea6a01e61 | ||
|
|
2147584daf | ||
|
|
b723ed4a98 | ||
|
|
ccfe352d62 | ||
|
|
76fb157518 | ||
|
|
a7331efd67 | ||
|
|
b57755398c | ||
|
|
076081929f | ||
|
|
4b183bb6c1 | ||
|
|
d2f3cdd6b9 | ||
|
|
baf3d4b2cd | ||
|
|
f8f3cb78e3 | ||
|
|
18373533e6 | ||
|
|
679ceaead7 | ||
|
|
64baebd791 | ||
|
|
31adbdbf7a | ||
|
|
819479f05c | ||
|
|
324999494b | ||
|
|
82845e1cfc | ||
|
|
3e714b1539 | ||
|
|
002420304d | ||
|
|
aa90c4f34f | ||
|
|
63e2122593 | ||
|
|
35671e2464 | ||
|
|
4b9418ebd6 | ||
|
|
ec8f42513b | ||
|
|
3ba439ec0d | ||
|
|
47e79a8d60 | ||
|
|
119fdd9e53 | ||
|
|
00c4a28d22 | ||
|
|
8e10f7af0e | ||
|
|
135a311c05 | ||
|
|
13bb5aa8dd | ||
|
|
2b1becfd47 | ||
|
|
edc51d1155 | ||
|
|
a476416dc4 | ||
|
|
55b1b860d1 | ||
|
|
e2a411c23c | ||
|
|
aa013ef76a | ||
|
|
a645b8c58f | ||
|
|
4888f1cd06 | ||
|
|
31fc6201fc | ||
|
|
ab65b01fcf | ||
|
|
1de68d091a | ||
|
|
ac53df37d9 | ||
|
|
279c15c306 | ||
|
|
47a5809100 | ||
|
|
705666ecd0 | ||
|
|
aaf4710694 | ||
|
|
f5a7ff0f0a | ||
|
|
203dbb7a8b | ||
|
|
ea5f9c6747 | ||
|
|
d255ca22f5 | ||
|
|
be0eb5f5f9 | ||
|
|
52525dc437 | ||
|
|
d381b2a544 | ||
|
|
c08bc743d3 | ||
|
|
c1402fe4f2 | ||
|
|
e9b6f89ae0 | ||
|
|
26688dda36 | ||
|
|
b7aeceaf67 | ||
|
|
e6a3041f45 | ||
|
|
b0787e83b2 | ||
|
|
1b4930de8f | ||
|
|
f874397115 | ||
|
|
5fc60f53ba | ||
|
|
943c00c924 | ||
|
|
138f00876b | ||
|
|
b00dcecd52 | ||
|
|
d3b3ed3b9c | ||
|
|
19768e1398 | ||
|
|
7c2d77a3ee | ||
|
|
2560757ea2 | ||
|
|
9d23c0d9e2 | ||
|
|
7948c5943d | ||
|
|
2eb17dbbd1 | ||
|
|
0a9fc429ac | ||
|
|
8672969798 | ||
|
|
1be730fcfb | ||
|
|
7fd82540ce | ||
|
|
e290c128bf | ||
|
|
95a73704a2 | ||
|
|
b843b871f6 | ||
|
|
925676f136 | ||
|
|
d3f41f14c7 | ||
|
|
045ce73c83 | ||
|
|
932d000c9d | ||
|
|
c7ce10f998 | ||
|
|
5b29243847 | ||
|
|
3897c3af68 | ||
|
|
c3c396eaea | ||
|
|
c1d246081e | ||
|
|
84285ff985 | ||
|
|
81385b63c7 | ||
|
|
f357c3ff30 | ||
|
|
8b06a735ac | ||
|
|
153ec268b7 | ||
|
|
92eaf5fbaa |
5
.github/codecov.yml
vendored
Normal file
5
.github/codecov.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
coverage:
|
||||
status:
|
||||
project:
|
||||
default:
|
||||
informational: true
|
||||
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -322,4 +322,4 @@ jobs:
|
||||
run: bundle exec rspec --profile --pattern "engines/*/spec/{,/*/**}/*_spec.rb,spec/features/admin/*/*_spec.rb,spec/lib/{,/*/**}/*_spec.rb"
|
||||
|
||||
- name: Codecov
|
||||
uses: codecov/codecov-action@v1.3.1
|
||||
uses: codecov/codecov-action@v1.5.0
|
||||
|
||||
@@ -1 +1 @@
|
||||
5.12.0
|
||||
14.16.1
|
||||
|
||||
@@ -931,7 +931,6 @@ Style/FrozenStringLiteralComment:
|
||||
- 'app/helpers/spree/admin/base_helper.rb'
|
||||
- 'app/helpers/spree/admin/general_settings_helper.rb'
|
||||
- 'app/helpers/spree/admin/orders_helper.rb'
|
||||
- 'app/helpers/spree/admin/payments_helper.rb'
|
||||
- 'app/helpers/spree/admin/taxons_helper.rb'
|
||||
- 'app/helpers/spree/admin/zones_helper.rb'
|
||||
- 'app/helpers/spree/orders_helper.rb'
|
||||
|
||||
@@ -1 +1 @@
|
||||
2.5.8
|
||||
2.5.9
|
||||
|
||||
25
Dockerfile
25
Dockerfile
@@ -7,7 +7,23 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
RUN echo "deb http://security.ubuntu.com/ubuntu bionic-security main" >> /etc/apt/sources.list
|
||||
|
||||
# Install all the requirements
|
||||
RUN apt-get update && apt-get install -y curl git build-essential software-properties-common wget zlib1g-dev libssl1.0-dev libreadline-dev libyaml-dev libffi-dev libxml2-dev libxslt1-dev wait-for-it imagemagick unzip
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl \
|
||||
git \
|
||||
build-essential \
|
||||
software-properties-common \
|
||||
wget \
|
||||
zlib1g-dev \
|
||||
libreadline-dev \
|
||||
libyaml-dev \
|
||||
libffi-dev \
|
||||
libxml2-dev \
|
||||
libxslt1-dev \
|
||||
wait-for-it \
|
||||
imagemagick \
|
||||
unzip \
|
||||
libjemalloc-dev \
|
||||
libssl-dev
|
||||
|
||||
# Setup ENV variables
|
||||
ENV PATH /usr/local/src/rbenv/shims:/usr/local/src/rbenv/bin:$PATH
|
||||
@@ -19,11 +35,10 @@ WORKDIR /usr/src/app
|
||||
COPY .ruby-version .
|
||||
|
||||
# Install Rbenv & Ruby
|
||||
RUN git clone --depth 1 --branch v1.1.2 https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
|
||||
git clone --depth 1 --branch v20200520 https://github.com/rbenv/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build && \
|
||||
${RBENV_ROOT}/plugins/ruby-build/install.sh && \
|
||||
RUN git clone --depth 1 https://github.com/rbenv/rbenv.git ${RBENV_ROOT} && \
|
||||
git clone --depth 1 https://github.com/rbenv/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build && \
|
||||
echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh && \
|
||||
rbenv install $(cat .ruby-version) && \
|
||||
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install $(cat .ruby-version) && \
|
||||
rbenv global $(cat .ruby-version) && \
|
||||
gem install bundler --version=1.17.3
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ This is a general guide to setting up an Open Food Network **development environ
|
||||
|
||||
The fastest way to make it work locally is to use Docker, you only need to setup git, see the [Docker setup guide](docker/README.md).
|
||||
Otherwise, for a local setup you will need:
|
||||
* Ruby 2.4.4 and bundler (check current Ruby version in [.ruby-version](https://github.com/openfoodfoundation/openfoodnetwork/blob/master/.ruby-version) file)
|
||||
* Ruby and bundler (check current Ruby version in [.ruby-version](https://github.com/openfoodfoundation/openfoodnetwork/blob/master/.ruby-version) file)
|
||||
* PostgreSQL database
|
||||
* Chrome (for testing)
|
||||
|
||||
@@ -47,7 +47,11 @@ $ sudo -u postgres psql -c "CREATE USER ofn WITH SUPERUSER CREATEDB PASSWORD 'f0
|
||||
|
||||
This will create the "ofn" user as superuser and allowing it to create databases. If this command fails, check the [troubleshooting section](#creating-the-database) for an alternative.
|
||||
|
||||
Once done, run `script/setup`. If the script succeeds you're ready to start developing. If not, take a look at the output as it should be informative enough to help you troubleshoot.
|
||||
Next, it is _strongly recommended_ to run the setup script.
|
||||
```sh
|
||||
$ script/setup
|
||||
```
|
||||
If the script succeeds you're ready to start developing. If not, take a look at the output as it should be informative enough to help you troubleshoot.
|
||||
|
||||
Now, your dreams of spinning up a development server can be realised:
|
||||
|
||||
@@ -78,8 +82,6 @@ Note: If your OS is not explicitly supported in the setup guides then not all te
|
||||
|
||||
Note: The time zone on your machine should match the one defined in `config/application.yml`.
|
||||
|
||||
The project is configured to use [Zeus][zeus] to reduce the pre-test startup time while Rails loads. See the [Zeus GitHub page][zeus] for usage instructions.
|
||||
|
||||
Once [npm dependencies are installed][karma], AngularJS tests can be run with:
|
||||
|
||||
./script/karma run
|
||||
@@ -119,7 +121,6 @@ If these commands succeed, you should be able to [continue the setup process](#g
|
||||
[ubuntu]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-Ubuntu
|
||||
[debian]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Development-Environment-Setup:-Debian
|
||||
[wiki]: https://github.com/openfoodfoundation/openfoodnetwork/wiki
|
||||
[zeus]: https://github.com/burke/zeus
|
||||
[rubocop]: https://rubocop.readthedocs.io/en/latest/
|
||||
[karma]: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Karma
|
||||
[slack-dev]: https://openfoodnetwork.slack.com/messages/C2GQ45KNU
|
||||
|
||||
30
Gemfile
30
Gemfile
@@ -1,21 +1,21 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
ruby "2.5.8"
|
||||
ruby "2.5.9"
|
||||
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
||||
|
||||
gem 'rails', '~> 5.0.0'
|
||||
gem 'rails', '~> 5.2'
|
||||
|
||||
gem 'activemerchant', '>= 1.78.0'
|
||||
gem 'angular-rails-templates', '>= 0.3.0'
|
||||
gem 'awesome_nested_set'
|
||||
gem 'ransack', '2.3.0'
|
||||
gem 'ransack', '2.4.1'
|
||||
gem 'responders'
|
||||
gem 'sass', '<= 4.7.1'
|
||||
gem 'sass-rails', '< 6.0.0'
|
||||
|
||||
gem 'i18n'
|
||||
gem 'i18n-js', '~> 3.8.2'
|
||||
gem 'i18n-js', '~> 3.8.3'
|
||||
gem 'rails-i18n'
|
||||
gem 'rails_safe_tasks', '~> 1.0'
|
||||
|
||||
@@ -29,7 +29,7 @@ gem "order_management", path: "./engines/order_management"
|
||||
gem 'web', path: './engines/web'
|
||||
|
||||
gem 'activerecord-postgresql-adapter'
|
||||
gem 'pg', '~> 0.21.0'
|
||||
gem 'pg', '~> 1.2.3'
|
||||
|
||||
gem 'acts_as_list', '1.0.4'
|
||||
gem 'cancancan', '~> 1.15.0'
|
||||
@@ -52,7 +52,6 @@ gem 'oauth2', '~> 1.4.7' # Used for Stripe Connect
|
||||
|
||||
gem 'daemons'
|
||||
gem 'delayed_job_active_record'
|
||||
gem 'delayed_job_web'
|
||||
|
||||
gem 'kaminari', '~> 1.2.1'
|
||||
|
||||
@@ -75,11 +74,17 @@ gem 'dalli'
|
||||
gem 'figaro'
|
||||
gem 'geocoder'
|
||||
gem 'gmaps4rails'
|
||||
gem 'mimemagic', '> 0.3.5'
|
||||
gem 'paper_trail', '~> 10.3.1'
|
||||
gem 'paperclip', '~> 3.4.1'
|
||||
gem 'rack-rewrite'
|
||||
gem 'rack-ssl', require: 'rack/ssl'
|
||||
gem 'roadie-rails', '~> 1.3.0'
|
||||
gem 'roadie-rails', '~> 2.2.0'
|
||||
|
||||
gem 'redis', '>= 4.0', require: ['redis', 'redis/connection/hiredis']
|
||||
gem 'hiredis'
|
||||
gem 'sidekiq'
|
||||
gem 'sidekiq-scheduler'
|
||||
|
||||
gem 'combine_pdf'
|
||||
gem 'wicked_pdf'
|
||||
@@ -92,7 +97,7 @@ gem 'whenever', require: false
|
||||
|
||||
gem 'test-unit', '~> 3.4'
|
||||
|
||||
gem 'coffee-rails', '~> 4.2.2'
|
||||
gem 'coffee-rails', '~> 5.0.0'
|
||||
gem 'compass-rails'
|
||||
|
||||
gem 'mini_racer', '0.4.0'
|
||||
@@ -126,12 +131,11 @@ end
|
||||
|
||||
group :test, :development do
|
||||
# Pretty printed test output
|
||||
gem 'atomic'
|
||||
gem 'awesome_print'
|
||||
gem 'bullet'
|
||||
gem 'capybara'
|
||||
gem 'database_cleaner', require: false
|
||||
gem "factory_bot_rails", '6.1.0', require: false
|
||||
gem "factory_bot_rails", '6.2.0', require: false
|
||||
gem 'fuubar', '~> 2.5.1'
|
||||
gem 'json_spec', '~> 1.1.4'
|
||||
gem 'knapsack'
|
||||
@@ -152,6 +156,7 @@ group :test do
|
||||
gem 'test-prof'
|
||||
gem 'webmock'
|
||||
gem 'rails-controller-testing'
|
||||
gem 'pdf-reader'
|
||||
# See spec/spec_helper.rb for instructions
|
||||
# gem 'perftools.rb'
|
||||
end
|
||||
@@ -168,10 +173,5 @@ group :development do
|
||||
|
||||
gem "view_component_storybook", require: "view_component/storybook/engine"
|
||||
|
||||
# 1.0.9 fixed openssl issues on macOS https://github.com/eventmachine/eventmachine/issues/602
|
||||
# While we don't require this gem directly, no dependents forced the upgrade to a version
|
||||
# greater than 1.0.9, so we just required the latest available version here.
|
||||
gem 'eventmachine', '>= 1.2.3'
|
||||
|
||||
gem 'rack-mini-profiler', '< 3.0.0'
|
||||
end
|
||||
|
||||
276
Gemfile.lock
276
Gemfile.lock
@@ -47,58 +47,63 @@ PATH
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (5.0.7.2)
|
||||
actionpack (= 5.0.7.2)
|
||||
nio4r (>= 1.2, < 3.0)
|
||||
websocket-driver (~> 0.6.1)
|
||||
actionmailer (5.0.7.2)
|
||||
actionpack (= 5.0.7.2)
|
||||
actionview (= 5.0.7.2)
|
||||
activejob (= 5.0.7.2)
|
||||
Ascii85 (1.1.0)
|
||||
actioncable (5.2.6)
|
||||
actionpack (= 5.2.6)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailer (5.2.6)
|
||||
actionpack (= 5.2.6)
|
||||
actionview (= 5.2.6)
|
||||
activejob (= 5.2.6)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (5.0.7.2)
|
||||
actionview (= 5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
rack (~> 2.0)
|
||||
rack-test (~> 0.6.3)
|
||||
actionpack (5.2.6)
|
||||
actionview (= 5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
rack (~> 2.0, >= 2.0.8)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionpack-action_caching (1.2.1)
|
||||
actionpack-action_caching (1.2.2)
|
||||
actionpack (>= 4.0.0)
|
||||
actionview (5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
actionview (5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||
active_model_serializers (0.8.4)
|
||||
activemodel (>= 3.0)
|
||||
activejob (5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
activejob (5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
globalid (>= 0.3.6)
|
||||
activemerchant (1.119.0)
|
||||
activesupport (>= 4.2)
|
||||
builder (>= 2.1.2, < 4.0.0)
|
||||
i18n (>= 0.6.9)
|
||||
nokogiri (~> 1.4)
|
||||
activemodel (5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
activerecord (5.0.7.2)
|
||||
activemodel (= 5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
arel (~> 7.0)
|
||||
activerecord-import (1.0.8)
|
||||
activemodel (5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
activerecord (5.2.6)
|
||||
activemodel (= 5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
arel (>= 9.0)
|
||||
activerecord-import (1.1.0)
|
||||
activerecord (>= 3.2)
|
||||
activerecord-postgresql-adapter (0.0.1)
|
||||
pg
|
||||
activerecord-session_store (1.1.3)
|
||||
actionpack (>= 4.0)
|
||||
activerecord (>= 4.0)
|
||||
activerecord-session_store (2.0.0)
|
||||
actionpack (>= 5.2.4.1)
|
||||
activerecord (>= 5.2.4.1)
|
||||
multi_json (~> 1.11, >= 1.11.2)
|
||||
rack (>= 1.5.2, < 3)
|
||||
railties (>= 4.0)
|
||||
activesupport (5.0.7.2)
|
||||
rack (>= 2.0.8, < 3)
|
||||
railties (>= 5.2.4.1)
|
||||
activestorage (5.2.6)
|
||||
actionpack (= 5.2.6)
|
||||
activerecord (= 5.2.6)
|
||||
marcel (~> 1.0.0)
|
||||
activesupport (5.2.6)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
@@ -109,6 +114,7 @@ GEM
|
||||
activerecord (>= 4.2)
|
||||
addressable (2.7.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
afm (0.2.2)
|
||||
andand (1.3.3)
|
||||
angular-rails-templates (1.1.0)
|
||||
railties (>= 4.2, < 7)
|
||||
@@ -118,9 +124,8 @@ GEM
|
||||
railties (>= 3, < 7)
|
||||
angularjs-file-upload-rails (2.4.1)
|
||||
angularjs-rails (1.5.5)
|
||||
arel (7.1.4)
|
||||
arel (9.0.0)
|
||||
ast (2.4.2)
|
||||
atomic (1.1.101)
|
||||
awesome_nested_set (3.4.0)
|
||||
activerecord (>= 4.0.0, < 7.0)
|
||||
awesome_print (1.9.2)
|
||||
@@ -155,9 +160,9 @@ GEM
|
||||
codecov (0.5.2)
|
||||
simplecov (>= 0.15, < 0.22)
|
||||
coderay (1.1.3)
|
||||
coffee-rails (4.2.2)
|
||||
coffee-rails (5.0.0)
|
||||
coffee-script (>= 2.2.0)
|
||||
railties (>= 4.0.0)
|
||||
railties (>= 5.2.0)
|
||||
coffee-script (2.4.1)
|
||||
coffee-script-source
|
||||
execjs
|
||||
@@ -181,15 +186,16 @@ GEM
|
||||
sass-rails (< 5.1)
|
||||
sprockets (< 4.0)
|
||||
concurrent-ruby (1.1.8)
|
||||
connection_pool (2.2.5)
|
||||
crack (0.4.5)
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
css_parser (1.7.1)
|
||||
css_parser (1.9.0)
|
||||
addressable
|
||||
daemons (1.3.1)
|
||||
daemons (1.4.0)
|
||||
dalli (2.7.11)
|
||||
database_cleaner (1.99.0)
|
||||
ddtrace (0.48.0)
|
||||
ddtrace (0.49.0)
|
||||
ffi (~> 1.0)
|
||||
msgpack
|
||||
debugger-linecache (1.2.0)
|
||||
@@ -198,12 +204,7 @@ GEM
|
||||
delayed_job_active_record (4.1.6)
|
||||
activerecord (>= 3.0, < 6.2)
|
||||
delayed_job (>= 3.0, < 5)
|
||||
delayed_job_web (1.4.4)
|
||||
activerecord (> 3.0.0)
|
||||
delayed_job (> 2.0.3)
|
||||
rack-protection (>= 1.5.5)
|
||||
sinatra (>= 1.4.4)
|
||||
devise (4.7.3)
|
||||
devise (4.8.0)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (>= 4.1.0)
|
||||
@@ -215,15 +216,16 @@ GEM
|
||||
devise (>= 4.0.0, < 5.0.0)
|
||||
diff-lcs (1.4.4)
|
||||
docile (1.3.5)
|
||||
e2mmap (0.1.0)
|
||||
erubi (1.10.0)
|
||||
erubis (2.7.0)
|
||||
eventmachine (1.2.7)
|
||||
et-orbi (1.2.4)
|
||||
tzinfo
|
||||
excon (0.79.0)
|
||||
execjs (2.7.0)
|
||||
factory_bot (6.1.0)
|
||||
factory_bot (6.2.0)
|
||||
activesupport (>= 5.0.0)
|
||||
factory_bot_rails (6.1.0)
|
||||
factory_bot (~> 6.1.0)
|
||||
factory_bot_rails (6.2.0)
|
||||
factory_bot (~> 6.2.0)
|
||||
railties (>= 5.0.0)
|
||||
faraday (1.3.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
@@ -265,6 +267,9 @@ GEM
|
||||
foundation-rails (5.5.2.1)
|
||||
railties (>= 3.1.0)
|
||||
sass (>= 3.3.0, < 3.5)
|
||||
fugit (1.4.5)
|
||||
et-orbi (~> 1.1, >= 1.1.8)
|
||||
raabro (~> 1.4)
|
||||
fuubar (2.5.1)
|
||||
rspec-core (~> 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
@@ -281,10 +286,12 @@ GEM
|
||||
temple (>= 0.8.0)
|
||||
tilt
|
||||
hashdiff (1.0.1)
|
||||
hashery (2.1.2)
|
||||
highline (2.0.3)
|
||||
hiredis (0.6.3)
|
||||
i18n (1.8.10)
|
||||
concurrent-ruby (~> 1.0)
|
||||
i18n-js (3.8.2)
|
||||
i18n-js (3.8.3)
|
||||
i18n (>= 0.6.6)
|
||||
immigrant (0.3.6)
|
||||
activerecord (>= 3.0)
|
||||
@@ -302,7 +309,7 @@ GEM
|
||||
json_spec (1.1.5)
|
||||
multi_json (~> 1.0)
|
||||
rspec (>= 2.0, < 4.0)
|
||||
jwt (2.2.2)
|
||||
jwt (2.2.3)
|
||||
kaminari (1.2.1)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.1)
|
||||
@@ -323,17 +330,21 @@ GEM
|
||||
letter_opener (1.7.0)
|
||||
launchy (~> 2.2)
|
||||
libv8-node (15.14.0.0)
|
||||
loofah (2.9.0)
|
||||
loofah (2.9.1)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
marcel (1.0.1)
|
||||
method_source (1.0.0)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2020.1104)
|
||||
mini_mime (1.0.3)
|
||||
mini_portile2 (2.5.0)
|
||||
mimemagic (0.4.3)
|
||||
nokogiri (~> 1)
|
||||
rake
|
||||
mini_mime (1.1.0)
|
||||
mini_portile2 (2.5.1)
|
||||
mini_racer (0.4.0)
|
||||
libv8-node (~> 15.14.0.0)
|
||||
minitest (5.14.4)
|
||||
@@ -345,10 +356,8 @@ GEM
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.1.1)
|
||||
mustermann (1.1.1)
|
||||
ruby2_keywords (~> 0.0.1)
|
||||
nio4r (2.5.2)
|
||||
nokogiri (1.11.2)
|
||||
nio4r (2.5.7)
|
||||
nokogiri (1.11.4)
|
||||
mini_portile2 (~> 2.5.0)
|
||||
racc (~> 1.4)
|
||||
oauth2 (1.4.7)
|
||||
@@ -370,16 +379,20 @@ GEM
|
||||
parallel (1.20.1)
|
||||
paranoia (2.4.3)
|
||||
activerecord (>= 4.0, < 6.2)
|
||||
parser (3.0.1.0)
|
||||
parser (3.0.1.1)
|
||||
ast (~> 2.4.1)
|
||||
paypal-sdk-core (0.3.4)
|
||||
multi_json (~> 1.0)
|
||||
xml-simple
|
||||
paypal-sdk-merchant (1.117.2)
|
||||
paypal-sdk-core (~> 0.3.0)
|
||||
pg (0.21.0)
|
||||
polyamorous (2.3.0)
|
||||
activerecord (>= 5.0)
|
||||
pdf-reader (2.4.2)
|
||||
Ascii85 (~> 1.0)
|
||||
afm (~> 0.2.1)
|
||||
hashery (~> 2.0)
|
||||
ruby-rc4
|
||||
ttfunk
|
||||
pg (1.2.3)
|
||||
power_assert (2.0.0)
|
||||
pry (0.13.1)
|
||||
coderay (~> 1.1)
|
||||
@@ -388,6 +401,7 @@ GEM
|
||||
byebug (~> 11.0)
|
||||
pry (~> 0.13.0)
|
||||
public_suffix (4.0.6)
|
||||
raabro (1.4.0)
|
||||
racc (1.5.2)
|
||||
rack (2.2.3)
|
||||
rack-mini-profiler (2.3.2)
|
||||
@@ -397,19 +411,20 @@ GEM
|
||||
rack-rewrite (1.5.1)
|
||||
rack-ssl (1.4.1)
|
||||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (5.0.7.2)
|
||||
actioncable (= 5.0.7.2)
|
||||
actionmailer (= 5.0.7.2)
|
||||
actionpack (= 5.0.7.2)
|
||||
actionview (= 5.0.7.2)
|
||||
activejob (= 5.0.7.2)
|
||||
activemodel (= 5.0.7.2)
|
||||
activerecord (= 5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails (5.2.6)
|
||||
actioncable (= 5.2.6)
|
||||
actionmailer (= 5.2.6)
|
||||
actionpack (= 5.2.6)
|
||||
actionview (= 5.2.6)
|
||||
activejob (= 5.2.6)
|
||||
activemodel (= 5.2.6)
|
||||
activerecord (= 5.2.6)
|
||||
activestorage (= 5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
bundler (>= 1.3.0)
|
||||
railties (= 5.0.7.2)
|
||||
railties (= 5.2.6)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (1.0.5)
|
||||
actionpack (>= 5.0.1.rc1)
|
||||
@@ -424,25 +439,24 @@ GEM
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 5.0, < 6)
|
||||
rails_safe_tasks (1.0.0)
|
||||
railties (5.0.7.2)
|
||||
actionpack (= 5.0.7.2)
|
||||
activesupport (= 5.0.7.2)
|
||||
railties (5.2.6)
|
||||
actionpack (= 5.2.6)
|
||||
activesupport (= 5.2.6)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
thor (>= 0.19.0, < 2.0)
|
||||
rainbow (3.0.0)
|
||||
raindrops (0.19.1)
|
||||
rake (13.0.3)
|
||||
ransack (2.3.0)
|
||||
actionpack (>= 5.0)
|
||||
activerecord (>= 5.0)
|
||||
activesupport (>= 5.0)
|
||||
ransack (2.4.1)
|
||||
activerecord (>= 5.2.4)
|
||||
activesupport (>= 5.2.4)
|
||||
i18n
|
||||
polyamorous (= 2.3.0)
|
||||
rb-fsevent (0.10.4)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
redcarpet (3.5.1)
|
||||
redis (4.2.5)
|
||||
regexp_parser (2.1.1)
|
||||
request_store (1.5.0)
|
||||
rack (>= 1.4)
|
||||
@@ -450,12 +464,12 @@ GEM
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
roadie (3.5.1)
|
||||
roadie (4.0.0)
|
||||
css_parser (~> 1.4)
|
||||
nokogiri (~> 1.8)
|
||||
roadie-rails (1.3.0)
|
||||
railties (>= 3.0, < 5.3)
|
||||
roadie (~> 3.1)
|
||||
roadie-rails (2.2.0)
|
||||
railties (>= 5.1, < 6.2)
|
||||
roadie (>= 3.1, < 5.0)
|
||||
roo (2.8.3)
|
||||
nokogiri (~> 1)
|
||||
rubyzip (>= 1.3.0, < 3.0.0)
|
||||
@@ -471,10 +485,10 @@ GEM
|
||||
rspec-mocks (3.10.2)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.10.0)
|
||||
rspec-rails (4.1.2)
|
||||
actionpack (>= 4.2)
|
||||
activesupport (>= 4.2)
|
||||
railties (>= 4.2)
|
||||
rspec-rails (5.0.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
@@ -495,25 +509,27 @@ GEM
|
||||
rswag-ui (2.4.0)
|
||||
actionpack (>= 3.1, < 7.0)
|
||||
railties (>= 3.1, < 7.0)
|
||||
rubocop (1.13.0)
|
||||
rubocop (1.15.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.0.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.2.0, < 2.0)
|
||||
rubocop-ast (>= 1.5.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.4.1)
|
||||
parser (>= 2.7.1.5)
|
||||
rubocop-rails (2.9.1)
|
||||
rubocop-ast (1.5.0)
|
||||
parser (>= 3.0.1.1)
|
||||
rubocop-rails (2.10.1)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 0.90.0, < 2.0)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby-rc4 (0.1.5)
|
||||
ruby2_keywords (0.0.2)
|
||||
rubyzip (2.3.0)
|
||||
rufus-scheduler (3.7.0)
|
||||
fugit (~> 1.1, >= 1.1.6)
|
||||
sass (3.4.25)
|
||||
sass-rails (5.0.7)
|
||||
railties (>= 4.0.0, < 6)
|
||||
@@ -529,17 +545,23 @@ GEM
|
||||
rubyzip (>= 1.2.2)
|
||||
shoulda-matchers (4.5.1)
|
||||
activesupport (>= 4.2.0)
|
||||
sidekiq (6.2.1)
|
||||
connection_pool (>= 2.2.2)
|
||||
rack (~> 2.0)
|
||||
redis (>= 4.2.0)
|
||||
sidekiq-scheduler (3.0.1)
|
||||
e2mmap
|
||||
redis (>= 3, < 5)
|
||||
rufus-scheduler (~> 3.2)
|
||||
sidekiq (>= 3)
|
||||
thwait
|
||||
tilt (>= 1.4.0)
|
||||
simplecov (0.21.2)
|
||||
docile (~> 1.1)
|
||||
simplecov-html (~> 0.11)
|
||||
simplecov_json_formatter (~> 0.1)
|
||||
simplecov-html (0.12.3)
|
||||
simplecov_json_formatter (0.1.2)
|
||||
sinatra (2.1.0)
|
||||
mustermann (~> 1.0)
|
||||
rack (~> 2.2)
|
||||
rack-protection (= 2.1.0)
|
||||
tilt (~> 2.0)
|
||||
spring (2.1.1)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
@@ -551,22 +573,25 @@ GEM
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
state_machines (0.5.0)
|
||||
state_machines-activemodel (0.7.1)
|
||||
activemodel (>= 4.1)
|
||||
state_machines-activemodel (0.8.0)
|
||||
activemodel (>= 5.1)
|
||||
state_machines (>= 0.5.0)
|
||||
state_machines-activerecord (0.6.0)
|
||||
activerecord (>= 4.1)
|
||||
state_machines-activemodel (>= 0.5.0)
|
||||
state_machines-activerecord (0.8.0)
|
||||
activerecord (>= 5.1)
|
||||
state_machines-activemodel (>= 0.8.0)
|
||||
stringex (2.8.5)
|
||||
stripe (5.30.0)
|
||||
temple (0.8.2)
|
||||
test-prof (1.0.2)
|
||||
test-unit (3.4.1)
|
||||
test-prof (1.0.5)
|
||||
test-unit (3.4.2)
|
||||
power_assert
|
||||
thor (0.20.3)
|
||||
thread_safe (0.3.6)
|
||||
thwait (0.2.0)
|
||||
e2mmap
|
||||
tilt (2.0.10)
|
||||
timecop (0.9.4)
|
||||
ttfunk (1.7.0)
|
||||
tzinfo (1.2.9)
|
||||
thread_safe (~> 0.1)
|
||||
uglifier (4.2.0)
|
||||
@@ -582,7 +607,7 @@ GEM
|
||||
get_process_mem (~> 0)
|
||||
unicorn (>= 4, < 7)
|
||||
uniform_notifier (1.14.1)
|
||||
view_component (2.31.1)
|
||||
view_component (2.32.0)
|
||||
activesupport (>= 5.0.0, < 7.0)
|
||||
view_component_storybook (0.8.0)
|
||||
view_component (>= 2.2)
|
||||
@@ -592,11 +617,11 @@ GEM
|
||||
nokogiri (~> 1.6)
|
||||
rubyzip (>= 1.3.0)
|
||||
selenium-webdriver (>= 3.0, < 4.0)
|
||||
webmock (3.12.2)
|
||||
webmock (3.13.0)
|
||||
addressable (>= 2.3.6)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-driver (0.7.3)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
whenever (1.0.0)
|
||||
@@ -625,7 +650,6 @@ DEPENDENCIES
|
||||
angular_rails_csrf
|
||||
angularjs-file-upload-rails (~> 2.4.1)
|
||||
angularjs-rails (= 1.5.5)
|
||||
atomic
|
||||
awesome_nested_set
|
||||
awesome_print
|
||||
aws-sdk (= 1.67.0)
|
||||
@@ -636,7 +660,7 @@ DEPENDENCIES
|
||||
capybara
|
||||
catalog!
|
||||
codecov
|
||||
coffee-rails (~> 4.2.2)
|
||||
coffee-rails (~> 5.0.0)
|
||||
combine_pdf
|
||||
compass-rails
|
||||
custom_error_message!
|
||||
@@ -647,13 +671,11 @@ DEPENDENCIES
|
||||
ddtrace
|
||||
debugger-linecache
|
||||
delayed_job_active_record
|
||||
delayed_job_web
|
||||
devise
|
||||
devise-encryptable
|
||||
devise-token_authenticatable
|
||||
dfc_provider!
|
||||
eventmachine (>= 1.2.3)
|
||||
factory_bot_rails (= 6.1.0)
|
||||
factory_bot_rails (= 6.2.0)
|
||||
ffaker
|
||||
figaro
|
||||
flipper
|
||||
@@ -668,8 +690,9 @@ DEPENDENCIES
|
||||
good_migrations
|
||||
haml
|
||||
highline (= 2.0.3)
|
||||
hiredis
|
||||
i18n
|
||||
i18n-js (~> 3.8.2)
|
||||
i18n-js (~> 3.8.3)
|
||||
immigrant
|
||||
jquery-migrate-rails
|
||||
jquery-rails (= 4.4.0)
|
||||
@@ -680,6 +703,7 @@ DEPENDENCIES
|
||||
kaminari (~> 1.2.1)
|
||||
knapsack
|
||||
letter_opener (>= 1.4.1)
|
||||
mimemagic (> 0.3.5)
|
||||
mini_racer (= 0.4.0)
|
||||
monetize (~> 1.11)
|
||||
oauth2 (~> 1.4.7)
|
||||
@@ -689,20 +713,22 @@ DEPENDENCIES
|
||||
paperclip (~> 3.4.1)
|
||||
paranoia (~> 2.4)
|
||||
paypal-sdk-merchant (= 1.117.2)
|
||||
pg (~> 0.21.0)
|
||||
pdf-reader
|
||||
pg (~> 1.2.3)
|
||||
pry
|
||||
pry-byebug
|
||||
rack-mini-profiler (< 3.0.0)
|
||||
rack-rewrite
|
||||
rack-ssl
|
||||
rails (~> 5.0.0)
|
||||
rails (~> 5.2)
|
||||
rails-controller-testing
|
||||
rails-i18n
|
||||
rails_safe_tasks (~> 1.0)
|
||||
ransack (= 2.3.0)
|
||||
ransack (= 2.4.1)
|
||||
redcarpet
|
||||
redis (>= 4.0)
|
||||
responders
|
||||
roadie-rails (~> 1.3.0)
|
||||
roadie-rails (~> 2.2.0)
|
||||
roo (~> 2.8.3)
|
||||
rspec-rails (>= 3.5.2)
|
||||
rspec-retry
|
||||
@@ -714,6 +740,8 @@ DEPENDENCIES
|
||||
select2-rails (~> 3.4.7)
|
||||
selenium-webdriver
|
||||
shoulda-matchers
|
||||
sidekiq
|
||||
sidekiq-scheduler
|
||||
simplecov
|
||||
spring
|
||||
spring-commands-rspec
|
||||
@@ -736,7 +764,7 @@ DEPENDENCIES
|
||||
wkhtmltopdf-binary
|
||||
|
||||
RUBY VERSION
|
||||
ruby 2.5.8p224
|
||||
ruby 2.5.9p229
|
||||
|
||||
BUNDLED WITH
|
||||
1.17.3
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter) ->
|
||||
angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter, unlocalizeCurrencyFilter) ->
|
||||
class UnitPrices
|
||||
@displayableUnitPrice: (price, scale, unit_type, unit_value, variant_unit_name) ->
|
||||
price = unlocalizeCurrencyFilter(price)
|
||||
if price && !isNaN(price) && unit_type && unit_value
|
||||
value = localizeCurrencyFilter(UnitPrices.price(price, scale, unit_type, unit_value, variant_unit_name))
|
||||
unit = UnitPrices.unit(scale, unit_type, variant_unit_name)
|
||||
@@ -29,4 +30,4 @@ angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, loca
|
||||
else if unit_type == "weight"
|
||||
"kg"
|
||||
else if unit_type == "volume"
|
||||
"L"
|
||||
"L"
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
angular.module("admin.utils").filter "unlocalizeCurrency", ()->
|
||||
# Convert string to number using injected currency configuration.
|
||||
(price) ->
|
||||
# used decimal and thousands separators from currency configuration
|
||||
decimal_separator = I18n.toCurrency(.1, {precision: 1, unit: ''}).substring(1,2)
|
||||
thousands_separator = I18n.toCurrency(1000, {precision: 1, unit: ''}).substring(1,2)
|
||||
|
||||
if (price.length > 4)
|
||||
# remove configured thousands separator if price is greater than 999
|
||||
price = price.replaceAll(thousands_separator, '')
|
||||
|
||||
if (decimal_separator == ",")
|
||||
price = price.replace(",", ".")
|
||||
|
||||
return parseFloat(price)
|
||||
@@ -3,7 +3,7 @@ Darkswarm.controller "EditBoughtOrderController", ($scope, $resource, $timeout,
|
||||
$scope.removeEnabled = true
|
||||
|
||||
$scope.deleteLineItem = (id) ->
|
||||
if Cart.has_one_line_item()
|
||||
if Cart.isOnlyItemInOrder(id)
|
||||
Messages.error(t 'orders_cannot_remove_the_final_item')
|
||||
$scope.removeEnabled = false
|
||||
$timeout (->
|
||||
|
||||
@@ -115,8 +115,9 @@ Darkswarm.factory 'Cart', (CurrentOrder, Variants, $timeout, $http, $modal, $roo
|
||||
@line_items = []
|
||||
localStorageService.clearAll() # One day this will have to be moar GRANULAR
|
||||
|
||||
has_one_line_item: =>
|
||||
@line_items_finalised.length == 1
|
||||
isOnlyItemInOrder: (id) =>
|
||||
deletedItem = @line_items_finalised.find((item) -> item.id == id)
|
||||
@line_items_finalised.filter((item) -> item.order_id == deletedItem.order_id).length == 1
|
||||
|
||||
removeFinalisedLineItem: (id) =>
|
||||
@line_items_finalised = @line_items_finalised.filter (item) ->
|
||||
|
||||
@@ -10,7 +10,7 @@ Darkswarm.service "GmapsGeo", ->
|
||||
# console.log "Error: #{status}"
|
||||
geocode: (address, callback) ->
|
||||
geocoder = new google.maps.Geocoder()
|
||||
geocoder.geocode {'address': address, 'region': "<%= Spree::Country.find_by(id: Spree::Config[:default_country_id]).iso %>"}, callback
|
||||
geocoder.geocode {'address': address, 'region': "<%= DefaultCountry.code %>"}, callback
|
||||
|
||||
distanceBetween: (src, dst) ->
|
||||
google.maps.geometry.spherical.computeDistanceBetween @toLatLng(src), @toLatLng(dst)
|
||||
@@ -20,4 +20,4 @@ Darkswarm.service "GmapsGeo", ->
|
||||
if locatable.lat?
|
||||
locatable
|
||||
else
|
||||
new google.maps.LatLng locatable.latitude, locatable.longitude
|
||||
new google.maps.LatLng locatable.latitude, locatable.longitude
|
||||
|
||||
@@ -35,7 +35,7 @@ module Admin
|
||||
if @line_item.update(line_item_params)
|
||||
order.update_line_item_fees! @line_item
|
||||
order.update_order_fees!
|
||||
order.update!
|
||||
order.update_order!
|
||||
render body: nil, status: :no_content # No Content, does not trigger ng resource auto-update
|
||||
else
|
||||
render json: { errors: @line_item.errors }, status: :precondition_failed
|
||||
|
||||
@@ -28,9 +28,7 @@ module Admin
|
||||
def build_resource
|
||||
enterprise_group = super
|
||||
enterprise_group.address = Spree::Address.new
|
||||
enterprise_group.address.country = Spree::Country.find_by(
|
||||
id: Spree::Config[:default_country_id]
|
||||
)
|
||||
enterprise_group.address.country = DefaultCountry.country
|
||||
enterprise_group
|
||||
end
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ module Admin
|
||||
def build_resource
|
||||
enterprise = super
|
||||
enterprise.address ||= Spree::Address.new
|
||||
enterprise.address.country ||= Spree::Country.find_by(id: Spree::Config[:default_country_id])
|
||||
enterprise.address.country ||= DefaultCountry.country
|
||||
enterprise
|
||||
end
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Base controller for OFN's API
|
||||
require_dependency 'spree/api/controller_setup'
|
||||
require "spree/api/controller_setup"
|
||||
require "spree/core/controller_helpers/ssl"
|
||||
|
||||
module Api
|
||||
|
||||
@@ -44,9 +44,9 @@ module Api
|
||||
authorize! :update, @enterprise
|
||||
|
||||
if params[:logo] && @enterprise.update( logo: params[:logo] )
|
||||
render plain: @enterprise.logo.url(:medium), status: :ok
|
||||
render html: @enterprise.logo.url(:medium), status: :ok
|
||||
elsif params[:promo] && @enterprise.update( promo_image: params[:promo] )
|
||||
render plain: @enterprise.promo_image.url(:medium), status: :ok
|
||||
render html: @enterprise.promo_image.url(:medium), status: :ok
|
||||
else
|
||||
invalid_resource!(@enterprise)
|
||||
end
|
||||
|
||||
@@ -16,7 +16,7 @@ module Api
|
||||
quantity = params[:quantity].to_i
|
||||
@shipment = get_or_create_shipment(params[:stock_location_id])
|
||||
|
||||
@order.contents.add(variant, quantity, nil, @shipment)
|
||||
@order.contents.add(variant, quantity, @shipment)
|
||||
|
||||
@shipment.refresh_rates
|
||||
@shipment.save!
|
||||
@@ -31,10 +31,12 @@ module Api
|
||||
unlock = params[:shipment].delete(:unlock)
|
||||
|
||||
if unlock == 'yes'
|
||||
@shipment.fee_adjustment.open
|
||||
@shipment.fee_adjustment.fire_events(:open)
|
||||
end
|
||||
|
||||
@shipment.update(shipment_params[:shipment])
|
||||
if @shipment.update(shipment_params)
|
||||
@order.updater.update_totals_and_states
|
||||
end
|
||||
|
||||
if unlock == 'yes'
|
||||
@shipment.fee_adjustment.close
|
||||
@@ -68,7 +70,7 @@ module Api
|
||||
variant = scoped_variant(params[:variant_id])
|
||||
quantity = params[:quantity].to_i
|
||||
|
||||
@order.contents.add(variant, quantity, nil, @shipment)
|
||||
@order.contents.add(variant, quantity, @shipment)
|
||||
@order.recreate_all_fees!
|
||||
|
||||
render json: @shipment, serializer: Api::ShipmentSerializer, status: :ok
|
||||
@@ -94,7 +96,7 @@ module Api
|
||||
|
||||
def find_and_update_shipment
|
||||
@shipment = @order.shipments.find_by!(number: params[:id])
|
||||
@shipment.update(shipment_params[:shipment]) if shipment_params[:shipment].present?
|
||||
@shipment.update(shipment_params)
|
||||
@shipment.reload
|
||||
end
|
||||
|
||||
@@ -113,10 +115,9 @@ module Api
|
||||
end
|
||||
|
||||
def shipment_params
|
||||
params.permit(
|
||||
[:id, :order_id, :variant_id, :quantity,
|
||||
{ shipment: [:tracking, :selected_shipping_rate_id] }]
|
||||
)
|
||||
return {} unless params.has_key? :shipment
|
||||
|
||||
params.require(:shipment).permit(:tracking, :selected_shipping_rate_id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_dependency 'spree/authentication_helpers'
|
||||
require "spree/authentication_helpers"
|
||||
require "application_responder"
|
||||
require 'cancan'
|
||||
require 'spree/core/controller_helpers/auth'
|
||||
@@ -13,6 +13,20 @@ class ApplicationController < ActionController::Base
|
||||
self.responder = ApplicationResponder
|
||||
respond_to :html
|
||||
|
||||
helper 'spree/base'
|
||||
helper 'spree/orders'
|
||||
helper 'spree/payment_methods'
|
||||
helper 'shared'
|
||||
helper 'enterprises'
|
||||
helper 'order_cycles'
|
||||
helper 'order'
|
||||
helper 'shop'
|
||||
helper 'injection'
|
||||
helper 'markdown'
|
||||
helper 'footer_links'
|
||||
helper 'discourse'
|
||||
helper 'checkout'
|
||||
|
||||
protect_from_forgery
|
||||
|
||||
include Spree::Core::ControllerHelpers::Auth
|
||||
|
||||
@@ -13,8 +13,6 @@ class BaseController < ApplicationController
|
||||
include I18nHelper
|
||||
include OrderCyclesHelper
|
||||
|
||||
helper 'spree/base'
|
||||
|
||||
before_action :set_locale
|
||||
before_action :check_order_cycle_expiry
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ class CheckoutController < ::BaseController
|
||||
flash[:error] = I18n.t("checkout.failed")
|
||||
action_failed(e)
|
||||
ensure
|
||||
@order.update!
|
||||
@order.update_order!
|
||||
end
|
||||
|
||||
# Clears the cached order. Required for #current_order to return a new order
|
||||
|
||||
@@ -43,7 +43,7 @@ class LineItemsController < BaseController
|
||||
order.update_shipping_fees!
|
||||
order.update_payment_fees!
|
||||
order.update_order_fees!
|
||||
order.update!
|
||||
order.update_order!
|
||||
order.create_tax_charge!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,9 +2,12 @@ require 'open_food_network/spree_api_key_loader'
|
||||
|
||||
class RegistrationController < BaseController
|
||||
include OpenFoodNetwork::SpreeApiKeyLoader
|
||||
|
||||
layout 'registration'
|
||||
helper 'map'
|
||||
|
||||
before_action :load_spree_api_key, only: [:index]
|
||||
before_action :check_user, except: :authenticate
|
||||
layout 'registration'
|
||||
|
||||
def index
|
||||
@enterprise_attributes = { sells: 'none' }
|
||||
|
||||
@@ -14,7 +14,7 @@ module Spree
|
||||
|
||||
def update_order
|
||||
@order.reload
|
||||
@order.update!
|
||||
@order.update_order!
|
||||
end
|
||||
|
||||
def collection
|
||||
|
||||
@@ -3,7 +3,15 @@ module Spree
|
||||
class BaseController < ApplicationController
|
||||
ssl_required
|
||||
|
||||
helper 'shared'
|
||||
helper 'spree/admin/navigation'
|
||||
helper 'spree/admin/orders'
|
||||
helper 'admin/injection'
|
||||
helper 'admin/orders'
|
||||
helper 'admin/enterprises'
|
||||
helper 'enterprise_fees'
|
||||
helper 'angular_form'
|
||||
|
||||
layout '/spree/layouts/admin'
|
||||
|
||||
include I18nHelper
|
||||
|
||||
@@ -68,20 +68,20 @@ module Spree
|
||||
rescue Spree::Core::GatewayError => e
|
||||
flash[:error] = e.message.to_s
|
||||
ensure
|
||||
redirect_to :back
|
||||
redirect_back fallback_location: spree.admin_dashboard_path
|
||||
end
|
||||
|
||||
def resend
|
||||
Spree::OrderMailer.confirm_email_for_customer(@order.id, true).deliver_later
|
||||
flash[:success] = t('admin.orders.order_email_resent')
|
||||
|
||||
respond_with(@order) { |format| format.html { redirect_to :back } }
|
||||
respond_with(@order) do |format|
|
||||
format.html { redirect_back(fallback_location: spree.admin_dashboard_path) }
|
||||
end
|
||||
end
|
||||
|
||||
def invoice
|
||||
pdf = InvoiceRenderer.new.render_to_string(@order)
|
||||
|
||||
Spree::OrderMailer.invoice_email(@order.id, pdf).deliver_later
|
||||
Spree::OrderMailer.invoice_email(@order.id).deliver_later
|
||||
flash[:success] = t('admin.orders.invoice_email_sent')
|
||||
|
||||
respond_with(@order) { |format|
|
||||
|
||||
@@ -9,6 +9,10 @@ module Spree
|
||||
before_action :load_payment, only: [:fire, :show]
|
||||
before_action :load_data
|
||||
before_action :can_transition_to_payment
|
||||
# We ensure that items are in stock before all screens if the order is in the Payment state.
|
||||
# This way, we don't allow someone to enter credit card details for an order only to be told
|
||||
# that it can't be processed.
|
||||
before_action :ensure_sufficient_stock_lines
|
||||
|
||||
respond_to :html
|
||||
|
||||
@@ -142,6 +146,20 @@ module Spree
|
||||
redirect_to spree.edit_admin_order_customer_url(@order)
|
||||
end
|
||||
|
||||
def ensure_sufficient_stock_lines
|
||||
return if !@order.payment? || @order.insufficient_stock_lines.blank?
|
||||
|
||||
flash[:error] = I18n.t("spree.orders.line_item.insufficient_stock",
|
||||
on_hand: "0 #{out_of_stock_item_names}")
|
||||
redirect_to spree.edit_admin_order_url(@order)
|
||||
end
|
||||
|
||||
def out_of_stock_item_names
|
||||
@order.insufficient_stock_lines.map do |line_item|
|
||||
line_item.variant.name
|
||||
end.join(", ")
|
||||
end
|
||||
|
||||
def load_order
|
||||
@order = Order.find_by!(number: params[:order_id])
|
||||
authorize! action, @order
|
||||
|
||||
@@ -8,7 +8,7 @@ module Spree
|
||||
def fire
|
||||
@return_authorization.public_send("#{params[:e]}!")
|
||||
flash[:success] = Spree.t(:return_authorization_updated)
|
||||
redirect_to :back
|
||||
redirect_back fallback_location: spree.admin_dashboard_path
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
@@ -14,7 +14,7 @@ module Spree
|
||||
respond_to :html
|
||||
respond_to :json
|
||||
|
||||
before_action :update_distribution, only: :update
|
||||
before_action :set_current_order, only: :update
|
||||
before_action :filter_order_params, only: :update
|
||||
before_action :enable_embedded_shopfront
|
||||
|
||||
@@ -26,8 +26,8 @@ module Spree
|
||||
|
||||
def show
|
||||
@order = Spree::Order.find_by!(number: params[:id])
|
||||
ProcessPaymentIntent.new(params["payment_intent"], @order).call!
|
||||
@order.reload
|
||||
|
||||
handle_stripe_response
|
||||
end
|
||||
|
||||
def empty
|
||||
@@ -62,7 +62,7 @@ module Spree
|
||||
associate_user
|
||||
|
||||
if @order.insufficient_stock_lines.present? || @unavailable_order_variants.present?
|
||||
flash[:error] = t("spree.orders.error_flash_for_unavailable_items")
|
||||
flash.now[:error] = t("spree.orders.error_flash_for_unavailable_items")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -95,7 +95,7 @@ module Spree
|
||||
@order.next_transition.run_callbacks if @order.cart?
|
||||
redirect_to main_app.checkout_state_path(@order.checkout_steps.first)
|
||||
elsif @order.complete?
|
||||
redirect_to order_path(@order)
|
||||
redirect_to main_app.order_path(@order)
|
||||
else
|
||||
redirect_to main_app.cart_path
|
||||
end
|
||||
@@ -109,24 +109,8 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def update_distribution
|
||||
def set_current_order
|
||||
@order = current_order(true)
|
||||
|
||||
if params[:commit] == 'Choose Hub'
|
||||
distributor = Enterprise.is_distributor.find params[:order][:distributor_id]
|
||||
@order.set_distributor! distributor
|
||||
|
||||
flash[:notice] = I18n.t(:order_choosing_hub_notice)
|
||||
redirect_to request.referer
|
||||
|
||||
elsif params[:commit] == 'Choose Order Cycle'
|
||||
@order.empty! # empty cart
|
||||
order_cycle = OrderCycle.active.find params[:order][:order_cycle_id]
|
||||
@order.set_order_cycle! order_cycle
|
||||
|
||||
flash[:notice] = I18n.t(:order_choosing_hub_notice)
|
||||
redirect_to request.referer
|
||||
end
|
||||
end
|
||||
|
||||
def filter_order_params
|
||||
@@ -151,11 +135,24 @@ module Spree
|
||||
else
|
||||
flash[:error] = I18n.t(:orders_could_not_cancel)
|
||||
end
|
||||
redirect_to request.referer || order_path(@order)
|
||||
redirect_to request.referer || main_app.order_path(@order)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Stripe can redirect here after a payment is processed in the backoffice.
|
||||
# We verify if it was successful here and persist the changes.
|
||||
def handle_stripe_response
|
||||
return unless params.key?("payment_intent")
|
||||
|
||||
result = ProcessPaymentIntent.new(params["payment_intent"], @order).call!
|
||||
|
||||
unless result.ok?
|
||||
flash.now[:error] = "#{I18n.t("payment_could_not_process")}. #{result.error}"
|
||||
end
|
||||
@order.reload
|
||||
end
|
||||
|
||||
def discard_empty_line_items
|
||||
@order.line_items = @order.line_items.select { |li| li.quantity > 0 }
|
||||
end
|
||||
@@ -191,7 +188,7 @@ module Spree
|
||||
|
||||
if items.empty?
|
||||
flash[:error] = I18n.t(:orders_cannot_remove_the_final_item)
|
||||
redirect_to order_path(order_to_update)
|
||||
redirect_to main_app.order_path(order_to_update)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ module Spree
|
||||
|
||||
def show
|
||||
@payments_requiring_action = PaymentsRequiringAction.new(spree_current_user).query
|
||||
@orders = orders_collection
|
||||
@orders = orders_collection.includes(:line_items)
|
||||
|
||||
customers = spree_current_user.customers
|
||||
@shops = Enterprise
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
module Spree
|
||||
module Admin
|
||||
module PaymentsHelper
|
||||
def payment_method_name(payment)
|
||||
# hack to allow us to retrieve the name of a "deleted" payment method
|
||||
id = payment.payment_method_id
|
||||
Spree::PaymentMethod.find_with_destroyed(id).name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
13
app/helpers/spree/payment_methods_helper.rb
Normal file
13
app/helpers/spree/payment_methods_helper.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
module Spree
|
||||
module PaymentMethodsHelper
|
||||
def payment_method(payment)
|
||||
# hack to allow us to retrieve the name of a "deleted" payment method
|
||||
id = payment.payment_method_id
|
||||
Spree::PaymentMethod.find_with_destroyed(id)
|
||||
end
|
||||
|
||||
def payment_method_name(payment)
|
||||
payment_method(payment).name
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -90,13 +90,13 @@ class SubscriptionConfirmJob < ActiveJob::Base
|
||||
end
|
||||
|
||||
def send_confirmation_email(order)
|
||||
order.update!
|
||||
order.update_order!
|
||||
record_success(order)
|
||||
SubscriptionMailer.confirmation_email(order).deliver_now
|
||||
end
|
||||
|
||||
def send_failed_payment_email(order, error_message = nil)
|
||||
order.update!
|
||||
order.update_order!
|
||||
record_and_log_error(:failed_payment, order, error_message)
|
||||
SubscriptionMailer.failed_payment_email(order).deliver_now
|
||||
rescue StandardError => e
|
||||
|
||||
@@ -77,7 +77,7 @@ class SubscriptionPlacementJob < ActiveJob::Base
|
||||
|
||||
def handle_empty_order(order, changes)
|
||||
order.reload.all_adjustments.destroy_all
|
||||
order.update!
|
||||
order.update_order!
|
||||
send_empty_email(order, changes)
|
||||
end
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ module Spree
|
||||
class OrderMailer < BaseMailer
|
||||
helper 'checkout'
|
||||
helper SpreeCurrencyHelper
|
||||
helper Spree::Admin::PaymentsHelper
|
||||
helper Spree::PaymentMethodsHelper
|
||||
helper OrderHelper
|
||||
helper MailerHelper
|
||||
include I18nHelper
|
||||
@@ -49,8 +49,10 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def invoice_email(order_or_order_id, pdf)
|
||||
def invoice_email(order_or_order_id)
|
||||
@order = find_order(order_or_order_id)
|
||||
pdf = InvoiceRenderer.new.render_to_string(@order)
|
||||
|
||||
attach_file("invoice-#{@order.number}.pdf", pdf)
|
||||
I18n.with_locale valid_locale(@order.user) do
|
||||
mail(to: @order.email,
|
||||
|
||||
@@ -3,7 +3,7 @@ class SubscriptionMailer < Spree::BaseMailer
|
||||
helper MailerHelper
|
||||
helper ShopMailHelper
|
||||
helper OrderHelper
|
||||
helper Spree::Admin::PaymentsHelper
|
||||
helper Spree::PaymentMethodsHelper
|
||||
include I18nHelper
|
||||
|
||||
def confirmation_email(order)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
require 'open_food_network/enterprise_fee_calculator'
|
||||
|
||||
module Calculator
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
require 'spree/localized_number'
|
||||
|
||||
module Calculator
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
require_dependency 'spree/calculator'
|
||||
require 'spree/localized_number'
|
||||
|
||||
class Calculator::FlatPercentPerItem < Spree::Calculator
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
require 'spree/localized_number'
|
||||
|
||||
module Calculator
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
require 'spree/localized_number'
|
||||
|
||||
module Calculator
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
require 'spree/localized_number'
|
||||
|
||||
module Calculator
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
require_dependency 'spree/calculator'
|
||||
# For #to_d method on Ruby 1.8
|
||||
require 'bigdecimal/util'
|
||||
require 'spree/localized_number'
|
||||
|
||||
@@ -105,7 +105,7 @@ class Enterprise < ApplicationRecord
|
||||
after_touch :touch_distributors
|
||||
after_create :set_default_contact
|
||||
after_create :relate_to_owners_enterprises
|
||||
after_create :send_welcome_email
|
||||
after_create_commit :send_welcome_email
|
||||
|
||||
after_rollback :restore_permalink
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ module Spree
|
||||
|
||||
def self.default
|
||||
country = begin
|
||||
Spree::Country.find(Spree::Config[:default_country_id])
|
||||
DefaultCountry.country
|
||||
rescue StandardError
|
||||
Spree::Country.first
|
||||
end
|
||||
|
||||
@@ -96,7 +96,7 @@ module Spree
|
||||
# more than on line items at once via accepted_nested_attributes the order
|
||||
# object on the association would be in a old state and therefore the
|
||||
# adjustment calculations would not performed on proper values
|
||||
def update!(calculable = nil, force: false)
|
||||
def update_adjustment!(calculable = nil, force: false)
|
||||
return amount if immutable? && !force
|
||||
|
||||
if originator.present?
|
||||
@@ -127,11 +127,7 @@ module Spree
|
||||
end
|
||||
|
||||
def set_absolute_included_tax!(tax)
|
||||
# This rubocop issue can now fixed by renaming Adjustment#update! to something else,
|
||||
# then AR's update! can be used instead of update_attributes!
|
||||
# rubocop:disable Rails/ActiveRecordAliases
|
||||
update_attributes! included_tax: tax.round(2)
|
||||
# rubocop:enable Rails/ActiveRecordAliases
|
||||
update! included_tax: tax.round(2)
|
||||
end
|
||||
|
||||
def display_included_tax
|
||||
|
||||
@@ -147,7 +147,7 @@ module Spree
|
||||
end
|
||||
|
||||
def default_card_needs_updating?
|
||||
is_default_changed? || gateway_customer_profile_id_changed?
|
||||
saved_change_to_is_default? || saved_change_to_gateway_customer_profile_id?
|
||||
end
|
||||
|
||||
def ensure_single_default_card
|
||||
|
||||
@@ -87,7 +87,7 @@ module Spree
|
||||
)
|
||||
refund_transaction_response = provider.refund_transaction(refund_transaction)
|
||||
if refund_transaction_response.success?
|
||||
payment.source.update_attributes(
|
||||
payment.source.update(
|
||||
refunded_at: Time.now,
|
||||
refund_transaction_id: refund_transaction_response.RefundTransactionID,
|
||||
state: "refunded",
|
||||
|
||||
@@ -129,7 +129,19 @@ module Spree
|
||||
payment = fetch_payment(creditcard, gateway_options)
|
||||
raise Stripe::StripeError, I18n.t(:no_pending_payments) unless payment&.response_code
|
||||
|
||||
Stripe::PaymentIntentValidator.new.call(payment.response_code, stripe_account_id)
|
||||
payment_intent_response = Stripe::PaymentIntentValidator.new.
|
||||
call(payment.response_code, stripe_account_id)
|
||||
|
||||
raise_if_not_in_capture_state(payment_intent_response)
|
||||
|
||||
payment.response_code
|
||||
end
|
||||
|
||||
def raise_if_not_in_capture_state(payment_intent_response)
|
||||
state = payment_intent_response.status
|
||||
return if state == 'requires_capture'
|
||||
|
||||
raise Stripe::StripeError, I18n.t(:invalid_payment_state, state: state)
|
||||
end
|
||||
|
||||
def fetch_payment(creditcard, gateway_options)
|
||||
|
||||
@@ -66,7 +66,7 @@ module Spree
|
||||
end
|
||||
|
||||
def update_order
|
||||
order.update!
|
||||
order.update_order!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,9 +17,9 @@ module Spree
|
||||
end
|
||||
|
||||
def update_adjustments
|
||||
adjustment_total = adjustments.additional.map(&:update!).compact.sum
|
||||
included_tax_total = tax_adjustments.inclusive.reload.map(&:update!).compact.sum
|
||||
additional_tax_total = tax_adjustments.additional.reload.map(&:update!).compact.sum
|
||||
adjustment_total = adjustments.additional.map(&:update_adjustment!).compact.sum
|
||||
included_tax_total = tax_adjustments.inclusive.reload.map(&:update_adjustment!).compact.sum
|
||||
additional_tax_total = tax_adjustments.additional.reload.map(&:update_adjustment!).compact.sum
|
||||
|
||||
item.update_columns(
|
||||
included_tax_total: included_tax_total,
|
||||
|
||||
@@ -226,11 +226,11 @@ module Spree
|
||||
end
|
||||
|
||||
def update_order
|
||||
return unless changed? || destroyed?
|
||||
return unless saved_changes.present? || destroyed?
|
||||
|
||||
# update the order totals, etc.
|
||||
order.create_tax_charge!
|
||||
order.update!
|
||||
order.update_order!
|
||||
end
|
||||
|
||||
def update_inventory_before_destroy
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
module Spree
|
||||
class OptionType < ApplicationRecord
|
||||
has_many :products, through: :product_option_types
|
||||
has_many :option_values, -> { order(:position) }, dependent: :destroy
|
||||
has_many :product_option_types, dependent: :destroy
|
||||
has_many :products, through: :product_option_types
|
||||
|
||||
validates :name, :presentation, presence: true
|
||||
default_scope -> { order("#{table_name}.position") }
|
||||
|
||||
@@ -212,7 +212,7 @@ module Spree
|
||||
@updater ||= OrderManagement::Order::Updater.new(self)
|
||||
end
|
||||
|
||||
def update!
|
||||
def update_order!
|
||||
updater.update
|
||||
end
|
||||
|
||||
@@ -748,8 +748,8 @@ module Spree
|
||||
def update_adjustment!(adjustment)
|
||||
return if adjustment.finalized?
|
||||
|
||||
adjustment.update!(force: true)
|
||||
update!
|
||||
adjustment.update_adjustment!(force: true)
|
||||
update_order!
|
||||
end
|
||||
|
||||
# object_params sets the payment amount to the order total, but it does this
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
module Spree
|
||||
class OrderContents
|
||||
attr_accessor :order, :currency
|
||||
attr_accessor :order
|
||||
|
||||
def initialize(order)
|
||||
@order = order
|
||||
@@ -10,9 +10,9 @@ module Spree
|
||||
|
||||
# Get current line item for variant if exists
|
||||
# Add variant qty to line_item
|
||||
def add(variant, quantity = 1, currency = nil, shipment = nil)
|
||||
def add(variant, quantity = 1, shipment = nil)
|
||||
line_item = order.find_line_item_by_variant(variant)
|
||||
add_to_line_item(line_item, variant, quantity, currency, shipment)
|
||||
add_to_line_item(line_item, variant, quantity, shipment)
|
||||
end
|
||||
|
||||
# Get current line item for variant
|
||||
@@ -29,20 +29,14 @@ module Spree
|
||||
|
||||
private
|
||||
|
||||
def add_to_line_item(line_item, variant, quantity, currency = nil, shipment = nil)
|
||||
def add_to_line_item(line_item, variant, quantity, shipment = nil)
|
||||
if line_item
|
||||
line_item.target_shipment = shipment
|
||||
line_item.quantity += quantity.to_i
|
||||
line_item.currency = currency unless currency.nil?
|
||||
else
|
||||
line_item = order.line_items.new(quantity: quantity, variant: variant)
|
||||
line_item.target_shipment = shipment
|
||||
if currency
|
||||
line_item.currency = currency unless currency.nil?
|
||||
line_item.price = variant.price_in(currency).amount
|
||||
else
|
||||
line_item.price = variant.price
|
||||
end
|
||||
line_item.price = variant.price
|
||||
end
|
||||
|
||||
line_item.save
|
||||
|
||||
@@ -50,6 +50,7 @@ module Spree
|
||||
scope :failed, -> { with_state('failed') }
|
||||
scope :valid, -> { where('state NOT IN (?)', %w(failed invalid)) }
|
||||
scope :authorization_action_required, -> { where.not(cvv_response_message: nil) }
|
||||
scope :with_payment_intent, ->(code) { where(response_code: code) }
|
||||
|
||||
# order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
||||
state_machine initial: :checkout do
|
||||
@@ -144,6 +145,10 @@ module Spree
|
||||
I18n.t('payment_method_fee')
|
||||
end
|
||||
|
||||
def mark_as_processed
|
||||
update_attribute(:cvv_response_message, nil)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Don't charge fees for invalid or failed payments.
|
||||
@@ -201,7 +206,7 @@ module Spree
|
||||
end
|
||||
|
||||
def update_order
|
||||
order.reload.update!
|
||||
OrderManagement::Order::Updater.new(order).after_payment_update(self)
|
||||
end
|
||||
|
||||
# Necessary because some payment gateways will refuse payments with
|
||||
|
||||
@@ -266,13 +266,6 @@ module Spree
|
||||
duplicator.duplicate
|
||||
end
|
||||
|
||||
# use deleted? rather than checking the attribute directly. this
|
||||
# allows extensions to override deleted? if they want to provide
|
||||
# their own definition.
|
||||
def deleted?
|
||||
!!deleted_at
|
||||
end
|
||||
|
||||
# split variants list into hash which shows mapping of opt value onto matching variants
|
||||
# eg categorise_variants_from_option(color) => {"red" -> [...], "blue" -> [...]}
|
||||
def categorise_variants_from_option(opt_type)
|
||||
@@ -433,7 +426,7 @@ module Spree
|
||||
end
|
||||
|
||||
def update_units
|
||||
return unless variant_unit_changed?
|
||||
return unless saved_change_to_variant_unit?
|
||||
|
||||
option_types.delete self.class.all_variant_unit_option_types
|
||||
option_types << variant_unit_option_type if variant_unit.present?
|
||||
@@ -449,9 +442,9 @@ module Spree
|
||||
end
|
||||
|
||||
def remove_previous_primary_taxon_from_taxons
|
||||
return unless primary_taxon_id_changed? && primary_taxon_id_was
|
||||
return unless saved_change_to_primary_taxon_id? && primary_taxon_id_before_last_save
|
||||
|
||||
taxons.destroy(primary_taxon_id_was)
|
||||
taxons.destroy(primary_taxon_id_before_last_save)
|
||||
end
|
||||
|
||||
def ensure_standard_variant
|
||||
@@ -465,7 +458,7 @@ module Spree
|
||||
|
||||
# Spree creates a permalink already but our implementation fixes an edge case.
|
||||
def sanitize_permalink
|
||||
return unless permalink.blank? || permalink_changed?
|
||||
return unless permalink.blank? || saved_change_to_permalink? || permalink_changed?
|
||||
|
||||
requested = permalink.presence || permalink_was.presence || name.presence || 'product'
|
||||
self.permalink = create_unique_permalink(requested.parameterize)
|
||||
|
||||
@@ -66,7 +66,7 @@ module Spree
|
||||
order.shipped_shipments.collect{ |s| s.inventory_units.to_a }.flatten
|
||||
end
|
||||
|
||||
# Used when Adjustment#update! wants to update the related adjustment
|
||||
# Used when Adjustment#update_adjustment! wants to update the related adjustment
|
||||
def compute_amount(*_args)
|
||||
-amount.abs
|
||||
end
|
||||
@@ -105,7 +105,7 @@ module Spree
|
||||
)
|
||||
|
||||
order.return if inventory_units.all?(&:returned?)
|
||||
order.update!
|
||||
order.update_order!
|
||||
end
|
||||
|
||||
def allow_receive?
|
||||
|
||||
@@ -50,7 +50,7 @@ module Spree
|
||||
category = TaxCategory.includes(:tax_rates).find_by(is_default: true)
|
||||
return 0 unless category
|
||||
|
||||
address ||= Address.new(country_id: Spree::Config[:default_country_id])
|
||||
address ||= Address.new(country_id: DefaultCountry.id)
|
||||
rate = category.tax_rates.detect { |tax_rate| tax_rate.zone.include? address }.try(:amount)
|
||||
|
||||
rate || 0
|
||||
|
||||
@@ -166,13 +166,6 @@ module Spree
|
||||
OpenFoodNetwork::EnterpriseFeeCalculator.new(distributor, order_cycle).fees_by_type_for self
|
||||
end
|
||||
|
||||
# use deleted? rather than checking the attribute directly. this
|
||||
# allows extensions to override deleted? if they want to provide
|
||||
# their own definition.
|
||||
def deleted?
|
||||
deleted_at
|
||||
end
|
||||
|
||||
def option_value(opt_name)
|
||||
option_values.detect { |o| o.option_type.name == opt_name }.try(:presentation)
|
||||
end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class Api::LineItemSerializer < ActiveModel::Serializer
|
||||
attributes :id, :quantity, :max_quantity, :price
|
||||
attributes :id, :quantity, :max_quantity, :price, :order_id
|
||||
|
||||
has_one :variant, serializer: Api::VariantSerializer
|
||||
end
|
||||
|
||||
@@ -22,7 +22,7 @@ module Api
|
||||
end
|
||||
|
||||
def item_count
|
||||
object.line_items.sum(:quantity)
|
||||
object.line_items.sum(&:quantity)
|
||||
end
|
||||
|
||||
def completed_at
|
||||
|
||||
13
app/services/default_country.rb
Normal file
13
app/services/default_country.rb
Normal file
@@ -0,0 +1,13 @@
|
||||
class DefaultCountry
|
||||
def self.id
|
||||
country.id
|
||||
end
|
||||
|
||||
def self.code
|
||||
country.iso
|
||||
end
|
||||
|
||||
def self.country
|
||||
Spree::Country.find_by(iso: ENV["DEFAULT_COUNTRY_CODE"]) || Spree::Country.first
|
||||
end
|
||||
end
|
||||
@@ -2,9 +2,8 @@
|
||||
# by setting entries on the Spree Config
|
||||
# and initializing Spree:MailSettings that uses the Spree::Config.
|
||||
class MailConfiguration
|
||||
# @param entries [Hash] Spree Config entries
|
||||
def self.entries=(entries)
|
||||
entries.each do |name, value|
|
||||
def self.apply!
|
||||
configuration.each do |name, value|
|
||||
Spree::Config[name] = value
|
||||
end
|
||||
apply_mail_settings
|
||||
@@ -12,6 +11,21 @@ class MailConfiguration
|
||||
|
||||
private
|
||||
|
||||
def self.configuration
|
||||
{
|
||||
mail_host: ENV.fetch('MAIL_HOST'),
|
||||
mail_domain: ENV.fetch('MAIL_DOMAIN'),
|
||||
mail_port: ENV.fetch('MAIL_PORT'),
|
||||
mail_auth_type: ENV.fetch('MAIL_AUTH_TYPE', 'login'),
|
||||
smtp_username: ENV.fetch('SMTP_USERNAME'),
|
||||
smtp_password: ENV.fetch('SMTP_PASSWORD'),
|
||||
secure_connection_type: ENV.fetch('MAIL_SECURE_CONNECTION', 'None'),
|
||||
mails_from: ENV.fetch('MAILS_FROM', "no-reply@#{ENV.fetch('MAIL_DOMAIN')}"),
|
||||
mail_bcc: ENV.fetch('MAIL_BCC', ''),
|
||||
intercept_email: ''
|
||||
}
|
||||
end
|
||||
|
||||
def self.apply_mail_settings
|
||||
Spree::Core::MailSettings.init
|
||||
end
|
||||
|
||||
@@ -13,7 +13,7 @@ class OrderCheckoutRestart
|
||||
clear_shipments
|
||||
clear_payments
|
||||
|
||||
order.reload.update!
|
||||
order.reload.update_order!
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -24,7 +24,7 @@ class OrderFeesHandler
|
||||
order.updater.persist_totals
|
||||
end
|
||||
|
||||
order.update!
|
||||
order.update_order!
|
||||
end
|
||||
|
||||
def create_line_item_fees!
|
||||
@@ -43,13 +43,13 @@ class OrderFeesHandler
|
||||
|
||||
def update_line_item_fees!(line_item)
|
||||
line_item.adjustments.enterprise_fee.each do |fee|
|
||||
fee.update!(line_item, force: true)
|
||||
fee.update_adjustment!(line_item, force: true)
|
||||
end
|
||||
end
|
||||
|
||||
def update_order_fees!
|
||||
order.adjustments.enterprise_fee.where(adjustable_type: 'Spree::Order').each do |fee|
|
||||
fee.update!(order, force: true)
|
||||
fee.update_adjustment!(order, force: true)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ module Permissions
|
||||
def filtered_orders(orders)
|
||||
return orders unless filter_orders?
|
||||
|
||||
orders.complete.not_state(:canceled).search(search_params).result
|
||||
orders.complete.not_state(:canceled).ransack(search_params).result
|
||||
end
|
||||
|
||||
def filter_orders?
|
||||
|
||||
@@ -35,23 +35,8 @@ module PermittedAttributes
|
||||
:tag_list,
|
||||
tags: [:text],
|
||||
enterprise_fee_ids: [],
|
||||
variants: permitted_variant_ids
|
||||
variants: {}
|
||||
]
|
||||
end
|
||||
|
||||
# In rails 5 we will be able to permit random hash keys simply with :variants => {}
|
||||
# See https://github.com/rails/rails/commit/e86524c0c5a26ceec92895c830d1355ae47a7034
|
||||
#
|
||||
# Until then, we need to create an array of variant IDs in order to permit them
|
||||
def permitted_variant_ids
|
||||
variant_ids(@params[:order_cycle][:incoming_exchanges]) +
|
||||
variant_ids(@params[:order_cycle][:outgoing_exchanges])
|
||||
end
|
||||
|
||||
def variant_ids(exchange_params)
|
||||
return [] unless exchange_params
|
||||
|
||||
exchange_params.map { |exchange| exchange[:variants].map { |key, _value| key } }.flatten
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,39 +3,82 @@
|
||||
# When directing a customer to Stripe to authorize the payment, we specify a
|
||||
# redirect_url that Stripe should return them to. When checking out, it's
|
||||
# /checkout; for admin payments and subscription payemnts it's the order url.
|
||||
#
|
||||
# This class confirms that the payment intent matches what's in our database,
|
||||
# marks the payment as complete, and removes the cvv_response_message field,
|
||||
# which we use to indicate that authorization is required. It also completes the
|
||||
# Order, if appropriate.
|
||||
|
||||
class ProcessPaymentIntent
|
||||
class Result
|
||||
attr_reader :error
|
||||
|
||||
def initialize(ok:, error: "")
|
||||
@ok = ok
|
||||
@error = error
|
||||
end
|
||||
|
||||
def ok?
|
||||
@ok
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(payment_intent, order)
|
||||
@payment_intent = payment_intent
|
||||
@order = order
|
||||
@last_payment = OrderPaymentFinder.new(order).last_payment
|
||||
@payment = order.payments.pending.with_payment_intent(payment_intent).first
|
||||
end
|
||||
|
||||
def call!
|
||||
return unless valid?
|
||||
return Result.new(ok: false) unless payment.present? && ready_for_capture?
|
||||
return Result.new(ok: true) if already_processed?
|
||||
|
||||
last_payment.update_attribute(:cvv_response_message, nil)
|
||||
OrderWorkflow.new(@order).next
|
||||
last_payment.complete! if last_payment.can_complete?
|
||||
process_payment
|
||||
|
||||
if payment.reload.completed?
|
||||
payment.mark_as_processed
|
||||
|
||||
Result.new(ok: true)
|
||||
else
|
||||
Result.new(ok: false, error: I18n.t("payment_could_not_complete"))
|
||||
end
|
||||
|
||||
rescue Stripe::StripeError => e
|
||||
Result.new(ok: false, error: e.message)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :order, :payment_intent, :last_payment
|
||||
attr_reader :order, :payment_intent, :payment
|
||||
|
||||
def valid?
|
||||
order.present? && valid_intent_string? && matches_last_payment?
|
||||
def process_payment
|
||||
if order.state == "payment"
|
||||
# Moves the order to completed, which calls #process_payments!
|
||||
OrderWorkflow.new(order).next
|
||||
else
|
||||
order.process_payments!
|
||||
end
|
||||
end
|
||||
|
||||
def valid_intent_string?
|
||||
payment_intent&.starts_with?("pi_")
|
||||
def ready_for_capture?
|
||||
payment_intent_status == 'requires_capture'
|
||||
end
|
||||
|
||||
def matches_last_payment?
|
||||
last_payment&.state == "pending" && last_payment&.response_code == payment_intent
|
||||
def already_processed?
|
||||
payment_intent_status == 'succeeded'
|
||||
end
|
||||
|
||||
def payment_intent_status
|
||||
@payment_intent_status ||= Stripe::PaymentIntentValidator.new.
|
||||
call(payment_intent, stripe_account_id).
|
||||
status
|
||||
end
|
||||
|
||||
def stripe_account_id
|
||||
StripeAccount.find_by(enterprise_id: preferred_enterprise_id).stripe_user_id
|
||||
end
|
||||
|
||||
def preferred_enterprise_id
|
||||
payment.payment_method.preferred_enterprise_id
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
= "admin.enterprises"
|
||||
|
||||
= admin_inject_available_countries(module: 'admin.enterprises')
|
||||
= admin_inject_json "admin.enterprises", "defaultCountryID", Spree::Config[:default_country_id]
|
||||
= admin_inject_json "admin.enterprises", "defaultCountryID", DefaultCountry.id
|
||||
|
||||
-# Form
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
= validated_input t(:postcode), "order.bill_address.zipcode"
|
||||
|
||||
.small-6.columns.right
|
||||
= validated_select t(:country), "order.bill_address.country_id", {}, {"ng-init" => "order.bill_address.country_id = order.bill_address.country_id || #{Spree::Config[:default_country_id]}", "ng-options" => "c.id as c.name for c in countries"}
|
||||
= validated_select t(:country), "order.bill_address.country_id", {}, {"ng-init" => "order.bill_address.country_id = order.bill_address.country_id || #{DefaultCountry.id}", "ng-options" => "c.id as c.name for c in countries"}
|
||||
|
||||
.row
|
||||
.small-12.columns.text-right
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
.small-6.columns
|
||||
= validated_input t(:postcode), "order.ship_address.zipcode"
|
||||
.small-6.columns.right
|
||||
= validated_select t(:country), "order.ship_address.country_id", {}, {"ng-init" => "order.ship_address.country_id = order.ship_address.country_id || #{Spree::Config[:default_country_id]}", "ng-options" => "c.id as c.name for c in countries"}
|
||||
= validated_select t(:country), "order.ship_address.country_id", {}, {"ng-init" => "order.ship_address.country_id = order.ship_address.country_id || #{DefaultCountry.id}", "ng-options" => "c.id as c.name for c in countries"}
|
||||
.row
|
||||
.small-6.columns
|
||||
= validated_input t(:phone), "order.ship_address.phone"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
.small-12.medium-8.large-8.columns
|
||||
.field
|
||||
%label{ for: 'enterprise_country' }= t(".country_field")
|
||||
%select.chunky{ id: 'enterprise_country', name: 'country', required: true, ng: { init: "setDefaultCountry(#{Spree::Config[:default_country_id]})", model: 'enterprise.country', options: 'c as c.name for c in countries' } }
|
||||
%select.chunky{ id: 'enterprise_country', name: 'country', required: true, ng: { init: "setDefaultCountry(#{DefaultCountry.id})", model: 'enterprise.country', options: 'c as c.name for c in countries' } }
|
||||
%span.error{ ng: { show: "details.country.$error.required && submitted" } }
|
||||
= t(".country_field_error")
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- if Rails.env.test?
|
||||
%script{type: "text/javascript"}
|
||||
= render file: "spec/support/fixtures/stripejs-mock.js"
|
||||
= raw render file: "spec/support/fixtures/stripejs-mock.js"
|
||||
- else
|
||||
%script{src: "https://js.stripe.com/v3/", type: "text/javascript"}
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
var shipments = [];
|
||||
- @order.shipments.each do |shipment|
|
||||
shipments.push(#{shipment.to_json(:root => false, :include => [:inventory_units, :stock_location]).html_safe});
|
||||
= render :partial => 'spree/admin/shared/update_order_state', :handlers => [:erb]
|
||||
= render :partial => 'spree/admin/shared/update_order_state', :handlers => [:erb], :formats => [:js]
|
||||
|
||||
@@ -25,8 +25,7 @@
|
||||
%span.centered.three.columns
|
||||
= t "spree_admin_enterprises_fees"
|
||||
%div.sixteen.columns.alpha.list
|
||||
- @enterprises.each do |enterprise|
|
||||
= render 'enterprise_row', { enterprise: enterprise }
|
||||
= render partial: 'enterprise_row', collection: @enterprises, as: :enterprise
|
||||
|
||||
%a.sixteen.columns.alpha.button.bottom.blue{ href: "#{main_app.admin_enterprises_path}" }
|
||||
= t "spree_admin_overview_enterprises_footer"
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
= configurations_sidebar_menu_item Spree.t(:tax_settings), edit_admin_tax_settings_path
|
||||
= configurations_sidebar_menu_item Spree.t(:zones), admin_zones_path
|
||||
= configurations_sidebar_menu_item Spree.t(:countries), admin_countries_path
|
||||
- if Spree::Config[:default_country_id]
|
||||
= configurations_sidebar_menu_item Spree.t(:states), admin_country_states_path(Spree::Config[:default_country_id])
|
||||
- if DefaultCountry.id
|
||||
= configurations_sidebar_menu_item Spree.t(:states), admin_country_states_path(DefaultCountry.id)
|
||||
= configurations_sidebar_menu_item Spree.t(:payment_methods), admin_payment_methods_path
|
||||
= configurations_sidebar_menu_item Spree.t(:taxonomies), admin_taxonomies_path
|
||||
= configurations_sidebar_menu_item Spree.t(:shipping_methods), admin_shipping_methods_path
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
%th.cart-item-delete-header
|
||||
|
||||
%tbody#line_items{"data-hook" => ""}
|
||||
= 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 partial: 'line_item', collection: order_form.object.line_items, locals: {order_form: order_form}
|
||||
|
||||
= render 'bought' if show_bought_items? && @order.cart?
|
||||
|
||||
|
||||
@@ -1,37 +1,39 @@
|
||||
%tr.line-item{class: "variant-#{variant.id}"}
|
||||
%td.cart-item-description{'data-hook' => "cart_item_description"}
|
||||
- variant = line_item.variant
|
||||
= order_form.fields_for :line_items, line_item do |item_form|
|
||||
%tr.line-item{class: "variant-#{variant.id}"}
|
||||
%td.cart-item-description{'data-hook' => "cart_item_description"}
|
||||
|
||||
%div.item-thumb-image{"data-hook" => "cart_item_image"}
|
||||
= render 'spree/shared/variant_thumbnail', variant: variant
|
||||
%div.item-thumb-image{"data-hook" => "cart_item_image"}
|
||||
= render 'spree/shared/variant_thumbnail', variant: variant
|
||||
|
||||
= render 'spree/shared/line_item_name', line_item: line_item
|
||||
= render 'spree/shared/line_item_name', line_item: 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/
|
||||
- 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/
|
||||
|
||||
- if @unavailable_order_variants.andand.include? line_item.variant
|
||||
%span.out-of-stock
|
||||
= t(".unavailable_item")
|
||||
%br/
|
||||
- if @unavailable_order_variants.andand.include? line_item.variant
|
||||
%span.out-of-stock
|
||||
= t(".unavailable_item")
|
||||
%br/
|
||||
|
||||
%td.text-right.cart-item-price{"data-hook" => "cart_item_price"}
|
||||
= line_item.single_display_amount_with_adjustments.to_html
|
||||
- if feature? :unit_price, spree_current_user
|
||||
%br
|
||||
%span.unit-price
|
||||
= line_item.unit_price_price_and_unit
|
||||
%td.text-center.cart-item-quantity{"data-hook" => "cart_item_quantity"}
|
||||
- finalized_quantity = @order.completed? ? line_item.quantity : 0
|
||||
= item_form.number_field :quantity,
|
||||
:min => 0, "ofn-on-hand" => "#{variant.on_demand && 9999 || variant.on_hand}",
|
||||
"finalizedquantity" => finalized_quantity, :class => "line_item_quantity", :size => 5,
|
||||
"ng-model" => "line_item_#{line_item.id}",
|
||||
"validate-stock-quantity" => true
|
||||
%td.cart-item-total.text-right{"data-hook" => "cart_item_total"}
|
||||
= line_item.display_amount_with_adjustments.to_html unless line_item.quantity.nil?
|
||||
%td.text-right.cart-item-price{"data-hook" => "cart_item_price"}
|
||||
= line_item.single_display_amount_with_adjustments.to_html
|
||||
- if feature? :unit_price, spree_current_user
|
||||
%br
|
||||
%span.unit-price
|
||||
= line_item.unit_price_price_and_unit
|
||||
%td.text-center.cart-item-quantity{"data-hook" => "cart_item_quantity"}
|
||||
- finalized_quantity = @order.completed? ? line_item.quantity : 0
|
||||
= item_form.number_field :quantity,
|
||||
:min => 0, "ofn-on-hand" => "#{variant.on_demand && 9999 || variant.on_hand}",
|
||||
"finalizedquantity" => finalized_quantity, :class => "line_item_quantity", :size => 5,
|
||||
"ng-model" => "line_item_#{line_item.id}",
|
||||
"validate-stock-quantity" => true
|
||||
%td.cart-item-total.text-right{"data-hook" => "cart_item_total"}
|
||||
= line_item.display_amount_with_adjustments.to_html unless line_item.quantity.nil?
|
||||
|
||||
%td.cart-item-delete.text-center{"data-hook" => "cart_item_delete"}
|
||||
%a.delete{href: "#", id: "delete_#{dom_id(line_item)}"}
|
||||
%i.delete.ofn-i_026-trash
|
||||
%td.cart-item-delete.text-center{"data-hook" => "cart_item_delete"}
|
||||
%a.delete{href: "#", id: "delete_#{dom_id(line_item)}"}
|
||||
%i.delete.ofn-i_026-trash
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- if order.changes_allowed?
|
||||
.columns.show-for-medium-up.medium-3
|
||||
.columns.small-12.medium-3
|
||||
= link_to cancel_order_path(@order), method: :put, :class => "button secondary expand", "confirm-link-click" => t('orders_confirm_cancel') do
|
||||
= link_to main_app.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
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
= 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()" } ×
|
||||
|
||||
= form_for order, url: order_path(order), html: {id: 'update-order', name: 'update_order_form' } do |order_form|
|
||||
= form_for order, url: main_app.order_path(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
|
||||
|
||||
@@ -13,3 +13,8 @@
|
||||
= t :email_payment_summary
|
||||
- if @order.payments.any?
|
||||
= render partial: 'spree/shared/payments_list', locals: { payments: @order.payments }
|
||||
- if last_payment_method(@order).present?
|
||||
%p.callout{style: "margin-top: 40px"}
|
||||
%strong
|
||||
= t :email_payment_description
|
||||
%p{style: "margin: 5px"}= last_payment_method(@order).description
|
||||
|
||||
@@ -75,13 +75,6 @@ module Openfoodnetwork
|
||||
initializer 'ofn.spree_locale_settings', before: 'spree.promo.environment' do |app|
|
||||
Spree::Config['checkout_zone'] = ENV['CHECKOUT_ZONE']
|
||||
Spree::Config['currency'] = ENV['CURRENCY']
|
||||
|
||||
if ActiveRecord::Base.connected? && Spree::Country.table_exists?
|
||||
country = Spree::Country.find_by(iso: ENV['DEFAULT_COUNTRY_CODE'])
|
||||
Spree::Config['default_country_id'] = country.id if country.present?
|
||||
else
|
||||
Spree::Config['default_country_id'] = 12 # Australia
|
||||
end
|
||||
end
|
||||
|
||||
# Register Spree calculators
|
||||
@@ -196,7 +189,9 @@ module Openfoodnetwork
|
||||
|
||||
config.active_support.escape_html_entities_in_json = true
|
||||
|
||||
config.active_job.queue_adapter = :delayed_job
|
||||
config.active_job.queue_adapter = :sidekiq
|
||||
|
||||
config.action_controller.include_all_helpers = false
|
||||
|
||||
config.generators.template_engine = :haml
|
||||
end
|
||||
|
||||
@@ -66,5 +66,3 @@ SMTP_PASSWORD: 'f00d'
|
||||
# config/initializers/feature_toggles.rb for details.
|
||||
#
|
||||
# BETA_TESTERS: ofn@example.com,superadmin@example.com
|
||||
|
||||
MEMCACHED_VALUE_MAX_MEGABYTES: '4'
|
||||
|
||||
@@ -11,7 +11,13 @@ Openfoodnetwork::Application.configure do
|
||||
config.cache_classes = !!ENV["PROFILE"]
|
||||
|
||||
# :file_store is used by default when no cache store is specifically configured.
|
||||
config.cache_store = :memory_store if !!ENV["PROFILE"]
|
||||
if !!ENV["PROFILE"]
|
||||
config.cache_store = :redis_cache_store, {
|
||||
driver: :hiredis,
|
||||
url: ENV.fetch("OFN_REDIS_URL", "redis://localhost:6379/0"),
|
||||
expires_in: 90.minutes
|
||||
}
|
||||
end
|
||||
|
||||
config.eager_load = false
|
||||
|
||||
|
||||
@@ -42,9 +42,11 @@ Openfoodnetwork::Application.configure do
|
||||
config.log_formatter = Logger::Formatter.new.tap { |f| f.datetime_format = "%Y-%m-%d %H:%M:%S" }
|
||||
|
||||
# Use a different cache store in production
|
||||
memcached_value_max_megabytes = ENV.fetch("MEMCACHED_VALUE_MAX_MEGABYTES", 1).to_i
|
||||
memcached_value_max_bytes = memcached_value_max_megabytes * 1024 * 1024
|
||||
config.cache_store = :mem_cache_store, { value_max_bytes: memcached_value_max_bytes }
|
||||
config.cache_store = :redis_cache_store, {
|
||||
driver: :hiredis,
|
||||
url: ENV.fetch("OFN_REDIS_URL", "redis://localhost:6380/0"),
|
||||
reconnect_attempts: 1
|
||||
}
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
||||
# config.action_controller.asset_host = "http://assets.example.com"
|
||||
|
||||
@@ -42,9 +42,11 @@ Openfoodnetwork::Application.configure do
|
||||
config.log_formatter = Logger::Formatter.new.tap { |f| f.datetime_format = "%Y-%m-%d %H:%M:%S" }
|
||||
|
||||
# Use a different cache store in production
|
||||
memcached_value_max_megabytes = ENV.fetch("MEMCACHED_VALUE_MAX_MEGABYTES", 1).to_i
|
||||
memcached_value_max_bytes = memcached_value_max_megabytes * 1024 * 1024
|
||||
config.cache_store = :mem_cache_store, { value_max_bytes: memcached_value_max_bytes }
|
||||
config.cache_store = :redis_cache_store, {
|
||||
driver: :hiredis,
|
||||
url: ENV.fetch("OFN_REDIS_URL", "redis://localhost:6380/0"),
|
||||
reconnect_attempts: 1
|
||||
}
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
||||
# config.action_controller.asset_host = "http://assets.example.com"
|
||||
|
||||
@@ -50,11 +50,6 @@ Openfoodnetwork::Application.configure do
|
||||
# Print deprecation notices to the stderr
|
||||
config.active_support.deprecation = :stderr
|
||||
|
||||
# To block requests before running the database cleaner
|
||||
require 'open_food_network/rack_request_blocker'
|
||||
# Make sure the middleware is inserted first in middleware chain
|
||||
config.middleware.insert_before(ActionDispatch::Static, RackRequestBlocker)
|
||||
|
||||
config.active_job.queue_adapter = :test
|
||||
end
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
if defined?(Bullet) && ENV.fetch("ENABLE_BULLET", false)
|
||||
Rails.application.config.after_initialize do
|
||||
Bullet.enable = true
|
||||
Bullet.add_footer = true
|
||||
Bullet.bullet_logger = true
|
||||
Bullet.rails_logger = true
|
||||
end
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
Delayed::Worker.logger = Logger.new(Rails.root.join('log', 'delayed_job.log'))
|
||||
Delayed::Worker.destroy_failed_jobs = false
|
||||
Delayed::Worker.max_run_time = 15.minutes
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
Money.rounding_mode = BigDecimal::ROUND_HALF_EVEN
|
||||
Money.default_currency = Money::Currency.new(Spree::Config[:currency])
|
||||
Money.default_currency = Money::Currency.new(ENV.fetch('CURRENCY'))
|
||||
|
||||
11
config/initializers/sidekiq.rb
Normal file
11
config/initializers/sidekiq.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
if Rails.env.production? || Rails.env.staging?
|
||||
redis_jobs_url = ENV.fetch("OFN_REDIS_JOBS_URL", "redis://localhost:6381/0")
|
||||
|
||||
Sidekiq.configure_server do |config|
|
||||
config.redis = { url: redis_jobs_url, network_timeout: 5 }
|
||||
end
|
||||
|
||||
Sidekiq.configure_client do |config|
|
||||
config.redis = { url: redis_jobs_url, network_timeout: 5 }
|
||||
end
|
||||
end
|
||||
@@ -18,6 +18,8 @@ Spree::Gateway.class_eval do
|
||||
end
|
||||
|
||||
Spree.config do |config|
|
||||
config.site_url = ENV['SITE_URL'] if ENV['SITE_URL']
|
||||
config.site_name = ENV['SITE_NAME'] if ENV['SITE_NAME']
|
||||
config.shipping_instructions = true
|
||||
config.address_requires_state = true
|
||||
config.admin_interface_logo = '/default_images/ofn-logo.png'
|
||||
@@ -31,6 +33,10 @@ Spree.config do |config|
|
||||
config.s3_protocol = ENV.fetch('S3_PROTOCOL', 'https')
|
||||
end
|
||||
|
||||
# Read mail configuration from ENV vars at boot time and ensure the values are
|
||||
# applied correctly in Spree::Config.
|
||||
MailConfiguration.apply!
|
||||
|
||||
# Attachments settings
|
||||
Spree::Image.set_attachment_attribute(:path, ENV['ATTACHMENT_PATH']) if ENV['ATTACHMENT_PATH']
|
||||
Spree::Image.set_attachment_attribute(:url, ENV['ATTACHMENT_URL']) if ENV['ATTACHMENT_URL']
|
||||
|
||||
@@ -317,6 +317,8 @@ ca:
|
||||
height: "Alçada"
|
||||
width: "Amplada"
|
||||
depth: "Profunditat"
|
||||
payment_could_not_process: "No s'ha pogut processar el pagament"
|
||||
payment_could_not_complete: "No s'ha pogut completar el pagament"
|
||||
actions:
|
||||
create_and_add_another: "Crea i afegeix-ne una altra"
|
||||
create: "Crear"
|
||||
@@ -1569,6 +1571,7 @@ ca:
|
||||
email_order_summary_includes_tax: "(inclou impostos):"
|
||||
email_payment_paid: PAGAT
|
||||
email_payment_not_paid: 'NO PAGAT '
|
||||
email_payment_description: Descripció del pagament de la comanda
|
||||
email_payment_summary: Resum del pagament
|
||||
email_payment_method: "Pagament a través de:"
|
||||
email_so_placement_intro_html: "Tens una nova comanda amb <strong> %{distributor}</strong>"
|
||||
|
||||
@@ -50,7 +50,7 @@ de_DE:
|
||||
variant_override:
|
||||
count_on_hand:
|
||||
using_producer_stock_settings_but_count_on_hand_set: "muss leer sein, da die Einstellungen des Produzentenbestands verwendet werden"
|
||||
on_demand_but_count_on_hand_set: "muss leer sein, wenn die Produktion auf Anfrage erfolgt"
|
||||
on_demand_but_count_on_hand_set: "muss leer sein, wenn unbegrenzt verfügbar oder die Produktion auf Bestellung erfolgt"
|
||||
limited_stock_but_no_count_on_hand: "muss angegeben werden, da nur begrenzte Lagerbestände verfügbar sind"
|
||||
activemodel:
|
||||
attributes:
|
||||
@@ -163,7 +163,7 @@ de_DE:
|
||||
confirmation_instructions:
|
||||
subject: "Bitte bestätigen Sie die E-Mail-Adresse von %{enterprise} im Open Food Network"
|
||||
welcome:
|
||||
subject: "%{enterprise} ist jetzt im Open Food Network"
|
||||
subject: "%{enterprise} ist jetzt Teil des Open Food Network"
|
||||
email_welcome: "Willkommen"
|
||||
email_registered: "ist jetzt Teil des"
|
||||
email_userguide_html: "Das Benutzerhandbuch mit detaillierter Unterstützung für die Einrichtung Ihres Profils, Produzentenladens oder Hubs finden Sie hier: %{link}"
|
||||
@@ -317,6 +317,8 @@ de_DE:
|
||||
height: "Höhe"
|
||||
width: "Breite"
|
||||
depth: "Tiefe"
|
||||
payment_could_not_process: "Die Zahlung konnte nicht verarbeitet werden"
|
||||
payment_could_not_complete: "Die Zahlung konnte nicht abgeschlossen werden"
|
||||
actions:
|
||||
create_and_add_another: "Erstellen und weitere hinzufügen"
|
||||
create: "Neu"
|
||||
@@ -345,8 +347,8 @@ de_DE:
|
||||
ends_on: Endet am
|
||||
name: Name
|
||||
on_hand: Verfügbar
|
||||
on_demand: Auf Anfrage
|
||||
on_demand?: Auf Anfrage?
|
||||
on_demand: Unbegrenzt/auf Bestellung
|
||||
on_demand?: Unbegrenzt/auf Bestellung
|
||||
order_cycle: Bestellzyklus
|
||||
payment: Zahlung
|
||||
payment_method: Zahlungsart
|
||||
@@ -708,7 +710,7 @@ de_DE:
|
||||
name: Name der Gebühr
|
||||
fee_type: Art der Gebühr
|
||||
manage_fees: Unternehmensgebühren verwalten
|
||||
no_fees_yet: Sie haben noch keine Unternehmensgebühren.
|
||||
no_fees_yet: Sie erheben noch keine Unternehmensgebühren.
|
||||
create_button: Jetzt erstellen
|
||||
images:
|
||||
logo: Logo
|
||||
@@ -733,7 +735,7 @@ de_DE:
|
||||
name: Name der Zahlungsart
|
||||
applies: Aktiv?
|
||||
manage: Zahlungsarten verwalten
|
||||
no_method_yet: Sie haben noch keine Zahlungsarten. Bitte erstellen Sie eine.
|
||||
no_method_yet: Sie haben noch keine Zahlungsart angelegt. Bitte erstellen Sie eine.
|
||||
create_button: Neue Zahlungsart
|
||||
create_one_button: Jetzt erstellen
|
||||
primary_details:
|
||||
@@ -766,7 +768,7 @@ de_DE:
|
||||
manage: "Lieferoptionen verwalten"
|
||||
create_button: "Neue Lieferoption"
|
||||
create_one_button: "Jetzt erstellen"
|
||||
no_method_yet: "Sie haben noch keine Lieferoptionen angelegt."
|
||||
no_method_yet: "Sie haben noch keine Lieferoption angelegt. Bitte erstellen Sie eine."
|
||||
shop_preferences:
|
||||
shopfront_requires_login: "Öffentlich sichtbarer Laden?"
|
||||
shopfront_requires_login_tip: "Wählen Sie aus, ob sich Kunden einloggen müssen, um den Laden zu sehen oder ob er für alle sichtbar ist."
|
||||
@@ -792,7 +794,7 @@ de_DE:
|
||||
shopfront_message: "'Willkommen'-Nachricht im Laden"
|
||||
shopfront_message_placeholder: >
|
||||
Eine optionale Nachricht, um Kunden willkommen zu heißen und zu erklären,
|
||||
wie Sie bei Ihnen einkaufen können. Wenn hier Text eingegeben wird,
|
||||
wie sie bei Ihnen einkaufen können. Wenn hier Text eingegeben wird,
|
||||
wird dieser auf einer Startseite in Ihrem Laden angezeigt, wenn Kunden
|
||||
ihn zum ersten Mal besuchen.
|
||||
shopfront_message_link_tooltip: "Link einfügen/bearbeiten"
|
||||
@@ -860,7 +862,7 @@ de_DE:
|
||||
shipping_methods: Lieferoptionen
|
||||
shipping_methods_tip: Dieses Unternehmen hat Lieferoptionen.
|
||||
enterprise_fees: Unternehmensgebühren
|
||||
enterprise_fees_tip: Dieses Unternehmen hat keine Gebühren.
|
||||
enterprise_fees_tip: Dieses Unternehmen erhebt keine Gebühren.
|
||||
admin_index:
|
||||
name: Name
|
||||
role: Rolle
|
||||
@@ -984,7 +986,7 @@ de_DE:
|
||||
add: Koordinatorgebühr hinzufügen
|
||||
filters:
|
||||
search_by_order_cycle_name: "Suche nach Name des Bestellzyklus ..."
|
||||
involving: "Betrifft"
|
||||
involving: "Unternehmen"
|
||||
any_enterprise: "Alle Unternehmen"
|
||||
any_schedule: "Alle Zeitpläne"
|
||||
form:
|
||||
@@ -1042,7 +1044,7 @@ de_DE:
|
||||
enterprises_hubs_tabs:
|
||||
has_no_payment_methods: "%{enterprise} hat keine Zahlungsarten."
|
||||
has_no_shipping_methods: "%{enterprise} hat keine Lieferoptionen."
|
||||
has_no_enterprise_fees: "%{enterprise} hat keine Gebühren."
|
||||
has_no_enterprise_fees: "%{enterprise} erhebt keine Gebühren."
|
||||
enterprise_issues:
|
||||
create_new: Erstellen
|
||||
resend_email: E-Mail erneut senden
|
||||
@@ -1206,7 +1208,7 @@ de_DE:
|
||||
enterprise_logo:
|
||||
destroy_attachment_does_not_exist: "Logo existiert nicht"
|
||||
enterprise_promo_image:
|
||||
destroy_attachment_does_not_exist: "Werbebild existiert nicht."
|
||||
destroy_attachment_does_not_exist: "Hintergrundbild existiert nicht."
|
||||
enterprise_terms_and_conditions:
|
||||
destroy_attachment_does_not_exist: "AGB-Datei existiert nicht."
|
||||
orders:
|
||||
@@ -1235,10 +1237,10 @@ de_DE:
|
||||
mailers:
|
||||
powered_by:
|
||||
open_food_network: "Open Food Network"
|
||||
powered_html: "Dieser Einkauf wurde ermöglicht durch das %{open_food_network}."
|
||||
powered_html: "Ermöglicht durch das %{open_food_network}."
|
||||
menu:
|
||||
cart:
|
||||
cart: "Warenkorb"
|
||||
cart: "Warenkorb/Kasse"
|
||||
cart_sidebar:
|
||||
checkout: "Zur Kasse"
|
||||
edit_cart: "Warenkorb bearbeiten"
|
||||
@@ -1250,7 +1252,7 @@ de_DE:
|
||||
signed_in:
|
||||
profile: "Profil"
|
||||
mobile_menu:
|
||||
cart: "Warenkorb"
|
||||
cart: "Warenkorb/Kasse"
|
||||
register_call:
|
||||
selling_on_ofn: "Sie möchten selbst im Open Food Network verkaufen?"
|
||||
register: "Hier registrieren!"
|
||||
@@ -1367,7 +1369,7 @@ de_DE:
|
||||
country: Land
|
||||
unauthorized: Nicht autorisiert
|
||||
terms_of_service: "AGB"
|
||||
on_demand: Auf Anfrage
|
||||
on_demand: Unbegrenzt/auf Bestellung
|
||||
none: Keine
|
||||
not_allowed: Nicht erlaubt
|
||||
no_shipping: keine Lieferoptionen
|
||||
@@ -1470,7 +1472,7 @@ de_DE:
|
||||
brandstory_part2: "Kaufen Sie ein in Hofläden, auf Bauernmärkten, in Food-Hubs oder schließen Sie sich zu Einkaufsgemeinschaften, Kooperativen, Genossenschaften oder einer solidarischen Landwirtschaft zusammen."
|
||||
brandstory_part3: "Die Anbieter bilden gemeinsam ein regionales Netzwerk, in dem sich Käufer und Verkäufer wieder kennen und mit Vertrauen wertschätzend umgegangen wird."
|
||||
brandstory_part4: "Der Programmcode dieser Internet-Plattform ist öffentlich frei verfügbar (Open Source), sie gehört also auch Ihnen und ist unverkäuflich. Alle Einnahmen werden wieder in die Weiterentwicklung des Netzwerks investiert!"
|
||||
brandstory_part5_strong: "Wir nennen es Open Food Network."
|
||||
brandstory_part5_strong: "Das ist das Open Food Network."
|
||||
brandstory_part6: "Sie lieben Ihr Essen! Jetzt können Sie auch Ihr regionales Lebensmittelsystem lieben!"
|
||||
learn_body: "Erkunden Sie Modelle, Geschichten und Ressourcen, um Sie bei der Entwicklung Ihres Fair-Food-Geschäfts oder Ihrer Organisation zu unterstützen. Finden Sie Schulungen, Veranstaltungen und andere Möglichkeiten, um von Gleichgesinnten zu lernen."
|
||||
learn_cta: "Lassen Sie sich inspirieren"
|
||||
@@ -1482,7 +1484,7 @@ de_DE:
|
||||
system_step2: "2. Welche regionalen Lebensmittel kann ich online kaufen?"
|
||||
system_step2_text: "Im Online-Shop des Ladens finden Sie ein großes Sortiment regionaler und saisonaler Produkte. Von Obst und Gemüse über Eier, Milch, Käse, Wurst und Fleisch bis hin zu Backwaren, Süßigkeiten und Fertiggerichten werden Sie fündig. Nutzen Sie die Suche oder die Filter nach Kategorien und Eigenschaften, wie bio, unverpackt oder fair gehandelt."
|
||||
system_step3: "3. Wie kommen regionale Lebensmittel zu mir nach Hause?"
|
||||
system_step3_text: "Jeder Laden kann seine Lieferoptionen selbst festlegen. Viele bieten einen Lieferservice an, oft ist auch die Abholung vor Ort oder an einer Abholstation möglich. Wählen Sie die gewünschte Option einfach beim Abschluss der Bestellung aus. Im Open Food Network kennt man sich - auch das Abstellen der Lieferung auf der Terrasse oder im Gartenhaus lässt sich sicher organisieren. "
|
||||
system_step3_text: "Jeder Laden kann seine Lieferoptionen selbst festlegen. Viele bieten einen Lieferservice an, oft ist auch die Abholung vor Ort oder an einer Abholstation möglich. Wählen Sie die gewünschte Option einfach beim Abschluss der Bestellung aus. Im Open Food Network kennt man sich - auch das Vereinbaren eines Ablageortes lässt sich sicher organisieren. "
|
||||
cta_headline: "Machen Sie die Welt mit Ihrem Einkauf ein kleines bisschen besser."
|
||||
cta_label: "Jetzt regional einkaufen"
|
||||
stats_headline: "Wir erschaffen ein neues Ernährungssystem."
|
||||
@@ -1550,7 +1552,7 @@ de_DE:
|
||||
email_social: "Verbinden Sie sich mit uns:"
|
||||
email_contact: "Schreiben Sie uns eine E-Mail:"
|
||||
email_signoff: "Viele Grüße,"
|
||||
email_signature: "das Team vom Open Food Network"
|
||||
email_signature: "das Team des Open Food Network"
|
||||
email_confirm_customer_greeting: "Hallo %{name},"
|
||||
email_confirm_customer_intro_html: "vielen Dank für Ihren Einkauf bei <strong>%{distributor}</strong>!"
|
||||
email_confirm_customer_number_html: "<strong>Bestellbestätigung #%{number}</strong>"
|
||||
@@ -1568,6 +1570,7 @@ de_DE:
|
||||
email_order_summary_includes_tax: "(inkl. Steuern):"
|
||||
email_payment_paid: BEZAHLT
|
||||
email_payment_not_paid: NICHT BEZAHLT
|
||||
email_payment_description: 'Hinweise zur Zahlung '
|
||||
email_payment_summary: Zahlungsübersicht
|
||||
email_payment_method: "Zahlungsart:"
|
||||
email_so_placement_intro_html: "Sie haben eine neue Bestellung bei <strong>%{distributor}</strong> erhalten!"
|
||||
@@ -1761,7 +1764,7 @@ de_DE:
|
||||
sell_user_guide: "Erfahren Sie mehr in unserem Benutzerhandbuch."
|
||||
sell_listing_price: "Die Aufnahme ins Open Food Network ist kostenlos. Das Eröffnen und Betreiben eines Online-Shops ist für Unternehmen mit einem monatlichen Umsatz unter 500 € kostenlos. Bei höherem Umsatz erlauben wir uns nach einer 3-monatigen kostenlosen Testphase die Berechnung von 3 % Gebühr, um unsere Kosten zu decken."
|
||||
sell_embed: "Wir bieten noch weitere Dienste rund um Ihr Unternehmen an."
|
||||
sell_ask_services: "Fragen Sie uns nach OFN-Dienstleistungen."
|
||||
sell_ask_services: "Fragen Sie uns nach Dienstleistungen rund um das Open Food Network."
|
||||
shops_title: Regional Einkaufen
|
||||
shops_headline: Wählen Sie einen Laden aus der Liste.
|
||||
shops_text: Pflanzen wachsen in Zyklen, Landwirte ernten in Zyklen und bei uns bestellen Sie Lebensmittel in Zyklen. Ist ein Bestellzyklus gerade geschlossen, wählen Sie einen anderen Laden oder schauen Sie später wieder vorbei.
|
||||
@@ -1877,23 +1880,23 @@ de_DE:
|
||||
steps:
|
||||
introduction:
|
||||
registration_greeting: "Herzlich willkommen!"
|
||||
registration_intro: "Sie können jetzt ein Profil als Produzent oder Hub erstellen!"
|
||||
registration_intro: "Erstellen Sie zunächst ein Profil um sich oder Ihre Produkte zu präsentieren!"
|
||||
registration_checklist: "Was brauche ich?"
|
||||
registration_time: "5-10 Minuten Zeit"
|
||||
registration_enterprise_address: "Unternehmensadresse"
|
||||
registration_contact_details: "Kontaktdaten (Ansprechpartner, E-Mail-Adresse, Telefonnummer)"
|
||||
registration_logo: "Ihr Logo"
|
||||
registration_promo_image: "Hintergrundbild für Ihr Profil"
|
||||
registration_about_us: "\"Über uns\" Text"
|
||||
registration_enterprise_address: "Unternehmensname und -adresse"
|
||||
registration_contact_details: "Kontaktdaten (Ansprechpartner, E-Mail-Adresse)"
|
||||
registration_logo: "Ihr Logo (empfohlen)"
|
||||
registration_promo_image: "Hintergrundbild für Ihr Profil (empfohlen)"
|
||||
registration_about_us: "\"Über uns\" Text (empfohlen)"
|
||||
registration_outcome_headline: "Was bekomme ich?"
|
||||
registration_outcome1_html: "Ihr Profil hilft dabei, Sie im Open Food Network zu <strong>finden</strong> und zu <strong>kontaktieren</strong>."
|
||||
registration_outcome2: "Nutzen Sie Ihr Profil, um die Geschichte Ihres Unternehmens zu erzählen und verknüpfen Sie Ihren Social-Media- und Web-Auftritt."
|
||||
registration_outcome3: "Ihr Profil ist auch der erste Schritt, um im Open Food Network Produkte zu handeln oder einen Laden zu eröffnen."
|
||||
registration_outcome3: "Ihr Profil ist auch der erste Schritt, um im Open Food Network Produkte zu handeln oder einen Online-Shop zu eröffnen."
|
||||
registration_action: "Los geht's!"
|
||||
details:
|
||||
title: "Ihr Unternehmen"
|
||||
headline: "Ihr Unternehmen"
|
||||
enterprise: "Woot! Zuerst müssen wir ein wenig über Ihr Unternehmen wissen:"
|
||||
enterprise: "Nennen Sie uns zunächst bitte den Namen und die Adresse Ihres Unternehmens."
|
||||
producer: "Nennen Sie uns zunächst bitte den Namen und die Adresse Ihres Betriebs."
|
||||
enterprise_name_field: "Name des Unternehmens:"
|
||||
producer_name_field: "Name des Betriebs:"
|
||||
@@ -1924,80 +1927,80 @@ de_DE:
|
||||
contact_field: "Hauptansprechpartner"
|
||||
contact_field_placeholder: "Vorname Nachname"
|
||||
contact_field_required: "Bitte geben Sie einen Hauptansprechpartner ein."
|
||||
phone_field: "Telefonnummer"
|
||||
phone_field: "Telefonnummer (optional)"
|
||||
phone_field_placeholder: "z. B. 030 1234 5678"
|
||||
type:
|
||||
title: "Art"
|
||||
headline: "Wählen Sie bitte die Profilart von %{enterprise} aus!"
|
||||
question: "Sind Sie ein Produzent?"
|
||||
yes_producer: "Ja, ich bin ein Produzent."
|
||||
no_producer: "Nein, ich bin kein Produzent."
|
||||
producer_field_error: "Bitte wählen Sie: Sind Sie ein Produzent?"
|
||||
title: "Art des Profils"
|
||||
headline: "Wählen Sie bitte die Profilart für %{enterprise} aus!"
|
||||
question: "Ist das Unternehmen ein Produzent?"
|
||||
yes_producer: "Ja, es ist ein Produzent."
|
||||
no_producer: "Nein, es ist kein Produzent."
|
||||
producer_field_error: "Bitte wählen Sie: Ist das Unternehmen ein Produzent?"
|
||||
yes_producer_help: "Produzenten stellen leckere Lebensmittel oder Getränke her. Sie sind ein Produzent, wenn Sie anbauen, brauen, backen, fermentieren, melken oder sonst wie Lebenmittel produzieren."
|
||||
no_producer_help: "Wenn Sie kein Produzent sind, sind Sie wahrscheinlich jemand, der Lebensmittel verkauft und verteilt. Sie könnten ein Foodhub, eine Lebensmittelkooperative, eine Einkaufsgemeinschaft, ein Einzelhändler, Hofladen, Großhändler oder Vergleichbares sein."
|
||||
no_producer_help: "Wenn Sie kein Produzent sind, sind Sie wahrscheinlich jemand, der Lebensmittel verkauft und verteilt. Sie könnten ein Food Hub, eine Lebensmittelkooperative, eine Einkaufsgemeinschaft, ein Einzelhändler, Hofladen, Großhändler oder Vergleichbares sein."
|
||||
create_profile: "Profil erstellen"
|
||||
about:
|
||||
title: "Über uns"
|
||||
headline: "Sehr gut!"
|
||||
message: "Lassen Sie uns nun die Details Ihres Profils bearbeiten:"
|
||||
headline: "Über uns"
|
||||
message: "Beschreiben Sie nun "
|
||||
success: "Sehr gut! %{enterprise} wurde dem Open Food Network hinzugefügt."
|
||||
registration_exit_message: "Wenn Sie diesen Assistenten zu einem beliebigen Zeitpunkt beenden, können Sie mit der Erstellung Ihres Profils fortfahren, indem Sie in das Menü \"Verwaltung\" gehen."
|
||||
enterprise_description: "Kurzbeschreibung"
|
||||
registration_exit_message: "Wenn Sie diesen Assistenten zu einem beliebigen Zeitpunkt beenden, können Sie mit der Erstellung Ihres Profils fortfahren, indem Sie sich einloggen und zum Menü \"Verwaltung\" wechseln."
|
||||
enterprise_description: "Kurzbeschreibung (empfohlen)"
|
||||
enterprise_description_placeholder: "Ein kurzer Satz, der Ihr Unternehmen beschreibt."
|
||||
enterprise_long_desc: "Ausführliche Beschreibung"
|
||||
enterprise_long_desc: "Ausführliche Beschreibung (empfohlen)"
|
||||
enterprise_long_desc_placeholder: "Erzählen Sie hier die Geschichte Ihres Unternehmens - was macht Sie anders und wunderbar? Wir empfehlen, die Beschreibung unter 600 Zeichen oder 150 Wörtern zu halten."
|
||||
enterprise_long_desc_length: "%{num} Zeichen/bis zu 600 empfohlen"
|
||||
enterprise_abn: "USt-IdNr."
|
||||
enterprise_abn: "USt-IdNr. (optional für Rechnungserstellung)"
|
||||
enterprise_abn_placeholder: "z. B. DE999999999"
|
||||
enterprise_acn: "St.-Nr."
|
||||
enterprise_acn: "St.-Nr. (optional für Rechnungserstellung)"
|
||||
enterprise_acn_placeholder: "z. B. 93815/08152"
|
||||
enterprise_tax_required: "Bitte treffen Sie eine Auswahl."
|
||||
images:
|
||||
title: "Bilder"
|
||||
headline: "Vielen Dank!"
|
||||
headline: "Bilder"
|
||||
description: "Laden Sie einige schöne Bilder hoch, um ein ansprechendes Profil zu gestalten!"
|
||||
uploading: "Wird hochgeladen ..."
|
||||
continue: "Weiter"
|
||||
back: "Zurück"
|
||||
logo:
|
||||
select_logo: "Schritt 1. Wählen Sie ein Bild als Ihr Logo aus"
|
||||
select_logo: "Schritt 1: Laden Sie Ihr Logo hoch (empfohlen)"
|
||||
logo_tip: "Tipp: Am besten funktionieren quadratische Bilder, vorzugsweise mindestens 300 × 300 Pixel."
|
||||
logo_label: "Wählen Sie ein Logo aus"
|
||||
logo_label: "Bilddatei auswählen"
|
||||
logo_drag: "Ziehen Sie Ihr Logo hierher."
|
||||
review_logo: "Schritt 2. Überprüfen Sie Ihr Logo"
|
||||
review_logo: "Schritt 2: Überprüfen Sie Ihr Logo"
|
||||
review_logo_tip: "Tipp: Um das schönste Ergebnis zu erzielen, sollte Ihr Logo den gesamten verfügbaren Platz ausfüllen."
|
||||
logo_placeholder: "Ihr Logo wird hier zur Überprüfung angezeigt, sobald es hochgeladen wurde."
|
||||
promo:
|
||||
select_promo_image: "Schritt 3. Wählen Sie ein Werbebild"
|
||||
select_promo_image: "Schritt 3: Laden Sie ein Hintergrundbild hoch (empfohlen)"
|
||||
promo_image_tip: "Tipp: Die als Banner dargestellte bevorzugte Größe beträgt 1200 × 260 Pixel."
|
||||
promo_image_label: "Wählen Sie ein Werbebild"
|
||||
promo_image_label: "Bilddatei auswählen"
|
||||
promo_image_drag: "Ziehen Sie Ihr Bild hierher."
|
||||
review_promo_image: "Schritt 4. Überprüfen Sie Ihr Werbebild"
|
||||
review_promo_image_tip: "Tipp: Für ein optimales Ergebnis sollte Ihr Werbebild den verfügbaren Platz ausfüllen."
|
||||
review_promo_image: "Schritt 4: Überprüfen Sie Ihr Hintergrundbild"
|
||||
review_promo_image_tip: "Tipp: Für ein optimales Ergebnis sollte Ihr Hintergrundbild den verfügbaren Platz ausfüllen."
|
||||
promo_image_placeholder: "Ihr Logo wird hier zur Überprüfung angezeigt, sobald es hochgeladen wurde."
|
||||
social:
|
||||
title: "Soziale Medien"
|
||||
enterprise_final_step: "Letzter Schritt!"
|
||||
enterprise_social_text: "Wie ist %{enterprise} im Internet erreichbar?"
|
||||
website: "Homepage"
|
||||
website: "Homepage (empfohlen)"
|
||||
website_placeholder: "z. B. openfoodnetwork.de"
|
||||
facebook: "Facebook"
|
||||
facebook: "Facebook (optional)"
|
||||
facebook_placeholder: "z. B. www.facebook.com/IhrNameHier"
|
||||
linkedin: "LinkedIn"
|
||||
linkedin: "LinkedIn (optional)"
|
||||
linkedin_placeholder: "z. B. www.linkedin.com/IhrNameHier"
|
||||
twitter: "Twitter"
|
||||
twitter: "Twitter (optional)"
|
||||
twitter_placeholder: "z. B. @twitter_name"
|
||||
instagram: "Instagram"
|
||||
instagram: "Instagram (optional)"
|
||||
instagram_placeholder: "z. B. @instagram_name"
|
||||
limit_reached:
|
||||
headline: "Oh nein!"
|
||||
message: "Sie haben das Limit erreicht!"
|
||||
text: "Sie haben die maximale Anzahl der Unternehmen erreicht, die Sie besitzen dürfen im"
|
||||
text: "Sie haben die maximale Anzahl der Unternehmen erreicht, die Sie verwalten dürfen im"
|
||||
action: "Zurück zur Startseite"
|
||||
finished:
|
||||
headline: "Fertig!"
|
||||
thanks: "Vielen Dank, dass Sie die Details für %{enterprise} ausgefüllt haben."
|
||||
login: "Sie können die Angaben Ihres Unternehmens jederzeit ändern oder aktualisieren, indem Sie sich bei Open Food Network einloggen und zum Menü \"Verwaltung\" wechseln."
|
||||
login: "Sie können die Angaben Ihres Unternehmens jederzeit ändern oder aktualisieren, indem Sie sich einloggen und zum Menü \"Verwaltung\" wechseln."
|
||||
action: "Zur Übersicht der Unternehmen"
|
||||
back: "Zurück"
|
||||
continue: "Weiter"
|
||||
@@ -2727,7 +2730,7 @@ de_DE:
|
||||
unit_price_tooltip: "Grundpreis: Er ermöglicht einen einfachen Preisvergleich von Produkten, unabhängig von Packungsgröße und -gewicht."
|
||||
variants:
|
||||
on_demand:
|
||||
'yes': "Auf Anfrage"
|
||||
'yes': "Unbegrenzt/auf Bestellung"
|
||||
variant_overrides:
|
||||
on_demand:
|
||||
use_producer_settings: "Einstellungen des Produzentenbestands verwenden"
|
||||
@@ -2970,7 +2973,7 @@ de_DE:
|
||||
back_to_zones_list: "Zurück zur Zonenliste"
|
||||
card_code: "Kartenprüfnummer (3-stellig)"
|
||||
card_number: "Kreditkartennummer"
|
||||
category: "Produktkategorie"
|
||||
category: "Steuerkategorie"
|
||||
created_successfully: "Erfolgreich erstellt"
|
||||
credit: "Guthaben"
|
||||
editing_tax_category: "Steuerkategorie bearbeiten"
|
||||
@@ -3019,7 +3022,7 @@ de_DE:
|
||||
location: "Ort"
|
||||
count_on_hand: "Verfügbar"
|
||||
quantity: "Menge"
|
||||
on_demand: "Unbegrenzt"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
on_hand: "Verfügbar"
|
||||
package_from: "Paket von"
|
||||
item_description: "Artikelbeschreibung"
|
||||
@@ -3087,7 +3090,7 @@ de_DE:
|
||||
display_currency: "Währung anzeigen"
|
||||
choose_currency: "Währung auswählen"
|
||||
mail_method_settings: "E-Mail-Methodeneinstellungen"
|
||||
mail_settings_notice_html: "Einige der folgenden Einstellungen können nicht geändert werden und werden hier nur zu Zwecken der Fehlerbehebung aufgeführt. Änderungen können vorgenommen werden, indem die Einstellungen der deutschen Instanz aktualisiert und mithilfe von <a href='https://github.com/openfoodfoundation/ofn-install'>ofn-install</a> bereitgestellt werden. Wenden Sie sich an das globale OFN-Team, um weitere Informationen zu erhalten."
|
||||
mail_settings_notice_html: "Einige der folgenden Einstellungen können nicht geändert werden und werden hier nur zu Zwecken der Fehlerbehebung aufgeführt. Änderungen können vorgenommen werden, indem die Einstellungen der deutschen Instanz aktualisiert und mithilfe von <a href='https://github.com/openfoodfoundation/ofn-install'>ofn-install</a> bereitgestellt werden. Wenden Sie sich an das globale Team des Open Food Network, um weitere Informationen zu erhalten."
|
||||
general: "Allgemeines"
|
||||
enable_mail_delivery: "E-Mail-Versand aktivieren"
|
||||
send_mails_as: "E-Mails senden als"
|
||||
@@ -3338,7 +3341,7 @@ de_DE:
|
||||
enterprises_header:
|
||||
ofn_with_tip: Unternehmen sind Produzenten und/oder Hubs und sind die grundlegende Organisationseinheit innerhalb des Open Food Network.
|
||||
enterprise_row:
|
||||
has_no_enterprise_fees: "hat keine Unternehmensgebühren"
|
||||
has_no_enterprise_fees: "erhebt keine Unternehmensgebühren"
|
||||
has_no_payment_methods: "hat keine Zahlungsarten"
|
||||
has_no_shipping_methods: "hat keine Lieferoptionen"
|
||||
products:
|
||||
@@ -3463,7 +3466,7 @@ de_DE:
|
||||
unit_price: "Grundpreis"
|
||||
unit_price_legend: "Berechnet aus Preis und Menge."
|
||||
on_hand: "Verfügbar"
|
||||
on_demand: "Unbegrenzt"
|
||||
on_demand: "Unbegrenzt/auf Bestellung"
|
||||
product_description: "Produktbeschreibung"
|
||||
image: "Bild"
|
||||
or: "oder"
|
||||
|
||||
@@ -349,6 +349,8 @@ en:
|
||||
height: "Height"
|
||||
width: "Width"
|
||||
depth: "Depth"
|
||||
payment_could_not_process: "The payment could not be processed"
|
||||
payment_could_not_complete: "The payment could not be completed"
|
||||
|
||||
actions:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
@@ -1667,6 +1669,7 @@ See the %{link} to find out more about %{sitename}'s features and to start using
|
||||
email_order_summary_includes_tax: "(includes tax):"
|
||||
email_payment_paid: PAID
|
||||
email_payment_not_paid: NOT PAID
|
||||
email_payment_description: Payment Description at Checkout
|
||||
email_payment_summary: Payment summary
|
||||
email_payment_method: "Paying via:"
|
||||
email_so_placement_intro_html: "You have a new order with <strong>%{distributor}</strong>"
|
||||
|
||||
@@ -1352,6 +1352,12 @@ en_CA:
|
||||
address2: Address (contd.)
|
||||
city: City
|
||||
city_placeholder: eg. Northcote
|
||||
latitude: Latitude
|
||||
latitude_placeholder: eg. -37.4713077
|
||||
latitude_longitude_tip: Latitude and longitude are needed to display your enterprise on the map.
|
||||
longitude: Longitude
|
||||
longitude_placeholder: eg. 144.7851531
|
||||
use_geocoder: Calculate latitude and longitude automatically from address?
|
||||
postcode: Postal Code
|
||||
postcode_placeholder: eg. N0B 2L0
|
||||
suburb: City
|
||||
@@ -1905,6 +1911,11 @@ en_CA:
|
||||
state_field_error: "Province required"
|
||||
country_field: "Country:"
|
||||
country_field_error: "Please select a country"
|
||||
map_location: "Map Location"
|
||||
locate_address: "Locate address on map"
|
||||
drag_pin: "Drag and drop the pin to the correct location if not accurate."
|
||||
confirm_address: "I confirm that the indicated position of the enterprise on the map is correct."
|
||||
drag_map_marker: "Due to many producers operating in rural areas, the accuracy of maps is always being improved on. Help us to understand where you’re located better by interacting with the map above to move the pin by clicking or tapping to hold the pin and then dragging to the location that is more accurate based off your knowledge."
|
||||
contact:
|
||||
title: "Contact"
|
||||
who_is_managing_enterprise: "Who is responsible for managing %{enterprise}?"
|
||||
|
||||
@@ -317,6 +317,8 @@ en_FR:
|
||||
height: "Height"
|
||||
width: "Width"
|
||||
depth: "Depth"
|
||||
payment_could_not_process: "The payment could not be processed"
|
||||
payment_could_not_complete: "The payment could not be completed"
|
||||
actions:
|
||||
create_and_add_another: "Create and Add Another"
|
||||
create: "Create"
|
||||
@@ -1566,6 +1568,7 @@ en_FR:
|
||||
email_order_summary_includes_tax: "(includes tax):"
|
||||
email_payment_paid: PAID
|
||||
email_payment_not_paid: NOT PAID
|
||||
email_payment_description: Payment Description at Checkout
|
||||
email_payment_summary: Payment summary
|
||||
email_payment_method: "Paying via:"
|
||||
email_so_placement_intro_html: "You have a new order with <strong>%{distributor}</strong>"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user