ragoon 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +89 -0
- data/lib/ragoon.rb +7 -10
- data/lib/ragoon/client.rb +3 -2
- data/lib/ragoon/services.rb +13 -4
- data/lib/ragoon/services/schedule.rb +1 -1
- data/lib/ragoon/services/workflow.rb +220 -0
- data/lib/ragoon/version.rb +1 -1
- data/lib/ragoon/xml.rb +5 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe814ed32bc7d13e09e6722ab67449e44461523a
|
4
|
+
data.tar.gz: eb5eb942bcc1ea59f4fb3791f9275b53dec50631
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 725ee5d5a650f1ad84e7ee8472d6c007b0dbf42cea726d6bc4d79e8a849124f6bc78af048fe774ec7cb9e891d5486a0282299523b8d040e03086322cc1cb834e
|
7
|
+
data.tar.gz: 80d73ab6973c26567fb4549d022fa8fc0d2ee20ec5666a9271fb9edd5f99e501cd05df661a0a90864931ffebffab2257446b5f4c5ddc6da1200d034f4e57fbe6
|
data/README.md
CHANGED
@@ -75,6 +75,95 @@ notifications = service.retreive
|
|
75
75
|
]
|
76
76
|
```
|
77
77
|
|
78
|
+
### Workflow
|
79
|
+
|
80
|
+
```
|
81
|
+
service = Ragoon::Services::Workflow.new
|
82
|
+
service.workflow_get_requests(
|
83
|
+
request_form_id: 41,
|
84
|
+
filter: 'All',
|
85
|
+
start_request_date: Time.new(2011, 6, 19, 13, 30),
|
86
|
+
end_request_date: Time.new(2014, 12, 1, 19, 50),
|
87
|
+
start_approval_date: Time.new(2011, 6, 1, 19, 40),
|
88
|
+
end_approval_date: Time.new(2014, 12, 31, 9, 45),
|
89
|
+
applicant: 14,
|
90
|
+
last_approval: 6,
|
91
|
+
start_to_get_information_from: 2,
|
92
|
+
maximum_request_amount_to_get: 10
|
93
|
+
)
|
94
|
+
|
95
|
+
=> [
|
96
|
+
{:id=>"33",
|
97
|
+
:number=>"33",
|
98
|
+
:priority=>"0",
|
99
|
+
:subject=>"12月7日休日出勤",
|
100
|
+
:status=>"承認",
|
101
|
+
:applicant=>"14",
|
102
|
+
:last_approver=>"6",
|
103
|
+
:request_date=>2014-12-01 19:40:26 +0900}
|
104
|
+
]
|
105
|
+
|
106
|
+
service.workflow_get_requests_by_id([33])
|
107
|
+
|
108
|
+
=> [
|
109
|
+
{:id=>"33",
|
110
|
+
:number=>"33",
|
111
|
+
:name=>"休日出勤申請(12月7日休日出勤)",
|
112
|
+
:processing_step=>"97",
|
113
|
+
:status=>"承認",
|
114
|
+
:urgent=>"false",
|
115
|
+
:version=>"1417430538",
|
116
|
+
:date=>2014-12-01 19:40:26 +0900,
|
117
|
+
:status_type=>"approved",
|
118
|
+
:applicant=>{:id=>"14", :name=>"松田 環奈"},
|
119
|
+
:items=>
|
120
|
+
[{:name=>"社員番号", :value=>"3110342"}],
|
121
|
+
:steps=>
|
122
|
+
[{:id=>"97",
|
123
|
+
:name=>"経理担当者",
|
124
|
+
:type=>"回覧",
|
125
|
+
:is_approval_step=>"0",
|
126
|
+
:processors=>
|
127
|
+
[{:id=>"13", :name=>"加藤 美咲", :comment=>nil}]}]}
|
128
|
+
]
|
129
|
+
|
130
|
+
service.workflow_get_sent_application_versions([
|
131
|
+
{id: 23, version: 1306486544},
|
132
|
+
{id: 20, version: 1306486544},
|
133
|
+
{id: 22, version: 1306486533},
|
134
|
+
],
|
135
|
+
start_date: Time.new(2011, 5, 25, 18, 50),
|
136
|
+
end_date: Time.new(2011, 6, 26, 18, 0)
|
137
|
+
)
|
138
|
+
|
139
|
+
=> [
|
140
|
+
{:id=>"22", :version=>"1306486534", :operation=>"modify"},
|
141
|
+
{:id=>"23", :version=>"0", :operation=>"remove"},
|
142
|
+
{:id=>"21", :version=>"1415185979", :operation=>"add"}
|
143
|
+
]
|
144
|
+
|
145
|
+
service.workflow_get_sent_applications_by_id([21])
|
146
|
+
|
147
|
+
=> [{:id=>"21",
|
148
|
+
:number=>"21",
|
149
|
+
:name=>"休日出勤申請(休日出勤申請)",
|
150
|
+
:processing_step=>"65",
|
151
|
+
:status=>"承認",
|
152
|
+
:urgent=>"false",
|
153
|
+
:version=>"1415185979",
|
154
|
+
:date=>2011-05-27 16:10:41 +0900,
|
155
|
+
:status_type=>"approved",
|
156
|
+
:applicant=>{:id=>"6", :name=>"佐藤 昇"},
|
157
|
+
:items=>
|
158
|
+
[{:name=>"社員番号", :value=>"3110334"}],
|
159
|
+
:steps=>
|
160
|
+
[{:id=>"63",
|
161
|
+
:name=>"部長",
|
162
|
+
:type=>"承認(全員)",
|
163
|
+
:is_approval_step=>"1",
|
164
|
+
:processors=>[{:id=>"6", :name=>"佐藤 昇", :comment=>nil}]}]}]
|
165
|
+
```
|
166
|
+
|
78
167
|
## License
|
79
168
|
|
80
169
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/ragoon.rb
CHANGED
@@ -4,6 +4,7 @@ require 'ragoon/client'
|
|
4
4
|
require 'ragoon/services'
|
5
5
|
require 'ragoon/services/schedule'
|
6
6
|
require 'ragoon/services/notification'
|
7
|
+
require 'ragoon/services/workflow'
|
7
8
|
|
8
9
|
require 'nokogiri'
|
9
10
|
require 'rest-client'
|
@@ -11,16 +12,12 @@ require 'rest-client'
|
|
11
12
|
module Ragoon
|
12
13
|
@@secret_options = {}
|
13
14
|
|
14
|
-
def self.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.garoon_password
|
23
|
-
ENV['GAROON_PASSWORD'] || secret_options[:garoon_password] || raise_option_error('password')
|
15
|
+
def self.default_options
|
16
|
+
{
|
17
|
+
endpoint: ENV['GAROON_ENDPOINT'] || secret_options[:garoon_endpoint] || raise_option_error('endpoint'),
|
18
|
+
username: ENV['GAROON_USERNAME'] || secret_options[:garoon_username] || raise_option_error('username'),
|
19
|
+
password: ENV['GAROON_PASSWORD'] || secret_options[:garoon_password] || raise_option_error('password')
|
20
|
+
}
|
24
21
|
end
|
25
22
|
|
26
23
|
def self.raise_option_error(type)
|
data/lib/ragoon/client.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
class Ragoon::Client
|
2
2
|
attr_reader :endpoint, :response
|
3
3
|
|
4
|
-
def initialize(endpoint)
|
4
|
+
def initialize(endpoint, options)
|
5
5
|
@endpoint = endpoint
|
6
|
+
@options = options
|
6
7
|
end
|
7
8
|
|
8
9
|
def request(action_name, body_node)
|
9
10
|
@action_name = action_name
|
10
11
|
@body_node = body_node
|
11
|
-
@response = RestClient.post(endpoint, Ragoon::XML.render(action_name, body_node))
|
12
|
+
@response = RestClient.post(endpoint, Ragoon::XML.render(action_name, body_node, @options))
|
12
13
|
end
|
13
14
|
|
14
15
|
def result_set
|
data/lib/ragoon/services.rb
CHANGED
@@ -2,18 +2,19 @@ class Ragoon::Services
|
|
2
2
|
SERVICE_LOCATIONS = {
|
3
3
|
schedule: '/cbpapi/schedule/api?',
|
4
4
|
notification: '/cbpapi/notification/api?',
|
5
|
+
workflow: '/cbpapi/workflow/api?',
|
5
6
|
}.freeze
|
6
7
|
|
7
8
|
attr_reader :client, :action_type
|
8
9
|
|
9
|
-
def initialize
|
10
|
+
def initialize(options = Ragoon.default_options)
|
11
|
+
@options = options
|
10
12
|
@action_type = self.class.name.split('::').pop.downcase.to_sym
|
11
|
-
@client = Ragoon::Client.new(self.endpoint)
|
13
|
+
@client = Ragoon::Client.new(self.endpoint, options)
|
12
14
|
end
|
13
15
|
|
14
16
|
def endpoint
|
15
|
-
|
16
|
-
"#{endpoint.scheme}://#{endpoint.host}#{endpoint.path}#{SERVICE_LOCATIONS[action_type]}"
|
17
|
+
"#{base_endpoint}#{SERVICE_LOCATIONS[action_type]}"
|
17
18
|
end
|
18
19
|
|
19
20
|
def self.start_and_end(date = Date.today)
|
@@ -22,4 +23,12 @@ class Ragoon::Services
|
|
22
23
|
end: ((date + 1).to_time - 1).utc,
|
23
24
|
}
|
24
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def base_endpoint
|
30
|
+
endpoint = URI(@options[:endpoint])
|
31
|
+
"#{endpoint.scheme}://#{endpoint.host}#{endpoint.path}"
|
32
|
+
end
|
33
|
+
|
25
34
|
end
|
@@ -106,7 +106,7 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def event_url(id)
|
109
|
-
"#{
|
109
|
+
"#{base_endpoint}/schedule/view?event=#{id}"
|
110
110
|
end
|
111
111
|
|
112
112
|
def facility_names(event)
|
@@ -0,0 +1,220 @@
|
|
1
|
+
#
|
2
|
+
# Workflow API Service
|
3
|
+
# https://cybozudev.zendesk.com/hc/ja/articles/202270284
|
4
|
+
#
|
5
|
+
class Ragoon::Services::Workflow < Ragoon::Services
|
6
|
+
|
7
|
+
#
|
8
|
+
# for admin only
|
9
|
+
#
|
10
|
+
|
11
|
+
def workflow_get_requests(request_form_id:, **options)
|
12
|
+
action_name = 'WorkflowGetRequests'
|
13
|
+
|
14
|
+
options[:request_form_id] = request_form_id
|
15
|
+
[ :start_request_date, :end_request_date,
|
16
|
+
:start_approval_date, :end_approval_date ].each do |key|
|
17
|
+
options[key] = to_datetime(options[key]) if options.has_key?(key)
|
18
|
+
end
|
19
|
+
|
20
|
+
body_node = Ragoon::XML.create_node(action_name)
|
21
|
+
parameter_node = Ragoon::XML.create_node('parameters')
|
22
|
+
body_node.add_child(parameter_node)
|
23
|
+
|
24
|
+
manage_parameter_node = Ragoon::XML.create_node(
|
25
|
+
'manage_request_parmeter', options)
|
26
|
+
parameter_node.add_child(manage_parameter_node)
|
27
|
+
|
28
|
+
client.request(action_name, body_node)
|
29
|
+
|
30
|
+
client.result_set.xpath('//manage_item_detail').map do |item|
|
31
|
+
{
|
32
|
+
id: item[:pid],
|
33
|
+
number: item[:number],
|
34
|
+
priority: item[:priority],
|
35
|
+
subject: item[:subject],
|
36
|
+
status: item[:status],
|
37
|
+
applicant: item[:applicant], # user_id
|
38
|
+
last_approver: item[:last_approver],
|
39
|
+
request_date: parse_time(item[:request_date]),
|
40
|
+
}
|
41
|
+
end
|
42
|
+
ensure
|
43
|
+
client.reset
|
44
|
+
end
|
45
|
+
|
46
|
+
def workflow_get_requests_by_id(ids)
|
47
|
+
action_name = 'WorkflowGetRequestById'
|
48
|
+
|
49
|
+
body_node = Ragoon::XML.create_node(action_name)
|
50
|
+
parameter_node = Ragoon::XML.create_node('parameters')
|
51
|
+
body_node.add_child(parameter_node)
|
52
|
+
|
53
|
+
ids.each do |id|
|
54
|
+
request_id_node = Ragoon::XML.create_node('request_id')
|
55
|
+
request_id_node.content = id
|
56
|
+
parameter_node.add_child(request_id_node)
|
57
|
+
end
|
58
|
+
|
59
|
+
client.request(action_name, body_node)
|
60
|
+
|
61
|
+
client.result_set.xpath('//application').map do |app|
|
62
|
+
parse_application(app)
|
63
|
+
end
|
64
|
+
ensure
|
65
|
+
client.reset
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# unprocessed
|
70
|
+
#
|
71
|
+
|
72
|
+
def workflow_get_unprocessed_application_versions(id_versions = [])
|
73
|
+
get_application_versions(
|
74
|
+
'WorkflowGetUnprocessedApplicationVersions',
|
75
|
+
nil, nil,
|
76
|
+
id_versions
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
def workflow_get_unprocessed_applications_by_id(ids)
|
81
|
+
get_applications_by_id('WorkflowGetUnprocessedApplicationsById', ids)
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# sent
|
86
|
+
#
|
87
|
+
|
88
|
+
def workflow_get_sent_application_versions(id_versions = [], start_date:, end_date: nil)
|
89
|
+
get_application_versions(
|
90
|
+
'WorkflowGetSentApplicationVersions',
|
91
|
+
start_date, end_date,
|
92
|
+
id_versions
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def workflow_get_sent_applications_by_id(ids)
|
97
|
+
get_applications_by_id('WorkflowGetSentApplicationsById', ids)
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# recieved
|
102
|
+
#
|
103
|
+
|
104
|
+
def workflow_get_received_application_versions(id_versions = [], start_date:, end_date: nil)
|
105
|
+
get_application_versions(
|
106
|
+
'WorkflowGetReceivedApplicationVersions',
|
107
|
+
start_date, end_date,
|
108
|
+
id_versions
|
109
|
+
)
|
110
|
+
end
|
111
|
+
|
112
|
+
def workflow_get_received_applications_by_id(ids)
|
113
|
+
get_applications_by_id('WorkflowGetReceivedApplicationsById', ids)
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def get_application_versions(action_name, start_date, end_date, id_versions)
|
119
|
+
body_node = Ragoon::XML.create_node(action_name)
|
120
|
+
|
121
|
+
attributes = {}
|
122
|
+
attributes['start'] = to_datetime(start_date) unless start_date.nil?
|
123
|
+
attributes['end'] = to_datetime(end_date) unless end_date.nil?
|
124
|
+
parameter_node = Ragoon::XML.create_node('parameters', attributes)
|
125
|
+
body_node.add_child(parameter_node)
|
126
|
+
|
127
|
+
id_versions.each do |item|
|
128
|
+
parameter_node << Ragoon::XML.create_node(
|
129
|
+
'application_item',
|
130
|
+
id: item[:id], version: item[:version]
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
client.request(action_name, body_node)
|
135
|
+
|
136
|
+
client.result_set.xpath('//application_item').map do |item|
|
137
|
+
{
|
138
|
+
id: item['id'],
|
139
|
+
version: item['version'],
|
140
|
+
operation: item['operation']
|
141
|
+
}
|
142
|
+
end
|
143
|
+
ensure
|
144
|
+
client.reset
|
145
|
+
end
|
146
|
+
|
147
|
+
def get_applications_by_id(action_name, ids)
|
148
|
+
body_node = Ragoon::XML.create_node(action_name)
|
149
|
+
|
150
|
+
parameter_node = Ragoon::XML.create_node('parameters')
|
151
|
+
body_node.add_child(parameter_node)
|
152
|
+
|
153
|
+
ids.each do |id|
|
154
|
+
id_node = Ragoon::XML.create_node('application_id')
|
155
|
+
id_node.content = id
|
156
|
+
parameter_node.add_child(id_node)
|
157
|
+
end
|
158
|
+
|
159
|
+
client.request(action_name, body_node)
|
160
|
+
|
161
|
+
client.result_set.xpath('//application').map do |app|
|
162
|
+
parse_application(app)
|
163
|
+
end
|
164
|
+
ensure
|
165
|
+
client.reset
|
166
|
+
end
|
167
|
+
|
168
|
+
def parse_application(app)
|
169
|
+
{
|
170
|
+
id: app['id'],
|
171
|
+
number: app['number'],
|
172
|
+
name: app['name'],
|
173
|
+
processing_step: app['processing_step'],
|
174
|
+
status: app['status'],
|
175
|
+
urgent: app['urgent'],
|
176
|
+
version: app['version'],
|
177
|
+
date: parse_time(app['date']),
|
178
|
+
status_type: app['status_type'],
|
179
|
+
|
180
|
+
applicant: app.xpath('wf:applicant', wf: 'http://schemas.cybozu.co.jp/workflow/2008').map {|applicant|
|
181
|
+
{
|
182
|
+
id: applicant['id'],
|
183
|
+
name: applicant['name']
|
184
|
+
}
|
185
|
+
}.first,
|
186
|
+
|
187
|
+
items: app.xpath('wf:items/wf:item', wf: 'http://schemas.cybozu.co.jp/workflow/2008').map {|item|
|
188
|
+
{
|
189
|
+
name: item['name'],
|
190
|
+
value: item['value']
|
191
|
+
}
|
192
|
+
},
|
193
|
+
|
194
|
+
steps: app.xpath('wf:steps/wf:step', wf: 'http://schemas.cybozu.co.jp/workflow/2008').map {|step|
|
195
|
+
{
|
196
|
+
id: step['id'],
|
197
|
+
name: step['name'],
|
198
|
+
type: step['type'],
|
199
|
+
is_approval_step: step['is_approval_step'],
|
200
|
+
processors: step.xpath('wf:processor', wf: 'http://schemas.cybozu.co.jp/workflow/2008').map {|pro|
|
201
|
+
{
|
202
|
+
id: pro['id'],
|
203
|
+
name: pro['processor_name'],
|
204
|
+
comment: pro['comment']
|
205
|
+
}
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
}
|
210
|
+
end
|
211
|
+
|
212
|
+
def parse_time(time)
|
213
|
+
Time.parse(time).localtime
|
214
|
+
end
|
215
|
+
|
216
|
+
def to_datetime(str)
|
217
|
+
str.utc.strftime('%FT%TZ')
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
data/lib/ragoon/version.rb
CHANGED
data/lib/ragoon/xml.rb
CHANGED
@@ -2,8 +2,8 @@ module Ragoon::XML
|
|
2
2
|
ACTION_PLACEHOLDER = '<!-- REQUEST_ACTION -->'.freeze
|
3
3
|
BODY_PLACEHOLDER = '<!-- REQUEST_BODY -->'.freeze
|
4
4
|
|
5
|
-
def self.render(action_name, body_node)
|
6
|
-
template.dup.
|
5
|
+
def self.render(action_name, body_node, options)
|
6
|
+
template(options).dup.
|
7
7
|
gsub!(ACTION_PLACEHOLDER, action_name).
|
8
8
|
gsub!(BODY_PLACEHOLDER, body_node.to_xml)
|
9
9
|
end
|
@@ -16,7 +16,7 @@ module Ragoon::XML
|
|
16
16
|
node
|
17
17
|
end
|
18
18
|
|
19
|
-
def self.template
|
19
|
+
def self.template(options)
|
20
20
|
<<"XML"
|
21
21
|
<?xml version="1.0" encoding="UTF-8"?>
|
22
22
|
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
|
@@ -33,8 +33,8 @@ module Ragoon::XML
|
|
33
33
|
SOAP-ENV:mustUnderstand="1"
|
34
34
|
xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
|
35
35
|
<UsernameToken wsu:Id="id">
|
36
|
-
<Username>#{
|
37
|
-
<Password>#{
|
36
|
+
<Username>#{options[:username]}</Username>
|
37
|
+
<Password>#{options[:password]}</Password>
|
38
38
|
</UsernameToken>
|
39
39
|
</Security>
|
40
40
|
<Timestamp SOAP-ENV:mustUnderstand="1" Id="id"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ragoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SHIOYA, Hiromu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/ragoon/services.rb
|
116
116
|
- lib/ragoon/services/notification.rb
|
117
117
|
- lib/ragoon/services/schedule.rb
|
118
|
+
- lib/ragoon/services/workflow.rb
|
118
119
|
- lib/ragoon/version.rb
|
119
120
|
- lib/ragoon/xml.rb
|
120
121
|
- ragoon.gemspec
|