PHP - sistema web venta de loteria php 5 laravel alguna solucion para limites por cada hora de sorteo

 
Vista:
sin imagen de perfil

sistema web venta de loteria php 5 laravel alguna solucion para limites por cada hora de sorteo

Publicado por anonymous (3 intervenciones) el 03/03/2023 18:29:09
sistema web venta de loteria php 5 laravel alguna solucion para limites por cada hora de sorteo

sistema web venta de loteria php 5 laravel alguna tienen solucion para limites por cada hora de sorteo para que se le reinicie el limite de venta en cada sorteo que se refleje donde dice limite en la imagen solo tiene para limites diarios y semanales que por cada hora del sorteo el limite se restablezca automaticamente y asi sucesivamente con cada sorteo aqui le adjunto foto del sistema y el codigo del archivo IndexController php si necesitan verificar algun otro codigo me avisan por favor gracias espero alguna respuesta

Screenshot-4

codigo del archivo IndexController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
<?php
 
namespace App\Http\Controllers\User;
 
use App\DailySort;
use App\PrintSpooler;
use App\Result;
use App\Sort;
use App\Ticket;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Auth;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\JsonResponse;
 
/**
 * Maneja las rutas principales de la taquilla
 *
 * @author Emilio Ochoa
 */
class IndexController extends Controller
{
 
    /**
     * Carga la vista principal de la taquilla
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index() {
        $sorts = Sort::all();
        $activeSorts = [];
        $seconds = 0;
        $now = new \DateTime();
 
        foreach ($sorts as $sort) {
            $dailySorts = $sort->dailySorts()->orderBy('time_sort')->get();
 
            // Filtro solo los sorteos activos
            foreach ($dailySorts as $ds) {
                if ($ds->hasActive()) {
                    if (! isset($activeSorts[$sort->id])) {
                        $activeSorts[$sort->id] = [];
                    }
 
                    $activeSorts[$sort->id][] = $ds;
 
                    if ($seconds === 0) {
                        // Guardo los segundos restantes para el primer sorteo
                        $tenMinuteLess = $ds->getTimeSort()->modify('-10 minutes');
                        $seconds = ($now->diff($tenMinuteLess)->h * 3600) + ($now->diff($tenMinuteLess)->i * 60) + ($now->diff($tenMinuteLess)->s);
                    }
                }
            }
        }
 
        $animals = $sorts[0]->animals;
        $animals = $this->getDailyLimit($animals);
 
        return view('user.create')->with([
            'sorts' => $activeSorts,
            'animals' => $animals,
            'seconds' => $seconds,
        ]);
    }
 
 
    /**
     * Registra un ticket
     *
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request) {
        DB::beginTransaction();
 
            if (empty($request->sorts)) {
                DB::rollback();
                $this->sessionMessages('Debe seleccionar al menos un sorteo', 'alert-danger');
 
                return redirect()->route('user.index');
            }
 
            foreach ($request->sorts as $id => $ds) {
                $dailySort = DailySort::find($id);
 
                if (! $dailySort->hasActive()) {
                    DB::rollback();
                    $this->sessionMessages('Este ticket posee sorteos cerrados', 'alert-danger');
 
                    return redirect()->route('user.index');
                }
            }
 
            $ticket = new Ticket();
 
            $ticket->public_id = 'TICK00' . (Ticket::all()->count() + 1);
            $ticket->user_id = Auth::user()->id;
            $ticket->status = Ticket::STATUS_ACTIVE;
            $ticket->pay_per_100 = $dailySort->sort->pay_per_100;
            $ticket->save();
            $ticket->dailySorts()->sync(array_keys($request->sorts));
 
            $amounts = $request->amounts;
 
            foreach ($request->animals as $index => $animalId) {
                if (! empty($amounts[$index])) {
                    $ticket->animals()->attach($animalId, [ 'amount' => $amounts[$index] ]);
                }
            }
 
            $printSpooler = new PrintSpooler();
            $printSpooler->ticket_id = $ticket->id;
            $printSpooler->status = PrintSpooler::STATUS_PENDING;
            $printSpooler->save();
 
        DB::commit();
 
        $this->sessionMessages('Ticket registrado');
 
        return redirect()->route('user.index');
    }
 
    /**
     * Carga una vista con la lista de tickets
     *
     * @param Request $request
     * @return $this
     */
    public function listTicket(Request $request) {
        $tickets = Ticket::orderBy('created_at', 'DESC');
 
        if (Auth::user()->level === User::LEVEL_USER) {
            $tickets->where('user_id', Auth::user()->id);
        }
 
        if (! empty($request->search)) {
            $search = $request->search;
            $search = '%' . str_replace(' ', '%', $search) . '%';
            $tickets->where('public_id', 'LIKE', $search);
        }
 
        if (! empty($request->status)) {
            $tickets->where('status', $request->status);
        }
 
        return view('user.index')->with([
            'tickets' => $tickets->paginate(20)->setPath(
                route('user.list', [
                    'search' => isset($request->search) ? $request->search : null,
                    'status' => isset($request->status) ? $request->status : null,
                ])
            ),
        ]);
    }
 
