query_report 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/app/helpers/query_report_filter_helper.rb +0 -8
  2. data/app/helpers/query_report_link_helper.rb +9 -0
  3. data/app/views/query_report/_chart.html.erb +10 -0
  4. data/app/views/query_report/_charts.html.erb +6 -10
  5. data/app/views/query_report/_links.html.erb +2 -0
  6. data/app/views/query_report/_records.html.erb +21 -0
  7. data/app/views/query_report/_search.html.erb +7 -5
  8. data/app/views/query_report/list.html.erb +3 -32
  9. data/lib/query_report/filter.rb +44 -26
  10. data/lib/query_report/helper.rb +6 -6
  11. data/lib/query_report/version.rb +1 -1
  12. data/test/dummy/app/controllers/invoices_controller.rb +23 -18
  13. data/test/dummy/app/models/invoice.rb +2 -1
  14. data/test/dummy/app/models/user.rb +6 -1
  15. data/test/dummy/db/development.sqlite3 +0 -0
  16. data/test/dummy/db/migrate/20130622120853_create_users.rb +2 -3
  17. data/test/dummy/db/migrate/20130630132513_create_invoices.rb +3 -0
  18. data/test/dummy/db/schema.rb +7 -5
  19. data/test/dummy/db/seed.rb +14 -3
  20. data/test/dummy/log/development.log +3848 -0
  21. data/test/dummy/tmp/miniprofiler/mp_timers_1phunlrkl040xbl9ni38 +0 -0
  22. data/test/dummy/tmp/miniprofiler/mp_timers_2jj5q0umhfjgdsr3be6r +0 -0
  23. data/test/dummy/tmp/miniprofiler/mp_timers_4nme0opawv0cuju7ycln +0 -0
  24. data/test/dummy/tmp/miniprofiler/mp_timers_4x4zy2jyybfnrfctzoll +0 -0
  25. data/test/dummy/tmp/miniprofiler/mp_timers_501n5dolb96ahn8fsdeb +0 -0
  26. data/test/dummy/tmp/miniprofiler/mp_timers_50279rze1q2oyskpd2bx +0 -0
  27. data/test/dummy/tmp/miniprofiler/mp_timers_5cx1jmk7clhq7gdqu8fj +0 -0
  28. data/test/dummy/tmp/miniprofiler/mp_timers_625nhhhlou6kji64k1v8 +0 -0
  29. data/test/dummy/tmp/miniprofiler/mp_timers_8papkqyltk3r9vdbiwlx +0 -0
  30. data/test/dummy/tmp/miniprofiler/mp_timers_as4xud3puw1vxjzm8ma3 +0 -0
  31. data/test/dummy/tmp/miniprofiler/mp_timers_cuw96wvyfzku6np7dv6u +0 -0
  32. data/test/dummy/tmp/miniprofiler/mp_timers_eml2za25qr6vmokw5tda +0 -0
  33. data/test/dummy/tmp/miniprofiler/mp_timers_f1cpnb605srbgp7u5n6l +0 -0
  34. data/test/dummy/tmp/miniprofiler/mp_timers_kcb88g8t6jcdbzy4sf40 +0 -0
  35. data/test/dummy/tmp/miniprofiler/mp_timers_oziigmt85gb8ro89h2uo +0 -0
  36. data/test/dummy/tmp/miniprofiler/mp_timers_rkitlcrj5rur9vtb25yr +0 -0
  37. data/test/dummy/tmp/miniprofiler/mp_timers_s24xgsm7sihnsifjqne0 +0 -0
  38. data/test/dummy/tmp/miniprofiler/mp_timers_v4vq4inppiedkn1mxsut +0 -0
  39. data/test/dummy/tmp/miniprofiler/mp_timers_wb62iw0f860zfkjkt42d +0 -0
  40. data/test/dummy/tmp/miniprofiler/mp_timers_yb4i2uuaxhoz5hst26bj +0 -0
  41. metadata +46 -76
  42. data/test/dummy/db/test.sqlite3 +0 -0
  43. data/test/dummy/tmp/miniprofiler/mp_timers_435onnqlkhcky6yip9mj +0 -0
  44. data/test/dummy/tmp/miniprofiler/mp_timers_5a5gcp8rj2g7cjlrh11r +0 -0
  45. data/test/dummy/tmp/miniprofiler/mp_timers_5awpjfhldzcfjkeiia3p +0 -0
  46. data/test/dummy/tmp/miniprofiler/mp_timers_5n9tm06nu8wtqem8jd9s +0 -0
  47. data/test/dummy/tmp/miniprofiler/mp_timers_83yh2jf8w7ouqnuqevws +0 -0
  48. data/test/dummy/tmp/miniprofiler/mp_timers_9scoumsixeymou0wyqwf +0 -0
  49. data/test/dummy/tmp/miniprofiler/mp_timers_9xq47956uczidwr4xqs2 +0 -0
  50. data/test/dummy/tmp/miniprofiler/mp_timers_a4mj9799k6k4r6jruzj7 +0 -0
  51. data/test/dummy/tmp/miniprofiler/mp_timers_a7ev5lal7xp2xzjj2n9p +0 -0
  52. data/test/dummy/tmp/miniprofiler/mp_timers_azffwngwstpj3o7g7zaj +0 -0
  53. data/test/dummy/tmp/miniprofiler/mp_timers_bsifeckwtz6lhx8rqwgz +0 -0
  54. data/test/dummy/tmp/miniprofiler/mp_timers_c27pz5f69skbkwfrnlr5 +0 -0
  55. data/test/dummy/tmp/miniprofiler/mp_timers_c5lzifpf785aic4t3cm8 +0 -0
  56. data/test/dummy/tmp/miniprofiler/mp_timers_dbth1ye234719bbg3xjq +0 -0
  57. data/test/dummy/tmp/miniprofiler/mp_timers_ech68w7azvs6whb6s88w +0 -0
  58. data/test/dummy/tmp/miniprofiler/mp_timers_etmdhvrbbmdadc7oyw8q +0 -0
  59. data/test/dummy/tmp/miniprofiler/mp_timers_gdb6sz9j5g8pyrobpse2 +0 -0
  60. data/test/dummy/tmp/miniprofiler/mp_timers_gnj8jwxqjl0ocjfopzmt +0 -0
  61. data/test/dummy/tmp/miniprofiler/mp_timers_hzjksutah5t2nkoe5gye +0 -0
  62. data/test/dummy/tmp/miniprofiler/mp_timers_ijm30kq0c4jrpb5coyiz +0 -0
  63. data/test/dummy/tmp/miniprofiler/mp_timers_ixj6jdcp3o0pc4vzdjoo +0 -0
  64. data/test/dummy/tmp/miniprofiler/mp_timers_l2w9vljbeofwmhmxn9lv +0 -0
  65. data/test/dummy/tmp/miniprofiler/mp_timers_m0kxxiow6jlfcjulu02t +0 -0
  66. data/test/dummy/tmp/miniprofiler/mp_timers_m2ow1xy7c6tw0f4fj2co +0 -0
  67. data/test/dummy/tmp/miniprofiler/mp_timers_meafgmjq07s2xlkm4ney +0 -0
  68. data/test/dummy/tmp/miniprofiler/mp_timers_mitzsa7y0lvka04il6an +0 -0
  69. data/test/dummy/tmp/miniprofiler/mp_timers_mxejnh24sg011tpzlq7l +0 -0
  70. data/test/dummy/tmp/miniprofiler/mp_timers_nlvpu6hg03b8cue75kkc +0 -0
  71. data/test/dummy/tmp/miniprofiler/mp_timers_ns57exo8aheow6jngknj +0 -0
  72. data/test/dummy/tmp/miniprofiler/mp_timers_pq8a5s9f7o747x14bip8 +0 -0
  73. data/test/dummy/tmp/miniprofiler/mp_timers_pvxfsf8tdy3tk7twydyc +0 -0
  74. data/test/dummy/tmp/miniprofiler/mp_timers_t5zt24mkmoq4kpcvvlrp +0 -0
  75. data/test/dummy/tmp/miniprofiler/mp_timers_tesee62zyykaxw8dbmq1 +0 -0
  76. data/test/dummy/tmp/miniprofiler/mp_timers_ujpdek4jfp8flbqp7fi3 +0 -0
  77. data/test/dummy/tmp/miniprofiler/mp_timers_wbiyljqrnox89js4m0at +0 -0
  78. data/test/dummy/tmp/miniprofiler/mp_timers_ywg973w6dqfz9nuj5qio +0 -0
