madbob/GASdottoNG

View on GitHub
code/app/Singletons/OrderNumbersDispatcher.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

namespace App\Singletons;

use Illuminate\Support\Facades\DB;

use App\Order;

/*
    Questo serve a generare i numeri identificativi degli ordini.
    Essi non sono salvati permanentemente nel database onde evitare di dover
    ricalcolare tutto quando un ordine viene cancellato o le date sono
    modificate, ma sono dinamicamente generati in virtù di quanti ordini
    precedenti ci sono stati
*/
class OrderNumbersDispatcher
{
    private $cache = [];

    private function initCache($year)
    {
        if (array_key_exists($year, $this->cache) == false) {
            /*
                Questo di fatto serve solo ad eseguire gli unit test
            */
            $this->cache[$year] = Order::whereYear('start', $year)->orderBy('start', 'asc')->orderBy('id', 'asc')->pluck('start', 'id');
        }
    }

    public function getNumber($order)
    {
        $year = date('Y', strtotime($order->start));
        $this->initCache($year);

        $counter = 0;

        foreach($this->cache[$year] as $id => $start) {
            if ($start < $order->start || ($start == $order->start && $id < $order->id)) {
                $counter++;
                continue;
            }

            break;
        }

        return sprintf('%d / %d', $counter + 1, $year);
    }
}