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.
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