dorsale 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/app/assets/stylesheets/dorsale/engines/flyboy.sass +0 -7
  4. data/app/controllers/dorsale/alexandrie/attachments_controller.rb +7 -0
  5. data/app/controllers/dorsale/application_controller.rb +1 -0
  6. data/app/controllers/dorsale/billing_machine/invoices_controller.rb +2 -0
  7. data/app/controllers/dorsale/billing_machine/quotations_controller.rb +2 -0
  8. data/app/controllers/dorsale/customer_vault/application_controller.rb +0 -4
  9. data/app/controllers/dorsale/customer_vault/people_controller.rb +0 -2
  10. data/app/controllers/dorsale/expense_gun/expenses_controller.rb +2 -2
  11. data/app/controllers/dorsale/flyboy/application_controller.rb +0 -3
  12. data/app/controllers/dorsale/flyboy/tasks_controller.rb +2 -8
  13. data/app/helpers/dorsale/all_helpers.rb +1 -0
  14. data/app/helpers/dorsale/flyboy/application_helper.rb +3 -12
  15. data/app/helpers/dorsale/link_helper.rb +10 -0
  16. data/app/helpers/dorsale/sorting_helper.rb +48 -0
  17. data/app/mailers/dorsale/billing_machine/invoice_mailer.rb +1 -1
  18. data/app/models/concerns/dorsale/model_i18n.rb +25 -0
  19. data/app/models/concerns/dorsale/model_to_s.rb +9 -0
  20. data/{lib → app/models/concerns}/dorsale/polymorphic_id.rb +1 -3
  21. data/app/models/concerns/dorsale/search.rb +30 -0
  22. data/app/models/dorsale/alexandrie/attachment.rb +7 -6
  23. data/app/models/dorsale/application_record.rb +6 -0
  24. data/app/models/dorsale/billing_machine/invoice.rb +2 -6
  25. data/app/models/dorsale/billing_machine/quotation.rb +4 -4
  26. data/app/models/dorsale/customer_vault/person.rb +0 -2
  27. data/app/models/dorsale/expense_gun/expense.rb +8 -8
  28. data/app/models/dorsale/flyboy/task.rb +5 -16
  29. data/app/pdfs/concerns/dorsale/alexandrie/prawn/render_with_attachments.rb +13 -0
  30. data/app/pdfs/dorsale/billing_machine/invoice_single_vat_pdf.rb +6 -1
  31. data/app/pdfs/dorsale/billing_machine/quotation_pdf_common_methods.rb +0 -18
  32. data/app/policies/dorsale/expense_gun/expense_policy_helper.rb +1 -1
  33. data/app/policies/dorsale/flyboy/task_policy_helper.rb +0 -10
  34. data/app/policies/dorsale/policy_checker.rb +0 -1
  35. data/app/services/dorsale/billing_machine/pdf_file_generator.rb +37 -0
  36. data/app/services/dorsale/expense_gun/expense/copy.rb +1 -1
  37. data/app/uploaders/dorsale/pdf_uploader.rb +5 -0
  38. data/app/views/dorsale/billing_machine/invoices/_details.html.slim +1 -1
  39. data/app/views/dorsale/billing_machine/invoices/_list.html.slim +1 -2
  40. data/app/views/dorsale/billing_machine/invoices/index.pdf.ruby +2 -2
  41. data/app/views/dorsale/billing_machine/invoices/show.pdf.ruby +1 -1
  42. data/app/views/dorsale/billing_machine/quotations/_list.html.slim +1 -2
  43. data/app/views/dorsale/billing_machine/quotations/show.pdf.ruby +1 -1
  44. data/app/views/dorsale/comments/_comment.html.slim +1 -1
  45. data/app/views/dorsale/customer_vault/links/new.html.slim +1 -1
  46. data/app/views/dorsale/customer_vault/people/_list_item.html.slim +1 -1
  47. data/app/views/dorsale/flyboy/tasks/_form.html.slim +3 -0
  48. data/app/views/dorsale/flyboy/tasks/_index_actions.html.slim +3 -0
  49. data/app/views/dorsale/flyboy/tasks/_list.html.slim +6 -12
  50. data/app/views/dorsale/flyboy/tasks/_summary_list.html.slim +2 -3
  51. data/app/views/dorsale/flyboy/tasks/_taskable_context.html.slim +1 -1
  52. data/app/views/dorsale/flyboy/tasks/index.xlsx.ruby +2 -4
  53. data/config/locales/billing_machine.en.yml +1 -0
  54. data/config/locales/billing_machine.fr.yml +1 -0
  55. data/config/locales/common.en.yml +3 -3
  56. data/config/locales/expense_gun.fr.yml +12 -12
  57. data/config/locales/flyboy.en.yml +1 -28
  58. data/config/locales/flyboy.fr.yml +1 -28
  59. data/config/routes.rb +0 -7
  60. data/db/migrate/20170127131537_delete_folders.rb +10 -0
  61. data/db/migrate/20170127151610_fix_expense_state.rb +6 -0
  62. data/db/migrate/20170127155636_billing_machine_add_pdf_file.rb +16 -0
  63. data/features/expense_gun_expenses.feature +3 -3
  64. data/features/flyboy_task_comments.feature +1 -1
  65. data/features/flyboy_tasks.feature +3 -4
  66. data/features/flyboy_tasks_summary.feature +0 -1
  67. data/features/step_definitions/billing_machine_invoices_steps.rb +1 -0
  68. data/features/step_definitions/expense_gun_expenses_steps.rb +2 -2
  69. data/features/step_definitions/flyboy_tasks_steps.rb +2 -3
  70. data/features/step_definitions/tasks_summary_steps.rb +3 -3
  71. data/lib/dorsale/active_record_comma_type_cast.rb +12 -0
  72. data/lib/dorsale/core_and_rails_ext.rb +3 -0
  73. data/lib/dorsale/engine.rb +6 -10
  74. data/lib/dorsale/form_back_url.rb +3 -1
  75. data/lib/dorsale/version.rb +1 -1
  76. data/spec/controllers/dorsale/billing_machine/invoices_controller_spec.rb +4 -1
  77. data/spec/controllers/dorsale/flyboy/tasks_controller_spec.rb +7 -30
  78. data/spec/factories/flyboy_tasks.rb +0 -2
  79. data/spec/helpers/dorsale/flyboy/application_helper_spec.rb +0 -64
  80. data/spec/helpers/dorsale/sorting_helper_spec.rb +74 -0
  81. data/spec/libs/{active_record_comma_type_cast_spec.rb → dorsale/active_record_comma_type_cast_spec.rb} +1 -1
  82. data/spec/libs/dorsale/polymorphic_id_spec.rb +8 -7
  83. data/spec/models/{dorsale → concerns/dorsale}/model_i18n_spec.rb +0 -0
  84. data/spec/models/dorsale/expense_gun/expense_spec.rb +19 -19
  85. data/spec/models/dorsale/flyboy/task_spec.rb +2 -1
  86. data/spec/pdfs/dorsale/billing_machine/invoice_multiple_vat_pdf_spec.rb +18 -13
  87. data/spec/pdfs/dorsale/billing_machine/invoice_single_vat_pdf_spec.rb +18 -13
  88. data/spec/pdfs/dorsale/billing_machine/quotation_multiple_vat_pdf_spec.rb +18 -13
  89. data/spec/pdfs/dorsale/billing_machine/quotation_single_vat_pdf_spec.rb +25 -19
  90. data/spec/services/dorsale/expense_gun/expense/copy_spec.rb +1 -1
  91. metadata +21 -52
  92. data/app/controllers/dorsale/flyboy/folders_controller.rb +0 -140
  93. data/app/filters/dorsale/flyboy/small_data/filter_for_folders.rb +0 -5
  94. data/app/filters/dorsale/flyboy/small_data/filter_strategy_by_status.rb +0 -9
  95. data/app/models/dorsale/flyboy/folder.rb +0 -72
  96. data/app/policies/dorsale/flyboy/folder_policy_helper.rb +0 -26
  97. data/app/views/dorsale/flyboy/folders/_context.html.slim +0 -18
  98. data/app/views/dorsale/flyboy/folders/_context_actions.html.slim +0 -10
  99. data/app/views/dorsale/flyboy/folders/_form.html.slim +0 -17
  100. data/app/views/dorsale/flyboy/folders/_index_actions.html.slim +0 -2
  101. data/app/views/dorsale/flyboy/folders/_list.html.slim +0 -41
  102. data/app/views/dorsale/flyboy/folders/edit.html.slim +0 -8
  103. data/app/views/dorsale/flyboy/folders/index.html.slim +0 -22
  104. data/app/views/dorsale/flyboy/folders/new.html.slim +0 -2
  105. data/app/views/dorsale/flyboy/folders/show.html.slim +0 -14
  106. data/features/flyboy_folders.feature +0 -109
  107. data/features/step_definitions/flyboy_folders_steps.rb +0 -170
  108. data/lib/active_record_comma_type_cast.rb +0 -12
  109. data/lib/dorsale/alexandrie/prawn.rb +0 -17
  110. data/lib/dorsale/model_i18n.rb +0 -30
  111. data/lib/dorsale/model_to_s.rb +0 -13
  112. data/lib/dorsale/search.rb +0 -34
  113. data/spec/controllers/dorsale/flyboy/folders_controller_spec.rb +0 -113
  114. data/spec/factories/flyboy_folders.rb +0 -7
  115. data/spec/models/dorsale/flyboy/folder_spec.rb +0 -103
  116. data/spec/routing/dorsale/flyboy/folders_routing_spec.rb +0 -44
