Enviando SMS en forma masiva

Usando el API de SMSMasivos

Gustavo Orrillo
- 03/03/2021 - 1 min. de lectura


Un cliente que es una empresa de servicio (y realiza cientos de facturas mensuales) nos solicitó el envío automático de mensajes SMS. Probamos Twillio junto con MessageBird los cuales son excelentes, pero su costo en USD hace que su implementación sea prohibitiva. Es por ello que probamos el servicio del API de SMSMasivos, y la verdad vale la pena usarlo.

Pero vamos a la parte de Odoo, lo que nos pidió el cliente fue poder enviar para aquellas facturas impagas, un SMS con solo clickear un botón. Lo cual se traduce en un método del objeto account.move. El cual procederemos a detallar debajo:
class AccountMove(models.Model):
    _inherit = 'account.move'
    def send_sms_residual(self):
        API_URL = self.env['ir.config_parameter'].get_param('SMSMASIVOS_API_URL','')
        API_USER = self.env['ir.config_parameter'].get_param('SMSMASIVOS_API_USER','')
        API_PWD = self.env['ir.config_parameter'].get_param('SMSMASIVOS_API_PWD','')
        SMS_MESSAGE = self.env['ir.config_parameter'].get_param('SMSMASIVOS_MESSAGE','')
        client = zeep.Client(wsdl=API_URL)
        for rec in self:
            if rec.amount_residual > 100:
                rec.mercadopago_create_preference()
                message = SMS_MESSAGE.replace('#CLIENTE',rec.partner_id.display_name)
                message = message.replace('#MONTO',str(round(rec.amount_residual,0)))
                message = message.replace('#FACTURA',rec.name)
                message = message.replace('#LINK',rec.mercadopago_url)
                messages = message.split('#CORTE')
                result = ''
                for msg in messages:
                    msg = msg.replace('#CORTE','')
                    data = {'usuario': API_USER, 'clave': API_PWD, 'texto': msg, 'test': False}
                    mobile = rec.partner_id.mobile
                    mobile = mobile.replace('+','')
                    mobile = mobile.replace('-','')
                    mobile = mobile.replace(' ','')
                    try:
                        data['numero'] = int(mobile)
                    except:
                        raise ValidationError('Nro de telefono mal formateado %s'%(rec.partner_id.mobile))
                    res = client.service.EnviarSMS(**data)
        return True

Como verán el método usa la librería zeep, la cual es muy popular para acceder algunos webservices bastante conocidos, como los de SAP o los de factura electrónica. Y lo que hace es invocar el API de SMSMasivos. Los parametros los tomamos o de la factura, o del cliente (al que se le remueven caracteres extraños al teléfono) o de la tabla de parametros del sistema donde indicamos el usuario y password del servicio. Por último le agregamos el link de mercadopago asi puede pagar el cliente.

Algo a tener en cuenta, el mensaje de texto tiene tags que se reemplazan con valores de la factura; como por ejemplo el link de MercadoPago o el nro de la factura, o el nombre del cliente. Y despues podemos mandar multiples mensajes para una factura. En ese caso el mensaje se separa en multiples lineas, siendo el separador el tag #CORTE.

Bueno, esperamos que sea de su interes...

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.