Programming

3.blockc_view

import polars as pl
import pandas as pd
import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import io
import getpass,oracledb,os,json,datetime
import os
import datetime
from . import forms
from . import queries
from functions import common_functions

from django.shortcuts import render, redirect
from django.contrib import messages
from django.http import HttpResponse
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

balans_svod_folder = BASE_DIR / "datasets" / "balans" / "svod"

def risk_home(request):
    if request.method == 'POST':
        form = forms.DateInputForm(request.POST)
        if form.is_valid():
            selected_date = form.cleaned_data['selected_date']
            date_str = str(selected_date)
            request.session[f"balans_date_str_{request.user.id}"] = date_str
            balans_filepath_svod = f"{balans_svod_folder}/svod_{date_str}.parquet"
            if os.path.exists(balans_filepath_svod):
                request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
                print("balans exist")
                messages.success(request, "Data is already processed, you can see results!")
                return redirect('risk-result')
            else:
                return redirect('risk-get')
    else:
        form = forms.DateInputForm()
    return render(request, 'risk/home.html', {'form':form})

def risk_get_data(request):
    os.makedirs(balans_svod_folder, exist_ok = True)
    conn = None
    pq_writer = None
    file_written = False
    balans_date_str = request.session.get(f"balans_date_str_{request.user.id}")
    if balans_date_str:
        try:
            selected_date = datetime.datetime.strptime(balans_date_str, '%Y-%m-%d').date()
        except ValueError:
            messages.warning(request, "The date selected did not meet requirements")
            return redirect('risk-home')
    else:
        messages.warning(request, "No date found in this session")
        return redirect('risk-home')
    try:
        print('Connecting')
        conn = common_functions.get_oracle_connection()
        print('executing query')
        batch_generator = conn.fetch_df_batches(queries.balans_script, 
        parameters = {'pdate':selected_date}, size = 1000)

        for odf in batch_generator:
            arrow_table = pa.table(odf)
            if pq_writer is None and arrow_table.num_rows == 0:
                break
            if pq_writer is None:
                pq_writer = pq.ParquetWriter(balans_filepath_svod, arrow_table.schema)
        pq_writer.write_table(arrow_table)
        file_written = True
        print(f"Wrote batch of {arrow_table.num_rows} rows directly to disk")
    
    except Exception as e:
        import traceback
        traceback.print_exc()
        print('Error happened on Balans query:', e)
        messages.error(request, f"Database or extraction error occured: {e}")
        return redirect('risk-home')
    finally:
        if pq_writer:
            pq_writer.close()
        if conn:
            conn.close()
    if not file_written:
        messages.warning(request, 'The data could not be fetched since it is not available yet')
        return redirect('risk-home')
    return redirect('risk-result')

def risk_result(request):
    selected_date = request.session.get(f"balans_date_str_{request.user.id}")
    balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
    print("This is1",balans_filepath_svod)
    print("This isdate",selected_date)
    if selected_date is None and balans_filepath_svod is None:
        selected_date = common_functions.find_recent_date()
        balans_date_str = str(selected_date)
        request.session[f"balans_date_str_{request.user.id}"] = balans_date_str
        balans_filepath_svod = f"{balans_svod_folder}/svod_{balans_date_str}.parquet"
        print(balans_filepath_svod)
        request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
    elif balans_filepath_svod is None:
        balans_date_str = str(selected_date)
        request.session[f"balans_date_str_{request.user.id}"] = balans_date_str
        balans_filepath_svod = f"{balans_svod_folder}/svod_{balans_date_str}.parquet"
        print(balans_filepath_svod)
        request.session[f"balans_filepath_svod_{request.user.id}"] = balans_filepath_svod
        

    balans_date_str = str(selected_date)
    if os.path.exists(balans_filepath_svod):
        try:
            df = pd.read_parquet(balans_filepath_svod)
            if df.empty:
                messages.warning(request, f"Df is empty")
                return redirect('risk-home')
        except Exception as e:
            messages.warning(request, f"Can't read the df {e}")
            return redirect('risk-home')
        
    context = {'balans_date_str':balans_date_str}
    return render(request, 'risk/result.html', context = context)



