Merge pull request #51 from imlonghao/feat/currency-rate-api
feat(pricing): add currency api
This commit is contained in:
commit
8f004cfc79
|
@ -2,11 +2,12 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Session;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
class Pricing extends Model
|
class Pricing extends Model
|
||||||
{
|
{
|
||||||
|
@ -14,46 +15,49 @@ class Pricing extends Model
|
||||||
|
|
||||||
protected $fillable = ['service_id', 'service_type', 'currency', 'price', 'term', 'as_usd', 'usd_per_month', 'next_due_date'];
|
protected $fillable = ['service_id', 'service_type', 'currency', 'price', 'term', 'as_usd', 'usd_per_month', 'next_due_date'];
|
||||||
|
|
||||||
public static function convertFromUSD(string $amount, string $convert_to): float
|
private static function refreshRates(): object
|
||||||
{//Code rates update from an API??
|
{
|
||||||
if ($convert_to === 'AUD') {
|
if (Cache::has("currency_rates")) {
|
||||||
return (1.39 * $amount);
|
return Cache::get("currency_rates");
|
||||||
} elseif ($convert_to === "USD") {
|
|
||||||
return $amount;
|
|
||||||
} elseif ($convert_to === "GBP") {
|
|
||||||
return (0.79 * $amount);
|
|
||||||
} elseif ($convert_to === "EUR") {
|
|
||||||
return (0.93 * $amount);
|
|
||||||
} elseif ($convert_to === "NZD") {
|
|
||||||
return (1.53 * $amount);
|
|
||||||
} elseif ($convert_to === "JPY") {
|
|
||||||
return (127.12 * $amount);
|
|
||||||
} elseif ($convert_to === "CAD") {
|
|
||||||
return (1.27 * $amount);
|
|
||||||
} else {
|
|
||||||
return $amount;
|
|
||||||
}
|
}
|
||||||
|
$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
|
public function convertToUSD(string $amount, string $convert_from): float
|
||||||
{
|
{
|
||||||
if ($convert_from === 'AUD') {
|
return $amount / self::getRates($convert_from);
|
||||||
return (0.76 * $amount);
|
|
||||||
} elseif ($convert_from === "USD") {
|
|
||||||
return $amount;
|
|
||||||
} elseif ($convert_from === "GBP") {
|
|
||||||
return (1.35 * $amount);
|
|
||||||
} elseif ($convert_from === "EUR") {
|
|
||||||
return (1.23 * $amount);
|
|
||||||
} elseif ($convert_from === "NZD") {
|
|
||||||
return (0.72 * $amount);
|
|
||||||
} elseif ($convert_from === "JPY") {
|
|
||||||
return (0.0097 * $amount);
|
|
||||||
} elseif ($convert_from === "CAD") {
|
|
||||||
return (0.78 * $amount);
|
|
||||||
} else {
|
|
||||||
return 1.00;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function costAsPerMonth(string $cost, int $term): float
|
public function costAsPerMonth(string $cost, int $term): float
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<div class="input-group-prepend"><span class="input-group-text">{{ $title ??'Currency'}}</span></div>
|
<div class="input-group-prepend"><span class="input-group-text">{{ $title ??'Currency'}}</span></div>
|
||||||
<select class="form-control" name="{{$name ?? 'currency'}}">
|
<select class="form-control" name="{{$name ?? 'currency'}}">
|
||||||
<option value="AUD" {{(isset($current) && (string)$current === 'AUD')? 'selected' : ''}}>AUD</option>
|
@foreach (App\Models\Pricing::getCurrencyList() as $currency)
|
||||||
<option value="USD" {{(isset($current) && (string)$current === 'USD')? 'selected' : ''}}>USD</option>
|
<option value="{{$currency}}" {{(isset($current) && (string)$current === $currency)? 'selected' : ''}}>
|
||||||
<option value="GBP" {{(isset($current) && (string)$current === 'GBP')? 'selected' : ''}}>GBP</option>
|
{{$currency}}
|
||||||
<option value="EUR" {{(isset($current) && (string)$current === 'EUR')? 'selected' : ''}}>EUR</option>
|
</option>
|
||||||
<option value="NZD" {{(isset($current) && (string)$current === 'NZD')? 'selected' : ''}}>NZD</option>
|
@endforeach
|
||||||
<option value="JPY" {{(isset($current) && (string)$current === 'JPY')? 'selected' : ''}}>JPY</option>
|
|
||||||
<option value="CAD" {{(isset($current) && (string)$current === 'CAD')? 'selected' : ''}}>CAD</option>
|
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -71,7 +71,10 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body text-center shadow">
|
<div class="card-body text-center shadow">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4>{{$information['total_cost_weekly']}} <small class="text-muted">{{$information['currency']}}</small></h4>
|
<h4>
|
||||||
|
{{$information['total_cost_weekly']}}
|
||||||
|
<small class="text-muted">{{$information['currency']}}</small>
|
||||||
|
</h4>
|
||||||
<p>Weekly cost</p>
|
<p>Weekly cost</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,7 +84,9 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body text-center shadow">
|
<div class="card-body text-center shadow">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4>{{$information['total_cost_monthly']}} <small class="text-muted">{{$information['currency']}}</small>
|
<h4>
|
||||||
|
{{$information['total_cost_monthly']}}
|
||||||
|
<small class="text-muted">{{$information['currency']}}</small>
|
||||||
</h4>
|
</h4>
|
||||||
<p>Monthly cost</p>
|
<p>Monthly cost</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -92,7 +97,10 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body text-center shadow">
|
<div class="card-body text-center shadow">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4>{{$information['total_cost_yearly']}} <small class="text-muted">{{$information['currency']}}</small></h4>
|
<h4>
|
||||||
|
{{$information['total_cost_yearly']}}
|
||||||
|
<small class="text-muted">{{$information['currency']}}</small>
|
||||||
|
</h4>
|
||||||
<p>Yearly cost</p>
|
<p>Yearly cost</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -102,7 +110,9 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body text-center shadow">
|
<div class="card-body text-center shadow">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4>{{$information['total_cost_2_yearly']}} <small class="text-muted">{{$information['currency']}}</small>
|
<h4>
|
||||||
|
{{$information['total_cost_2_yearly']}}
|
||||||
|
<small class="text-muted">{{$information['currency']}}</small>
|
||||||
</h4>
|
</h4>
|
||||||
<p>2 yearly cost</p>
|
<p>2 yearly cost</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -388,8 +398,9 @@
|
||||||
|
|
||||||
@if(Session::has('timer_version_footer') && Session::get('timer_version_footer') === 1)
|
@if(Session::has('timer_version_footer') && Session::get('timer_version_footer') === 1)
|
||||||
<p class="text-muted mt-4 text-end"><small>Page took {{$information['execution_time']}} seconds,
|
<p class="text-muted mt-4 text-end"><small>Page took {{$information['execution_time']}} seconds,
|
||||||
Built on Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}
|
Built on Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}),
|
||||||
)</small>
|
Rates By <a href="https://www.exchangerate-api.com">Exchange Rate API</a>
|
||||||
|
</small>
|
||||||
</p>
|
</p>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user