Mostrando entradas con la etiqueta tienda virtual. Mostrar todas las entradas
Mostrando entradas con la etiqueta tienda virtual. Mostrar todas las entradas

martes, 11 de octubre de 2022

Tienda online confirmación pedido whatsapp

 A continuación se muestra una solución  de una tienda online con confirmacion del pedido como mensaje a whatsapp  se emplea google APP Script, google Sheet, blogger , esta realizada con HTML 5 Responsive - Jquery se alinea a diversos tipos de navegadores Web y Mobile.

¿ Que necesitas para implementarlo ?

- SOLO  una cuenta de GMAIL

- Abrir URL Blogger

LINK APLICACIÓN :

https://carritoventaswhatsapp.blogspot.com/

EXCEL APLICACIÓN :

https://docs.google.com/spreadsheets/d/19SO8cTBJlzrDHNiQ2CR9qEFtso8BqYXj8ZkEq6jff1I/edit?usp=sharing

VIDEO APLICACION :

FUENTES APLICACIÓN :

Para obtener las fuentes tiene un costo $ 4.00.

IR a PAGAR 4 DOLARES

NOTA : Luego del pago se redireccionara a una carpeta para descargar las fuentes

ASESORIA PERSONALIZADA :

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

https://reservarasesoriaanlusoft.blogspot.com/

martes, 12 de julio de 2022

BOT Whatsapp de Tienda Virtual

 Hola a continuación le dejo material para que puedan implementar un BOT de Tienda Virtual  y/o otros casos de uso donde se necesite trabajar con un carrito de compras 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 tienda virtual 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/1S27B72AnvOTfGrCnV5n1HJEKKFeUVGeQxkI8Q2l8qdc/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 (texto)


https://docs.google.com/spreadsheets/d/1S27B72AnvOTfGrCnV5n1HJEKKFeUVGeQxkI8Q2l8qdc/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));

    }

  

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

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

  }

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

}