@@ -11,12 +11,4 @@ module QueryReportFilterHelper
11
11
  concat(label_tag options[:placeholder])
12
12
  select_tag name, options_for_select([['', ''], ['true', 'true'], ['false', 'false']], value)
13
13
  end
14
-
15
- def link_to_download_report_pdf
16
- link_to t('views.links.pdf'), export_report_url_with_format('pdf'), :target => "_blank"
17
- end
18
-
19
- def link_to_download_report_csv
20
- link_to t('views.links.csv'), export_report_url_with_format('csv'), :target => "_blank"
21
- end
22
14
  end
@@ -0,0 +1,9 @@
1
+ module QueryReportLinkHelper
2
+ def link_to_download_report_pdf
3
+ link_to t('views.links.pdf'), export_report_url_with_format('pdf'), :target => "_blank"
4
+ end
5
+
6
+ def link_to_download_report_csv
7
+ link_to t('views.links.csv'), export_report_url_with_format('csv'), :target => "_blank"
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ <div class="row-fluid">
2
+ <% report.charts.each_with_index do |chart, i| %>
3
+ <% chart_id = "chart#{i}" %>
4
+ <div class="span6">
5
+ <div id="<%= chart_id %>" style="text-align: center;"></div>
6
+ </div>
7
+ <%= render_chart(chart.prepare_visualr, chart_id) %>
8
+ <% end %>
9
+ <div class="clearfix"></div>
10
+ </div>
@@ -1,10 +1,6 @@
1
- <div class="row-fluid">
2
- <% report.charts.each_with_index do |chart, i| %>
3
- <% chart_id = "chart#{i}" %>
4
- <div class="span6">
5
- <div id="<%= chart_id %>" style="text-align: center;"></div>
6
- </div>
7
- <%= render_chart(chart.prepare_visualr, chart_id) %>
8
- <% end %>
9
- <div class="clearfix"></div>
10
- </div>
1
+ <% if report.has_chart? and report.enable_chart? and report.chart_on_web? %>
2
+ <script type="text/javascript" src="https://www.google.com/jsapi"></script>
3
+ <%= render :partial => "query_report/chart", locals: {report: report} %>
4
+ <% else %>
5
+ <br/>
6
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <%= link_to_download_report_pdf %>
2
+ <%= link_to_download_report_csv %>
@@ -0,0 +1,21 @@
1
+ <% if report.records.size > 0 %>
2
+ <table class="table table-bordered table-striped">
3
+ <thead>
4
+ <% report.columns.each do |column| %>
5
+ <th><%= sort_link(report.search, column.name) %></th>
6
+ <% end %>
7
+ </thead>
8
+
9
+ <tbody>
10
+ <% report.records.each do |record| %>
11
+ <tr>
12
+ <% report.columns.each do |column| %>
13
+ <td><%= record[column.humanize] %></td>
14
+ <% end %>
15
+ </tr>
16
+ <% end %>
17
+ </tbody>
18
+ </table>
19
+ <% else %>
20
+ <p>No record found</p>
21
+ <% end %>
@@ -1,8 +1,10 @@
1
- <%= search_form_for report.search, :url => url_for, :html => {:method => :get, :class => 'form-inline'} do |f| %>
2
- <% report.filters.each do |filter| %>
3
- <% filter.comparators.each do |comparator| %>
4
- <%= query_report_render_filter(filter, comparator) %>
1
+ <% if report.has_filter? %>
2
+ <%= search_form_for report.search, :url => url_for, :html => {:method => :get, :class => 'form-inline'} do |f| %>
3
+ <% report.filters.each do |filter| %>
4
+ <% filter.comparators.each do |comparator| %>
5
+ <%= query_report_render_filter(filter, comparator) %>
6
+ <% end %>
5
7
  <% end %>
