diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-06-09 17:35:22 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-06-09 17:35:22 +0700 |
| commit | 5f5753dbec8af518dd34821820462cd6340a2a08 (patch) | |
| tree | 09c2bd8a52124700e74a4b512267d215c2e23421 /indoteknik_custom/models | |
| parent | 1bd3a91889f8616d7042c0d15315c2f25c974ed3 (diff) | |
<miqdad> wati leads
Diffstat (limited to 'indoteknik_custom/models')
| -rw-r--r-- | indoteknik_custom/models/wati.py | 166 |
1 files changed, 165 insertions, 1 deletions
diff --git a/indoteknik_custom/models/wati.py b/indoteknik_custom/models/wati.py index a0619f83..18517502 100644 --- a/indoteknik_custom/models/wati.py +++ b/indoteknik_custom/models/wati.py @@ -201,6 +201,170 @@ class WatiNotification(models.Model): wati.is_lead = True wati.lead_id = current_lead.id + # FINAL CODE - Sesuai dengan mapping table Anda + + def check_wati_tags_leads(self): + """Check tags 'leads' di WATI dan create leads di Odoo - Final Version""" + _logger.info('=== Starting WATI Tags Check (Final) ===') + + wati_api = self.env['wati.api'] + total_leads_created = 0 + + try: + # Get WATI contacts + wati_contacts = wati_api.http_get('/api/v1/getContacts', {'pageSize': 100, 'pageNumber': 1}) + + if isinstance(wati_contacts, dict) and wati_contacts.get('result') == 'success': + contact_list = wati_contacts.get('contact_list', []) + + for contact in contact_list: + if self._create_lead_if_tagged(contact): + total_leads_created += 1 + + _logger.info('WATI check completed: %s leads created' % total_leads_created) + return {'leads_created': total_leads_created} + + except Exception as e: + _logger.error('Error in WATI tags check: %s' % str(e)) + return {'leads_created': 0, 'error': str(e)} + + def _create_lead_if_tagged(self, contact): + """Create lead jika contact punya tags=leads - Sesuai Mapping Table""" + try: + # Check tags leads + if not self._has_tags_leads(contact): + return False + + phone = contact.get('phone', '') + if not phone: + return False + + # Check existing lead by phone + existing_lead = self.env['crm.lead'].search([('phone', '=', phone)], limit=1) + if existing_lead: + _logger.info('Lead already exists for phone %s' % phone) + return False + + # Extract data dari customParams sesuai mapping table + custom_params = contact.get('customParams', []) + contact_data = self._extract_contact_data(custom_params) + + # Create lead dengan field mapping yang sesuai + lead_vals = { + 'name': self._generate_lead_name(contact_data, contact), + 'phone': phone, # Phone Number → Mobile + 'contact_name': contact_data.get('name', ''), # Name → Contact Name + 'partner_name': contact_data.get('perusahaan', ''), # Perusahaan → Company Name + 'email_from': contact_data.get('email', ''), # Email → Email + 'description': contact_data.get('notes', ''), # Notes → Internal Notes + 'type': 'lead', + 'user_id': self._get_salesperson_id(contact_data.get('sales', '')), # Sales → Salesperson + } + + new_lead = self.env['crm.lead'].create(lead_vals) + _logger.info('Created WATI lead %s for %s (%s)' % (new_lead.id, contact_data.get('name', 'Unknown'), phone)) + return True + + except Exception as e: + _logger.error('Error creating lead: %s' % str(e)) + return False + + def _extract_contact_data(self, custom_params): + """Extract data dari customParams sesuai mapping table""" + contact_data = {} + + for param in custom_params: + param_name = param.get('name', '').lower() + param_value = param.get('value', '').strip() + + # Mapping sesuai table: + if param_name == 'perusahaan': # Perusahaan → Company Name + contact_data['perusahaan'] = param_value + elif param_name == 'name': # Name → Contact Name + contact_data['name'] = param_value + elif param_name == 'email': # Email → Email + contact_data['email'] = param_value + elif param_name == 'sales': # Sales → Salesperson + contact_data['sales'] = param_value + elif param_name == 'notes': # Notes → Internal Notes + contact_data['notes'] = param_value + # Phone Number sudah diambil dari contact.phone + + return contact_data + + def _generate_lead_name(self, contact_data, contact): + """Generate lead name sesuai mapping: Judul Leads berdasarkan company/contact""" + company_name = contact_data.get('perusahaan', '') + contact_name = contact_data.get('name', '') or contact.get('name', '') + + if company_name: + return 'WATI Lead - %s' % company_name + elif contact_name: + return 'WATI Lead - %s' % contact_name + else: + return 'WATI Lead - %s' % contact.get('phone', 'Unknown') + + def _get_salesperson_id(self, sales_name): + """Get salesperson ID dari nama - Sales → Salesperson""" + if not sales_name: + return 2 # Default Sales (ID 2) + + # Try find user by name + user = self.env['res.users'].search([ + ('name', 'ilike', sales_name) + ], limit=1) + + if user: + return user.id + else: + # Fallback ke default Sales + return 2 + + def _has_tags_leads(self, contact): + """Check apakah ada tags untuk tajik ke odoo => Leads""" + custom_params = contact.get('customParams', []) + + for param in custom_params: + param_name = param.get('name', '').lower() + param_value = param.get('value', '').lower() + + # Check: "Judul Tags untuk tajik ke odoo => Leads" + if param_name == 'tags' and param_value == 'leads': + return True + + return False + + def manual_check_tags(self): + """Manual trigger untuk testing""" + result = self.check_wati_tags_leads() + + message = 'WATI Tags Check Completed!\n\n' + message += 'Leads Created: %s\n\n' % result.get('leads_created', 0) + message += 'Field Mapping:\n' + message += '• Perusahaan → Company Name\n' + message += '• Name → Contact Name\n' + message += '• Email → Email\n' + message += '• Sales → Salesperson\n' + message += '• Phone Number → Mobile\n' + message += '• Notes → Internal Notes\n' + message += '• Tags=leads → Trigger Lead Creation' + + if result.get('error'): + message += '\n\nError: %s' % result['error'] + message_type = 'warning' + else: + message_type = 'success' + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': 'WATI Tags Check', + 'message': message, + 'type': message_type, + 'sticky': True, + } + } class WatiHistory(models.Model): _name = 'wati.history' @@ -319,4 +483,4 @@ class WatiHistoryLine(models.Model): ticket_id = fields.Char(string='Ticket ID') type = fields.Char(string='Type') wa_id = fields.Char(string='WA ID') - date_wati = fields.Datetime(string='Date WATI') + date_wati = fields.Datetime(string='Date WATI')
\ No newline at end of file |
