reportable_rails 0.1.2 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2599e880a8d9608af3f17d210f19e6b17ffab9dddad24572c55fdca8187e7a7e
4
- data.tar.gz: 3c19a1cfba98ccdfc4279e48b9f9f4c3006b360fbdfc50279c259a3d1d2e7192
3
+ metadata.gz: ef90324ca92f03a4efba50015b5a1b7f39d613d401ba0232b7808567f473c2e7
4
+ data.tar.gz: ce4f851f7bd2f814d84b0b0bb73a03e9018392e54c38211dfcdda614f46d1dac
5
5
  SHA512:
6
- metadata.gz: d9cc252b5b6fb17a348cd610944724768c89ed91b3dc0be469b9f8683fdf0e85d1342acda5ee71aca5bfcc2c5fd92bc5bc90b26afe6c2292bfa9f67e24272de5
7
- data.tar.gz: 19bb2d807d7c4c968093ebfc4d46098906e0920b87f467bbb01937495f5feb6faf70dfe56eb7b001879f6d06ddf53592ed938977834f2e7e50b5fd336acf305a
6
+ metadata.gz: 293a7567e11664b79d5eea075a35f64cb112d1bb95de105fb2e7227902b55b97d2fd50886510c6d5d67c8eea1ff4816a6437b55ff72073d8b5978684807dd8b4
7
+ data.tar.gz: e530c203a222dab06ea1f1f184515a7ce114141b7d5a14e7c6c00e2176c0120b98f9b84e25db7521225df4e96927c991aaf6b93185876b377bcca386f8e0a993
data/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # ReportableRails
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/reportable_rails.svg)](https://badge.fury.io/rb/reportable_rails)
4
+ [![Build Status](https://github.com/adobocorp/reportable_rails/workflows/RSpec%20Tests/badge.svg)](https://github.com/adobocorp/reportable_rails/actions)
5
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
6
+ [![Maintainability](https://api.codeclimate.com/v1/badges/YOUR_REPO_ID/maintainability)](https://codeclimate.com/github/adobocorp/reportable_rails)
7
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/YOUR_REPO_ID/test_coverage)](https://codeclimate.com/github/adobocorp/reportable_rails)
8
+ [![Ruby](https://img.shields.io/badge/ruby-2.7%2B-blue)](https://www.ruby-lang.org/en/)
9
+
3
10
  ReportableRails is a Ruby on Rails gem that provides a flexible reporting system for tracking and managing time-based reports with period management.
4
11
 
5
12
  ## Installation
@@ -31,6 +38,9 @@ ReportableRails.configure do |config|
31
38
  # Your custom logic here
32
39
  # For example: NotificationMailer.report_submitted(report).deliver_later
33
40
  }
41
+
42
+ # Customize the name of the default category
43
+ config.default_category_name = 'General' # Defaults to 'Uncategorized'
34
44
  end
35
45
  ```
36
46
 
@@ -121,6 +131,27 @@ report = TimeReport.create!(
121
131
  )
122
132
  ```
123
133
 
134
+ ### Default Category
135
+
136
+ ReportableRails automatically manages a default "Uncategorized" category that cannot be deactivated or deleted. You can customize the name of this category in your configuration:
137
+
138
+ ```ruby
139
+ ReportableRails.configure do |config|
140
+ config.default_category_name = 'General' # Defaults to 'Uncategorized'
141
+ end
142
+ ```
143
+
144
+ To access the default category:
145
+
146
+ ```ruby
147
+ default_category = ReportCategory.default_category # Returns or creates the default category
148
+ ```
149
+
150
+ Reports without a specific category will use this default category. The default category:
151
+ - Cannot be deactivated
152
+ - Cannot be deleted
153
+ - Is automatically created when first accessed
154
+
124
155
  ### Database Setup
125
156
 
126
157
  You'll need to create the necessary database tables. Here are the recommended migrations:
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,3 @@
1
+ module ReportableRails
2
+ class InvalidPeriodError < StandardError; end
3
+ end
@@ -4,7 +4,7 @@ module ReportableRails
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- belongs_to :report, class_name: 'ReportableRails::Report'
7
+ belongs_to :report
8
8
 
9
9
  validates :hours, presence: true, numericality: { greater_than: 0, less_than_or_equal_to: 24 }
10
10
  validates :date, presence: true
@@ -5,12 +5,13 @@ module ReportableRails
5
5
 
6
6
  included do
7
7
  belongs_to :owner, class_name: ReportableRails.configuration.user_class
8
- belongs_to :report_category, class_name: 'ReportableRails::ReportCategory', optional: true
9
- has_many :hours_logs, class_name: 'ReportableRails::HoursLog', dependent: :destroy
8
+ belongs_to :report_category, optional: true
9
+ has_many :hours_logs, dependent: :destroy
10
10
 
11
11
  validates :owner, presence: true
12
12
 
13
13
  def add_hours_log(hours_log_params)
14
+ validate_period_for_date(hours_log_params[:date])
14
15
  hours_logs.create(hours_log_params)
15
16
  end
16
17
 
@@ -28,7 +29,7 @@ module ReportableRails
28
29
 
29
30
  def current_period_end_date
30
31
  if Date.current.day <= 15
31
- Date.current.beginning_of_month + 15.days
32
+ Date.current.beginning_of_month + 14.days
32
33
  else
33
34
  Date.current.end_of_month
34
35
  end
@@ -47,6 +48,17 @@ module ReportableRails
47
48
  def current_period_hours
48
49
  hours_logs.select(&:current_period?)
49
50
  end
51
+
52
+ private
53
+
54
+ def validate_period_for_date(date)
55
+ return if date.nil?
56
+
57
+ unless date >= current_period_start_date && date <= current_period_end_date
58
+ raise InvalidPeriodError, "Date must be within the current reporting period (#{current_period_start_date} to #{current_period_end_date})"
59
+ end
60
+ end
61
+
50
62
  end
51
63
  end
52
64
  end
@@ -4,23 +4,38 @@ module ReportableRails
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- has_many :reports, class_name: 'ReportableRails::Report', dependent: :nullify
7
+ has_many :reports, dependent: :nullify
8
8
 
9
9
  validates :name, presence: true, uniqueness: { case_sensitive: false }
10
10
  validates :description, length: { maximum: 1000 }
11
11
  validates :active, inclusion: { in: [true, false] }
12
+ validate :prevent_deactivating_default_category
12
13
 
13
14
  # Scopes
14
15
  scope :active, -> { where(active: true) }
15
16
  scope :ordered, -> { order(:name) }
16
17
 
17
18
  before_validation :set_default_active
19
+ before_destroy :prevent_destroying_default_category
18
20
 
19
21
  private
20
22
 
21
23
  def set_default_active
22
24
  self.active = true if active.nil?
23
25
  end
26
+
27
+ def prevent_deactivating_default_category
28
+ if name == ReportableRails.configuration.default_category_name && !active
29
+ errors.add(:active, "cannot deactivate the default category")
30
+ end
31
+ end
32
+
33
+ def prevent_destroying_default_category
34
+ if name == ReportableRails.configuration.default_category_name
35
+ errors.add(:base, "cannot delete the default category")
36
+ throw :abort
37
+ end
38
+ end
24
39
  end
25
40
 
26
41
  module ClassMethods
@@ -31,8 +46,15 @@ module ReportableRails
31
46
  end
32
47
  end
33
48
 
49
+ # Get or create the default category
50
+ def default_category
51
+ find_or_create_by_name(ReportableRails.configuration.default_category_name,
52
+ description: 'Default category for uncategorized reports')
53
+ end
54
+
34
55
  # Deactivate a category without deleting it
35
56
  def deactivate(name)
57
+ return false if name == ReportableRails.configuration.default_category_name
36
58
  category = find_by(name: name)
37
59
  category&.update(active: false)
38
60
  end
@@ -1,3 +1,3 @@
1
1
  module ReportableRails
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -3,6 +3,7 @@
3
3
  require 'rails/engine'
4
4
  require 'active_model_serializers'
5
5
  require 'reportable_rails/version'
6
+ require 'reportable_rails/errors'
6
7
  require 'reportable_rails/models/report'
7
8
  require 'reportable_rails/models/report_category'
8
9
  require 'reportable_rails/models/hours_log'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reportable_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicu Listana
@@ -37,6 +37,90 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: actionview
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 6.1.0
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 6.1.0
54
+ - !ruby/object:Gem::Dependency
55
+ name: activerecord
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 6.1.0
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 6.1.0
68
+ - !ruby/object:Gem::Dependency
69
+ name: activemodel
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 6.1.0
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 6.1.0
82
+ - !ruby/object:Gem::Dependency
83
+ name: activesupport
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 6.1.0
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 6.1.0
96
+ - !ruby/object:Gem::Dependency
97
+ name: reportable_rails
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.1.3
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 0.1.3
110
+ - !ruby/object:Gem::Dependency
111
+ name: tzinfo-data
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.2023'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.2023'
40
124
  - !ruby/object:Gem::Dependency
41
125
  name: sqlite3
42
126
  requirement: !ruby/object:Gem::Requirement
@@ -44,7 +128,7 @@ dependencies:
44
128
  - - ">="
45
129
  - !ruby/object:Gem::Version
46
130
  version: '0'
47
- type: :development
131
+ type: :runtime
48
132
  prerelease: false
49
133
  version_requirements: !ruby/object:Gem::Requirement
50
134
  requirements:
@@ -93,6 +177,20 @@ dependencies:
93
177
  - - ">="
94
178
  - !ruby/object:Gem::Version
95
179
  version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: shoulda-matchers
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '5.0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '5.0'
96
194
  description: ReportableRails provides a complete solution for managing user reports,
97
195
  hours logging, and report categories in Ruby on Rails applications
98
196
  email:
@@ -102,7 +200,9 @@ extensions: []
102
200
  extra_rdoc_files: []
103
201
  files:
104
202
  - README.md
203
+ - Rakefile
105
204
  - lib/reportable_rails.rb
205
+ - lib/reportable_rails/errors.rb
106
206
  - lib/reportable_rails/models/hours_log.rb
107
207
  - lib/reportable_rails/models/report.rb
108
208
  - lib/reportable_rails/models/report_category.rb