expense_gun 1.0.0
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.
- 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
|