costagent 0.1.4 → 0.1.5
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.
- data/README.rdoc +9 -1
- data/lib/costagent.rb +57 -5
- metadata +10 -4
data/README.rdoc
CHANGED
@@ -40,6 +40,14 @@ To return all tasks for a specific project:
|
|
40
40
|
|
41
41
|
tasks = costagent.tasks(project_id)
|
42
42
|
|
43
|
+
To return all invoices for the account:
|
44
|
+
|
45
|
+
invoices = costagent.invoices
|
46
|
+
|
47
|
+
To lookup a specific invoice:
|
48
|
+
|
49
|
+
invoice = costagent.invoice(id)
|
50
|
+
|
43
51
|
To return your FA user ID:
|
44
52
|
|
45
53
|
costagent.user_id
|
@@ -90,4 +98,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
90
98
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
91
99
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
92
100
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
93
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
101
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/costagent.rb
CHANGED
@@ -6,9 +6,11 @@ require "open-uri"
|
|
6
6
|
|
7
7
|
# This exposes additional billable tracking functionality around the Freeagent API
|
8
8
|
class CostAgent
|
9
|
-
Project = Struct.new(:id, :name, :currency, :hourly_billing_rate)
|
10
|
-
Timeslip = Struct.new(:id, :project, :hours, :date, :cost)
|
9
|
+
Project = Struct.new(:id, :name, :currency, :hourly_billing_rate, :daily_billing_rate, :hours_per_day)
|
10
|
+
Timeslip = Struct.new(:id, :project, :hours, :date, :cost, :comment, :status)
|
11
11
|
Task = Struct.new(:id, :name, :project)
|
12
|
+
Invoice = Struct.new(:id, :project_id, :description, :reference, :amount, :status, :date, :due, :items)
|
13
|
+
InvoiceItem = Struct.new(:id, :invoice_id, :project_id, :item_type, :description, :price, :quantity, :cost)
|
12
14
|
|
13
15
|
attr_accessor :subdomain, :username, :password
|
14
16
|
|
@@ -25,7 +27,19 @@ class CostAgent
|
|
25
27
|
# Returns all projects
|
26
28
|
def projects(filter = "active")
|
27
29
|
@projects ||= {}
|
28
|
-
@projects[filter] ||= (self.api("projects", {:view => filter})/"project").collect
|
30
|
+
@projects[filter] ||= (self.api("projects", {:view => filter})/"project").collect do |project|
|
31
|
+
billing_rate = (project/"normal-billing-rate").text.to_f
|
32
|
+
hours_per_day = (project/"hours-per-day").text.to_f
|
33
|
+
billing_period = (project/"billing-period").text
|
34
|
+
hourly_rate = (billing_period == "hour" ? billing_rate : billing_rate / hours_per_day)
|
35
|
+
daily_rate = (billing_period == "hour" ? billing_rate * hours_per_day : billing_rate)
|
36
|
+
Project.new((project/"id").text.to_i,
|
37
|
+
(project/"name").text,
|
38
|
+
(project/"currency").text,
|
39
|
+
hourly_rate,
|
40
|
+
daily_rate,
|
41
|
+
hours_per_day)
|
42
|
+
end
|
29
43
|
end
|
30
44
|
|
31
45
|
# This returns the specified project
|
@@ -44,8 +58,10 @@ class CostAgent
|
|
44
58
|
Timeslip.new((timeslip/"id").text.to_i,
|
45
59
|
project,
|
46
60
|
hours,
|
47
|
-
DateTime.parse((timeslip/"
|
48
|
-
project.hourly_billing_rate * hours
|
61
|
+
DateTime.parse((timeslip/"dated-on").text),
|
62
|
+
project.hourly_billing_rate * hours,
|
63
|
+
(timeslip/"comment").text,
|
64
|
+
(timeslip/"status").text)
|
49
65
|
else
|
50
66
|
nil
|
51
67
|
end
|
@@ -64,6 +80,42 @@ class CostAgent
|
|
64
80
|
end
|
65
81
|
end
|
66
82
|
|
83
|
+
# This returns all invoices
|
84
|
+
def invoices
|
85
|
+
@invoices ||= (self.api("invoices")/"invoice").collect do |invoice|
|
86
|
+
items = (invoice/"invoice-item").collect do |item|
|
87
|
+
price = (item/"price").first.inner_text.to_f
|
88
|
+
quantity = (item/"quantity").first.inner_text.to_f
|
89
|
+
cost = price * quantity
|
90
|
+
InvoiceItem.new(
|
91
|
+
(item/"id").first.inner_text.to_i,
|
92
|
+
(item/"invoice-id").first.inner_text.to_i,
|
93
|
+
(item/"project-id").first.inner_text.to_i,
|
94
|
+
(item/"item-type").first.inner_text,
|
95
|
+
(item/"description").first.inner_text,
|
96
|
+
price,
|
97
|
+
quantity,
|
98
|
+
cost)
|
99
|
+
end
|
100
|
+
Invoice.new(
|
101
|
+
(invoice/"id").first.inner_text.to_i,
|
102
|
+
(invoice/"project-id").first.inner_text.to_i,
|
103
|
+
(invoice/"description").first.inner_text,
|
104
|
+
(invoice/"reference").text,
|
105
|
+
(invoice/"net-value").text.to_f,
|
106
|
+
(invoice/"status").text,
|
107
|
+
DateTime.parse((invoice/"dated-on").text),
|
108
|
+
DateTime.parse((invoice/"due-on").text),
|
109
|
+
items)
|
110
|
+
end
|
111
|
+
@invoices
|
112
|
+
end
|
113
|
+
|
114
|
+
# This returns the specific invoice by ID
|
115
|
+
def invoice(id)
|
116
|
+
self.invoices.detect { |i| i.id == id }
|
117
|
+
end
|
118
|
+
|
67
119
|
# This looks up the user ID using the CostAgent credentials
|
68
120
|
def user_id
|
69
121
|
self.client("verify").get.headers[:user_id]
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 5
|
9
|
+
version: 0.1.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Elliott Draper
|
@@ -14,13 +14,14 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-10-10 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rest-client
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
24
25
|
requirements:
|
25
26
|
- - "="
|
26
27
|
- !ruby/object:Gem::Version
|
@@ -35,6 +36,7 @@ dependencies:
|
|
35
36
|
name: hpricot
|
36
37
|
prerelease: false
|
37
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
38
40
|
requirements:
|
39
41
|
- - "="
|
40
42
|
- !ruby/object:Gem::Version
|
@@ -49,6 +51,7 @@ dependencies:
|
|
49
51
|
name: shoulda
|
50
52
|
prerelease: false
|
51
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
52
55
|
requirements:
|
53
56
|
- - ">="
|
54
57
|
- !ruby/object:Gem::Version
|
@@ -61,6 +64,7 @@ dependencies:
|
|
61
64
|
name: mocha
|
62
65
|
prerelease: false
|
63
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
64
68
|
requirements:
|
65
69
|
- - ">="
|
66
70
|
- !ruby/object:Gem::Version
|
@@ -91,6 +95,7 @@ rdoc_options:
|
|
91
95
|
require_paths:
|
92
96
|
- lib
|
93
97
|
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
94
99
|
requirements:
|
95
100
|
- - ">="
|
96
101
|
- !ruby/object:Gem::Version
|
@@ -98,6 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
103
|
- 0
|
99
104
|
version: "0"
|
100
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
101
107
|
requirements:
|
102
108
|
- - ">="
|
103
109
|
- !ruby/object:Gem::Version
|
@@ -107,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
113
|
requirements: []
|
108
114
|
|
109
115
|
rubyforge_project:
|
110
|
-
rubygems_version: 1.3.
|
116
|
+
rubygems_version: 1.3.7
|
111
117
|
signing_key:
|
112
118
|
specification_version: 3
|
113
119
|
summary: costagent is a Ruby gem that provides lightweight access to the projects/timeslips part of the FreeAgent API, with a view to tracking billable hours and figures.
|