jueves, 7 de julio de 2022

BOT Whatsapp de Reserva Cita para Hospitales , Clinicas.

 Hola a continuación le dejo material para que puedan implementar un BOT de Reserva de Cita Medica para hospitales clinicas y/o otros casos de uso donde se necesite trabajar con un horario empleando hoja de calculo google sheet.

¿ Deseas solo probarlo YA?

1) Ingresar a la siguiente pagina

https://anlusoftware.blogspot.com/

2) Seleccionar la opcion "GENERAR TOKEN WHATSAPP PARA BOT" y luego el BOT que deseas activar "Whatsapp chatbot reserva citas medicas con google sheets"


3) Si todo esta OK se le mostrara mensaje confirmacion

4) Conversele al numero de celular .

5) El BOT trabaja con la siguiente hoja sheet se iran almacenado los registros ahi,

https://docs.google.com/spreadsheets/d/1d1tq3Si4ubunzzXP-1D_wAqRXNH8GX0aqTgpdQt9_vM/edit?usp=sharing

¿ Necesitas implementarlo tu mismo para realizar cambios ?

- Crear la hoja Google sheet como indica el video 

         - Escanear la hoja para obtener token QR

         -  Whatsapp version android no business

Video Implementación


Página Excel Plantilla (BOT Texto)


https://docs.google.com/spreadsheets/d/1d1tq3Si4ubunzzXP-1D_wAqRXNH8GX0aqTgpdQt9_vM/edit?usp=sharing


Código AppScript 



var excel_qr = SpreadsheetApp.getActiveSpreadsheet();

var sheet_qr = excel_qr.getSheetByName("Configuracion");

var api_interna = "https://script.google.com/macros/s/AKfycbyoBhxuklU5D3LTguTcYAS85klwFINHxxd-FroauC4CmFVvS0ua/exec";

var appscript = sheet_qr.getRange(1, 2).getValue();


function onOpen() {

    createMenus();

}


function createMenus() {

    var menu = SpreadsheetApp.getUi().createMenu("Whatsapp");

    menu.addItem('1) Obtener TOKEN Session - QR Whatsapp', 'qrwhatsapp');

    menu.addItem('2) Habilitar BOT - Whatsapp', 'enviarconversacion');

    menu.addToUi();

}


function doPost(e) {


    var operacion = JSON.parse(e.postData.contents)

    var respuesta = "";

    if (operacion.op == "qr") {

        respuesta = generar(JSON.stringify(operacion));

    }

    if (operacion.op == "find_conversacion") {

        respuesta = find_conversacion(JSON.stringify(operacion));

    }

    return ContentService.createTextOutput(respuesta).setMimeType(ContentService.MimeType.JSON);

}


function generar(informacion) {

    try {

        var qr = JSON.parse(informacion);

        sheet_qr.getRange(2, 2).setValue(encodeURIComponent(qr.qr));

        var result, jo = {};

        if (qr.numero && qr.qr == "CONECTADO") {

            sheet_qr.getRange(3, 2).setValue(qr.session);

        }

        jo.status = '0';

        jo.message = ' Se grabo el registro';


    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }

    var result = JSON.stringify(jo);

    return result;

}

function qrwhatsapp() {

    var response = "No"

    try {

//        sheet_qr.getRange(3, 2).setValue("");

        var response = Browser.msgBox('Seguro que quiere generar QR ahora ?', Browser.Buttons.YES_NO);

    } catch (e) {

        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);

    }

    if (response == "yes") {

        enviar();

        Browser.msgBox('La acción ha sido realizada , escanear registros luego de 10 segundos', Browser.Buttons.OK);

    }

}

function enviar() {

  

    var payload = { "op": "iniciarqr", "app_script": appscript,"sheet_id":excel_qr.getId(), "fechahora": Utilities.formatDate(new Date(), "GMT-5", "yyMMddHHmmss") };

    var options =

    {

        'headers': { "Content-Type": "application/json" },

        'method': "POST",

        'payload': JSON.stringify(payload)

    };

    try {

        var response = UrlFetchApp.fetch(api_interna, options);

        var json = JSON.parse(response.getContentText());

    } catch (e) {

    }

}

