Skip to content

Commit

Permalink
Merge pull request #102 from Crudzaso/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
DiegoAndresRamirez authored Dec 9, 2024
2 parents 49b4977 + 311f711 commit 845795d
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 48 deletions.
3 changes: 2 additions & 1 deletion Modules/Lottery/app/Models/Lottery.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public function draws()
protected $fillable = [
'name',
'description',
'url_imagen'
'url_imagen',
'slug',
];

protected static function newFactory()
Expand Down
157 changes: 111 additions & 46 deletions Modules/Raffle/app/Http/Controllers/RaffleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use Modules\Raffle\Models\Raffle;
use Modules\Lottery\Models\Lottery;
use App\Models\User;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Inertia\Inertia;

class RaffleController extends Controller
Expand Down Expand Up @@ -38,18 +40,18 @@ public function store(Request $request)
'tickets_sold' => 'nullable|integer|min:0',
'description' => 'nullable|string',
'start_date' => 'required|date',
'end_date' => 'required|date|after:start_date',
'end_date' => 'required|date|after_or_equal:start_date',
'image' => 'nullable|image|max:2048', // Validar si es una imagen
]);

$imagePath = null;

// Verificar si se subió una imagen
if ($request->hasFile('image')) {
// Guardar la imagen en el disco 'public' y obtener la ruta
$imagePath = $request->file('image')->store('raffle_images', 'public');
}

// Crear la rifa
Raffle::create([
'name' => $request->name,
Expand All @@ -64,10 +66,10 @@ public function store(Request $request)
'total_sales' => 0, // Valor predeterminado
'image' => $imagePath, // Guardar la ruta de la imagen en la base de datos
]);

return redirect()->route('raffles.index')->with('success', 'Rifa creada exitosamente.');
}


