Skip to content

Commit

Permalink
fix su calcolo modificatori
Browse files Browse the repository at this point in the history
  • Loading branch information
madbob committed Dec 18, 2023
1 parent bdfe393 commit 6f4a9b4
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 33 deletions.
1 change: 1 addition & 0 deletions code/app/Services/DynamicBookingsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ private function translateBooking($booking, $delivering)
}, []),
];

$booking->status = $delivering ? 'shipped' : 'pending';
$modified = $booking->applyModifiers(null, false);
foreach($modified as $mod) {
if (!isset($ret->modifiers[$mod->modifier_id])) {
Expand Down
85 changes: 52 additions & 33 deletions code/app/Singletons/ModifierEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

namespace App\Singletons;

use App\ModifiedValue;
use Illuminate\Support\Facades\Log;

use Log;
use App\ModifiedValue;
use App\Product;

class ModifierEngine
{
Expand Down Expand Up @@ -95,45 +96,68 @@ private function targetDefinition($modifier, $value)
return null;
}

private function handlingAttributes($booking, $modifier)
private function handlingAttributes($booking, $modifier, $attribute)
{
/*
Fintantoché l'ordine non è marcato come "consegnato" uso le quantità
prenotate come riferimento per i calcoli (sulle soglie o per la
distribuzione dei costi sulle prenotazioni).
Se poi, alla fine, le quantità consegnate non corrispondono con
quelle prenotate, e dunque i calcoli devono essere revisionati per
ridistribuire in modo corretto il tutto, allora uso come riferimento
le quantità realmente consegnate: tale ricalcolo viene invocato da
OrdersController::postFixModifiers(), previa conferma dell'utente,
quando l'ordine è davvero in stato "consegnato"
*/
if (in_array($booking->status, ['saved', 'shipped'])) {
switch($modifier->applies_type) {
case 'none':
/*
Se l'ordine è chiuso (ma non consegnato e archiviato) attingo dai
valori relativi, che includono sia il consegnato che il prenotato ma
non ancora consegnato. Questo si applica in particolare in fase di
consegna
*/
if ($modifier->applies_target == 'order' || $booking->order->status == 'closed') {
switch($modifier->$attribute) {
case 'quantity':
$attribute = 'delivered';
$attribute = 'relative_quantity';
break;
case 'none':
case 'price':
$attribute = 'price_delivered';
$attribute = 'relative_price';
break;
case 'weight':
$attribute = 'weight_delivered';
$attribute = 'relative_weight';
break;
default:
$attribute = '';
break;
}

$mod_attribute = 'price_delivered';
}
else {
$attribute = $modifier->applies_type;
$mod_attribute = 'relative_price';
}

/*
Se sono qui, è perché sono in fase di prenotazione dunque mi baso
sui valori del prenotato
*/
else if ($booking->status == 'pending') {
$attribute = $modifier->$attribute;
if ($attribute == 'none') {
$attribute = 'price';
}

$mod_attribute = 'price';
}

/*
In tutti gli altri casi, opero sui valori del consegnato
*/
else {
switch($modifier->$attribute) {
case 'none':
case 'quantity':
$attribute = 'delivered';
break;
case 'price':
$attribute = 'price_delivered';
break;
case 'weight':
$attribute = 'weight_delivered';
break;
default:
$attribute = '';
break;
}

$mod_attribute = 'price_delivered';
}

return [$attribute, $mod_attribute];
Expand Down Expand Up @@ -221,7 +245,7 @@ public function apply($modifier, $booking, $aggregate_data)

$product_target_id = 0;

if ($modifier->target_type == 'App\Product') {
if ($modifier->target_type == Product::class) {
$product_target_id = $modifier->target_id;

switch($modifier->applies_target) {
Expand Down Expand Up @@ -276,7 +300,7 @@ public function apply($modifier, $booking, $aggregate_data)
return null;
}

list($attribute, $mod_attribute) = $this->handlingAttributes($booking, $modifier);
list($attribute, $mod_attribute) = $this->handlingAttributes($booking, $modifier, 'applies_type');
$check_value = $check_target->$attribute ?? 0;
$target_definition = null;
$altered_amount = null;
Expand All @@ -295,14 +319,9 @@ public function apply($modifier, $booking, $aggregate_data)
singola prenotazione il suo valore relativo e proporzionale.
*/
if ($modifier->applies_target == 'order') {
$distribution_attribute = $modifier->distribution_type;
if ($distribution_attribute == 'none') {
$distribution_attribute = 'price';
}

$distribution_attribute = 'relative_' . $distribution_attribute;
list($distribution_attribute, $useless) = $this->handlingAttributes($booking, $modifier, 'distribution_type');

if ($modifier->target_type == 'App\Product') {
if ($modifier->target_type == Product::class) {
$booking_mod_target = $aggregate_data->orders[$booking->order_id]->bookings[$booking->id]->products[$product_target_id] ?? null;
$reference = $mod_target->products[$product_target_id]->$distribution_attribute;
}
Expand Down

0 comments on commit 6f4a9b4

Please sign in to comment.