@@ -1,12 +0,0 @@
1
- module ActiveRecordCommaTypeCast
2
- def cast_value(value)
3
- if value.is_a?(String)
4
- super value.gsub(",", ".").gsub(/[^-0-9\.]/, "")
5
- else
6
- super value
7
- end
8
- end
9
- end
10
-
11
- ActiveRecord::Type::Decimal.send(:prepend, ::ActiveRecordCommaTypeCast)
12
- ActiveRecord::Type::Float.send(:prepend, ::ActiveRecordCommaTypeCast)
@@ -1,17 +0,0 @@
1
- module Dorsale
2
- module Alexandrie
3
- module Prawn
4
- def render_with_attachments
5
- final_pdf = ::CombinePDF.parse(self.render)
6
-
7
- @main_document.attachments.each do |attachment|
8
- next unless File.extname(attachment.file.path) == ".pdf"
9
-
10
- final_pdf << ::CombinePDF.load(attachment.file.path)
11
- end
12
-
13
- final_pdf.to_pdf
14
- end
15
- end
16
- end
17
- end
@@ -1,30 +0,0 @@
1
- module Dorsale
2
- module ModelI18n
3
- def t(*args)
4
- self.class.t(*args)
5
- end
6
-
7
- def ts
8
- self.class.ts
9
- end
10
-
11
- def self.included(model)
12
- model.instance_eval do
13
- def t(*args)
14
- if args.any?
15
- human_attribute_name(*args)
16
- else
17
- model_name.human
18
- end
19
- end
20
-
21
- def ts
22
- model_name.human(count: 2)
23
- end
24
-
25
- end # instance_eval
26
- end # def included
27
- end # ModelI18n
28
- end # Dorsale
29
-
30
- ActiveRecord::Base.send(:include, ::Dorsale::ModelI18n)
@@ -1,13 +0,0 @@
1
- module Dorsale
2
- module ModelToS
3
- def to_s
4
- %w(name title label).map do |m|
5
- return send(m) if respond_to?(m)
6
- end
7
-
8
- super
9
- end
10
- end
11
- end
12
-
13
- ActiveRecord::Base.send(:include, ::Dorsale::ModelToS)
@@ -1,34 +0,0 @@
1
- module Dorsale
2
- module Search
3
- def self.included(klass)
4
- klass.send(:extend, Dorsale::Search::ClassMethods)
5
- end
6
-
7
- module ClassMethods
8
- def default_search_fields
9
- fields = columns.map do |column|
10
- "#{table_name}.#{column.name}"
11
- end
12
- end
13
-
14
- def search(q, *fields)
15
- words = q.to_s.parameterize.split("-")
16
- fields = default_search_fields if fields.empty?
17
-
18
- sql_query = words.map.with_index do |word, index|
19
- fields.map do |field|
20
- "(LOWER(CAST(#{field} AS TEXT)) LIKE :w#{index})"
21
- end.join(" OR ")
22
- end.map{ |e| "(#{e})" }.join(" AND ")
23
-
24
- sql_params_a = words.map.with_index do |word, index|
25
- ["w#{index}".to_sym, "%#{word}%"]
26
- end
27
-
28
- sql_params_h = Hash[sql_params_a]
29
-
30
- self.where(sql_query, sql_params_h)
31
- end
32
- end
33
- end
34
- end
@@ -1,113 +0,0 @@
1
- require "rails_helper"
2
-
3
- describe Dorsale::Flyboy::FoldersController, type: :controller do
4
- routes { Dorsale::Engine.routes }
5
- render_views
6
-
7
- let(:user) { create(:user) }
8
-
9
- before(:each) { sign_in(user) }
10
-
11
- let(:folder){
12
- create(:flyboy_folder)
13
- }
14
-
15
- describe '#index' do
16
- context 'when applying filter' do
17
- before(:each) do
18
- Dorsale::Flyboy::Folder.destroy_all
19
- @folder1 = create(:flyboy_folder, status: "open")
20
- @folder2 = create(:flyboy_folder, status: "closed")
21
- end
22
-
23
- it 'should display both when not filtered' do
24
- get :index
25
- expect(assigns(:folders)).to eq [@folder2, @folder1]
26
- end
27
-
28
- it 'should filter by status closed' do
29
- cookies["filters"] = {fb_status: "closed"}.to_json
30
- get :index
31
- expect(assigns(:folders)).to eq [@folder2]
32
- end
33
-
34
- it 'should filter by status open' do
35
- cookies["filters"] = {fb_status: "open"}.to_json
36
- get :index
37
- expect(assigns(:folders)).to eq [@folder1]
38
- end
39
- end
40
-
41
- context "when sorting" do
42
- before do
43
- Dorsale::Flyboy::Folder.destroy_all
44
- @folder1 = create(:flyboy_folder, name: "Abc", progress: 100, status: "open")
45
- @folder2 = create(:flyboy_folder, name: "dEF", progress: 0, status: "closed")
46
- @folder3 = create(:flyboy_folder, name: "xyz", progress: 35, status: "closed")
47
- end
48
-
49
- it "sorting by name asc" do
50
- get :index, params: {sort: "name"}
51
- expect(assigns(:folders).to_a).to eq [@folder1, @folder2, @folder3]
52
- end
53
-
54
- it "sorting by name desc" do
55
- get :index, params: {sort: "-name"}
56
- expect(assigns(:folders).to_a).to eq [@folder3, @folder2, @folder1]
57
- end
58
-
59
- it "sorting by progress asc" do
60
- get :index, params: {sort: "progress"}
61
- expect(assigns(:folders).to_a).to eq [@folder2, @folder3, @folder1]
62
- end
63
-
64
- it "sorting by progress desc" do
65
- get :index, params: {sort: "-progress"}
66
- expect(assigns(:folders).to_a).to eq [@folder1, @folder3, @folder2]
67
- end
68
-
69
- it "sorting by status asc" do
70
- get :index, params: {sort: "status"}
71
- expect(assigns(:folders).to_a).to eq [@folder2, @folder3, @folder1]
72
- end
73
-
74
- it "sorting by status desc" do
75
- get :index, params: {sort: "-status"}
76
- expect(assigns(:folders).to_a).to eq [@folder1, @folder2, @folder3]
77
- end
78
- end
79
- end
80
-
81
- describe "#close" do
82
- before(:each) do
83
- @folder = create(:flyboy_folder, status: "open")
84
- end
85
-
86
- it "should close folder" do
87
- patch :close, params: {id: @folder}
88
- expect(@folder.reload.status).to eq "closed"
89
- end
90
-
91
- it "should redirect to folders path" do
92
- patch :close, params: {id: @folder}
93
- expect(response).to redirect_to flyboy_folders_path
94
- end
95
- end
96
-
97
- describe "#open" do
98
- before(:each) do
99
- @folder = create(:flyboy_folder, status: "closed")
100
- end
101
-
102
- it "should open folder" do
103
- patch :open, params: {id: @folder}
104
- expect(@folder.reload.status).to eq "open"
105
- end
106
-
107
- it "should redirect to folder path" do
108
- patch :open, params: {id: @folder}
109
- expect(response).to redirect_to flyboy_folder_path(@folder)
110
- end
111
- end
112
-
113
- end
@@ -1,7 +0,0 @@
1
- FactoryGirl.define do
2
- factory :flyboy_folder, class: ::Dorsale::Flyboy::Folder do
3
- name { "I-am-a-folder_#{Kernel.rand(0..9999)}" }
4
- description { "I-am-the-folder-description_#{Kernel.rand(0..9999)}" }
5
- status { "open" }
6
- end
7
- end
@@ -1,103 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Dorsale::Flyboy::Folder do
4
- it { is_expected.to have_many(:tasks).dependent(:destroy) }
5
- it { is_expected.to belong_to(:folderable) }
6
-
7
- it { should validate_presence_of :name }
8
-
9
- it "should validate the folder when not step is assigned" do
10
- folder = build(:flyboy_folder)
11
- expect(folder).to be_valid
12
- end
13
-
14
- it "should ensure that status has a valid value" do
15
- folder = build(:flyboy_folder, status: 999)
16
- expect(folder).to_not be_valid
17
- end
18
-
19
- it "should increase the version number" do
20
- folder = create(:flyboy_folder)
21
- expect(folder.version).to eq 1
22
- folder.save
23
- expect(folder.version).to eq 2
24
- folder.save
25
- expect(folder.version).to eq 3
26
- end
27
-
28
- it "should create tracking" do
29
- Timecop.freeze DateTime.new(2013, 8, 1, 9, 13, 5)
30
-
31
- folder1 = create(:flyboy_folder)
32
- folder2 = create(:flyboy_folder)
33
- folder3 = create(:flyboy_folder)
34
-
35
- expect(folder1.tracking).to eq "130801-1"
36
- expect(folder2.tracking).to eq "130801-2"
37
- expect(folder3.tracking).to eq "130801-3"
38
- end
39
-
40
- it "revision should contain tracking and version" do
41
- Timecop.freeze Time.parse("2012-12-21 12:00:00")
42
- folder = create(:flyboy_folder)
43
- expect(folder.revision).to eq "121221-1 1"
44
- end
45
-
46
- describe "#progress" do
47
- it "update task should update folder progress" do
48
- folder = create(:flyboy_folder)
49
- task1 = create(:flyboy_task, taskable: folder, progress: 50)
50
- task2 = create(:flyboy_task, taskable: folder, progress: 100)
51
- expect(folder.reload.progress).to eq 75
52
- task1.progress = 100
53
- task1.save
54
- expect(folder.reload.progress).to eq 100
55
- end
56
-
57
- it "delete task should update folder progress" do
58
- folder = create(:flyboy_folder)
59
- task1 = create(:flyboy_task, taskable: folder, progress: 50)
60
- expect(folder.reload.progress).to eq 50
61
- task1.destroy
62
- expect(folder.reload.progress).to eq 0
63
- end
64
-
65
- it "should be 0 if new folder" do
66
- expect(Dorsale::Flyboy::Folder.new.progress).to eq 0
67
- end
68
- end
69
-
70
- describe "states" do
71
- it "initial state should be open" do
72
- expect(Dorsale::Flyboy::Folder.new.status).to eq "open"
73
- end
74
-
75
- it "open folder can be closed" do
76
- folder = create(:flyboy_folder, status: "open")
77
- expect(folder.close).to be true
78
- expect(folder.status).to eq "closed"
79
- end
80
-
81
- it "closed folder can be reopened" do
82
- folder = create(:flyboy_folder, status: "closed")
83
- expect(folder.open).to be true
84
- expect(folder.status).to eq "open"
85
- end
86
-
87
- it "open folder with undone tasks can't be closed" do
88
- folder = create(:flyboy_folder, status: "open")
89
- task = create(:flyboy_task, taskable: folder, done: false)
90
- expect(folder.close).to be false
91
- expect(folder.status).to eq "open"
92
- end
93
-
94
- it "open folder with all tasks done can be closed" do
95
- folder = create(:flyboy_folder, status: "open")
96
- task = create(:flyboy_task, taskable: folder, done: true)
97
- expect(folder.close).to be true
98
- expect(folder.status).to eq "closed"
99
- end
100
-
101
- end
102
-
103
- end
@@ -1,44 +0,0 @@
1
- require "rails_helper"
2
-
3
- describe ::Dorsale::Flyboy::FoldersController, type: :routing do
4
- describe "routing" do
5
- routes { ::Dorsale::Engine.routes }
6
-
7
- it "routes to #index" do
8
- expect(get("flyboy/folders")).to route_to("dorsale/flyboy/folders#index")
9
- end
10
-
11
- it "routes to #new" do
12
- expect(get("flyboy/folders/new")).to route_to("dorsale/flyboy/folders#new")
13
- end
14
-
15
- it "routes to #show" do
16
- expect(get("flyboy/folders/1")).to route_to("dorsale/flyboy/folders#show", id: "1")
17
- end
18
-
19
- it "routes to #edit" do
20
- expect(get("flyboy/folders/1/edit")).to route_to("dorsale/flyboy/folders#edit", id: "1")
21
- end
22
-
23
- it "routes to #create" do
24
- expect(post("flyboy/folders")).to route_to("dorsale/flyboy/folders#create")
25
- end
26
-
27
- it "routes to #update" do
28
- expect(patch("flyboy/folders/1")).to route_to("dorsale/flyboy/folders#update", id: "1")
29
- end
30
-
31
- it "routes to #destroy" do
32
- expect(delete("flyboy/folders/1")).to route_to("dorsale/flyboy/folders#destroy", id: "1")
33
- end
34
-
35
- it "routes to #open" do
36
- expect(patch("flyboy/folders/1/open")).to route_to("dorsale/flyboy/folders#open", id: "1")
37
- end
38
-
39
- it "routes to #close" do
40
- expect(patch("flyboy/folders/1/close")).to route_to("dorsale/flyboy/folders#close", id: "1")
41
- end
42
-
43
- end
44
- end