    /**
     * Carga el detalle de un ticket
     *
     * @param $id
     * @return $this
     */
    public function show($id) {
        $ticket = Ticket::findOrFail($id);
 
        return view('user.show')->with(['ticket' => $ticket]);
    }
 
    /**
     * Marca un ticket como pago
     *
     * @param $ticketId
     * @return \Illuminate\Http\RedirectResponse
     */
    public function payTicket($ticketId) {
        $ticket = Ticket::find($ticketId);
 
        if (! $ticket->allSortClosed()) {
            $this->sessionMessages('Deben cerrar todos los sorteos asociados al ticket' ,'alert-danger');
 
            return redirect()->route('user.show', ['ticket' => $ticketId]);
        }
 
        if (! $ticket->allSortResult()) {
            $this->sessionMessages('Se debe asignar resultado a todos los sorteos' ,'alert-danger');
 
            return redirect()->route('user.show', ['ticket' => $ticketId]);
        }
 
        $ticket->status = Ticket::STATUS_PAY;
        $ticket->save();
 
        $this->sessionMessages('Ticket pago');
 
        return redirect()->route('user.show', ['ticket' => $ticketId]);
    }
 
    /**
     * Anula un ticket
     *
     * @param $ticketId
     * @return \Illuminate\Http\RedirectResponse
     */
    public function nullTicket($ticketId) {
        $ticket = Ticket::find($ticketId);
        $ticket->status = Ticket::STATUS_NULL;
        $ticket->save();
 
        $this->sessionMessages('Ticket anulado');
 
        return redirect()->route('user.show', ['ticket' => $ticketId]);
    }
 
    /**
     * Obtiene el limite disponible para cada animalito
     *
     * @param $animals
     * @return array
     */
    private function getDailyLimit($animals)
    {
        // Obtengo todos los tickets de hoy
        $start = (new \DateTime())->setTime(0, 0, 0);
        $end = (new \DateTime())->setTime(23, 59, 59);
        $tickets = Ticket::where('created_at', '>=', $start)->where('created_at', '<=', $end)->get();
 
        // Obtengo los resultados de la ultima semana
        $startResult = clone $start;
        $startResult->modify('-7 days');
        $endResult = clone $end;
 
        $results = Result::where('created_at', '>=', $startResult)->where('created_at', '<=', $endResult)->get();
 
        // Recorro todos los animalitos
        foreach ($animals as $animal) {
            $resultFlag = false;
 
            // Recorro todos los resultados para saber si ya ha salido este animal
            foreach ($results as $result) {
                if ($result->animal->number === $animal->number) {
                    $resultFlag = true;
                }
            }
 
            // Verifico que no este definido el limite para inicializarlo
            if (! isset($animal->limit)) {
                if ($resultFlag) {
                    // Si el animalito ya salio esta semana, le inicializo el limite del sorteo
                    $animal->limit = floatval($animal->sort->daily_limit);
                } else {
                    // Si no ha salido esta semana, se asigna el limite configurado para estos casos
                    $animal->limit = ($weekLimit = floatval($animal->sort->week_limit)) ?
                        $weekLimit :
                        0;
                }
            }
 
            // Al limite inicializado le descuento todas las ventas de hoy
            foreach ($tickets as $ticket) {
                foreach ($ticket->animals as $ticketAnimal) {
                    if ($ticketAnimal->number === $animal->number) {
                        $animal->limit -= $ticketAnimal->pivot->amount * count($ticket->dailySorts);
                    }
                }
            }
 
        }
 
        return $animals;
    }
 
