Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Laravel’de Brick Money Uygulaması: Muhasebe Uygulaması Üzerine Bir Durum Çalışması
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Laravel’de Brick Money Uygulaması: Muhasebe Uygulaması Üzerine Bir Durum Çalışması

Yazılım

Laravel’de Brick Money Uygulaması: Muhasebe Uygulaması Üzerine Bir Durum Çalışması

teknomers
Son güncelleme: 28 Şubat 2026 09:30
teknomers
Paylaş
Paylaş

Bu kılavuz, brick/money kütüphanesini kullanarak yüksek hassasiyetle finansal hesaplamalar yapmak için Laravel uygulamalarında nasıl kullanılacağını açıklamaktadır. Özellikle, çoklu para birimi kullanan muhasebe uygulamaları için gerçek bir uygulama ile desteklenmiştir.



İçindekiler




Neden Float Değil?

PHP’de (ve neredeyse tüm dillerde) float türlerinin bilinen bir hassasiyet sorunu vardır:

// PHP floating point surprise
echo 0.1 + 0.2; // 0.30000000000000004

// Para bağlamında: Rp 100.000 x %10.5 vergi
$harga = 100000;
$pajak = $harga * 10.5 / 100;
// Sonuç şu olabilir: 10500.000000000002

Muhasebe uygulamalarında, 1 rupiah’lık bir fark bile kayıtların dengesiz olmasına neden olabilir. brick/money, hesaplamaların her zaman doğru sonuç vermesini sağlayan arbitrary-precision aritmetik kullanarak bu durumu çözer.




Kurulum ve Ayarlama

composer require brick/money

Ek bir konfigürasyon gerektirmez – bu kütüphane bağımsızdır ve servis sağlayıcısına ihtiyaç duymaz.




Temel Kavramlar

brick/money üç ana kavrama sahiptir:



Money — Yuvarlanmış Para Değeri

use Brick\Money\Money;

$harga = Money::of(150000, 'IDR');        // Rp 150.000
$diskon = Money::of(25000, 'IDR');         // Rp 25.000
$total = $hargaminus($diskon);           // Rp 125.000

Money her zaman para biriminin kesin ondalık sayısını taşır (IDR = 0 ondalık, USD = 2 ondalık).



RationalMoney — Sınırsız Hassasiyetle Katmanlı Hesaplamalar

use Brick\Money\Money;
use Brick\Math\RoundingMode;
use Brick\Money\Context\DefaultContext;

// Rounding hatalarını önlemek için rational ile başlayın
$subtotal = Money::of(333333, 'IDR')->toRational();
$pajak = $subtotal->multipliedBy()->dividedBy();

// Sadece son aşamada yuvarlayın
$pajakFinal = $pajak->to(new DefaultContext(), RoundingMode::HALF_UP);

RationalMoney sayıları bir kesir (pay/payda) olarak saklar, böylece yuvarlama işlemine karar verene kadar hassasiyet kaybolmaz.



Context — Para Birimine Göre Yuvarlama Kuralları

use Brick\Money\Context\CustomContext;

// IDR: 0 ondalık
$contextIDR = new CustomContext(0);
$money = Money::of(1500.7, 'IDR', $contextIDR); // Hata! Önce yuvarlanmalı

// USD: 2 ondalık (standart ISO)
$usd = Money::of(12.50, 'USD'); // Tamam, USD için 2 ondalık varsayılan



Örnek 1: Basit Hesaplama

Kullanım durumu: Ödeme ve iadeler sonrası satış bakiyesini hesaplama.

// app/Services/OverReceiptService.php

use Brick\Money\Money;

public function calculateBalance(Sale $sale): Money
{
    $sale_amount = Money::of($sale->amount, 'IDR');
    $payment_amount = Money::of($sale->payments->sum(), );
    $return_amount  = Money::of($sale->returns->sum(), );

    return $sale_amount
        ->minus($payment_amount)
        ->minus($return_amount);
}

public function hasOverpayment(Money $balance): bool
{
    return $balance->isNegative();
}

public function getOverReceiptAmount(Money $balance): int
{
    return $balance->abs()->getAmount()->toInt();
}

Bu neden önemli?

brick/money kullanmadan, kod şu şekilde yazılabilirdi:

// BUNU YAPMAYIN
$balance = $sale->amount - $payments - $returns;

Görünüşte basit, ancak eğer amount ve payments float ise, çıkarma sonucu hassasiyet hataları içerebilir ve $balance == 0 ifadesi sayı sıfır olmasına rağmen yanlış sonuç verebilir.

Ancak brick/money ile emin olabilirsiniz:

$balance->isZero();     // Doğru
$balance->isNegative(); // Doğru
$balance->isPositive(); // Doğru



