Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports System.Collections.ObjectModel
- Imports Telerik.Windows.Controls
- Imports Budget_SL.BudgetSvcRef
- Imports Telerik.Windows.Controls.GridView
- Imports Telerik.Windows.Controls.Charting
- Imports System.Math
- Imports System.Linq
- Partial Public Class MainPage
- Inherits UserControl
- Public Class AccumulativeUsage
- Dim _Usagetot As Decimal = 0
- Dim _usagelastmonth As Decimal = 0
- Dim _usagelast3Months As Decimal = 0
- Dim _scale As New List(Of Decimal)
- Public Sub New()
- For i As Integer = 0 To 10
- _scale.Add(i * 10000)
- Next
- End Sub
- Public Property Total() As Decimal
- Get
- Return _Usagetot
- End Get
- Set(ByVal value As Decimal)
- _Usagetot = value
- End Set
- End Property
- Public Property Uusagelastmonth() As Decimal
- Get
- Return _usagelastmonth
- End Get
- Set(ByVal value As Decimal)
- _usagelastmonth = value
- End Set
- End Property
- Public Property Usagelast3Months() As Decimal
- Get
- Return _usagelast3Months
- End Get
- Set(ByVal value As Decimal)
- _usagelast3Months = value
- End Set
- End Property
- Public Property Scale() As List(Of Decimal)
- Get
- Return _scale
- End Get
- Set(ByVal value As List(Of Decimal))
- _scale = value
- End Set
- End Property
- End Class
- Public Class MyCat
- Dim _cat As String = ""
- Dim _usageTot As Double = 0
- Dim _AvaToAlloc As Double = 0
- Dim _newAlloc As Double = 0
- Dim _newBudget As Double = 0
- Dim _usage As Double = 0
- Dim _budget As Double = 0
- Public Property Category() As String
- Get
- Return _cat
- End Get
- Set(ByVal value As String)
- _cat = value
- End Set
- End Property
- Public Property UsageTot() As Double
- Get
- Return _usageTot
- End Get
- Set(ByVal value As Double)
- _usageTot = value
- End Set
- End Property
- Public Property AvaToAlloc() As Double
- Get
- Return _AvaToAlloc
- End Get
- Set(ByVal value As Double)
- _AvaToAlloc = value
- End Set
- End Property
- Public Property NewAlloc() As Double
- Get
- Return _newAlloc
- End Get
- Set(ByVal value As Double)
- _newAlloc = value
- End Set
- End Property
- Public Property NewBudget() As Double
- Get
- Return _newBudget
- End Get
- Set(ByVal value As Double)
- _newBudget = value
- End Set
- End Property
- Public Property Usage() As Double
- Get
- Return _usage
- End Get
- Set(ByVal value As Double)
- _usage = value
- End Set
- End Property
- Public Property Budget() As Double
- Get
- Return _budget
- End Get
- Set(ByVal value As Double)
- _budget = value
- End Set
- End Property
- End Class
- Private m_BatchGuid As Guid
- Private m_VisualizationBatchGuid As Guid
- Private m_Initializing As Boolean = True
- Private m_LoadingBudget As Boolean = False
- Private m_Initialized As Boolean = False
- Dim orgColor As System.Windows.Media.Brush = Nothing
- Private m_initParams As Dictionary(Of String, String)
- Public Sub New(ByVal initParams As Dictionary(Of String, String))
- InitializeComponent()
- m_initParams = initParams
- m_UserId = CInt(m_initParams("userId"))
- m_Username = m_initParams("username")
- chart.DefaultView.ChartArea.AdditionalYAxes.Add(New AxisY())
- chart.DefaultView.ChartArea.AdditionalYAxes.Add(New AxisY())
- chart.DefaultView.ChartArea.AdditionalYAxes(0).AxisName = "MTD"
- chart.DefaultView.ChartArea.AdditionalYAxes(1).AxisName = "Monthly Avg"
- 'chartSummary.DefaultView.ChartArea.AdditionalYAxes.Add(New AxisY())
- 'chartSummary.DefaultView.ChartArea.AdditionalYAxes.Add(New AxisY())
- 'chartSummary.DefaultView.ChartArea.AdditionalYAxes(0).AxisName = "Budget"
- 'chartSummary.DefaultView.ChartArea.AdditionalYAxes(1).AxisName = "Average"
- Dim TheDate As New DateTime(2009, 1, 1)
- 'TODO: proc breaks on august data
- Dim LastMonth As DateTime = DateTime.Now.AddMonths(-2.0)
- While TheDate <= LastMonth
- Cb_FromDate.Items.Add(TheDate.ToString("MMMM yyyy"))
- Cb_ToDate.Items.Add(TheDate.ToString("MMMM yyyy"))
- TheDate = TheDate.AddMonths(1.0)
- End While
- Cb_FromDate.SelectedItem = "January 2010"
- Cb_ToDate.SelectedItem = LastMonth.ToString("MMMM yyyy")
- 'Dim detailDefinition As New GridViewTableDefinition()
- 'detailDefinition.Relation = New Telerik.Windows.Data.PropertyRelation("Details")
- 'Grd_Data.TableDefinition.ChildTableDefinitions.Add(detailDefinition)
- Btn_SaveChanges.IsEnabled = False
- Btn_Reset.IsEnabled = False
- m_Initializing = False
- orgColor = Grd_Data.AlternateRowBackground
- End Sub
- Private Function GetSelectedCustomer() As Budget_UserCustomers
- Return Cb_Customer.SelectedItem
- End Function
- Private Function GetSelectedCustomerDatabase() As String
- Return ""
- End Function
- Private Sub MyStageDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
- Dim BSC As New BudgetSvcClient
- BSC.GetSummariesAsync(m_BatchGuid, GetSelectedCustomerDatabase())
- AddHandler BSC.GetSummariesCompleted, AddressOf MyGetSummariesCompleted
- End Sub
- Dim m_Summaries As ObservableCollection(Of Summary_Staging)
- Dim m_Details As ObservableCollection(Of Detail_Staging)
- Private Sub MyGetSummariesCompleted(ByVal sender As Object, ByVal e As GetSummariesCompletedEventArgs)
- m_Summaries = e.Result
- Dim BSC As New BudgetSvcClient
- BSC.GetDetailsAsync(m_BatchGuid, GetSelectedCustomerDatabase())
- AddHandler BSC.GetDetailsCompleted, AddressOf MyGetDetailsCompleted
- End Sub
- Private Sub PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs)
- If e.PropertyName = "ToOrderQty" Then
- Dim item As Detail_Staging = sender
- UpdateDataForNewQty(item)
- Btn_SaveChanges.IsEnabled = True
- Btn_Reset.IsEnabled = True
- If Not Txt_LoadedBudget.Text.EndsWith("*") Then
- Txt_LoadedBudget.Text &= "*"
- End If
- End If
- End Sub
- Private Sub MyGetDetailsCompleted(ByVal sender As Object, ByVal e As GetDetailsCompletedEventArgs)
- m_Details = e.Result
- Dim Hash As New Dictionary(Of String, List(Of Detail_Staging))
- For Each D As Detail_Staging In e.Result
- If Not Hash.ContainsKey(D.Category) Then
- Hash.Add(D.Category, New List(Of Detail_Staging))
- End If
- Hash(D.Category).Add(D)
- Next
- Dim HS As New ObservableCollection(Of SummaryObj)
- For Each S As Summary_Staging In m_Summaries
- Dim H As New SummaryObj
- H.Summary = S
- For Each D As Detail_Staging In Hash(S.Category)
- H.Details.Add(D)
- AddHandler D.PropertyChanged, AddressOf PropertyChanged
- Next
- HS.Add(H)
- Next
- FillChartAndGauges(HS)
- Grd_Data.ItemsSource = HS
- For Each D As Detail_Staging In m_Details
- UpdateDataForNewQty(D)
- Next
- ShowBudgetName()
- WarnAboutZeroPricedItems()
- m_LoadingBudget = False
- UpdateSuggestedReallocation()
- Grd_Data.CalculateAggregates()
- 'Me.LoadingPanel.Visibility = Windows.Visibility.Collapsed
- End Sub
- Private Shared Function GenerateSeries(ByVal HS As ObservableCollection(Of SummaryObj), ByVal legendLabel As String, ByVal axisName As String, ByVal definition As ISeriesDefinition) As DataSeries
- Dim series As New DataSeries()
- series.Definition = definition
- series.LegendLabel = legendLabel
- series.Definition.AxisName = axisName
- 'For i As Integer = 0 To 5
- If legendLabel = "Budget" Then
- For Each H As SummaryObj In HS
- series.Add(New DataPoint(H.Summary.Budget))
- 'chart.GroupingSettings.GroupDescriptors.Add(new ChartGroupDescriptor(descriptor.Member));
- Next
- End If
- If legendLabel = "MTD" Then
- For Each H As SummaryObj In HS
- series.Add(New DataPoint(H.Summary.Expense))
- Next
- End If
- If legendLabel = "Available" Then
- For Each H As SummaryObj In HS
- series.Add(New DataPoint(H.Summary.Available))
- Next
- End If
- 'Next
- Return series
- End Function
- Private Shared Function GenerateSummarySeries(ByVal HS As ObservableCollection(Of SummaryObj), ByVal legendLabel As String, ByVal axisName As String, ByVal definition As ISeriesDefinition) As DataSeries
- Dim series As New DataSeries()
- series.Definition = definition
- 'series.LegendLabel = legendLabel
- series.Definition.AxisName = axisName
- Dim usage = 0
- Dim budget = 0
- Dim avg = 0
- Dim i = 0
- For Each H As SummaryObj In HS
- usage = usage + H.Summary.Expense
- budget = budget + H.Summary.Budget
- avg = avg + H.Summary.Expense
- i = i + 1
- Next
- series.Add(New DataPoint(usage))
- series.Add(New DataPoint(budget))
- series.Add(New DataPoint(avg \ i))
- Return series
- End Function
- Private Sub FillChartAndGauges(ByVal HS As ObservableCollection(Of SummaryObj))
- chart.DefaultView.ChartArea.DataSeries.Clear()
- chart.DefaultView.ChartArea.DataSeries.Add(GenerateSeries(HS, "Budget", String.Empty, New BarSeriesDefinition()))
- chart.DefaultView.ChartArea.DataSeries.Add(GenerateSeries(HS, "MTD", "Budget", New BarSeriesDefinition()))
- chart.DefaultView.ChartArea.DataSeries.Add(GenerateSeries(HS, "Available", "Average", New BarSeriesDefinition()))
- chart.DefaultView.ChartArea.AxisX.LabelRotationAngle = 90
- Dim i = 0
- For Each H As SummaryObj In HS
- chart.DefaultView.ChartArea.AxisX.TickPoints(i).Label = H.Summary.Category
- i = i + 1
- Next
- chartSummary.DefaultView.ChartLegend.Visibility = Windows.Visibility.Collapsed
- chartSummary.DefaultView.ChartArea.DataSeries.Clear()
- chartSummary.DefaultView.ChartArea.DataSeries.Add(GenerateSummarySeries(HS, "Usage", String.Empty, New BarSeriesDefinition()))
- chartSummary.DefaultView.ChartArea.AxisX.LabelRotationAngle = 90
- chartSummary.DefaultView.ChartArea.AxisX.TickPoints(0).Label = "Total Usage"
- chartSummary.DefaultView.ChartArea.AxisX.TickPoints(1).Label = "Total Budget"
- chartSummary.DefaultView.ChartArea.AxisX.TickPoints(2).Label = "Average Usage"
- Dim FromDate As DateTime = DateTime.ParseExact(Cb_FromDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- ToDate = ToDate.AddMonths(1) 'till the end of the month
- Dim ts = (ToDate - FromDate).TotalDays
- 'want at least 4 months of data for guages
- If ts < 120 Then
- FromDate = ToDate.AddMonths(-3)
- End If
- Dim BSC As New BudgetSvcClient
- m_VisualizationBatchGuid = Guid.NewGuid()
- BSC.StageChartDataAsync(m_VisualizationBatchGuid, GetSelectedCustomer().CustomerId, FromDate, ToDate, m_LoadingBudget, _
- GetSelectedCustomerDatabase())
- AddHandler BSC.StageChartDataCompleted, AddressOf MyStageChartDataCompleted
- End Sub
- Private Sub MyStageChartDataCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim BSC As New BudgetSvcClient
- BSC.GetSummariesForVisualizationsAsync(m_VisualizationBatchGuid, ToDate)
- AddHandler BSC.GetSummariesForVisualizationsCompleted, AddressOf MyGetSummariesForVisualizationsCompleted
- End Sub
- Private Sub MyGetSummariesForVisualizationsCompleted(ByVal sender As Object, ByVal e As GetSummariesForVisualizationsCompletedEventArgs)
- Dim summaries = e.Result
- Dim FromDate As DateTime = DateTime.ParseExact(Cb_FromDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- ToDate = ToDate 'till the end of the month
- Dim ts = (ToDate - FromDate).TotalDays
- 'want at least 4 months of data for guages
- If ts < 120 Then
- FromDate = ToDate.AddMonths(-3)
- End If
- Dim mtd = 0
- Dim prior1 = 0
- Dim prior2 = 0
- Dim prior3 = 0
- For Each B As Budget_SummaryForVisualizations In summaries
- If B.DateCreated.Value = ToDate Then
- mtd = mtd + B.Expense.Value
- End If
- If B.DateCreated.Value = ToDate.AddMonths(-1) Then
- prior1 = prior1 + B.Expense.Value
- End If
- If B.DateCreated.Value = ToDate.AddMonths(-2) Then
- prior2 = prior2 + B.Expense.Value
- End If
- If B.DateCreated.Value = ToDate.AddMonths(-3) Then
- prior3 = prior3 + B.Expense.Value
- End If
- Next
- needle_1.Value = mtd
- 'GaugeLabel1.Content = ToDate.ToShortDateString()
- needle_2.Value = prior1
- GaugeLabel2.Text = ToDate.AddMonths(-1).ToString("MMM yyyy") '+ " (" + prior1.ToString() + ")"
- needle_3.Value = prior2
- GaugeLabel3.Text = ToDate.AddMonths(-2).ToString("MMM yyyy") ' + " (" + prior2.ToString() + ")"
- needle_4.Value = prior3
- GaugeLabel4.Text = ToDate.AddMonths(-3).ToString("MMM yyyy") ' + " (" + prior3.ToString() + ")"
- End Sub
- Private Sub ShowBudgetName()
- If Not IsNothing(m_LoadedBudget) Then
- Txt_LoadedBudget.Text = "Budget """ & m_LoadedBudget.Name & """"
- Txt_LoadedBudget.Visibility = Windows.Visibility.Visible
- Else
- Txt_LoadedBudget.Text = ""
- Txt_LoadedBudget.Visibility = Windows.Visibility.Collapsed
- End If
- End Sub
- Private Sub LoadData(Optional ByVal BudgetID As Integer = 0)
- 'Me.LoadingPanel.Visibility = Windows.Visibility.Visible
- Btn_SaveChanges.IsEnabled = False
- Btn_Reset.IsEnabled = False
- m_LoadingBudget = (BudgetID <> 0)
- m_LoadedBudget = Nothing
- m_Summaries = Nothing
- Dim BSC As New BudgetSvcClient
- m_BatchGuid = Guid.NewGuid()
- 'm_BatchGuid = New Guid("2C20C29D-4177-4DD0-A535-32478E4D4597")
- Dim FromDate As DateTime = DateTime.ParseExact(Cb_FromDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- 'here is to clear the details todo'
- BSC.StageDataAsync(m_BatchGuid, GetSelectedCustomer().CustomerId, FromDate, ToDate.AddMonths(1), BudgetID, _
- GetSelectedCustomerDatabase())
- AddHandler BSC.StageDataCompleted, AddressOf MyStageDataCompleted
- End Sub
- Private Sub Btn_GetData_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- LoadData()
- End Sub
- Private Sub UpdateDataForNewQty(ByVal D As Detail_Staging)
- If m_LoadingBudget Then
- D.ToOrderQty = D.TotalQty - D.ToDateQty
- Else
- D.TotalQty = D.ToDateQty + D.ToOrderQty
- End If
- D.ToOrderAmt = D.ToOrderQty * D.Price
- D.TotalAmt = D.ToDateAmt + D.ToOrderAmt
- Dim NewCatTotal As Double = 0
- For Each D2 As Detail_Staging In m_Details
- If D2.Category = D.Category Then
- NewCatTotal += D2.ToOrderAmt
- End If
- Next
- For Each S As Summary_Staging In m_Summaries
- If S.Category = D.Category Then
- S.Available = S.Budget - S.Expense - NewCatTotal
- Exit For
- End If
- Next
- End Sub
- Private Sub RadGridView1_RowEditEnded(ByVal sender As System.Object, ByVal e As GridViewRowEditEndedEventArgs)
- Dim ND As Detail_Staging = e.NewData
- ND.ToOrderAmt = ND.ToOrderQty * ND.Price
- ND.TotalQty = ND.ToDateQty + ND.ToOrderQty
- ND.TotalAmt = ND.ToDateAmt + ND.ToOrderAmt
- Dim NewTotal As Double = 0
- For Each D As Detail_Staging In m_Details
- If D.Category = ND.Category Then
- NewTotal += D.ToOrderAmt
- End If
- Next
- For Each S As Summary_Staging In m_Summaries
- If S.Category = ND.Category Then
- S.Available = S.Budget - S.Expense - NewTotal
- Exit For
- End If
- Next
- Btn_SaveChanges.IsEnabled = True
- Btn_Reset.IsEnabled = True
- If Not Txt_LoadedBudget.Text.EndsWith("*") Then
- Txt_LoadedBudget.Text &= "*"
- End If
- UpdateSuggestedReallocation()
- Grd_Data.CalculateAggregates()
- End Sub
- Private m_UserId As Integer = 1
- Private m_Username As String = "Jeff"
- Private Sub UserControl_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- m_Initialized = True
- Me.ExternalPresenter.DetailsProvider = Me.Grd_Data.RowDetailsProvider
- 'chart.SeriesMappings.Add(
- ' AddSeriesMapping(New Bar3DSeriesDefinition(), "Budget", "Budget"))
- 'chart.SeriesMappings.Add(
- ' AddSeriesMapping(New Bar3DSeriesDefinition(), "MTD", "Expense"))
- 'chart.SeriesMappings.Add(
- ' AddSeriesMapping(New Bar3DSeriesDefinition(), "Montly Average", "SuggestedReallocationOneMonth"))
- Dim BSC As New BudgetSvcRef.BudgetSvcClient
- AddHandler BSC.GetCustomersForUserCompleted, AddressOf MyGetCustomersForUserCompleted
- BSC.GetCustomersForUserAsync(m_UserId)
- End Sub
- Private Sub MyGetCustomersForUserCompleted(ByVal sender As Object, ByVal e As GetCustomersForUserCompletedEventArgs)
- Cb_Customer.ItemsSource = e.Result
- Cb_Customer.DisplayMemberPath = "DecoratedCustomerName"
- If Cb_Customer.Items.Count > 0 Then
- Cb_Customer.SelectedIndex = 0
- End If
- ' Helen doesn't have access to this customer! :)
- 'Cb_Customer.SelectedItem = e.Result.Where(Function(x) x.DecoratedCustomerName = "Northern Manor Multicare Center (Medical)")(0)
- Btn_GetData_Click(Nothing, Nothing)
- End Sub
- Private Sub Btn_SaveChanges_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- Dim D As New BudgetSaveDlg(m_Username, GetSelectedCustomer().DecoratedCustomerName, m_LoadedBudget, _
- GetSelectedCustomerDatabase())
- AddHandler D.OnBudgetNameDlgOK, AddressOf OnBudgetNameDlgOK
- D.Show()
- End Sub
- Private Sub OnBudgetNameDlgOK(ByVal Name As String, ByVal ExistingBudget As Saved_Budget)
- Dim BSC As New BudgetSvcRef.BudgetSvcClient
- If Not IsNothing(ExistingBudget) Then
- BSC.ReplaceBudgetAsync(ExistingBudget, m_Details, m_Username, GetSelectedCustomerDatabase())
- m_LoadedBudget = ExistingBudget
- ShowBudgetName()
- Else
- BSC.SaveBudgetAsync(Name, m_Username, GetSelectedCustomer().DecoratedCustomerName, Cb_FromDate.SelectedItem, _
- Cb_ToDate.SelectedItem, m_Details, GetSelectedCustomerDatabase())
- Txt_LoadedBudget.Text = "Budget """ & Name & """"
- End If
- End Sub
- Private Sub UpdateUI()
- Grd_Data.ItemsSource = Nothing
- Btn_SaveChanges.IsEnabled = False
- Btn_Reset.IsEnabled = False
- m_LoadedBudget = Nothing
- Txt_LoadedBudget.Text = ""
- Txt_LoadedBudget.Visibility = Windows.Visibility.Collapsed
- WarnAboutZeroPricedItems()
- End Sub
- Private Sub WarnAboutZeroPricedItems()
- If Not IsNothing(m_Details) Then
- Txt_CallRep.Visibility = If(m_Details.Any(Function(x) x.Price <= 0), Windows.Visibility.Visible, Windows.Visibility.Collapsed)
- End If
- End Sub
- Private Sub Cb_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs)
- If Not m_Initializing Then
- If sender Is Cb_FromDate Then
- Dim FromDate As DateTime = DateTime.ParseExact(Cb_FromDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- If FromDate > ToDate Then
- Cb_ToDate.SelectedItem = Cb_FromDate.SelectedItem
- End If
- ElseIf sender Is Cb_ToDate Then
- Dim FromDate As DateTime = DateTime.ParseExact(Cb_FromDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- Dim ToDate As DateTime = DateTime.ParseExact(Cb_ToDate.SelectedItem, "MMMM yyyy", System.Globalization.CultureInfo.InvariantCulture)
- If FromDate > ToDate Then
- Cb_FromDate.SelectedItem = Cb_ToDate.SelectedItem
- End If
- End If
- End If
- End Sub
- Private Sub Btn_LoadBudget_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- Dim D As New BudgetLoadDlg(m_Username, GetSelectedCustomer().DecoratedCustomerName, GetSelectedCustomerDatabase())
- AddHandler D.OnBudgetLoadDlgOK, AddressOf OnBudgetLoadDlgOK
- D.Show()
- End Sub
- Private m_LoadedBudget As Saved_Budget
- Private Sub OnBudgetLoadDlgOK(ByVal b As Saved_Budget)
- If Not IsNothing(b) Then
- Cb_FromDate.SelectedItem = b.FromMonth
- Cb_ToDate.SelectedItem = b.ToMonth
- LoadData(b.ID)
- m_LoadedBudget = b
- End If
- End Sub
- Private Sub RadGridView1_CellValidating(ByVal sender As System.Object, ByVal e As Telerik.Windows.Controls.GridViewCellValidatingEventArgs)
- If Convert.ToDouble(e.NewValue) < 0.0 Then
- e.IsValid = False
- e.ErrorMessage = "New quantity must be greater than or equal to zero."
- End If
- End Sub
- Private Sub RadSlider_ValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double))
- Try
- Dim rs As RadSlider = DirectCast(sender, RadSlider)
- If rs.Parent Is Nothing Then
- Return
- End If
- Dim tb As TextBlock = VisualTreeHelper.GetChild(rs.Parent, 3)
- tb.Text = " [" & CDbl(e.NewValue).ToString("0") & "%]"
- Dim HadChange As Boolean = False
- For Each D2 As Detail_Staging In m_Details
- If D2.Category = rs.Tag Then
- Dim NewQty As Integer = Math.Round(D2.AvgMonthQty * (rs.Value / 100.0), 0)
- If D2.ToOrderQty <> NewQty Then
- D2.ToOrderQty = NewQty
- UpdateDataForNewQty(D2)
- HadChange = True
- End If
- End If
- Next
- If HadChange Then
- UpdateSuggestedReallocation()
- Grd_Data.CalculateAggregates()
- Dim gvr As GridView.GridViewRow = rs.ParentOfType(Of GridView.GridViewRow)()
- Dim gv As RadGridView = gvr.ChildrenOfType(Of RadGridView).FirstOrDefault()
- gv.CalculateAggregates()
- End If
- Catch ex As Exception
- End Try
- End Sub
- Private Sub Btn_Reset_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- If Not IsNothing(m_LoadedBudget) Then
- LoadData(m_LoadedBudget.ID)
- Else
- LoadData()
- End If
- End Sub
- Private Sub Btn_Export_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- Dim Sfd As New SaveFileDialog
- Sfd.DefaultExt = ".csv"
- Sfd.Filter = "CSV (Comma delimited) (*.csv)|*.csv|Text (Tab delimited) (*.txt)|*.txt"
- Sfd.FilterIndex = 1
- Dim result As Boolean? = Sfd.ShowDialog().Value
- If result.HasValue AndAlso result.Value Then
- Try
- Using Out As New IO.StreamWriter(Sfd.OpenFile())
- Dim FFH As New FlatFileHelper(If(Sfd.FilterIndex = 1, FlatFileHelper.FlatFileFormat.Csv, _
- FlatFileHelper.FlatFileFormat.Tsv))
- Dim Headers As String() = New String() {"CustomerID", "ItemNumber", "Quantity", _
- "CustomerName", "OrderDate", "DeliveryDate", _
- "OrderID", "VendorID", "Buyer", "UnitPrice", _
- "ShipTo", "UnitOfMeasure", "SpecialInstructions"}
- Out.WriteLine(FFH.GetLineForFields(Headers))
- Dim HS As ObservableCollection(Of SummaryObj) = Grd_Data.ItemsSource
- For Each H As SummaryObj In HS
- For Each D As Detail_Staging In H.Details
- If D.ToOrderQty > 0 Then
- Dim Fields As String() = New String() {GetSelectedCustomer().CustomerId, _
- D.ItemId, _
- D.ToOrderQty, _
- GetSelectedCustomer().CustomerName, _
- DateTime.Now.ToString("yyyy-MM-dd"), _
- "", _
- "", _
- "", _
- "", _
- D.Price.ToString("0.0000"), _
- "", _
- "", _
- ""}
- Out.WriteLine(FFH.GetLineForFields(Fields))
- End If
- Next
- Next
- Out.Close()
- End Using
- Catch ex As UnauthorizedAccessException
- MessageBox.Show("Unable to save the data - access to the file """ & Sfd.SafeFileName & """ denied.", "Unable to Export Data", MessageBoxButton.OK)
- Catch ex As Exception
- MessageBox.Show("An error occurred while saving the data." & vbCrLf & vbCrLf & ex.Message, "Unable to Export Data", MessageBoxButton.OK)
- End Try
- End If
- End Sub
- Private Sub Btn_AddNewItem_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- Dim ItemSel As New ItemSelector(GetSelectedCustomer().CustomerName.Trim(), m_Details, _
- GetSelectedCustomerDatabase())
- AddHandler ItemSel.ItemSelector_AddItem, AddressOf ItemSelector_AddItem
- ItemSel.Show()
- End Sub
- Private Sub ItemSelector_AddItem(ByVal I As Item)
- Dim BSC As New BudgetSvcClient
- AddHandler BSC.GetItemPriceCompleted, AddressOf MyGetItemPriceCompleted
- BSC.GetItemPriceAsync(I.ItemId, GetSelectedCustomer().CustomerId, _
- GetSelectedCustomerDatabase(), I)
- End Sub
- Private Sub MyGetItemPriceCompleted(ByVal sender As Object, ByVal e As GetItemPriceCompletedEventArgs)
- Try
- Dim I As Item = e.UserState
- If m_Details.Where(Function(x) x.ItemId = I.ItemId).Count > 0 Then
- MessageBox.Show("This item is already present - and has not been readded to the grid.", "Already Present", MessageBoxButton.OK)
- Return
- End If
- Dim HS As ObservableCollection(Of SummaryObj) = Grd_Data.ItemsSource
- For Each H As SummaryObj In HS
- If H.Summary.Category.Trim() = I.Category.Trim() Then
- Grd_Data.ItemsSource = HS
- Dim DS As New Detail_Staging
- DS.Guid = m_Details(0).Guid
- DS.Category = I.Category
- DS.ItemDescription = I.ItemName
- DS.ItemId = I.ItemId
- DS.Price = e.Result
- DS.AddedByUser = True
- AddHandler DS.PropertyChanged, AddressOf PropertyChanged
- H.Details.Add(DS)
- m_Details.Add(DS)
- End If
- Next
- WarnAboutZeroPricedItems()
- MessageBox.Show(String.Format("Item ""{0}"" has been added to category ""{1}"".", I.ItemName, I.Category), _
- "Item Added", MessageBoxButton.OK)
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub RemoveItemButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- Try
- Dim btn As Button = sender
- Dim itemNumber As String = btn.Tag
- Dim HS As ObservableCollection(Of SummaryObj) = Grd_Data.ItemsSource
- For Each H As SummaryObj In HS
- Dim items As IEnumerable(Of Detail_Staging) = H.Details.Where(Function(x) x.ItemId = itemNumber.Trim())
- If items.Count = 1 Then
- H.Details.Remove(items(0))
- End If
- Next
- Dim items2 As IEnumerable(Of Detail_Staging) = m_Details.Where(Function(x) x.ItemId = itemNumber.Trim())
- If items2.Count = 1 Then
- m_Details.Remove(items2(0))
- End If
- WarnAboutZeroPricedItems()
- Catch ex As Exception
- MessageBox.Show("Unable to remove item." & vbCrLf & vbCrLf & ex.Message, "Unable to Remove Item", MessageBoxButton.OK)
- End Try
- End Sub
- Private Class CategoryInfo
- Public m_Category As String
- Public m_Budget As Decimal
- Public m_TotalAmt As Decimal
- Public ReadOnly Property Surplus() As Decimal
- Get
- Return m_Budget - m_TotalAmt
- End Get
- End Property
- End Class
- Private Sub UpdateSuggestedReallocation()
- Try
- Dim cis As New List(Of CategoryInfo)
- For Each cat As String In (From D In m_Details Select D.Category Distinct)
- Dim loopCat As String = cat
- Dim ci As New CategoryInfo With {.m_Category = cat}
- cis.Add(ci)
- ci.m_TotalAmt = m_Details.Where(Function(x) x.Category.Equals(loopCat, StringComparison.InvariantCultureIgnoreCase)).Sum(Function(d) d.TotalAmt)
- ci.m_Budget = m_Summaries.Where(Function(x) x.Category.Equals(loopCat, StringComparison.InvariantCultureIgnoreCase)).First.NextMonthBudget
- Next
- ' Determine surplus - the amount that's able to be stolen from other budgets given the current spend.
- Dim surplus As Decimal = cis.Where(Function(x) x.Surplus > 0.0).Sum(Function(x) x.Surplus)
- ' Determine shortfall - the amount that we need to make up on budgets to meet the current spend.
- Dim shortfall As Decimal = -(cis.Where(Function(x) x.Surplus < 0.0).Sum(Function(x) x.Surplus))
- ' The amount to reallocate - we cannot reallocate any more than the surplus, and need not allocate any more
- ' than the shortfall, hence the Min.
- Dim toRealloc As Decimal = Math.Min(surplus, shortfall)
- Dim tol As Double = txtTolerance.Text
- Dim cats As New List(Of MyCat)()
- For Each summ As Summary_Staging In m_Summaries
- Dim cat As New MyCat()
- cat.Budget = Round(summ.Budget.Value, 0)
- cat.Usage = Round(summ.Expense.Value, 0)
- cat.Category = summ.Category
- cat.UsageTot = Round(summ.Expense.Value * (1 + tol / 100), 0)
- If cat.UsageTot < summ.Budget Then
- cat.AvaToAlloc = summ.Budget - cat.UsageTot
- Else
- cat.AvaToAlloc = 0
- End If
- cats.Add(cat)
- 'loopSummary.SuggestedReallocation = 'months * cis.Where(Function(x) x.m_Category.Equals(loopSummary.Category, StringComparison.InvariantCultureIgnoreCase)).First.m_Budget
- Next
- Dim totalAvaAlloc As Double = 0
- Dim totalUsage As Double = 0
- For Each cat As MyCat In cats
- totalAvaAlloc = totalAvaAlloc + cat.AvaToAlloc
- If cat.UsageTot > cat.Budget Then
- totalUsage = totalUsage + cat.Usage
- End If
- Next
- For Each cat As MyCat In cats
- If cat.UsageTot > cat.Budget Then
- cat.NewAlloc = Round(totalAvaAlloc * cat.Usage / totalUsage, 0)
- cat.NewBudget = cat.Budget + cat.NewAlloc
- Else
- cat.NewBudget = cat.Budget - cat.AvaToAlloc
- End If
- Next
- 'MessageBox.Show(surplus & " " & shortfall & " " & toRealloc)
- Dim stDate As Date = Cb_FromDate.SelectedItem
- Dim endDate As Date = Cb_ToDate.SelectedItem
- Dim months As Integer = DateDiff(DateInterval.Month, stDate, endDate) + 1
- If toRealloc = 0.0 Then
- ' No amount available to reallocate, or no reallocation required.
- For Each summ As Summary_Staging In m_Summaries
- Dim loopSummary As Summary_Staging = summ
- For Each cat As MyCat In cats
- If cat.Category = loopSummary.Category Then
- loopSummary.SuggestedReallocation = cat.NewBudget 'months * cis.Where(Function(x) x.m_Category.Equals(loopSummary.Category, StringComparison.InvariantCultureIgnoreCase)).First.m_Budget
- loopSummary.SuggestedReallocationOneMonth = cat.NewBudget / months
- Exit For
- End If
- Next
- Next
- Return
- End If
- ' For categories over-budget, allocate a percentage based on the size of their shortfall.
- For Each ci In cis.Where(Function(x) x.Surplus < 0.0)
- ci.m_Budget += toRealloc * (-ci.Surplus / shortfall)
- Next
- ' For categories under-budget, steal a percentage based on the size of their surplus to compensate for
- ' the budget increases on other categories.
- For Each ci In cis.Where(Function(x) x.Surplus > 0.0)
- ci.m_Budget -= toRealloc * (ci.Surplus / surplus)
- Next
- ' We cannot allow a category to have a budget < current month spend - or can we?
- For Each ci In cis.Where(Function(x) x.Surplus < 0.0)
- ci.m_Budget = Math.Max(ci.m_Budget, ci.m_TotalAmt)
- Next
- ' Push the reallocations onto the summary items.
- For Each summ As Summary_Staging In m_Summaries
- Dim loopSummary As Summary_Staging = summ
- For Each cat As MyCat In cats
- If cat.Category = loopSummary.Category Then
- loopSummary.SuggestedReallocation = cat.NewBudget 'months * cis.Where(Function(x) x.m_Category.Equals(loopSummary.Category, StringComparison.InvariantCultureIgnoreCase)).First.m_Budget
- loopSummary.SuggestedReallocationOneMonth = cat.NewBudget / months
- Exit For
- End If
- Next
- 'loopSummary.SuggestedReallocation = months * cis.Where(Function(x) x.m_Category.Equals(loopSummary.Category, StringComparison.InvariantCultureIgnoreCase)).First.m_Budget
- 'loopSummary.SuggestedReallocationOneMonth = cis.Where(Function(x) x.m_Category.Equals(loopSummary.Category, StringComparison.InvariantCultureIgnoreCase)).First.m_Budget
- Next
- Catch ex As Exception
- MessageBox.Show(ex.StackTrace)
- End Try
- End Sub
- Private Sub btnSuggest_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- If Grd_Data.Columns(4).Width <> 1 Then
- btnSuggest.Content = "Show Suggest Budget with Tolerance %"
- Grd_Data.Columns(4).Width = 1
- Grd_Data.Columns(5).Width = 1
- LoadTolerance(True)
- Else
- btnSuggest.Content = "Hide Suggest Budget with Tolerance %"
- Grd_Data.Columns(4).Width = 90
- Grd_Data.Columns(5).Width = 90
- LoadTolerance(False)
- End If
- End Sub
- Sub LoadTolerance(ByVal isOrg As Boolean)
- Dim rows = Grd_Data.ChildrenOfType(Of GridViewRow)()
- 'If rows.Count - 1 = Grd_Data.Items.Count Then
- For i As Integer = 1 To rows.Count - 1
- ' If isOrg Then
- 'If i Mod 2 = 0 Then
- 'rows(i).Background = Nothing
- 'Else
- 'Dim br As New System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 245, 245, 245))
- 'rows(i).Background = br
- 'End If
- ' Else
- Dim summary As Summary_Staging = DirectCast(DirectCast(DirectCast(Grd_Data.Items(i - 1), System.Object), Budget_SL.SummaryObj), Budget_SL.SummaryObj).Summary
- Dim per As Double = ((summary.Budget - summary.Expense) / summary.Budget) * 100
- Dim tol As Double = txtTolerance.Text
- If summary.Expense <= summary.Budget And per < tol Then
- 'If summary.Budget
- Dim br As New System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 246, 143)) ' Yellow
- rows(i).Background = br
- ElseIf summary.Expense <= summary.Budget Then
- Dim br As New System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 193, 255, 193)) 'Green
- rows(i).Background = br
- ElseIf summary.Expense > summary.Budget And per * -1 < tol Then
- Dim br As New System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 228, 196)) ' Orange
- rows(i).Background = br
- ElseIf summary.Expense > summary.Budget Then
- Dim br As New System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 240, 128, 128)) ' Red
- rows(i).Background = br
- Else
- rows(i).Background = Nothing
- End If
- ' End If
- Next
- 'End If
- End Sub
- Private Sub Grd_Data_RowLoaded(ByVal sender As System.Object, ByVal e As Telerik.Windows.Controls.GridView.RowLoadedEventArgs)
- Try
- If Grd_Data.Columns(4).IsVisible Then
- LoadTolerance(False)
- Else
- LoadTolerance(True)
- End If
- If TypeOf (e.Row) Is GridView.GridViewHeaderRow Then
- Dim row As GridView.GridViewHeaderRow = e.Row
- For Each cell As GridView.GridViewHeaderCell In row.Cells
- Dim texts() As String = {"Category", "Usage to Date", "Total Budget for period", "Available = Total Budget for period - Usage to date", "Suggested Budget for period", "Suggested Budget (1 Month)", _
- "Slider 'To Order' on Details", "Monthly Average", "Usage to Date", "To Order", "Grand Total"}
- If cell.Column.DisplayIndex < texts.Length Then
- cell.SetValue(ToolTipService.ToolTipProperty, texts(cell.Column.DisplayIndex))
- End If
- Next
- End If
- If TypeOf (e.Row) Is GridView.GridViewFooterRow Then
- Dim row As GridView.GridViewFooterRow = e.Row
- For Each cell As GridView.GridViewFooterCell In row.Cells
- Dim test = cell.GetValue(ToolTipService.ToolTipProperty)
- 'Dim utd As GridView.GridViewFooterCell = row.Cells(1) 'Usage to date
- 'Dim budget As GridView.GridViewFooterCell = row.Cells(2) 'Budget
- 'Dim available As GridView.GridViewFooterCell = row.Cells(3) 'Available
- 'Dim test1 = utd.GetValue(ToolTipService.ToolTipProperty)
- '' int id = (int)e.Row.DataContext.GetType().GetProperty("ID").GetValue(e.Row.DataContext, null);
- 'Dim test = row.DataContext.GetType().GetProperty("Expense").GetValue(ToolTipService.ToolTipProperty, Nothing)
- ''Me.needle_1.Value = utd.GetValue
- Next
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- Private Sub RadGridView1_RowLoaded(ByVal sender As System.Object, ByVal e As Telerik.Windows.Controls.GridView.RowLoadedEventArgs)
- If TypeOf (e.Row) Is GridView.GridViewHeaderRow Then
- Dim row As GridView.GridViewHeaderRow = e.Row
- For Each cell As GridView.GridViewHeaderCell In row.Cells
- cell.SetValue(ToolTipService.ToolTipProperty, e.GridViewDataControl.Columns(cell.Column.DisplayIndex).Header)
- Next
- End If
- End Sub
- Private Sub btnchart_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
- If chart.Visibility = Windows.Visibility.Collapsed Then
- chart.Visibility = Windows.Visibility.Visible
- btnchart.Content = "Hide chart"
- Else
- chart.Visibility = Windows.Visibility.Collapsed
- btnchart.Content = "Show chart"
- End If
- End Sub
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement