expense_gun 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/expense_gun/application.js +4 -0
- data/app/assets/stylesheets/expense_gun/application.sass +4 -0
- data/app/assets/stylesheets/expense_gun/expenses.sass +20 -0
- data/app/assets/stylesheets/expense_gun/layout.sass +2 -0
- data/app/controllers/expense_gun/application_controller.rb +7 -0
- data/app/controllers/expense_gun/expense_lines_controller.rb +64 -0
- data/app/controllers/expense_gun/expenses_controller.rb +107 -0
- data/app/helpers/expense_gun/application_helper.rb +4 -0
- data/app/helpers/expense_gun/form_helper.rb +11 -0
- data/app/models/expense_gun/ability.rb +30 -0
- data/app/models/expense_gun/category.rb +5 -0
- data/app/models/expense_gun/expense.rb +62 -0
- data/app/models/expense_gun/expense_line.rb +26 -0
- data/app/views/expense_gun/expense_lines/_form.html.slim +16 -0
- data/app/views/expense_gun/expense_lines/edit.html.slim +4 -0
- data/app/views/expense_gun/expense_lines/new.html.slim +4 -0
- data/app/views/expense_gun/expenses/_form.html.slim +5 -0
- data/app/views/expense_gun/expenses/edit.html.slim +4 -0
- data/app/views/expense_gun/expenses/index.html.slim +63 -0
- data/app/views/expense_gun/expenses/new.html.slim +4 -0
- data/app/views/expense_gun/expenses/show.html.slim +84 -0
- data/app/views/kaminari/bootstrap3/_gap.html.slim +2 -0
- data/app/views/kaminari/bootstrap3/_page.html.slim +6 -0
- data/app/views/kaminari/bootstrap3/_paginator.html.slim +8 -0
- data/config/cucumber.yml +8 -0
- data/config/initializers/formtastic.rb +78 -0
- data/config/routes.rb +13 -0
- data/db/migrate/20141201092102_create_expense_gun_expenses.rb +8 -0
- data/db/migrate/20141201100548_expenses_add_state.rb +5 -0
- data/db/migrate/20141201111528_create_expense_gun_expense_lines.rb +13 -0
- data/db/migrate/20141201115918_create_expense_gun_categories.rb +9 -0
- data/db/migrate/20141201145608_expense_lines_add_category_id.rb +5 -0
- data/db/migrate/20141202143656_categories_rename_tax.rb +5 -0
- data/db/migrate/20141202151845_expenses_add_date.rb +5 -0
- data/db/migrate/20141203153649_field_names_like_billing_machine.rb +7 -0
- data/lib/expense_gun/admin/category.rb +12 -0
- data/lib/expense_gun/engine.rb +9 -0
- data/lib/expense_gun/version.rb +3 -0
- data/lib/expense_gun.rb +8 -0
- data/lib/tasks/cucumber.rake +65 -0
- data/lib/tasks/expense_gun_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/admin/dashboard.rb +33 -0
- data/spec/dummy/app/assets/javascripts/active_admin.js.coffee +1 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/active_admin.css.scss +17 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/expense_gun/application.html.slim +20 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/active_admin.rb +233 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/schema.rb +42 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/expense_gun_category.rb +7 -0
- data/spec/factories/expense_gun_expense.rb +11 -0
- data/spec/factories/expense_gun_expense_line.rb +10 -0
- data/spec/factories.rb +5 -0
- data/spec/models/category_spec.rb +12 -0
- data/spec/models/expense_line_spec.rb +81 -0
- data/spec/models/expense_spec.rb +171 -0
- data/spec/rails_helper.rb +52 -0
- data/spec/spec_helper.rb +85 -0
- 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,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,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,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,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,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,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} €"
|
data/config/cucumber.yml
ADDED
@@ -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
|