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.