8
+ <%= f.submit 'Search', :class => 'btn btn-blue' %>
6
9
  <% end %>
7
- <%= f.submit 'Search', :class => 'btn btn-blue' %>
8
10
  <% end %>
@@ -1,14 +1,7 @@
1
1
  <%= render :partial => "query_report/search", locals: {report: @report} %>
2
2
  <br/>
3
-
4
- <%= link_to_download_report_pdf %>
5
- <%= link_to_download_report_csv %>
6
-
7
- <% if @report.has_chart? and @report.enable_chart? and @report.chart_on_web? %>
8
- <script type="text/javascript" src="https://www.google.com/jsapi"></script>
9
- <%= render :partial => "query_report/charts", locals: {report: @report} %>
10
- <% end %>
11
-
3
+ <%= render :partial => "query_report/links", locals: {report: @report} %>
4
+ <%= render :partial => "query_report/charts", locals: {report: @report} %>
12
5
  <br/>
13
6
  <%# if @report.scopes.size > 0 %>
14
7
  <%#= link_to_with_scope('all', @report.current_scope) %>
@@ -16,28 +9,6 @@
16
9
  <%#= link_to_with_scope(scope, @report.current_scope) %>
17
10
  <%# end %>
18
11
  <%# end %>
19
- <br/>
20
-
21
- <% if @report.records.size > 0 %>
22
- <table class="table table-bordered table-striped">
23
- <thead>
24
- <% @report.columns.each do |column| %>
25
- <th><%= sort_link(@report.search, column.name) %></th>
26
- <% end %>
27
- </thead>
28
-
29
- <tbody>
30
- <% @report.records.each do |record| %>
31
- <tr>
32
- <% @report.columns.each do |column| %>
33
- <td><%= record[column.humanize] %></td>
34
- <% end %>
35
- </tr>
36
- <% end %>
37
- </tbody>
38
- </table>
39
- <% else %>
40
- <p>No record found</p>
41
- <% end %>
42
12
 
