Skip to content

Commit 0d33e4e

Browse files
committed
Merge branch 'desarrollo' into produccion
2 parents 67626df + ecd3317 commit 0d33e4e

15 files changed

Lines changed: 1185 additions & 19 deletions

Frontend/app/Http/Controllers/Estadisticas/EstadisticasController.php

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Http\Request;
66
use App\Http\Controllers\Controller;
7+
use Illuminate\Support\Facades\Log;
78
use App\Services\Reportes\ProductosMasVendidosService;
89
use App\Services\Reportes\UsuariosRegistradosService;
910

@@ -22,9 +23,27 @@ public function __construct(
2223

2324
public function index()
2425
{
25-
$productosMasVendidos = $this->productosMasVendidosService->obtenerProductosMasVendidos(10);
26-
$usuariosRegistrados = $this->usuariosRegistradosService->obtenerUsuariosRegistrados();
26+
Log::info('Accediendo a EstadisticasController@index');
27+
28+
try {
29+
$productosMasVendidos = $this->productosMasVendidosService->obtenerProductosMasVendidos(10);
30+
$usuariosRegistrados = $this->usuariosRegistradosService->obtenerUsuariosRegistrados();
2731

28-
return view('Estadisticas.index', compact('productosMasVendidos', 'usuariosRegistrados'));
32+
Log::info('Estadísticas obtenidas correctamente', [
33+
'productos_count' => count($productosMasVendidos),
34+
'usuarios_count' => count($usuariosRegistrados)
35+
]);
36+
37+
return view('Estadisticas.index', compact('productosMasVendidos', 'usuariosRegistrados'));
38+
} catch (\Exception $e) {
39+
Log::error('Excepción en EstadisticasController@index: ' . $e->getMessage(), [
40+
'trace' => $e->getTraceAsString()
41+
]);
42+
43+
return view('Estadisticas.index', [
44+
'productosMasVendidos' => [],
45+
'usuariosRegistrados' => []
46+
])->with('error', 'Ocurrió un error al cargar las estadísticas. Por favor, revisa los logs.');
47+
}
2948
}
3049
}

Frontend/app/Http/Controllers/Reportes/OrdenSalidaController.php

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,44 @@
77
use App\Models\Clientes;
88
use App\Models\Reportes\OrdenSalida;
99
use App\Http\Controllers\Controller;
10+
use Illuminate\Support\Facades\Log;
1011

1112
class OrdenSalidaController extends Controller
1213
{
1314
public function index()
14-
{
15-
$ventas = OrdenSalida::with('cliente')->get();
16-
$clientes = Clientes::where('ACTIVO_CLI', 1)->get(); // solo clientes activos
17-
$pedidos = \DB::table('pedidos')->select('ID_PEDIDO', 'ID_CLIENTE')->get();
18-
19-
return view('reportes.index', compact('ventas', 'clientes', 'pedidos'));
20-
}
15+
{
16+
Log::info('Accediendo a OrdenSalidaController@index');
17+
18+
try {
19+
$ventas = OrdenSalida::with('cliente')->get();
20+
$clientes = Clientes::where('ACTIVO_CLI', 1)->get();
21+
$pedidos = \DB::table('pedidos')->select('ID_PEDIDO', 'ID_CLIENTE')->get();
22+
23+
Log::info('Datos de OrdenSalida cargados', [
24+
'ventas_count' => count($ventas),
25+
'clientes_count' => count($clientes),
26+
'pedidos_count' => count($pedidos)
27+
]);
28+
29+
return view('Reportes.index', compact('ventas', 'clientes', 'pedidos'));
30+
} catch (\Exception $e) {
31+
Log::error('Error en OrdenSalidaController@index: ' . $e->getMessage(), [
32+
'trace' => $e->getTraceAsString()
33+
]);
34+
35+
return view('Reportes.index', [
36+
'ventas' => collect([]),
37+
'clientes' => collect([]),
38+
'pedidos' => collect([])
39+
])->with('error', 'Error al cargar las órdenes de salida. Por favor revisa los logs.');
40+
}
41+
}
2142

2243

2344

2445
public function create()
2546
{
26-
return view('reportes.create');
47+
return view('Reportes.create');
2748
}
2849

2950
public function edit($id)
@@ -34,7 +55,7 @@ public function edit($id)
3455
return abort(404, 'Orden no encontrada');
3556
}
3657