function find_conversacion(informacion) {


    try {

        var result, jo = {};

        var venta = JSON.parse(informacion);

        var excel = SpreadsheetApp.getActiveSpreadsheet();

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

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

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

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

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

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

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

        var fecha_solicitud = "." + Utilities.formatDate(new Date(), "GMT", "yy-MM-dd HH:mm");

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

        var ultimoevento = "";

        var descripcion_producto = "";

        var nombre_cliente = "";

        var sede_cliente="";

        var envio_cliente="Recogo Tienda";

        var ubicacion_delivery="";

        var direccion_delivery="";

        var codigo_producto="";

        var productos=[];

        var descripcion_sede_nombre="";

        var descripcion_sede_ubicacion="";

        var descripcion_sede_encargado="";

        var mensaje_asesor="";

        var codigo_pedido = "P_"+(Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000); //Utilities.formatDate(new Date(), "GMT", "HHmm");

        var descripcion_producto="";

        var nombre_archivo ="";

        var data_archivo ="";

        var tipo_archivo ="";      

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

            if (venta.mensaje[ill].evento == "Producto") {

                codigo_producto = venta.mensaje[ill].mensaje;

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

                    if (("" + codigo_producto) == (rows_producto[i][0] + "")) {

                      productos.push({"codigo":codigo_producto,"descripcion":rows_producto[i][1],"precio":rows_producto[i][3],"moneda":rows_producto[i][2]});

                      break;

                    }

                }

            }

            if (venta.mensaje[ill].evento == "Finalizar_Informacion_producto") {

                codigo_producto = venta.mensaje[ill].mensaje;

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

                    if (("" + codigo_producto) == (rows_producto[i][0] + "")) {

                      descripcion_producto="*Producto* : "+rows_producto[i][1]+"\n*Precio* : "+rows_producto[i][2]+" "+rows_producto[i][3]+"\n"+rows_producto[i][4];

                      descripcion_producto += ";*IMAGES*;"+rows_producto[i][6]+"";

                      break;

                    }

                }

            }

            if (venta.mensaje[ill].evento == "Continuar Pedido") {

                productos[productos.length-1].cantidad = venta.mensaje[ill].mensaje;

            }

            

           if(venta.mensaje[ill].evento=="Seleccionar_Sedes"){

             nombre_cliente=venta.mensaje[ill].mensaje;

           }

          if(venta.mensaje[ill].evento=="MenuInicio" || venta.mensaje[ill].evento=="Finalizar_Tu_Ubicacion"){

            sede_cliente=venta.mensaje[ill].mensaje;

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

                    if (("" + sede_cliente) == (rows_sede[i][0] + "")) {

                      descripcion_sede_nombre=rows_sede[i][1];

                      descripcion_sede_ubicacion=rows_sede[i][2];

                      descripcion_sede_encargado=rows_sede[i][3];

                      break;

                    }

            }          

          }

        

          if(venta.mensaje[ill].evento=="Delivery_Pedido"){

            envio_cliente="Delivery";

          }

          if(venta.mensaje[ill].evento=="Finalizar_Terminar_Pedido"){            

            if(venta.mensaje[ill].mensaje==="ubicacion_send"){

              ubicacion_delivery=venta.mensaje[ill].documento.latitud+","+venta.mensaje[ill].documento.longitud;

              var response = Maps.newGeocoder().reverseGeocode(venta.mensaje[ill].documento.latitud,venta.mensaje[ill].documento.longitud);

              for (var iz = 0; iz < response.results.length; iz++) {

                direccion_delivery= response.results[iz].formatted_address;

                break;

              }

            }

          }

          

          if(venta.mensaje[ill].evento=="Finalizar_Enviar_voucher"){            

            if(venta.mensaje[ill].mensaje==="documento_send"){

             nombre_archivo =venta.mensaje[ill].documento.filename;

             data_archivo =venta.mensaje[ill].documento.data;

             tipo_archivo =venta.mensaje[ill].documento.mimetype;

            }

          }

             

          

          if(venta.mensaje[ill].evento=="Finalizar_Consulta_Pedido"){

            codigo_pedido=venta.mensaje[ill].mensaje;

          }

          if(venta.mensaje[ill].evento=="Adjuntar_Enviar_voucher"){

            codigo_pedido=venta.mensaje[ill].mensaje;

          }

          if(venta.mensaje[ill].evento=="Finalizar_Hablar_con_asesor"){

            mensaje_asesor=venta.mensaje[ill].mensaje;

          }

            ultimoevento = venta.mensaje[ill].evento;

        }

      

        var mensaje_detalle="Tu detalle es :\n";

        if(ultimoevento == "Mostrar_Detalle_Pedido"  || ultimoevento == "Finalizar_Terminar_Pedido"){

          var total=0.0;

          var moneda="";          

          for (var i = 0; i < productos.length; i++) {

            mensaje_detalle+="*"+productos[i].descripcion+"* Cant."+ productos[i].cantidad+" x "+productos[i].moneda+""+productos[i].precio+"\n";

            var subtotal=Number.parseFloat(productos[i].cantidad)*Number.parseFloat(productos[i].precio);

            total=Number.parseFloat(Number.parseFloat(total)+Number.parseFloat(subtotal)).toFixed(2);

            moneda=productos[i].moneda;

            if(ultimoevento == "Finalizar_Terminar_Pedido"){

              for (var ij = 0, lj = rows_producto.length; ij < lj; ij++) {

                    if (("" + productos[i].descripcion) == (rows_producto[ij][1] + "")) {

                      var stock_actualizar = parseInt(rows_producto[ij][5])-parseInt(productos[i].cantidad);

                      sheet_producto.getRange(ij+2, 6).setValue(stock_actualizar);

                      break;

                    }

              }

            }

          }

          mensaje_detalle+="*Total* :"+moneda+""+total;

        }  

        if (ultimoevento == "Mostrar_Detalle_Pedido") {

          jo.status = '0';

          jo.message = mensaje_detalle;

          jo.conversacion = { "mensaje": "", "evento": "Mostrar_Detalle_Pedido_Informacion", "retornar": "OpcionTipoEnvio" };

        }

        if (ultimoevento == "Finalizar_Terminar_Pedido") {

          sheet.appendRow([codigo_pedido,fecha,nombre_cliente,numero,descripcion_sede_nombre,mensaje_detalle,'Pendiente',envio_cliente,direccion_delivery,ubicacion_delivery,"",JSON.stringify(venta.mensaje)]);

          jo.status = '0';

          jo.message = "Su pedido ha sido registrado✅😃\nUn asesor se comunicara contigo en breve, su codigo de seguimiento es *"+codigo_pedido+"*\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

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

        }

        if (ultimoevento == "Finalizar_Tu_Ubicacion") {

          jo.status = '0';

          var mensaje_sede="No existe la sede seleccionada ✅😃";

          if(sede_cliente!=""){

            mensaje_sede="*Sede* :"+descripcion_sede_nombre+"\n*Ubicacion* : "+descripcion_sede_ubicacion+"\n*Encargado* : "+descripcion_sede_encargado;

          }

          jo.message = mensaje_sede;

          jo.conversacion = { "mensaje": "", "evento": "Finalizar_Tu_Ubicacion_informacion", "retornar": "Finalizar_Tu_Ubicacion_Menu" };

        }      

        if (ultimoevento == "Finalizar_Informacion_producto") {

          jo.status = '0';

          var mensaje_producto="No existe el producto seleccionado ✅😃";

          if(descripcion_producto!=""){

            mensaje_producto=descripcion_producto;

          }

          jo.message = mensaje_producto;

          jo.conversacion = { "mensaje": "", "evento": "Finalizar_Informacion_producto_informacion", "retornar": "Finalizar_Informacion_producto_Menu" };

        }      

      

         if(ultimoevento=="Finalizar_Hablar_con_asesor"){

           

          jo.status = '0';

          jo.message = "Se ha registrado el mensaje ✅😃\nUn asesor se comunicara contigo en breve\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

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

          var sheet_solicitud =excel.getSheetByName("Solicitud_asesor");

          sheet_solicitud.appendRow([fecha,nombre_cliente,descripcion_sede_nombre,numero,mensaje_asesor,'Pendiente',JSON.stringify(venta.mensaje)])

       } 

      

         if(ultimoevento=="Finalizar_Consulta_Pedido"){

          var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃";

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

           if(rows){

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

               var dataRow = rows[i];

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

                 mensaje_consulta = "El pedido # *"+codigo_pedido+"* ( "+dataRow[6]+" )\n";

                 mensaje_consulta+= dataRow[5];

                 break;

               }  

             }

          }

          mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.status = '0';

          jo.message = mensaje_consulta;

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

       }

      

       if(ultimoevento=="Finalizar_Enviar_voucher"){

          var mensaje_consulta="No existe pedido # *"+codigo_pedido+"* ✅😃";

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

           if(rows){

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

               var dataRow = rows[i];

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


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

                 var folderurl_completo = sheet_parametro.getRange(4, 2).getValue();   

                 var folderurl_texto= (folderurl_completo).substring((folderurl_completo).lastIndexOf("/") + "/".length, (folderurl_completo).length);

                 var folderurl=(folderurl_texto.split("?"))[0];

                 var folder_ = DriveApp.getFolderById(folderurl); 

                 var nombre_archivo_="ARCHIVO_"+codigo_pedido+".png";

                 if(nombre_archivo){

                   nombre_archivo_ =nombre_archivo;

                 }

                 var decoded = Utilities.base64Decode(data_archivo);

                 var image = Utilities.newBlob(decoded,tipo_archivo,nombre_archivo_);

                 // SE CREA EL ARCHIVO

                 var file = folder_.createFile(image);

                 var files_ = folder_.getFilesByName(nombre_archivo_);

                 var urlfile ="";

                 while (files_.hasNext()) {

                   var archivo_=files_.next();          

                   urlfile = archivo_.getUrl();

                 }

                 var range = sheet.getRange(i+2, 11);

                 var richValue = SpreadsheetApp.newRichTextValue().setText(nombre_archivo_).setLinkUrl(urlfile).build();

                 range.setRichTextValue(richValue);


                 mensaje_consulta = "El pedido # *"+codigo_pedido+"* se actualizo el voucher pago \n";

                 mensaje_consulta+= dataRow[5];

                 break;

               }  

             }

          }

          mensaje_consulta+="\nGracias , espero haberte ayudado 👋 , tu BOT VIrtual : 🤖👇.";

          jo.status = '0';

          jo.message = mensaje_consulta;

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

       }

      

    } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

    }


    var result = JSON.stringify(jo);

    sheet_qr.getRange(9, 5).setValue(result);


    return result;

}



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 find_word(informacion){

    var result,jo={};

    try{

        var resultado = JSON.parse(informacion);

        var excel= SpreadsheetApp.getActiveSpreadsheet(); 

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

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

        jo.status = '1';

        jo.message = ' No existe'; 

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

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

          var dataRow = rows_sede[i2];

          var record = {};

          if((dataRow[3]+"")==(numero+"") && resultado.mensaje=="Por favor ingrese tu nombre 🙋‍♂."){

            jo.status = '0';

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

            jo.conversacion={"mensaje":dataRow[2],"evento":"Seleccionar_Sedes","retornar":"MenuInicio"};            

            break;

          }

        }

      } catch (e) {

        jo.status = '-1';

        jo.message = e.toString();

      } 

    var result = JSON.stringify(jo); 

    return result;

  

}


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 dataConversacion = [];

   var dataProducto = [];

   var dataSede = [];

    

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

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

      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'] = "*"+dataRow[0]+"* : "+dataRow[1]+" ("+dataRow[2]+""+dataRow[3] +")";

        dataProducto.push(record);     

      }

    }

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

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

       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'] = "*"+dataRow[0]+"* : "+dataRow[1];

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

         record['encargado'] =dataRow[2];

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

         dataSede.push(record);     

       }

    }

        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);

            }

        }


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

        payload.data_1 =dataSede;

        payload.data_2 =dataProducto;

      

        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);

        }

    }

}



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/

