commit13
This commit is contained in:
@@ -8,10 +8,10 @@ use App\Models\Quotation;
|
||||
use App\Models\Requisition;
|
||||
use App\Models\User;
|
||||
use Brick\Math\BigDecimal;
|
||||
use Brick\Math\BigRational;
|
||||
use Brick\Math\Exception\MathException;
|
||||
use Brick\Math\RoundingMode;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Tempo\Purchasing\Economic\ProposalScoring;
|
||||
|
||||
class ProposalComparison
|
||||
{
|
||||
@@ -54,35 +54,13 @@ class ProposalComparison
|
||||
];
|
||||
}
|
||||
$eligible = array_values(array_filter($rows, fn ($row) => $row['eligible']));
|
||||
$minimum = null;
|
||||
$days = null;
|
||||
foreach ($eligible as $row) {
|
||||
$minimum = $minimum === null ? $row['subtotal_minor'] : min($minimum, $row['subtotal_minor']);
|
||||
$days = $days === null ? $row['delivery_days'] : min($days, $row['delivery_days']);
|
||||
}
|
||||
$best = null;
|
||||
$topIds = [];
|
||||
$ranking = (new ProposalScoring)->rank($rows, $policy['minimum_evaluators']);
|
||||
$topIds = $ranking['top_ids'];
|
||||
foreach ($rows as &$row) {
|
||||
if ($row['eligible'] && $row['evaluation_count'] >= $policy['minimum_evaluators']) {
|
||||
$weights = $row['weights'];
|
||||
$score = BigRational::of($minimum)->dividedBy($row['subtotal_minor'])->multipliedBy(10 * $weights['price'])
|
||||
->plus(BigRational::of($days)->dividedBy($row['delivery_days'])->multipliedBy(10 * $weights['delivery']));
|
||||
foreach (['quality', 'history', 'payment'] as $criterion) {
|
||||
$sum = BigRational::zero();
|
||||
foreach ($row['qualified_evaluations'] as $evaluation) {
|
||||
$sum = $sum->plus($evaluation[$criterion]);
|
||||
}
|
||||
$score = $score->plus($sum->dividedBy($row['evaluation_count'])->multipliedBy($weights[$criterion]));
|
||||
}
|
||||
$minor = $score->dividedBy(100)->toScale(2, RoundingMode::HalfUp)->multipliedBy(100)->toInt();
|
||||
if (isset($ranking['scores'][$row['id']])) {
|
||||
$minor = $ranking['scores'][$row['id']];
|
||||
$row['score_minor'] = $minor;
|
||||
$row['score'] = $minor / 100;
|
||||
if ($best === null || $minor > $best) {
|
||||
$best = $minor;
|
||||
$topIds = [$row['id']];
|
||||
} elseif ($minor === $best) {
|
||||
$topIds[] = $row['id'];
|
||||
}
|
||||
}
|
||||
}
|
||||
unset($row);
|
||||
|
||||
Reference in New Issue
Block a user