bookkeeper 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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 %>
|