def risk_blockc_home(request):
    selected_date = request.session.get(f"balans_date_str_{request.user.id}")
    balans_filepath_svod = request.session.get(f"balans_filepath_svod_{request.user.id}")
    if os.path.exists(balans_filepath_svod):
        try:
            df = pd.read_parquet(balans_filepath_svod)
            if df.empty:
                messages.warning(request, f"Df is empty")
                return redirect('risk-home')
        except Exception as e:
            messages.warning(request, f"Can't read the df {e}")
            return redirect('risk-home')
        df.columns = ['arcdate', 'account', 'amount']
        print(df.head())
    table_data = [
    # --- SECTION I: I ДАРАЖАЛИ КАПИТАЛ ---
    {"no": "", "name": "I ДАРАЖАЛИ КАПИТАЛ", "value": "", "is_header": True, "level": 0, "formula": ""},
    {"no": "1", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ", "value": "", "is_header": True, "level": 1},
    {"no": "1.1.", "name": "Оддий акциялар, нетто", "value": df[df['account']=='30312']['amount'].sum()+df[df['account']=='30318']['amount'].sum(), "is_header": False, "level": 3, "formula": "1.1 = a - б"},
    {"no": "a", "name": "Тўлиқ тўланган оддий акциялар", "value": 502385173, "is_header": False, "level": 4},
    {"no": "б", "name": "Минус: Қайта сотиб олинган оддий акциялар", "value": "", "is_header": False, "level": 4},
    {"no": "1.2.", "name": "Қўшимча капитал (оддий)", "value": 349727222, "is_header": False, "level": 3},
    {"no": "1.3.", "name": "Тақсимланмаган фойда (зарар), шу жумладан капитал захиралар", "value": 6163146509, "is_header": False, "level": 3},
    {"no": "a", "name": "Капитал ва бошқа захиралар", "value": 4199167083, "is_header": False, "level": 4},
    {"no": "б", "name": "Тақсимланмаган фойда", "value": 1963979426, "is_header": False, "level": 4},
    {"no": "в", "name": "Ўтган даврлар (йиллар) учун зарарлар", "value": "", "is_header": False, "level": 4},
    {"no": "г", "name": "Жорий йил учун зарар", "value": "", "is_header": False, "level": 4},
    {"no": "1.4.", "name": "Банкнинг консолидациялашган I даражали асосий капитал элементлари", "value": "", "is_header": False, "level": 3},
    {"no": "1.5.", "name": "Чегирмалар ҳисоблангунга қадар жами I даражали асосий капитал", "value": 7015258904, "is_header": False, "level": 3},
    {"no": "1.6.", "name": "I даражали асосий капиталдан чегирмалар", "value": 23061469, "is_header": False, "level": 3},
    {"no": "a", "name": "Гудвилл ҳамда банкнинг бошқа номоддий активлари", "value": "", "is_header": False, "level": 4},
    {"no": "б", "name": "Муддати узайтирилган солиқ талаблари", "value": 23061469, "is_header": False, "level": 4},
    {"no": "в", "name": "Пул оқимларини хеджирлаш натижасида ҳосил бўлган фойда ёки зарар", "value": "", "is_header": False, "level": 4},
    {"no": "г", "name": "Активларни секьюритизация қилиш натижасида олинадиган фойда", "value": "", "is_header": False, "level": 4},
    {"no": "д", "name": "Банкнинг ўз оддий акцияларига тўғридан-тўғри ёки билвосита инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "е", "name": "Банк ва бошқа банк ўзаро акцияларига инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "ж", "name": "Консолидациялашмаган молиявий бўлмаган битта ташкилотга инвестициялар банк 1ДАК 15% ошган қисми", "value": "", "is_header": False, "level": 4},
    {"no": "з", "name": "Консолидациялашмаган молиявий бўлмаган ташкилотларга жами инвестицияларнинг банк 1ДАК 50% ошган қисми", "value": "", "is_header": False, "level": 4},
    {"no": "и", "name": "Консолидациялашмаган ва банкнинг улуши сезиларли бўлмаган (≤10%) молиявий ташкилотларга жами инвестицияларнинг банк 1ДАК 10 % ошган қисми", "value": "", "is_header": False, "level": 4},
    {"no": "к", "name": "Консолидациялашмаган ва банкнинг улуши сезиларли бўлган (>10%) молиявий ташкилотларга жами инвестицияларнинг банк 1ДАК 10 % ошган қисми", "value": "", "is_header": False, "level": 4},
    {"no": "л", "name": "Банк томонидан муаммоли активлар бўйича қўшимча шакллантирилиши лозим бўлган захиралар", "value": "", "is_header": False, "level": 4},
    {"no": "I", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 2},
    
    # --- I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ ---
    {"no": "2", "name": "I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ", "value": "", "is_header": True, "level": 2},
    {"no": "2.1.", "name": "Имтиёзли акциялар", "value": 0, "is_header": False, "level": 3},
    {"no": "a", "name": "Тўлиқ тўланган имтиёзли акциялар", "value": 0, "is_header": False, "level": 4},
    {"no": "б", "name": "Минус: Қайта сотиб олинган имтиёзли акциялар", "value": 0, "is_header": False, "level": 4},
    {"no": "2.2.", "name": "Қўшимча капитал (имтиёзли)", "value": 0, "is_header": False, "level": 3},
    {"no": "2.3.", "name": "I даражали қўшимча капиталга киритилган капитал воситалари", "value": "", "is_header": False, "level": 3},
    {"no": "2.4.", "name": "Банкнинг консолидациялашган I даражали қўшимча капитал элементлари", "value": "", "is_header": False, "level": 3},
    {"no": "2.5.", "name": "Чегирмалар ҳисоблангунга қадар жами I даражали қўшимча капитал", "value": 0, "is_header": True, "level": 3},
    {"no": "2.6.", "name": "I даражали қўшимча капиталдан чегирмалар", "value": "", "is_header": True, "level": 3},
    {"no": "a", "name": "Банк ўзининг I даражали қўшимча капитал элементларига киритган инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "б", "name": "Банкнинг бошқа банкнинг I даражали қўшимча капиталига киритилган капитал элементларига инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "II", "name": "ЖАМИ I ДАРАЖАЛИ ҚЎШИМЧА КАПИТАЛ", "value": 0, "is_header": True, "level": 2},
    {"no": "III", "name": "ЖАМИ ТЎҒРИЛАНГАН I ДАРАЖАЛИ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 2},
    {"no": "3.1.", "name": "I даражали капиталга алоқадор қарз олувчилар бўйича меъёрларни ҳисобга олган ҳолдаги тузатиш", "value": 6992197435, "is_header": False, "level": 3},
    {"no": "ЖАМИ I ДАРАЖАЛИ КАПИТАЛ", "name": "ЖАМИ I ДАРАЖАЛИ КАПИТАЛ", "value": 6992197435, "is_header": True, "level": 1},

    # --- SECTION II: II ДАРАЖАЛИ КАПИТАЛ ---
    {"no": "", "name": "II ДАРАЖАЛИ КАПИТАЛ", "value": "", "is_header": True, "level": 0, "formula": ""},
    {"no": "4.1.", "name": "II даражали капиталга киритилган капитал воситалари", "value": "", "is_header": False, "level": 3},
    {"no": "4.2.", "name": "Қўшимча капитал (II даражали капитал воситалари бўйича)", "value": "", "is_header": False, "level": 3},
    {"no": "4.3.", "name": "Жорий йил соф фойдаси", "value": 0, "is_header": False, "level": 3},
    {"no": "4.4.", "name": "Стандарт активларга яратилган захиралар", "value": 75250275, "is_header": False, "level": 3},
    {"no": "4.5.", "name": "Банкнинг консолидациялашган II даражали капитал элементлари", "value": "", "is_header": False, "level": 3},
    {"no": "4.6.", "name": "Субординар қарз", "value": 1187593020, "is_header": False, "level": 3},
    {"no": "4.7.", "name": "Чегирмалар ҳисоблангунга қадар жами II даражали капитал", "value": 1262843295, "is_header": False, "level": 3},
    {"no": "4.8.", "name": "II даражали капиталдан чегирмалар", "value": 0, "is_header": False, "level": 3},
    {"no": "a", "name": "Банк ўзининг II даражали капитал элементларига киритган инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "б", "name": "Банкнинг бошқа банкнинг II даражали капиталига киритилган капитал элементларига инвестициялари", "value": "", "is_header": False, "level": 4},
    {"no": "в", "name": "II даражали капиталнинг I даражали капиталдан ортиқча қисми (чегирмаси)", "value": 0, "is_header": False, "level": 4},
    {"no": "IV", "name": "ЧЕГИРМАЛАРНИ ҲИСОБГА ОЛГАН ҲОЛДAГИ II ДАРАЖАЛИ КАПИТАЛ", "value": 1262843295, "is_header": True, "level": 2},
    {"no": "V", "name": "ЖАМИ РЕГУЛЯТИВ КАПИТАЛ", "value": 8255040730, "is_header": True, "level": 1},

    # --- SECTION VI: RISK-WEIGHTED ASSETS & RATIOS ---
    {"no": "VI", "name": "ТАВАККАЛЧИЛИККА ТОРТИЛГАН АКТИВЛАР УМУМИЙ СУММАСИ", "value": 6020021997, "is_header": True, "level": 1},
    {"no": "a", "name": "Баланс ва балансдан ташқари активларнинг таваккалчиликни ҳисобга олган ҳолдаги активларнинг умумий суммаси", "value": 0, "is_header": False, "level": 4},
    {"no": "б", "name": "Операцион таваккалчилик", "value": 5564880468, "is_header": False, "level": 4},
    {"no": "в", "name": "Бозор таваккалчилиги", "value": 455141529, "is_header": False, "level": 4},
    
    # --- CAPITAL ADEQUACY RATIOS ---
    {"no": "VII", "name": "I ДАРАЖАЛИ АСОСИЙ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (Л/I)", "value": "116,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
    {"no": "VIII", "name": "I ДАРАЖАЛИ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (Ш/I)", "value": "116,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
    {"no": "IX", "name": "РЕГУЛЯТИВ КАПИТАЛНИНГ МОНАДЛИК КОЭФФИЦИЕНТИ (У/I)", "value": "137,13%", "is_header": True, "level": 2, "tags": ["ratio"]},
    
    # --- CAPITAL BUFFERS ---
    {"no": "X", "name": "МИНИМАЛ КАПИТАЛ ТАЛАБЛАРИ (БУФЕРЛАРДАН ТАШҚАРИ)", "value": "", "is_header": True, "level": 2},
    {"no": "a", "name": "I даражали асосий капиталнинг монадлик коэффициенти", "value": "4,50%", "is_header": False, "level": 4},
    {"no": "б", "name": "I даражали капиталнинг монадлик коэффициенти", "value": "6,00%", "is_header": False, "level": 4},
    {"no": "в", "name": "Регулятив капиталнинг монадлик коэффициенти", "value": "8,00%", "is_header": False, "level": 4},
    {"no": "XI", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИ", "value": "5,00%", "is_header": True, "level": 2},
    {"no": "a", "name": "Консервацион капитал буфери коэффициенти", "value": "2,50%", "is_header": False, "level": 4},
    {"no": "б", "name": "Тизимли аҳамиятга эга банклар учун капитал буфери коэффициенти", "value": "1,00%", "is_header": False, "level": 4},
    {"no": "в", "name": "Контрциклик капитал буфери коэффициенти", "value": "1,50%", "is_header": False, "level": 4},
    {"no": "XII", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИГА ҚАДАР I ДАРАЖАЛИ АСОСИЙ КАПИТАЛ КОЭФФИЦИЕНТИ*", "value": "111,15%", "is_header": True, "level": 2, "tags": ["ratio"]},
    {"no": "XIII", "name": "ЖАМИ КАПИТАЛ БУФЕРЛАРИ БЎЙИЧА ОРТИҚЧА (+) / ЕТИШМАГАН (-) СУММА", "value": "106,15%", "is_header": True, "level": 2},
    
    # --- LEVERAGE ---
    {"no": "XIV", "name": "Левераж ҳисоб-китоби учун активлар", "value": 0, "is_header": True, "level": 2},
    {"no": "a", "name": "Жами активлар", "value": 0, "is_header": False, "level": 4},
    {"no": "б", "name": "Балансдан ташқари активлар", "value": 0, "is_header": False, "level": 4},
    {"no": "в", "name": "Ҳосилавий (дериватив) воситалар", "value": 0, "is_header": False, "level": 4},
    {"no": "г", "name": "Минус: Жами захиралар ва капиталдан чегирмалар", "value": 23061469, "is_header": False, "level": 4},
    {"no": "XV", "name": "Левераж коэффициенти", "value": "0,00%", "is_header": True, "level": 1, "tags": ["ratio"]}]
    for row in table_data:
        if isinstance(row["value"], (int, float)):
            # Format integer with thousands separating spaces: 502385173 -> 502 385 173
            row["value"] = f"{row['value']:,}".replace(",", " ")
    # --- Advanced Filtering Logic Example ---
    # If your client requests a filter via GET parameter (e.g., ?type=ratios)
    #filter_type = request.GET.get('type')
    #if filter_type in ['tier1', 'tier2', 'ratios']:
    #    table_data = [row for row in table_data if filter_type in row.get('tags', [])]
        
    # 3. Context preparation
    context = {
        'bank_name': 'АТБ "БАНК НОМИ"',
        'report_date': '28 август 2026 йил',
        'table_data': table_data
    }
    context = {
        'bank_name': 'АТБ Капиталбанк',
        'report_date': '28 август 2026 йил',
        'table_data': table_data
    }
    return render(request, 'risk/blockc_home.html', context)



def risk_appetite_home(request):
    return render(request, 'risk/appetite_home.html')


def risk_limit_home(request):
    return render(request, 'risk/limit_home.html')


def risk_combined_home(request):
    return render(request, 'risk/combined_home.html')


def risk_plan_home(request):
    return render(request, 'risk/plan_home.html')

    
def bank_capital_view(request):
    return render(request, 'risk/blockc_home.html', context)
Foydali bo'ldimi? Yoqmadi 0 Baholash uchun kiring