rhoconnect-adapters 1.0.0.beta1
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/.gitignore +4 -0
- data/CHANGELOG +4 -0
- data/Gemfile +18 -0
- data/README.md +239 -0
- data/Rakefile +31 -0
- data/bin/rhoconnect-adapters +35 -0
- data/generators/crm/templates/application/application.rb +34 -0
- data/generators/crm/templates/source/source_adapter.rb +10 -0
- data/generators/crm/templates/source/source_spec.rb +25 -0
- data/generators/crm/templates/spec/spec_helper.rb +64 -0
- data/generators/crm/vendor/ms_dynamics/adapter.rb +301 -0
- data/generators/crm/vendor/ms_dynamics/application.rb +56 -0
- data/generators/crm/vendor/ms_dynamics/lib/crm_metadata_service.rb +43 -0
- data/generators/crm/vendor/ms_dynamics/lib/crm_service.rb +141 -0
- data/generators/crm/vendor/ms_dynamics/lib/discovery_service.rb +51 -0
- data/generators/crm/vendor/ms_dynamics/lib/wlid_service.rb +159 -0
- data/generators/crm/vendor/ms_dynamics/ms_dynamics.rb +45 -0
- data/generators/crm/vendor/ms_dynamics/settings/Account.yml +46 -0
- data/generators/crm/vendor/ms_dynamics/settings/Contact.yml +40 -0
- data/generators/crm/vendor/ms_dynamics/settings/GenericObject.yml +18 -0
- data/generators/crm/vendor/ms_dynamics/settings/Lead.yml +53 -0
- data/generators/crm/vendor/ms_dynamics/settings/Opportunity.yml +41 -0
- data/generators/crm/vendor/ms_dynamics/settings/settings.yml +9 -0
- data/generators/crm/vendor/ms_dynamics/spec/application_spec.rb +23 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/account_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/contact_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/lead_spec.rb +49 -0
- data/generators/crm/vendor/ms_dynamics/spec/sources/opportunity_spec.rb +62 -0
- data/generators/crm/vendor/ms_dynamics/spec/spec_helper.rb +78 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Account.yml +6 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Contact.yml +7 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Lead.yml +12 -0
- data/generators/crm/vendor/ms_dynamics/spec_data/Opportunity.yml +6 -0
- data/generators/crm/vendor/ms_dynamics/templates.rb +57 -0
- data/generators/crm/vendor/oracle_on_demand/adapter.rb +421 -0
- data/generators/crm/vendor/oracle_on_demand/application.rb +64 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Account.yml +91 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Contact.yml +54 -0
- data/generators/crm/vendor/oracle_on_demand/settings/GenericObject.yml +21 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Lead.yml +72 -0
- data/generators/crm/vendor/oracle_on_demand/settings/Opportunity.yml +69 -0
- data/generators/crm/vendor/oracle_on_demand/settings/settings.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec/application_spec.rb +14 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/account_spec.rb +50 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/contact_spec.rb +50 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/lead_spec.rb +51 -0
- data/generators/crm/vendor/oracle_on_demand/spec/sources/opportunity_spec.rb +51 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Account.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/GenericObject.yml +4 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Lead.yml +14 -0
- data/generators/crm/vendor/oracle_on_demand/spec_data/Opportunity.yml +6 -0
- data/generators/crm/vendor/oracle_on_demand/templates.rb +52 -0
- data/generators/crm/vendor/salesforce/adapter.rb +315 -0
- data/generators/crm/vendor/salesforce/application.rb +80 -0
- data/generators/crm/vendor/salesforce/settings/Account.yml +53 -0
- data/generators/crm/vendor/salesforce/settings/Contact.yml +61 -0
- data/generators/crm/vendor/salesforce/settings/GenericObject.yml +13 -0
- data/generators/crm/vendor/salesforce/settings/Lead.yml +73 -0
- data/generators/crm/vendor/salesforce/settings/Opportunity.yml +48 -0
- data/generators/crm/vendor/salesforce/settings/settings.yml +6 -0
- data/generators/crm/vendor/salesforce/spec/application_spec.rb +14 -0
- data/generators/crm/vendor/salesforce/spec/sources/account_spec.rb +50 -0
- data/generators/crm/vendor/salesforce/spec/sources/contact_spec.rb +50 -0
- data/generators/crm/vendor/salesforce/spec/sources/lead_spec.rb +51 -0
- data/generators/crm/vendor/salesforce/spec/sources/opportunity_spec.rb +51 -0
- data/generators/crm/vendor/salesforce/spec_data/Account.yml +14 -0
- data/generators/crm/vendor/salesforce/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/salesforce/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/salesforce/spec_data/Lead.yml +10 -0
- data/generators/crm/vendor/salesforce/spec_data/Opportunity.yml +10 -0
- data/generators/crm/vendor/salesforce/templates.rb +45 -0
- data/generators/crm/vendor/sugar/adapter.rb +291 -0
- data/generators/crm/vendor/sugar/application.rb +50 -0
- data/generators/crm/vendor/sugar/settings/Account.yml +49 -0
- data/generators/crm/vendor/sugar/settings/Contact.yml +62 -0
- data/generators/crm/vendor/sugar/settings/GenericObject.yml +12 -0
- data/generators/crm/vendor/sugar/settings/Lead.yml +76 -0
- data/generators/crm/vendor/sugar/settings/Opportunity.yml +49 -0
- data/generators/crm/vendor/sugar/settings/settings.yml +9 -0
- data/generators/crm/vendor/sugar/spec/application_spec.rb +25 -0
- data/generators/crm/vendor/sugar/spec/sources/account_spec.rb +53 -0
- data/generators/crm/vendor/sugar/spec/sources/contact_spec.rb +53 -0
- data/generators/crm/vendor/sugar/spec/sources/lead_spec.rb +54 -0
- data/generators/crm/vendor/sugar/spec/sources/opportunity_spec.rb +54 -0
- data/generators/crm/vendor/sugar/spec_data/Account.yml +13 -0
- data/generators/crm/vendor/sugar/spec_data/Contact.yml +8 -0
- data/generators/crm/vendor/sugar/spec_data/GenericObject.yml +3 -0
- data/generators/crm/vendor/sugar/spec_data/Lead.yml +16 -0
- data/generators/crm/vendor/sugar/spec_data/Opportunity.yml +10 -0
- data/generators/crm/vendor/sugar/sugar.rb +33 -0
- data/generators/crm/vendor/sugar/templates.rb +58 -0
- data/generators/rhoconnect-adapters.rb +217 -0
- data/lib/rhoconnect-adapters/crm/crm.rb +31 -0
- data/lib/rhoconnect-adapters/soap_service.rb +70 -0
- data/lib/rhoconnect-adapters/version.rb +3 -0
- data/lib/rhoconnect-adapters.rb +2 -0
- data/rhoconnect-adapters.gemspec +36 -0
- data/spec/apps/ms_dynamics_spec.rb +19 -0
- data/spec/apps/oracle_on_demand_spec.rb +20 -0
- data/spec/apps/salesforce_spec.rb +18 -0
- data/spec/apps/sugar_spec.rb +18 -0
- data/spec/generator/generator_spec.rb +113 -0
- data/spec/spec_helper.rb +57 -0
- metadata +288 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Account" do
|
|
4
|
+
it_should_behave_like "SpecHelper" do
|
|
5
|
+
before(:each) do
|
|
6
|
+
sample_data_file = File.join(File.dirname(__FILE__),'..','..','vendor','salesforce','spec_data','Account.yml')
|
|
7
|
+
@sample_data = YAML.load_file(sample_data_file)['Account'] if sample_data_file and File.exist?(sample_data_file)
|
|
8
|
+
setup_test_for Account,@test_user
|
|
9
|
+
Application.authenticate(@test_user, @test_password,"")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
before(:each) do
|
|
13
|
+
@ss.adapter.login
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
after(:each) do
|
|
17
|
+
@ss.adapter.logoff
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should process Account query" do
|
|
21
|
+
result = test_query
|
|
22
|
+
puts result.length.inspect
|
|
23
|
+
query_errors.should == {}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should process Account create" do
|
|
27
|
+
create_hash = @sample_data
|
|
28
|
+
result = test_create(create_hash)
|
|
29
|
+
puts result.inspect
|
|
30
|
+
create_hash['Id'] = result
|
|
31
|
+
TestHelpers.created_records = { result => create_hash }
|
|
32
|
+
create_errors.should == {}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should process Account update" do
|
|
36
|
+
TestHelpers.created_records.each do |key,value|
|
|
37
|
+
value["Name"] = "Updated Name #{key.to_s}"
|
|
38
|
+
end
|
|
39
|
+
result = test_update(TestHelpers.created_records)
|
|
40
|
+
puts result.inspect
|
|
41
|
+
update_errors.should == {}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should process Account delete" do
|
|
45
|
+
result = test_delete(TestHelpers.created_records)
|
|
46
|
+
puts result.inspect
|
|
47
|
+
delete_errors.should == {}
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Contact" do
|
|
4
|
+
it_should_behave_like "SpecHelper" do
|
|
5
|
+
before(:each) do
|
|
6
|
+
sample_data_file = File.join(File.dirname(__FILE__),'..','..','vendor','salesforce','spec_data','Contact.yml')
|
|
7
|
+
@sample_data = YAML.load_file(sample_data_file)['Contact'] if sample_data_file and File.exist?(sample_data_file)
|
|
8
|
+
setup_test_for Contact,@test_user
|
|
9
|
+
Application.authenticate(@test_user, @test_password,"")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
before(:each) do
|
|
13
|
+
@ss.adapter.login
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
after(:each) do
|
|
17
|
+
@ss.adapter.logoff
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should process Contact query" do
|
|
21
|
+
result = test_query
|
|
22
|
+
puts result.length.inspect
|
|
23
|
+
query_errors.should == {}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should process Contact create" do
|
|
27
|
+
create_hash = @sample_data
|
|
28
|
+
result = test_create(create_hash)
|
|
29
|
+
puts result.inspect
|
|
30
|
+
create_hash['Id'] = result
|
|
31
|
+
TestHelpers.created_records = { result => create_hash }
|
|
32
|
+
create_errors.should == {}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should process Contact update" do
|
|
36
|
+
TestHelpers.created_records.each do |key,value|
|
|
37
|
+
value["FirstName"] = "Changed Name #{key.to_s}"
|
|
38
|
+
end
|
|
39
|
+
result = test_update(TestHelpers.created_records)
|
|
40
|
+
puts result.inspect
|
|
41
|
+
update_errors.should == {}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should process Contact delete" do
|
|
45
|
+
result = test_delete(TestHelpers.created_records)
|
|
46
|
+
puts result.inspect
|
|
47
|
+
delete_errors.should == {}
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Lead" do
|
|
4
|
+
it_should_behave_like "SpecHelper" do
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
sample_data_file = File.join(File.dirname(__FILE__),'..','..','vendor','salesforce','spec_data','Lead.yml')
|
|
8
|
+
@sample_data = YAML.load_file(sample_data_file)['Lead'] if sample_data_file and File.exist?(sample_data_file)
|
|
9
|
+
setup_test_for Lead,@test_user
|
|
10
|
+
Application.authenticate(@test_user, @test_password,"")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before(:each) do
|
|
14
|
+
@ss.adapter.login
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after(:each) do
|
|
18
|
+
@ss.adapter.logoff
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should process Lead query" do
|
|
22
|
+
result = test_query
|
|
23
|
+
puts result.length.inspect
|
|
24
|
+
query_errors.should == {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should process Lead create" do
|
|
28
|
+
create_hash = @sample_data
|
|
29
|
+
result = test_create(create_hash)
|
|
30
|
+
puts result.inspect
|
|
31
|
+
create_hash['Id'] = result
|
|
32
|
+
TestHelpers.created_records = { result => create_hash }
|
|
33
|
+
create_errors.should == {}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should process Lead update" do
|
|
37
|
+
TestHelpers.created_records.each do |key,value|
|
|
38
|
+
value["FirstName"] = "Changed Lead #{key.to_s}"
|
|
39
|
+
end
|
|
40
|
+
result = test_update(TestHelpers.created_records)
|
|
41
|
+
puts result.inspect
|
|
42
|
+
update_errors.should == {}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should process Lead delete" do
|
|
46
|
+
result = test_delete(TestHelpers.created_records)
|
|
47
|
+
puts result.inspect
|
|
48
|
+
delete_errors.should == {}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
2
|
+
|
|
3
|
+
describe "Opportunity" do
|
|
4
|
+
it_should_behave_like "SpecHelper" do
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
sample_data_file = File.join(File.dirname(__FILE__),'..','..','vendor','salesforce','spec_data','Opportunity.yml')
|
|
8
|
+
@sample_data = YAML.load_file(sample_data_file)['Opportunity'] if sample_data_file and File.exist?(sample_data_file)
|
|
9
|
+
setup_test_for Opportunity,@test_user
|
|
10
|
+
Application.authenticate(@test_user, @test_password,"")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before(:each) do
|
|
14
|
+
@ss.adapter.login
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after(:each) do
|
|
18
|
+
@ss.adapter.logoff
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should process Opportunity query" do
|
|
22
|
+
result = test_query
|
|
23
|
+
puts result.length.inspect
|
|
24
|
+
query_errors.should == {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should process Opportunity create" do
|
|
28
|
+
create_hash = @sample_data
|
|
29
|
+
result = test_create(create_hash)
|
|
30
|
+
puts result.inspect
|
|
31
|
+
create_hash["Id"] = result
|
|
32
|
+
TestHelpers.created_records = { result => create_hash }
|
|
33
|
+
create_errors.should == {}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should process Opportunity update" do
|
|
37
|
+
TestHelpers.created_records.each do |key,value|
|
|
38
|
+
value["OpportunityName"] = "Changed Opportunity #{key.to_s}"
|
|
39
|
+
end
|
|
40
|
+
result = test_update(TestHelpers.created_records)
|
|
41
|
+
puts result.inspect
|
|
42
|
+
update_errors.should == {}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should process Opportunity delete" do
|
|
46
|
+
result = test_delete(TestHelpers.created_records)
|
|
47
|
+
puts result.inspect
|
|
48
|
+
delete_errors.should == {}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Account:
|
|
2
|
+
Name: ACME Co.
|
|
3
|
+
Type: Customer - Channel
|
|
4
|
+
Industry: Chemicals
|
|
5
|
+
Ownership: Public
|
|
6
|
+
AnnualRevenue: 500000
|
|
7
|
+
NumberOfEmployees: 450
|
|
8
|
+
Phone: 650-111-1111
|
|
9
|
+
Website: www.acme.com
|
|
10
|
+
BillingStreet: 2020 San Fernardo Blvd.
|
|
11
|
+
BillingCity: Chicago
|
|
12
|
+
BillingState: IL
|
|
13
|
+
BillingPostalCode: 22222
|
|
14
|
+
BillingCountry: USA
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# these are Sugar-specific Templater::Generator templates
|
|
2
|
+
module RhoconnectAdapters
|
|
3
|
+
module CRM
|
|
4
|
+
module Salesforce
|
|
5
|
+
class << self
|
|
6
|
+
def configure_gemfile
|
|
7
|
+
{}
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
RhoconnectAdapters::CRMAppGenerator.add_vendor_templates :file, :settings_yml do |file,name,crm|
|
|
15
|
+
file.source = File.join('..','..','vendor','salesforce','settings','settings.yml')
|
|
16
|
+
file.destination = File.join("#{name}", 'vendor','salesforce','settings','settings.yml')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
RhoconnectAdapters::CRMAppGenerator.add_vendor_templates :file, :application_spec do |file,name,crm|
|
|
20
|
+
file.source = File.join('..','..','vendor','salesforce','spec','application_spec.rb')
|
|
21
|
+
file.destination = File.join("#{name}", 'spec','application_spec.rb')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
RhoconnectAdapters::CRMSourceGenerator.add_vendor_templates :file, :object_yml do |file,name,crm|
|
|
25
|
+
source_name = name.gsub('-', '_').camel_case
|
|
26
|
+
source_filename = File.join('..','..','vendor','salesforce','settings',"#{source_name}.yml")
|
|
27
|
+
if File.exists? File.join(CRMSourceGenerator.source_root, source_filename)
|
|
28
|
+
file.source = source_filename
|
|
29
|
+
else
|
|
30
|
+
file.source = File.join('..','..','vendor','salesforce','settings',"GenericObject.yml")
|
|
31
|
+
end
|
|
32
|
+
file.destination = File.join('vendor','salesforce','settings', "#{source_name}.yml")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
RhoconnectAdapters::CRMSourceGenerator.add_vendor_templates :template, :spec_data do |template,name,crm|
|
|
36
|
+
source_name = name.gsub('-', '_').camel_case
|
|
37
|
+
source_filename = File.join('..','..','vendor','salesforce','spec_data',"#{source_name}.yml")
|
|
38
|
+
if File.exists? File.join(CRMSourceGenerator.source_root, source_filename)
|
|
39
|
+
template.source = source_filename
|
|
40
|
+
else
|
|
41
|
+
template.source = File.join('..','..','vendor','salesforce','spec_data',"GenericObject.yml")
|
|
42
|
+
end
|
|
43
|
+
template.destination = File.join('vendor','salesforce','spec_data', "#{source_name}.yml")
|
|
44
|
+
end
|
|
45
|
+
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
require 'rhoconnect-adapters'
|
|
2
|
+
require 'vendor/sugar/sugar'
|
|
3
|
+
|
|
4
|
+
module RhoconnectAdapters
|
|
5
|
+
module CRM
|
|
6
|
+
module Sugar
|
|
7
|
+
class Adapter < SourceAdapter
|
|
8
|
+
attr_accessor :crm_object
|
|
9
|
+
attr_accessor :fields
|
|
10
|
+
|
|
11
|
+
def initialize(source)
|
|
12
|
+
super(source)
|
|
13
|
+
@fields = {}
|
|
14
|
+
@crm_object = self.class.name
|
|
15
|
+
@default_user_team_name = nil
|
|
16
|
+
@title_fields = ['id']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def configure_fields
|
|
20
|
+
# initialize fields map
|
|
21
|
+
@fields = get_object_settings['Query_Fields']
|
|
22
|
+
|
|
23
|
+
@field_picklists = {}
|
|
24
|
+
static_picklists = get_object_settings['StaticPicklist']
|
|
25
|
+
if static_picklists != nil
|
|
26
|
+
static_picklists.each do |element_name, values|
|
|
27
|
+
@field_picklists[element_name] = values
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
@object_fields = get_object_settings['ObjectFields']
|
|
32
|
+
@object_fields = {} if @object_fields == nil
|
|
33
|
+
|
|
34
|
+
# title fields are used in metadata to show
|
|
35
|
+
# records in the list
|
|
36
|
+
@title_fields = get_object_settings['TitleFields']
|
|
37
|
+
|
|
38
|
+
@fields
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def get_object_settings
|
|
42
|
+
return @object_settings if @object_settings
|
|
43
|
+
begin
|
|
44
|
+
@object_settings = RhoconnectAdapters::CRM::Field.load_file(File.join(ROOT_PATH,'vendor','sugar','settings',"#{crm_object}.yml"))
|
|
45
|
+
rescue Exception => e
|
|
46
|
+
puts "Error opening CRMObjects settings file: #{e}"
|
|
47
|
+
puts e.backtrace.join("\n")
|
|
48
|
+
raise e
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def get_picklists
|
|
53
|
+
begin
|
|
54
|
+
fields.each do |element_name, element_def|
|
|
55
|
+
data_type = element_def['Type']
|
|
56
|
+
# for picklists - get values
|
|
57
|
+
# but only for those that are not
|
|
58
|
+
# already defined
|
|
59
|
+
if data_type == 'Picklist' and not @field_picklists.has_key?(element_name)
|
|
60
|
+
@field_picklists[element_name] = get_picklist(element_name)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
rescue RestClient::Exception => e
|
|
64
|
+
raise e
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def get_picklist(element_name)
|
|
69
|
+
# check if we already have it in Store
|
|
70
|
+
picklist = Store.get_data("#{crm_object}:#{element_name}_picklist",Array)
|
|
71
|
+
return picklist if picklist.size != 0
|
|
72
|
+
|
|
73
|
+
field_options = get_module._module.fields[element_name]['options']
|
|
74
|
+
Store.put_data("#{crm_object}:#{element_name}_picklist", field_options.keys)
|
|
75
|
+
field_options.keys
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def get_user_team_name
|
|
79
|
+
# retrieve default user team id (it is needed in create method)
|
|
80
|
+
return @default_user_team_name unless @default_user_team_name == nil
|
|
81
|
+
|
|
82
|
+
@default_user_team_name = Store.get_value("#{current_user.login}:default_user_team_name")
|
|
83
|
+
if @default_user_team_name == nil
|
|
84
|
+
team_id = @namespace.session.connection.get_user_team_id
|
|
85
|
+
team_id.gsub!(/^"(.*?)"$/,'\1')
|
|
86
|
+
team_mod = @namespace.const_get('Team')
|
|
87
|
+
@default_user_team_name = team_mod.find_by_id(team_id).name
|
|
88
|
+
Store.set_value("#{current_user.login}:default_user_team_name", @default_user_team_name)
|
|
89
|
+
end
|
|
90
|
+
@default_user_team_name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def login
|
|
94
|
+
@uri = Store.get_value("#{current_user.login}:service_url")
|
|
95
|
+
session_object_id = Store.get_value("#{current_user.login}:session_object_id")
|
|
96
|
+
session_cur = SugarCRM.sessions[session_object_id.to_i]
|
|
97
|
+
@namespace = SugarCRM.sessions[session_object_id.to_i].namespace_const
|
|
98
|
+
|
|
99
|
+
# obtain default user's Team Name (used in create operations)
|
|
100
|
+
get_user_team_name
|
|
101
|
+
|
|
102
|
+
# get options for object's attributes
|
|
103
|
+
get_picklists
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def query(params=nil)
|
|
107
|
+
@result = {}
|
|
108
|
+
conditions = {:conditions=>{}}
|
|
109
|
+
conditions[:conditions][:assigned_user_id] = @namespace.current_user.id
|
|
110
|
+
results = get_results(conditions)
|
|
111
|
+
|
|
112
|
+
@result = create_result_hash(results)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def metadata
|
|
116
|
+
# define the metadata
|
|
117
|
+
show_fields = []
|
|
118
|
+
new_fields = []
|
|
119
|
+
edit_fields = []
|
|
120
|
+
model_name = "" + crm_object
|
|
121
|
+
model_name[0] = model_name[0,1].downcase
|
|
122
|
+
record_sym = '@' + "#{model_name}"
|
|
123
|
+
|
|
124
|
+
fields.each do |element_name,element_def|
|
|
125
|
+
next if element_name == 'id'
|
|
126
|
+
|
|
127
|
+
# 1) - read-only show fields
|
|
128
|
+
field_type = 'labeledvalueli'
|
|
129
|
+
field = {
|
|
130
|
+
:name => "#{model_name}\[#{element_name}\]",
|
|
131
|
+
:label => element_def['Label'],
|
|
132
|
+
:type => field_type,
|
|
133
|
+
:value => "{{#{record_sym}/#{element_name}}}"
|
|
134
|
+
}
|
|
135
|
+
show_fields << field
|
|
136
|
+
|
|
137
|
+
new_field = field.clone
|
|
138
|
+
new_field[:type] = 'labeledinputli'
|
|
139
|
+
new_field.delete(:value)
|
|
140
|
+
case element_def['Type']
|
|
141
|
+
when 'Picklist'
|
|
142
|
+
new_field[:type] = 'select'
|
|
143
|
+
values = []
|
|
144
|
+
values.concat @field_picklists[element_name]
|
|
145
|
+
new_field[:values] = values
|
|
146
|
+
new_field[:value] = values[0]
|
|
147
|
+
when 'object'
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
new_fields << new_field
|
|
151
|
+
|
|
152
|
+
edit_field = new_field.clone
|
|
153
|
+
edit_field[:value] = "{{#{record_sym}/#{element_name}}}"
|
|
154
|
+
edit_fields << edit_field
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Show
|
|
158
|
+
show_list = { :name => 'list', :type => 'list', :children => show_fields }
|
|
159
|
+
show_form = {
|
|
160
|
+
:name => "#{crm_object}_show",
|
|
161
|
+
:type => 'show_form',
|
|
162
|
+
:title => "#{crm_object} details",
|
|
163
|
+
:object => "#{crm_object}",
|
|
164
|
+
:model => "#{model_name}",
|
|
165
|
+
:id => "{{#{record_sym}/object}}}",
|
|
166
|
+
:children => [show_list]
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
# New
|
|
170
|
+
new_list = show_list.clone
|
|
171
|
+
new_list[:children] = new_fields
|
|
172
|
+
new_form = {
|
|
173
|
+
:type => 'new_form',
|
|
174
|
+
:title => "New #{crm_object}",
|
|
175
|
+
:object => "#{crm_object}",
|
|
176
|
+
:model => "#{model_name}",
|
|
177
|
+
:children => [new_list]
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
# Edit
|
|
181
|
+
edit_list = show_list.clone
|
|
182
|
+
edit_list[:children] = edit_fields
|
|
183
|
+
edit_form = {
|
|
184
|
+
:type => 'update_form',
|
|
185
|
+
:title => "Edit #{crm_object}",
|
|
186
|
+
:object => "#{crm_object}",
|
|
187
|
+
:model => "#{model_name}",
|
|
188
|
+
:id => "{{#{record_sym}/object}}",
|
|
189
|
+
:children => [edit_list]
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
# Index
|
|
193
|
+
title_field_metadata = @title_fields.collect { |field_name | "{{#{field_name.to_s}}} " }.join(' ')
|
|
194
|
+
object_rec = {
|
|
195
|
+
:object => "#{crm_object}",
|
|
196
|
+
:id => "{{object}}",
|
|
197
|
+
:type => 'linkobj',
|
|
198
|
+
:text => "#{title_field_metadata}"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
index_form = {
|
|
202
|
+
:object => "#{crm_object}",
|
|
203
|
+
:title => "#{crm_object.pluralize}",
|
|
204
|
+
:type => 'index_form',
|
|
205
|
+
:children => [object_rec],
|
|
206
|
+
:repeatable => "{{#{record_sym.pluralize}}}"
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# return JSON
|
|
210
|
+
{ 'index' => index_form, 'show' => show_form, 'new' => new_form, 'edit' => edit_form }.to_json
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def sync
|
|
214
|
+
# Manipulate @result before it is saved, or save it
|
|
215
|
+
# yourself using the Rhoconnect::Store interface.
|
|
216
|
+
# By default, super is called below which simply saves @result
|
|
217
|
+
super
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def create(create_hash,blob=nil)
|
|
221
|
+
new_obj = get_module.new
|
|
222
|
+
attributes = new_obj.attributes
|
|
223
|
+
copy_keys_to_obj(create_hash, new_obj)
|
|
224
|
+
new_obj.send 'assigned_user_id=', @namespace.current_user.id
|
|
225
|
+
new_obj.send 'team_name=', get_user_team_name
|
|
226
|
+
new_obj.send 'team_count=', '1'
|
|
227
|
+
new_obj.save!
|
|
228
|
+
new_obj.id
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def update(update_hash)
|
|
232
|
+
# step 1: get the id from the update hash
|
|
233
|
+
result = get_module.find_by_id(update_hash['id'])
|
|
234
|
+
copy_keys_to_obj(update_hash, result)
|
|
235
|
+
result.save!
|
|
236
|
+
update_hash['id']
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def delete(delete_hash)
|
|
240
|
+
result = get_module.find_by_id(delete_hash['id'])
|
|
241
|
+
result.delete
|
|
242
|
+
delete_hash['id']
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def logoff
|
|
246
|
+
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def get_module
|
|
250
|
+
@namespace.const_get(crm_object)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def get_results(conditions)
|
|
254
|
+
get_module.all(conditions)
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def copy_keys_to_obj(source_hash, target)
|
|
258
|
+
keys = source_hash.keys
|
|
259
|
+
keys.each do |key|
|
|
260
|
+
target.send key + '=', source_hash[key]
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def create_result_hash(results)
|
|
265
|
+
ret_hash = {}
|
|
266
|
+
|
|
267
|
+
if results.is_a?(Array)
|
|
268
|
+
results_array = results
|
|
269
|
+
else
|
|
270
|
+
results_array = [results]
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
results_array.each do |result|
|
|
274
|
+
attributes = result.attributes
|
|
275
|
+
result_hash = {}
|
|
276
|
+
|
|
277
|
+
fields.each do |element_name, element_def|
|
|
278
|
+
value = attributes[element_name]
|
|
279
|
+
if (value != nil && value.is_a?(Array) == false)
|
|
280
|
+
result_hash[element_name] = value
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
id = result.id
|
|
284
|
+
ret_hash[id.to_s] = result_hash
|
|
285
|
+
end
|
|
286
|
+
ret_hash
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'rhoconnect-adapters'
|
|
2
|
+
require 'vendor/sugar/sugar'
|
|
3
|
+
|
|
4
|
+
module RhoconnectAdapters
|
|
5
|
+
module CRM
|
|
6
|
+
module Sugar
|
|
7
|
+
class Application < Rhoconnect::Base
|
|
8
|
+
class << self
|
|
9
|
+
def authenticate(username,password,session)
|
|
10
|
+
sugarcrm_uri = Application.get_settings[:sugarcrm_uri]
|
|
11
|
+
debug_enabled = Application.get_settings[:debug_enabled]
|
|
12
|
+
begin
|
|
13
|
+
current_session = nil
|
|
14
|
+
current_session_obj_id = Store.get_value("#{username}:session_object_id")
|
|
15
|
+
if(current_session_obj_id == nil)
|
|
16
|
+
current_session = SugarCRM.connect(sugarcrm_uri, username, password, {:debug => debug_enabled}).session
|
|
17
|
+
else
|
|
18
|
+
current_session = SugarCRM.sessions[current_session_obj_id.to_i]
|
|
19
|
+
current_session.reconnect(sugarcrm_uri, username, password, {:debug => debug_enabled})
|
|
20
|
+
end
|
|
21
|
+
Store.put_value("#{username}:service_url", sugarcrm_uri)
|
|
22
|
+
Store.put_value("#{username}:session_object_id", current_session.object_id)
|
|
23
|
+
rescue Exception => ex
|
|
24
|
+
warn "Can't authenticate user #{username}: " + ex.inspect
|
|
25
|
+
return false
|
|
26
|
+
end
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def get_settings
|
|
31
|
+
return @settings if @settings
|
|
32
|
+
begin
|
|
33
|
+
file = YAML.load_file(File.join(ROOT_PATH,'settings','settings.yml'))
|
|
34
|
+
env = (ENV['RHO_ENV'] || :development).to_sym
|
|
35
|
+
@settings = file[env]
|
|
36
|
+
|
|
37
|
+
# vendor-specific settings
|
|
38
|
+
file = YAML.load_file(File.join(ROOT_PATH,'vendor','sugar','settings','settings.yml'))
|
|
39
|
+
@settings.merge!(file[env])
|
|
40
|
+
rescue Exception => e
|
|
41
|
+
puts "Error opening settings file: #{e}"
|
|
42
|
+
puts e.backtrace.join("\n")
|
|
43
|
+
raise e
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Query_Fields:
|
|
2
|
+
# This is just a sample list of fields
|
|
3
|
+
# that are used in query
|
|
4
|
+
id:
|
|
5
|
+
Label: Id
|
|
6
|
+
Type: Id
|
|
7
|
+
name:
|
|
8
|
+
Label: Account Name
|
|
9
|
+
Type: textinput
|
|
10
|
+
account_type:
|
|
11
|
+
Label: Account Type
|
|
12
|
+
Type: Picklist
|
|
13
|
+
industry:
|
|
14
|
+
Label: Industry
|
|
15
|
+
Type: Picklist
|
|
16
|
+
annual_revenue:
|
|
17
|
+
Label: Annual Revenue
|
|
18
|
+
Type: textinput
|
|
19
|
+
billing_address_street:
|
|
20
|
+
Label: Billing Address Street
|
|
21
|
+
Type: textinput
|
|
22
|
+
billing_address_city:
|
|
23
|
+
Label: Billing Address City
|
|
24
|
+
Type: textinput
|
|
25
|
+
billing_address_state:
|
|
26
|
+
Label: Billing Address State
|
|
27
|
+
Type: textinput
|
|
28
|
+
billing_address_postalcode:
|
|
29
|
+
Label: Billing Address Zip Code
|
|
30
|
+
Type: textinput
|
|
31
|
+
billing_address_country:
|
|
32
|
+
Label: Billing Address Country
|
|
33
|
+
Type: textinput
|
|
34
|
+
phone_office:
|
|
35
|
+
Label: Main Phone
|
|
36
|
+
Type: textinput
|
|
37
|
+
website:
|
|
38
|
+
Label: WebSite
|
|
39
|
+
Type: textinput
|
|
40
|
+
employees:
|
|
41
|
+
Label: Number Of Employees
|
|
42
|
+
Type: textinput
|
|
43
|
+
|
|
44
|
+
ObjectFields:
|
|
45
|
+
# these are reference fields to the other objects
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
TitleFields:
|
|
49
|
+
- name
|