Zamanında Altın Alsaydık… | C#

Merhaba, zaman zaman sohbetlerimizde, geçmişte yapılan bir yatırım veya harcama mevzusu geçtiğinde; “O parayı o zaman dolara yatırsaydım acaba şimdi ne kadar olurdu?” ya da “Keşke altın alsaydık şimdi daha fazla kâr elde ederdik…” gibi iddialar ortaya atılır ve bazen de bunları doğrulamaya uğraşmayız. O yıldaki altın fiyatını bul-çarp-böl…vs. uzun iş diyerek üşeniriz. İşte bunun için ufak bir çözüm geliştirdim. Bir çok icat da bu tür üşengeçliklerden çıkıyordu galiba.

https://dovizaltin.zamkinos.net

HtmlAgilityPack kullandım bir .NetCore Web Uygulaması’nda.

INDEX.CSHTML

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<title>Altın/Döviz Hesaplama</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
    body {
        font-family: Arial, sans-serif;
        margin: 0;
        padding: 20px;
        display: flex;
        flex-direction: column;
        align-items: center;
        background-color: #f4f4f4;
    }

    .container {
        max-width: 600px;
        width: 100%;
        background: white;
        padding: 20px;
        border-radius: 8px;
        box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
    }

    h2 {
        text-align: center;
    }

    label {
        display: block;
        margin: 10px 0 5px;
    }

    input[type="date"],
    input[type="number"] {
        width: 100%;
        padding: 10px;
        margin-bottom: 20px;
        border: 1px solid #ccc;
        border-radius: 5px;
    }

    .button-container {
        display: flex;
        flex-direction: column;
        gap: 10px;
    }

    button {
        padding: 10px;
        border: none;
        border-radius: 5px;
        background-color: #28a745;
        color: white;
        cursor: pointer;
        font-size: 16px;
        transition: background-color 0.3s;
        display: flex; /* Simge ve yazıyı yan yana yerleştirir */
        align-items: center; /* Dikey hizalama */
        justify-content: center; /* Yatay hizalama */
    }

        button i {
            margin-right: 10px; /* Simge ile yazı arasında boşluk */
        }

        button:hover {
            background-color: #218838;
        }

    #results {
        margin-top: 20px;
        background: #e9ecef;
        padding: 10px;
        border-radius: 5px;
        display: none; /* İlk başta gizli */
    }

    input[type="text"] {
        width: 100%;
        padding: 10px;
        margin-bottom: 20px;
        border: 1px solid #ccc;
        border-radius: 5px;
        font-size: 16px;
    }
</style>

<div class="container">
    <h2>Altın/Döviz Hesaplama Aracı</h2>
    <label for="datepicker">Tarih Seçin:</label>
    <input type="date" id="datepicker" />

    <label for="amount">Tutar (TL):</label>
    <input type="text" id="amount" placeholder="TL param vardı" />

    <div class="button-container">
        <button class="calculate" data-type="ALT">
            <i class="fas fa-gem"></i> Altın Alsaydım Bugün Ne Kadar Olurdu?
        </button>
        <button class="calculate" data-type="USD">
            <i class="fas fa-dollar-sign"></i> Dolar Alsaydım Bugün Ne Kadar Olurdu?
        </button>
        <button class="calculate" data-type="EUR">
            <i class="fas fa-euro-sign"></i> Euro Alsaydım Bugün Ne Kadar Olurdu?
        </button>
        <button class="calculate" data-type="GBP">
            <i class="fas fa-pound-sign"></i> Sterlin Alsaydım Bugün Ne Kadar Olurdu?
        </button>
        <button class="calculate" data-type="ALL">
            <i class="fas fa-calculator"></i> Tümünü Hesapla
        </button>
    </div>

    <div id="results"></div>
</div>

