<%@ Page Language="vb" AutoEventWireup="true" CodeBehind="Maturities2.aspx.
vb"
Inherits="Ticket_Help_Desk_System.Maturities2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Investments Dashboard</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/
all.min.css" rel="stylesheet" />
<style>
.card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
border-radius: 15px;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.2);
}
.card i {
opacity: 0.9;
}
.chart-container {
position: relative;
margin: auto;
height: 400px;
width: 100%;
}
.current-date {
font-size: 1.1rem;
color: #6c757d;
margin-bottom: 1rem;
}
.table th {
background-color: #f8f9fa;
}
.table td, .table th {
text-align: center;
}
.filter-section {
margin-bottom: 20px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div class="container mt-4">
<!-- Header Section with Current Date -->
<div class="row mb-3 align-items-center">
<div class="col-md-6">
<h2>Investments Dashboard</h2>
</div>
<div class="col-md-6 text-right">
<asp:Label ID="lblCurrentDate" runat="server"
CssClass="current-date"></asp:Label>
</div>
</div>
<!-- Filter Section -->
<div class="row filter-section">
<!-- Status Filter -->
<div class="col-md-3">
<label for="ddlStatusFilter">Filter by Status</label>
<asp:DropDownList ID="ddlStatusFilter" runat="server"
CssClass="form-control" AutoPostBack="True" OnSelectedIndexChanged="ApplyFilters">
<asp:ListItem Text="All" Value="All" />
<asp:ListItem Text="Active" Value="IM" />
<asp:ListItem Text="Matured" Value="IB" />
</asp:DropDownList>
</div>
<!-- Investment Type Filter -->
<div class="col-md-3">
<label for="ddlAssetType">Investment Type</label>
<asp:DropDownList ID="ddlAssetType" runat="server"
CssClass="form-control" AutoPostBack="True" OnSelectedIndexChanged="ApplyFilters">
<asp:ListItem Text="All" Value="All" />
<asp:ListItem Text="Money Market" Value="MMKT" />
<asp:ListItem Text="Stocks" Value="EQTY" />
</asp:DropDownList>
</div>
<!-- Maturity Date Range -->
<div class="col-md-3">
<label for="txtFromDate">From Date</label>
<asp:TextBox ID="txtFromDate" runat="server" CssClass="form-
control" TextMode="Date"></asp:TextBox>
</div>
<div class="col-md-3">
<label for="txtToDate">To Date</label>
<asp:TextBox ID="txtToDate" runat="server" CssClass="form-
control" TextMode="Date"></asp:TextBox>
</div>
</div>
<!-- Interest Rate Filter and Apply Button -->
<div class="row filter-section">
<!-- Interest Rate Filter -->
<div class="col-md-3">
<label for="txtMinRate">Min Rate (%)</label>
<asp:TextBox ID="txtMinRate" runat="server" CssClass="form-
control" TextMode="Number"></asp:TextBox>
</div>
<div class="col-md-3">
<label for="txtMaxRate">Max Rate (%)</label>
<asp:TextBox ID="txtMaxRate" runat="server" CssClass="form-
control" TextMode="Number"></asp:TextBox>
</div>
<!-- Apply Filter Button -->
<div class="col-md-3">
<label> </label>
<asp:Button ID="btnApplyFilters" runat="server" Text="Apply
Filters" CssClass="btn btn-primary btn-block" OnClick="ApplyFilters" />
</div>
</div>
<!-- Summary Cards -->
<div class="row">
<!-- Today's Maturities -->
<div class="col-md-4">
<div class="card bg-warning text-white shadow-lg rounded-lg">
<div class="card-body text-center">
<i class="fas fa-calendar-day fa-3x mb-3"></i>
<h5 class="card-title font-weight-bold">Today's
Maturities</h5>
<h3 class="display-4">
<asp:Label ID="lblTodayMaturityCount"
runat="server" Text="0"></asp:Label>
</h3>
<p class="mb-0">Total Value:</p>
<h4>
<asp:Label ID="lblTodayMaturityValue"
runat="server" Text="$0.00"></asp:Label>
</h4>
</div>
</div>
</div>
<!-- Upcoming Maturities -->
<div class="col-md-4">
<div class="card bg-primary text-white shadow-lg rounded-lg">
<div class="card-body text-center">
<i class="fas fa-hourglass-half fa-3x mb-3"></i>
<h5 class="card-title font-weight-bold">Upcoming
Maturities</h5>
<h3 class="display-4">
<asp:Label ID="lblUpcomingMaturityCount"
runat="server" Text="0"></asp:Label>
</h3>
<p class="mb-0">Total Value:</p>
<h4>
<asp:Label ID="lblUpcomingMaturityValue"
runat="server" Text="$0.00"></asp:Label>
</h4>
</div>
</div>
</div>
<!-- Equities Maturities -->
<div class="col-md-4">
<div class="card bg-success text-white shadow-lg rounded-lg">
<div class="card-body text-center">
<i class="fas fa-chart-line fa-3x mb-3"></i>
<h5 class="card-title font-weight-bold">Equities
Maturities</h5>
<h3 class="display-4">
<asp:Label ID="Label1" runat="server"
Text="0"></asp:Label>
</h3>
<p class="mb-0">Total Value:</p>
<h4>
<asp:Label ID="Label2" runat="server"
Text="$0.00"></asp:Label>
</h4>
</div>
</div>
</div>
</div>
<!-- Chart Section -->
<div class="row">
<!-- Bar Chart -->
<div class="col-md-6">
<div class="chart-container">
<canvas id="investmentChart"></canvas>
<asp:Literal ID="litChartData" runat="server"
Visible="false"></asp:Literal>
</div>
</div>
<!-- Pie Chart -->
<div class="col-md-6">
<div class="chart-container">
<canvas id="pieChart"></canvas>
<asp:Literal ID="litPieChartData" runat="server"
Visible="false"></asp:Literal>
</div>
</div>
</div>
<!-- GridView for Maturities -->
<asp:GridView ID="gvMaturities" runat="server" CssClass="table table-
striped table-hover"
AutoGenerateColumns="false" AllowSorting="true"
OnSorting="gvMaturities_Sorting"
AllowPaging="true" PageSize="10"
OnPageIndexChanging="gvMaturities_PageIndexChanging">
<Columns>
<asp:BoundField DataField="InvestmentID" HeaderText="Investment
ID" SortExpression="InvestmentID" />
<asp:BoundField DataField="AssetName" HeaderText="Investment
Type" SortExpression="AssetName" />
<asp:BoundField DataField="Amount" HeaderText="Maturity Value"
SortExpression="Amount" />
<asp:BoundField DataField="MaturityDate" HeaderText="Maturity
Date" SortExpression="MaturityDate" DataFormatString="{0:yyyy-MM-dd}" />
<asp:BoundField DataField="Status" HeaderText="Status"
SortExpression="Status" />
<asp:BoundField DataField="D_TranDate" HeaderText="Transaction
Date" SortExpression="D_TranDate" DataFormatString="{0:yyyy-MM-dd}" />
<asp:BoundField DataField="M_Interest" HeaderText="Interest
Amount" SortExpression="M_Interest" />
<asp:BoundField DataField="C_AssetID" HeaderText="Asset ID"
SortExpression="C_AssetID" />
<asp:BoundField DataField="C_Other" HeaderText="Other Details"
SortExpression="C_Other" />
<asp:BoundField DataField="M_NominalValue" HeaderText="Nominal
Value" SortExpression="M_NominalValue" DataFormatString="{0:N2}" />
<asp:BoundField DataField="N_Rate" HeaderText="Rate (%)"
SortExpression="N_Rate" DataFormatString="{0:N2}" />
</Columns>
</asp:GridView>
<!-- Breakdown by Asset Class -->
<h3>Breakdown by Asset Class</h3>
<asp:GridView ID="gvAssetBreakdown" runat="server" CssClass="table
table-striped table-hover" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="AssetClass" HeaderText="Asset Class"
/>
<asp:BoundField DataField="TodayValue" HeaderText="Today's
Maturity Value" DataFormatString="{0:C}" />
<asp:BoundField DataField="UpcomingValue" HeaderText="Upcoming
Maturity Value" DataFormatString="{0:C}" />
</Columns>
</asp:GridView>
</div>
<!-- Chart.js Script -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
// Bar Chart
var barChartData = JSON.parse('<%= litChartData.Text %>');
var barCtx =
document.getElementById('investmentChart').getContext('2d');
var barChart = new Chart(barCtx, {
type: 'bar',
data: {
labels: barChartData.map(data => data.Label),
datasets: [{
label: 'Total Maturity Value',
data: barChartData.map(data => data.Count),
backgroundColor: 'blue'
}]
}
});
// Pie Chart
var pieChartData = JSON.parse('<%= litPieChartData.Text %>');
var pieCtx = document.getElementById('pieChart').getContext('2d');
var pieChart = new Chart(pieCtx, {
type: 'pie',
data: {
labels: pieChartData.map(data => data.Label),
datasets: [{
label: 'Asset Distribution',
data: pieChartData.map(data => data.Count),
backgroundColor: [
'rgba(255, 99, 132, 0.6)',
'rgba(54, 162, 235, 0.6)',
'rgba(255, 206, 86, 0.6)',
'rgba(75, 192, 192, 0.6)',
'rgba(153, 102, 255, 0.6)'
]
}]
}
});
</script>
</form>
</body>
</html>
Imports System
Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Web.UI.DataVisualization.Charting
Imports System.Web.Script.Serialization
Partial Class Maturities2
Inherits System.Web.UI.Page
Private connectionString As String =
ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
Private Property GridSortExpression() As String
Get
If ViewState("SortExpression") IsNot Nothing Then
Return ViewState("SortExpression").ToString()
Else
Return "N_ID"
End If
End Get
Set(ByVal value As String)
ViewState("SortExpression") = value
End Set
End Property
Private Property GridSortDirection() As String
Get
If ViewState("SortDirection") IsNot Nothing Then
Return ViewState("SortDirection").ToString()
Else
Return "ASC"
End If
End Get
Set(ByVal value As String)
ViewState("SortDirection") = value
End Set
End Property
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
BindMaturitiesGrid()
BindCardsData()
BindChartData()
BindPieChartData()
lblCurrentDate.Text = DateTime.Now.ToString("dddd, MMMM dd, yyyy")
End If
End Sub
Private Sub BindMaturitiesGrid()
Dim dt As New DataTable()
Dim filterStatus As String = ddlStatusFilter.SelectedValue
Using conn As New SqlConnection(connectionString)
Dim query As String = "SELECT N_ID AS InvestmentID, C_InvestType AS
AssetName, D_MaturityDate AS MaturityDate, " &
"M_MaturityValue AS Amount, C_Status AS Status, D_TranDate,
M_Interest, C_AssetID, C_Other, " &
"M_NominalValue, N_Rate " &
"FROM Investments"
If filterStatus <> "All" Then
query &= " WHERE C_Status = @Status"
End If
query &= " ORDER BY D_MaturityDate"
Using cmd As New SqlCommand(query, conn)
If filterStatus <> "All" Then
cmd.Parameters.AddWithValue("@Status", filterStatus)
End If
Using da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
End Using
End Using
gvMaturities.DataSource = dt
gvMaturities.DataBind()
End Sub
Protected Sub ddlStatusFilter_SelectedIndexChanged(sender As Object, e As
EventArgs)
BindMaturitiesGrid()
End Sub
Private Sub BindCardsData()
Using conn As New SqlConnection(connectionString)
Dim query As String = "SELECT
SUM(CASE WHEN D_MaturityDate = CAST(GETDATE() AS DATE) THEN 1 ELSE 0
END) AS TodayCount,
SUM(CASE WHEN D_MaturityDate = CAST(GETDATE() AS DATE) THEN
M_MaturityValue ELSE 0 END) AS TodayValue,
SUM(CASE WHEN D_MaturityDate > CAST(GETDATE() AS DATE) THEN 1 ELSE 0
END) AS UpcomingCount,
SUM(CASE WHEN D_MaturityDate > CAST(GETDATE() AS DATE) THEN
M_MaturityValue ELSE 0 END) AS UpcomingValue
FROM Investments"
Using cmd As New SqlCommand(query, conn)
conn.Open()
Dim reader As SqlDataReader = cmd.ExecuteReader()
If reader.Read() Then
lblTodayMaturityCount.Text = reader("TodayCount").ToString()
lblTodayMaturityValue.Text =
FormatCurrency(reader("TodayValue"))
lblUpcomingMaturityCount.Text =
reader("UpcomingCount").ToString()
lblUpcomingMaturityValue.Text =
FormatCurrency(reader("UpcomingValue"))
End If
conn.Close()
End Using
End Using
End Sub
Private Sub BindChartData()
Dim dt As New DataTable()
Using conn As New SqlConnection(connectionString)
Dim query As String = "SELECT FORMAT(D_MaturityDate, 'yyyy-MM') AS
MaturityMonth, SUM(M_MaturityValue) AS TotalMaturity FROM Investments GROUP BY
FORMAT(D_MaturityDate, 'yyyy-MM') ORDER BY MaturityMonth"
Using cmd As New SqlCommand(query, conn)
Using da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
End Using
End Using
Dim chartPoints As New List(Of ChartDataPoint)()
For Each row As DataRow In dt.Rows
chartPoints.Add(New ChartDataPoint With {.Label =
row("MaturityMonth").ToString(), .Count = Convert.ToInt32(row("TotalMaturity"))})
Next
Dim serializer As New JavaScriptSerializer()
litChartData.Text = serializer.Serialize(chartPoints)
End Sub
Private Sub BindAssetBreakdown()
Dim dt As New DataTable()
Using conn As New SqlConnection(connectionString)
Dim query As String = "SELECT
C_InvestType AS AssetClass,
SUM(CASE WHEN D_MaturityDate = CAST(GETDATE() AS DATE) THEN
M_MaturityValue ELSE 0 END) AS TodayValue,
SUM(CASE WHEN D_MaturityDate > CAST(GETDATE() AS DATE) THEN
M_MaturityValue ELSE 0 END) AS UpcomingValue
FROM Investments
GROUP BY C_InvestType"
Using cmd As New SqlCommand(query, conn)
Using da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
End Using
End Using
gvAssetBreakdown.DataSource = dt
gvAssetBreakdown.DataBind()
End Sub
Protected Sub gvMaturities_RowDataBound(sender As Object, e As
GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim maturityDate As DateTime =
Convert.ToDateTime(DataBinder.Eval(e.Row.DataItem, "MaturityDate"))
Dim timeRemaining As TimeSpan = maturityDate - DateTime.Now
If timeRemaining.TotalDays < 0 Then
e.Row.CssClass = "overdue"
ElseIf timeRemaining.TotalDays <= 7 Then
e.Row.CssClass = "urgent"
ElseIf timeRemaining.TotalDays <= 14 Then
e.Row.CssClass = "warning"
End If
End If
End Sub
Protected Sub gvMaturities_Sorting(sender As Object, e As
GridViewSortEventArgs)
If GridSortExpression = e.SortExpression Then
GridSortDirection = If(GridSortDirection = "ASC", "DESC", "ASC")
Else
GridSortExpression = e.SortExpression
GridSortDirection = "ASC"
End If
BindMaturitiesGrid()
End Sub
Public Class ChartDataPoint
Public Property Label As String
Public Property Count As Integer
End Class
Protected Sub gvMaturities_PageIndexChanging(sender As Object, e As
GridViewPageEventArgs)
gvMaturities.PageIndex = e.NewPageIndex
BindMaturitiesGrid()
End Sub
Protected Sub ApplyFilters(ByVal sender As Object, ByVal e As EventArgs)
BindGridData()
End Sub
Private Sub BindGridData()
Dim query As String = "SELECT
N_InvID AS InvestmentID,
C_InvestType AS AssetName,
M_MaturityValue AS Amount,
D_MaturityDate AS MaturityDate,
C_Status AS Status,
D_TranDate,
M_Interest,
C_AssetID,
C_Other,
M_NominalValue,
N_Rate
FROM Investments WHERE 1=1"
' Apply Status Filter
If ddlStatusFilter.SelectedValue <> "All" Then
query &= " AND C_Status = @StatusFilter"
End If
' Apply Investment Type Filter
If ddlAssetType.SelectedValue <> "All" Then
query &= " AND C_InvestType = @AssetName"
End If
' Apply Maturity Date Range Filter
If Not String.IsNullOrEmpty(txtFromDate.Text) Then
query &= " AND D_MaturityDate >= @FromDate"
End If
If Not String.IsNullOrEmpty(txtToDate.Text) Then
query &= " AND D_MaturityDate <= @ToDate"
End If
query &= " ORDER BY D_MaturityDate"
Using conn As New SqlConnection(connectionString)
Using cmd As New SqlCommand(query, conn)
' Add Parameters
If ddlStatusFilter.SelectedValue <> "All" Then
cmd.Parameters.AddWithValue("@StatusFilter",
ddlStatusFilter.SelectedValue)
End If
If ddlAssetType.SelectedValue <> "All" Then
cmd.Parameters.AddWithValue("@AssetName",
ddlAssetType.SelectedValue)
End If
If Not String.IsNullOrEmpty(txtFromDate.Text) Then
cmd.Parameters.AddWithValue("@FromDate",
Convert.ToDateTime(txtFromDate.Text))
End If
If Not String.IsNullOrEmpty(txtToDate.Text) Then
cmd.Parameters.AddWithValue("@ToDate",
Convert.ToDateTime(txtToDate.Text))
End If
' Fill DataTable
Dim dt As New DataTable()
Using da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
' Bind GridView
gvMaturities.DataSource = dt
gvMaturities.DataBind()
End Using
End Using
End Sub
Private Sub BindPieChartData()
Dim dt As New DataTable()
Using conn As New SqlConnection(connectionString)
Dim query As String = "SELECT C_InvestType AS AssetName,
SUM(M_MaturityValue) AS TotalValue FROM Investments GROUP BY C_InvestType"
Using cmd As New SqlCommand(query, conn)
Using da As New SqlDataAdapter(cmd)
da.Fill(dt)
End Using
End Using
End Using
Dim pieChartData As New List(Of ChartDataPoint)()
For Each row As DataRow In dt.Rows
pieChartData.Add(New ChartDataPoint With {
.Label = row("AssetName").ToString(),
.Count = Convert.ToInt32(row("TotalValue"))
})
Next
Dim serializer As New JavaScriptSerializer()
litPieChartData.Text = serializer.Serialize(pieChartData)
End Sub
End Class