tyler_efm_client 1.0.0.pre.alpha.1
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 +7 -0
- data/CHANGELOG.md +34 -0
- data/GITHUB_SETUP.md +221 -0
- data/Gemfile +11 -0
- data/LICENSE +21 -0
- data/PUBLICATION_GUIDE.md +146 -0
- data/README.md +298 -0
- data/Rakefile +14 -0
- data/build_gem.rb +73 -0
- data/config.example.json +15 -0
- data/docs/getting_started.md +293 -0
- data/examples/authentication_example.rb +64 -0
- data/examples/complete_workflow_example.rb +149 -0
- data/examples/getcaselist_example.rb +142 -0
- data/lib/tyler_efm_client/client.rb +627 -0
- data/lib/tyler_efm_client/errors.rb +19 -0
- data/lib/tyler_efm_client/result_types.rb +77 -0
- data/lib/tyler_efm_client/version.rb +6 -0
- data/lib/tyler_efm_client.rb +41 -0
- data/publish_gem.rb +155 -0
- data/samples/court_filing_workflow/README.md +332 -0
- data/test_gem.rb +170 -0
- metadata +164 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/tyler_efm_client'
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# Tyler EFM Client - Authentication Example
|
|
8
|
+
#
|
|
9
|
+
# This example demonstrates how to authenticate with Tyler EFM services
|
|
10
|
+
# using the tyler_efm_client gem.
|
|
11
|
+
def main
|
|
12
|
+
puts 'Tyler EFM Client - Authentication Example'
|
|
13
|
+
puts '=' * 50
|
|
14
|
+
|
|
15
|
+
# Initialize the client
|
|
16
|
+
client = TylerEfmClient::Client.new
|
|
17
|
+
|
|
18
|
+
# Configuration - REPLACE WITH YOUR ACTUAL VALUES
|
|
19
|
+
base_url = 'https://georgia-stage.tylertech.cloud/EFM/EFMUserService.svc'
|
|
20
|
+
pfx_file = 'path/to/your/certificate.pfx' # Path to your PFX certificate
|
|
21
|
+
pfx_password = 'your-pfx-password' # PFX certificate password
|
|
22
|
+
user_email = 'your-email@example.com' # Your EFM user email
|
|
23
|
+
user_password = 'your-password' # Your EFM user password
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
puts 'š Authenticating with Tyler EFM...'
|
|
27
|
+
|
|
28
|
+
# Authenticate
|
|
29
|
+
auth_result = client.authenticate(
|
|
30
|
+
base_url: base_url,
|
|
31
|
+
pfx_file: pfx_file,
|
|
32
|
+
pfx_password: pfx_password,
|
|
33
|
+
user_email: user_email,
|
|
34
|
+
user_password: user_password
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
if auth_result.success?
|
|
38
|
+
puts 'ā
Authentication successful!'
|
|
39
|
+
puts " Password Hash: #{auth_result.password_hash}"
|
|
40
|
+
puts " User ID: #{auth_result.user_id}"
|
|
41
|
+
puts " Name: #{auth_result.first_name} #{auth_result.last_name}"
|
|
42
|
+
puts " Email: #{auth_result.email}"
|
|
43
|
+
puts " Expires: #{auth_result.expiration_date}"
|
|
44
|
+
|
|
45
|
+
# Store the password hash for subsequent service calls
|
|
46
|
+
password_hash = auth_result.password_hash
|
|
47
|
+
puts "\nš” Save this password hash for service calls: #{password_hash}"
|
|
48
|
+
|
|
49
|
+
else
|
|
50
|
+
puts 'ā Authentication failed!'
|
|
51
|
+
puts " Error Code: #{auth_result.error_code}"
|
|
52
|
+
puts " Error Message: #{auth_result.error_message}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
rescue TylerEfmClient::AuthenticationError => e
|
|
56
|
+
puts "ā Authentication error: #{e.message}"
|
|
57
|
+
rescue TylerEfmClient::Error => e
|
|
58
|
+
puts "ā EFM client error: #{e.message}"
|
|
59
|
+
rescue StandardError => e
|
|
60
|
+
puts "ā Unexpected error: #{e.message}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
main if __FILE__ == $0
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/tyler_efm_client'
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# Tyler EFM Client - Complete Workflow Example
|
|
8
|
+
#
|
|
9
|
+
# This example demonstrates a complete workflow:
|
|
10
|
+
# 1. Authentication
|
|
11
|
+
# 2. GetCaseList operation
|
|
12
|
+
# 3. Multiple service calls with the same client
|
|
13
|
+
def main
|
|
14
|
+
puts 'Tyler EFM Client - Complete Workflow Example'
|
|
15
|
+
puts '=' * 60
|
|
16
|
+
|
|
17
|
+
# Configuration - REPLACE WITH YOUR ACTUAL VALUES
|
|
18
|
+
config = {
|
|
19
|
+
user_service_url: 'https://georgia-stage.tylertech.cloud/EFM/EFMUserService.svc',
|
|
20
|
+
court_service_url: 'https://georgia-stage.tylertech.cloud/efm/v5/CourtRecordService.svc',
|
|
21
|
+
pfx_file: 'path/to/your/certificate.pfx',
|
|
22
|
+
pfx_password: 'your-pfx-password',
|
|
23
|
+
user_email: 'your-email@example.com',
|
|
24
|
+
user_password: 'your-password'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# Initialize the client (reuse for multiple operations)
|
|
28
|
+
client = TylerEfmClient::Client.new
|
|
29
|
+
|
|
30
|
+
begin
|
|
31
|
+
# Step 1: Authentication
|
|
32
|
+
puts 'š Step 1: Authenticating with Tyler EFM...'
|
|
33
|
+
|
|
34
|
+
auth_result = client.authenticate(
|
|
35
|
+
base_url: config[:user_service_url],
|
|
36
|
+
pfx_file: config[:pfx_file],
|
|
37
|
+
pfx_password: config[:pfx_password],
|
|
38
|
+
user_email: config[:user_email],
|
|
39
|
+
user_password: config[:user_password]
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
unless auth_result.success?
|
|
43
|
+
puts "ā Authentication failed: #{auth_result.error_message}"
|
|
44
|
+
return
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
puts 'ā
Authentication successful!'
|
|
48
|
+
puts " User: #{auth_result.first_name} #{auth_result.last_name}"
|
|
49
|
+
puts " Email: #{auth_result.email}"
|
|
50
|
+
puts " Password Hash: #{auth_result.password_hash}"
|
|
51
|
+
|
|
52
|
+
# Step 2: GetCaseList Operation
|
|
53
|
+
puts "\nš Step 2: Getting case list..."
|
|
54
|
+
|
|
55
|
+
case_list_body = <<~SOAP
|
|
56
|
+
<wrappers:GetCaseListRequest xmlns:wrappers="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/wrappers">
|
|
57
|
+
<caselistrequest:GetCaseListRequestMessage
|
|
58
|
+
xmlns:caselistrequest="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/caselistrequest"
|
|
59
|
+
xmlns:j="http://release.niem.gov/niem/domains/jxdm/6.1/"
|
|
60
|
+
xmlns:nc="http://release.niem.gov/niem/niem-core/4.0/"
|
|
61
|
+
xmlns:tylercommon="urn:tyler:ecf:v5.0:extensions:common"
|
|
62
|
+
xmlns:ecf="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/ecf">
|
|
63
|
+
|
|
64
|
+
<nc:DocumentIdentification/>
|
|
65
|
+
<ecf:SendingMDELocationID>
|
|
66
|
+
<nc:IdentificationID>https://filingassemblymde.com</nc:IdentificationID>
|
|
67
|
+
</ecf:SendingMDELocationID>
|
|
68
|
+
<ecf:ServiceInteractionProfileCode>urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:WebServicesMessaging-5.0</ecf:ServiceInteractionProfileCode>
|
|
69
|
+
<j:CaseCourt>
|
|
70
|
+
<nc:OrganizationIdentification>
|
|
71
|
+
<nc:IdentificationID>fulton:mag</nc:IdentificationID>
|
|
72
|
+
</nc:OrganizationIdentification>
|
|
73
|
+
</j:CaseCourt>
|
|
74
|
+
<nc:DocumentPostDate>
|
|
75
|
+
<nc:DateTime>2025-06-27T20:00:00.000000Z</nc:DateTime>
|
|
76
|
+
</nc:DocumentPostDate>
|
|
77
|
+
<caselistrequest:CaseListQueryCriteria>
|
|
78
|
+
<tylercommon:CaseListQueryCriteriaAugmentation>
|
|
79
|
+
<j:CaseNumberText>23MPF011258</j:CaseNumberText>
|
|
80
|
+
</tylercommon:CaseListQueryCriteriaAugmentation>
|
|
81
|
+
</caselistrequest:CaseListQueryCriteria>
|
|
82
|
+
</caselistrequest:GetCaseListRequestMessage>
|
|
83
|
+
</wrappers:GetCaseListRequest>
|
|
84
|
+
SOAP
|
|
85
|
+
|
|
86
|
+
response = client.call_service(
|
|
87
|
+
base_url: config[:court_service_url],
|
|
88
|
+
password_hash: auth_result.password_hash,
|
|
89
|
+
operation: 'GetCaseList',
|
|
90
|
+
soap_body: case_list_body,
|
|
91
|
+
user_email: config[:user_email],
|
|
92
|
+
return_json: false # Get raw XML this time
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if response.success?
|
|
96
|
+
puts 'ā
GetCaseList successful!'
|
|
97
|
+
puts " Response length: #{response.raw_xml.length} characters"
|
|
98
|
+
|
|
99
|
+
# Quick case extraction from XML
|
|
100
|
+
if response.raw_xml.include?('CaseNumberText')
|
|
101
|
+
puts ' š Found case data in response'
|
|
102
|
+
else
|
|
103
|
+
puts ' ā ļø No case data found'
|
|
104
|
+
end
|
|
105
|
+
else
|
|
106
|
+
puts "ā GetCaseList failed: HTTP #{response.status_code}"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Step 3: Demonstrate multiple calls with same client
|
|
110
|
+
puts "\nš Step 3: Making another call with same client..."
|
|
111
|
+
|
|
112
|
+
# You can make multiple calls without re-authenticating
|
|
113
|
+
# The client retains the certificate and can be reused
|
|
114
|
+
|
|
115
|
+
# Example: Call a User Service operation
|
|
116
|
+
user_service_body = <<~SOAP
|
|
117
|
+
<tns:GetUser xmlns:tns="urn:tyler:efm:services">
|
|
118
|
+
<tns:GetUserRequest>
|
|
119
|
+
<UserID xmlns="urn:tyler:efm:services:schema:GetUserRequest">#{auth_result.user_id}</UserID>
|
|
120
|
+
</tns:GetUserRequest>
|
|
121
|
+
</tns:GetUser>
|
|
122
|
+
SOAP
|
|
123
|
+
|
|
124
|
+
user_response = client.call_service(
|
|
125
|
+
base_url: config[:user_service_url],
|
|
126
|
+
password_hash: auth_result.password_hash,
|
|
127
|
+
operation: 'GetUser',
|
|
128
|
+
soap_body: user_service_body
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if user_response.success?
|
|
132
|
+
puts 'ā
GetUser call successful!'
|
|
133
|
+
else
|
|
134
|
+
puts "ā¹ļø GetUser call: HTTP #{user_response.status_code} (expected - may need different parameters)"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
puts "\nš Workflow completed successfully!"
|
|
138
|
+
puts ' Total operations: Authentication + 2 service calls'
|
|
139
|
+
puts ' Client reused: ā
'
|
|
140
|
+
puts ' Certificate handling: Automatic'
|
|
141
|
+
|
|
142
|
+
rescue TylerEfmClient::Error => e
|
|
143
|
+
puts "ā EFM client error: #{e.message}"
|
|
144
|
+
rescue StandardError => e
|
|
145
|
+
puts "ā Unexpected error: #{e.message}"
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
main if __FILE__ == $0
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/tyler_efm_client'
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# Tyler EFM Client - GetCaseList Example
|
|
8
|
+
#
|
|
9
|
+
# This example demonstrates how to call the GetCaseList operation
|
|
10
|
+
# using the tyler_efm_client gem.
|
|
11
|
+
def main
|
|
12
|
+
puts 'Tyler EFM Client - GetCaseList Example'
|
|
13
|
+
puts '=' * 50
|
|
14
|
+
|
|
15
|
+
# Initialize the client
|
|
16
|
+
client = TylerEfmClient::Client.new
|
|
17
|
+
|
|
18
|
+
# Configuration - REPLACE WITH YOUR ACTUAL VALUES
|
|
19
|
+
user_service_url = 'https://georgia-stage.tylertech.cloud/EFM/EFMUserService.svc'
|
|
20
|
+
court_service_url = 'https://georgia-stage.tylertech.cloud/efm/v5/CourtRecordService.svc'
|
|
21
|
+
pfx_file = 'path/to/your/certificate.pfx'
|
|
22
|
+
pfx_password = 'your-pfx-password'
|
|
23
|
+
user_email = 'your-email@example.com'
|
|
24
|
+
user_password = 'your-password'
|
|
25
|
+
case_number = '23MPF011258' # Example case number
|
|
26
|
+
|
|
27
|
+
begin
|
|
28
|
+
puts 'š Step 1: Authenticating...'
|
|
29
|
+
|
|
30
|
+
# First, authenticate to get password hash
|
|
31
|
+
auth_result = client.authenticate(
|
|
32
|
+
base_url: user_service_url,
|
|
33
|
+
pfx_file: pfx_file,
|
|
34
|
+
pfx_password: pfx_password,
|
|
35
|
+
user_email: user_email,
|
|
36
|
+
user_password: user_password
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
unless auth_result.success?
|
|
40
|
+
puts "ā Authentication failed: #{auth_result.error_message}"
|
|
41
|
+
return
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
puts "ā
Authentication successful! Password hash: #{auth_result.password_hash}"
|
|
45
|
+
|
|
46
|
+
puts "\nš Step 2: Building GetCaseList request..."
|
|
47
|
+
|
|
48
|
+
# Build GetCaseList SOAP body
|
|
49
|
+
soap_body = <<~SOAP
|
|
50
|
+
<wrappers:GetCaseListRequest xmlns:wrappers="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/wrappers">
|
|
51
|
+
<caselistrequest:GetCaseListRequestMessage
|
|
52
|
+
xmlns:caselistrequest="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/caselistrequest"
|
|
53
|
+
xmlns:j="http://release.niem.gov/niem/domains/jxdm/6.1/"
|
|
54
|
+
xmlns:nc="http://release.niem.gov/niem/niem-core/4.0/"
|
|
55
|
+
xmlns:tylercommon="urn:tyler:ecf:v5.0:extensions:common"
|
|
56
|
+
xmlns:ecf="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/ecf">
|
|
57
|
+
|
|
58
|
+
<nc:DocumentIdentification/>
|
|
59
|
+
|
|
60
|
+
<ecf:SendingMDELocationID>
|
|
61
|
+
<nc:IdentificationID>https://filingassemblymde.com</nc:IdentificationID>
|
|
62
|
+
</ecf:SendingMDELocationID>
|
|
63
|
+
|
|
64
|
+
<ecf:ServiceInteractionProfileCode>urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:WebServicesMessaging-5.0</ecf:ServiceInteractionProfileCode>
|
|
65
|
+
|
|
66
|
+
<j:CaseCourt>
|
|
67
|
+
<nc:OrganizationIdentification>
|
|
68
|
+
<nc:IdentificationID>fulton:mag</nc:IdentificationID>
|
|
69
|
+
</nc:OrganizationIdentification>
|
|
70
|
+
</j:CaseCourt>
|
|
71
|
+
|
|
72
|
+
<nc:DocumentPostDate>
|
|
73
|
+
<nc:DateTime>2025-06-27T20:00:00.000000Z</nc:DateTime>
|
|
74
|
+
</nc:DocumentPostDate>
|
|
75
|
+
|
|
76
|
+
<caselistrequest:CaseListQueryCriteria>
|
|
77
|
+
<tylercommon:CaseListQueryCriteriaAugmentation>
|
|
78
|
+
<j:CaseNumberText>#{case_number}</j:CaseNumberText>
|
|
79
|
+
</tylercommon:CaseListQueryCriteriaAugmentation>
|
|
80
|
+
</caselistrequest:CaseListQueryCriteria>
|
|
81
|
+
|
|
82
|
+
</caselistrequest:GetCaseListRequestMessage>
|
|
83
|
+
</wrappers:GetCaseListRequest>
|
|
84
|
+
SOAP
|
|
85
|
+
|
|
86
|
+
puts 'š¤ Step 3: Calling GetCaseList service...'
|
|
87
|
+
|
|
88
|
+
# Call GetCaseList service
|
|
89
|
+
response = client.call_service(
|
|
90
|
+
base_url: court_service_url,
|
|
91
|
+
password_hash: auth_result.password_hash,
|
|
92
|
+
operation: 'GetCaseList',
|
|
93
|
+
soap_body: soap_body,
|
|
94
|
+
user_email: user_email,
|
|
95
|
+
return_json: true # Get JSON response for easier parsing
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if response.success?
|
|
99
|
+
puts 'ā
GetCaseList call successful!'
|
|
100
|
+
|
|
101
|
+
if response.json_data
|
|
102
|
+
puts "\nšÆ JSON Response Summary:"
|
|
103
|
+
# Navigate the JSON structure to find cases
|
|
104
|
+
begin
|
|
105
|
+
envelope = response.json_data
|
|
106
|
+
body = envelope['Body'] || {}
|
|
107
|
+
case_list_response = body['GetCaseListResponse'] || {}
|
|
108
|
+
message = case_list_response['GetCaseListResponseMessage'] || {}
|
|
109
|
+
cases = message['Case'] || []
|
|
110
|
+
|
|
111
|
+
cases = [cases] unless cases.is_a?(Array) # Single case
|
|
112
|
+
|
|
113
|
+
puts " Found #{cases.length} case(s):"
|
|
114
|
+
cases.each_with_index do |case_data, index|
|
|
115
|
+
case_number = case_data.dig('CaseAugmentation', 'CaseNumberText') || 'N/A'
|
|
116
|
+
case_title = case_data['CaseTitleText'] || 'N/A'
|
|
117
|
+
puts " #{index + 1}. Case: #{case_number}"
|
|
118
|
+
puts " Title: #{case_title}"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
rescue StandardError => parse_error
|
|
122
|
+
puts " JSON parsing note: #{parse_error.message}"
|
|
123
|
+
puts ' (Raw response available in response.raw_xml)'
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
puts "\nš Raw XML Response Length: #{response.raw_xml.length} characters"
|
|
128
|
+
|
|
129
|
+
else
|
|
130
|
+
puts "ā GetCaseList call failed: HTTP #{response.status_code}"
|
|
131
|
+
puts " Error: #{response.error_message}" if response.error_message
|
|
132
|
+
puts " Response preview: #{response.raw_xml[0..499]}#{'...' if response.raw_xml.length > 500}"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
rescue TylerEfmClient::Error => e
|
|
136
|
+
puts "ā EFM client error: #{e.message}"
|
|
137
|
+
rescue StandardError => e
|
|
138
|
+
puts "ā Unexpected error: #{e.message}"
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
main if __FILE__ == $0
|