Skip to content

Commit 6cf366d

Browse files
author
chechojgb
committed
add: nuevos componentes dashboard
Se pasaron los componentes maquetados a funcionar correctamente, solo falta el analisis historico por semana.
1 parent c94ce63 commit 6cf366d

File tree

6 files changed

+136
-118
lines changed

6 files changed

+136
-118
lines changed

app/Http/Controllers/DashboardController.php

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Http\Controllers;
44

5+
use App\Models\BlMovimiento;
56
use App\Models\BLPedido;
67
use App\Models\BlProducto;
78
use Illuminate\Http\Request;
@@ -33,32 +34,42 @@ public function index()
3334
$rankingProductos = BLPedido::with(['items.empaque.producto'])
3435
->get()
3536
->flatMap(function ($pedido) {
36-
return $pedido->items->map(function ($item) {
37-
$cantidad = $item->cantidad_empaques ;
38-
return [
39-
'producto_id' => $item->empaque->producto->id,
40-
'nombre' => $item->empaque->producto->descripcion,
41-
'cantidad' => $cantidad,
42-
];
43-
});
37+
return $pedido->items
38+
->filter(fn($item) => $item->empaque)
39+
->map(function ($item) {
40+
$cantidad = $item->empaque->cantidad_por_empaque;
41+
42+
return [
43+
'producto_id' => $item->empaque->producto->id,
44+
'nombre' => $item->empaque->producto->descripcion,
45+
'cantidad' => $cantidad,
46+
];
47+
});
4448
})
4549
->groupBy('producto_id')
4650
->map(function ($items, $productoId) {
4751
return [
48-
'id' => $productoId,
49-
'nombre' => $items->first()['nombre'],
50-
'cantidad' => $items->sum('cantidad'),
52+
'id' => $productoId,
53+
'nombre' => $items->first()['nombre'],
54+
'cantidad'=> $items->sum('cantidad'),
5155
];
5256
})
5357
->sortByDesc('cantidad')
5458
->values()
55-
->take(5); // top 5
56-
59+
->take(5);
60+
61+
$pedidosEspera = BLPedido::get()
62+
->where('estado', 'pendiente');
63+
$movimientos = BlMovimiento::with(['empaque.producto'])->get()
64+
->take(6);
65+
// dd($movimientos);
5766

5867
return Inertia::render('dashboard', [
5968
'productos' => $productos,
6069
'user' => $user,
61-
'pedidos' => $rankingProductos
70+
'pedidos' => $rankingProductos,
71+
'pedidosEspera' => $pedidosEspera,
72+
'movimientos' => $movimientos
6273
]);
6374
}
6475
}

resources/js/components/BL/MovimientosRecientes.jsx

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,53 @@
11
import { ArrowDownCircle, ArrowUpCircle } from 'lucide-react';
22

3-
const movimientos = [
4-
{
5-
tipo: 'Entrada',
6-
producto: 'Botón Z6',
7-
cantidad: 500,
8-
fecha: '2025-08-02',
9-
icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
10-
},
11-
{
12-
tipo: 'Salida',
13-
producto: 'Botón R4',
14-
cantidad: 300,
15-
fecha: '2025-08-02',
16-
icono: <ArrowUpCircle className="text-red-600 w-5 h-5" />,
17-
},
18-
{
19-
tipo: 'Entrada',
20-
producto: 'Botón L2',
21-
cantidad: 200,
22-
fecha: '2025-08-01',
23-
icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
24-
},
25-
{
26-
tipo: 'Salida',
27-
producto: 'Botón M1',
28-
cantidad: 100,
29-
fecha: '2025-07-31',
30-
icono: <ArrowUpCircle className="text-red-600 w-5 h-5" />,
31-
},
32-
{
33-
tipo: 'Entrada',
34-
producto: 'Botón Z1',
35-
cantidad: 200,
36-
fecha: '2025-08-01',
37-
icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
38-
},
39-
{
40-
tipo: 'Entrada',
41-
producto: 'Botón Z1',
42-
cantidad: 1000,
43-
fecha: '2025-08-02',
44-
icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
45-
},
46-
// Puedes duplicar más para probar el scroll
47-
];
3+
// const movimientos = [
4+
// {
5+
// tipo: 'Entrada',
6+
// producto: 'Botón Z6',
7+
// cantidad: 500,
8+
// fecha: '2025-08-02',
9+
// icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
10+
// },
11+
// {
12+
// tipo: 'Salida',
13+
// producto: 'Botón R4',
14+
// cantidad: 300,
15+
// fecha: '2025-08-02',
16+
// icono: <ArrowUpCircle className="text-red-600 w-5 h-5" />,
17+
// },
18+
// {
19+
// tipo: 'Entrada',
20+
// producto: 'Botón L2',
21+
// cantidad: 200,
22+
// fecha: '2025-08-01',
23+
// icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
24+
// },
25+
// {
26+
// tipo: 'Salida',
27+
// producto: 'Botón M1',
28+
// cantidad: 100,
29+
// fecha: '2025-07-31',
30+
// icono: <ArrowUpCircle className="text-red-600 w-5 h-5" />,
31+
// },
32+
// {
33+
// tipo: 'Entrada',
34+
// producto: 'Botón Z1',
35+
// cantidad: 200,
36+
// fecha: '2025-08-01',
37+
// icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
38+
// },
39+
// {
40+
// tipo: 'Entrada',
41+
// producto: 'Botón Z1',
42+
// cantidad: 1000,
43+
// fecha: '2025-08-02',
44+
// icono: <ArrowDownCircle className="text-green-600 w-5 h-5" />,
45+
// },
46+
// // Puedes duplicar más para probar el scroll
47+
// ];
4848

