diff --git a/code/app/Aggregate.php b/code/app/Aggregate.php index 54eef75a..fd5f559e 100644 --- a/code/app/Aggregate.php +++ b/code/app/Aggregate.php @@ -75,16 +75,30 @@ public function getCirclesAttribute() public function circlesByGroup(): array { $ret = []; + $user_groups = []; foreach($this->circles as $circle) { if (isset($ret[$circle->group->id]) == false) { $ret[$circle->group->id] = (object) [ 'group' => $circle->group, - 'circles' => [], + 'circles' => new Collection(), ]; } - $ret[$circle->group->id]->circles[] = $circle; + $ret[$circle->group->id]->circles->push($circle); + + if ($circle->group->context == 'user') { + $user_groups[] = $circle->group->id; + } + } + + $user_groups = array_unique($user_groups); + $extra_groups = Group::where('context', 'user')->whereNotIn('id', $user_groups)->get(); + foreach($extra_groups as $extra) { + $ret[$extra->id] = (object) [ + 'group' => $extra, + 'circles' => $extra->circles, + ]; } return $ret; diff --git a/code/app/Formatters/User.php b/code/app/Formatters/User.php index dba8f1d4..5c53e7cb 100644 --- a/code/app/Formatters/User.php +++ b/code/app/Formatters/User.php @@ -39,7 +39,7 @@ private static function columnsByFeatures($ret) 'name' => _i('Gruppo %s', [$group->name]), 'checked' => true, 'format' => function($obj, $context) use ($group) { - return join(' - ', $obj->circlesByGroup($group)->circles); + return join(' - ', array_map(fn($c) => $c->printableName(), $obj->circlesByGroup($group)->circles)); }, ]; } diff --git a/code/app/Group.php b/code/app/Group.php index be28fbab..5d419d5c 100644 --- a/code/app/Group.php +++ b/code/app/Group.php @@ -29,59 +29,4 @@ public function circles(): HasMany { return $this->hasMany(Circle::class); } - - private static function sortByUserName($bookings) - { - usort($bookings, function($a, $b) { - return $a->user->printableName() <=> $b->user->printableName(); - }); - - return $bookings; - } - - private static function sortByCircle($bookings) - { - usort($bookings, function($a, $b) { - return $a->circles_sorting <=> $b->circles_sorting; - }); - - return $bookings; - } - - public static function sortBookings($bookings, $circles) - { - $actual_circles = Circle::whereIn('id', $circles)->with('group')->get(); - - if ($actual_circles->isEmpty()) { - $tmp_bookings = $bookings; - } - else { - $tmp_bookings = []; - - foreach($bookings as $booking) { - $mycircles = $booking->involvedCircles(); - $valid = true; - - foreach($circles as $required_circle) { - if (is_null($mycircles->firstWhere('id', $required_circle->id))) { - $valid = false; - break; - } - } - - if ($valid) { - $tmp_bookings[] = $booking; - } - } - } - - if (in_array('all_by_name', $circles)) { - $bookings = self::sortByUserName($tmp_bookings); - } - else { - $bookings = self::sortByCircle($tmp_bookings); - } - - return $bookings; - } } diff --git a/code/app/Helpers/CirclesFilter.php b/code/app/Helpers/CirclesFilter.php new file mode 100644 index 00000000..59d11f52 --- /dev/null +++ b/code/app/Helpers/CirclesFilter.php @@ -0,0 +1,138 @@ +circles = []; + + $all = $aggregate->circlesByGroup(); + if (empty($all) == false) { + $selected = null; + + foreach($all as $group_id => $circles) { + $this->groups[$group_id] = []; + + $key = sprintf('circles_%s', $group_id); + $selected = $request[$key] ?? 'all_by_name'; + + if ($selected != 'all_by_name' && $selected != 'all_by_place') { + $circle = Circle::find($selected); + if ($circle) { + $this->circles[] = $circle; + $this->groups[$group_id][] = $circle; + } + } + } + + if (count($all) > 1) { + $this->mode = $request['circles_master_sorting'] ?? 'all_by_name'; + } + else { + $this->mode = $selected == 'all_by_place' ? 'all_by_place' : 'all_by_name'; + } + } + else { + $this->mode = 'all_by_name'; + } + } + + public function getMode() + { + return $this->mode; + } + + public function combinations() + { + if ($this->mode == 'all_by_place') { + $result = [[]]; + + foreach($this->groups as $key => $circles) { + $append = []; + + foreach($result as $product) { + foreach($circles as $item) { + $product[$key] = $item; + $append[] = $product; + } + } + + $result = $append; + } + + return $result; + } + else { + throw new \Exception("La combinazione di gruppi non dovrebbe essere usata se non quando si ordina per cerchie", 1); + } + } + + private function sortByUserName($bookings) + { + usort($bookings, function($a, $b) { + return $a->user->printableName() <=> $b->user->printableName(); + }); + + return $bookings; + } + + private function sortByCircle($bookings) + { + usort($bookings, function($a, $b) { + return $a->circles_sorting <=> $b->circles_sorting; + }); + + return $bookings; + } + + public function sortBookings($bookings) + { + $actual_circles = $this->circles; + + if (empty($this->circles)) { + $tmp_bookings = $bookings; + } + else { + $tmp_bookings = []; + + foreach($bookings as $booking) { + $mycircles = $booking->involvedCircles(); + $valid = true; + + foreach($this->circles as $required_circle) { + if (is_null($mycircles->firstWhere('id', $required_circle->id))) { + $valid = false; + break; + } + } + + if ($valid) { + $tmp_bookings[] = $booking; + } + } + } + + if ($this->mode == 'all_by_place') { + $bookings = $this->sortByCircle($tmp_bookings); + } + else { + $bookings = $this->sortByUserName($tmp_bookings); + } + + return $bookings; + } +} diff --git a/code/app/Http/Controllers/GroupsController.php b/code/app/Http/Controllers/GroupsController.php index 1515e68f..e806c056 100644 --- a/code/app/Http/Controllers/GroupsController.php +++ b/code/app/Http/Controllers/GroupsController.php @@ -6,6 +6,9 @@ use App\Services\GroupsService; +use App\User; +use App\Group; + class GroupsController extends BackedController { public function __construct(GroupsService $service) @@ -25,4 +28,31 @@ public function show($id) return view('groups.edit', ['group' => $g]); }); } + + /* + Mostra la griglia di assegnazione massiva dei Gruppi con context = User + */ + public function matrix() + { + $this->ensureAuth(['gas.config' => 'gas']); + return view('groups.matrix'); + } + + /* + Per salvare le modifiche sulla griglia di assegnazione massiva + */ + public function saveMatrix(Request $request) + { + $this->ensureAuth(['gas.config' => 'gas']); + + $users = $request->input('users', []); + $users = User::topLevel()->whereIn('id', $users)->get(); + + $request = $request->all(); + foreach($users as $user) { + $user->readCircles($request); + } + + return $this->successResponse(); + } } diff --git a/code/app/Models/Concerns/InCircles.php b/code/app/Models/Concerns/InCircles.php index 2dfbd54b..9e9fed73 100644 --- a/code/app/Models/Concerns/InCircles.php +++ b/code/app/Models/Concerns/InCircles.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; use App\Circle; +use App\Group; trait InCircles { @@ -59,5 +60,20 @@ public function circlesByGroup($group = null) return $ret; } + public function readCircles($request) + { + $groups = $request['groups'] ?? []; + $groups = Group::whereIn('id', $groups)->get(); + + $circles = []; + + foreach($groups as $group) { + $key = sprintf('circles__%s__%s', $this->id, $group->id); + $circles = array_merge($circles, $request[$key] ?? []); + } + + $this->circles()->sync($circles); + } + public abstract function eligibleGroups(); } diff --git a/code/app/Printers/Aggregate.php b/code/app/Printers/Aggregate.php index 783fc07a..47ac0734 100644 --- a/code/app/Printers/Aggregate.php +++ b/code/app/Printers/Aggregate.php @@ -4,11 +4,11 @@ use Illuminate\Support\Str; use Illuminate\Support\Arr; - -use App; +use Illuminate\Support\Facades\App; use PDF; use ezcArchive; +use App\Helpers\CirclesFilter; use App\Printers\Concerns\Orders; use App\Printers\Components\Document; use App\Printers\Components\Header; @@ -27,7 +27,7 @@ protected function handleShipping($obj, $request) $fields = splitFields($required_fields); $status = $request['status'] ?? 'pending'; - $circles = $request['circles'] ?? ['all_by_name']; + $circles = new CirclesFilter($obj, $request); $temp_data = []; foreach($obj->orders as $order) { @@ -79,7 +79,7 @@ protected function handleShipping($obj, $request) $all_gas = (App::make('GlobalScopeHub')->enabled() == false); usort($data->contents, function($a, $b) use ($circles, $all_gas) { - if (in_array('all_by_place', $circles) && $a->circles_sorting != $b->circles_sorting) { + if ($circles->getMode() == 'all_by_place' && $a->circles_sorting != $b->circles_sorting) { return $a->circles_sorting <=> $b->circles_sorting; } @@ -172,7 +172,7 @@ protected function handleSummary($obj, $request) else { $required_fields = $request['fields'] ?? []; $status = $request['status']; - $circles = $request['circles'] ?? ['no']; + $circles = new CirclesFilter($obj, $request); $document = new Document($subtype); @@ -217,7 +217,7 @@ private function orderTopBookingsByShipping($aggregate, $circles, $status = null $bookings = $bookings->where('status', $status); } - return Group::sortBookings($bookings, $circles); + return $circles->sortBookings($bookings); } private function formatTableRows($aggregate, $circles, $status, $fields, &$all_products) diff --git a/code/app/Printers/Concerns/Shipping.php b/code/app/Printers/Concerns/Shipping.php index 90c3bbf7..90003840 100644 --- a/code/app/Printers/Concerns/Shipping.php +++ b/code/app/Printers/Concerns/Shipping.php @@ -76,7 +76,7 @@ public function formatShipping($order, $fields, $status, $circles, $extra_modifi $internal_offsets = $this->offsetsByStatus($status); $bookings = $order->topLevelBookings(null); - $bookings = Group::sortBookings($bookings, $circles); + $bookings = $circles->sortBookings($bookings); $listed_products = []; $modifiers = $order->involvedModifiers(true); diff --git a/code/app/Printers/Concerns/Summary.php b/code/app/Printers/Concerns/Summary.php index 849ec6c8..d6656aea 100644 --- a/code/app/Printers/Concerns/Summary.php +++ b/code/app/Printers/Concerns/Summary.php @@ -88,15 +88,11 @@ private function formatSummaryShipping($order, $fields, $status, $circles, $extr protected function formatSummary($order, $document, $fields, $status, $circles, $extra_modifiers) { - /* - TODO: FIXARE QUESTO - */ - if ($shipping_place && $shipping_place == 'all_by_place') { - $places = Delivery::orderBy('name', 'asc')->get(); - foreach($places as $place) { - $table = $this->formatSummaryShipping($order, $fields, $status, $place->id, $extra_modifiers); + if (in_array('all_by_place', $circles)) { + foreach($order->circles as $circle) { + $table = $this->formatSummaryShipping($order, $fields, $status, [$circle->id], $extra_modifiers); if ($table) { - $document->append(new Header($place->printableName())); + $document->append(new Header($circle->printableName())); $document->append($table); } } diff --git a/code/app/Printers/Order.php b/code/app/Printers/Order.php index cfdfa05f..55292052 100644 --- a/code/app/Printers/Order.php +++ b/code/app/Printers/Order.php @@ -2,10 +2,11 @@ namespace App\Printers; -use Auth; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Mail; use PDF; -use Mail; +use App\Helpers\CirclesFilter; use App\Printers\Concerns\Orders; use App\Formatters\User as UserFormatter; use App\Notifications\GenericOrderShipping; @@ -20,12 +21,6 @@ class Order extends Printer { use Orders; - private function orderTopBookingsByShipping($order, $circles, $status = null) - { - $bookings = $order->topLevelBookings($status); - return Group::sortBookings($bookings, $circles); - } - private function sendDocumentMail($request, $temp_file_path) { $recipient_mails = $request['recipient_mail_value'] ?? []; @@ -50,7 +45,7 @@ protected function handleShipping($obj, $request) $extra_modifiers = $request['extra_modifiers'] ?? 0; $required_fields = $request['fields'] ?? []; $fields = splitFields($required_fields); - $circles = $request['circles'] ?? ['all_by_name']; + $circles = new CirclesFilter($obj->aggregate, $request); $data = $this->formatShipping($obj, $fields, $status, $circles, $extra_modifiers); @@ -158,7 +153,7 @@ protected function handleSummary($obj, $request) $required_fields = $this->autoGuessFields($obj); } - $circles = $request['circles'] ?? ['no']; + $circles = new CirclesFilter($obj->aggregate, $request); $document = new Document($subtype); @@ -185,7 +180,9 @@ protected function handleSummary($obj, $request) private function formatTableRows($order, $circles, $status, $fields, &$all_products) { - $bookings = $this->orderTopBookingsByShipping($order, $circles, $status == 'saved' ? 'saved' : null); + $bookings = $order->topLevelBookings($status == 'saved' ? 'saved' : null); + $bookings = $circles->sortBookings($bookings); + list($get_total, $get_function) = $this->bookingsRules($status); $data = []; @@ -211,7 +208,7 @@ protected function handleTable($obj, $request) $send_mail = isset($request['send_mail']); $status = $request['status'] ?? 'pending'; $include_missing = $request['include_missing'] ?? 'no'; - $circles = $request['circles'] ?? ['no']; + $circles = new CirclesFilter($obj->aggregate, $request); $required_fields = $request['fields'] ?? []; $fields = splitFields($required_fields); diff --git a/code/app/Services/CirclesService.php b/code/app/Services/CirclesService.php index 4c1de380..d0f7e48b 100644 --- a/code/app/Services/CirclesService.php +++ b/code/app/Services/CirclesService.php @@ -40,7 +40,7 @@ public function store(array $request) if ($was_first) { if ($group->context == 'user') { - foreach(User::all() as $user) { + foreach(User::topLevel()->get() as $user) { $user->circles()->attach($c->id); } } @@ -81,7 +81,7 @@ public function destroy($id) $new_default->is_default = true; $new_default->save(); - $users = User::whereHas('circles', function($query) use ($c) { + $users = User::topLevel()->whereHas('circles', function($query) use ($c) { $query->where('circles.id', $c->id); })->get(); diff --git a/code/app/Services/UsersService.php b/code/app/Services/UsersService.php index b51c28d9..08aeb9ca 100644 --- a/code/app/Services/UsersService.php +++ b/code/app/Services/UsersService.php @@ -245,7 +245,7 @@ public function update($id, array $request) $this->readRID($user, $request); $user->save(); - $user->circles()->sync($request['circles'] ?? []); + $user->readCircles($request); handleFileUpload($request, $user, 'picture'); $user->updateContacts($request); diff --git a/code/app/User.php b/code/app/User.php index c6bba412..55ab9498 100644 --- a/code/app/User.php +++ b/code/app/User.php @@ -84,10 +84,12 @@ public function suppliers(): BelongsToMany public function scopeFilterEnabled($query) { $user = Auth::user(); - if ($user->can('users.admin', $user->gas)) + if ($user->can('users.admin', $user->gas)) { return $query->withTrashed(); - else + } + else { return $query; + } } public function scopeSorted($query) @@ -95,6 +97,11 @@ public function scopeSorted($query) return $query->orderBy('lastname', 'asc')->orderBy('firstname', 'asc'); } + public function scopeTopLevel($query) + { + return $query->whereNull('parent_id'); + } + public function getPaymentMethodAttribute() { return $this->innerCache('payment_method', function($obj) { diff --git a/code/resources/views/booking/list.blade.php b/code/resources/views/booking/list.blade.php index cf01e569..a129ade8 100644 --- a/code/resources/views/booking/list.blade.php +++ b/code/resources/views/booking/list.blade.php @@ -78,7 +78,16 @@
- @foreach($aggregate->bookings as $booking) + @php + + $bookings = $aggregate->bookings; + usort($bookings, function($a, $b) { + return $a->user->printableName() <=> $b->user->printableName(); + }); + + @endphp + + @foreach($bookings as $booking){{ _i('Nome') }} | + @foreach($groups as $group) +
+ |
+ @endforeach
+
---|---|
+ |
+ @foreach($groups as $group)
+
+ |
+ @endforeach
+