Jigar Amin - OpenERP has proposed merging lp:~openerp-dev/openobject-addons/trunk-import_salesforce-backlog8-jam into lp:~openerp-dev/openobject-addons/trunk-import_salesforce.
Requested reviews: Bhumika (OpenERP) (sbh-openerp) For more details, see: https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-import_salesforce-backlog8-jam/+merge/63211 Changes : - Backlog 8 : Correction + Remove the id mapping : do not map the field 'id'. + Changed wizard as per new specification. + Merge box : Lead/opportunities. + Move menuItem :Sales => Import => import Salesforce. + multi instance management,Keep the feature but hide it. + Import product + Import employee + Separate import contact and account: - Import Account. - Re-factored Import Contact. + Change message once the import is launch : "TODO" [Done] + Added Read Me file for Beginner help. + Updated Yaml as per new Wizard specification. + Added initial Security Rules. Kindly Review this, Thank You -- https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-import_salesforce-backlog8-jam/+merge/63211 Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-addons/trunk-import_salesforce.
=== added file 'import_salesforce/README.txt' --- import_salesforce/README.txt 1970-01-01 00:00:00 +0000 +++ import_salesforce/README.txt 2011-06-02 10:17:27 +0000 @@ -0,0 +1,43 @@ + + This Module import values from salesfroce table like User, Contact, Lead, +Account, Opportunity, Employee, Case, Event, Task, Attachment, Folder, Document, +Product2 to the OpenERP Modules CRM, Human Resource, Document Management, it +import data and also maintain consistency of data a per salesforce have. + +Use Guide : + +Pre-requirement : +-------------------------------------------------------------------------------- +1) Install python-beatbox api(A Python library for querying/updating + Saleforce.com data via SOAP API - http://pypi.python.org/pypi/beatbox/20.0 + +2) Get Salesforce Developer Account [http://developer.force.com/] + - Enable Developer Mode (not mandatory but recommended) + Developer Mode can be enable from Use Setting + - Login to your account (https://login.salesforce.com/) + - Administration Setup > Manage Users > Users > Edit User and + Check "Developer Mode" Check box + +3) Generate the Security Token for your login. + - Home > Setup > Personal Setup > My Personal Information > + Reset My Security Token and click to button "Reset Security Token" and it + will send your security token to Email address specified in User Form. + +How to Use Module: +-------------------------------------------------------------------------------- +1) Install Module "import_salesforce". +2) " Sales => Import => Import Salesforce" run the wizard it will ask for three + login detail and modules to be imported. +3) Supply Username, password and Security Token and below this you will find + list of module to be imported, check the modules for import. +4) Their is two option for import + 4.1) First "Import Once" button that will start import process in background. + 4.2) Or by Clicking "Create Recurrent Import" you can create scheduler, which + will run the import process at specified interval +5) Import process run in background so as soon as Importing process get over + system send mail to specified mail address in wizard. + + + + + === modified file 'import_salesforce/__openerp__.py' --- import_salesforce/__openerp__.py 2011-05-17 05:19:47 +0000 +++ import_salesforce/__openerp__.py 2011-06-02 10:17:27 +0000 @@ -24,21 +24,25 @@ 'version': '1.0', 'category': 'Generic Modules', 'description': """ -This Module Import SaleForce 'Leads', 'Opportunity', 'Contacts' , 'Cases', 'User', -'Events', 'Activity' and Other history Detail data into OpenERP Module. + + This Module Import SaleForce 'Leads', 'Opportunity', 'Contacts', 'Account' , +'Cases', 'User', 'Events', 'Activity', 'Task', 'Attachment', 'Folder' , 'Employees' +'Documents', 'Product' Other history Detail values into OpenERP Module. """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'depends': ['import_base', 'crm_claim', 'document'], + 'depends': ['import_base', 'crm_claim', 'document', 'product', 'hr'], 'init_xml': [], 'update_xml': [ + 'security/ir.model.access.csv', 'wizard/import_salesforce_view.xml', 'wizard/sf_import_message_view.xml', ], 'demo_xml': [], 'test': [ # 'test/test_import_user.yml', + ], 'installable': True, 'active': False, === modified file 'import_salesforce/security/ir.model.access.csv' --- import_salesforce/security/ir.model.access.csv 2011-05-03 06:03:33 +0000 +++ import_salesforce/security/ir.model.access.csv 2011-06-02 10:17:27 +0000 @@ -1,1 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_import_salesforce_group_sale_manager","import_salesforce_group_sale_manager","model_import_salesforce","base.group_sale_manager",1,1,1,1 +"access_salesforce_login_services_group_sale_manager","salesforce_login_services_group_sale_manager","model_salesforce_login_services","base.group_sale_manager",1,1,1,1 +"access_sf_import_message_group_sale_manager","sf_import_message_group_sale_manager","model_sf_import_message","base.group_sale_manager",1,1,1,1 === modified file 'import_salesforce/test/test_import_user.yml' --- import_salesforce/test/test_import_user.yml 2011-04-28 10:31:45 +0000 +++ import_salesforce/test/test_import_user.yml 2011-06-02 10:17:27 +0000 @@ -1,26 +1,15 @@ - - Creating Wizard to Select Service record. -- - !record {model: salesforce.services, id: salesforce_services_webservice}: - name: webservice - -- - Creating a Import Wizard with Username and Login Detail record -- - !record {model: import.sf, id: import_sf_user}: + Creating a Import SalesFroce Login Wizard +- + !record {model: import.salesforce, id: import_salesforce_user}: + name: [email protected] password: openerp123 token: VHcN14OFIERn6xzYWq0dIWS8k - username: [email protected] + instance_name: salesforce users: true - - Start Importing User and Check Imported Successfully or not + Start Importing User Process - - !python {model: import.sf}: | - result = self.sf_do_import(cr, uid, [ref("import_sf_user")], context={'choice':'webservice'} ) - import logging - log = logging.getLogger('import.salesforce') - if not result.get('context',{}).get('imported', False): - raise AssertionError("Unexpected end of message. Please check connectivity and permissions, and report a bug if problems persist.") - else: - log.info("Users Imported Successfully from SalesForce.") + !python {model: import.salesforce}: | + self.import_all(cr, uid, [ref("import_salesforce_user")]) === modified file 'import_salesforce/wizard/import_salesforce.py' --- import_salesforce/wizard/import_salesforce.py 2011-06-01 16:30:19 +0000 +++ import_salesforce/wizard/import_salesforce.py 2011-06-02 10:17:27 +0000 @@ -51,6 +51,11 @@ TABLE_OPPOHISTORY = 'OpportunityHistory' TABLE_ATTACHMENT = 'Attachment' TABLE_TASK = 'Task' + TABLE_PRODUCT = "Product2" + TABLE_EMPLOYEE = "Employee" + TABLE_PRODUCTCAT = "product.category" + TABLE_HRDEPT = 'hr.department' + TABLE_ACCOUNT = "Account" DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" def initialize(self): @@ -63,16 +68,24 @@ def prepareStatement(self): return { - self.TABLE_USER: "SELECT Id, Name, Username, Email, TimeZoneSidKey, LanguageLocaleKey FROM %s"%(self.TABLE_USER), + self.TABLE_USER: "SELECT Id, Name, Username, Email, Street, City, State, Country, PostalCode, Phone, Fax, MobilePhone, TimeZoneSidKey, LanguageLocaleKey FROM %s"%(self.TABLE_USER), self.TABLE_FOLDER: "SELECT Id, Name FROM %s WHERE Type = 'Document'"%(self.TABLE_FOLDER), self.TABLE_DOCUMENT: "SELECT Id, Name, Type, AuthorId, FolderId, Description, Url FROM %s"%(self.TABLE_DOCUMENT), +<<<<<<< TREE self.TABLE_LEAD: "SELECT Id, Name, Title, Phone, Email, MobilePhone, Company, Description, PostalCode, Street, City, Rating, Country, Status, LeadSource, Salutation, State, Fax, CreatedById, Industry, AnnualRevenue, NumberOfEmployees FROM %s"%(self.TABLE_LEAD), self.TABLE_CONTACT: "SELECT Id, Name, Title FROM %s"%(self.TABLE_CONTACT), +======= + self.TABLE_LEAD: "SELECT Id, Name, Title, Phone, Email, MobilePhone, Company, Description, PostalCode, Street, City, Rating, Country, Status, LeadSource, Salutation, State, Fax, CreatedById FROM %s"%(self.TABLE_LEAD), + self.TABLE_CONTACT: "SELECT Id, Name, Title, Email, MailingStreet, MailingCity, Phone, MobilePhone, MailingPostalCode, MailingState, MailingCountry, Fax, OtherStreet, OtherCity, OtherCountry, OtherState, OtherPostalCode, OtherPhone FROM %s"%(self.TABLE_CONTACT), +>>>>>>> MERGE-SOURCE self.TABLE_OPPORTUNITY: "SELECT CreatedById, AccountId, Id, Name , Probability, NextStep, Amount, Description, OwnerId, StageName, CloseDate, Account.Name FROM %s"%(self.TABLE_OPPORTUNITY), self.TABLE_CLAIM: "SELECT Id, CaseNumber, Subject, OwnerId, Description, CreatedById, Priority, ContactId, ClosedDate, Status FROM %s"%(self.TABLE_CLAIM), self.TABLE_MEETING: "SELECT Id, Subject, OwnerId, WhoId, Location, Description, StartDateTime, EndDateTime, IsRecurrence, IsAllDayEvent, DurationInMinutes, RecurrenceType, RecurrenceInterval, RecurrenceEndDateOnly, RecurrenceDayOfWeekMask, RecurrenceDayOfMonth, RecurrenceInstance FROM %s"%(self.TABLE_MEETING), self.TABLE_ATTACHMENT: "SELECT Id, Name, Description, ParentId FROM Attachment", self.TABLE_TASK: "SELECT Id, Subject, OwnerId, ActivityDate, CallDurationInSeconds, Description, WhoId FROM %s"%(self.TABLE_TASK), + self.TABLE_PRODUCT: "SELECT Id,CreatedById, Description, Family, IsActive, Name, ProductCode FROM %s"%(self.TABLE_PRODUCT), + self.TABLE_EMPLOYEE: "SELECT Id, Phone, Email, MobilePhone, Name, Department, IsActive, ManagerId FROM %s"%(self.TABLE_USER), + self.TABLE_ACCOUNT: "SELECT Id, Name, AccountNumber, OwnerId, Site, AnnualRevenue, Fax, Phone, Website , BillingStreet, BillingCity, BillingState, BillingCountry, BillingPostalCode, ShippingStreet, ShippingCity, ShippingState, ShippingPostalCode, ShippingCountry FROM %s"%(self.TABLE_ACCOUNT) } def get_data(self, table): @@ -91,6 +104,9 @@ self.TABLE_MEETING: self.get_meeting_mapping(), self.TABLE_ATTACHMENT: self.get_attachment_mapping(), self.TABLE_TASK: self.get_task_mapping(), + self.TABLE_PRODUCT: self.get_product_mapping(), + self.TABLE_EMPLOYEE: self.get_employee_mapping(), + self.TABLE_ACCOUNT: self.get_account_mapping(), } def get_all_states(self, external_val, country_id): @@ -106,7 +122,7 @@ """ Get Country, if no country match do not create anything, to avoid duplicate country code. """ - return self.mapped_id_if_exist('res.country', [('name', 'ilike', val)], 'res.country', val) + return self.mapped_id_if_exist('res.country', [('name', '=', val)], 'res.country', val) def get_title(self, vals, title, domain): if title: @@ -124,6 +140,31 @@ val['password'] = 'salesforce' #default password for all user #TODO needed in documentation return val + def get_user_address(self, val): + field_map = { + 'name': 'Name', + 'type': 'Type', + 'street': 'Street', + 'zip': 'PostalCode', + 'city': 'City', + 'phone': 'Phone', + 'mobile': 'MobilePhone', + 'email': 'Email', + 'fax': 'Fax', + 'function': 'Title', + 'country_id/id': 'CountryId', + 'state_id/id': 'StateId', + } + + val.update({'Type':'contact'}) + country = state = False + if val.get('Country'): + country = self.get_all_countries(val.get('Country')) + if val.get('State'): + state = self.get_all_states(val.get('State'), country) + val.update({'CountryId': country,'StateId': state,'id_new': val['Id']+'address_contact' }) + return self.import_object_mapping(field_map , val, 'res.partner.address', self.TABLE_CONTACT, val['id_new'], self.DO_NOT_FIND_DOMAIN) + def get_user_mapping(self): return { 'model': 'res.users', @@ -134,6 +175,7 @@ 'user_email': 'Email', 'context_tz': 'TimeZoneSidKey', 'context_lang': 'LanguageLocaleKey', + 'address_id/id' : self.get_user_address, } } @@ -206,39 +248,11 @@ 'state_id/id': vals.get('OtherState', False), }, } - if vals.get('Account'): - address.update({ - 'invoice': { - 'contact_name': vals.get('Name', ''), - 'type': key, - 'street': vals.get('Account', {}).get('BillingStreet', ''), - 'zip': vals.get('Account', {}).get('BillingPostalCode', ''), - 'city': vals.get('Account', {}).get('BillingCity', ''), - 'phone': vals.get('Account', {}).get('Phone', ''), - 'mobile': False, - 'email': vals.get('Email', ''), - 'fax': vals.get('Account', {}).get('Fax', ''), - 'country_id/id': vals.get('Account', {}).get('BillingCountry', False), - 'state_id/id': vals.get('Account', {}).get('BillingState', False), - }, - 'delivery': { - 'contact_name': vals.get('Name', ''), - 'type': key, - 'street': vals.get('Account', {}).get('ShippingStreet', ''), - 'zip': vals.get('Account', {}).get('ShippingPostalCode', ''), - 'city': vals.get('Account', {}).get('ShippingCity', ''), - 'phone': vals.get('Account', {}).get('Phone', ''), - 'mobile': False, - 'email': vals.get('Email', ''), - 'fax': vals.get('Account', {}).get('Fax', ''), - 'country_id/id': vals.get('Account', {}).get('ShippingCountry', False), - 'state_id/id': vals.get('Account', {}).get('ShippingState', False), - }, - }) return address.get(key, False) - def get_address_type(self, add_type, vals): - val = self.get_address_vals(add_type, vals) + def get_partner_address(self, vals): + address_types = ['contact', 'other'] + address_ids = [] address = { 'name': 'contact_name', 'type': 'type', @@ -252,27 +266,24 @@ 'country_id/id': 'country_id/id', 'state_id/id': 'state_id/id', } - if val: + for add_type in address_types: + val = self.get_address_vals(add_type, vals) country = state = False - if val.get('country_id/id'): - country = self.get_all_countries(val.get('country_id/id')) - if val.get('state_id/id'): - state = self.get_all_states(val.get('state_id/id'), country) + if add_type == "contact": + if vals.get('MailingCountry'): + country = self.get_all_countries(vals.get('MailingCountry')) + if vals.get('MailingState'): + state = self.get_all_states(vals.get('MailingState'), country) + if add_type == "other": + if vals.get('OtherCountry'): + country = self.get_all_countries(vals.get('OtherCountry')) + if vals.get('OtherState'): + state = self.get_all_states(vals.get('OtherState'), country) val.update({'country_id/id': country, 'state_id/id': state, 'id_new': vals['Id'] + '_address_' + add_type}) - return self.import_object_mapping(address, val, 'res.partner.address', self.TABLE_CONTACT, val['id_new'], self.DO_NOT_FIND_DOMAIN) - else: - return False - - def get_partner_address(self, vals): - address_types = ['contact', 'other', 'invoice', 'delivery'] - address_vals = self._SFCLIENT.query("SELECT Id , Name, Email, MailingStreet, MailingCity, Phone, MobilePhone, MailingPostalCode, MailingState, MailingCountry, Fax, OtherStreet, OtherCity, OtherCountry, OtherState, OtherPostalCode, OtherPhone, Account.Website, Account.BillingStreet, Account.BillingCity, Account.BillingCountry, Account.BillingState, Account.BillingPostalCode, Account.ShippingStreet, Account.ShippingCity, Account.ShippingCountry, Account.ShippingState, Account.ShippingPostalCode, Account.Fax, Account.Phone FROM %s WHERE Id = '%s'"%(self.TABLE_CONTACT, vals.get('Id'))) - address_ids = [] - for add_type in address_types: - if add_type in ['invoice', 'delivery'] and not vals.get('Account'): - continue - address_ids.append(self.get_address_type(add_type, address_vals[0])) + add_id= self.import_object_mapping(address, val, 'res.partner.address', self.TABLE_CONTACT, val['id_new'], self.DO_NOT_FIND_DOMAIN) + address_ids.append(add_id) return ','.join(address_ids) def get_contact_mapping(self): @@ -430,7 +441,11 @@ def get_opportunity_mapping(self): return { 'model': 'crm.lead', +<<<<<<< TREE 'dependencies': [self.TABLE_USER, self.TABLE_CONTACT], #TODO need dependencies on account but do not depend on contact +======= + 'dependencies': [self.TABLE_USER, self.TABLE_CONTACT, self.TABLE_ACCOUNT], +>>>>>>> MERGE-SOURCE 'hook': self.get_leadtoppo_vals, 'map': { 'name': 'Name', @@ -441,8 +456,13 @@ 'date_deadline': self.get_oppo_date_deadline, 'stage_id/id': call(self.get_status, value('StageName'), 'opportunity'), 'type': const('opportunity'), +<<<<<<< TREE 'partner_id/id': self.get_oppo_partner, 'channel_id/id': call(self.get_channel, value('LeadSource')), +======= + 'partner_id/id': ref(self.TABLE_ACCOUNT, 'AccountId'), + 'channel_id/id': self.get_channel, +>>>>>>> MERGE-SOURCE 'description': 'Description', 'state': map_val('StageName', self.opportunity_state_map, 'open'), 'partner_name': 'Company', @@ -511,7 +531,7 @@ 'state': map_val('Status', self.claim_state_map, default='draft'), } } - + def get_date(self, val, field): date = datetime.datetime.now().strftime(self.DATETIME_FORMAT) if field: @@ -610,12 +630,6 @@ 'allday': map_val('IsAllDayEvent', self.boolean_map), 'recurrency': map_val('IsRecurrence', self.boolean_map), 'attendee_ids/id': self.get_attendee, -# 'rrule_type': 'RecurrenceType', -# 'interval': 'RecurrenceInterval', -# 'end_date': 'RecurrenceEndDateOnly', -# 'week_list': 'RecurrenceDayOfWeekMask', -# 'day': 'RecurrenceDayOfMonth', -# 'byday': 'RecurrenceInstance', } } @@ -696,6 +710,156 @@ def get_email_subject(self, result): return "Your Salesforce's data were successfully imported at %s" % self.date_ended + def get_product_category(self, val, name): + + fields = ['name'] + nameid = 'product_category_'+name + data = [name] + return self.import_object(fields, data, self.TABLE_PRODUCTCAT, self.TABLE_PRODUCTCAT, nameid, [('name', 'ilike', name)]) + + def get_product(self, val): + costprice = listprice = 0.00 + prices = self._SFCLIENT.query("SELECT UnitPrice, Pricebook2Id, UseStandardPrice FROM PricebookEntry WHERE Product2Id = '%s' and IsActive = true"%(val.get('Id'))) + for plist in prices: + pricebook =self._SFCLIENT.query("SELECT Id, IsStandard FROM Pricebook2 WHERE Id = '%s'"%(plist.get('Pricebook2Id'))) + for book in pricebook: + if book.get('IsStandard'): + costprice = plist.get('UnitPrice', 1.00) + else: + listprice = plist.get('UnitPrice', 1.00) + val.update({'StandardPrice': costprice, + 'ListPrice':listprice }) + return val + + def get_product_mapping(self): + return { + 'model': 'product.product', + 'dependencies': [self.TABLE_USER], + 'hook': self.get_product, + 'map': { + 'name': 'Name', + 'active': map_val('IsActive', self.boolean_map), + 'default_code': 'ProductCode', + 'description': 'Description', + 'product_manager/id': ref(self.TABLE_USER, 'CreatedById'), + 'categ_id/id': call(self.get_product_category, value('Family')), + 'standard_price': 'StandardPrice', + 'list_price': 'ListPrice', + } + } + + def get_employee(self, val): + users_pool = self.obj.pool.get('res.users') + user = self.xml_id_exist(self.TABLE_USER, val.get('Id')) + if user: + user_id = self.get_mapped_id(self.TABLE_USER, val.get('Id')) + user_rec = users_pool.browse(self.cr, self.uid, user_id) + val.update({'AddressId': user_rec.address_id}) + return val + + def get_department(self, val, dept): + if dept: + fields = ['name'] + nameid = val.get('Id')+"_hr_department_"+dept + data = [dept] + return self.import_object(fields, data, self.TABLE_HRDEPT, self.TABLE_HRDEPT, nameid, [('name', 'ilike', dept)]) + return False + + def get_employee_mapping(self): + return { + 'model': 'hr.employee', + 'dependencies': [self.TABLE_USER], + 'hook': self.get_employee, + 'map': { + 'name': 'Name', + 'active': map_val('IsActive', self.boolean_map), + 'user_id/id': ref(self.TABLE_USER, 'Id'), + 'address_id/.id': "AddressId", + 'work_phone': 'Phone', + 'mobile_phone': 'MobilePhone', + 'work_email': 'Email', + 'parent_id/id_parent': 'ManagerId', + 'department_id/id': call(self.get_department, value('Department')) + } + } + + def get_account_vals(self, key, vals): + address = { + 'invoice': { + 'contact_name': vals.get('Name', ''), + 'type': key, + 'street': vals.get('BillingStreet', ''), + 'zip': vals.get('BillingPostalCode', ''), + 'city': vals.get('BillingCity', ''), + 'phone': vals.get('Phone', ''), + 'email': vals.get('Email', ''), + 'fax': vals.get('Fax', ''), + 'state_id/id': vals.get('BillingState', False), + 'country_id/id': vals.get('BillingCountry', False), + }, + 'delivery': { + 'contact_name': vals.get('Name', ''), + 'type': key, + 'street': vals.get('ShippingStreet', ''), + 'zip': vals.get('ShippingPostalCode', ''), + 'city': vals.get('ShippingCity', ''), + 'phone': vals.get('Phone', ''), + 'email': vals.get('Email', ''), + 'fax': vals.get('Fax', ''), + 'country_id/id': vals.get('ShippingCountry', False), + 'state_id/id': vals.get('ShippingState', False), + }, + } + return address.get(key, False) + + def get_account_address(self, vals): + address_types = ['delivery', 'invoice'] + address_ids = [] + address = { + 'name': 'contact_name', + 'type': 'type', + 'street': 'street', + 'zip': 'zip', + 'city': 'city', + 'phone': 'phone', + 'email': 'email', + 'fax': 'fax', + 'country_id/id': 'country_id/id', + 'state_id/id': 'state_id/id', + } + for add_type in address_types: + val = self.get_account_vals(add_type, vals) + country = state = False + if add_type == "delivery": + if vals.get('ShippingCountry'): + country = self.get_all_countries(vals.get('ShippingCountry')) + if vals.get('ShippingState'): + state = self.get_all_states(vals.get('ShippingState'), country) + if add_type == "invoice": + if vals.get('BillingCountry'): + country = self.get_all_countries(vals.get('BillingCountry')) + if vals.get('BillingState'): + state = self.get_all_states(vals.get('BillingState'), country) + val.update({'country_id/id': country, + 'state_id/id': state, + 'id_new': vals['Id'] + '_address_' + add_type}) + add_id= self.import_object_mapping(address, val, 'res.partner.address', self.TABLE_CONTACT, val['id_new'], self.DO_NOT_FIND_DOMAIN) + address_ids.append(add_id) + return ','.join(address_ids) + + def get_account_mapping(self): + return { + 'model': 'res.partner', + 'dependencies': [self.TABLE_USER], + 'map': { + 'name': 'Name', + 'ref': 'AccountNumber', + 'customer': const('1'), + 'supplier': const('0'), + 'address/id': self.get_account_address, + 'website': 'Website' + } + } class import_salesforce(osv.osv): ''' @@ -708,8 +872,7 @@ 'name': fields.char('Username/Email', size=255, help="Salesforce User name/login Name"), 'password': fields.char('Password', size=255, help="Password for above User"), 'token': fields.char('Security Token', size=255, help="Security Token generated by salesforce for user."), - 'lead': fields.boolean('Leads', help="If Leads is checked, SalesFroce Leads data imported to OpenERP CRM Leads"), - 'opportunity': fields.boolean('Opportunities', help="If Opportunity is checked, SalesForce Leads data imported to OpenERP CRM Opportunity."), + 'lead': fields.boolean('Leads/Opportunities', help="If Leads/Opportunities is checked, SalesFroce Leads/Opportunities data imported to OpenERP CRM Leads/Opportunities"), 'users': fields.boolean('User', help="If Users is checked, SalesFroce Users data imported to OpenERP Users."), 'contact': fields.boolean('Partner/Contacts', help="If Partner/Contacts is checked, SalesFroce Contact data imported to OpenERP Partner and Partner Address."), 'case': fields.boolean('Cases/Claim', help="If Cases/Claim is checked, SalesFroce Cases data imported to OpenERP CRM Claim."), @@ -718,6 +881,9 @@ 'document': fields.boolean('Document', help="If Documents checked, SalesFroce Folder data imported to OpenERP Document."), 'attachment': fields.boolean('Attachments', help="If Attachments is checked, SalesFroce attachments data will imported to OpenERP Attachment, and if resource of the attachment is imported and it will linked to the respective documents."), 'task': fields.boolean('Acivity', help="If Activity is checked, SalesFroce Activity data will imported to OpenERP Meetings and if you want to import data according to the type in Task to repective model than select 'With Type' from below slection and Give Field level security of the Type Field in SalesForce.\nSalesForce Activity is comprised of Email, Call, Meeting."), + 'product': fields.boolean('Prodcuts', help="If Prodcuts is checked, SalesFroce Prodcuts data imported to OpenERP Prodcuts"), + 'employee': fields.boolean('Employees', help="If Employees is checked, SalesFroce Per Users Employee will be created"), + 'account': fields.boolean('Accounts', help="If Accounts is checked, SalesFroce Accounts details will be imported to the OpenERP Contact."), 'email': fields.char('Email address to notify', size=128, help="On Successful import the Email is Send to the mention email address."), 'instance_name': fields.char('Instance Name', required=True, size=128, help="Instance name will be used to separate import from multiple salesforce login instance."), } @@ -733,14 +899,16 @@ context = {} nodes = [] for current in self.browse(cr, uid, ids, context): - if current.lead: - nodes.append('Lead') - if current.opportunity: - nodes.append('Opportunity') if current.users: nodes.append('User') if current.contact: nodes.append('Contact') + if current.lead: + nodes.extend(['Lead', 'Opportunity']) + if current.employee: + nodes.append('Employee') + if current.account: + nodes.append('Account') if current.case: nodes.append('Case') if current.event: @@ -753,28 +921,38 @@ nodes.append('Folder') if current.document: nodes.append('Document') + if current.product: + nodes.append('Product2') return nodes def import_all(self, cr, uid, ids, context=None): """Import all salesforce data into openerp module""" + if context == None: + context = {} tables = self._get_nodes(cr, uid, ids, context) for current in self.browse(cr, uid, ids, context): context.update({'username': current.name, 'passtoken': current.password+current.token}) instance = current.instance_name - mail = [current.email] or False + mail = current.email or False try: sfc = beatbox.PythonClient() sfc.login(context.get('username'), context.get('passtoken')) except: raise osv.except_osv(_('Error !'), _("Invalid Login")) +<<<<<<< TREE imp = salesforce_import(self, cr, uid, instance, "import_salesforce", mail, context) +======= + imp = salesforce_import(self, cr, uid, instance, "import_salesforce", [mail], context) +>>>>>>> MERGE-SOURCE imp.set_table_list(tables) imp.start() - - context.update({'message': "Data Imported Successfully from Salesforce."}) + msg = "Your %s are being imported in background."%(", ".join(tables)) + if mail: + msg += " A email will be send when the process is finished to %s"%(mail) + context.update({'message': msg}) model_pool = self.pool.get('ir.model.data') model_data_ids = model_pool.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'sf.import.message.form')]) @@ -800,9 +978,8 @@ context = {} login_pool = self.pool.get('salesforce.login.services') if args[1]: - #Reloading new SF login configuration. + #Reloading new salesforce login configuration. login = login_pool.browse(cr, uid, int(args[1])) - context.update({'username': login.name, 'passtoken': login.password+login.token}) try: @@ -876,4 +1053,4 @@ 'instance': fields.char('Instance Name', size=255), } salesforce_login_services() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: === modified file 'import_salesforce/wizard/import_salesforce_view.xml' --- import_salesforce/wizard/import_salesforce_view.xml 2011-05-23 11:22:37 +0000 +++ import_salesforce/wizard/import_salesforce_view.xml 2011-06-02 10:17:27 +0000 @@ -2,7 +2,7 @@ <openerp> <data> <!-- Menu for SalesForce Import Wizard--> - <menuitem id="menu_salesforce" name="Sales Force" parent="base.menu_base_partner" /> + <menuitem id="menu_import" name="Import" parent="base.menu_base_partner" /> <!--Form View for the model import sf for webservices--> <record model="ir.ui.view" id="view_import_sf_webservice_form"> @@ -10,63 +10,67 @@ <field name="model">import.salesforce</field> <field name="type">form</field> <field name="arch" type="xml"> - <form string="Import your data from Saleforce"> - <group colspan="8" col="4"> - <separator string="Login Information" colspan='4'/> - <field name='name' colspan='4' required='True'/> - <field name='password' password='True' colspan='4' required='True'/> - <field name='token' password='True' colspan='4' required='True'/> - </group> - <group colspan="8" col="8"> - <separator string="Choose The Data You Want To Import" colspan='8'/> - <newline/> - <group colspan="4" col="4"> - <separator string="Base" colspan="2"/> - <newline/> - <group colspan="2" col="2"> - <field name="users"/> - <field name="contact"/> - </group> - </group> - <group colspan="4" col="4"> - <separator string="CRM" colspan="2"/> - <newline/> - <group colspan="2" col="4"> - <field name='lead' /> - <field name='opportunity'/> - <field name='event'/> - <field name='case'/> - </group> - </group> - <group colspan="4" col="4"> - <separator string="Document" colspan="2"/> - <newline/> - <group colspan="2" col="4"> - <field name='folder'/> - <field name='document'/> - <field name='attachment'/> - </group> - </group> - <group colspan="4" col="4"> - <separator string="Others" colspan="4"/> - <field name='task' colspan="4"/> - </group> - </group> - <group colspan="4" col="2"> - <separator string="Email Notification When Import Finished" colspan="2"/> - <field name="email" colspan="2"/> - </group> - <group colspan="4" col="2"> - <separator string="Multi Instance Management" colspan="2"/> - <field name="instance_name" colspan="2"/> - </group> - <separator string="" colspan="4"/> - <group colspan="4" col="4"> - <group colspan="2"> + <form string="Import Data From Saleforce"> + <group colspan="4" col="8" width="850"> + <group colspan="2" > + <group colspan="2"> + <label align="1.0" string=" The Module bridges the Salesforce and OpenERP. Using the module SaleForce 'Leads', 'Opportunity', 'Contacts' , 'Cases', 'User', +'Events', 'Activity' and Other history Detail documents can be imported to OpenERP on single click."/> </group> + <separator string="" orientation="vertical" colspan="1" rowspan="22"/> + </group> + <group colspan="6" col="4"> + <group colspan="6" col="2"> + <separator string="Login Information" colspan="2"/> + <field name='name' required='True'/> + <field name='password' password='True' required='True'/> + <field name='token' required='True'/> + </group> + <group colspan="6" col="4"> + <group colspan="2" col="2"> + <separator string="Address Book :" colspan="2"/> + <group colspan="2" col="4"> + <field name="users" /> + <field name="contact"/> + <field name="account"/> + </group> + </group> + <group colspan="2" col="2"> + <separator string="CRM :" colspan="2"/> + <group colspan="2" col="4"> + <field name='lead' /> + <field name='event'/> + <field name='case'/> + </group> + </group> + <group colspan="2" col="2"> + <separator string="Document :" colspan="2"/> + <group colspan="2" col="4"> + <field name='folder'/> + <field name='document'/> + <field name='attachment'/> + </group> + </group> + <group colspan="2" col="2"> + <separator string="Miscellaneous :" colspan="2"/> + <group colspan="2" col="4"> + <field name='task'/> + <field name='product'/> + <field name='employee'/> + </group> + </group> + <group colspan="4" col="2"> + <separator string="Email Notification When Import Finished" colspan="2"/> + <field name="email" colspan="2"/> +<!-- <separator string="Multi Instance Management" colspan="2"/>--> + <field name="instance_name" colspan="2" invisible="1"/> + </group> + </group> + </group> + <separator string="" colspan="8"/> + <group colspan="4"/> + <group colspan="4"> + <button icon="gtk-cancel" special="cancel" string="_Cancel"/> <button string="Create _Recurrent Import" name="createCronJob" icon="gtk-new" type="object" /> - </group> - <group colspan="2" col="2"> - <button icon="gtk-cancel" special="cancel" string="_Cancel"/> <button icon="gtk-go-forward" string="_Import Once" name="import_all" type="object"/> </group> </group> @@ -85,9 +89,7 @@ </record> <!--wizard under importsalesforce menu--> - <menuitem id="menu_salesforce_service" name="Import Salesforce" parent="menu_salesforce" action="action_view_import_sf_webservice_form" icon="STOCK_EXECUTE"/> - - + <menuitem id="menu_salesforce_service" name="Import Salesforce" parent="menu_import" action="action_view_import_sf_webservice_form" icon="STOCK_EXECUTE"/> <record model="ir.ui.view" id="view_salesforce_login_services_form">
_______________________________________________ Mailing list: https://launchpad.net/~openerp-dev-gtk Post to : [email protected] Unsubscribe : https://launchpad.net/~openerp-dev-gtk More help : https://help.launchpad.net/ListHelp

