OLDBOY/_PAGE/_MAIN/asset/main_asset.php
<?php 
include_once('./_common.php');
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once G5_PATH."/_PAGE/_MAIN/CODE_data.php"; 
include_once G5_PATH."/_PAGE/_MAIN/CODE_calc.php"; 
include_once G5_PATH."/_PAGE/_MAIN/_HEAD.php"; 
include_once(G5_PATH."/_PAGE/head.php"); 
?>
<link rel="stylesheet" type="text/css" href="./main_asset.css">
<link rel="stylesheet" type="text/css" href="./help.css">

<article id="ASSET">
    <?php include G5_PATH."/_PAGE/_MAIN/asset/top_bookmark.php"; ?>
    
    <section class="Main_Title">
        <div class="Title_Txt">
            <ul class="Title_Total">
                <li><?= number_format($cur_av) ?><span> KRW</span></li>
            </ul>
            <ul class="Title_Asset">
                <li>
                    <label class="txt_kor">현재금 | 평가자산 : </label>
                    <label class="ul_cur_av"><?= number_format($cur_av) ?><span> KRW</span></label>
                    <label>-</label>
                    <label class="txt_kor">원금 : </label>
                    <label class="ul_should_have_latest"><?= number_format($should_have_latest) ?><span> KRW</span></label>
                    <label>=</label>
                    <label class="txt_kor">손익률 : </label>
                    <label class="ul_pure_roi"><?= round($pure_roi, 2) ?><span> %</span></label>
                    <label class="Label_Boundary">|</label>
                    <label class="txt_kor">손익금 : </label>
                    <label class="ul_pure_profit"><?= number_format($pure_profit) ?><span> KRW</span></label>
                </li>
            </ul>
        </div>
    </section>

    <?php include G5_PATH."/_PAGE/_MAIN/asset/coin_item.php"; ?>

    <section class="Main_Box">
        <div class="Box_Title">
            <label class="Box_Move"><span data-tooltip="이전" onclick="history.back();"><i class="fa-solid fa-angle-left"></i></span> <span data-tooltip="다음" onclick="history.forward();"><i class="fa-solid fa-angle-right"></i></span></label>
            <label class="Box_Title_name">ASSETS DATA</label>
            <label class="Box_Home"><a href="<?=G5_URL;?>/_PAGE/_MAIN/asset/main_hellgate.php"><span data-tooltip="헬게이트"><i class="fa-solid fa-biohazard"></i></span></a></label>
            <label class="Box_Link">
                <?php include_once(G5_PATH."/_PAGE/_MAIN/asset/ICON_title.php"); ?>
                <a href="<?=G5_URL;?>"><span data-tooltip="관련 데이터"><i class="fa-solid fa-link"></i></span></a>
                <a href="<?=G5_URL;?>"><span data-tooltip="도움말"><i class="fa-solid fa-circle-question"></i></span></a>
                <a href="<?=G5_URL;?>"><span data-tooltip="세팅"><i class="fa-solid fa-gear"></i></span></a>
            </label>
        </div>
        <div class="Box_Asset_Info">
            <ul class="Box_Asset_Info_Total">
                <label class="Box_Total_naem">총자산 : </label><label class="ul_total_asset"><?= number_format($total_asset) ?><span> KRW</span></label>
            </ul>
            <ul class="Box_Asset_Info_Detail_1">
                <li><label class="txt_kor">매수금 : </label><label class="ul_cost_basis"><?= number_format($cost_basis) ?><span> KRW</span></label></li>
                <li><label class="txt_kor">잔여금 : </label><label class="ul_cur_cv"><?= number_format($cur_cv) ?><span> KRW</span></label></li>
            </ul>
            <ul class="Box_Asset_Info_Total">
                <label class="Box_Total_naem">매수율 : </label><label class="ul_buy_ratio"><?= round($buy_ratio, 2) ?><span> %</span></label>
            </ul>
            <ul class="Box_Asset_Info_Total">
                <label class="Box_Total_naem">손익금 : </label><label class="ul_cur_pv"><?= number_format($cur_pv) ?><span> KRW</span></label>
            </ul>
            <ul class="Box_Asset_Info_Total">
                <label class="Box_Total_naem">손익율 : </label><label class="ul_current_roi"><?= round($current_roi, 2) ?><span> %</span></label>
            </ul>
        </div>
        <div class="Box_Average">
            <ul>
                <li class="Box_Day"><label class="Box_Total_naem">총 일 : </label><label><?= $days ?><span> DAY</span></label></li>
                <li class="Box_Amount"><label class="Box_Total_naem">일 / 평균 수익금 : </label><label class="ul_avg_pnl"><?= number_format($avg_pnl, 2) ?><span> KRW</span></label></li>
                <li><label class="Box_Total_naem">일 / 평균 수익률 : </label><label class="ul_avg_roi"><?= number_format($avg_roi, 2) ?><span> %</span></label></li>
            </ul>
        </div>
        <div class="Box_Average">
            <ul>
                <li class="Box_Day"><label class="Box_Total_naem">월 / 단위 : </label><label>30<span> DAY</span></label></li>
                <li class="Box_Amount"><label class="Box_Total_naem">월 / 평균 수익금 : </label><label class="ul_avg_pnl_m"><?= number_format($avg_pnl*30, 2) ?><span> KRW</span></label></li>
                <li><label class="Box_Total_naem">월 / 평균 수익률 : </label><label class="ul_avg_roi_m"><?= number_format($avg_roi*30, 2) ?><span> %</span></label></li>
            </ul>
        </div>
        <div class="Box_Average">
            <ul>
                <li class="Box_Day"><label class="Box_Total_naem">년 / 단위 : </label><label>365<span> DAY</span></label></li>
                <li class="Box_Amount"><label class="Box_Total_naem">년 / 평균 수익금 : </label><label class="ul_avg_pnl_y"><?= number_format($avg_pnl_y, 2) ?><span> KRW</span></label></li>
                <li><label class="Box_Total_naem">년 / 평균 수익률 : </label><label class="ul_avg_roi_y"><?= number_format($avg_roi_y, 2) ?><span> %</span></label></li>
            </ul>
        </div>
        <div class="Box_Data_Table">
            <ul>
                <li>
                    <label class="Box_Table_Subject">투자금<span> (원금)</span></label>
                    <label class="Box_Table_Val ul_dt_should_have_latest"><?= number_format($should_have_latest) ?><span> KRW</span></label>
                    <label class="Box_Table_Help">초기 투자금 + 입금 - 출금</label>
                </li>
                <li>
                    <label class="Box_Table_Subject">총 매입 자산</label>
                    <label class="Box_Table_Val ul_buy_av"><?= number_format($buy_av) ?><span> KRW</span></label>
                    <label class="Box_Table_Help">총 매입금 + 보유금</label>
                </li>
                <li>
                    <label class="Box_Table_Subject">총 평가 자산</label>
                    <label class="Box_Table_Val ul_dt_cur_av"><?= number_format($cur_av) ?><span> KRW</span></label>
                    <label class="Box_Table_Help">총 평가금 + 보유금<span> (실질 자산)</span></label>
                </li>
                <li>
                    <label class="Box_Table_Subject">전체 손익금</label>
                    <label class="Box_Table_Val ul_dt_pure_profit"><?= number_format($pure_profit) ?><span> KRW</span></label>
                    <label class="Box_Table_Subject">전체 손익률</label>
                    <label class="Box_Table_Val ul_dt_pure_roi"><?= round($pure_roi, 2) ?><span> %</span></label>
                    <label class="Box_Table_Help">총 평가금 + 보유금<span> (실질 자산)</span></label>
                </li>
                <li>
                    <label class="Box_Table_Subject">현재: 투자 대비 손익률</label>
                    <label class="Box_Table_Val ul_dt_current_roi"><?= round($current_roi, 2) ?><span> %</span></label>
                    <label class="Box_Table_Subject">현재 : 총 자산 대비 손익률</label>
                    <label class="Box_Table_Val ul_dt_total_roi"><?= round($total_roi, 2) ?><span> %</span></label>
                    <label class="Box_Table_Help"><span>투자 대비</span> : 매매금 기준</label>
                    <label class="Label_Boundary"><span>/</span></label>
                    <label class="Box_Table_Help"><span>자산 대비</span> : 자산 기준</label>
                </li>
            </ul>
        </div>
    </section>
