選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Currency.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace App\Models\Setting;
  3. use Akaunting\Money\Currency as ISOCurrencies;
  4. use App\Casts\RateCast;
  5. use App\Models\Banking\Account;
  6. use App\Traits\{Blamable, CompanyOwned, SyncsWithCompanyDefaults};
  7. use Database\Factories\Setting\CurrencyFactory;
  8. use Illuminate\Database\Eloquent\Factories\{Factory, HasFactory};
  9. use Illuminate\Database\Eloquent\Model;
  10. use Illuminate\Database\Eloquent\Relations\{BelongsTo, HasMany, HasOne};
  11. use Illuminate\Support\Facades\DB;
  12. use Wallo\FilamentCompanies\FilamentCompanies;
  13. class Currency extends Model
  14. {
  15. use Blamable;
  16. use CompanyOwned;
  17. use HasFactory;
  18. use SyncsWithCompanyDefaults;
  19. protected $table = 'currencies';
  20. protected $fillable = [
  21. 'company_id',
  22. 'name',
  23. 'code',
  24. 'rate',
  25. 'precision',
  26. 'symbol',
  27. 'symbol_first',
  28. 'decimal_mark',
  29. 'thousands_separator',
  30. 'enabled',
  31. 'created_by',
  32. 'updated_by',
  33. ];
  34. protected $casts = [
  35. 'enabled' => 'boolean',
  36. 'symbol_first' => 'boolean',
  37. 'rate' => RateCast::class,
  38. ];
  39. public function company(): BelongsTo
  40. {
  41. return $this->belongsTo(FilamentCompanies::companyModel(), 'company_id');
  42. }
  43. public function defaultCurrency(): HasOne
  44. {
  45. return $this->hasOne(CompanyDefault::class, 'currency_code', 'code');
  46. }
  47. public function accounts(): HasMany
  48. {
  49. return $this->hasMany(Account::class, 'currency_code', 'code');
  50. }
  51. public function createdBy(): BelongsTo
  52. {
  53. return $this->belongsTo(FilamentCompanies::userModel(), 'created_by');
  54. }
  55. public function updatedBy(): BelongsTo
  56. {
  57. return $this->belongsTo(FilamentCompanies::userModel(), 'updated_by');
  58. }
  59. public static function getAvailableCurrencyCodes(): array
  60. {
  61. $allISOCurrencies = static::getAllCurrencies();
  62. $allISOCurrencyCodes = array_keys($allISOCurrencies);
  63. $storedCurrencyCodes = static::query()
  64. ->pluck('code')
  65. ->toArray();
  66. $availableCurrencyCodes = array_diff($allISOCurrencyCodes, $storedCurrencyCodes);
  67. return array_combine($availableCurrencyCodes, $availableCurrencyCodes);
  68. }
  69. public static function getAllCurrencies(): array
  70. {
  71. return ISOCurrencies::getCurrencies();
  72. }
  73. public static function getDefaultCurrencyCode(): ?string
  74. {
  75. $defaultCurrency = static::query()
  76. ->where('enabled', true)
  77. ->first();
  78. return $defaultCurrency?->code ?? null;
  79. }
  80. public static function convertBalance($balance, $oldCurrency, $newCurrency): int
  81. {
  82. $currencies = self::whereIn('code', [$oldCurrency, $newCurrency])->get();
  83. $oldCurrency = $currencies->firstWhere('code', $oldCurrency);
  84. $newCurrency = $currencies->firstWhere('code', $newCurrency);
  85. $oldRate = DB::table('currencies')
  86. ->where('code', $oldCurrency->code)
  87. ->value('rate');
  88. $newRate = DB::table('currencies')
  89. ->where('code', $newCurrency->code)
  90. ->value('rate');
  91. $precision = max($oldCurrency->precision, $newCurrency->precision);
  92. $scale = 10 ** $precision;
  93. $cleanBalance = (int) filter_var($balance, FILTER_SANITIZE_NUMBER_INT);
  94. return round(($cleanBalance * $newRate * $scale) / ($oldRate * $scale));
  95. }
  96. protected static function newFactory(): Factory
  97. {
  98. return CurrencyFactory::new();
  99. }
  100. }