Programming

balans_vs_portfel_v

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 prepare_df, generate_risk_chart, find_summa_and_npl, generate_pie_chart, process_balans
from .process import process_portfel_best
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

portfel_input_folder = BASE_DIR / "datasets" / "portfel" / "input"
portfel_svod_folder = BASE_DIR / "datasets" / "portfel" / "svod"
portfel_all_folder = BASE_DIR / "datasets" / "portfel" / "all"
balans_svod_folder = BASE_DIR / "datasets" / "balans" / "svod"
utils_path = BASE_DIR / "utils" / "useforauto.xlsx"

def portfel_vs_balans(request):
    # Use standard session keys unless user-isolated keys are strictly required by design
    portfel_date_str = request.session.get(f"portfel_date_str_{request.user.id}")
    
    if not portfel_date_str:
        messages.warning(request, "No date found in session.")
        return redirect("portfel-home")

    try:
        selected_date = datetime.datetime.strptime(
            portfel_date_str, "%Y-%m-%d"
        ).date()
    except ValueError:
        messages.warning(request, "The selected date format is invalid.")
        return redirect("portfel-home")

    portfel_filepath = f"{portfel_svod_folder}/svod_{selected_date}.parquet"
    balans_filepath = f"{balans_svod_folder}/svod_{selected_date}.parquet"

    # Check if files exist safely
    if not os.path.exists(portfel_filepath):
        messages.error(
            request, f"Portfel file for {selected_date} are missing from storage, please select which date you want to see"
        )
        return redirect("portfel-home")

    if not os.path.exists(balans_filepath):
        messages.error(
            request, f"Balans file for {selected_date} are missing from storage, please select which date you want to see"
        )
        return redirect("risk-home")
        
    # Read data
    portfel = pd.read_parquet(portfel_filepath)
    balans = pd.read_parquet(balans_filepath)
    
    # Process balans using the np.select logic we built
    balans = process_balans(balans)

    # Calculate Portfolio sums (Use float() conversion to prevent serialization errors in Django)
    p_brutto = float(portfel["brutto_amount"].sum())
    p_spisat = float(portfel["95413_amount"].sum())
    p_reserve = float(portfel["reserve_main_amount"].sum())

    # Calculate Balans sums
    b_sums = balans.groupby("type")["amount"].sum()
    b_brutto = float(b_sums.get("brutto", 0))*-1
    b_reserve = float(b_sums.get("reserve", 0))
    b_spisat = float(b_sums.get("spisat", 0))*-1

    # Construct structured matrix for the template looping
    comparison_data = [
        {
            "metric": "Brutto Amount",
            "portfel": p_brutto,
            "balans": b_brutto,
            "diff": p_brutto - b_brutto,
        },
        {
            "metric": "Reserve Main Amount",
            "portfel": p_reserve,
            "balans": b_reserve,
            "diff": p_reserve - b_reserve,
        },
        {
            "metric": "Spisat (95413)",
            "portfel": p_spisat,
            "balans": b_spisat,
            "diff": p_spisat - b_spisat,
        },
    ]

    context = {
        
        "selected_date": selected_date,
        "comparison_data": comparison_data,
        "totals": {
            "portfel": p_brutto + p_reserve + p_spisat,
            "balans": b_brutto + b_reserve + b_spisat,
            "diff": (p_brutto + p_reserve + p_spisat)
            - (b_brutto + b_reserve + b_spisat),
        },
    }

    return render(request, "portfel/balans_vs_portfel.html", context)
    
Foydali bo'ldimi? Yoqmadi 0 Baholash uchun kiring