expense_gun 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +34 -0
  3. data/app/assets/javascripts/expense_gun/application.js +4 -0
  4. data/app/assets/stylesheets/expense_gun/application.sass +4 -0
  5. data/app/assets/stylesheets/expense_gun/expenses.sass +20 -0
  6. data/app/assets/stylesheets/expense_gun/layout.sass +2 -0
  7. data/app/controllers/expense_gun/application_controller.rb +7 -0
  8. data/app/controllers/expense_gun/expense_lines_controller.rb +64 -0
  9. data/app/controllers/expense_gun/expenses_controller.rb +107 -0
  10. data/app/helpers/expense_gun/application_helper.rb +4 -0
  11. data/app/helpers/expense_gun/form_helper.rb +11 -0
  12. data/app/models/expense_gun/ability.rb +30 -0
  13. data/app/models/expense_gun/category.rb +5 -0
  14. data/app/models/expense_gun/expense.rb +62 -0
  15. data/app/models/expense_gun/expense_line.rb +26 -0
  16. data/app/views/expense_gun/expense_lines/_form.html.slim +16 -0
  17. data/app/views/expense_gun/expense_lines/edit.html.slim +4 -0
  18. data/app/views/expense_gun/expense_lines/new.html.slim +4 -0
  19. data/app/views/expense_gun/expenses/_form.html.slim +5 -0
  20. data/app/views/expense_gun/expenses/edit.html.slim +4 -0
  21. data/app/views/expense_gun/expenses/index.html.slim +63 -0
  22. data/app/views/expense_gun/expenses/new.html.slim +4 -0
  23. data/app/views/expense_gun/expenses/show.html.slim +84 -0
  24. data/app/views/kaminari/bootstrap3/_gap.html.slim +2 -0
  25. data/app/views/kaminari/bootstrap3/_page.html.slim +6 -0
  26. data/app/views/kaminari/bootstrap3/_paginator.html.slim +8 -0
  27. data/config/cucumber.yml +8 -0
  28. data/config/initializers/formtastic.rb +78 -0
  29. data/config/routes.rb +13 -0
  30. data/db/migrate/20141201092102_create_expense_gun_expenses.rb +8 -0
  31. data/db/migrate/20141201100548_expenses_add_state.rb +5 -0
  32. data/db/migrate/20141201111528_create_expense_gun_expense_lines.rb +13 -0
  33. data/db/migrate/20141201115918_create_expense_gun_categories.rb +9 -0
  34. data/db/migrate/20141201145608_expense_lines_add_category_id.rb +5 -0
  35. data/db/migrate/20141202143656_categories_rename_tax.rb +5 -0
  36. data/db/migrate/20141202151845_expenses_add_date.rb +5 -0
  37. data/db/migrate/20141203153649_field_names_like_billing_machine.rb +7 -0
  38. data/lib/expense_gun/admin/category.rb +12 -0
  39. data/lib/expense_gun/engine.rb +9 -0
  40. data/lib/expense_gun/version.rb +3 -0
  41. data/lib/expense_gun.rb +8 -0
  42. data/lib/tasks/cucumber.rake +65 -0
  43. data/lib/tasks/expense_gun_tasks.rake +4 -0
  44. data/spec/dummy/README.rdoc +28 -0
  45. data/spec/dummy/Rakefile +6 -0
  46. data/spec/dummy/app/admin/dashboard.rb +33 -0
  47. data/spec/dummy/app/assets/javascripts/active_admin.js.coffee +1 -0
  48. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  49. data/spec/dummy/app/assets/stylesheets/active_admin.css.scss +17 -0
  50. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  51. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  52. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  53. data/spec/dummy/app/views/layouts/expense_gun/application.html.slim +20 -0
  54. data/spec/dummy/bin/bundle +3 -0
  55. data/spec/dummy/bin/rails +4 -0
  56. data/spec/dummy/bin/rake +4 -0
  57. data/spec/dummy/config/application.rb +23 -0
  58. data/spec/dummy/config/boot.rb +5 -0
  59. data/spec/dummy/config/database.yml +25 -0
  60. data/spec/dummy/config/environment.rb +5 -0
  61. data/spec/dummy/config/environments/development.rb +37 -0
  62. data/spec/dummy/config/environments/production.rb +78 -0
  63. data/spec/dummy/config/environments/test.rb +39 -0
  64. data/spec/dummy/config/initializers/active_admin.rb +233 -0
  65. data/spec/dummy/config/initializers/assets.rb +8 -0
  66. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  67. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  68. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/spec/dummy/config/initializers/inflections.rb +16 -0
  70. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  71. data/spec/dummy/config/initializers/session_store.rb +3 -0
  72. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  73. data/spec/dummy/config/locales/en.yml +23 -0
  74. data/spec/dummy/config/routes.rb +4 -0
  75. data/spec/dummy/config/secrets.yml +22 -0
  76. data/spec/dummy/config.ru +4 -0
  77. data/spec/dummy/db/schema.rb +42 -0
  78. data/spec/dummy/public/404.html +67 -0
  79. data/spec/dummy/public/422.html +67 -0
  80. data/spec/dummy/public/500.html +66 -0
  81. data/spec/dummy/public/favicon.ico +0 -0
  82. data/spec/factories/expense_gun_category.rb +7 -0
  83. data/spec/factories/expense_gun_expense.rb +11 -0
  84. data/spec/factories/expense_gun_expense_line.rb +10 -0
  85. data/spec/factories.rb +5 -0
  86. data/spec/models/category_spec.rb +12 -0
  87. data/spec/models/expense_line_spec.rb +81 -0
  88. data/spec/models/expense_spec.rb +171 -0
  89. data/spec/rails_helper.rb +52 -0
  90. data/spec/spec_helper.rb +85 -0
  91. metadata +319 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0e08be595ad351a7b620475f7c85e81d4e5956ae
