costagent 0.1.1 → 0.1.2
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 +13 -1
- data/lib/costagent.rb +27 -13
- metadata +3 -3
data/README.rdoc
CHANGED
|
@@ -20,10 +20,14 @@ costagent = CostAgent.new subdomain, username, password
|
|
|
20
20
|
|
|
21
21
|
(remember you need to enable API access from within your FreeAgent account)
|
|
22
22
|
|
|
23
|
-
To see all projects:
|
|
23
|
+
To see all active projects:
|
|
24
24
|
|
|
25
25
|
projects = costagent.projects
|
|
26
26
|
|
|
27
|
+
To see all projects:
|
|
28
|
+
|
|
29
|
+
projects = costagent.projects("all")
|
|
30
|
+
|
|
27
31
|
To find a specific project:
|
|
28
32
|
|
|
29
33
|
project = costagent.project(id)
|
|
@@ -32,6 +36,14 @@ To find timeslips:
|
|
|
32
36
|
|
|
33
37
|
timeslips = costagent.timeslips(start_date, end_date)
|
|
34
38
|
|
|
39
|
+
To return all tasks for a specific project:
|
|
40
|
+
|
|
41
|
+
tasks = costagent.tasks(project_id)
|
|
42
|
+
|
|
43
|
+
To return your FA user ID:
|
|
44
|
+
|
|
45
|
+
costagent.user_id
|
|
46
|
+
|
|
35
47
|
And to return a GBP figure of the money earnt during a specific timeframe based on billable hours:
|
|
36
48
|
|
|
37
49
|
total = costagent.earnt(start_date, end_date)
|
data/lib/costagent.rb
CHANGED
|
@@ -23,13 +23,13 @@ class CostAgent
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# Returns all projects
|
|
26
|
-
def projects
|
|
27
|
-
@projects ||= (self.api("projects")/"project").collect { |project| Project.new((project/"id").text.to_i, (project/"name").text, (project/"currency").text, (project/"normal-billing-rate").text.to_f) }
|
|
26
|
+
def projects(filter = "active")
|
|
27
|
+
@projects ||= (self.api("projects", {:view => filter})/"project").collect { |project| Project.new((project/"id").text.to_i, (project/"name").text, (project/"currency").text, (project/"normal-billing-rate").text.to_f) }
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# This returns the specified project
|
|
31
31
|
def project(id)
|
|
32
|
-
self.projects.detect { |p| p.id == id }
|
|
32
|
+
self.projects("all").detect { |p| p.id == id }
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# This returns all timeslips for the specified date range, with additional cost information
|
|
@@ -37,14 +37,18 @@ class CostAgent
|
|
|
37
37
|
(self.api("timeslips", :view => "#{start_date.strftime("%Y-%m-%d")}_#{end_date.strftime("%Y-%m-%d")}")/"timeslip").collect do |timeslip|
|
|
38
38
|
# Find the project and hours for this timeslip
|
|
39
39
|
project = self.project((timeslip/"project-id").text.to_i)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
if project
|
|
41
|
+
hours = (timeslip/"hours").text.to_f
|
|
42
|
+
# Build the timeslip out using the timeslip data and the project it's tied to
|
|
43
|
+
Timeslip.new((timeslip/"id").text.to_i,
|
|
44
|
+
project,
|
|
45
|
+
hours,
|
|
46
|
+
DateTime.parse((timeslip/"updated-at").text),
|
|
47
|
+
project.hourly_billing_rate * hours)
|
|
48
|
+
else
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
end - [nil]
|
|
48
52
|
end
|
|
49
53
|
|
|
50
54
|
# This returns all tasks for the specified project_id
|
|
@@ -58,6 +62,11 @@ class CostAgent
|
|
|
58
62
|
project)
|
|
59
63
|
end
|
|
60
64
|
end
|
|
65
|
+
|
|
66
|
+
# This looks up the user ID using the CostAgent credentials
|
|
67
|
+
def user_id
|
|
68
|
+
self.client("verify").get.headers[:user_id]
|
|
69
|
+
end
|
|
61
70
|
|
|
62
71
|
# This returns the amount of GBP earnt in the specified timeframe
|
|
63
72
|
def earnt(start_date = DateTime.now, end_date = start_date)
|
|
@@ -72,12 +81,17 @@ class CostAgent
|
|
|
72
81
|
|
|
73
82
|
# This calls the FA API for the specified resource
|
|
74
83
|
def api(resource, parameters = {})
|
|
75
|
-
|
|
76
|
-
res = RestClient::Resource.new(url, self.username, self.password).get
|
|
84
|
+
res = self.client(resource, parameters).get
|
|
77
85
|
raise "No response from #{url}!" if res.body.nil? && res.body.empty?
|
|
78
86
|
Hpricot(res.body)
|
|
79
87
|
end
|
|
80
88
|
|
|
89
|
+
# This returns a client ready to query the FA API
|
|
90
|
+
def client(resource, parameters = {})
|
|
91
|
+
url = "https://#{self.subdomain}.freeagentcentral.com/#{resource}#{parameters.empty? ? "" : "?" + parameters.collect { |p| p.join("=") }.join("&")}"
|
|
92
|
+
RestClient::Resource.new(url, self.username, self.password)
|
|
93
|
+
end
|
|
94
|
+
|
|
81
95
|
class << self
|
|
82
96
|
# This returns the current USD rate from xe.com (or falls back on 1.6 if there is an error)
|
|
83
97
|
def usd_rate
|
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
|
+
- 2
|
|
9
|
+
version: 0.1.2
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Elliott Draper
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-
|
|
17
|
+
date: 2010-06-02 00:00:00 +01:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|