13
+ <%= render :partial => "query_report/records", locals: {report: @report} %>
43
14
  <%= paginate @report.paginated_query if @report.paginate? %>
@@ -19,38 +19,38 @@ module QueryReport
19
19
  @filters << Filter.new(@params, column, options, &block)
20
20
  end
21
21
 
22
+ def has_filter?
23
+ filters.present?
24
+ end
25
+
22
26
  def apply_filters(query, http_params)
23
27
  # apply default filter
24
28
  params = load_default_values_in_param(http_params) #need for ransack filter
25
-
26
29
  @search = query.search(params[:q])
27
30
  query = @search.result
28
31
 
29
- @filters.each do |filter|
30
- if filter.custom?
31
- ordered_custom_param_values = filter.search_keys.collect do |key|
32
- if filter.boolean?
33
- params[:custom_search][key].present? ? params[:custom_search][key] == 'true' : nil
34
- else
35
- params[:custom_search][key]
36
- end
37
- end
38
- #filter only if there is a given input
39
- query = filter.block.call(query, *ordered_custom_param_values) unless ordered_custom_param_values.all? { |p| p.nil? or p == '' }
40
- end
32
+ #apply custom filter
33
+ @filters.select(&:custom?).each do |filter|
34
+ ordered_custom_param_values = ordered_param_value_objects(filter)
35
+ has_no_user_input = ordered_custom_param_values.all? { |p| p.nil? or p == '' }
36
+ query = filter.block.call(query, *ordered_custom_param_values) unless has_no_user_input
41
37
  end
42
38
  query
43
39
  end
44
40
 
41
+ def ordered_param_value_objects(filter)
42
+ filter.comparators.collect do |comp|
43
+ comp.objectified_param_value
44
+ end
45
+ end
46
+
45
47
  def load_default_values_in_param(http_params)
46
48
  params = http_params.clone
47
49
  params = params.merge(q: {}) unless params[:q]
48
50
  params = params.merge(custom_search: {}) unless params[:custom_search]
49
51
  @filters.each do |filter|
50
- if filter.has_default?
51
- filter.comparators.each do |comparator|
52
- params[filter.params_key][comparator.search_key] ||= comparator.default.to_s
53
- end
52
+ filter.comparators.each do |comparator|
53
+ params[filter.params_key][comparator.search_key] ||= comparator.param_value
54
54
  end
55
55
  end
56
56
  params
@@ -60,7 +60,7 @@ module QueryReport
60
60
  attr_reader :filter, :type, :name, :default
61
61
 
62
62
  def initialize(filter, type, name, default=nil)
63
- @filter, @type, @name, @default = filter, type, name, default.to_s
63
+ @filter, @type, @name, @default = filter, type, name, default
64
64
  end
65
65
 
66
66
  def search_key
@@ -72,12 +72,33 @@ module QueryReport
72
72
  end
73
73
 
74
74
  def param_value
75
- @filter.params[@filter.params_key] ? @filter.params[@filter.params_key][search_key] : default
75
+ @filter.params[@filter.params_key] ? @filter.params[@filter.params_key][search_key] : stringified_default
76
76
  end
77
77
 
78
78
  def has_default?
79
79
  !@default.nil?
80
80
  end
81
+
82
+ def stringified_default
83
+ @stringified_default ||= case @filter.type
84
+ when :date
85
+ @default.kind_of?(String) ? @default : @default.to_s(:db)
86
+ else
87
+ @default.to_s
88
+ end
89
+ end
90
+
91
+ #convert param value which is a string to object like date and boolean
92
+ def objectified_param_value
93
+ @stringified_default ||= case @filter.type
94
+ when :date
95
+ @default.to_date
96
+ when :boolean
97
+ @default.to_boolean
98
+ else
99
+ @default
100
+ end
101
+ end
81
102
  end
