summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers/api_v1
diff options
context:
space:
mode:
authorMiqdad <ahmadmiqdad27@gmail.com>2025-06-09 17:35:22 +0700
committerMiqdad <ahmadmiqdad27@gmail.com>2025-06-09 17:35:22 +0700
commit5f5753dbec8af518dd34821820462cd6340a2a08 (patch)
tree09c2bd8a52124700e74a4b512267d215c2e23421 /indoteknik_api/controllers/api_v1
parent1bd3a91889f8616d7042c0d15315c2f25c974ed3 (diff)
<miqdad> wati leads
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
-rw-r--r--indoteknik_api/controllers/api_v1/wati.py171
1 files changed, 167 insertions, 4 deletions
diff --git a/indoteknik_api/controllers/api_v1/wati.py b/indoteknik_api/controllers/api_v1/wati.py
index 68ff1640..d60cd160 100644
--- a/indoteknik_api/controllers/api_v1/wati.py
+++ b/indoteknik_api/controllers/api_v1/wati.py
@@ -2,19 +2,182 @@ from .. import controller
from odoo import http
from odoo.http import request
import json
+import logging
+_logger = logging.getLogger(__name__)
-class Wati(controller.Controller):
+
+# class Wati(controller.Controller):
+# prefix = '/api/v1/'
+#
+# @http.route(prefix + 'wati/notification', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS'])
+# def notification(self, **kw):
+# json_raw = json.loads(request.httprequest.data)
+# json_dump = json.dumps(json_raw, indent=4, sort_keys=True)
+#
+# request.env['wati.notification'].create([{
+# 'json_raw': json_dump,
+# 'is_lead': False
+# }])
+#
+# return
+
+# REPLACE webhook controller yang sudah ada dengan ini:
+
+class Wati(http.Controller):
prefix = '/api/v1/'
- @http.route(prefix + 'wati/notification', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS'])
+ @http.route(prefix + 'wati/notification', auth='none', type='json', csrf=False, cors='*',
+ methods=['POST', 'OPTIONS'])
def notification(self, **kw):
json_raw = json.loads(request.httprequest.data)
json_dump = json.dumps(json_raw, indent=4, sort_keys=True)
- request.env['wati.notification'].create([{
+ # Create notification record (existing)
+ notification = request.env['wati.notification'].create([{
'json_raw': json_dump,
'is_lead': False
}])
- return
+ # NEW: Immediate tags check
+ phone = json_raw.get('waId') or json_raw.get('from')
+
+ if phone:
+ lead_id = self._check_tags_immediate(phone, notification[0])
+
+ if lead_id:
+ notification.write({'is_lead': True, 'lead_id': lead_id})
+ _logger.info('🚀 Lead created immediately via webhook: %s' % lead_id)
+
+ return {'status': 'success'}
+
+ def _check_tags_immediate(self, phone, notification):
+ """Check tags untuk specific phone - immediate"""
+ try:
+ _logger.info('📱 Immediate tags check for: %s' % phone)
+
+ # Get contact dari WATI untuk phone ini
+ wati_api = request.env['wati.api']
+
+ params = {
+ 'pageSize': 1,
+ 'pageNumber': 1,
+ 'attribute': json.dumps([
+ {'name': "phone", 'operator': "contain", 'value': phone}
+ ]),
+ }
+
+ result = wati_api.http_get('/api/v1/getContacts', params)
+
+ if isinstance(result, dict) and result.get('result') == 'success':
+ contact_list = result.get('contact_list', [])
+
+ if contact_list:
+ contact = contact_list[0]
+
+ # Check if has tags=leads
+ if self._contact_has_tags_leads(contact):
+ # Check existing lead
+ existing_lead = request.env['crm.lead'].search([('phone', '=', phone)], limit=1)
+
+ if existing_lead:
+ _logger.info('✅ Lead already exists for %s' % phone)
+ return existing_lead.id
+
+ # Create new lead
+ lead_id = self._create_lead_from_webhook(contact)
+ if lead_id:
+ _logger.info('🎯 Created new lead %s from webhook tags' % lead_id)
+ return lead_id
+
+ return None
+
+ except Exception as e:
+ _logger.error('❌ Error in immediate tags check: %s' % str(e))
+ return None
+
+ def _contact_has_tags_leads(self, contact):
+ """Check if contact has tags=leads"""
+ custom_params = contact.get('customParams', [])
+
+ for param in custom_params:
+ if (param.get('name', '').lower() == 'tags' and
+ param.get('value', '').lower() == 'leads'):
+ return True
+
+ return False
+
+ def _create_lead_from_webhook(self, contact):
+ """Create lead dari webhook data"""
+ try:
+ phone = contact.get('phone', '')
+
+ # Extract data dari customParams
+ custom_params = contact.get('customParams', [])
+ contact_data = {}
+
+ for param in custom_params:
+ param_name = param.get('name', '').lower()
+ param_value = param.get('value', '').strip()
+
+ if param_name == 'perusahaan':
+ contact_data['perusahaan'] = param_value
+ elif param_name == 'name':
+ contact_data['name'] = param_value
+ elif param_name == 'email':
+ contact_data['email'] = param_value
+ elif param_name == 'sales':
+ contact_data['sales'] = param_value
+ elif param_name == 'notes':
+ contact_data['notes'] = param_value
+
+ # Generate lead name
+ company_name = contact_data.get('perusahaan', '')
+ contact_name = contact_data.get('name', '') or contact.get('name', '')
+
+ if company_name:
+ lead_name = 'WATI Lead (Webhook) - %s' % company_name
+ elif contact_name:
+ lead_name = 'WATI Lead (Webhook) - %s' % contact_name
+ else:
+ lead_name = 'WATI Lead (Webhook) - %s' % phone
+
+ # Get salesperson
+ sales_name = contact_data.get('sales', '')
+ user_id = 2 # Default
+
+ if sales_name:
+ user = request.env['res.users'].search([('name', 'ilike', sales_name)], limit=1)
+ if user:
+ user_id = user.id
+
+ # Create lead
+ lead_vals = {
+ 'name': lead_name,
+ 'phone': phone,
+ 'contact_name': contact_name,
+ 'partner_name': company_name,
+ 'email_from': contact_data.get('email', ''),
+ 'description': contact_data.get('notes', 'Lead created from WATI webhook (real-time)'),
+ 'type': 'lead',
+ 'user_id': user_id,
+ }
+
+ new_lead = request.env['crm.lead'].create(lead_vals)
+
+ # Create activity untuk follow up
+ request.env['mail.activity'].create({
+ 'activity_type_id': request.env.ref('mail.mail_activity_data_todo').id,
+ 'summary': '🚨 URGENT: New WATI Lead (Real-time)',
+ 'note': 'Lead created instantly from WATI webhook when tags=leads was added. Immediate follow up required!',
+ 'res_id': new_lead.id,
+ 'res_model_id': request.env.ref('crm.model_crm_lead').id,
+ 'user_id': user_id,
+ 'date_deadline': fields.Date.today(),
+ })
+
+ return new_lead.id
+
+ except Exception as e:
+ _logger.error('❌ Error creating lead from webhook: %s' % str(e))
+ return None \ No newline at end of file