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 +4 -4
- data/README.md +31 -0
- data/Rakefile +6 -0
- data/lib/reportable_rails/errors.rb +3 -0
- data/lib/reportable_rails/models/hours_log.rb +1 -1
- data/lib/reportable_rails/models/report.rb +15 -3
- data/lib/reportable_rails/models/report_category.rb +23 -1
- data/lib/reportable_rails/version.rb +1 -1
- data/lib/reportable_rails.rb +1 -0
- metadata +102 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef90324ca92f03a4efba50015b5a1b7f39d613d401ba0232b7808567f473c2e7
|
4
|
+
data.tar.gz: ce4f851f7bd2f814d84b0b0bb73a03e9018392e54c38211dfcdda614f46d1dac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 293a7567e11664b79d5eea075a35f64cb112d1bb95de105fb2e7227902b55b97d2fd50886510c6d5d67c8eea1ff4816a6437b55ff72073d8b5978684807dd8b4
|
7
|
+
data.tar.gz: e530c203a222dab06ea1f1f184515a7ce114141b7d5a14e7c6c00e2176c0120b98f9b84e25db7521225df4e96927c991aaf6b93185876b377bcca386f8e0a993
|
data/README.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# ReportableRails
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/reportable_rails)
|
4
|
+
[](https://github.com/adobocorp/reportable_rails/actions)
|
5
|
+
[](https://github.com/testdouble/standard)
|
6
|
+
[](https://codeclimate.com/github/adobocorp/reportable_rails)
|
7
|
+
[](https://codeclimate.com/github/adobocorp/reportable_rails)
|
8
|
+
[](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
@@ -4,7 +4,7 @@ module ReportableRails
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
belongs_to :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,
|
9
|
-
has_many :hours_logs,
|
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 +
|
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,
|
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
|
data/lib/reportable_rails.rb
CHANGED
@@ -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.
|
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: :
|
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
|