</article>

<script>
(function() {
    let prev = {
        cur_av: <?= (float)$cur_av ?>, should_have_latest: <?= (float)$should_have_latest ?>,
        pure_profit: <?= (float)$pure_profit ?>, pure_roi: <?= (float)$pure_roi ?>,
        total_asset: <?= (float)$total_asset ?>, cost_basis: <?= (float)$cost_basis ?>,
        cur_cv: <?= (float)$cur_cv ?>, buy_ratio: <?= (float)$buy_ratio ?>,
        cur_pv: <?= (float)$cur_pv ?>, total_roi: <?= (float)$total_roi ?>,
        current_roi: <?= (float)$current_roi ?>, avg_pnl: <?= (float)$avg_pnl ?>,
        avg_roi: <?= (float)$avg_roi ?>, buy_av: <?= (float)$buy_av ?>,
        avg_pnl_m: <?= (float)$avg_pnl * 30 ?>, avg_roi_m: <?= (float)$avg_roi * 30 ?>,
        avg_pnl_y: <?= (float)$avg_pnl * 365 ?>, avg_roi_y: <?= (float)$avg_roi * 365 ?>
    };

    function animateValue(el, start, end, duration, isPercent) {
        if (!el) return;
        const startVal = parseFloat(start);
        const endVal = parseFloat(end);
        let startTime = null;

        function step(now) {
            if (!startTime) startTime = now;
            const progress = Math.min((now - startTime) / duration, 1);
            const easeOut = 1 - Math.pow(1 - progress, 3);
            const current = easeOut * (endVal - startVal) + startVal;

            if (isPercent) {
                el.innerHTML = current.toFixed(2) + '<span> %</span>';
            } else {
                el.innerHTML = Math.floor(current).toLocaleString() + '<span> KRW</span>';
            }
            if (progress < 1) window.requestAnimationFrame(step);
        }
        window.requestAnimationFrame(step);
    }

    function update() {
        const url = window.location.pathname + window.location.search + (window.location.search ? '&' : '?') + 'ajax_mode=get_json&v=' + Date.now();
        fetch(url)
            .then(res => res.json())
            .then(data => {
                const root = document.getElementById('ASSET');
                const targets = [
                    { el: root.querySelector('.Title_Total li'),         key: 'cur_av',              pct: false },
                    { el: root.querySelector('.ul_cur_av'),              key: 'cur_av',              pct: false },
                    { el: root.querySelector('.ul_should_have_latest'),  key: 'should_have_latest',  pct: false },
                    { el: root.querySelector('.ul_pure_profit'),         key: 'pure_profit',         pct: false },
                    { el: root.querySelector('.ul_pure_roi'),            key: 'pure_roi',            pct: true  },
                    { el: root.querySelector('.ul_total_asset'),         key: 'total_asset',         pct: false },
                    { el: root.querySelector('.ul_cost_basis'),          key: 'cost_basis',          pct: false },
                    { el: root.querySelector('.ul_cur_cv'),              key: 'cur_cv',              pct: false },
                    { el: root.querySelector('.ul_buy_ratio'),           key: 'buy_ratio',           pct: true  },
                    { el: root.querySelector('.ul_cur_pv'),              key: 'cur_pv',              pct: false },
                    { el: root.querySelector('.ul_current_roi'),         key: 'current_roi',         pct: true  },
                    // 일간
                    { el: root.querySelector('.ul_avg_pnl'),             key: 'avg_pnl',             pct: false },
                    { el: root.querySelector('.ul_avg_roi'),             key: 'avg_roi',             pct: true  },
                    // 월간 (식별자 변경 반영)
                    { el: root.querySelector('.ul_avg_pnl_m'),           key: 'avg_pnl_m',           pct: false },
                    { el: root.querySelector('.ul_avg_roi_m'),           key: 'avg_roi_m',           pct: true  },
                    // 년간 (식별자 변경 반영)
                    { el: root.querySelector('.ul_avg_pnl_y'),           key: 'avg_pnl_y',           pct: false },
                    { el: root.querySelector('.ul_avg_roi_y'),           key: 'avg_roi_y',           pct: true  },
                    // Table
                    { el: root.querySelector('.ul_dt_should_have_latest'), key: 'should_have_latest', pct: false },
                    { el: root.querySelector('.ul_buy_av'),              key: 'buy_av',              pct: false },
                    { el: root.querySelector('.ul_dt_cur_av'),           key: 'cur_av',              pct: false },
                    { el: root.querySelector('.ul_dt_pure_profit'),      key: 'pure_profit',         pct: false },
                    { el: root.querySelector('.ul_dt_pure_roi'),         key: 'pure_roi',            pct: true  },
                    { el: root.querySelector('.ul_dt_current_roi'),      key: 'current_roi',         pct: true  },
                    { el: root.querySelector('.ul_dt_total_roi'),        key: 'total_roi',           pct: true  },
                ];

                targets.forEach(obj => {
                    if (obj.el && data[obj.key] !== undefined && Math.abs(prev[obj.key] - data[obj.key]) > 0.001) {
                        animateValue(obj.el, prev[obj.key], data[obj.key], 2000, obj.pct);
                        prev[obj.key] = data[obj.key];
                    }
                });
            }).catch(() => {});
    }

    setInterval(update, 10000);
})();
</script>

<?php 
include G5_PATH."/_PAGE/_MAIN/_TAIL.php"; 
require_once G5_PATH.'/_PAGE/tail.php'; 
?>