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

En la sub carpeta 'reconocimento' almacenamos el archivo 'facturas.php' que tiene por objetivo analizar preguntas puntuales sobre las facturas que almacena el sistema.

facturas.php
<?php
//******************************Consultas sobre facturacion **************************************/

function consultasSobreFacturas()
{
    global $palabras;
    if (strpos($_GET['oracion'], "facturas de") !== false || strpos($_GET['oracion'], "factura de") !== false) {
        $nombres = '';
        for ($inicio = 2; $inicio < count($palabras); $inicio++) {
            $nombres .= $palabras[$inicio] . " ";
        }
        facturasde(trim($nombres));
        exit();
    }
    if (
        strpos($_GET['oracion'], "facturas con importe menor a") !== false ||
        strpos($_GET['oracion'], "factura con importe menor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMenorA($importe);
        exit();
    }
    if (
        strpos($_GET['oracion'], "facturas con importe mayor a") !== false ||
        strpos($_GET['oracion'], "factura con importe mayor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMayorA($importe);
        exit();
    }
    if (
        strpos($_GET['oracion'], "factura numero") !== false ||
        strpos($_GET['oracion'], "facturas numero") !== false
    ) {
        $numero = $palabras[count($palabras) - 1];
        facturaNumero($numero);
        exit();
    }
}

function facturasde($persona)
{
    $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
          where nombre='$persona'
          group by deta.codigofactura
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function facturasConImporteMenorA($importe)
{
    $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
          having importefactura<$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function facturasConImporteMayorA($importe)
{
    $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
          having importefactura>$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

function facturaNumero($numero)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select    pro.descripcion as descripcion,         
              deta.precio as precio,
              cantidad,
              round(deta.precio*deta.cantidad,2) as importefactura
            from detallefactura as deta 
            inner join productos as pro on pro.codigo=deta.codigoproducto
            where codigofactura=$numero
    union
    select   '',
             '',
             'Total a pagar:',
             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          
           where fact.codigo=$numero
           group by deta.codigofactura
    ");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}
?>

La función 'consultasSobreFacturas' accede a la variable global '$palabras' que recordemos es un arreglo con todas las palabras contenida en la oración:

function consultasSobreFacturas()
{
    global $palabras;

En la misma función 'consultasSobreFacturas' mediante un if verificamos si la horación contiene la cadena 'facturas de' o 'factura de':

    if (strpos($_GET['oracion'], "facturas de") !== false || strpos($_GET['oracion'], "factura de") !== false) {
        $nombres = '';
        for ($inicio = 2; $inicio < count($palabras); $inicio++) {
            $nombres .= $palabras[$inicio] . " ";
        }
        facturasde(trim($nombres));
        exit();
    }

En caso afirmativo mediante un for recuperamos todas las palabras que tiene la oración después de dichas dos palabras, tenemos un resultado similar a:

reconocimineto de voz

Es responsabilidad de la función 'facturasde' generar el archivo JSON que retornaremos:

function facturasde($persona)
{
    $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
          where nombre='$persona'
          group by deta.codigofactura
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

Si la oración contiene la cadena "facturas con importe menor a" o "factura con importe menor a" se llama a la función encargada de generar ej JSON correspondiente que es facturasConImporteMenorA:

    if (
        strpos($_GET['oracion'], "facturas con importe menor a") !== false ||
        strpos($_GET['oracion'], "factura con importe menor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMenorA($importe);
        exit();
    }

La función facturasConImporteMenorA implementa el algoritmo:

function facturasConImporteMenorA($importe)
{
    $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
          having importefactura<$importe
          order by codigo desc");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

Tenemos un resultado en el navegador similar a:

reconocimineto de voz

De forma idéntica resolvemos el problema para mostrar la/s facturas con importe mayor a un cierto importe:

    if (
        strpos($_GET['oracion'], "facturas con importe mayor a") !== false ||
        strpos($_GET['oracion'], "factura con importe mayor a") !== false
    ) {
        $importe = $palabras[count($palabras) - 1];
        facturasConImporteMayorA($importe);
        exit();
    }

Finalmente generamos el listado de una factura conociendo su número cuando ingresamos la frase 'factura número':

    if (
        strpos($_GET['oracion'], "factura numero") !== false ||
        strpos($_GET['oracion'], "facturas numero") !== false
    ) {
        $numero = $palabras[count($palabras) - 1];
        facturaNumero($numero);
        exit();
    }

Tenemos un resultado en el navegador similar a:

reconocimineto de voz

Dicho resultado procede de la ejecución del siguiente comando SQL:

function facturaNumero($numero)
{
    $conexion = retornarConexion();
    $datos = mysqli_query($conexion, "
    select    pro.descripcion as descripcion,         
              deta.precio as precio,
              cantidad,
              round(deta.precio*deta.cantidad,2) as importefactura
            from detallefactura as deta 
            inner join productos as pro on pro.codigo=deta.codigoproducto
            where codigofactura=$numero
    union
    select   '',
             '',
             'Total a pagar:',
             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          
           where fact.codigo=$numero
           group by deta.codigofactura
    ");
    $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC);
    echo json_encode($resultado);
}

Para extender las posibilidades de consultas de facturación debemos agregar las cadenas a buscar en la oración que se efectúan en la función 'consultasSobreFacturas' y la posterior implementación del comando SQL que la responde.