bookkeeper 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/assets/javascripts/bookkeeper.js +2 -0
- data/app/controllers/bookkeeper/balance_controller.rb +15 -0
- data/app/controllers/bookkeeper/movements_controller.rb +67 -0
- data/app/models/bookkeeper/account.rb +25 -0
- data/app/models/bookkeeper/categories.rb +9 -0
- data/app/models/bookkeeper/movement.rb +27 -0
- data/app/models/bookkeeper/purchase.rb +4 -1
- data/app/uploaders/receipt_uploader.rb +8 -8
- data/app/views/bookkeeper/balance/index.html.erb +31 -0
- data/app/views/bookkeeper/movements/_form.html.erb +15 -0
- data/app/views/bookkeeper/movements/_search.html.erb +6 -0
- data/app/views/bookkeeper/movements/edit.html.erb +5 -0
- data/app/views/bookkeeper/movements/index.html.erb +36 -0
- data/app/views/bookkeeper/movements/new.html.erb +5 -0
- data/app/views/bookkeeper/purchases/_form.html.erb +7 -1
- data/config/locales/en.yml +23 -0
- data/config/locales/rails-i18n.en.yml +206 -0
- data/config/locales/rails-i18n.it.yml +206 -0
- data/config/locales/simple_form.en.yml +3 -2
- data/config/routes.rb +2 -0
- data/db/migrate/20130228234536_create_bookkeeper_accounts.rb +14 -0
- data/db/migrate/20130228234703_create_bookkeeper_movements.rb +14 -0
- data/db/migrate/20130308231159_add_details_to_purchases.rb +6 -0
- data/db/migrate/20130308231918_create_bookkeeper_categories.rb +9 -0
- data/lib/bookkeeper/engine.rb +0 -1
- data/lib/bookkeeper/version.rb +1 -1
- data/spec/controllers/bookkeeper/balance_controller_spec.rb +26 -0
- data/spec/controllers/bookkeeper/movements_controller_spec.rb +147 -0
- data/spec/controllers/bookkeeper/purchases_controller_spec.rb +144 -158
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +37 -3
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +69 -0
- data/spec/dummy/log/test.log +8485 -0
- data/spec/factories/bookkeeper_accounts.rb +10 -0
- data/spec/factories/bookkeeper_categories.rb +6 -0
- data/spec/factories/bookkeeper_movements.rb +22 -0
- data/spec/factories/bookkeeper_purchases.rb +1 -0
- data/spec/models/bookkeeper/account_spec.rb +21 -0
- data/spec/models/bookkeeper/categories_spec.rb +7 -0
- data/spec/models/bookkeeper/movement_spec.rb +28 -0
- data/spec/uploaders/receipt_uploader_spec.rb +5 -5
- metadata +53 -18
@@ -0,0 +1,15 @@
|
|
1
|
+
require_dependency "bookkeeper/application_controller"
|
2
|
+
|
3
|
+
module Bookkeeper
|
4
|
+
class BalanceController < ApplicationController
|
5
|
+
def index
|
6
|
+
@movements = Movement.all
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.json { render json: @movements }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require_dependency "bookkeeper/application_controller"
|
2
|
+
|
3
|
+
module Bookkeeper
|
4
|
+
class MovementsController < ApplicationController
|
5
|
+
def index
|
6
|
+
@movements = Movement.all
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html
|
10
|
+
format.json { render json: @movements }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
@movement = Movement.new
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
format.html
|
19
|
+
format.json { render json: @movement }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def edit
|
24
|
+
@movement = Movement.find(params[:id])
|
25
|
+
end
|
26
|
+
|
27
|
+
def create
|
28
|
+
@movement = Movement.new(params[:movement])
|
29
|
+
|
30
|
+
respond_to do |format|
|
31
|
+
if @movement.save
|
32
|
+
format.html { redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.movements.created') }
|
33
|
+
format.json { render json: @movement, status: :created, location: @movement }
|
34
|
+
else
|
35
|
+
format.html { render action: "new" }
|
36
|
+
format.json { render json: @movement.errors, status: :unprocessable_entity }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def update
|
42
|
+
@movement = Movement.find(params[:id])
|
43
|
+
|
44
|
+
respond_to do |format|
|
45
|
+
if @movement.update_attributes(params[:movement])
|
46
|
+
format.html { redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.movements.updated') }
|
47
|
+
format.json { head :no_content }
|
48
|
+
else
|
49
|
+
format.html { render action: "edit" }
|
50
|
+
format.json { render json: @movement.errors, status: :unprocessable_entity }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def destroy
|
56
|
+
@movement = Movement.find(params[:id])
|
57
|
+
@movement.destroy
|
58
|
+
flash[:notice] = I18n.t('.bookkeeper.controllers.movements.destroyed')
|
59
|
+
|
60
|
+
respond_to do |format|
|
61
|
+
format.html { redirect_to balance_index_path }
|
62
|
+
format.json { head :no_content }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Bookkeeper
|
2
|
+
class Account < ActiveRecord::Base
|
3
|
+
attr_accessible :start_date, :initial_balance
|
4
|
+
|
5
|
+
has_many :movements, class_name: "Bookkeeper::Movement"
|
6
|
+
|
7
|
+
validates :balance, numericality: { allow_nil: true }
|
8
|
+
validates :title, presence: true, uniqueness: true
|
9
|
+
|
10
|
+
before_save do
|
11
|
+
self.update_start_date if self.start_date.blank? and !self.movements.empty?
|
12
|
+
self.rebuild_balance
|
13
|
+
end
|
14
|
+
|
15
|
+
def rebuild_balance
|
16
|
+
self.balance = self.initial_balance + Movement.where('bookkeeper_movements.account_id = ?', self.id).sum(:amount)
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_start_date
|
20
|
+
self.update_attribute(:start_date, self.movements.first.created_at)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Bookkeeper
|
2
|
+
class Movement < ActiveRecord::Base
|
3
|
+
attr_accessible :amount, :description
|
4
|
+
|
5
|
+
belongs_to :account, class_name: "Bookkeeper::Account"
|
6
|
+
has_many :categories, as: :categorizable
|
7
|
+
|
8
|
+
validates :amount, presence: true, numericality: true
|
9
|
+
validates :description, presence: true
|
10
|
+
validate :amount_cannot_be_zero
|
11
|
+
validates :account, presence: true
|
12
|
+
|
13
|
+
default_scope order('created_at DESC')
|
14
|
+
|
15
|
+
|
16
|
+
after_save do
|
17
|
+
self.account.rebuild_balance
|
18
|
+
end
|
19
|
+
|
20
|
+
def amount_cannot_be_zero
|
21
|
+
if !amount.blank? && amount == 0
|
22
|
+
errors.add(:amount, I18n.t(".cannot_be_zero"))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -2,10 +2,13 @@ module Bookkeeper
|
|
2
2
|
class Purchase < ActiveRecord::Base
|
3
3
|
mount_uploader :receipt, ReceiptUploader
|
4
4
|
|
5
|
-
attr_accessible :description, :purchase_date, :title, :warranty_duration, :receipt
|
5
|
+
attr_accessible :description, :purchase_date, :title, :warranty_duration, :receipt, :invoice, :amount
|
6
|
+
|
7
|
+
has_many :categories, as: :categorizable
|
6
8
|
|
7
9
|
validates_presence_of :title
|
8
10
|
validates_numericality_of :warranty_duration, allow_nil: true
|
11
|
+
validates_numericality_of :amount, allow_nil: true
|
9
12
|
validates_date :purchase_date, allow_nil: true, allow_blank: true
|
10
13
|
|
11
14
|
default_scope order('created_at DESC')
|
@@ -3,7 +3,7 @@
|
|
3
3
|
class ReceiptUploader < CarrierWave::Uploader::Base
|
4
4
|
|
5
5
|
# Include RMagick or MiniMagick support:
|
6
|
-
include CarrierWave::RMagick
|
6
|
+
# include CarrierWave::RMagick
|
7
7
|
# include CarrierWave::MiniMagick
|
8
8
|
|
9
9
|
# Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
|
@@ -31,22 +31,22 @@ class ReceiptUploader < CarrierWave::Uploader::Base
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# Process files as they are uploaded:
|
34
|
-
process :resize_to_fit => [1000, 1000]
|
34
|
+
# process :resize_to_fit => [1000, 1000]
|
35
35
|
#
|
36
36
|
# def scale(width, height)
|
37
37
|
# # do something
|
38
38
|
# end
|
39
39
|
|
40
40
|
# Create different versions of your uploaded files:
|
41
|
-
version :thumb do
|
42
|
-
|
43
|
-
end
|
41
|
+
# version :thumb do
|
42
|
+
# process :resize_to_fill => [64, 64]
|
43
|
+
# end
|
44
44
|
|
45
45
|
# Add a white list of extensions which are allowed to be uploaded.
|
46
46
|
# For images you might use something like this:
|
47
|
-
def extension_white_list
|
48
|
-
|
49
|
-
end
|
47
|
+
# def extension_white_list
|
48
|
+
# %w(jpg jpeg gif png pdf)
|
49
|
+
# end
|
50
50
|
|
51
51
|
# Override the filename of the uploaded files:
|
52
52
|
# Avoid using model.id or version_name here, see uploader/store.rb for details.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<h1><%= t '.title' %></h1>
|
2
|
+
|
3
|
+
<table class='table table-striped table-condensed table-bordered'>
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th><%=t 'bookkeeper.models.movement.attributes.amount' %></th>
|
7
|
+
<th><%=t 'bookkeeper.models.movement.attributes.description' %></th>
|
8
|
+
<th><%=t 'bookkeeper.models.movement.attributes.created_at' %></th>
|
9
|
+
<th><%=t 'bookkeeper.models.movement.attributes.updated_at' %></th>
|
10
|
+
<th></th>
|
11
|
+
</tr>
|
12
|
+
</thead>
|
13
|
+
<tbody>
|
14
|
+
<% @movements.each do |movement| %>
|
15
|
+
<tr>
|
16
|
+
<td><%= number_to_currency movement.amount %></td>
|
17
|
+
<td><%= movement.description %></td>
|
18
|
+
<td><%=l movement.created_at, format: :short rescue '' %></td>
|
19
|
+
<td><%=l movement.updated_at, format: :short rescue '' %></td>
|
20
|
+
<td>
|
21
|
+
<%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_movement_path(movement), class: 'btn btn-mini' %>
|
22
|
+
<%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, movement, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-mini btn-danger' %>
|
23
|
+
</td>
|
24
|
+
</tr>
|
25
|
+
<% end %>
|
26
|
+
</tbody>
|
27
|
+
</table>
|
28
|
+
|
29
|
+
<br />
|
30
|
+
|
31
|
+
<%= link_to ('<i class="icon-plus"></i> ' + t('.new')).html_safe, new_movement_path, class: 'btn' %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= simple_form_for @movement, html: { class: 'form-horizontal' } do |f| %>
|
2
|
+
|
3
|
+
<%= f.error_notification %>
|
4
|
+
|
5
|
+
<div class="form-inputs">
|
6
|
+
<%= f.input :amount, :wrapper => :append do %>
|
7
|
+
<%= f.input_field :amount, class: "input-mini" %>
|
8
|
+
<%= content_tag :span, '€'.html_safe, class: "add-on" %>
|
9
|
+
<% end %>
|
10
|
+
<%= f.input :description, input_html: { class: 'input-xxlarge' } %>
|
11
|
+
</div>
|
12
|
+
<div class="form-actions">
|
13
|
+
<%= button_tag ('<i class="icon-ok"></i> ' + t('bookkeeper.actions.save')).html_safe, class: 'btn' %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<%= render partial: 'search' %>
|
2
|
+
<h1><%= t '.title' %></h1>
|
3
|
+
|
4
|
+
<table class='table table-striped table-condensed table-bordered'>
|
5
|
+
<thead>
|
6
|
+
<tr>
|
7
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.title' %></th>
|
8
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.description' %></th>
|
9
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.purchase_date' %></th>
|
10
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.warranty_duration' %></th>
|
11
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.receipt' %></th>
|
12
|
+
<th><%=t 'bookkeeper.models.purchase.attributes.updated_at' %></th>
|
13
|
+
<th></th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<% @purchases.each do |purchase| %>
|
18
|
+
<tr>
|
19
|
+
<td><%= purchase.title %></td>
|
20
|
+
<td><%= purchase.description %></td>
|
21
|
+
<td><%=l purchase.purchase_date rescue '' %></td>
|
22
|
+
<td><%= purchase.warranty_duration %> <%=t '.months' %></td>
|
23
|
+
<td><%= link_to "<i class='icon-download-alt'></i> #{purchase.receipt.file.filename}".html_safe, purchase.receipt.url, class: 'btn btn-mini' if purchase.receipt.file %></td>
|
24
|
+
<td><%=l purchase.updated_at, format: :short rescue '' %></td>
|
25
|
+
<td>
|
26
|
+
<%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_purchase_path(purchase), class: 'btn btn-mini' %>
|
27
|
+
<%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, purchase, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-mini btn-danger' %>
|
28
|
+
</td>
|
29
|
+
</tr>
|
30
|
+
<% end %>
|
31
|
+
</tbody>
|
32
|
+
</table>
|
33
|
+
|
34
|
+
<br />
|
35
|
+
|
36
|
+
<%= link_to ('<i class="icon-plus"></i> ' + t('bookkeeper.actions.new')).html_safe, new_purchase_path, class: 'btn' %>
|
@@ -6,7 +6,13 @@
|
|
6
6
|
<%= f.input :title %>
|
7
7
|
<%= f.input :description, input_html: { class: 'input-xxlarge', rows: 4 } %>
|
8
8
|
<%= f.input :purchase_date, :wrapper => :prepend do %>
|
9
|
-
<%= content_tag :span, '<i class="icon-
|
9
|
+
<%= content_tag :span, '<i class="icon-calendar"></i>'.html_safe, class: "add-on calendar" %>
|
10
|
+
<%= f.input_field :purchase_date, as: :datepicker, data: { 'date-format' => 'dd/mm/yyyy' } %>
|
11
|
+
<% end %>
|
12
|
+
<%= f.input :invoice %>
|
13
|
+
<%= f.input :amount, :wrapper => :prepend do %>
|
14
|
+
<%= content_tag :span, '<i class="icon-money"></i>'.html_safe, class: "add-on calendar" %>
|
15
|
+
<%= f.input_field :amount, class: "input-mini" %>
|
10
16
|
<% end %>
|
11
17
|
<%= f.input :warranty_duration, collection: [["6 months", 6], ["1 year", 12], ["2 years", 24], ["3 years", 36]], input_html: { class: 'input-small' } %>
|
12
18
|
<%= f.input :receipt %>
|
data/config/locales/en.yml
CHANGED
@@ -18,12 +18,22 @@ en:
|
|
18
18
|
warranty_duration: 'Warranty duration'
|
19
19
|
receipt: 'Receipt'
|
20
20
|
updated_at: 'Last update'
|
21
|
+
movement:
|
22
|
+
attributes:
|
23
|
+
amount: 'Amount'
|
24
|
+
description: 'Description'
|
25
|
+
created_at: 'Creation date'
|
26
|
+
updated_at: 'Last update'
|
21
27
|
# controllers
|
22
28
|
controllers:
|
23
29
|
purchases:
|
24
30
|
created: 'Purchase was successfully created.'
|
25
31
|
updated: 'Purchase was successfully updated.'
|
26
32
|
destroyed: 'Purchase was successfully deleted.'
|
33
|
+
movementss:
|
34
|
+
created: 'Movement was successfully created.'
|
35
|
+
updated: 'Movement was successfully updated.'
|
36
|
+
destroyed: 'Movement was successfully deleted.'
|
27
37
|
# views
|
28
38
|
search:
|
29
39
|
create:
|
@@ -38,3 +48,16 @@ en:
|
|
38
48
|
title: 'Edit purchase'
|
39
49
|
search:
|
40
50
|
search: 'Search'
|
51
|
+
balance:
|
52
|
+
index:
|
53
|
+
title: 'Last movements'
|
54
|
+
new: 'Insert new movement'
|
55
|
+
movements:
|
56
|
+
index:
|
57
|
+
title: 'Listing movements'
|
58
|
+
new:
|
59
|
+
title: 'New movement'
|
60
|
+
edit:
|
61
|
+
title: 'Edit movement'
|
62
|
+
search:
|
63
|
+
search: 'Search'
|
@@ -0,0 +1,206 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
en:
|
3
|
+
date:
|
4
|
+
abbr_day_names:
|
5
|
+
- Sun
|
6
|
+
- Mon
|
7
|
+
- Tue
|
8
|
+
- Wed
|
9
|
+
- Thu
|
10
|
+
- Fri
|
11
|
+
- Sat
|
12
|
+
abbr_month_names:
|
13
|
+
-
|
14
|
+
- Jan
|
15
|
+
- Feb
|
16
|
+
- Mar
|
17
|
+
- Apr
|
18
|
+
- May
|
19
|
+
- Jun
|
20
|
+
- Jul
|
21
|
+
- Aug
|
22
|
+
- Sep
|
23
|
+
- Oct
|
24
|
+
- Nov
|
25
|
+
- Dec
|
26
|
+
day_names:
|
27
|
+
- Sunday
|
28
|
+
- Monday
|
29
|
+
- Tuesday
|
30
|
+
- Wednesday
|
31
|
+
- Thursday
|
32
|
+
- Friday
|
33
|
+
- Saturday
|
34
|
+
formats:
|
35
|
+
default: ! '%Y-%m-%d'
|
36
|
+
long: ! '%B %d, %Y'
|
37
|
+
short: ! '%b %d'
|
38
|
+
month_names:
|
39
|
+
-
|
40
|
+
- January
|
41
|
+
- February
|
42
|
+
- March
|
43
|
+
- April
|
44
|
+
- May
|
45
|
+
- June
|
46
|
+
- July
|
47
|
+
- August
|
48
|
+
- September
|
49
|
+
- October
|
50
|
+
- November
|
51
|
+
- December
|
52
|
+
order:
|
53
|
+
- :year
|
54
|
+
- :month
|
55
|
+
- :day
|
56
|
+
datetime:
|
57
|
+
distance_in_words:
|
58
|
+
about_x_hours:
|
59
|
+
one: about 1 hour
|
60
|
+
other: about %{count} hours
|
61
|
+
about_x_months:
|
62
|
+
one: about 1 month
|
63
|
+
other: about %{count} months
|
64
|
+
about_x_years:
|
65
|
+
one: about 1 year
|
66
|
+
other: about %{count} years
|
67
|
+
almost_x_years:
|
68
|
+
one: almost 1 year
|
69
|
+
other: almost %{count} years
|
70
|
+
half_a_minute: half a minute
|
71
|
+
less_than_x_minutes:
|
72
|
+
one: less than a minute
|
73
|
+
other: less than %{count} minutes
|
74
|
+
less_than_x_seconds:
|
75
|
+
one: less than 1 second
|
76
|
+
other: less than %{count} seconds
|
77
|
+
over_x_years:
|
78
|
+
one: over 1 year
|
79
|
+
other: over %{count} years
|
80
|
+
x_days:
|
81
|
+
one: 1 day
|
82
|
+
other: ! '%{count} days'
|
83
|
+
x_minutes:
|
84
|
+
one: 1 minute
|
85
|
+
other: ! '%{count} minutes'
|
86
|
+
x_months:
|
87
|
+
one: 1 month
|
88
|
+
other: ! '%{count} months'
|
89
|
+
x_seconds:
|
90
|
+
one: 1 second
|
91
|
+
other: ! '%{count} seconds'
|
92
|
+
prompts:
|
93
|
+
day: Day
|
94
|
+
hour: Hour
|
95
|
+
minute: Minute
|
96
|
+
month: Month
|
97
|
+
second: Seconds
|
98
|
+
year: Year
|
99
|
+
errors: &errors
|
100
|
+
format: ! '%{attribute} %{message}'
|
101
|
+
messages:
|
102
|
+
accepted: must be accepted
|
103
|
+
blank: can't be blank
|
104
|
+
confirmation: doesn't match confirmation
|
105
|
+
empty: can't be empty
|
106
|
+
equal_to: must be equal to %{count}
|
107
|
+
even: must be even
|
108
|
+
exclusion: is reserved
|
109
|
+
greater_than: must be greater than %{count}
|
110
|
+
greater_than_or_equal_to: must be greater than or equal to %{count}
|
111
|
+
inclusion: is not included in the list
|
112
|
+
invalid: is invalid
|
113
|
+
less_than: must be less than %{count}
|
114
|
+
less_than_or_equal_to: must be less than or equal to %{count}
|
115
|
+
not_a_number: is not a number
|
116
|
+
not_an_integer: must be an integer
|
117
|
+
odd: must be odd
|
118
|
+
record_invalid: ! 'Validation failed: %{errors}'
|
119
|
+
taken: has already been taken
|
120
|
+
too_long:
|
121
|
+
one: is too long (maximum is 1 character)
|
122
|
+
other: is too long (maximum is %{count} characters)
|
123
|
+
too_short:
|
124
|
+
one: is too short (minimum is 1 character)
|
125
|
+
other: is too short (minimum is %{count} characters)
|
126
|
+
wrong_length:
|
127
|
+
one: is the wrong length (should be 1 character)
|
128
|
+
other: is the wrong length (should be %{count} characters)
|
129
|
+
template:
|
130
|
+
body: ! 'There were problems with the following fields:'
|
131
|
+
header:
|
132
|
+
one: 1 error prohibited this %{model} from being saved
|
133
|
+
other: ! '%{count} errors prohibited this %{model} from being saved'
|
134
|
+
helpers:
|
135
|
+
select:
|
136
|
+
prompt: Please select
|
137
|
+
submit:
|
138
|
+
create: Create %{model}
|
139
|
+
submit: Save %{model}
|
140
|
+
update: Update %{model}
|
141
|
+
number:
|
142
|
+
currency:
|
143
|
+
format:
|
144
|
+
delimiter: .
|
145
|
+
format: ! '%n %u'
|
146
|
+
precision: 2
|
147
|
+
separator: ! '.'
|
148
|
+
significant: false
|
149
|
+
strip_insignificant_zeros: false
|
150
|
+
unit: €
|
151
|
+
format:
|
152
|
+
delimiter: ! ','
|
153
|
+
precision: 3
|
154
|
+
separator: .
|
155
|
+
significant: false
|
156
|
+
strip_insignificant_zeros: false
|
157
|
+
human:
|
158
|
+
decimal_units:
|
159
|
+
format: ! '%n %u'
|
160
|
+
units:
|
161
|
+
billion: Billion
|
162
|
+
million: Million
|
163
|
+
quadrillion: Quadrillion
|
164
|
+
thousand: Thousand
|
165
|
+
trillion: Trillion
|
166
|
+
unit: ''
|
167
|
+
format:
|
168
|
+
delimiter: ''
|
169
|
+
precision: 3
|
170
|
+
significant: true
|
171
|
+
strip_insignificant_zeros: true
|
172
|
+
storage_units:
|
173
|
+
format: ! '%n %u'
|
174
|
+
units:
|
175
|
+
byte:
|
176
|
+
one: Byte
|
177
|
+
other: Bytes
|
178
|
+
gb: GB
|
179
|
+
kb: KB
|
180
|
+
mb: MB
|
181
|
+
tb: TB
|
182
|
+
percentage:
|
183
|
+
format:
|
184
|
+
delimiter: ''
|
185
|
+
precision:
|
186
|
+
format:
|
187
|
+
delimiter: ''
|
188
|
+
support:
|
189
|
+
array:
|
190
|
+
last_word_connector: ! ', and '
|
191
|
+
two_words_connector: ! ' and '
|
192
|
+
words_connector: ! ', '
|
193
|
+
time:
|
194
|
+
am: am
|
195
|
+
formats:
|
196
|
+
default: ! '%a, %d %b %Y %H:%M:%S %z'
|
197
|
+
long: ! '%B %d, %Y %H:%M'
|
198
|
+
short: ! '%d %b %H:%M'
|
199
|
+
pm: pm
|
200
|
+
# remove these aliases after 'activemodel' and 'activerecord' namespaces are removed from Rails repository
|
201
|
+
activemodel:
|
202
|
+
errors:
|
203
|
+
<<: *errors
|
204
|
+
activerecord:
|
205
|
+
errors:
|
206
|
+
<<: *errors
|