Skip to content

Commit

Permalink
aggiustamenti in filtri gruppi per esportazione documenti degli ordini
Browse files Browse the repository at this point in the history
  • Loading branch information
madbob committed May 6, 2024
1 parent c05a9e3 commit bba0d4b
Show file tree
Hide file tree
Showing 22 changed files with 355 additions and 147 deletions.
18 changes: 16 additions & 2 deletions code/app/Aggregate.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion code/app/Formatters/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -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));
},
];
}
Expand Down
55 changes: 0 additions & 55 deletions code/app/Group.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
138 changes: 138 additions & 0 deletions code/app/Helpers/CirclesFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

/*
Qui vengono concentrate le funzioni usate per ordinare le prenotazioni degli
ordini in funzioni di gruppi e cerchie.
Usate in fase di stampa dei documenti esportati
*/

namespace App\Helpers;

use App\Circle;

class CirclesFilter
{
private $mode;
private $circles;
private $groups;

public function __construct($aggregate, $request)
{
$this->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;
}
}
30 changes: 30 additions & 0 deletions code/app/Http/Controllers/GroupsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

use App\Services\GroupsService;

use App\User;
use App\Group;

class GroupsController extends BackedController
{
public function __construct(GroupsService $service)
Expand All @@ -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();
}
}
16 changes: 16 additions & 0 deletions code/app/Models/Concerns/InCircles.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

use App\Circle;
use App\Group;

trait InCircles
{
Expand Down Expand Up @@ -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();
}
12 changes: 6 additions & 6 deletions code/app/Printers/Aggregate.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion code/app/Printers/Concerns/Shipping.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 4 additions & 8 deletions code/app/Printers/Concerns/Summary.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
Loading

0 comments on commit bba0d4b

Please sign in to comment.