<script>
    // Girilen değeri formatlayan fonksiyon (binlik ayraç + kuruş)
    function formatCurrency(value) {
        // Sadece rakam ve virgülleri al (diğer karakterleri temizle)
        value = value.replace(/[^0-9,]/g, "");

        // Eğer virgül varsa, kuruş olarak işlem yap
        let parts = value.split(',');
        let integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, "."); // Binlik ayraç ekleme
        let decimalPart = parts[1] ? parts[1].substring(0, 2) : ''; // Sadece 2 basamak kuruş al

        // Kuruş varsa birleştir, yoksa sadece tam sayı kısmını göster
        return decimalPart ? `${integerPart},${decimalPart}` : integerPart;
    }

    // Focus kaybolduğunda (blur), formatı uygula
    $('#amount').on('blur', function () {
        const inputVal = $(this).val();
        const formattedVal = formatCurrency(inputVal);
        $(this).val(formattedVal); // Formatlanmış değeri geri yaz
    });

    // Focus olduğunda, formatı kaldır (düzenlemeye açık hale getir)
    $('#amount').on('focus', function () {
        const inputVal = $(this).val().replace(/\./g, '').replace(/,/g, ''); // Nokta ve virgülleri temizle
        $(this).val(inputVal); // Formatı kaldırarak orijinal haliyle göster
    });


    $(document).ready(function () {

        // Tekil butonlar için tıklama olayı
        $('.calculate').click(async function () {
            $('#results').empty();
            let date = $('#datepicker').val(); // Tarih inputundan tarih al
            // Tarih formatını YYYY-MM-DD'ye dönüştür
            const formattedDate = new Date(date).toISOString().split('T')[0]; // 'YYYY-MM-DD' formatında
            const amount = Number($('#amount').val().replace('.', '').replace(',', '.'));
            const type = $(this).data('type');
            let gelenTutar = 0.0;
            let _data;
            if (type === 'ALL') {
                let _type = '';
                for (let i = 1; i < 5; i++) {
                    switch (i) {
                        case 1:
                            _type = 'ALT';
                            break;
                        case 2:
                            _type = 'USD';
                            break;
                        case 3:
                            _type = 'EUR';
                            break;
                        case 4:
                            _type = 'GBP';
                            break;
                    }
                    _data = JSON.stringify({
                        Tarih: formattedDate,
                        AltinDovizTuru: _type,
                        Tutar: amount
                    });
                    let result = await makeAjaxRequest(_data); // AJAX isteğini bekle
                    gelenTutar = Number(result);
                    const formattedAmount = amount.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
                    const formattedGelenTutar = gelenTutar.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
                    let dummyResult = `${date} tarihinde ${formattedAmount} TL param vardı, ${_type} alsaydım bugün ${formattedGelenTutar} TL olurdu.`;
                    $('#results').append(`<p>${dummyResult}</p>`); // Sonucu ekle
                }
            }
            else {
                _data = JSON.stringify({
                    Tarih: formattedDate,
                    AltinDovizTuru: type,
                    Tutar: amount
                });
                let result = await makeAjaxRequest(_data); // AJAX isteğini bekle
                gelenTutar = Number(result);
                const formattedAmount = amount.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
                const formattedGelenTutar = gelenTutar.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
                let dummyResult = `${date} tarihinde ${formattedAmount} TL param vardı, ${type} alsaydım bugün ${formattedGelenTutar} TL olurdu.`;
                $('#results').append(`<p>${dummyResult}</p>`); // Sonucu ekle
            }
            $('#results').show(); // Sonuç kutusunu göster
        });

        async function makeAjaxRequest(d) {
            return new Promise((resolve, reject) => {
                $.ajax({
                    url: '@Url.Page("Index", "Calculate")', // Razor Pages metodu için URL
                    type: 'POST', // POST isteği
                    contentType: 'application/json', // JSON içeriği gönderildiğini belirt
                    data: d, // Gönderilecek veri
                    success: function (result) {
                        resolve(result); // Başarılı olduğunda sonucu döndür
                    },
                    error: function (xhr, status, error) {
                        reject('Hata: ' + error); // Hata durumunda hata mesajı döndür
                    }
                });
            });
        }
    });
</script>

INDEX.CSHTML.CS

using HtmlAgilityPack;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Globalization;
using System.Text;

namespace AltinDovizHesapCoreWeb.Pages
{
    [IgnoreAntiforgeryToken] // CSRF korumasını kaldır
    public class IndexModel : PageModel
    {

        // AJAX isteği ile çalışan metot
        public JsonResult OnPostCalculate([FromBody] HesaplamaRequest req)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            decimal dovizAltinFiyat = dovizAltinFiyatBul(req.Tarih, req.AltinDovizTuru, Sabitler.Satis);
            decimal decKuraGoreTutar = dovizAltinFiyat == 0 ? 0 : req.Tutar / dovizAltinFiyat;

            decimal gununFiyati = dovizAltinFiyatBul(DateTime.Now.Date, req.AltinDovizTuru, Sabitler.Alis);

            // Basit bir hesaplama (örneğin, sayıyı 2 ile çarpma)
            decimal result = decKuraGoreTutar * gununFiyati;

            // Sonucu JSON olarak döndür
            return new JsonResult(result);
        }
        private decimal dovizAltinFiyatBul(DateTime t, string d, string a)
        {
            switch (d)
            {
                case Sabitler.Dolar:
                case Sabitler.Euro:
                case Sabitler.Sterlin:
                    return dovizFiyatBul(t, d, a);
                case Sabitler.Altin:
                    return altinFiyatBul(t, d, a);
                default:
                    return 0;
            }
        }