function enviarconversacion() {

    var response = "No"

    var token_session = "";

    try {

        token_session = sheet_qr.getRange(3, 2).getValue();

        var response = Browser.msgBox('Seguro que quiere habilitar el BOT con la conversacion , el token de session sera : ' + token_session + ' ?', Browser.Buttons.YES_NO);

    } catch (e) {

        Browser.msgBox('La acción no se ha realizado', Browser.Buttons.OK);

    }

    if (response == "yes") {

        var datacategoria = [];

      var datafecha= [];

      var datahora= [];

        var datapago = [];

        var dataConversacion = [];

        if (excel_qr.getSheetByName("Conversacion")) {

            var sheet = excel_qr.getSheetByName("Conversacion");

            var rows = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues();

            for (var i = 0, l = rows.length; i < l; i++) {

                var dataRow = rows[i];

                var record = {};

                record['evento'] = dataRow[0];

                record['entrada'] = dataRow[1];

                record['salida'] = JSON.parse(dataRow[2]);

                record['retornar'] = dataRow[3];

                dataConversacion.push(record);

            }

        }

        if (excel_qr.getSheetByName("Especialidad")) {


            var sheet_producto = excel_qr.getSheetByName("Especialidad");

            var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues();

            for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) {

                var dataRow = rows_producto[i1];

                var record = {};

                record['mensaje'] =  "*"+(i1+1)+"* : "+dataRow[0]; 

                datacategoria.push(record);

            }

        }

        if (excel_qr.getSheetByName("Fecha")) {

            var sheet_sede = excel_qr.getSheetByName("Fecha");

            var rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues();

            for (var i2 = 0, l2 = rows_sede.length; i2 < l2; i2++) {

                var dataRow = rows_sede[i2];

                var record = {};

                record['mensaje'] =  "*"+(i2+1)+"* : "+dataRow[0]; 

                datafecha.push(record);

            }

        }

        var payload = { "op": "registermessage", "token_qr": token_session, "conversacion": dataConversacion };

      payload.data_1 =datacategoria;

      payload.data_2 =datafecha;

      payload.data_3 =datahora;

      payload.data_4 =datapago;

        var options =

        {

            'headers': { "Content-Type": "application/json" },

            'method': "POST",

            'payload': JSON.stringify(payload)

        };

        try {

            var response = UrlFetchApp.fetch(api_interna, options);

            var json = JSON.parse(response.getContentText());

            if (json.status == "0") {

                Browser.msgBox('Se habilito el BOT inicie la conversacion ', Browser.Buttons.OK);

            } else {

                Browser.msgBox('Error al iniciar : ' + json.message, Browser.Buttons.OK);

            }

        } catch (e) {

            Browser.msgBox('Se habilito el BOT inicie la conversacion ', Browser.Buttons.OK);

        }

    }

}


