<commit_before><?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Auth;
use Theme;
use PDF;
use App\Supplier;
use App\Product;
use App\Order;
use App\Aggregate;
use App\Booking;
use App\BookedProduct;

/*
    Attenzione, quando si maneggia in questo file bisogna ricordare la
    distinzione tra Ordine e Aggregato.
    Un Ordine fa riferimento ad un fornitore (per il quale l'utente può
    avere o no permessi di modifica) e contiene dei prodotti. Un Aggregato è
    un insieme di Ordini.
    Per comodità, qui si assume che tutti gli Ordini siano sempre parte di
    un Aggregato, anche se contiene solo l'Ordine stesso. In alcuni casi gli
    ID passati come parametro alle funzioni fanno riferimento ad un Ordine,
    in altri casi ad un Aggregato.
*/

class OrdersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    private function defaultOrders()
    {
        /*
            La selezione degli ordini da visualizzare si può forse
            fare con una query complessa, premesso che bisogna
            prendere in considerazione i permessi che l'utente
            corrente ha nei confronti dei fornitori degli ordini
            inclusi negli aggregati
        */

        $orders = [];

        $aggregates = Aggregate::with('orders')->get();
        foreach ($aggregates as $aggregate) {
            $ok = false;

            foreach ($aggregate->orders as $order) {
                if ($order->status == 'open') {
                    $ok = true;
                    break;
                }
                if ($order->status != 'archived' && $order->supplier->userCan('supplier.orders|supplier.shippings')) {
                    $ok = true;
                    break;
                }
            }

            if ($ok == true) {
                $orders[] = $aggregate;
            }
        }

        return $orders;
    }

    public function index()
    {
        $orders = $this->defaultOrders();

        return Theme::view('pages.orders', ['orders' => $orders]);
    }

    public function store(Request $request)
    {
        DB::beginTransaction();

        $supplier = Supplier::findOrFail($request->input('supplier_id', -1));
        if ($supplier->userCan('supplier.orders') == false) {
            return $this->errorResponse('Non autorizzato');
        }

        $o = new Order();
        $o->supplier_id = $request->input('supplier_id');

        $now = date('Y-m-d');
        $o->start = decodeDate($request->input('start'));
        $o->end = decodeDate($request->input('end'));
        $o->status = $request->input('status');

        $s = $request->input('shipping');
        if ($s != '') {
            $o->shipping = decodeDate($s);
        } else {
            $o->shipping = '';
        }

        $a = new Aggregate();
        $a->save();

        $o->aggregate_id = $a->id;
        $o->save();

        $o->products()->sync($supplier->products()->where('active', '=', true)->get());

        return $this->successResponse([
            'id' => $a->id,
            'header' => $a->printableHeader(),
            'url' => url('aggregates/'.$a->id),
        ]);
    }

    public function show(Request $request, $id)
    {
        $order = Order::findOrFail($id);
        $summary = $order->calculateSummary();
        return response()->json($summary);
    }

    public function update(Request $request, $id)
    {
        DB::beginTransaction();

        $order = Order::findOrFail($id);
        if ($order->supplier->userCan('supplier.orders') == false) {
            return $this->errorResponse('Non autorizzato');
        }

        $order->start = decodeDate($request->input('start'));
        $order->end = decodeDate($request->input('end'));
        $order->status = $request->input('status');
        $order->discount = $request->input('discount');

        $s = $request->input('shipping');
        if ($s != '') {
            $order->shipping = decodeDate($s);
        } else {
            $order->shipping = '';
        }

        $order->save();

        $new_products = [];
        $enabled = $request->input('enabled', []);
        $products = $request->input('productid');

        for ($i = 0; $i < count($products); ++$i) {
            $id = $products[$i];

            foreach ($enabled as $en) {
                if ($en == $id) {
                    $new_products[] = $id;
                    break;
                }
            }
        }

        $order->products()->sync($new_products);

        $discounted = $request->input('discounted', []);
        foreach ($order->products as $product) {
            $dis = false;

            foreach ($discounted as $en) {
                if ($en == $product->id) {
                    $dis = true;
                    break;
                }
            }

            if ($product->pivot->discount_enabled != $dis) {
                $order->products()->updateExistingPivot($product->id, ['discount_enabled' => $dis]);
            }
        }<commit_msg>se prodotto disabilitato da ordine, viene rimosso anche da relative prenotazioni<commit_after><?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Auth;
use Theme;
use PDF;
use App\Supplier;
use App\Product;
use App\Order;
use App\Aggregate;
use App\Booking;
use App\BookedProduct;

/*
    Attenzione, quando si maneggia in questo file bisogna ricordare la
    distinzione tra Ordine e Aggregato.
    Un Ordine fa riferimento ad un fornitore (per il quale l'utente può
    avere o no permessi di modifica) e contiene dei prodotti. Un Aggregato è
    un insieme di Ordini.
    Per comodità, qui si assume che tutti gli Ordini siano sempre parte di
    un Aggregato, anche se contiene solo l'Ordine stesso. In alcuni casi gli
    ID passati come parametro alle funzioni fanno riferimento ad un Ordine,
    in altri casi ad un Aggregato.
*/

class OrdersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    private function defaultOrders()
    {
        /*
            La selezione degli ordini da visualizzare si può forse
            fare con una query complessa, premesso che bisogna
            prendere in considerazione i permessi che l'utente
            corrente ha nei confronti dei fornitori degli ordini
            inclusi negli aggregati
        */

        $orders = [];

        $aggregates = Aggregate::with('orders')->get();
        foreach ($aggregates as $aggregate) {
            $ok = false;

            foreach ($aggregate->orders as $order) {
                if ($order->status == 'open') {
                    $ok = true;
                    break;
                }
                if ($order->status != 'archived' && $order->supplier->userCan('supplier.orders|supplier.shippings')) {
                    $ok = true;
                    break;
                }
            }

            if ($ok == true) {
                $orders[] = $aggregate;
            }
        }

        return $orders;
    }

    public function index()
    {
        $orders = $this->defaultOrders();

        return Theme::view('pages.orders', ['orders' => $orders]);
    }

    public function store(Request $request)
    {
        DB::beginTransaction();

        $supplier = Supplier::findOrFail($request->input('supplier_id', -1));
        if ($supplier->userCan('supplier.orders') == false) {
            return $this->errorResponse('Non autorizzato');
        }

        $o = new Order();
        $o->supplier_id = $request->input('supplier_id');

        $now = date('Y-m-d');
        $o->start = decodeDate($request->input('start'));
        $o->end = decodeDate($request->input('end'));
        $o->status = $request->input('status');

        $s = $request->input('shipping');
        if ($s != '') {
            $o->shipping = decodeDate($s);
        } else {
            $o->shipping = '';
        }

        $a = new Aggregate();
        $a->save();

        $o->aggregate_id = $a->id;
        $o->save();

        $o->products()->sync($supplier->products()->where('active', '=', true)->get());

        return $this->successResponse([
            'id' => $a->id,
            'header' => $a->printableHeader(),
            'url' => url('aggregates/'.$a->id),
        ]);
    }

    public function show(Request $request, $id)
    {
        $order = Order::findOrFail($id);
        $summary = $order->calculateSummary();
        return response()->json($summary);
    }

    public function update(Request $request, $id)
    {
        DB::beginTransaction();

        $order = Order::findOrFail($id);
        if ($order->supplier->userCan('supplier.orders') == false) {
            return $this->errorResponse('Non autorizzato');
        }

        $order->start = decodeDate($request->input('start'));
        $order->end = decodeDate($request->input('end'));
        $order->status = $request->input('status');
        $order->discount = $request->input('discount');

        $s = $request->input('shipping');
        if ($s != '') {
            $order->shipping = decodeDate($s);
        } else {
            $order->shipping = '';
        }

        $order->save();

        $new_products = [];
        $enabled = $request->input('enabled', []);
        $products = $request->input('productid');

        for ($i = 0; $i < count($products); ++$i) {
            $id = $products[$i];

            foreach ($enabled as $en) {
                if ($en == $id) {
                    $new_products[] = $id;
                    break;
                }
            }
        }

        /*
            Se vengono rimossi dei prodotti dall'ordine, ne elimino tutte le
            relative prenotazioni sinora avvenute
        */
        $removed_products = $order->products()->whereNotIn('id', $new_products)->lists('id')->toArray();
        foreach($order->bookings as $booking) {
            $booking->products()->whereIn('product_id', $removed_products)->delete();
            if ($booking->products->isEmpty())
                $booking->delete();
        }

        $order->products()->sync($new_products);

        $discounted = $request->input('discounted', []);
        foreach ($order->products as $product) {
            $dis = false;

            foreach ($discounted as $en) {
                if ($en == $product->id) {
                    $dis = true;
                    break;
                }
            }

            if ($product->pivot->discount_enabled != $dis) {
                $order->products()->updateExistingPivot($product->id, ['discount_enabled' => $dis]);
            }
        }
{'fraction_non_alphanumeric': 0.14943705220061412, 'fraction_numerical': 0.0003721968921559505, 'mean_word_length': 1.882274068114776, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 152, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3044', 'n_tokens_mistral': 3137, 'n_tokens_neox': 3060, 'n_words': 721}