82
103
 
83
104
  class Filter
@@ -88,10 +109,7 @@ module QueryReport
88
109
  # +params+:: The params from the http request
89
110
  def initialize(params, column, options, &block)
90
111
  @params, @column, @options, @comparators, @block = params, column, options, [], block
91
- @type = options if options.kind_of? String
92
- if options.kind_of? Hash
93
- @type = options[:type]
94
- end
112
+ @type = options.kind_of?(String) ? options : options[:type]
95
113
  generate_comparators
96
114
  end
97
115
 
@@ -133,10 +151,10 @@ module QueryReport
133
151
  end
134
152
 
135
153
  if @options[:comp]
136
- @options[:comp].each_with_index do |(search_key, filter_name), i|
154
+ @options[:comp].each_with_index do |(ransack_search_key, filter_name), i|
137
155
  default = nil
138
- default = @options[:default].kind_of?(Array) ? @options[:default][i] : @options[:default] if @options[:default]
139
- @comparators << Comparator.new(self, search_key, filter_name, default)
156
+ default = @options[:default].kind_of?(Array) ? @options[:default][i] : @options[:default] unless @options[:default].nil?
157
+ @comparators << Comparator.new(self, ransack_search_key, filter_name, default)
140
158
  end
141
159
  end
142
160
  end
@@ -13,26 +13,26 @@ module QueryReport
13
13
  @report ||= QueryReport::Report.new(params, view_context, options)
14
14
  @report.query = query
15
15
  @report.instance_eval &block
16
- render_report
16
+ render_report(options)
17
17
  end
18
18
 
19
- def render_report
19
+ def render_report(options)
20
20
  respond_to do |format|
21
21
  format.js { render 'query_report/list' }
22
22
  format.html { render 'query_report/list' }
23
23
  format.json { render json: @report.all_records }
24
24
  format.csv { send_data generate_csv_for_report(@report.all_records), :disposition => "attachment;" }
25
- format.pdf { send_data query_report_pdf_template_class.new(@report).to_pdf.render }
25
+ format.pdf { send_data query_report_pdf_template_class(options).new(@report).to_pdf.render }
26
26
  end
27
27
  end
28
28
 
29
- def query_report_pdf_template_class
30
- options = QueryReport.config.pdf_options
29
+ def query_report_pdf_template_class(options)
30
+ options = QueryReport.config.pdf_options.merge(options)
31
31
  if options[:template_class]
32
32
  @template_class ||= options[:template_class].to_s.constantize
33
33
  return @template_class
34
34
  end
35
- return QueryReport::ReportPdf
35
+ QueryReport::ReportPdf
36
36
  end
37
37
 
38
38
  def generate_csv_for_report(records)
@@ -1,3 +1,3 @@
1
1
  module QueryReport
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -9,8 +9,8 @@ class InvoicesController < ApplicationController
9
9
 
10
10
  reporter(@invoices) do
11
11
  filter :title, type: :text
12
- filter :created_at, type: :date, default: [5.months.ago.to_date.to_s(:db), 1.months.from_now.to_date.to_s(:db)]
13
- filter :paid, type: :boolean
12
+ filter :created_at, type: :date, default: [5.months.ago.to_date, 1.months.from_now.to_date]
13
+ filter :paid, type: :boolean, default: false
14
14
 
15
15
  column :title do |invoice|
16
16
  link_to invoice.title, invoice
@@ -18,25 +18,30 @@ class InvoicesController < ApplicationController
18
18
  column :total_paid
19
19
  column :total_charged
20
20
  column :paid
21
-
22
- column_chart('Unpaid VS Paid') do
23
- add 'Unpaid' do |query|
24
- (query.sum('total_charged').to_f - query.sum('total_paid').to_f).to_f
25
- end
26
- add 'Paid' do |query|
27
- query.sum('total_paid').to_f
28
- end
21
+ column :received_by_id do |invoice|
22
+ invoice.received_by.name
29
23
  end
30
24
 
