This commit is contained in:
2026-11-02 08:08:05 +02:00
parent 13a6cb9922
commit 504b01b244
246 changed files with 24499 additions and 185 deletions
+5 -27
View File
@@ -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);