Files
portal-api/app/Support/RenewalPricing.php
T

90 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Support;
use App\Models\Addon;
use App\Models\Product;
use App\Models\Service;
class RenewalPricing
{
/** @return list<array{billing_cycle: string, months: int, price: int}> */
public static function options(?Product $product): array
{
if (! $product) {
return [];
}
$options = [];
foreach ($product->pricings()->where('is_active', 1)->get() as $pricing) {
$cycle = (string) $pricing->billing_cycle;
$months = BillingCycleCatalog::monthsFor($cycle);
if (! $months || (int) $pricing->price <= 0 || ! ProductBillingCycles::allows($product->product_type, $cycle)) {
continue;
}
$options[$months] = ['billing_cycle' => $cycle, 'months' => $months, 'price' => (int) $pricing->price];
}
ksort($options);
return array_values($options);
}
public static function option(?Product $product, int $months): ?array
{
foreach (self::options($product) as $option) {
if ($option['months'] === $months) {
return $option;
}
}
return null;
}
public static function addonTotal(Service $service, float $cycles): int
{
return (int) array_sum(array_column(self::addonInvoiceItems($service, $cycles, 0), 'total_price'));
}
/** @return list<array<string, mixed>> */
public static function addonInvoiceItems(Service $service, float $cycles, int $months): array
{
$meta = array_filter(
(array) ($service->orderItem?->addons_meta ?? []),
static fn ($entry): bool => is_array($entry) && (int) ($entry['qty'] ?? 0) > 0,
);
if ($meta === []) {
return [];
}
$currentPrices = Addon::whereIn('id', array_column($meta, 'addon_id'))->pluck('price', 'id');
$items = [];
foreach ($meta as $entry) {
$qty = (int) $entry['qty'];
$unitPrice = (int) ($currentPrices[$entry['addon_id'] ?? null] ?? $entry['price'] ?? 0);
$totalPrice = (int) round($unitPrice * $qty * $cycles);
if ($totalPrice <= 0) {
continue;
}
$items[] = [
'product_id' => $service->product_id,
'type' => 'addon',
'description' => 'Addon: ' . ($entry['name'] ?? strtoupper((string) ($entry['code'] ?? ''))) . ' x' . $qty,
'months' => $months,
'quantity' => $qty,
'unit_price' => (int) round($unitPrice * $cycles),
'total_price' => $totalPrice,
];
}
return $items;
}
}