31
- pie_chart('Unpaid VS Paid') do
32
- add 'Unpaid' do |query|
33
- (query.sum('total_charged').to_f - query.sum('total_paid').to_f).to_f
34
- end
35
- add 'Paid' do |query|
36
- query.sum('total_paid').to_f
37
- end
38
- end
25
+ #column_chart('Unpaid VS Paid') do
26
+ # add 'Unpaid' do |query|
27
+ # (query.sum('total_charged').to_f - query.sum('total_paid').to_f).to_f
28
+ # end
29
+ # add 'Paid' do |query|
30
+ # query.sum('total_paid').to_f
31
+ # end
32
+ #end
33
+ #
34
+ #pie_chart('Unpaid VS Paid') do
35
+ # add 'Unpaid' do |query|
36
+ # (query.sum('total_charged').to_f - query.sum('total_paid').to_f).to_f
37
+ # end
38
+ # add 'Paid' do |query|
39
+ # query.sum('total_paid').to_f
40
+ # end
41
+ #end
39
42
  end
43
+ #ap @report.filters.last.comparators.first.default
44
+ #ap @report.filters.last.comparators.first.param_value
40
45
  end
41
46
 
42
47
  # GET /invoices/1
@@ -1,3 +1,4 @@
1
1
  class Invoice < ActiveRecord::Base
2
- attr_accessible :paid, :title, :total_charged, :total_paid
2
+ belongs_to :received_by, :class_name => "User"
3
+ attr_accessible :invoiced_on, :paid, :paid_on, :received_by_id, :title, :total_charged, :total_paid
3
4
  end
@@ -1,3 +1,8 @@
1
1
  class User < ActiveRecord::Base
2
- attr_accessible :dob, :email, :name, :single
2
+ has_many :invoices, :foreign_key => "received_by_id"
3
+ attr_accessible :email, :first_name, :last_name
4
+
5
+ def name
6
+ "#{first_name} #{last_name}"
7
+ end
3
8
  end
Binary file
@@ -1,10 +1,9 @@
1
1
  class CreateUsers < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :users do |t|
4
- t.string :name
4
+ t.string :first_name
5
+ t.string :last_name
5
6
  t.string :email
6
- t.boolean :single
7
- t.date :dob
8
7
 
9
8
  t.timestamps
10
9
  end
@@ -5,6 +5,9 @@ class CreateInvoices < ActiveRecord::Migration
5
5
  t.float :total_paid
6
6
  t.float :total_charged
7
7
  t.boolean :paid
8
+ t.integer :received_by_id
9
+ t.date :invoiced_on
10
+ t.date :paid_on
8
11
 
9
12
  t.timestamps
10
13
  end
@@ -18,15 +18,17 @@ ActiveRecord::Schema.define(:version => 20130630132513) do
18
18
  t.float "total_paid"
19
19
  t.float "total_charged"
20
20
  t.boolean "paid"
21
- t.datetime "created_at", :null => false
22
- t.datetime "updated_at", :null => false
21
+ t.integer "received_by_id"
22
+ t.date "invoiced_on"
23
+ t.date "paid_on"
24
+ t.datetime "created_at", :null => false
25
+ t.datetime "updated_at", :null => false
23
26
  end
24
27
 
25
28
  create_table "users", :force => true do |t|
26
- t.string "name"
29
+ t.string "first_name"
30
+ t.string "last_name"
27
31
  t.string "email"
28
- t.boolean "single"
29
- t.date "dob"
30
32
  t.datetime "created_at", :null => false
31
33
  t.datetime "updated_at", :null => false
32
34
  end
@@ -1,4 +1,15 @@
1
- r = Random.new
2
- 1.upto(100) do |i|
3
- Invoice.create(title: "Invoice ##{i}", total_paid: r.rand(100) + 200, total_charged: r.rand(500) + 200)
1
+ User.scoped.destroy_all
2
+ Invoice.scoped.destroy_all
3
+
4
+ users = []
5
+ users << User.create(first_name: 'A.K.M.', last_name: 'Ashrafuzzaman', email: 'ashraf@gmail.com')
6
+ users << User.create(first_name: 'A.K.M.', last_name: 'Zahiduzzaman', email: 'zahid@gmail.com')
7
+ users << User.create(first_name: 'Sharmin', last_name: 'Sultana', email: 'sharmin@gmail.com')
8
+
9
+ 1.upto(200) do |i|
10
+ total_paid = 100 + Random.rand(100)
11
+ total_charged = 100 + Random.rand(100)
12
+ invoiced_on = Random.rand(30).days.ago
13
+ Invoice.create!(title: "Invoice ##{i}", total_paid: total_paid, total_charged: total_charged, invoiced_on: invoiced_on,
14
+ paid: total_paid >= total_charged, received_by_id: users[Random.rand(3)].id)
4
15
  end