public function edit($id)
{
Expand All @@ -80,30 +82,30 @@ public function edit($id)
public function update(Request $request, $id)
{
$raffle = Raffle::findOrFail($id);

$request->validate([
'name' => 'required|string|max:255',
'description' => 'nullable|string',
'end_date' => 'required|date|after:start_date',
'image' => 'nullable|image|max:2048', // Validar si es una imagen
]);

// Manejar imagen si se sube un nuevo archivo
if ($request->hasFile('image')) {
$imagePath = $request->file('image')->store('raffle_images', 'public');
$raffle->image = $imagePath; // Actualizar la ruta de la imagen
}

// Actualizar otros campos
$raffle->update([
'name' => $request->name,
'description' => $request->description,
'end_date' => $request->end_date,
]);

return redirect()->route('raffles.index')->with('success', 'Rifa actualizada exitosamente.');
}

public function destroy($id)
{
$raffle = Raffle::findOrFail($id);
Expand All @@ -112,37 +114,98 @@ public function destroy($id)
return redirect()->route('raffles.index')->with('success', 'Rifa eliminada exitosamente.');
}

public function getRaffles(Request $request)
private function processExpiredRaffles($date = null)
{
// Comenzamos la consulta con las relaciones
$query = Raffle::with('organizer', 'lottery')
// Filtramos por rifas activas, aquellas cuyo end_date aún no ha pasado
->where('end_date', '>=', now())
// Ordenamos por la fecha de creación o fin, de más reciente a más antiguo
->orderBy('created_at', 'desc');

// Filtros de precio mínimo y máximo
if ($request->has('min_price')) {
$query->where('ticket_price', '>=', $request->input('min_price'));
// Usa la fecha proporcionada o la fecha actual
$date = $date ? \Carbon\Carbon::parse($date)->format('Y-m-d') : now()->format('Y-m-d');

Log::info("Iniciando procesamiento de rifas expiradas para la fecha: {$date}");

// Obtener todas las rifas cuya end_date sea igual a la fecha proporcionada
$expiredRaffles = Raffle::whereDate('end_date', $date)
->with(['lottery:id,slug'])
->get();

if ($expiredRaffles->isEmpty()) {
Log::info("No se encontraron rifas expiradas para la fecha: {$date}");
return;
}
if ($request->has('max_price')) {
$query->where('ticket_price', '<=', $request->input('max_price'));

Log::info("Se encontraron {$expiredRaffles->count()} rifa(s) expiradas para procesar.");

$response = Http::get("https://api-resultadosloterias.com/api/results/{$date}");

if ($response->failed()) {
Log::error("Error al consultar la API de resultados de loterías para la fecha: {$date}");
throw new \Exception('Error al consultar la API de resultados de loterías.');
}

$results = collect($response->json()['data']);
Log::info("Resultados obtenidos de la API: " . $results->count() . " registros.");

foreach ($expiredRaffles as $raffle) {
$lotterySlug = $raffle->lottery->slug;
$lotteryResult = $results->firstWhere('slug', $lotterySlug);

if ($lotteryResult) {
// Extraer los últimos dos dígitos del resultado
$lastTwoDigits = substr($lotteryResult['result'], -2);

// Filtramos por la fecha de fin si se proporciona
if ($request->has('end_date')) {
$query->where('end_date', '<=', $request->input('end_date'));
}
$raffle->update([
'winner_number' => $lastTwoDigits, // Guardar los dos últimos dígitos
]);

// Paginamos los resultados (6 resultados por página)
$raffles = $query->paginate(6);

return response()->json($raffles);
Log::info("Rifa '{$raffle->name}' actualizada con el número ganador: {$lastTwoDigits}");
} else {
Log::warning("No se encontró resultado en la API para la lotería con slug: {$lotterySlug}");
}
}

Log::info("Procesamiento completado para rifas expiradas en la fecha: {$date}");
}


public function getRaffles(Request $request)
{
$this->processExpiredRaffles('2024-12-08');

// Comenzamos la consulta con las relaciones
$query = Raffle::with('organizer', 'lottery')
// Filtramos por rifas activas o rifas expiradas sin ganador dentro de los últimos 2 días
->where(function ($query) {
$query->where('end_date', '>=', now()) // Rifas activas
->orWhere(function ($query) {
$query->whereNull('winner_number') // Rifas sin ganador
->where('end_date', '>=', now()->subDays(2)); // Expiradas hace menos de 2 días
});
})
// Ordenamos por la fecha de creación o fin, de más reciente a más antiguo
->orderBy('created_at', 'desc');

// Filtros de precio mínimo y máximo
if ($request->has('min_price')) {
$query->where('ticket_price', '>=', $request->input('min_price'));
}
if ($request->has('max_price')) {
$query->where('ticket_price', '<=', $request->input('max_price'));
}

// Filtramos por la fecha de fin si se proporciona
if ($request->has('end_date')) {
$query->where('end_date', '<=', $request->input('end_date'));
}

// Paginamos los resultados (6 resultados por página)
$raffles = $query->paginate(6);

return response()->json($raffles);
}

public function getLastChanceRaffles()
{
$this->processExpiredRaffles();


$raffles = Raffle::where('end_date', '<', now()->addDays(10))
->whereColumn('tickets_sold', '<', 'total_tickets')
->with('organizer') // Incluir los datos del organizador
Expand All @@ -155,51 +218,53 @@ public function getLastChanceRaffles()

public function getActiveRaffles()
{
$this->processExpiredRaffles();

$activeRaffles = Raffle::where('end_date', '>', now())->get();
return response()->json(['active_raffles' => $activeRaffles]);
}

public function getFilteredRaffles(Request $request)
{
$this->processExpiredRaffles();

$filter = $request->input('filter');
$date = $request->input('date');
$query = Raffle::with('organizer', 'lottery');

// Filtro adicional por fecha específica
if ($date) {
$query->whereDate('end_date', '>', $date);
}

switch ($filter) {
case 'popular':
// Rifas populares con más de 50 tickets vendidos y activas
$query->where('tickets_sold', '>=', 50)
->where('end_date', '>', now())
->orderBy('tickets_sold', 'desc');
->where('end_date', '>', now())
->orderBy('tickets_sold', 'desc');
break;

case 'last_chance':
// Rifas activas ordenadas por el end_date más próximo
$query->where('end_date', '>', now())
->orderBy('end_date', 'asc');
->orderBy('end_date', 'asc');
break;

case 'flash':
// Rifas con menos de 50 tickets y activas, ordenadas por creación más reciente
$query->where('end_date', '>', now())
->orderBy('created_at', 'desc');
->orderBy('created_at', 'desc');
break;

default:
// Por defecto, todas las rifas activas
$query->where('end_date', '>', now())
->orderBy('end_date', 'asc');
->orderBy('end_date', 'asc');
break;
}

$raffles = $query->paginate(6);
return response()->json($raffles);
}


}
}
1 change: 1 addition & 0 deletions Modules/Raffle/app/Models/Raffle.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Raffle extends Model
'lottery_id',
'ticket_price',
'total_tickets',
'winner_number',
'tickets_sold',
'total_sales',
'description',
Expand Down
2 changes: 1 addition & 1 deletion Modules/Raffle/resources/views/create.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
</div>

<!-- Fecha de Inicio -->
<input type="hidden" name="start_date" value="{{ now()->format('Y-m-d\TH:i') }}">
<input type="hidden" name="start_date" value="{{ now()->toDateTimeLocalString() }}">

<!-- Fecha de Finalización -->
<div class="mb-4">
Expand Down

0 comments on commit 845795d

Please sign in to comment.