madbob/GASdottoNG

View on GitHub
code/app/Http/Controllers/InvoicesController.php

Summary

Maintainability
A
55 mins
Test Coverage
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\DB;

use App\Services\InvoicesService;
use App\Exceptions\AuthException;
use App\Exceptions\IllegalArgumentException;
use App\Invoice;
use App\Order;
use App\Movement;
use App\MovementType;

class InvoicesController extends BackedController
{
    public function __construct(InvoicesService $service)
    {
        $this->middleware('auth');

        $this->commonInit([
            'reference_class' => Invoice::class,
            'service' => $service,
        ]);
    }

    public function index(Request $request)
    {
        $past = date('Y-m-d', strtotime('-1 months'));
        $future = date('Y-m-d', strtotime('+10 years'));
        $invoices = $this->service->list($past, $future, 0);

        return view('invoice.index', [
            'invoices' => $invoices,
        ]);
    }

    public function show(Request $request, $id)
    {
        $invoice = $this->service->show($id);
        $user = $request->user();

        if ($user->can('supplier.invoices', $invoice->supplier)) {
            return view('invoice.edit', [
                'invoice' => $invoice
            ]);
        }
        else {
            return view('invoice.show', [
                'invoice' => $invoice
            ]);
        }
    }

    public function products($id)
    {
        return view('invoice.products', $this->service->products($id));
    }

    public function orders($id)
    {
        $invoice = $this->service->show($id);
        return view('invoice.orders', [
            'invoice' => $invoice,
        ]);
    }

    private function validMovementTypes()
    {
        $alternative_types = [];
        $available_types = movementTypes();

        foreach($available_types as $at) {
            if ($at->validForInvoices()) {
                $alternative_types[$at->id] = $at->name;
            }
        }

        return $alternative_types;
    }

    public function getMovements(Request $request, $id)
    {
        $invoice = $this->service->show($id);
        $user = $this->ensureAuth(['movements.admin' => 'gas', 'supplier.movements' => $invoice->supplier]);

        $invoice_grand_total = $invoice->total + $invoice->total_vat;
        $main = Movement::generate('invoice-payment', $user->gas, $invoice, $invoice_grand_total);
        $main->notes = _i('Pagamento fattura %s', $invoice->printableName());
        $movements = new Collection();
        $movements->push($main);

        list($orders_total_taxable, $orders_total_tax) = $invoice->totals();
        $alternative_types = $this->validMovementTypes();

        return view('invoice.movements', [
            'invoice' => $invoice,
            'total_orders' => $orders_total_taxable,
            'tax_orders' => $orders_total_tax,
            'movements' => $movements,
            'alternative_types' => $alternative_types
        ]);
    }

    public function postMovements(Request $request, $id)
    {
        return $this->easyExecute(function() use ($id, $request) {
            $this->service->saveMovements($id, $request->all());
            return $this->successResponse();
        });
    }

    public function wiring(Request $request, $step, $id)
    {
        return $this->easyExecute(function() use ($id, $step, $request) {
            $this->service->wire($id, $step, $request->all());
            return $this->successResponse();
        });
    }

    private function outputCSV($elements)
    {
        $filename = _i('Esportazione fatture GAS %s.csv', date('d/m/Y'));
        $headers = [_i('Fornitore'), _i('Data'), _i('Numero'), _i('Imponibile'), _i('IVA')];

        return output_csv($filename, $headers, $elements, function($invoice) {
            return [
                $invoice->supplier->printableName(),
                $invoice->date,
                $invoice->number,
                $invoice->total,
                $invoice->total_vat,
            ];
        });
    }

    public function search(Request $request)
    {
        $start = decodeDate($request->input('startdate'));
        $end = decodeDate($request->input('enddate'));
        $supplier_id = $request->input('supplier_id');
        $elements = $this->service->list($start, $end, $supplier_id);

        $format = $request->input('format', 'none');

        if ($format == 'none') {
            $list_identifier = $request->input('list_identifier', 'invoice-list');
            return view('commons.loadablelist', [
                'identifier' => $list_identifier,
                'items' => $elements,
                'legend' => (object)[
                    'class' => Invoice::class,
                ],
            ]);
        }
        else if ($format == 'csv') {
            return $this->outputCSV($elements);
        }
    }
}