Reconocimiento de voz para consultar una base de datos - archivo consulta.php

El archivo principal de la aplicación en PHP se encuentra en 'consulta.php'.

consulta.php
<?php

header('Content-Type: application/json');

require("conexion.php");

$_GET['oracion'] = eliminarAcentos($_GET['oracion']);
$_GET['oracion'] = strtolower($_GET['oracion']);

//Tablas que se pueden analizar
$tablas = array("clientes", "productos", "facturas", "categorias");
$tablaconsulta = "";
$palabras = explode(" ", $_GET['oracion']);
foreach ($palabras as $palabra) {
    if (in_array($palabra, $tablas)) {
        $tablaconsulta = $palabra;
    }
}

quePuedoPreguntar();

require("reconocimiento/facturas.php");
consultasSobreFacturas();
require("reconocimiento/clientes.php");
consultasSobreClientes();
require("reconocimiento/productos.php");
consultasSobreProductos();

switch ($tablaconsulta) {
    case 'clientes':
        clientes();
        break;

    case 'productos':
        productos();
        break;

    case 'categorias':
        categorias();
        break;

    case 'facturas':
        facturas();
        break;
}

//------------------ Fin del bloque principal del programa --------------------------------------//

function quePuedoPreguntar()
{
    if ($_GET['oracion'] == 'que puedo preguntar') {
        mostrarPreguntas();
    }
    if ($_GET['oracion'] == 'que puedo preguntar de clientes') {
        mostrarPreguntasClientes();
    }
    if ($_GET['oracion'] == 'que puedo preguntar de productos') {
        mostrarPreguntasProductos();
    }
}

function clientes()
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "select codigo,nombre,telefono,mail,direccion from clientes");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function productos()
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "select pro.codigo as `codigo de producto`,
                                             pro.descripcion as `descripcion de producto`,
                                             precio,
                                             ca.descripcion as categoria
                                           from productos as pro
                                           join categorias as ca on ca.codigo=pro.codigocategoria");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function categorias()
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "select codigo,descripcion from categorias");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function facturas()
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select 
              fact.codigo as codigo,
              date_format(fecha,'%d/%m/%Y') as fecha,
              nombre,
              round(sum(deta.precio*deta.cantidad),2) as importefactura
          from facturas as fact 
          join clientes as cli on cli.codigo=fact.codigocliente
          join detallefactura as deta on deta.codigofactura=fact.codigo
          group by deta.codigofactura
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function mostrarPreguntas()
{
    echo '
    [{"pregunta":"\"que puedo preguntar\""},
     {"pregunta":"listado de \"productos\""},
     {"pregunta":"listado de \"clientes\""},
     {"pregunta":"listado de \"facturas\""},
     {"pregunta":"listado de \"categorias\""},
     {"pregunta":"\"factura de\" (apellido y nombre)"},
     {"pregunta":"\"facturas de\" (apellido y nombre)"},
     {"pregunta":"\"factura con importe menor a\" (importe)"},
     {"pregunta":"\"facturas con importe menor a\" (importe)"},
     {"pregunta":"\"factura con importe mayor a\" (importe)"},
     {"pregunta":"\"facturas con importe mayor a\" (importe)"},      
     {"pregunta":"\"factura numero \" (numero)"},
     {"pregunta":"\"facturas numero \" (numero)"},
     {"pregunta":"\"mail de\" (apellido y nombre)"},
     {"pregunta":"\"telefono de\" (apellido y nombre)"},
     {"pregunta":"\"direccion de\" (apellido y nombre)"},          
     {"pregunta":"\"todos los datos de\" (apellido y nombre)"},
     {"pregunta":"\"producto numero\" (numero)"},
     {"pregunta":"\"precios de\" (nombre de cateroría)"}
    ]';
    exit(0);
}


function mostrarPreguntasClientes()
{
    echo '
    [
     {"pregunta":"listado de \"clientes\""},
     {"pregunta":"\"factura de\" (apellido y nombre)"},
     {"pregunta":"\"facturas de\" (apellido y nombre)"},
     {"pregunta":"\"mail de\" (apellido y nombre)"},
     {"pregunta":"\"telefono de\" (apellido y nombre)"},
     {"pregunta":"\"direccion de\" (apellido y nombre)"},     
     {"pregunta":"\"todos los datos de\" (apellido y nombre)"}
    ]';
    exit(0);
}

function mostrarPreguntasProductos()
{
    echo '
    [
        {"pregunta":"\"producto numero\" (numero)"},
        {"pregunta":"\"precios de\" (nombre de cateroría)"}   
    ]';
    exit(0);
}

function eliminarAcentos($oracion)
{
    $oracion = str_replace('á', 'a', $oracion);
    $oracion = str_replace('é', 'e', $oracion);
    $oracion = str_replace('í', 'i', $oracion);
    $oracion = str_replace('ó', 'o', $oracion);
    $oracion = str_replace('ú', 'u', $oracion);
    return $oracion;
}
?>

Lo primero que indicamos en la aplicación es que retornaremos al navegador que hizo la petición un archivo con formato JSON:

header('Content-Type: application/json');

Seguidamente importamos el archivo 'conexion.php' que contiene la función que nos permite conectarnos con MySQL:

require("conexion.php");

El archivo conexion contiene:

conexion.php
<?php
function retornarConexion() {
    $server="localhost";
    $usuario="root";
    $clave="";
    $base="base1";
    $con=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ;
    mysqli_set_charset($con,'utf8'); 
    return $con;
}
?>

Continuando el análisis del archivo 'consulta.php' procedemos a eliminar todos los acentos de la oración y a convertirla en minúsculas:

$_GET['oracion'] = eliminarAcentos($_GET['oracion']);
$_GET['oracion'] = strtolower($_GET['oracion']);

