bookkeeper 0.0.5 → 0.0.6
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 +1 -1
- data/app/controllers/bookkeeper/balance_controller.rb +2 -6
- data/app/controllers/bookkeeper/incomings_controller.rb +41 -0
- data/app/controllers/bookkeeper/outgoings_controller.rb +41 -0
- data/app/models/bookkeeper/account.rb +26 -2
- data/app/models/bookkeeper/incoming.rb +5 -0
- data/app/models/bookkeeper/movement.rb +18 -3
- data/app/models/bookkeeper/outgoing.rb +6 -0
- data/app/views/bookkeeper/balance/_balance_chart.html.erb +26 -0
- data/app/views/bookkeeper/balance/_movements_chart.html.erb +46 -0
- data/app/views/bookkeeper/balance/index.html.erb +52 -27
- data/app/views/bookkeeper/incomings/_form.html.erb +3 -0
- data/app/views/bookkeeper/{movements → incomings}/edit.html.erb +0 -0
- data/app/views/bookkeeper/{movements → incomings}/new.html.erb +0 -0
- data/app/views/bookkeeper/outgoings/_form.html.erb +3 -0
- data/app/views/bookkeeper/outgoings/edit.html.erb +5 -0
- data/app/views/bookkeeper/outgoings/new.html.erb +5 -0
- data/app/views/bookkeeper/purchases/_form.html.erb +1 -1
- data/app/views/bookkeeper/purchases/index.html.erb +1 -1
- data/app/views/bookkeeper/shared/_movement_form.html.erb +16 -0
- data/config/locales/en.yml +20 -8
- data/config/locales/it.yml +84 -0
- data/config/locales/simple_form.it.yml +28 -0
- data/config/routes.rb +2 -1
- data/db/migrate/20130317163103_add_sti_to_movements.rb +6 -0
- data/db/migrate/20130317165439_add_default_to_accounts.rb +6 -0
- data/db/migrate/20130317181020_add_date_to_movements.rb +5 -0
- data/lib/bookkeeper/version.rb +1 -1
- metadata +20 -6
- data/app/controllers/bookkeeper/movements_controller.rb +0 -67
- data/app/views/bookkeeper/movements/_form.html.erb +0 -15
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
$(document).ready(function(){
|
|
4
4
|
$('a[data-toggle=tooltip]').tooltip();
|
|
5
5
|
|
|
6
|
-
$('input.datepicker').datepicker({
|
|
6
|
+
$('input.datepicker').datepicker({ weekStart: 1 });
|
|
7
7
|
|
|
8
8
|
$('form .add-on.calendar').click(function(){
|
|
9
9
|
var el = this.parentNode;
|
|
@@ -3,12 +3,8 @@ require_dependency "bookkeeper/application_controller"
|
|
|
3
3
|
module Bookkeeper
|
|
4
4
|
class BalanceController < ApplicationController
|
|
5
5
|
def index
|
|
6
|
-
@
|
|
7
|
-
|
|
8
|
-
respond_to do |format|
|
|
9
|
-
format.html
|
|
10
|
-
format.json { render json: @movements }
|
|
11
|
-
end
|
|
6
|
+
@account = Account.first
|
|
7
|
+
@movements = @account.movements
|
|
12
8
|
end
|
|
13
9
|
end
|
|
14
10
|
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_dependency "bookkeeper/application_controller"
|
|
2
|
+
|
|
3
|
+
module Bookkeeper
|
|
4
|
+
class IncomingsController < ApplicationController
|
|
5
|
+
def new
|
|
6
|
+
@incoming = Incoming.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def edit
|
|
10
|
+
@incoming = Incoming.find(params[:id])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create
|
|
14
|
+
@incoming = Incoming.new(params[:incoming])
|
|
15
|
+
|
|
16
|
+
if @incoming.save
|
|
17
|
+
redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.incomings.created')
|
|
18
|
+
else
|
|
19
|
+
render action: "new"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update
|
|
24
|
+
@incoming = Incoming.find(params[:id])
|
|
25
|
+
|
|
26
|
+
if @incoming.update_attributes(params[:incoming])
|
|
27
|
+
redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.incomings.updated')
|
|
28
|
+
else
|
|
29
|
+
render action: "edit"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def destroy
|
|
34
|
+
@incoming = Incoming.find(params[:id])
|
|
35
|
+
@incoming.destroy
|
|
36
|
+
flash[:notice] = I18n.t('.bookkeeper.controllers.incomings.destroyed')
|
|
37
|
+
|
|
38
|
+
redirect_to balance_index_path
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_dependency "bookkeeper/application_controller"
|
|
2
|
+
|
|
3
|
+
module Bookkeeper
|
|
4
|
+
class OutgoingsController < ApplicationController
|
|
5
|
+
def new
|
|
6
|
+
@outgoing = Outgoing.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def edit
|
|
10
|
+
@outgoing = Outgoing.find(params[:id])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create
|
|
14
|
+
@outgoing = Outgoing.new(params[:outgoing])
|
|
15
|
+
|
|
16
|
+
if @outgoing.save
|
|
17
|
+
redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.outgoings.created')
|
|
18
|
+
else
|
|
19
|
+
render action: "new"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update
|
|
24
|
+
@outgoing = Outgoing.find(params[:id])
|
|
25
|
+
|
|
26
|
+
if @outgoing.update_attributes(params[:outgoing])
|
|
27
|
+
redirect_to balance_index_path, notice: I18n.t('.bookkeeper.controllers.outgoings.updated')
|
|
28
|
+
else
|
|
29
|
+
render action: "edit"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def destroy
|
|
34
|
+
@outgoing = Outgoing.find(params[:id])
|
|
35
|
+
@outgoing.destroy
|
|
36
|
+
flash[:notice] = I18n.t('.bookkeeper.controllers.outgoings.destroyed')
|
|
37
|
+
|
|
38
|
+
redirect_to balance_index_path
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -1,24 +1,48 @@
|
|
|
1
1
|
module Bookkeeper
|
|
2
2
|
class Account < ActiveRecord::Base
|
|
3
|
-
attr_accessible :start_date, :initial_balance
|
|
3
|
+
attr_accessible :title, :start_date, :initial_balance, :default
|
|
4
4
|
|
|
5
5
|
has_many :movements, class_name: "Bookkeeper::Movement"
|
|
6
|
+
has_many :incomings, class_name: "Bookkeeper::Incoming"
|
|
7
|
+
has_many :outgoings, class_name: "Bookkeeper::Outgoing"
|
|
6
8
|
|
|
7
9
|
validates :balance, numericality: { allow_nil: true }
|
|
8
10
|
validates :title, presence: true, uniqueness: true
|
|
11
|
+
validate :default_must_be_uniq
|
|
9
12
|
|
|
10
13
|
before_save do
|
|
11
14
|
self.update_start_date if self.start_date.blank? and !self.movements.empty?
|
|
12
15
|
self.rebuild_balance
|
|
13
16
|
end
|
|
14
17
|
|
|
18
|
+
def update_balance
|
|
19
|
+
self.rebuild_balance
|
|
20
|
+
self.save
|
|
21
|
+
end
|
|
22
|
+
|
|
15
23
|
def rebuild_balance
|
|
16
|
-
self.balance = self.initial_balance +
|
|
24
|
+
self.balance = self.initial_balance + self.incomings.sum(:amount) - self.outgoings.sum(:amount)
|
|
17
25
|
end
|
|
18
26
|
|
|
19
27
|
def update_start_date
|
|
20
28
|
self.update_attribute(:start_date, self.movements.first.created_at)
|
|
21
29
|
end
|
|
30
|
+
|
|
31
|
+
def self.default
|
|
32
|
+
if account = Account.find_by_default(true)
|
|
33
|
+
account
|
|
34
|
+
else
|
|
35
|
+
Account.create(title: "Default", start_date: Time.now, initial_balance: 0.0, default: true)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
|
|
41
|
+
def default_must_be_uniq
|
|
42
|
+
if !self.persisted? && Account.where(default: true).first != self
|
|
43
|
+
errors.add(:base, I18n.t(".default_must_be_uniq"))
|
|
44
|
+
end
|
|
45
|
+
end
|
|
22
46
|
end
|
|
23
47
|
end
|
|
24
48
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Bookkeeper
|
|
2
2
|
class Movement < ActiveRecord::Base
|
|
3
|
-
attr_accessible :amount, :description
|
|
3
|
+
attr_accessible :amount, :description, :date
|
|
4
4
|
|
|
5
5
|
belongs_to :account, class_name: "Bookkeeper::Account"
|
|
6
6
|
has_many :categories, as: :categorizable
|
|
@@ -9,14 +9,29 @@ module Bookkeeper
|
|
|
9
9
|
validates :description, presence: true
|
|
10
10
|
validate :amount_cannot_be_zero
|
|
11
11
|
validates :account, presence: true
|
|
12
|
+
validates :date, presence: true
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
scope :ordered, order('date ASC, created_at ASC')
|
|
15
|
+
scope :reverse_ordered, order('date DESC, created_at DESC')
|
|
14
16
|
|
|
17
|
+
before_validation do
|
|
18
|
+
self.account = Account.default unless self.account
|
|
19
|
+
end
|
|
15
20
|
|
|
16
21
|
after_save do
|
|
17
|
-
self.account.
|
|
22
|
+
self.account.update_balance
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
after_destroy do
|
|
26
|
+
self.account.update_balance
|
|
18
27
|
end
|
|
19
28
|
|
|
29
|
+
def incoming?
|
|
30
|
+
self.class == Bookkeeper::Incoming
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
protected
|
|
34
|
+
|
|
20
35
|
def amount_cannot_be_zero
|
|
21
36
|
if !amount.blank? && amount == 0
|
|
22
37
|
errors.add(:amount, I18n.t(".cannot_be_zero"))
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<% content_for :javascripts do %>
|
|
2
|
+
<script type="text/javascript">
|
|
3
|
+
google.setOnLoadCallback(drawBalanceChart);
|
|
4
|
+
function drawBalanceChart() {
|
|
5
|
+
var data = google.visualization.arrayToDataTable([
|
|
6
|
+
['<%=t ".date" %>', null],
|
|
7
|
+
<% balance = @account.initial_balance %>
|
|
8
|
+
['<%= @account.start_date.strftime("%d/%m/%Y") %>', <%= balance %> ],
|
|
9
|
+
<% @movements.ordered.each do |movement| %>
|
|
10
|
+
<% movement.incoming? ? (balance += movement.amount) : (balance -= movement.amount) %>
|
|
11
|
+
['<%= movement.date.strftime("%d/%m/%Y") %>', <%= balance %> ],
|
|
12
|
+
<% end %>
|
|
13
|
+
]);
|
|
14
|
+
|
|
15
|
+
var options = {
|
|
16
|
+
title: '<%=t ".title" %>',
|
|
17
|
+
colors: ['#F89406']
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
var chart = new google.visualization.LineChart(document.getElementById('balance_chart'));
|
|
21
|
+
chart.draw(data, options);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
</script>
|
|
25
|
+
<% end %>
|
|
26
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<% content_for :javascripts do %>
|
|
2
|
+
<script type="text/javascript">
|
|
3
|
+
google.load("visualization", "1", {packages:["corechart"]});
|
|
4
|
+
google.setOnLoadCallback(drawMovementsChart);
|
|
5
|
+
function drawMovementsChart() {
|
|
6
|
+
var data = new google.visualization.DataTable();
|
|
7
|
+
data.addColumn('string', '<%= t ".date" %>');
|
|
8
|
+
data.addColumn('number', '<%= t ".movement" %>');
|
|
9
|
+
data.addRows([
|
|
10
|
+
<% @movements.ordered.each do |movement| %>
|
|
11
|
+
<% if movement.incoming? %>
|
|
12
|
+
['<%= movement.date.strftime("%d/%m/%Y") %>', <%= movement.amount %> ],
|
|
13
|
+
<% else %>
|
|
14
|
+
['<%= movement.date.strftime("%d/%m/%Y") %>', <%= -movement.amount %> ],
|
|
15
|
+
<% end %>
|
|
16
|
+
<% end %>
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
var options = {
|
|
20
|
+
isStacked: true,
|
|
21
|
+
title: '<%=t ".title" %>',
|
|
22
|
+
colors: ['#468847', '#F89406'],
|
|
23
|
+
chartArea: { top: 30 },
|
|
24
|
+
hAxis: { format:'#.##€' },
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
var view = new google.visualization.DataView(data);
|
|
28
|
+
view.setColumns([0, {
|
|
29
|
+
type: 'number',
|
|
30
|
+
label: null,
|
|
31
|
+
calc: function (dt, row) {
|
|
32
|
+
return (dt.getValue(row, 1) > 0) ? dt.getValue(row, 1) : null;
|
|
33
|
+
}
|
|
34
|
+
}, {
|
|
35
|
+
type: 'number',
|
|
36
|
+
label: null,
|
|
37
|
+
calc: function (dt, row) {
|
|
38
|
+
return (dt.getValue(row, 1) < 0) ? dt.getValue(row, 1) : null;
|
|
39
|
+
}
|
|
40
|
+
}]);
|
|
41
|
+
var chart = new google.visualization.BarChart(document.getElementById('movements_chart'));
|
|
42
|
+
chart.draw(view, options);
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
<% end %>
|
|
46
|
+
|
|
@@ -1,31 +1,56 @@
|
|
|
1
1
|
<h1><%= t '.title' %></h1>
|
|
2
2
|
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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>
|
|
3
|
+
<div class="row">
|
|
4
|
+
<div class="span3">
|
|
5
|
+
<h3><%=t '.account_balance' %></h3>
|
|
6
|
+
<p><%= number_to_currency @account.balance %></p>
|
|
7
|
+
</div>
|
|
8
|
+
<div id="balance_chart" class="span9" style="height: 300px;"></div>
|
|
9
|
+
</div>
|
|
28
10
|
|
|
29
|
-
<
|
|
11
|
+
<div class="row">
|
|
12
|
+
<div class="span6">
|
|
13
|
+
<table class='table table-striped table-condensed table-bordered'>
|
|
14
|
+
<thead>
|
|
15
|
+
<tr>
|
|
16
|
+
<th><%=t 'bookkeeper.models.movement.attributes.amount' %></th>
|
|
17
|
+
<th><%=t 'bookkeeper.models.movement.attributes.description' %></th>
|
|
18
|
+
<th><%=t 'bookkeeper.models.movement.attributes.date' %></th>
|
|
19
|
+
<th></th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
<tbody>
|
|
23
|
+
<% @movements.reverse_ordered.each do |movement| %>
|
|
24
|
+
<tr>
|
|
25
|
+
<td>
|
|
26
|
+
<span class="label label-<%= movement.incoming? ? "success" : "warning" %>"><%= (movement.incoming? ? '<i class="icon-circle-arrow-down"></i>' : '<i class="icon-circle-arrow-up"></i>').html_safe %></span>
|
|
27
|
+
<%= number_to_currency movement.amount %></td>
|
|
28
|
+
<td><%= movement.description %></td>
|
|
29
|
+
<td><%=l movement.date, format: :short rescue '' %></td>
|
|
30
|
+
<td>
|
|
31
|
+
<% if movement.incoming? %>
|
|
32
|
+
<%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_incoming_path(movement), class: 'btn btn-mini' %>
|
|
33
|
+
<% else %>
|
|
34
|
+
<%= link_to ('<i class="icon-pencil"></i> ' + t('bookkeeper.actions.edit')).html_safe, edit_outgoing_path(movement), class: 'btn btn-mini' %>
|
|
35
|
+
<% end %>
|
|
36
|
+
<%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, movement, method: :delete, data: { confirm: t('bookkeeper.actions.destroy_confirm', default: 'Are you sure?') }, class: 'btn btn-mini btn-danger' %>
|
|
37
|
+
</td>
|
|
38
|
+
</tr>
|
|
39
|
+
<% end %>
|
|
40
|
+
</tbody>
|
|
41
|
+
</table>
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
<br />
|
|
44
|
+
|
|
45
|
+
<%= link_to ('<i class="icon-circle-arrow-down"></i> ' + t('.new_incoming')).html_safe, new_incoming_path, class: 'btn btn-success' %>
|
|
46
|
+
<%= link_to ('<i class="icon-circle-arrow-up"></i> ' + t('.new_outgoing')).html_safe, new_outgoing_path, class: 'btn btn-warning' %>
|
|
47
|
+
</div>
|
|
48
|
+
<div id="movements_chart" class="span6" style="height: 500px;"></div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
<% content_for :javascripts do %>
|
|
53
|
+
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
|
54
|
+
<% end %>
|
|
55
|
+
<%= render partial: "movements_chart" %>
|
|
56
|
+
<%= render partial: "balance_chart" %>
|
|
File without changes
|
|
File without changes
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<%= content_tag :span, '<i class="icon-money"></i>'.html_safe, class: "add-on calendar" %>
|
|
15
15
|
<%= f.input_field :amount, class: "input-mini" %>
|
|
16
16
|
<% end %>
|
|
17
|
-
<%= f.input :warranty_duration, collection: [["6 months", 6], ["1 year", 12], ["2 years", 24], ["3 years", 36]], input_html: { class: 'input-small' } %>
|
|
17
|
+
<%= f.input :warranty_duration, collection: [["6 #{t('simple_form.labels.purchase.months')}", 6], ["1 #{t('simple_form.labels.purchase.year')}", 12], ["2 #{t('simple_form.labels.purchase.years')}", 24], ["3 #{t('simple_form.labels.purchase.years')}", 36]], input_html: { class: 'input-small' } %>
|
|
18
18
|
<%= f.input :receipt %>
|
|
19
19
|
</div>
|
|
20
20
|
<div class="form-actions">
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<td><%=l purchase.updated_at, format: :short rescue '' %></td>
|
|
25
25
|
<td>
|
|
26
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' %>
|
|
27
|
+
<%= link_to ('<i class="icon-remove"></i> ' + t('bookkeeper.actions.destroy')).html_safe, purchase, method: :delete, data: { confirm: t('bookkeeper.actions.destroy_confirm', default: 'Are you sure?') }, class: 'btn btn-mini btn-danger' %>
|
|
28
28
|
</td>
|
|
29
29
|
</tr>
|
|
30
30
|
<% end %>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%= f.error_notification %>
|
|
2
|
+
|
|
3
|
+
<div class="form-inputs">
|
|
4
|
+
<%= f.input :amount, :wrapper => :append do %>
|
|
5
|
+
<%= f.input_field :amount, class: "input-mini" %>
|
|
6
|
+
<%= content_tag :span, '€'.html_safe, class: "add-on" %>
|
|
7
|
+
<% end %>
|
|
8
|
+
<%= f.input :description, input_html: { class: 'input-xxlarge' } %>
|
|
9
|
+
<%= f.input :date, :wrapper => :prepend do %>
|
|
10
|
+
<%= content_tag :span, '<i class="icon-calendar"></i>'.html_safe, class: "add-on calendar" %>
|
|
11
|
+
<%= f.input_field :date, as: :datepicker, data: { 'date-format' => 'dd/mm/yyyy' } %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="form-actions">
|
|
15
|
+
<%= button_tag ('<i class="icon-ok"></i> ' + t('bookkeeper.actions.save')).html_safe, class: 'btn' %>
|
|
16
|
+
</div>
|
data/config/locales/en.yml
CHANGED
|
@@ -27,13 +27,17 @@ en:
|
|
|
27
27
|
# controllers
|
|
28
28
|
controllers:
|
|
29
29
|
purchases:
|
|
30
|
-
created: '
|
|
31
|
-
updated: '
|
|
32
|
-
destroyed: '
|
|
33
|
-
|
|
34
|
-
created: '
|
|
35
|
-
updated: '
|
|
36
|
-
destroyed: '
|
|
30
|
+
created: 'The purchase was successfully created.'
|
|
31
|
+
updated: 'The purchase was successfully updated.'
|
|
32
|
+
destroyed: 'The purchase was successfully deleted.'
|
|
33
|
+
incomings:
|
|
34
|
+
created: 'The movement was successfully created.'
|
|
35
|
+
updated: 'The movement was successfully updated.'
|
|
36
|
+
destroyed: 'The movement was successfully deleted.'
|
|
37
|
+
outgoings:
|
|
38
|
+
created: 'The movement was successfully created.'
|
|
39
|
+
updated: 'The movement was successfully updated.'
|
|
40
|
+
destroyed: 'The movement was successfully deleted.'
|
|
37
41
|
# views
|
|
38
42
|
search:
|
|
39
43
|
create:
|
|
@@ -51,7 +55,15 @@ en:
|
|
|
51
55
|
balance:
|
|
52
56
|
index:
|
|
53
57
|
title: 'Last movements'
|
|
54
|
-
|
|
58
|
+
new_incoming: 'New incoming'
|
|
59
|
+
new_outgoing: 'New outgoing'
|
|
60
|
+
date: "Date"
|
|
61
|
+
balance_chart:
|
|
62
|
+
title: "Balance"
|
|
63
|
+
movements_chart:
|
|
64
|
+
title: "Movements"
|
|
65
|
+
incomings: "Incomings"
|
|
66
|
+
outgoings: "Outgoings"
|
|
55
67
|
movements:
|
|
56
68
|
index:
|
|
57
69
|
title: 'Listing movements'
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#encoding: utf-8
|
|
2
|
+
it:
|
|
3
|
+
bookkeeper:
|
|
4
|
+
# actions
|
|
5
|
+
actions:
|
|
6
|
+
save: 'Salva'
|
|
7
|
+
back: 'Indietro'
|
|
8
|
+
new: 'Nuovo'
|
|
9
|
+
edit: 'Modifica'
|
|
10
|
+
destroy: 'Elimina'
|
|
11
|
+
destroy_confirm: 'Sei sicuro?'
|
|
12
|
+
# models
|
|
13
|
+
models:
|
|
14
|
+
purchase:
|
|
15
|
+
attributes:
|
|
16
|
+
title: 'Titolo'
|
|
17
|
+
description: 'Descrizione'
|
|
18
|
+
purchase_date: 'Data di acquisto'
|
|
19
|
+
warranty_duration: 'Durata della garanzia'
|
|
20
|
+
receipt: 'Ricevuta'
|
|
21
|
+
updated_at: 'Ultimo aggiornamento'
|
|
22
|
+
movement:
|
|
23
|
+
attributes:
|
|
24
|
+
amount: 'Importo'
|
|
25
|
+
description: 'Descrizione'
|
|
26
|
+
created_at: 'Data di creazione'
|
|
27
|
+
updated_at: 'Ultimo aggiornamento'
|
|
28
|
+
date: "Data"
|
|
29
|
+
# controllers
|
|
30
|
+
controllers:
|
|
31
|
+
purchases:
|
|
32
|
+
creato: "L'acquisto è stato correttamente creato."
|
|
33
|
+
modificato: "L'acquisto è stato correttamente modificato."
|
|
34
|
+
destroyed: "L'acquisto è stato correttamente eliminato."
|
|
35
|
+
incomings:
|
|
36
|
+
creato: 'Il movimento è stato correttamente creato.'
|
|
37
|
+
modificato: 'Il movimento è stato correttamente modificato.'
|
|
38
|
+
destroyed: 'Il movimento è stato correttamente eliminato.'
|
|
39
|
+
outgoings:
|
|
40
|
+
creato: 'Il movimento è stato correttamente creato.'
|
|
41
|
+
modificato: 'Il movimento è stato correttamente modificato.'
|
|
42
|
+
destroyed: 'Il movimento è stato correttamente eliminato.'
|
|
43
|
+
# views
|
|
44
|
+
search:
|
|
45
|
+
create:
|
|
46
|
+
title: 'Risultati della ricerca di "%{q}"'
|
|
47
|
+
purchases:
|
|
48
|
+
index:
|
|
49
|
+
title: 'Acquisti'
|
|
50
|
+
months: 'mesi'
|
|
51
|
+
new:
|
|
52
|
+
title: 'Nuovo acquisto'
|
|
53
|
+
edit:
|
|
54
|
+
title: "Modifica l'acquisto"
|
|
55
|
+
search:
|
|
56
|
+
search: 'Cerca'
|
|
57
|
+
balance:
|
|
58
|
+
index:
|
|
59
|
+
title: 'Ultimi movimenti'
|
|
60
|
+
new_incoming: 'Nuova entrata'
|
|
61
|
+
new_outgoing: 'Nuova uscita'
|
|
62
|
+
date: "Data"
|
|
63
|
+
account_balance: "Bilancio"
|
|
64
|
+
balance_chart:
|
|
65
|
+
title: "Bilancio"
|
|
66
|
+
movements_chart:
|
|
67
|
+
title: "Movimento"
|
|
68
|
+
incomings: "Entrate"
|
|
69
|
+
outgoings: "Uscite"
|
|
70
|
+
movements:
|
|
71
|
+
index:
|
|
72
|
+
title: 'Ultimi movimenti'
|
|
73
|
+
new:
|
|
74
|
+
title: 'Nuovo movimento'
|
|
75
|
+
edit:
|
|
76
|
+
title: 'Modifica il movimento'
|
|
77
|
+
search:
|
|
78
|
+
search: 'Cerca'
|
|
79
|
+
incomings:
|
|
80
|
+
new:
|
|
81
|
+
title: 'Inserisci una nuova entrata'
|
|
82
|
+
outgoings:
|
|
83
|
+
new:
|
|
84
|
+
title: 'Inserisci una nuova uscita'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
it:
|
|
2
|
+
simple_form:
|
|
3
|
+
"yes": 'Si'
|
|
4
|
+
"no": 'No'
|
|
5
|
+
required:
|
|
6
|
+
html: '<a href="#" data-toggle="tooltip" title="Obbligatorio"><i class="icon-exclamation-sign"></i></a>'
|
|
7
|
+
error_notification:
|
|
8
|
+
default_message: "I seguenti problemi hanno impedito il salvataggio"
|
|
9
|
+
labels:
|
|
10
|
+
purchase:
|
|
11
|
+
title: 'Titolo'
|
|
12
|
+
description: 'Descrizione'
|
|
13
|
+
purchase_date: 'Data di acquisto'
|
|
14
|
+
warranty_duration: 'Durata della garanzia'
|
|
15
|
+
receipt: 'Ricevuta'
|
|
16
|
+
invoice: 'Fattura'
|
|
17
|
+
amount: 'Importo'
|
|
18
|
+
months: 'mesi'
|
|
19
|
+
year: 'anno'
|
|
20
|
+
years: 'anni'
|
|
21
|
+
incoming:
|
|
22
|
+
amount: 'Importo'
|
|
23
|
+
description: 'Descrizione'
|
|
24
|
+
date: 'Data'
|
|
25
|
+
outgoing:
|
|
26
|
+
amount: 'Importo'
|
|
27
|
+
description: 'Descrizione'
|
|
28
|
+
date: 'Data'
|
data/config/routes.rb
CHANGED
data/lib/bookkeeper/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bookkeeper
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.6
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-03-
|
|
12
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rails
|
|
@@ -234,37 +234,48 @@ files:
|
|
|
234
234
|
- app/assets/stylesheets/bookkeeper.css
|
|
235
235
|
- app/controllers/bookkeeper/application_controller.rb
|
|
236
236
|
- app/controllers/bookkeeper/balance_controller.rb
|
|
237
|
-
- app/controllers/bookkeeper/
|
|
237
|
+
- app/controllers/bookkeeper/incomings_controller.rb
|
|
238
|
+
- app/controllers/bookkeeper/outgoings_controller.rb
|
|
238
239
|
- app/controllers/bookkeeper/purchases_controller.rb
|
|
239
240
|
- app/controllers/bookkeeper/search_controller.rb
|
|
240
241
|
- app/helpers/bookkeeper/application_helper.rb
|
|
241
242
|
- app/inputs/datepicker_input.rb
|
|
242
243
|
- app/models/bookkeeper/account.rb
|
|
243
244
|
- app/models/bookkeeper/categories.rb
|
|
245
|
+
- app/models/bookkeeper/incoming.rb
|
|
244
246
|
- app/models/bookkeeper/movement.rb
|
|
247
|
+
- app/models/bookkeeper/outgoing.rb
|
|
245
248
|
- app/models/bookkeeper/purchase.rb
|
|
246
249
|
- app/uploaders/receipt_uploader.rb
|
|
250
|
+
- app/views/bookkeeper/balance/_balance_chart.html.erb
|
|
251
|
+
- app/views/bookkeeper/balance/_movements_chart.html.erb
|
|
247
252
|
- app/views/bookkeeper/balance/index.html.erb
|
|
248
|
-
- app/views/bookkeeper/
|
|
253
|
+
- app/views/bookkeeper/incomings/_form.html.erb
|
|
254
|
+
- app/views/bookkeeper/incomings/edit.html.erb
|
|
255
|
+
- app/views/bookkeeper/incomings/new.html.erb
|
|
249
256
|
- app/views/bookkeeper/movements/_search.html.erb
|
|
250
|
-
- app/views/bookkeeper/movements/edit.html.erb
|
|
251
257
|
- app/views/bookkeeper/movements/index.html.erb
|
|
252
|
-
- app/views/bookkeeper/
|
|
258
|
+
- app/views/bookkeeper/outgoings/_form.html.erb
|
|
259
|
+
- app/views/bookkeeper/outgoings/edit.html.erb
|
|
260
|
+
- app/views/bookkeeper/outgoings/new.html.erb
|
|
253
261
|
- app/views/bookkeeper/purchases/_form.html.erb
|
|
254
262
|
- app/views/bookkeeper/purchases/_search.html.erb
|
|
255
263
|
- app/views/bookkeeper/purchases/edit.html.erb
|
|
256
264
|
- app/views/bookkeeper/purchases/index.html.erb
|
|
257
265
|
- app/views/bookkeeper/purchases/new.html.erb
|
|
258
266
|
- app/views/bookkeeper/search/create.html.erb
|
|
267
|
+
- app/views/bookkeeper/shared/_movement_form.html.erb
|
|
259
268
|
- app/views/layouts/bookkeeper/application.html.erb
|
|
260
269
|
- config/initializers/carrierwave.rb
|
|
261
270
|
- config/initializers/simple_form.rb
|
|
262
271
|
- config/initializers/simple_form_bootstrap.rb
|
|
263
272
|
- config/initializers/validates_timeliness.rb
|
|
264
273
|
- config/locales/en.yml
|
|
274
|
+
- config/locales/it.yml
|
|
265
275
|
- config/locales/rails-i18n.en.yml
|
|
266
276
|
- config/locales/rails-i18n.it.yml
|
|
267
277
|
- config/locales/simple_form.en.yml
|
|
278
|
+
- config/locales/simple_form.it.yml
|
|
268
279
|
- config/locales/validates_timeliness.en.yml
|
|
269
280
|
- config/routes.rb
|
|
270
281
|
- db/migrate/20130215165240_create_bookkeeper_purchases.rb
|
|
@@ -272,6 +283,9 @@ files:
|
|
|
272
283
|
- db/migrate/20130228234703_create_bookkeeper_movements.rb
|
|
273
284
|
- db/migrate/20130308231159_add_details_to_purchases.rb
|
|
274
285
|
- db/migrate/20130308231918_create_bookkeeper_categories.rb
|
|
286
|
+
- db/migrate/20130317163103_add_sti_to_movements.rb
|
|
287
|
+
- db/migrate/20130317165439_add_default_to_accounts.rb
|
|
288
|
+
- db/migrate/20130317181020_add_date_to_movements.rb
|
|
275
289
|
- lib/bookkeeper/engine.rb
|
|
276
290
|
- lib/bookkeeper/version.rb
|
|
277
291
|
- lib/bookkeeper.rb
|
|
@@ -1,67 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
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 %>
|