4
+ data.tar.gz: a3284770e9fd5d1d057087fe45ee708ce6790cc2
5
+ SHA512:
6
+ metadata.gz: 44f9fb09c8b001ea8b5160f1a178cc428c67847e900e9cc0d72fea45d1f3bf996bbb9c7173aa2f7174627d814588cfca81b3f62402a4d5cd98a90271a0c7d235
7
+ data.tar.gz: 9bb3e349247c589c2b7e3f79096667b641f72f3cdbaab2a6609529f96c5c7cdc52340fb55b3ee7b8379a7f289150a2a482c9acd454857d61e027246d8d7195d3
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'ExpenseGun'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,4 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require bootstrap
4
+ //= require_tree .
@@ -0,0 +1,4 @@
1
+ //= require_tree .
2
+ //= require_self
3
+
4
+ @import bootstrap
@@ -0,0 +1,20 @@
1
+ .expenses
2
+ .panel strong
3
+ display: inline-block
4
+ width: 45%
5
+ .panel .date
6
+ text-align: right
7
+ color: #666
8
+ .actions-block
9
+ text-align: right
10
+ padding: 1em 0
11
+ .btn
12
+ margin-left: 0.5em
13
+ &:first-child
14
+ margin-left: 0
15
+
16
+ @media print
17
+ p
18
+ margin: 0
19
+ font-size: 10pt
20
+ line-height: 1.25em
@@ -0,0 +1,2 @@
1
+ body
2
+ padding-bottom: 1em
@@ -0,0 +1,7 @@
1
+ module ExpenseGun
2
+ class ApplicationController < ActionController::Base
3
+ def current_ability
4
+ @current_ability ||= Ability.new(nil)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,64 @@
1
+ require_dependency "expense_gun/application_controller"
2
+
3
+ module ExpenseGun
4
+ class ExpenseLinesController < ApplicationController
5
+ before_action :set_objects
6
+
7
+ def index
8
+ redirect_to expense_path(@expense)
9
+ end
10
+
11
+ def new
12
+ authorize! :edit, @expense
13
+
14
+ @expense_line = @expense.expense_lines.new
15
+ end
16
+
17
+ def create
18
+ authorize! :edit, @expense
19
+
20
+ @expense_line = @expense.expense_lines.new(expense_line_params)
21
+
22
+ if @expense_line.save
23
+ flash[:success] = "Expense line created"
24
+ redirect_to expense_path(@expense)
25
+ else
26
+ render :new
27
+ end
28
+ end
29
+
30
+ def edit
31
+ authorize! :edit, @expense
32
+ end
33
+
34
+ def update
35
+ authorize! :edit, @expense
36
+
37
+ if @expense_line.update_attributes(expense_line_params)
38
+ flash[:success] = "Expense line updated"
39
+ redirect_to expense_path(@expense)
40
+ else
41
+ render :edit
42
+ end
43
+ end
44
+
45
+ def destroy
46
+ authorize! :edit, @expense
47
+
48
+ @expense_line.destroy
49
+ flash[:success] = "Expense line destroyed"
50
+ redirect_to expense_path(@expense)
51
+ end
52
+
53
+ private
54
+
55
+ def set_objects
56
+ @expense = Expense.find params[:expense_id]
57
+ @expense_line = ExpenseLine.find params[:id] if params[:id].present?
58
+ end
59
+
60
+ def expense_line_params
61
+ params.require(:expense_line).permit!
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,107 @@
1
+ require_dependency "expense_gun/application_controller"
2
+
3
+ module ExpenseGun
4
+ class ExpensesController < ApplicationController
5
+ before_action :set_expense, only: [:show, :edit, :update, :destroy, :submit, :accept, :refuse, :cancel]
6
+
7
+ def index
8
+ authorize! :list, Expense
9
+
10
+ if params[:state].blank?
11
+ redirect_to state: "submited"
12
+ return
13
+ end
14
+
15
+ if params[:state] == "all"
16
+ @expenses ||= Expense.all
17
+ else
18
+ @expenses ||= Expense.where(state: params[:state])
19
+ end
20
+
21
+ @expenses = @expenses.page(params[:page])
22
+ @all_expenses ||= Expense.all
23
+ end
24
+
25
+ def new
26
+ authorize! :create, Expense
27
+
28
+ @expense ||= Expense.new
29
+ end
30
+
31
+ def create
32
+ authorize! :create, Expense
33
+
34
+ @expense ||= Expense.new(expense_params)
35
+
36
+ if @expense.save
37
+ flash[:success] = "Expense created"
38
+ redirect_to expense_path(@expense)
39
+ else
40
+ render :new
41
+ end
42
+ end
43
+
44
+ def show
45
+ authorize! :show, @expense
46
+ end
47
+
48
+ def edit
49
+ authorize! :edit, @expense
50
+
51
+ @expense_line ||= ExpenseGun::ExpenseLine.new
52
+ end
53
+
54
+ def update
55
+ authorize! :edit, @expense
56
+
57
+ if @expense.update_attributes(expense_params)
58
+ flash[:success] = "Expense updated"
59
+ redirect_to expense_path(@expense)
60
+ else
61
+ render :edit
62
+ end
63
+ end
64
+
65
+ def submit
66
+ authorize! :submit, @expense
67
+
68
+ @expense.submit!
69
+ flash[:success] = "Expense submited"
70
+ redirect_to expenses_path
71
+ end
72
+
73
+ def accept
74
+ authorize! :accept, @expense
75
+
76
+ @expense.accept!
77
+ flash[:success] = "Expense accepted"
78
+ redirect_to expense_path(@expense)
79
+ end
80
+
81
+ def refuse
82
+ authorize! :refuse, @expense
83
+
84
+ @expense.refuse!
85
+ flash[:success] = "Expense refused"
86
+ redirect_to expenses_path
87
+ end
88
+
89
+ def cancel
90
+ authorize! :cancel, @expense
91
+
92
+ @expense.cancel!
93
+ flash[:success] = "Expense canceled"
94
+ redirect_to expenses_path
95
+ end
96
+
97
+ private
98
+
99
+ def set_expense
100
+ @expense = Expense.find(params[:id])
101
+ end
102
+
103
+ def expense_params
104
+ params.require(:expense).permit!
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,4 @@
1
+ module ExpenseGun
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,11 @@
1
+ module ExpenseGun
2
+ module FormHelper
3
+ def form(*args, &block)
4
+ semantic_form_for(*args, &block)
5
+ end
6
+
7
+ def form_errors(f)
8
+ f.semantic_errors
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ module ExpenseGun
2
+ class Ability
3
+ include CanCan::Ability
4
+
5
+ def initialize(user)
6
+ can :list, Expense
7
+ can :create, Expense
8
+ can :show, Expense
9
+
10
+ can :edit, Expense do |expense|
11
+ expense.may_edit?
12
+ end
13
+ can :submit, Expense do |expense|
14
+ expense.may_submit?
15
+ end
16
+
17
+ can :accept, Expense do |expense|
18
+ expense.may_accept?
19
+ end
20
+
21
+ can :refuse, Expense do |expense|
22
+ expense.may_refuse?
23
+ end
24
+
25
+ can :cancel, Expense do |expense|
26
+ expense.may_cancel?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ module ExpenseGun
2
+ class Category < ActiveRecord::Base
3
+ validates :name, presence: true
4
+ end
5
+ end
@@ -0,0 +1,62 @@
1
+ module ExpenseGun
2
+ class Expense < ActiveRecord::Base
3
+ include AASM
4
+
5
+ has_many :expense_lines, inverse_of: :expense
6
+
7
+ validates :name, presence: true
8
+ validates :date, presence: true
9
+
10
+ def initialize(*args)
11
+ super
12
+ self.date = Date.today if self.date.nil?
13
+ end
14
+
15
+ # Sum of line amounts
16
+ def total_all_taxes
17
+ expense_lines.map(&:total_all_taxes).sum
18
+ end
19
+
20
+ # Sum of line emplee payback
21
+ def total_employee_payback
22
+ expense_lines.map(&:employee_payback).sum
23
+ end
24
+
25
+ # Sum of deductible deductible vat
26
+ def total_vat_deductible
27
+ expense_lines.map(&:total_vat_deductible).sum
28
+ end
29
+
30
+ def current_state
31
+ aasm.current_state
32
+ end
33
+
34
+ aasm(column: :state, whiny_transitions: false) do
35
+ state :new, initial: true
36
+ state :submited
37
+ state :accepted
38
+ state :refused
39
+ state :canceled
40
+
41
+ event :submit do
42
+ transitions from: :new, to: :submited
43
+ end
44
+
45
+ event :accept do
46
+ transitions from: :submited, to: :accepted
47
+ end
48
+
49
+ event :refuse do
50
+ transitions from: :submited, to: :refused
51
+ end
52
+
53
+ event :cancel do
54
+ transitions from: [:new, :submited, :accepted], to: :canceled
55
+ end
56
+ end
57
+
58
+ def may_edit?
59
+ current_state == :new
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,26 @@
1
+ module ExpenseGun
2
+ class ExpenseLine < ActiveRecord::Base
3
+ belongs_to :expense
4
+ belongs_to :category
5
+
6
+ def initialize(h = {})
7
+ super({company_part: 100}.merge(h))
8
+ end
9
+
10
+ validates :expense, presence: true
11
+ validates :name, presence: true
12
+ validates :date, presence: true
13
+ validates :category, presence: true
14
+ validates :total_all_taxes, presence: true, numericality: {greater_than_or_equal_to: 1.0}
15
+ validates :vat, presence: true, numericality: {greater_than_or_equal_to: 1.0}
16
+ validates :company_part, presence: true, numericality: {greater_than_or_equal_to: 1.0, less_than_or_equal_to: 100.0}
17
+
18
+ def employee_payback
19
+ (total_all_taxes * company_part / 100)
20
+ end
21
+
22
+ def total_vat_deductible
23
+ category.vat_deductible == true ? vat : 0.0
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ = form [expense_gun, @expense, @expense_line] do |f|
2
+ .panel.panel-default
3
+ .panel-body
4
+ .row
5
+ .col-md-6
6
+ = f.input :name
7
+ = f.input :date, as: :string, input_html: {type: :date}
8
+ .form-group
9
+ label for="expense_line_category_id" Category
10
+ = f.collection_select :category_id, ExpenseGun::Category.all, :id, :name, {include_blank: true}, {class: "form-control"}
11
+ .col-md-6
12
+ = f.input :total_all_taxes
13
+ = f.input :vat
14
+ = f.input :company_part
15
+
16
+ = f.actions
@@ -0,0 +1,4 @@
1
+ h1 Edit expense line
2
+
3
+ .expenses.expense_lines
4
+ = render "form"
@@ -0,0 +1,4 @@
1
+ h1 = "#{@expense.name} : New expense line"
2
+
3
+ .expenses.expense_lines
4
+ = render "form"
@@ -0,0 +1,5 @@
1
+ .row: .col-md-6
2
+ = form [expense_gun, @expense] do |f|
3
+ = f.input :name
4
+ = f.input :date, as: :string, input_html: {type: :date}
5
+ = f.actions
@@ -0,0 +1,4 @@
1
+ h1 = @expense.name
2
+
3
+ .expenses
4
+ = render "form"
@@ -0,0 +1,63 @@
1
+ h1 Expenses list
2
+
3
+ .row.expenses
4
+ .col-md-4
5
+ ul.nav.nav-pills.nav-stacked
6
+ - for state in %w(submited new accepted refused canceled)
7
+ li class=("active" if params[:state] == state)
8
+ a href=expense_gun.url_for(state: state)
9
+ = state.capitalize
10
+ span.badge.pull-right = @all_expenses.where(state: state).count
11
+
12
+ li class=("active" if params[:state] == "all")
13
+ a href=expense_gun.url_for(state: "all")
14
+ = "All"
15
+ span.badge.pull-right = @all_expenses.count
16
+
17
+ hr
18
+
19
+ p = link_to "New expense", expense_gun.new_expense_path, class: "btn btn-success"
20
+
21
+ .col-md-8
22
+ - for expense in @expenses
23
+ .panel.panel-default
24
+ .panel-heading
25
+ .row
26
+ .col-md-8
27
+ h2.panel-title = expense.name
28
+ .col-md-4
29
+ .date = expense.date
30
+ .panel-body
31
+ .row: .col-md-6
32
+ p
33
+ strong = "Employee :"
34
+ = expense.user.full_name if expense.respond_to?(:user)
35
+
36
+ p
37
+ strong = "State :"
38
+ = expense.current_state.capitalize
39
+
40
+ p
41
+ strong = "Total all taxes :"
42
+ = "#{expense.total_all_taxes} €"
43
+
44
+ .panel-footer
45
+ = link_to "Show", expense_gun.expense_path(expense), class: "btn btn-default"
46
+
47
+ - if can? :edit, expense
48
+ = link_to "Edit", expense_gun.edit_expense_path(expense), class: "btn btn-default"
49
+
50
+ - if can? :submit, expense
51
+ = link_to "Submit", expense_gun.submit_expense_path(expense), data: {method: "patch"}, class: "btn btn-primary"
52
+
53
+ - if can? :accept, expense
54
+ = link_to "Accept", expense_gun.accept_expense_path(expense), data: {method: "patch"}, class: "btn btn-success"
55
+
56
+ - if can? :refuse, expense
57
+ = link_to "Refuse", expense_gun.refuse_expense_path(expense), data: {method: "patch"}, class: "btn btn-danger"
58
+
59
+ - if can? :cancel, expense
60
+ = link_to "Cancel", expense_gun.cancel_expense_path(expense), data: {method: "patch"}, class: "btn btn-warning"
61
+
62
+
63
+ == paginate @expenses, theme: "bootstrap3"
@@ -0,0 +1,4 @@
1
+ h1 New Expense
2
+
3
+ .expenses
4
+ = render "form"
@@ -0,0 +1,84 @@
1
+ .expenses
2
+ .actions-block.hidden-print
3
+ - if can? :edit, @expense
4
+ = link_to "New expense line", expense_gun.new_expense_expense_line_path(@expense), class: "btn btn-success"
5
+ = link_to "Edit expense", expense_gun.edit_expense_path(@expense), class: "btn btn-default"
6
+ = link_to "Expenses list", expense_gun.expenses_path, class: "btn btn-default"
7
+ a.btn.btn-default href="#" onclick="print(); return false;" = "Print"
8
+
9
+ h1 = "Expense : #{@expense.name}"
10
+
11
+ p
12
+ span.date
13
+ strong = "Date : "
14
+ = @expense.date
15
+ br
16
+ span.user
17
+ strong = "Employee : "
18
+ = @expense.user.full_name if @expense.respond_to?(:user)
19
+ br
20
+ span.state
21
+ strong = "State : "
22
+ = @expense.state.capitalize
23
+
24
+ hr
25
+
26
+ - for expense_line in @expense.expense_lines
27
+ .panel.panel-default
28
+
29
+ .panel-body
30
+ .row
31
+ .col-md-6
32
+ p
33
+ strong = "Name :"
34
+ = expense_line.name
35
+ p
36
+ strong = "Date :"
37
+ = expense_line.date
38
+ p
39
+ strong = "Category :"
40
+ = expense_line.category.name
41
+ - if expense_line.category.code.present?
42
+ = " (#{expense_line.category.code})"
43
+ .col-md-6
44
+ p
45
+ strong = "Total all taxes :"
46
+ = "#{expense_line.total_all_taxes} €"
47
+ p
48
+ strong = "Tax :"
49
+ = "#{expense_line.vat} €"
50
+ p
51
+ strong = "Company part :"
52
+ = "#{expense_line.company_part} %"
53
+
54
+ .panel-footer
55
+ .row
56
+ .col-md-6.hidden-print
57
+ - if can? :edit, @expense
58
+ = link_to "Edit", expense_gun.edit_expense_expense_line_path(expense_line.expense, expense_line), class: "btn btn-default"
59
+ = link_to "Destroy", expense_gun.expense_expense_line_path(expense_line.expense, expense_line), class: "btn btn-danger", "data-method" => "delete", "data-confirm" => "Confirm ?"
60
+ .col-md-6
61
+ p
62
+ strong = "Employee payback :"
63
+ = "#{expense_line.employee_payback} €"
64
+ p
65
+ strong = "Deductible VAT :"
66
+ = "#{expense_line.total_vat_deductible} €"
67
+
68
+ hr
69
+
70
+ .panel.panel-default
71
+ .panel-body
72
+ .row
73
+ .col-md-6
74
+ strong = "Total :"
75
+ .col-md-6
76
+ p
77
+ strong = "Total all taxes :"
78
+ = "#{@expense.total_all_taxes} €"
79
+ p
80
+ strong = "Employee payback :"
81
+ = "#{@expense.total_employee_payback} €"
82
+ p
83
+ strong = "Deductible VAT :"
84
+ = "#{@expense.total_vat_deductible} €"
@@ -0,0 +1,2 @@
1
+ li.disabled
2
+ = link_to raw(t "views.pagination.truncate"), "#"
@@ -0,0 +1,6 @@
1
+ - if page.current?
2
+ li.active
3
+ = link_to page, "#", onclick: "return false;", remote: remote, rel: (page.next? ? "next" : page.prev? ? "prev" : nil)
4
+ - else
5
+ li
6
+ = link_to page, url, remote: remote, rel: (page.next? ? "next" : page.prev? ? "prev" : nil)
@@ -0,0 +1,8 @@
1
+ = paginator.render do
2
+ .pagination-container
3
+ ol.pagination
4
+ - each_page do |page|
5
+ - if page.left_outer? || page.right_outer? || page.inside_window?
6
+ == page_tag page
7
+ - elsif !page.was_truncated?
8
+ == gap_tag
@@ -0,0 +1,8 @@
1
+ <%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
5
+ %>
6
+ default: <%= std_opts %> features
7
+ wip: --tags @wip:3 --wip features
8
+ rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip