madbob/GASdottoNG

View on GitHub
code/app/Services/SuppliersService.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Services;

use App\Exceptions\AuthException;

use Auth;
use Log;
use DB;
use PDF;

use App\Formatters\Product as ProductFormatter;
use App\User;
use App\Supplier;
use App\Product;

class SuppliersService extends BaseService
{
    private function accessible($user)
    {
        $suppliers_id = [];

        foreach($user->targetsByAction('supplier.modify', false) as $supplier) {
            $suppliers_id[] = $supplier->id;
        }

        foreach($user->targetsByAction('supplier.orders', false) as $supplier) {
            $suppliers_id[] = $supplier->id;
        }

        foreach($user->targetsByAction('supplier.shippings', false) as $supplier) {
            $suppliers_id[] = $supplier->id;
        }

        return array_unique($suppliers_id);
    }

    public function list($term = '', $all = false)
    {
        $user = $this->ensureAuth();

        $query = Supplier::orderBy('name', 'asc');

        if (!empty($term)) {
            $query->where(function ($query) use ($term) {
                $query->where('name', 'LIKE', "%$term%");
            });
        }

        if ($user->can('supplier.view', $user->gas) == false && $user->can('supplier.add', $user->gas) == false) {
            $suppliers_id = $this->accessible($user);
            $query->whereIn('id', $suppliers_id);
        }

        if ($all)
            $query->filterEnabled();

        $suppliers = $query->get();
        return $suppliers;
    }

    public function show($id)
    {
        $user = $this->ensureAuth();

        if ($user->can('supplier.view', $user->gas) == false && $user->can('supplier.add', $user->gas) == false) {
            $suppliers_id = $this->accessible($user);
            if (in_array($id, $suppliers_id) == false) {
                throw new AuthException(401);
            }
        }

        return Supplier::withTrashed()->findOrFail($id);
    }

    private function setCommonAttributes($supplier, $request)
    {
        $this->setIfSet($supplier, $request, 'name');
        $this->setIfSet($supplier, $request, 'business_name');
        $this->setIfSet($supplier, $request, 'taxcode');
        $this->setIfSet($supplier, $request, 'vat');
        $this->setIfSet($supplier, $request, 'description');
        $this->setIfSet($supplier, $request, 'payment_method');
        $this->setIfSet($supplier, $request, 'order_method');
        $this->boolIfSet($supplier, $request, 'fast_shipping_enabled');
        $this->boolIfSet($supplier, $request, 'unmanaged_shipping_enabled');
        $this->setIfSet($supplier, $request, 'notify_on_close_enabled');

        if (isset($request['status'])) {
            $supplier->setStatus($request['status'], $request['deleted_at'], $request['suspended_at']);
        }
    }

    public function store(array $request)
    {
        $this->ensureAuth(['supplier.add' => 'gas']);

        if (!isset($request['payment_method']) || is_null($request['payment_method'])) {
            $request['payment_method'] = '';
        }

        if (!isset($request['order_method']) || is_null($request['order_method'])) {
            $request['order_method'] = '';
        }

        $supplier = new Supplier();
        $this->setCommonAttributes($supplier, $request);
        $supplier->save();

        return $supplier;
    }

    public function update($id, array $request)
    {
        $supplier = $this->show($id);
        $this->ensureAuth(['supplier.modify' => $supplier]);

        try {
            $supplier = DB::transaction(function () use ($supplier, $request) {
                $this->setCommonAttributes($supplier, $request);
                $supplier->save();
                $supplier->updateContacts($request);
                return $supplier;
            });
        }
        catch(\Exception $e) {
            Log::error('Errore aggiornamento fornitore: ' . $e->getMessage() . ' - ' . print_r($request, true));
            $supplier = null;
        }

        return $supplier;
    }

    public function catalogue($id, $format, array $request)
    {
        $this->ensureAuth();

        $format = $format ?: $request['format'];
        $supplier = $this->show($id);

        if ($format == 'gdxp') {
            return redirect($supplier->exportableURL());
        }

        /*
            Questi sono i dati di default, da usare quando si fa il download del
            listino come allegato al fornitore (e dunque non si passa per il
            pannello di selezione dei campi).
            Cfr. Supplier::defaultAttachments()
        */
        $fields = $request['fields'] ?? ['name', 'measure', 'price', 'active'];
        $headers = ProductFormatter::getHeaders($fields);
        $filename = sanitizeFilename(_i('Listino %s.%s', [$supplier->name, $format]));

        $products = $supplier->products()->sorted()->get();
        $data = ProductFormatter::formatArray($products, $fields);

        if ($format == 'pdf') {
            $pdf = PDF::loadView('documents.cataloguepdf', ['supplier' => $supplier, 'headers' => $headers, 'data' => $data]);
            return $pdf->download($filename);
        }
        elseif ($format == 'csv') {
            return output_csv($filename, $headers, $data, null);
        }
    }

    public function destroy($id)
    {
        $supplier = DB::transaction(function () use ($id) {
            $supplier = $this->show($id);

            if ($supplier->trashed()) {
                $this->ensureAuth(['supplier.add' => 'gas']);

                foreach($supplier->products()->withTrashed()->get() as $product) {
                    $product->forceDelete();
                }

                $supplier->forceDelete();
            }
            else {
                $this->ensureAuth(['supplier.modify' => $supplier]);
                $supplier->delete();
            }

            return $supplier;
        });

        return $supplier;
    }
}