12-cactus/espinoso

View on GitHub
app/Handlers/NextHolidaysHandler.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
 
namespace App\Handlers;
 
use stdClass;
use Carbon\Carbon;
use App\Facades\GuzzleClient;
 
class NextHolidaysHandler extends BaseCommand
{
/**
* @var string
*/
protected $pattern = "(\b(pr(o|ó)x(imo(s?))?)\b\s+)?(\b(feriado(s?))\b)(?'size'.+)?$";
 
protected $signature = "espi feriados [cantidad]";
protected $description = "feriados para rascarse la pelusa";
 
 
public function handle(): void
{
$crawler = GuzzleClient::request(
'GET',
config('espinoso.url.holidays').now()->year.'?incluir=opcional'
)->getBody()->getContents();
$holidays = collect(json_decode($crawler));
 
//filtro los feriados ya pasados
$filteredList = $holidays->filter(function ($holiday) {
return (Carbon::create(now()->year, $holiday->mes, $holiday->dia)->isFuture());
});
 
//filtro quedando solo los feriados cristianos y los no opcionales
$rejectList = $filteredList->filter(function ($holiday) {
return (property_exists($holiday, 'opcional') and
property_exists($holiday, 'religion') and
$holiday->religion == 'cristianismo') or
! property_exists($holiday, 'opcional');
});
 
$count = $rejectList->count();
 
if (!empty($this->matches['size'])) {
$rejectList = $rejectList->take($this->matches['size']);
}
 
$list = $rejectList->map(function (stdClass $holiday) {
return $this->parseHoliday($holiday);
})->implode("\n");
 
$this->espinoso->reply(trans('messages.feriados', compact('count', 'list')));
}
 
protected function parseHoliday(stdClass $holiday)
{
$diff = now()->diffInDays(Carbon::create(now()->year, $holiday->mes, $holiday->dia));
 
return " - *{$holiday->motivo}*, {$holiday->tipo}, {$holiday->dia}/{$holiday->mes} ({$diff})";
}
}