6 Commits 0135327dc1 ... 583a9e9e9e

Tác giả SHA1 Thông báo Ngày
  odoo 583a9e9e9e [FIX] whatsapp_web: fix phone validation and align payload with wppconnect 3 tháng trước cách đây
  odoo 18b7b66855 Update whatsapp_web subtree from develop 3 tháng trước cách đây
  odoo 218c34eebc Merge commit 'd8b06773a605e46f9e257586a49b9cea64e4f638' into TC 3 tháng trước cách đây
  Roberto pineda c5dd4a027c fix field verification 11 tháng trước cách đây
  Roberto pineda fdfef03029 fix 11 tháng trước cách đây
  Roberto pineda 5c943c44fd fix 11 tháng trước cách đây
2 tập tin đã thay đổi với 117 bổ sung2 xóa
  1. 5 2
      models/whatsapp_message.py
  2. 112 0
      models/whatsapp_patch.py

+ 5 - 2
models/whatsapp_message.py

@@ -242,8 +242,10 @@ class WhatsAppMessage(models.Model):
                 file_base64 = base64.b64encode(attachment.raw).decode('utf-8')
                 base64_with_prefix = f"data:{mimetype};base64,{file_base64}"
                 
+                # En wppconnect-server send-image/file espera 'phone' (singular) o 'phone' (array)
+                # Para consistencia con wpp.js, usamos la misma estructura
                 payload = {
-                    "phone": [number],  # Array para send-image/send-file
+                    "phone": number,  
                     "base64": base64_with_prefix,
                     "filename": attachment.name or "file",
                     "caption": body,
@@ -254,8 +256,9 @@ class WhatsAppMessage(models.Model):
                     payload["quotedMessageId"] = parent_message_id
             else:
                 # Mensaje de texto
+                # Alineación con wpp.js: phone, message, isGroup
                 payload = {
-                    "phone": number,  # String para send-message
+                    "phone": number,  
                     "message": body,
                     "isGroup": is_group
                 }

+ 112 - 0
models/whatsapp_patch.py

@@ -47,3 +47,115 @@ try:
     
 except ImportError as e:
     _logger.warning("No se pudo aplicar el parche para _post_whatsapp_reaction: %s", e)
+
+# Parche para el método wa_phone_format de phone_validation para evitar AttributeError
+try:
+    from odoo.addons.whatsapp.tools import phone_validation
+    
+    # Guardar referencia al método original
+    original_wa_phone_format = phone_validation.wa_phone_format
+    
+    def custom_wa_phone_format(record, fname=False, number=False, country=None,
+                    force_format="INTERNATIONAL", raise_exception=True):
+        """Parche para evitar AttributeError: 'bool' object has no attribute 'italian_leading_zero'"""
+        
+        # Ejecutar lógica original, pero capturando errores
+        try:
+            # Reimplementar la parte final del método original que falla
+            # Primero llamamos al método original, si funciona, perfecto
+            return original_wa_phone_format(record, fname, number, country, force_format, raise_exception)
+        except AttributeError as e:
+            if "italian_leading_zero" in str(e):
+                _logger.warning("Capturado AttributeError en wa_phone_format, intentando recuperación segura: %s", e)
+                
+                # Intentar replicar la lógica segura aquí si es necesario
+                # Por ahora, simplemente devolvemos el número formateado si es posible obtenerlo
+                # o relanzamos si no podemos manejarlo
+                
+                # Obtener el número base
+                if not number and record and fname:
+                    record.ensure_one()
+                    number = record[fname]
+                
+                if not number:
+                    return False
+                
+                # Si llegamos aquí es porque falló el acceso a atributos de parsed
+                # Devolvemos el número original o intentamos un formateo básico
+                return number
+            raise e
+            
+    # Una mejor aproximación: Monkey Patch directo a la función interna si es posible,
+    # o redefinir completamente la función si el error está dentro de ella y no podemos envolverla fácilmente.
+    # Dado que el error ocurre DENTRO de la función original al acceder a parsed.italian_leading_zero,
+    # necesitamos redefinir la función completa para corregir el acceso al atributo.
+    
+    def safe_wa_phone_format(record, fname=False, number=False, country=None,
+                        force_format="INTERNATIONAL", raise_exception=True):
+        """Versión segura de wa_phone_format que maneja correctamente los atributos de parsed"""
+        
+        # Importar dependencias necesarias
+        from odoo.addons.phone_validation.tools import phone_validation as pv_tools
+        
+        if not number and record and fname:
+            record.ensure_one()
+            number = record[fname]
+        if not number:
+            return False
+
+        if not country and record:
+            country = record._phone_get_country().get(record.id)
+        if not country:
+            country = record.env.company.country_id
+
+        try:
+            formatted = pv_tools.phone_format(
+                number,
+                country.code,
+                country.phone_code,
+                force_format=force_format if force_format != "WHATSAPP" else "E164",
+                raise_exception=True,
+            )
+        except Exception:
+            if raise_exception:
+                raise
+            formatted = False
+
+        if formatted and force_format == "WHATSAPP":
+            try:
+                parsed = pv_tools.phone_parse(formatted, country.code)
+            except Exception:
+                if raise_exception:
+                    raise
+                return False
+            
+            zeros = ''
+            # USO SEGURO DE ATRIBUTOS (Corrección del bug original)
+            if getattr(parsed, 'italian_leading_zero', False):
+                zeros = '0'
+                if getattr(parsed, 'number_of_leading_zeros', False):
+                    zeros = '0' * parsed.number_of_leading_zeros
+            
+            # Verificación adicional para country_code y national_number
+            country_code = getattr(parsed, 'country_code', '')
+            national_number = getattr(parsed, 'national_number', '')
+            
+            if not country_code or not national_number:
+                 # Si no se pueden obtener estos datos, intentar usar el formatted original o un fallback
+                 if formatted:
+                     return formatted
+                 return number
+
+            return f'{country_code}' + zeros + f'{national_number}'
+        
+        return formatted
+
+    # Aplicar el parche reemplazando la función en el módulo
+    phone_validation.wa_phone_format = safe_wa_phone_format
+    _logger.info("Parche aplicado exitosamente para phone_validation.wa_phone_format")
+
+except ImportError as e:
+    _logger.warning("No se pudo aplicar el parche para phone_validation: %s", e)
+except Exception as e:
+    _logger.warning("Error al aplicar parche para phone_validation: %s", e)
+