4
0

6 کامیت‌ها 0135327dc1 ... 583a9e9e9e

نویسنده SHA1 پیام تاریخ
  odoo 583a9e9e9e [FIX] whatsapp_web: fix phone validation and align payload with wppconnect 3 ماه پیش
  odoo 18b7b66855 Update whatsapp_web subtree from develop 3 ماه پیش
  odoo 218c34eebc Merge commit 'd8b06773a605e46f9e257586a49b9cea64e4f638' into TC 3 ماه پیش
  Roberto pineda c5dd4a027c fix field verification 11 ماه پیش
  Roberto pineda fdfef03029 fix 11 ماه پیش
  Roberto pineda 5c943c44fd fix 11 ماه پیش
2فایلهای تغییر یافته به همراه117 افزوده شده و 2 حذف شده
  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)
+