0491f84ed4
Huge update for Server to use relationships (no more joins) Created LabelsAssigned class for the labels relationship Removed pricingForService() function Removed now unused server cache forgets
145 lines
4.3 KiB
PHP
145 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Exception;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class Pricing extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
protected $fillable = ['service_id', 'service_type', 'currency', 'price', 'term', 'as_usd', 'usd_per_month', 'next_due_date'];
|
|
|
|
private static function refreshRates(): object
|
|
{
|
|
if (Cache::has("currency_rates")) {
|
|
return Cache::get("currency_rates");
|
|
}
|
|
$response_json = file_get_contents("https://open.er-api.com/v6/latest/USD");
|
|
if (false === $response_json) {
|
|
Log::error("do file_get_contents failed");
|
|
return (object)null;
|
|
}
|
|
try {
|
|
$response = json_decode($response_json);
|
|
if ('success' === $response->result) {
|
|
return Cache::remember("currency_rates", now()->addWeek(1), function () use ($response) {
|
|
return $response->rates;
|
|
});
|
|
}
|
|
Log::error("server response is " . $response->result . ", expecting success");
|
|
} catch (Exception $e) {
|
|
Log::error("failed to request v6.exchangerate-api.com", ['err' => $e]);
|
|
}
|
|
return (object)null;
|
|
}
|
|
|
|
private static function getRates($currency): float
|
|
{
|
|
$rate = self::refreshRates()->$currency;
|
|
return $rate === null ? 1.00 : $rate;
|
|
}
|
|
|
|
public static function getCurrencyList(): array
|
|
{
|
|
return array_keys((array)self::refreshRates());
|
|
}
|
|
|
|
public static function convertFromUSD(string $amount, string $convert_to): float
|
|
{
|
|
return $amount * self::getRates($convert_to);
|
|
}
|
|
|
|
public function convertToUSD(string $amount, string $convert_from): float
|
|
{
|
|
return $amount / self::getRates($convert_from);
|
|
}
|
|
|
|
public function costAsPerMonth(string $cost, int $term): float
|
|
{
|
|
if ($term === 1) {
|
|
return $cost;
|
|
} elseif ($term === 2) {
|
|
return ($cost / 3);
|
|
} elseif ($term === 3) {
|
|
return ($cost / 6);
|
|
} elseif ($term === 4) {
|
|
return ($cost / 12);
|
|
} elseif ($term === 5) {
|
|
return ($cost / 24);
|
|
} elseif ($term === 6) {
|
|
return ($cost / 36);
|
|
} else {
|
|
return $cost;
|
|
}
|
|
}
|
|
|
|
public function termAsMonths(int $term): int
|
|
{
|
|
if ($term === 1) {
|
|
return 1;
|
|
} elseif ($term === 2) {
|
|
return 3;
|
|
} elseif ($term === 3) {
|
|
return 6;
|
|
} elseif ($term === 4) {
|
|
return 12;
|
|
} elseif ($term === 5) {
|
|
return 24;
|
|
} elseif ($term === 6) {
|
|
return 36;
|
|
} else {
|
|
return 62;
|
|
}
|
|
}
|
|
|
|
public function deletePricing($id): void
|
|
{
|
|
DB::table('pricings')->where('service_id', '=', $id)->delete();
|
|
}
|
|
|
|
public function insertPricing(int $type, string $service_id, string $currency, float $price, int $term, float $as_usd, string $next_due_date, int $is_active = 1)
|
|
{
|
|
return self::create([
|
|
'service_type' => $type,
|
|
'service_id' => $service_id,
|
|
'currency' => $currency,
|
|
'price' => $price,
|
|
'term' => $term,
|
|
'as_usd' => $as_usd,
|
|
'usd_per_month' => $this->costAsPerMonth($as_usd, $term),
|
|
'next_due_date' => $next_due_date,
|
|
'active' => ($is_active) ? 1 : 0
|
|
]);
|
|
}
|
|
|
|
public function updatePricing(string $service_id, string $currency, float $price, int $term, float $as_usd, string $next_due_date, int $is_active = 1)
|
|
{
|
|
return DB::table('pricings')
|
|
->where('service_id', $service_id)
|
|
->update([
|
|
'currency' => $currency,
|
|
'price' => $price,
|
|
'term' => $term,
|
|
'as_usd' => $as_usd,
|
|
'usd_per_month' => $this->costAsPerMonth($as_usd, $term),
|
|
'next_due_date' => $next_due_date,
|
|
'active' => ($is_active) ? 1 : 0
|
|
]);
|
|
}
|
|
|
|
public static function allPricing()
|
|
{
|
|
return Cache::remember('all_pricing', now()->addWeek(1), function () {
|
|
return DB::table('pricings')
|
|
->get();
|
|
});
|
|
}
|
|
|
|
}
|