49-
export default function MovimientosRecientesBL() {
49+
export default function MovimientosRecientesBL({movimientos}) {
50+
console.log('movimientos',movimientos);
5051
return (
5152
<div className="relative flex flex-col h-full p-5">
5253
{/* Header */}
@@ -57,23 +58,35 @@ export default function MovimientosRecientesBL() {
5758
{/* Lista scrollable */}
5859
<div className="flex-1 overflow-y-auto pr-1">
5960
<ul className="space-y-4 text-sm text-gray-800 dark:text-gray-300">
60-
{movimientos.map((mov, i) => (
61-
<li key={i} className="flex items-center justify-between">
62-
<div className="flex items-center gap-3">
63-
<div className="bg-gray-100 dark:bg-gray-800 p-2 rounded-full">
64-
{mov.icono}
65-
</div>
66-
<div>
67-
<p className="font-medium">{mov.tipo}: {mov.producto}</p>
68-
<p className="text-xs text-gray-500 dark:text-gray-400">
69-
Cantidad: {mov.cantidad}
70-
</p>
61+
{Object.values(movimientos).map((mov, i) => {
62+
let icono;
63+
if (mov.tipo === "entrada") {
64+
icono = <ArrowUpCircle className="text-green-600 w-5 h-5" />;
65+
} else {
66+
icono = <ArrowDownCircle className="text-red-600 w-5 h-5" />;
67+
}
68+
69+
return (
70+
<li key={i} className="flex items-center justify-between">
71+
<div className="flex items-center gap-3">
72+
<div className="bg-gray-100 dark:bg-gray-800 p-2 rounded-full">
73+
{icono}
74+
</div>
75+
<div>
76+
<p className="font-medium">
77+
{mov.tipo}: {mov?.empaque?.producto?.descripcion}
78+
</p>
79+
<p className="text-xs text-gray-500 dark:text-gray-400">
80+
Fecha: {mov.created_at.slice(0, 10)}
81+
</p>
82+
</div>
7183
</div>
72-
</div>
73-
<div className="text-xs text-gray-500 dark:text-gray-400">{mov.fecha}</div>
74-
</li>
75-
))}
84+
<div className="text-xs text-gray-500 dark:text-gray-400">{mov.fecha}</div>
85+
</li>
86+
);
87+
})}
7688
</ul>
89+
7790
</div>
7891
</div>
7992
);

resources/js/components/BL/OrdenesPendientesBL.jsx

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,30 @@ import { useLoadStatus } from '../context/loadContext';
33
import { themeByProject } from '../utils/theme';
44
import { usePage } from '@inertiajs/react';
55

6-
const ordenes = [
7-
{
8-
numero: 'ORD-1001',
9-
cliente: 'Confecciones Diana',
10-
fecha: '2025-08-02',
11-
estado: 'Pendiente',
12-
},
13-
{
14-
numero: 'ORD-1002',
15-
cliente: 'Boutique La Estrella',
16-
fecha: '2025-08-01',
17-
estado: 'Pendiente',
18-
},
19-
{
20-
numero: 'ORD-1003',
21-
cliente: 'Fábrica El Botonazo',
22-
fecha: '2025-07-31',
23-
estado: 'Pendiente',
24-
},
25-
];
6+
// const ordenes = [
7+
// {
8+
// numero: 'ORD-1001',
9+
// cliente: 'Confecciones Diana',
10+
// fecha: '2025-08-02',
11+
// estado: 'Pendiente',
12+
// },
13+
// {
14+
// numero: 'ORD-1002',
15+
// cliente: 'Boutique La Estrella',
16+
// fecha: '2025-08-01',
17+
// estado: 'Pendiente',
18+
// },
19+
// {
20+
// numero: 'ORD-1003',
21+
// cliente: 'Fábrica El Botonazo',
22+
// fecha: '2025-07-31',
23+
// estado: 'Pendiente',
24+
// },
25+
// ];
2626

27-
export default function OrdenesPendientesBL() {
27+
export default function OrdenesPendientesBL({ordenes}) {
28+
console.log(ordenes);
29+
2830
const { props } = usePage();
2931
const proyecto = props?.auth?.user?.proyecto || 'AZZU';
3032
const theme = themeByProject[proyecto];
@@ -35,7 +37,7 @@ export default function OrdenesPendientesBL() {
3537
</h3>
3638

3739
<ul className="space-y-4">
38-
{ordenes.map((orden, index) => (
40+
{Object.values(ordenes).map((orden, index) => (
3941
<li
4042
key={index}
4143
className="flex items-center justify-between bg-gray-50 dark:bg-gray-800 p-4 rounded-lg shadow-sm"
@@ -46,8 +48,8 @@ export default function OrdenesPendientesBL() {
4648
<Clock className="w-5 h-5" />
4749
</div>
4850
<div>
49-
<p className="font-medium text-gray-800 dark:text-gray-100">{orden.numero}</p>
50-
<p className="text-sm text-gray-500 dark:text-gray-400">{orden.cliente}</p>
51+
<p className="font-medium text-gray-800 dark:text-gray-100">ORD-{orden.id}</p>
52+
<p className="text-sm text-gray-500 dark:text-gray-400">{orden.fecha_pedido}</p>
5153
</div>
5254
</div>
5355
<div className="text-right text-sm text-gray-500 dark:text-gray-400">

resources/js/components/BL/RankingBotonesVendidosBL.jsx

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
import { Medal } from 'lucide-react';
22

3-
const botonesVendidos = [
4-
{ nombre: 'Botón Z6', cantidad: 1200 },
5-
{ nombre: 'Botón R4', cantidad: 950 },
6-
{ nombre: 'Botón M1', cantidad: 800 },
7-
{ nombre: 'Botón L2', cantidad: 650 },
8-
{ nombre: 'Botón N8', cantidad: 500 },
9-
];
10-
113
const coloresRanking = ['text-yellow-500', 'text-gray-400', 'text-orange-700'];
124

13-
export default function RankingBotonesVendidosBL() {
5+
export default function RankingBotonesVendidosBL({ pedidos }) {
146
return (
157
<div className="relative p-4 h-full">
168
<h3 className="text-base font-semibold text-gray-900 dark:text-white mb-4">
@@ -27,9 +19,9 @@ export default function RankingBotonesVendidosBL() {
2719
</tr>
2820
</thead>
2921
<tbody>
30-
{botonesVendidos.map((boton, index) => (
22+
{pedidos.map((boton, index) => (
3123
<tr
32-
key={index}
24+
key={boton.id}
3325
className={`${
3426
index % 2 === 0
3527
? 'bg-gray-50 dark:bg-gray-800'

resources/js/components/welcome/dashboard.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ const breadcrumbs = [
1919
},
2020
];
2121

22-
export default function Dashboard({user, productos, pedidos}) {
23-
console.log(pedidos);
24-
22+
export default function Dashboard({user, productos, pedidos, pedidosEspera, movimientos}) {
23+
// console.log('movimientos',movimientos);
24+
2525
return (
2626
<AppLayout breadcrumbs={[{ title: 'Dashboard', href: '/dashboard' }]}>
2727
<Head title="Dashboard" />
@@ -67,7 +67,7 @@ export default function Dashboard({user, productos, pedidos}) {
6767

6868
{/* Panel 30% */}
6969
<div className="border-sidebar-border/70 dark:border-sidebar-border relative overflow-hidden rounded-xl border min-h-[300px]">
70-
<MovimientosRecientesBL/>
70+
<MovimientosRecientesBL movimientos={movimientos}/>
7171
</div>
7272
</div>
7373

@@ -76,10 +76,10 @@ export default function Dashboard({user, productos, pedidos}) {
7676
<StockActualProductosBL productosStock={productos}/>
7777
</div>
7878
<div className="border-sidebar-border/70 dark:border-sidebar-border relative overflow-hidden rounded-xl border">
79-
<RankingBotonesVendidosBL/>
79+
<RankingBotonesVendidosBL pedidos={pedidos}/>
8080
</div>
8181
<div className="border-sidebar-border/70 dark:border-sidebar-border relative overflow-hidden rounded-xl border ">
82-
<OrdenesPendientesBL/>
82+
<OrdenesPendientesBL ordenes={pedidosEspera}/>
8383
</div>
8484
</div>
8585
</>

resources/js/pages/dashboard.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { LoadProvider } from '@/components/context/loadContext';
22
import Dashboard from '@/components/welcome/dashboard';
33

4-
export default function MainApp({user, productos, pedidos}) {
4+
export default function MainApp({user, productos, pedidos, pedidosEspera, movimientos}) {
55
return (
66
<LoadProvider total={5}>
7-
<Dashboard user={user} productos={productos} pedidos={pedidos}/>
7+
<Dashboard user={user} productos={productos} pedidos={pedidos} pedidosEspera={pedidosEspera} movimientos={movimientos}/>
88
</LoadProvider>
99
);
1010
}

0 commit comments

Comments
 (0)