6 Commits 0135327dc1 ... 583a9e9e9e

Auteur SHA1 Bericht Datum
  odoo 583a9e9e9e [FIX] whatsapp_web: fix phone validation and align payload with wppconnect 1 maand geleden
  odoo 18b7b66855 Update whatsapp_web subtree from develop 2 maanden geleden
  odoo 218c34eebc Merge commit 'd8b06773a605e46f9e257586a49b9cea64e4f638' into TC 2 maanden geleden
  Roberto pineda c5dd4a027c fix field verification 9 maanden geleden
  Roberto pineda fdfef03029 fix 9 maanden geleden
  Roberto pineda 5c943c44fd fix 9 maanden geleden
2 gewijzigde bestanden met toevoegingen van 117 en 2 verwijderingen
  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)
+