miércoles, 19 de enero de 2022

Google APPs Script Avanzado Negocio Toma de Pedido

  A continuación se muestra una solución 0 costo de carrito de compras toma de pedido hecho con APP Script y Google Sheet. 

¿ Que necesitas para implementarlo ?

- SOLO  una cuenta de GMAIL

LINK APLICACIÓN :

https://script.google.com/macros/s/AKfycbw-m-p79tXfpih_gf6rhgJ5tu_4NFBn91mWQRii-P2XwkHwluA/exec

EXCEL APLICACIÓN :

https://docs.google.com/spreadsheets/d/1oFIoUdcniBdQbMCWBX8YYTkNX5eRn60krGMaJUT3TPA/edit?usp=sharing

VIDEO APLICACION :




MANUAL DE INSTALACION:

https://docs.google.com/document/d/1ADkaDZudk9975XaSSKUh7ONmoAfih5KzXK66RTe9Sv8/edit?usp=sharing

FUENTES APLICACIÓN :

Para obtener las fuentes tiene un costo $ 3.00. .

IR a PAGAR 3 DOLAR

NOTA : Luego del pago se redireccionara a una carpeta para descargar las fuentes


🚀 Crea tu Propio Sistema de Inventario y Úsalo desde tu Celular 📱

 📱📦 Crea tu Sistema de Inventario y úsalo desde tu celular. En este video muestro cómo desarrollar un sistema de inventario con escáner us...