Almacenamos en un arreglo las tablas principales de nuestro mini sistema de facturación:

$tablas = array("clientes", "productos", "facturas", "categorias");

Mediante la función 'explode' particionamos la oración y guardamos cada palabra en un arreglo llamado '$palabras':

$tablaconsulta = "";
$palabras = explode(" ", $_GET['oracion']);

Recorremos la oración almacenada en el arreglo '$palabras' y verificamos si alguna de ellas coincide con alguna de las tablas de la base de datos, en caso afirmativo la almacenamos en la variable '$tablaconsulta':

foreach ($palabras as $palabra) {
    if (in_array($palabra, $tablas)) {
        $tablaconsulta = $palabra;
    }
}

Llamamos a la función:

quePuedoPreguntar();

Esta función analiza si la oración ingresado contiene la cadena 'que puedo preguntar', 'que puedo preguntar de clientes' o 'que puedo preguntar de productos':

function quePuedoPreguntar()
{
    if ($_GET['oracion'] == 'que puedo preguntar') {
        mostrarPreguntas();
    }
    if ($_GET['oracion'] == 'que puedo preguntar de clientes') {
        mostrarPreguntasClientes();
    }
    if ($_GET['oracion'] == 'que puedo preguntar de productos') {
        mostrarPreguntasProductos();
    }
}

Por ejemplo si $_GET['oracion'] almacena la oración 'que puedo preguntar' luego se llama a la función 'mostrarPreguntas':

    if ($_GET['oracion'] == 'que puedo preguntar') {
        mostrarPreguntas();
    }

Esta función genera en formato JSON la salida que luego el navegador recibe para mostrarlo:

function mostrarPreguntas()
{
    echo '
    [{"pregunta":"\"que puedo preguntar\""},
     {"pregunta":"listado de \"productos\""},
     {"pregunta":"listado de \"clientes\""},
     {"pregunta":"listado de \"facturas\""},
     {"pregunta":"listado de \"categorias\""},
     {"pregunta":"\"factura de\" (apellido y nombre)"},
     {"pregunta":"\"facturas de\" (apellido y nombre)"},
     {"pregunta":"\"factura con importe menor a\" (importe)"},
     {"pregunta":"\"facturas con importe menor a\" (importe)"},
     {"pregunta":"\"factura con importe mayor a\" (importe)"},
     {"pregunta":"\"facturas con importe mayor a\" (importe)"},      
     {"pregunta":"\"factura numero \" (numero)"},
     {"pregunta":"\"facturas numero \" (numero)"},
     {"pregunta":"\"mail de\" (apellido y nombre)"},
     {"pregunta":"\"telefono de\" (apellido y nombre)"},
     {"pregunta":"\"direccion de\" (apellido y nombre)"},          
     {"pregunta":"\"todos los datos de\" (apellido y nombre)"},
     {"pregunta":"\"producto numero\" (numero)"},
     {"pregunta":"\"precios de\" (nombre de cateroría)"}
    ]';
    exit(0);
}

Es decir que si desde la página 'index.html' procedemos a enunciar la oración 'que puedo preguntar' luego tenemos como resultado en el navegador:

reconocimineto de voz

Como podemos comprobar aparecen todas los oraciones posibles que es capaz nuestro sistema de contestar.

De forma similar podemos preguntar que oraciones tenemos disponibles para los temas de clientes y productos:

    if ($_GET['oracion'] == 'que puedo preguntar de clientes') {
        mostrarPreguntasClientes();
    }
    if ($_GET['oracion'] == 'que puedo preguntar de productos') {
        mostrarPreguntasProductos();
    }

Volviendo al bloque principal del programa luego de llamar a la función:

quePuedoPreguntar();

Tenemos una serie de inclusiones de archivos y llamadas a funciones que contienen dichos archivos:

require("reconocimiento/facturas.php");
consultasSobreFacturas();
require("reconocimiento/clientes.php");
consultasSobreClientes();
require("reconocimiento/productos.php");
consultasSobreProductos();

En el próximo concepto veremos el objetivo de cada uno de estos archivos: facturas.php, clientes.php y productos.php

Pensemos como si no existieran las 6 líneas anteriores (inclusive por ahora las podríamos hasta borrar)

A continuación disponemos un switch para controlar si la oración contiene en una de sus palabras la referencia a las tablas 'clientes', 'productos', 'categorias' o 'facturas':

switch ($tablaconsulta) {
    case 'clientes':
        clientes();
        break;

    case 'productos':
        productos();
        break;

    case 'categorias':
        categorias();
        break;

    case 'facturas':
        facturas();
        break;
}

Por ejemplo si el usuario enunció la oración 'listado de productos', 'listar todos los productos', 'mostrar todos los productos' etc., es decir qque contenga la palabra 'productos' luego entra por el caso:

    case 'productos':
        productos();
        break;

Donde llamamos a la función 'productos', la misma implementa el siguiente código:

function productos()
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "select pro.codigo as `codigo de producto`,
                                             pro.descripcion as `descripcion de producto`,
                                             precio,
                                             ca.descripcion as categoria
                                           from productos as pro
                                           join categorias as ca on ca.codigo=pro.codigocategoria");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

Esta función genera una salida con formato JSON de los datos de la tabla 'productos' y 'categorias':

reconocimineto de voz

De forma similar obtenemos un listado para 'clientes':

reconocimineto de voz

Para 'facturas':

reconocimineto de voz

Y para 'categorias':

reconocimineto de voz

Como vemos el archivo 'consultas.php' responde a preguntas puntuales sobre que podemos preguntar y las tablas principales del sistema, en el próximo concepto veremos como analizar preguntas más puntuales.