Files
oficial/public/index.php
2023-04-12 22:59:16 -04:00

289 lines
7.9 KiB
PHP

<?php
use Carbon\Carbon;
use Monolog\Level;
use Monolog\Handler;
use Monolog\Processor;
use Monolog\Formatter;
use App\Service\Auth;
use Incoviba\old\Proyecto\Proyecto;
include_once dirname(__DIR__) . '/bootstrap/autoload.php';
class Benchmark
{
public function __construct(protected Monolog\Logger $logger, protected bool $debug, protected bool $benchmark) {}
protected float $time = 0;
public function start()
{
if ($this->debug and $this->benchmark) {
$this->time = microtime(true);
}
}
public function stop()
{
if ($this->debug and $this->benchmark) {
$this->time = microtime(true) - $this->time;
}
}
public function show()
{
if ($this->debug and $this->benchmark) {
$this->logger->debug("Time {$this->time}");
echo view('benchmark', ['benchmark' => $this->time]);
}
}
}
class Request
{
public function __construct()
{
sanitize();
}
protected array $server;
protected array $headers;
protected object $uri;
protected array $query;
protected object $body;
public function getServerParams(): array
{
return $this->server;
}
public function getHeaders(): array
{
return $this->headers;
}
public function getUri(): object
{
return $this->uri;
}
public function getQueryParams(): array
{
return $this->query;
}
public function getBody(): object
{
return $this->body;
}
public static function createFromGlobals(): Request
{
$request = new Request();
$request->server = $_SERVER;
$request->headers = apache_request_headers();
$request->uri = (object) parse_url($_SERVER['REQUEST_URI']);
$request->query = $_GET;
$request->body = new class() {
public function __construct()
{
$this->contents = fopen('php://stdin', 'r');
}
protected $contents;
public function getContent(): string
{
return stream_get_contents($this->contents);
}
};
return $request;
}
}
class Container
{
public function __construct(array $definitions = [])
{
foreach ($definitions as $name => $value)
{
$this->set($name, $value);
}
if (!isset($definitions[Container::class])) {
$this->set(Container::class, $this);
}
}
protected array $definitions;
public function get(string $name)
{
if (!isset($this->definitions[$name]) and class_exists($name)) {
$this->set($name, $name);
}
return $this->eval($this->definitions[$name]);
}
public function set(string $name, $value): Container
{
$this->definitions[$name] = $value;
return $this;
}
protected function eval($value)
{
if (is_callable($value)) {
return $this->evalCallable($value);
}
if (is_string($value) and class_exists($value)) {
return $this->evalNewClass($value);
}
return $value;
}
protected function evalCallable(callable $value)
{
$args = $this->getMethodParameters(new ReflectionFunction($value));
return call_user_func_array($value, $args);
}
protected function evalNewClass(string $class)
{
$ref = new reflectionClass($class);
$args = $this->getMethodParameters($ref->getConstructor());
return $ref->newInstanceArgs($args);
}
protected function getMethodParameters(ReflectionFunctionAbstract $function)
{
return array_map(function(ReflectionParameter $parameter) {
return $this->get($parameter->getType()->getName());
}, $function->getParameters());
}
}
class App
{
public function __construct(
protected Auth $authWrapper,
protected Request $request,
protected Monolog\Logger $logger,
protected Benchmark $benchmark,
) {}
public function run()
{
header("Access-Control-Allow-Origin: *");
Monolog\ErrorHandler::register($this->logger);
$this->benchmark->start();
Carbon::setLocale(config('app.locale'));
setlocale(LC_TIME, 'es_ES');
try {
$this->authWrapper->isIn();
} catch (PDOException $e) {
$this->logger->error($e);
header('Location: install');
die();
}
$get = $this->request->getQueryParams();
try {
if ($this->authWrapper->isIn()) {
if ((($get['p'] ?? false) !== false or ($get['page'] ?? false) !== false or ($get['m'] ?? false) !== false or ($get['module'] ?? false) !== false)) {
if (($route = route()) !== false) {
echo $route;
} else {
echo view('construccion');
}
} else {
$proyectos = model(Proyecto::class)->findMany();
$dias = [];
$cierres = [];
$pendientes = 0;
$hoy = 0;
foreach ($proyectos as $proyecto) {
$pendientes += $proyecto->cuotasPendientes();
$hoy += $proyecto->cuotasHoy();
foreach ($proyecto->cuotasMes() as $cuota) {
$f = $cuota->pago()->fecha();
if ($f->isoWeekday() == 6 or $f->isoWeekDay() == 7) {
$f = $f->copy()->addDays(2)->startOfWeek();
}
$dia = $f->format('Y-m-d');
if (!isset($dias[$dia])) {
$dias[$dia] = [$proyecto->descripcion => 0];
}
if (!isset($dias[$dia][$proyecto->descripcion])) {
$dias[$dia][$proyecto->descripcion] = 0;
}
$dias[$dia][$proyecto->descripcion] ++;
}
if (count($proyecto->cierres()) > 0) {
$cierres[$proyecto->descripcion] = (object) ['total' => count($proyecto->cierres()),'vigentes' => $proyecto->cierres(3), 'rechazados' => $proyecto->cierres(-1), 'pendientes' => $proyecto->cierres(2)];
}
}
uksort($dias, function($a, $b) {
return strcmp($a, $b);
});
uksort($cierres, function($a, $b) {
return strcmp($a, $b);
});
echo view('home', compact('pendientes', 'hoy', 'dias', 'cierres'));
}
} elseif (($get['p'] ?? false) === 'auth' or ($get['page'] ?? false) === 'auth') {
$route = route();
if ($route !== false) {
echo $route;
} else {
echo view('guest');
}
} else {
echo view('guest');
}
} catch (Exception $e) {
$this->logger->warning($e);
die();
} catch (Error $e) {
$this->logger->error($e);
die();
}
$this->benchmark->stop();
if (($get['ajax'] ?? false) !== '1' and ($get['p'] ?? false) !== 'ajax' and ($get['p'] ?? false) !== 'informes') {
$this->benchmark->show();
}
}
}
$container = new Container([
Monolog\Logger::class => function() {
return (new Monolog\Logger('global'))
->pushHandler((new Handler\FilterHandler(
(new Handler\RotatingFileHandler('/logs/php.log'))
->setFormatter(new Formatter\LineFormatter(null, null, true)),
Level::Debug,
Level::Notice
)))
->pushHandler((new Handler\FilterHandler(
(new Handler\NativeMailerHandler('jpvial@incoviba.cl', 'Error - Incoviba', 'alert@incoviba.cl'))
->setFormatter(new Formatter\HtmlFormatter()),
Level::Warning,
Level::Emergency
)))
->pushProcessor(new Processor\PsrLogMessageProcessor())
->pushProcessor(new Processor\IntrospectionProcessor())
->pushProcessor(new Processor\HostnameProcessor())
->pushProcessor(new Processor\WebProcessor())
->pushProcessor(new Processor\MemoryPeakUsageProcessor());
},
Request::class => function() {
return Request::createFromGlobals();
},
Auth::class => function() {
return new Auth();
},
Benchmark::class => function(Container $container) {
return new Benchmark($container->get(Monolog\Logger::class), config('app.debug'), config('app.benchmark'));
}
]);
$app = $container->get(App::class);
$app->run();