adasd
All checks were successful
Deploy / deploy-staging (push) Successful in 34s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-08-22 00:09:13 +02:00
parent 49ea6bde76
commit c17566a7d2
5 changed files with 129 additions and 64 deletions

View File

@@ -1060,7 +1060,7 @@ final class MiningRepository
'settled_value_amount' => $payload['settled_value_amount'] ?? null,
'settled_value_currency' => $payload['settled_value_currency'] ?? null,
'settled_fx_fetch_id' => $payload['settled_fx_fetch_id'] ?? null,
'daily_cost_amount' => $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null),
'daily_cost_amount' => $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null, $payload['purchased_at'] ?? null),
'daily_cost_currency' => $payload['daily_cost_currency'] ?? ($payload['currency'] ?? null),
'auto_renew' => $payload['auto_renew'] ?? 0,
'note' => $payload['note'] ?? null,
@@ -1615,7 +1615,7 @@ final class MiningRepository
private function normalizeInsertPayload(string $projectKey, array $payload): array
{
$dailyCostAmount = $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null);
$dailyCostAmount = $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null, $payload['starts_at'] ?? null);
$dailyCostCurrency = $payload['daily_cost_currency'] ?? ($payload['currency'] ?? null);
return [
@@ -1661,7 +1661,7 @@ final class MiningRepository
private function normalizePurchasedPayload(string $projectKey, ?int $offerId, array $payload): array
{
$dailyCostAmount = $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null);
$dailyCostAmount = $payload['daily_cost_amount'] ?? $this->deriveDailyCostAmount($payload['total_cost_amount'] ?? null, $payload['runtime_months'] ?? null, $payload['purchased_at'] ?? null);
$dailyCostCurrency = $payload['daily_cost_currency'] ?? ($payload['currency'] ?? null);
return [
@@ -1691,18 +1691,29 @@ final class MiningRepository
];
}
private function deriveDailyCostAmount(mixed $totalCostAmount, mixed $runtimeMonths): ?float
private function deriveDailyCostAmount(mixed $totalCostAmount, mixed $runtimeMonths, mixed $startsAt): ?float
{
if (!is_numeric($totalCostAmount) || !is_numeric($runtimeMonths)) {
if (!is_numeric($totalCostAmount) || !is_numeric($runtimeMonths) || !is_string($startsAt) || trim($startsAt) === '') {
return null;
}
$months = (float) $runtimeMonths;
$months = (int) $runtimeMonths;
if ($months <= 0) {
return null;
}
$runtimeDays = $months * 30.4375;
try {
$utc = new \DateTimeZone('UTC');
$start = new \DateTimeImmutable($startsAt, $utc);
$monthIndex = (((int) $start->format('Y')) * 12) + ((int) $start->format('n')) - 1 + $months;
$year = intdiv($monthIndex, 12);
$month = ($monthIndex % 12) + 1;
$day = min((int) $start->format('j'), cal_days_in_month(CAL_GREGORIAN, $month, $year));
$end = $start->setDate($year, $month, $day);
$runtimeDays = ($end->getTimestamp() - $start->getTimestamp()) / 86400;
} catch (\Throwable) {
return null;
}
if ($runtimeDays <= 0) {
return null;
}