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:
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:
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:
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.