        private decimal altinFiyatBul(DateTime tarih, string dovizCinsi, string alisSatis)
        {
            decimal decSatisFiyati = 0;
            try
            {
                string url = Sabitler.UrlAltinGumus + tarih.ToString("yyyy") + "/" + tarih.ToString("MM") + "/" + tarih.ToString("dd");
                HttpClient httpClient = new HttpClient();
                string html = httpClient.GetStringAsync(url).Result;
                HtmlDocument htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);
                HtmlNode madenDivNode = htmlDocument.DocumentNode.SelectSingleNode("//div[@class='kurlar bordernone' and @title='" + titleGetir(dovizCinsi) + "']");
                if (madenDivNode != null)
                {
                    HtmlNode satisFiyatiLiNode = madenDivNode.SelectSingleNode(".//ul/li[@class='midrow " + convertTurkishToEnglish(alisSatis) + "' and @title='" + titleGetir(dovizCinsi) + " - " + alisSatis + "']");
                    if (satisFiyatiLiNode != null)
                    {
                        string strSatisFiyati = satisFiyatiLiNode.InnerText.Trim();
                        decSatisFiyati = decimal.Parse(strSatisFiyati.Replace(",", "."), CultureInfo.GetCultureInfo("en-US"));
                    }
                }
            }
            catch
            {
                // Gerek yok hatayi yakalamaya
            }
            return decSatisFiyati;
        }

        private decimal dovizFiyatBul(DateTime tarih, string dovizCinsi, string alisSatis)
        {
            decimal decSatisFiyati = 0;
            try
            {
                string url = Sabitler.UrlDoviz + tarih.ToString("yyyy") + "/" + tarih.ToString("MM") + "/" + tarih.ToString("dd");
                HttpClient httpClient = new HttpClient();
                string html = httpClient.GetStringAsync(url).Result;
                HtmlDocument htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);
                HtmlNode dovizDivNode = htmlDocument.DocumentNode.SelectSingleNode("//div[@class='kurlar bordernone' and @title='" + titleGetir(dovizCinsi) + "']");
                if (dovizDivNode != null)
                {
                    HtmlNode dolarSatisFiyatiLiNode = dovizDivNode.SelectSingleNode(".//ul/li[@class='midrow " + convertTurkishToEnglish(alisSatis) + "' and @title='" + titleGetir(dovizCinsi) + " - " + alisSatis + "']");
                    if (dolarSatisFiyatiLiNode != null)
                    {
                        string strSatisFiyati = dolarSatisFiyatiLiNode.InnerText.Trim();
                        decSatisFiyati = decimal.Parse(strSatisFiyati.Replace(",", "."), CultureInfo.GetCultureInfo("en-US"));
                    }
                }
            }
            catch
            {
                // Gerek yok hatayi yakalamaya
            }
            return decSatisFiyati;
        }

        private string convertTurkishToEnglish(string input)
        {
            input = input.Replace("İ", "i")
                         .Replace("I", "i")
                         .Replace("Ş", "s")
                         .Replace("Ç", "c")
                         .Replace("Ğ", "g")
                         .Replace("Ö", "o")
                         .Replace("Ü", "u")
                         .Replace("ı", "i")
                         .Replace("ş", "s")
                         .Replace("ç", "c")
                         .Replace("ğ", "g")
                         .Replace("ö", "o")
                         .Replace("ü", "u");
            return input.ToLower();
        }

        private string titleGetir(string dovizAltin)
        {
            switch (dovizAltin)
            {
                case Sabitler.Dolar:
                    return "ABD Doları";
                case Sabitler.Euro:
                    return "Euro";
                case Sabitler.Sterlin:
                    return "İngiliz Sterlini";
                case Sabitler.Altin:
                    return "Gram Altın";
                default:
                    return "";
            }
        }
    }
    public class HesaplamaRequest
    {
        public DateTime Tarih { get; set; }
        public string? AltinDovizTuru { get; set; }
        public decimal Tutar { get; set; }
    }

    public struct Sabitler
    {
        public const string Altin = "ALT";
        public const string Dolar = "USD";
        public const string Euro = "EUR";
        public const string Sterlin = "GBP";
        public const string UrlDoviz = "https://altin.in/arsiv-doviz/";
        public const string UrlAltinGumus = "https://altin.in/arsiv/";
        public const string Alis = "Alış";
        public const string Satis = "Satış";
    }

}

Selamlar.



Leave a Reply

Your email address will not be published. Required fields are marked *