function find_conversacion(informacion) {

    var result, jo = {};

    try {

        var resultado = JSON.parse(informacion);

        var excel = SpreadsheetApp.getActiveSpreadsheet();

        var sheet = excel.getSheetByName("Configuracion");

        var sheet_sede = excel.getSheetByName("Solicitud");

        var rows_sede = "";

        if (sheet_sede.getLastRow() > 1) {

            rows_sede = sheet_sede.getRange(2, 1, sheet_sede.getLastRow() - 1, sheet_sede.getLastColumn()).getValues();

        }

        var numero = (resultado.numero).substring(0, (resultado.numero).lastIndexOf("@"));

        jo.status = '1';

        jo.message = "error";

        var sumary = "";

        var stadium = "";

        var dayss = "";

        var hourss = "";

        var payss = "";

        var codigo_pedido = sheet_sede.getLastRow();//new Date().getTime();

        var nombre_cliente = "";

        var codigo_pedido_cancelar = "";

        var ultimoevento = "";

        var fecha = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd HH:mm:ss");

        for (var ill = 0; ill < resultado.mensaje.length; ill++) {

            if (resultado.mensaje[ill].evento == "despues_nombre") {

                nombre_cliente = resultado.mensaje[ill].mensaje;

            }

            if (resultado.mensaje[ill].evento == "reserva_fecha") {

                /* se busca en las especialidad */

              var sheet_producto = excel.getSheetByName("Especialidad");

              var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues();

              for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) {

                if((""+(i1+1))==(""+resultado.mensaje[ill].mensaje)){

                  stadium = rows_producto[i1][0];

                  break;

                }  

              }                     

            }

            if (resultado.mensaje[ill].evento == "reserva_hora_buscar") {

               /* se busca en las fechas */

                  var sheet_producto = excel.getSheetByName("Fecha");

                  var rows_producto = sheet_producto.getRange(2, 1, sheet_producto.getLastRow() - 1, sheet_producto.getLastColumn()).getValues();

                  for (var i1 = 0, l1 = rows_producto.length; i1 < l1; i1++) {

                    if((""+(i1+1))==(""+resultado.mensaje[ill].mensaje)){

                       dayss = rows_producto[i1][0];

                       break;

                    }  

                  }

            }

            if (resultado.mensaje[ill].evento == "reserva_pago") {

                /* se busca en las horas */

                var sheet_hour = excel.getSheetByName("Hora");

                var rows_hour = sheet_hour.getRange(2, 1, sheet_hour.getLastRow() - 1, sheet_hour.getLastColumn()).getValues();

                var contador_hour=1;

                for (var i2 = 0, l2 = rows_hour.length; i2 < l2; i2++) {

                    var dataRow = rows_hour[i2];

                    if (dataRow[2] == stadium && dataRow[3] == dayss) {

                      if((""+(contador_hour))==(""+resultado.mensaje[ill].mensaje)){

                        hourss =rows_hour[i2][0];

                        break;

                      }

                      contador_hour=contador_hour+1;

                    }

                }

            }

            if (resultado.mensaje[ill].evento == "cerrar_reserva_cita") {

                /* se busca la forma de pago */

                var sheet_sumary = excel.getSheetByName("FormaPago");

                var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues();

                var contador_sumary=1;

                for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) {

                    var dataRow = rows_sumarry[i2];

                    if (dataRow[3] == stadium) {

                      if((""+(contador_sumary))==(""+resultado.mensaje[ill].mensaje)){

                        payss =rows_sumarry[i2][0];

                        break;

                      }

                      contador_sumary=contador_sumary+1;

                    }

               }              

            }

            if (resultado.mensaje[ill].evento == "cerrar_consulta_reserva") {

                codigo_pedido = (resultado.mensaje[ill].mensaje);

            }

            if (resultado.mensaje[ill].evento == "cerrar_cancelacion_reserva") {

                codigo_pedido_cancelar = resultado.mensaje[ill].mensaje;

            }

            ultimoevento = resultado.mensaje[ill].evento;

        }

      jo.status = '1';

        jo.message = ' No existe';

        if (ultimoevento == "Start") {

            if (rows_sede && rows_sede.length > 0) {

                for (var i2 = 0, l2 = rows_sede.length; i2 < l2; i2++) {

                    var dataRow = rows_sede[i2];

                    var record = {};

                    if ((dataRow[3] + "") == (numero + "")) {

                        jo.status = '0';

                        jo.message = ' Hola ' + dataRow[2] + " 🙋‍♂.";

                        jo.conversacion = { "mensaje": dataRow[2], "evento": "despues_nombre", "retornar": "reserva_categoria,1;consulta_reserva,2" };

                        break;

                    }

                }

            }

        } else if (ultimoevento == "cancelar_reserva") {

            var dataBooking_delete = [];

            if (excel.getSheetByName("Solicitud")) {

                var sheet_sumary = excel.getSheetByName("Solicitud");

                var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues();

                for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) {

                    var dataRow = rows_sumarry[i2];

                    var record = {};

                    try {

                        if (dataRow[3] == numero && dataRow[8] == "No confirmado" ) {//&& fecha_registro > fecha_comparar) {

                            record['mensaje'] = "*" + dataRow[0] + "* Especialidad : " + dataRow[4] + " Fecha :" + dataRow[5];//.substring(0, 10)

                            dataBooking_delete.push(record);

                        }

                    } catch (e1) { }

                }

            }

            jo.conversacion = { "mensaje": "@lst@", "evento": "cancelar_reserva_V2", "retornar": "cancelar_lista_reserva" };

            jo.status = '1';

            if (dataBooking_delete.length > 0) {

                jo.status = '0';

            }

            jo.data_4 = dataBooking_delete;

        } else if (ultimoevento == "cerrar_cancelacion_reserva") {

            if (excel.getSheetByName("Solicitud")) {

                var sheet_sumary = excel.getSheetByName("Solicitud");

                var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues();

                for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) {

                    var dataRow = rows_sumarry[i2];

                    var record = {};

                    if ((dataRow[0] + "") == (codigo_pedido_cancelar + "")) {

                        sheet_sumary.getRange(i2 + 2, 9).setValue("Cancelada");

                    }

                }

            }

            jo.message = "Cita Medica Numero : " + codigo_pedido_cancelar + " ha sido cancelado correctamente ✅";

            jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_cancelacion_reserva", "retornar": "Close" };

            jo.status = '0';

        } else if (ultimoevento == "reserva_hora_buscar") {

            var data_hora = [];

          if (excel.getSheetByName("Hora")) {

                var sheet_hour = excel.getSheetByName("Hora");

                var rows_hour = sheet_hour.getRange(2, 1, sheet_hour.getLastRow() - 1, sheet_hour.getLastColumn()).getValues();

                var contador_hour=1;

                for (var i2 = 0, l2 = rows_hour.length; i2 < l2; i2++) {

                    var dataRow = rows_hour[i2];

                    var record = {};

                    if (dataRow[2] == stadium && dataRow[3] == dayss) {

                        record['mensaje'] =  "*"+(contador_hour)+"* : "+dataRow[0]; 

                        data_hora.push(record);

                         contador_hour=contador_hour+1;

                    }

                }

            }

          

            var data_pago = [];

            if (excel.getSheetByName("FormaPago")) {

                var sheet_sumary = excel.getSheetByName("FormaPago");

                var rows_sumarry = sheet_sumary.getRange(2, 1, sheet_sumary.getLastRow() - 1, sheet_sumary.getLastColumn()).getValues();

               var contador_pago=1;

                for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) {

                    var dataRow = rows_sumarry[i2];

                    var record = {};

                    if (dataRow[3] == stadium) {

                        record['mensaje'] =  "*"+(contador_pago)+"* : "+dataRow[0]; 

                        data_pago.push(record);

                        contador_pago=contador_pago+1;

                    }

                }

            }

            jo.conversacion = { "mensaje": "@lst@", "evento": "reserva_hora_buscar_v2", "retornar": "reserva_hora" };

            jo.status = '0';

            jo.data_3 = data_hora;

            jo.data_4 = data_pago;

        } else if (ultimoevento == "cerrar_reserva_cita") {

            if (excel.getSheetByName("FormaPago")) {

                jo.message = "Oops, no entiendo 🤦🏻‍♂️";

                var sheet_sumarry = excel.getSheetByName("FormaPago");

                var rows_sumarry = sheet_sumarry.getRange(2, 1, sheet_sumarry.getLastRow() - 1, sheet_sumarry.getLastColumn()).getValues();

                for (var i2 = 0, l2 = rows_sumarry.length; i2 < l2; i2++) {

                    var dataRow = rows_sumarry[i2];

                    if (dataRow[0] == payss) {

                        jo.message = "Resumen de su cita medica :\nespecialidad: " + stadium + "\nFecha y Hora: " + dayss + " " + hourss + "\n" + payss + " " + dataRow[1] + "\n" + dataRow[2] + "\nNumero Cita Medica # " + codigo_pedido + " ✅" + "\n Cualquier cancelación de cita medica se debe realizar un dia antes de la fecha";

                        break;

                    }

                }

            }

            jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_reserva_cita", "retornar": "Close" };

            sheet_sede.appendRow([codigo_pedido, fecha, nombre_cliente, numero, stadium, "'"+dayss, hourss, payss, "No confirmado", JSON.stringify(resultado)])

            jo.status = '0';

        } else if (ultimoevento == "cerrar_consulta_reserva") {

            jo.message = "No existe ningun cita medica para el  # " + codigo_pedido + " ✅";

            if (rows_sede && rows_sede.length > 0) {

                for (var i = 0, l = rows_sede.length; i < l; i++) {

                    var dataRow = rows_sede[i];

                    if ((dataRow[0] + "") === "" + codigo_pedido) {

                        jo.message = "Cita Medica de " + dataRow[2] + "\nSituacion Cita Medica Numero " + codigo_pedido + "  ( " + dataRow[8] + " ) ✅";

                        break;

                    }

                }

            }

            jo.conversacion = { "mensaje": "@end@", "evento": "cerrar_consulta_reserva", "retornar": "Close" };

            jo.status = '0';

        }

    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }

    var result = JSON.stringify(jo);

    return result;

}


HABILITAR BOT 24 x 7 :

La solución BOT emplea Web Whatsapp  para recibir y enviar mensajes , por lo cual es necesario la contratación de un servidor para el BOT este operativo 24 x 7  , debido a ello existe un pago mensual de $ 8.00 .

IR a PAGAR 8 DOLARES

ASESORIA PERSONALIZADA :

En caso necesites alguna asesoría personalizada agéndame un espacio.

https://reservarasesoriaanlusoft.blogspot.com/


1 comentario:

  1. Hola me interesa obtener un chatbot personalizado por favor contactame a mi whatasaap +573164967424 muchas gracias

    ResponderEliminar

WHATSAPP BOT con IA GPT-4o

  Hola a continuación le dejo material para que puedan implementar un BOT whatsapp usando IA de Chat GPT modelo 4o Pasos: 1) Crear usuario y...