37-
return view('reportes.edit', compact('venta'));
58+
return view('Reportes.edit', compact('venta'));
3859
}
3960

4061
public function store(Request $request)

Frontend/app/Services/Reportes/ProductosMasVendidosService.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ class ProductosMasVendidosService
99
{
1010
protected $apiService;
1111

12-
public function __construct()
12+
public function __construct(ApiService $apiService)
1313
{
14-
$this->baseUrl = env('API_BASE_URL', 'http://32.193.167.191:8080');
14+
$this->apiService = $apiService;
1515
}
1616

17+
1718
/**
1819
* Obtener los productos más vendidos desde la API de Spring Boot
1920
*
@@ -22,6 +23,11 @@ public function __construct()
2223
*/
2324
public function obtenerProductosMasVendidos(int $limite = 10): array
2425
{
26+
if (!$this->apiService) {
27+
Log::error('ApiService no está inicializado en ProductosMasVendidosService. ¿Falló la inyección de dependencias?');
28+
return [];
29+
}
30+
2531
try {
2632
$response = $this->apiService->get("/productos/mas-vendidos?limite={$limite}");
2733

Frontend/app/Services/Reportes/UsuariosRegistradosService.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ class UsuariosRegistradosService
99
{
1010
protected $apiService;
1111

12-
public function __construct()
12+
public function __construct(ApiService $apiService)
1313
{
14-
$this->baseUrl = env('API_BASE_URL', 'http://32.193.167.191:8080');
14+
$this->apiService = $apiService;
1515
}
1616

1717
/**
@@ -21,6 +21,11 @@ public function __construct()
2121
*/
2222
public function obtenerUsuariosRegistrados(): array
2323
{
24+
if (!$this->apiService) {
25+
Log::error('ApiService no está inicializado en UsuariosRegistradosService. ¿Falló la inyección de dependencias?');
26+
return [];
27+
}
28+
2429
try {
2530
$response = $this->apiService->get('/reporte/usuarios');
2631

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@extends('layouts.app')
2+
3+
@section('content')
4+
<div class="container py-5">
5+
<div class="alert alert-info">
6+
<h4>Funcionalidad disponible en el Listado</h4>
7+
<p>Esta acción ahora se realiza directamente mediante ventanas modales en la página principal de órdenes de salida.</p>
8+
<a href="{{ route('ordenes.salida.index') }}" class="btn btn-primary">Volver al listado</a>
9+
</div>
10+
</div>
11+
@endsection
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@extends('layouts.app')
2+
3+
@section('content')
4+
<div class="container py-5">
5+
<div class="alert alert-info">
6+
<h4>Funcionalidad disponible en el Listado</h4>
7+
<p>Esta acción ahora se realiza directamente mediante ventanas modales en la página principal de órdenes de salida.</p>
8+
<a href="{{ route('ordenes.salida.index') }}" class="btn btn-primary">Volver al listado</a>
9+
</div>
10+
</div>
11+
@endsection

Frontend/resources/views/Reportes/index.blade.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@
3232
<div class="orden-card">
3333
<div class="card-header-custom">
3434
<span class="orden-id">Orden #{{ $venta->ID_FACTURA }}</span>
35-
<span class="fecha-badge">{{ \Carbon\Carbon::parse($venta->FECHA_FACTURACION)->format('d/m/Y H:i') }}</span>
35+
<span class="fecha-badge">
36+
@if($venta->FECHA_FACTURACION)
37+
{{ \Carbon\Carbon::parse($venta->FECHA_FACTURACION)->format('d/m/Y H:i') }}
38+
@else
39+
N/A
40+
@endif
41+
</span>
3642
</div>
3743
<div class="card-body-custom">
3844
<div class="info-row">
@@ -53,8 +59,8 @@
5359
{{ $venta->ID_FACTURA }},
5460
{{ $venta->ID_CLIENTE }},
5561
{{ $venta->ID_PEDIDO }},
56-
'{{ \Carbon\Carbon::parse($venta->FECHA_FACTURACION)->format('Y-m-d\TH:i') }}',
57-
{{ $venta->TOTAL_FACTURA }}
62+
'{{ $venta->FECHA_FACTURACION ? \Carbon\Carbon::parse($venta->FECHA_FACTURACION)->format("Y-m-d\TH:i") : "" }}',
63+
{{ $venta->TOTAL_FACTURA ?? 0 }}
5864
)">Editar</button>
5965
<form action="{{ route('ordenes.salida.destroy',$venta->ID_FACTURA) }}" method="POST" style="flex: 1;">
6066
@csrf
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace Tests\Feature\Inventario;
4+
5+
use Tests\TestCase;
6+
use Illuminate\Support\Facades\Http;
7+
use PHPUnit\Framework\Attributes\Test;
8+
9+
class PedidosProveedoresControllerTest extends TestCase
10+
{
11+
// ===========================================
12+
// GET /inventario/pedidos-proveedores -> index
13+
// ===========================================
14+
15+
#[Test]
16+
public function index_maneja_error_de_api_pedidos_correctamente(): void
17+
{
18+
Http::fake([
19+
'*/pedido/proveedores' => Http::response(['error' => 'API Error'], 500),
20+
'*/proveedores' => Http::response([], 200),
21+
'*/ingredientes/lista' => Http::response([], 200)
22+
]);
23+
24+
$response = $this->get(route('pedidoproveedores.index'));
25+
26+
$response->assertStatus(200);
27+
$response->assertViewIs('inventarioviews.pedidoproveedores.index');
28+
$response->assertViewHas('pedidos', []);
29+
$response->assertViewHas('error');
30+
}
31+
32+
// ===========================================
33+
// POST /inventario/pedidos-proveedores/store -> store
34+
// ===========================================
35+
36+
#[Test]
37+
public function store_falla_validacion_si_faltan_campos_requeridos(): void
38+
{
39+
$response = $this->post(route('pedidoproveedores.store'), []);
40+
41+
$response->assertSessionHasErrors([
42+
'idProveedor',
43+
'numeroPedido',
44+
'estadoPedido',
45+
'detalles'
46+
]);
47+
}
48+
49+
// ===========================================
50+
// GET /inventario/pedidos-proveedores/show/{id} -> show
51+
// ===========================================
52+
53+
#[Test]
54+
public function show_redirige_si_falla_la_api(): void
55+
{
56+
Http::fake([
57+
'*/pedido/proveedores/99' => Http::response('Not Found', 404)
58+
]);
59+
60+
$response = $this->get(route('pedidoproveedores.show', ['id' => 99]));
61+
62+
$response->assertRedirect(route('pedidoproveedores.index'));
63+
$response->assertSessionHas('error');
64+
}
65+
66+
// ===========================================
67+
// PUT /inventario/pedidos-proveedores/update/{id} -> update
68+
// ===========================================
69+
70+
#[Test]
71+
public function update_actualiza_encabezado_y_redirige_con_success(): void
72+
{
73+
Http::fake([
74+
'*/pedido/proveedores/1' => Http::response('Actualizado', 200)
75+
]);
76+
77+
$response = $this->put(route('pedidoproveedores.update', ['id' => 1]), [
78+
'idProveedor' => 2,
79+
'numeroPedido' => 1005,
80+
'estadoPedido' => 'Enviado'
81+
]);
82+
83+
$response->assertRedirect(route('pedidoproveedores.index'));
84+
}
85+
86+
// ===========================================
87+
// DELETE /inventario/pedidos-proveedores/delete/{id} -> destroy
88+
// ===========================================
89+
90+
#[Test]
91+
public function destroy_elimina_pedido_y_redirige_con_success(): void
92+
{
93+
Http::fake([
94+
'*/pedido/proveedores/1' => Http::response('Eliminado', 200)
95+
]);
96+
97+
$response = $this->delete(route('pedidoproveedores.destroy', ['id' => 1]));
98+
99+
$response->assertRedirect(route('pedidoproveedores.index'));
100+
}
101+
102+
// ===========================================
103+
// PATCH /inventario/pedidos-proveedores/{id}/entregar -> entregar
104+
// ===========================================
105+
106+
#[Test]
107+
public function entregar_marca_pedido_como_entregado_y_redirige_con_success(): void
108+
{
109+
Http::fake([
110+
'*/pedido/proveedores/1/entregar' => Http::response('Entregado', 200)
111+
]);
112+
113+
$response = $this->patch(route('pedidoproveedores.entregar', ['id' => 1]));
114+
115+
$response->assertRedirect(route('pedidoproveedores.index'));
116+
$response->assertSessionHas('success');
117+
}
118+
}

0 commit comments

Comments
 (0)