rhoconnect-adapters 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG +4 -0
  3. data/Gemfile +18 -0
  4. data/README.md +239 -0
  5. data/Rakefile +31 -0
  6. data/bin/rhoconnect-adapters +35 -0
  7. data/generators/crm/templates/application/application.rb +34 -0
  8. data/generators/crm/templates/source/source_adapter.rb +10 -0
  9. data/generators/crm/templates/source/source_spec.rb +25 -0
  10. data/generators/crm/templates/spec/spec_helper.rb +64 -0
  11. data/generators/crm/vendor/ms_dynamics/adapter.rb +301 -0
  12. data/generators/crm/vendor/ms_dynamics/application.rb +56 -0
  13. data/generators/crm/vendor/ms_dynamics/lib/crm_metadata_service.rb +43 -0
  14. data/generators/crm/vendor/ms_dynamics/lib/crm_service.rb +141 -0
  15. data/generators/crm/vendor/ms_dynamics/lib/discovery_service.rb +51 -0
  16. data/generators/crm/vendor/ms_dynamics/lib/wlid_service.rb +159 -0
  17. data/generators/crm/vendor/ms_dynamics/ms_dynamics.rb +45 -0
  18. data/generators/crm/vendor/ms_dynamics/settings/Account.yml +46 -0
  19. data/generators/crm/vendor/ms_dynamics/settings/Contact.yml +40 -0
  20. data/generators/crm/vendor/ms_dynamics/settings/GenericObject.yml +18 -0
  21. data/generators/crm/vendor/ms_dynamics/settings/Lead.yml +53 -0
  22. data/generators/crm/vendor/ms_dynamics/settings/Opportunity.yml +41 -0
  23. data/generators/crm/vendor/ms_dynamics/settings/settings.yml +9 -0
  24. data/generators/crm/vendor/ms_dynamics/spec/application_spec.rb +23 -0
  25. data/generators/crm/vendor/ms_dynamics/spec/sources/account_spec.rb +49 -0
  26. data/generators/crm/vendor/ms_dynamics/spec/sources/contact_spec.rb +49 -0
  27. data/generators/crm/vendor/ms_dynamics/spec/sources/lead_spec.rb +49 -0
  28. data/generators/crm/vendor/ms_dynamics/spec/sources/opportunity_spec.rb +62 -0
  29. data/generators/crm/vendor/ms_dynamics/spec/spec_helper.rb +78 -0
  30. data/generators/crm/vendor/ms_dynamics/spec_data/Account.yml +6 -0
  31. data/generators/crm/vendor/ms_dynamics/spec_data/Contact.yml +7 -0
  32. data/generators/crm/vendor/ms_dynamics/spec_data/GenericObject.yml +3 -0
  33. data/generators/crm/vendor/ms_dynamics/spec_data/Lead.yml +12 -0
  34. data/generators/crm/vendor/ms_dynamics/spec_data/Opportunity.yml +6 -0
  35. data/generators/crm/vendor/ms_dynamics/templates.rb +57 -0
  36. data/generators/crm/vendor/oracle_on_demand/adapter.rb +421 -0
  37. data/generators/crm/vendor/oracle_on_demand/application.rb +64 -0
  38. data/generators/crm/vendor/oracle_on_demand/settings/Account.yml +91 -0
  39. data/generators/crm/vendor/oracle_on_demand/settings/Contact.yml +54 -0
  40. data/generators/crm/vendor/oracle_on_demand/settings/GenericObject.yml +21 -0
  41. data/generators/crm/vendor/oracle_on_demand/settings/Lead.yml +72 -0
  42. data/generators/crm/vendor/oracle_on_demand/settings/Opportunity.yml +69 -0
  43. data/generators/crm/vendor/oracle_on_demand/settings/settings.yml +8 -0
  44. data/generators/crm/vendor/oracle_on_demand/spec/application_spec.rb +14 -0
  45. data/generators/crm/vendor/oracle_on_demand/spec/sources/account_spec.rb +50 -0
  46. data/generators/crm/vendor/oracle_on_demand/spec/sources/contact_spec.rb +50 -0
  47. data/generators/crm/vendor/oracle_on_demand/spec/sources/lead_spec.rb +51 -0
  48. data/generators/crm/vendor/oracle_on_demand/spec/sources/opportunity_spec.rb +51 -0
  49. data/generators/crm/vendor/oracle_on_demand/spec_data/Account.yml +8 -0
  50. data/generators/crm/vendor/oracle_on_demand/spec_data/Contact.yml +8 -0
  51. data/generators/crm/vendor/oracle_on_demand/spec_data/GenericObject.yml +4 -0
  52. data/generators/crm/vendor/oracle_on_demand/spec_data/Lead.yml +14 -0
  53. data/generators/crm/vendor/oracle_on_demand/spec_data/Opportunity.yml +6 -0
  54. data/generators/crm/vendor/oracle_on_demand/templates.rb +52 -0
  55. data/generators/crm/vendor/salesforce/adapter.rb +315 -0
  56. data/generators/crm/vendor/salesforce/application.rb +80 -0
  57. data/generators/crm/vendor/salesforce/settings/Account.yml +53 -0
  58. data/generators/crm/vendor/salesforce/settings/Contact.yml +61 -0
  59. data/generators/crm/vendor/salesforce/settings/GenericObject.yml +13 -0
  60. data/generators/crm/vendor/salesforce/settings/Lead.yml +73 -0
  61. data/generators/crm/vendor/salesforce/settings/Opportunity.yml +48 -0
  62. data/generators/crm/vendor/salesforce/settings/settings.yml +6 -0
  63. data/generators/crm/vendor/salesforce/spec/application_spec.rb +14 -0
  64. data/generators/crm/vendor/salesforce/spec/sources/account_spec.rb +50 -0
  65. data/generators/crm/vendor/salesforce/spec/sources/contact_spec.rb +50 -0
  66. data/generators/crm/vendor/salesforce/spec/sources/lead_spec.rb +51 -0
  67. data/generators/crm/vendor/salesforce/spec/sources/opportunity_spec.rb +51 -0
  68. data/generators/crm/vendor/salesforce/spec_data/Account.yml +14 -0
  69. data/generators/crm/vendor/salesforce/spec_data/Contact.yml +8 -0
  70. data/generators/crm/vendor/salesforce/spec_data/GenericObject.yml +3 -0
  71. data/generators/crm/vendor/salesforce/spec_data/Lead.yml +10 -0
  72. data/generators/crm/vendor/salesforce/spec_data/Opportunity.yml +10 -0
  73. data/generators/crm/vendor/salesforce/templates.rb +45 -0
  74. data/generators/crm/vendor/sugar/adapter.rb +291 -0
  75. data/generators/crm/vendor/sugar/application.rb +50 -0
  76. data/generators/crm/vendor/sugar/settings/Account.yml +49 -0
  77. data/generators/crm/vendor/sugar/settings/Contact.yml +62 -0
  78. data/generators/crm/vendor/sugar/settings/GenericObject.yml +12 -0
  79. data/generators/crm/vendor/sugar/settings/Lead.yml +76 -0
  80. data/generators/crm/vendor/sugar/settings/Opportunity.yml +49 -0
  81. data/generators/crm/vendor/sugar/settings/settings.yml +9 -0
  82. data/generators/crm/vendor/sugar/spec/application_spec.rb +25 -0
  83. data/generators/crm/vendor/sugar/spec/sources/account_spec.rb +53 -0
  84. data/generators/crm/vendor/sugar/spec/sources/contact_spec.rb +53 -0
  85. data/generators/crm/vendor/sugar/spec/sources/lead_spec.rb +54 -0
  86. data/generators/crm/vendor/sugar/spec/sources/opportunity_spec.rb +54 -0
  87. data/generators/crm/vendor/sugar/spec_data/Account.yml +13 -0
  88. data/generators/crm/vendor/sugar/spec_data/Contact.yml +8 -0
  89. data/generators/crm/vendor/sugar/spec_data/GenericObject.yml +3 -0
  90. data/generators/crm/vendor/sugar/spec_data/Lead.yml +16 -0
  91. data/generators/crm/vendor/sugar/spec_data/Opportunity.yml +10 -0
  92. data/generators/crm/vendor/sugar/sugar.rb +33 -0
  93. data/generators/crm/vendor/sugar/templates.rb +58 -0
  94. data/generators/rhoconnect-adapters.rb +217 -0
  95. data/lib/rhoconnect-adapters/crm/crm.rb +31 -0
  96. data/lib/rhoconnect-adapters/soap_service.rb +70 -0
  97. data/lib/rhoconnect-adapters/version.rb +3 -0
  98. data/lib/rhoconnect-adapters.rb +2 -0
  99. data/rhoconnect-adapters.gemspec +36 -0
  100. data/spec/apps/ms_dynamics_spec.rb +19 -0
  101. data/spec/apps/oracle_on_demand_spec.rb +20 -0
  102. data/spec/apps/salesforce_spec.rb +18 -0
  103. data/spec/apps/sugar_spec.rb +18 -0
  104. data/spec/generator/generator_spec.rb +113 -0
  105. data/spec/spec_helper.rb +57 -0
  106. 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,8 @@
1
+ Contact:
2
+ Salutation: Mr.
3
+ Phone: 408-222-2222
4
+ FirstName: John
5
+ LastName: Smith
6
+ Title: VP Of Sales
7
+ Email: some@email.com
8
+ LeadSource: Web
@@ -0,0 +1,3 @@
1
+ <%=class_name%>:
2
+ # put all of your sample data for specs here in the form of hash
3
+ # { field_name => sample_field_value }
@@ -0,0 +1,10 @@
1
+ Lead:
2
+ Salutation: Ms.
3
+ Phone: 408-222-2223
4
+ FirstName: Rebecca
5
+ LastName: Smith
6
+ Title: Marketing Assistant
7
+ Company: ABC Co.
8
+ Industry: Agriculture
9
+ Status: Working - Contacted
10
+ Rating: Hot
@@ -0,0 +1,10 @@
1
+ Opportunity:
2
+ Name: Biggest Opp of the Year
3
+ StageName: Value Proposition
4
+ Amount: 50000
5
+ Probability: 99
6
+ CloseDate: 2011-12-24
7
+ Type: New Customer
8
+ NextStep: Counteroffer
9
+ LeadSource: Web
10
+ Description: Very good opportunity
@@ -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