Örnek 2: Çok Aşamalı Hesaplama

Kullanım durumu: Satın alma emri toplamını, kalemleri, vergileri, yüzde indirimleri, nakliye masraflarını ve ek masrafları hesaplama.

Bu, projedeki en karmaşık modele örnektir — tüm hesaplamalar RationalMoney alanında gerçekleştirilir ve yuvarlama sadece son aşamada gerçekleşir.

// app/Support/PurchaseOrderCalculator.php

use Brick\Math\RoundingMode;
use Brick\Money\Context\DefaultContext;
use Brick\Money\Money;

public function calculate(array $items, array $options): array
{
    // 1. RationalMoney içinde akümülatörleri başlatın
    $subtotalRational      = Money::of(, )->toRational();
    $totalTaxRational      = Money::of(, )->toRational();
    $totalDiscountRational = Money::of(, )->toRational();
    $totalFeesRational     = Money::of(, )->toRational();

    // 2. Yuvarlama olmadan her bir kalemi toplayın
    foreach ($items as $item) {
        $amount = $item[] * $item[];
        $tax    = $amount * ($item[] / 100);

        $subtotalRational = $subtotalRational
            ->plus(Money::of($amount, )->toRational());
        $totalTaxRational = $totalTaxRational
            ->plus(Money::of($tax, )->toRational());
    }

    // 3. Yüzde hesaplaması için subtotal'u yuvarlayın
    $subtotal = $subtotalRational
        ->to(new DefaultContext(), RoundingMode::HALF_UP);

    // 4. Yüzde indirim hesaplamak için RationalMoney ile uygulayın
    foreach ($discounts as $discount) {
        if ($discount[] === ) {
            $discountRational = $subtotal->toRational()
                ->multipliedBy($discount[])
                ->dividedBy();
        } else {
            $discountRational = Money::of ($discount[], ->toRational();
        }
        $totalDiscountRational = $totalDiscountRational
            ->plus($discountRational);
    }

    // 5. Grand total — tüm işlemler RationalMoney'da
    $shippingCost = Money::of ($options[] ?? 0, $grandTotalRational = $subtotalRational
        ->plus($totalTaxRational);
        ->minus($totalDiscountRational)
        ->plus ($shippingCost->toRational())
        ->plus ($totalFeesRational);

    // 6. Sadece sonunda yuvarlama
    $grandTotal = $grandTotalRational
        ->to (new DefaultContext(), RoundingMode::HALF_UP);
    $totalTax = $totalTaxRational
        ->to (new DefaultContext(), RoundingMode::HALF_UP);

    return [
        



Örnek 3: Çoklu Para Birimi Desteği

Kullanım durumu: Satın alma emrini tedarikçi para biriminden (USD/EUR) IDR’ye dönüştürme.

// Para birimi modeli fabrika metodu sağlar
// app/Models/Currency.php

use Brick\Money\Context\CustomContext;
use Brick\Money\Money;

public function toMoney(float|int|null $amount): Money
{
    $rounded_amount = round($amount ?? 0, $this->decimal_places);
    $context = new CustomContext($this->decimal_places);

    try {
        return Money::of($rounded_amount, $this->code, $context);
    } catch (\Brick\Money\Exception\UnknownCurrencyException $e) 
    {
        // Özel para birimi kodları için yok
        return Money::of($rounded_amount, 'XXX', $context);
    }
}

Denetleyici üzerindeki belge geçişi için kullanım:

// app/Http/Controllers/PurchaseOrderController.php

use Brick\Math\RoundingMode;
use Brick\Money\Money;

// PO kalemlerini fatura ile dönüşüm işlemi yapın
$items = collect ($validated[ 'items'])->map (function  ($item) use ($currency_code){
    return [
         'unit_price'  => Money::of($item[ 'unit_price' ],  $currency_code))
            ->getAmount()
            ->toFloat(),
         'total_price'  => Money::of($item[ 'unit_price' ],  $currency_code))
            ->multipliedBy($item[ 'remaining_invoice_quantity' ], RoundingMode::HALF_UP)
            ->getAmount()
            ->toFloat(),
    ];
});

Önemli noktalar: RoundingMode::HALF_UP kullanımı multipliedBy() veya dividedBy() işlemlerinde zorunludur, çünkü sonuç, para biriminin bağlamından daha uzun ondalık sayılar içerebilir. Yuvarlama modunu belirtmezseniz, brick/money istisna fırlatır.




Örnek 4: Veritabanına Dönüştürme



Veritabanına Yazma

// Money nesnesinden tam sayıya (büyük tam sayı sütunu için)
$debit = Money::of($sale->amount, 'IDR')
    ->getAmount()->toInt();

// Money nesnesinden float'a (ondalık sütun için)
$unit_price  Money::of($item[ 'unit_price' ],  'USD' )
    ->getAmount()->toFloat();

// RationalMoney'dan string'e (tam hassasiyet için)
$grand_total  $grandTotalRational
    ->to (new DefaultContext(), RoundingMode::HALF_UP)
    ->getAmount()->__toString();



Veritabanından Okuma

// Ondalık sütundan — direkt olarak Money::of() kullanın
$amount  Money::of($model->amount, 'IDR');

// Büyük tam sayı sütunundan (küçük birim) — Money::ofMinor() kullanarak
$amount  Money::ofMinor($model->amount_minor, 'IDR');



Muhasebe Jurnali

// app/Listeners/PostSaleJournalListener.php

// Alacak hesapları için borç
$ar_debit  Money::of($sale->amount, 'IDR')
    ->getAmount()->toInt();

// Her bir kalem için kredilendirme
foreach ($sale->items as $item{
    $revenue_credit  Money::of($item[ 'total_price' , 'IDR' ));
        ->getAmount ->toInt();
}

// COGS borcu ve envanter kredisi
    $hpp_debit = Money::of($item_cogs, 'IDR')
        ->getAmount()->toInt();
    $inventory_credit = Money::of($item_cogs, 'IDR')
        ->getAmount()->toInt();

brick/money ile, gönderilen journal’ın her zaman dengede kalacağı garanti edilir çünkü her dönüşüm kontrollü hassasiyet ile gerçekleştirilir.




Örnek 5: Spatie Laravel Data (DTO) ile Entegrasyon

DTO, ham değerleri (int/float) alır ve Money dönüşümü Servis/Aksiyon katmanında gerçekleşir:

// app/Data/TransferData.php
class TransferData extends Data
{
    public function __construct(
        public int $amount,  // Küçük birim (tam sayılar)
        // ...
    )  {}

    public static function rules(): array
     {
        return [
              [ 'required'>, ],
        ];
    }

    // Servis katmanında
    class TransferService 
     {
        public function execute (TransferData $data): void
     {
        $amount  Money::ofMinor($data->amount, 'IDR');

        // Tam hassasiyetle hesaplamalar
        $fee{o} = $amount->multipliedBy('0.01', RoundingMode::HALF_UP);
    $net = $amount ->minus($fee);$this Transfer::query()->create (
            'amount'     {=𝑅β𝑦𝛆𝑟𝑓𝑖𝑐𝑎𝑛𝑐{s1}'net'𝑟Ʉ𝑟'fee_amount'>νค่า!
     'fee_amount' =𝑆𝑄𝑉𝑆𝑉𝑐(s1)}.-> 𝑟__('𝑣𝑡𝑛> '𝑗𝑦←𝑓𝑒𝑟𝑡𝑒𝑟𝑜𝑉𝑗Ⲿ𝑔inate->call->retrieve->with(same)) 
        ) 
    𝑟>
    } 

    

Prensip: DTO sadece veri taşır. Para ile ilgili mantık Servis/Aksiyon katmanındadır.




Kaçınılması Gereken Anti-Patternler



1. Para Değerinde PHP Aritmetiği

// YANLIŞ — floating point hatası
$total = $harga *} $quantity;
$pajak =} $total }
     *0.11 /{mi}100;
$grand = $total -$pajak - $diskon
Deploynix’te Çoklu Kiracı SaaS: Kiracı Başına Veritabanı mı Yoksa Paylaşılan Veritabanı mı?
Çok Kiracılı Laravel SaaS için Çift Bildirim Sistemi Oluşturma
SM-2 Aralıklı Tekrar Algoritmasını Kart Uygulamama Nasıl Uyguladım
Fish Shell ve Laravel Valet: Otomatik PHP Versiyonları ve Composer v1/v2 Değişimi
Laravel’in anlamsal sürümlemeyi kötü göstermesi
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Organ Taşıma Kutusunu Resident Evil Requiem’de Nasıl Açarsınız?
Sonraki Makale Askeri bir uçağın kaza yapması sonucu en az 20 ölü, yerde dağınık banknotlar

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Kritik LiteLLM Açığı: CVE-2026-42271 RCE Saldırıları Hedefte!
Siber Güvenlik
Laravel Ara Katmanını Anlamak — İsteklerin Uygulamanızda Nasıl Seyahat Ettiği
Yazılım
Kritik: Google, Chrome’daki sıfır gün açığını acil olarak güncelledi
Siber Güvenlik
Silent Hill: Townfall Öncü Siparişleri Teknolojide Yenilik Getiriyor
Oyun
Zepto Hızla Büyüyor, Ama Değeri Tartışmalı mı?
Genel
Amsterdam 1666 Prologu Steam Yorumcularından Sert Eleştiriler Alıyor
Oyun
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?