    /**
     * Imprime un ticket
     *
     * @param $ticketId
     * @return \Illuminate\Http\RedirectResponse
     */
    public function printTicket($ticketId)
    {
        $ticket = Ticket::find($ticketId);
 
        $printSpooler = new PrintSpooler();
        $printSpooler->ticket_id = $ticket->id;
        $printSpooler->status = PrintSpooler::STATUS_PENDING;
        $printSpooler->save();
 
        $this->sessionMessages('Ticket a cola de impresion');
 
        return redirect()->route('user.show', ['ticket' => $ticketId]);
    }
 
    /**
     * Retorna un json de los ultimos tickets registrados
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function getLastTickets(Request $request)
    {
        $data = [];
        $tickets = Ticket::orderByDesc('id')->with('animals')->limit(10);
 
        if (! empty($request->search)) {
            $search = $request->search;
            $search = '%' . str_replace(' ', '%', $search) . '%';
            $tickets->where('public_id', 'LIKE', $search);
        }
 
        foreach ($tickets->get() as $ticket) {
            $data[] = $ticket;
        }
 
        return new JsonResponse($data);
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

sistema web venta de loteria php 5 laravel alguna solucion para limites por cada hora de sorteo

Publicado por Jefferson (203 intervenciones) el 03/03/2023 23:17:47
Hola amigo, el autor del código a Dios gracia te dejo las líneas comentadas.

No creo que alguno de nosotros podamos corregir esta clase, porque para ello debemos conocer la estructura y llamadas del proyecto completo.

Si tienes conocimientos en PHP, solo deberías atacar y/o modificar esta función privada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private function getDailyLimit($animals)
    {
        // Obtengo todos los tickets de hoy
        $start = (new \DateTime())->setTime(0, 0, 0);
        $end = (new \DateTime())->setTime(23, 59, 59);
        $tickets = Ticket::where('created_at', '>=', $start)->where('created_at', '<=', $end)->get();
 
        // Obtengo los resultados de la ultima semana
        $startResult = clone $start;
        $startResult->modify('-7 days');
        $endResult = clone $end;
 
        $results = Result::where('created_at', '>=', $startResult)->where('created_at', '<=', $endResult)->get();
 
        // Recorro todos los animalitos
        foreach ($animals as $animal) {
            $resultFlag = false;
 
            // Recorro todos los resultados para saber si ya ha salido este animal
            foreach ($results as $result) {
                if ($result->animal->number === $animal->number) {
                    $resultFlag = true;
                }
            }
 
            // Verifico que no este definido el limite para inicializarlo
            if (! isset($animal->limit)) {
                if ($resultFlag) {
                    // Si el animalito ya salio esta semana, le inicializo el limite del sorteo
                    $animal->limit = floatval($animal->sort->daily_limit);
                } else {
                    // Si no ha salido esta semana, se asigna el limite configurado para estos casos
                    $animal->limit = ($weekLimit = floatval($animal->sort->week_limit)) ?
                        $weekLimit :
                        0;
                }
            }
 
            // Al limite inicializado le descuento todas las ventas de hoy
            foreach ($tickets as $ticket) {
                foreach ($ticket->animals as $ticketAnimal) {
                    if ($ticketAnimal->number === $animal->number) {
                        $animal->limit -= $ticketAnimal->pivot->amount * count($ticket->dailySorts);
                    }
                }
            }
 
        }
 
        return $animals;
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

sistema web venta de loteria php 5 laravel alguna solucion para limites por cada hora de sorteo

Publicado por anonymous (3 intervenciones) el 04/03/2023 00:11:26
gracias amigo por tomarse su tiempo en la respuesta aqui le dejo la estructura completa del proyecto en github de donde lo instale si por favor me podria ayudar agradecido

https://github.com/emilioaor/loteria-de-animalitos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar