动态DataTable-Vb.Net

Partial Public Class SupplierSalesStatsControl
    Inherits System.Web.UI.UserControl

    Private m_Item As Order
    Private m_ItemUser As User
    Private m_season As Season
    Private m_ItemCustomer As Customer
    Private m_ItemDelivery As Delivery
    Private m_isHeadOfficeUser As Boolean = False
    Private m_userOfficeID As Integer
    Private m_UserID As Integer
    Private m_UserCategory As User.UserCategories
    Private m_SeasonSummary As SeasonSummary
    Private m_TotalPieces As Integer = 0I
    Private m_hashTableLotsMargin As Hashtable
    Private m_hashSupplierCustomer As Hashtable
    Private m_hashCustomerOrder As Hashtable
    Private m_arrAllDataGrids As New ArrayList
    Private m_penaltySupplier As Decimal = 0D
    Private m_claimSupplier As Decimal = 0D

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.m_UserID = CType(Context.User.Identity.Name, Integer)
        Me.m_isHeadOfficeUser = Garzone.User.isHeadOfficeUser(Me.m_UserID)
        Me.m_userOfficeID = Garzone.User.getOfficeID(Me.m_UserID)


        If Me.m_ItemUser Is Nothing Then
            Me.m_ItemUser = New User(True)
        End If

        If Me.dropSeason.Items.Count = 0 Then
            Me.m_season = New Season
            Me.dropSeason.DataSource = Me.m_season.DataSetSeason.Seasons
            Me.dropSeason.DataTextField = "Name"
            Me.dropSeason.DataValueField = "SeasonID"
            Me.dropSeason.DataBind()
            Season.selectCurrentSeason(Me.dropSeason, Me.m_season.DataSetSeason.Seasons)
            BindData()
        End If
    End Sub


    Private Sub BindData()
        If Not Me.dropSeason.SelectedItem Is Nothing Then
            Try
                Dim _vwOrderRow As OrderDataSet.vw_OrderViewRow
                Dim _oneLotRow As OrderDataSet.OrderLotRow
                Dim _marginCalculator As Garzone.SaleCalculation
                Dim _hashSuppliers As New Hashtable
                Me.m_hashSupplierCustomer = New Hashtable
                Me.m_hashCustomerOrder = New Hashtable
                Dim _tableSuppliers As DataTable
                Dim _hastable As Hashtable

                Dim _BuyingPrice As Decimal = 0D
                Dim _SellingPrice As Decimal = 0D
                Dim _ExchangeRatePurchase As Decimal = 1
                Dim _ExchangeRateSelling As Decimal = 1

                Me.m_Item = New Order
                Me.m_Item.fillBySeasonID(CType(Me.dropSeason.SelectedItem.Value, Integer))

                Me.m_ItemCustomer = New Customer(True)
                Me.m_ItemCustomer.FillAll()


                Me.m_ItemDelivery = New Delivery
                Me.m_ItemDelivery.fillBySeasonID(CType(Me.dropSeason.SelectedItem.Value, Integer))

                'initalize the season summary for all season
                m_SeasonSummary = New SeasonSummary
                m_SeasonSummary.m_Item = Me.m_Item
                m_SeasonSummary.m_ItemDelivery = Me.m_ItemDelivery
                m_SeasonSummary.m_OfficeID = Me.m_userOfficeID
                Me.m_SeasonSummary.isHeaderOfficeUser = Me.m_isHeadOfficeUser
                m_SeasonSummary.CreateSummary()


                Me.m_hashTableLotsMargin = New Hashtable
                For Each _vwOrderRow In Me.m_Item.DatasetOrder.vw_OrderView
                    Select Case CType(_vwOrderRow.InternalValidationStatusID, Order.InternalValidationStatus)
                        Case Order.InternalValidationStatus.Authorized, Order.InternalValidationStatus.Completed, Order.InternalValidationStatus.Inproduction, Order.InternalValidationStatus.ProductionDocumentsReceived
                            If _hashSuppliers.ContainsKey(_vwOrderRow.SupplierID) = False Then
                                _hashSuppliers.Add(_vwOrderRow.SupplierID, New ArrayList)
                            End If
                            If Me.m_hashCustomerOrder.ContainsKey(_vwOrderRow.CustomerID) = False Then
                                Me.m_hashCustomerOrder.Add(_vwOrderRow.CustomerID, New ArrayList)
                            End If
                            If Me.m_hashSupplierCustomer.ContainsKey(_vwOrderRow.SupplierID) = False Then
                                Me.m_hashSupplierCustomer.Add(_vwOrderRow.SupplierID, New ArrayList)
                            End If

                            For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_vwOrderRow.OrderID).GetOrderLotRows

                                _marginCalculator = New Garzone.SaleCalculation

                                If _oneLotRow.IsFinanceTotalDaysNull = False Then
                                    'Apply finance information to the calculator
                                    _marginCalculator.InterestPeriod = _oneLotRow.FinanceTotalDays
                                    _marginCalculator.InterestRate = _oneLotRow.FinanceInterestRate
                                End If

                                If Not _oneLotRow.IsBuyingPriceNull Then
                                    If Not _oneLotRow.IsExchangeRatePurchaseNull Then
                                        _ExchangeRatePurchase = _oneLotRow.ExchangeRatePurchase
                                    End If
                                    _BuyingPrice = _oneLotRow.BuyingPrice * _ExchangeRatePurchase
                                End If
                                If Not _oneLotRow.IsSellingPriceNull Then
                                    If Not _oneLotRow.IsExchangeRateSellingNull Then
                                        _ExchangeRateSelling = _oneLotRow.ExchangeRateSelling
                                    End If
                                    _SellingPrice = _oneLotRow.SellingPrice * _ExchangeRateSelling
                                End If

                                'Check DataValid
                                _hastable = New Hashtable()
                                _hastable = _marginCalculator.CheckIsNullValid(_vwOrderRow)
                                _marginCalculator.CalculateMargin(CType(_hastable("Sale_BC"), Decimal), CType(_hastable("Sale_SC"), Decimal), CType(_hastable("Sale_SCB"), Decimal), CType(_hastable("Sale_WMC"), Decimal), CType(_hastable("Sale_SVAT"), Decimal), CType(_hastable("Sale_IP"), Decimal), CType(_hastable("Sale_LCB"), Decimal), CType(_hastable("Sale_ICB"), Decimal), CType(_hastable("Sale_OC"), Decimal), CType(_hastable("Purchase_FC"), Decimal), CType(_hastable("Purchase_LCM"), Decimal), CType(_hastable("Purchase_AC"), Decimal), CType(_hastable("Purchase_ICM"), Decimal), CType(_hastable("Purchase_BVAT"), Decimal), CType(_hastable("Purchase_ICP"), Decimal), CType(_hastable("Purchase_ICA"), Decimal), CType(_hastable("Purchase_OCP"), Decimal), CType(_hastable("Purchase_OCA"), Decimal), _BuyingPrice, _SellingPrice, _vwOrderRow.OrderSalesCategory)

                                
                                Me.m_hashTableLotsMargin.Add(_oneLotRow.OrderLotID, _marginCalculator)
                            Next

                            'Add the lot information to the hash table
                            CType(_hashSuppliers.Item(_vwOrderRow.SupplierID), ArrayList).Add(_vwOrderRow.OrderID)
                            CType(Me.m_hashCustomerOrder.Item(_vwOrderRow.CustomerID), ArrayList).Add(_vwOrderRow.OrderID)
                            If CType(Me.m_hashSupplierCustomer.Item(_vwOrderRow.SupplierID), ArrayList).Contains(_vwOrderRow.CustomerID) = False Then
                                CType(Me.m_hashSupplierCustomer.Item(_vwOrderRow.SupplierID), ArrayList).Add(_vwOrderRow.CustomerID)
                            End If

                    End Select


                    'End If
                Next
                'Bind Suppier
                _tableSuppliers = Me.TransmitHashSupplierTable(_hashSuppliers)

                Dim _row As DataRow = _tableSuppliers.NewRow

                _row.Item("SupplierID") = -1
                _row.Item("SupplierName") = "Summary"
                _row.Item("TotalPieces") = Me.m_TotalPieces
                _row.Item("Orders") = Me.m_SeasonSummary.TotalOrders
                _row.Item("PurchaseAmount") = -Me.m_SeasonSummary.TotalSalesBuy
                _row.Item("PurchasePercentage") = 1
                _row.Item("Claims") = -Me.m_claimSupplier
                _row.Item("Penalty") = Me.m_penaltySupplier
                _row.Item("InspectionFail") = Me.m_SeasonSummary.TotalInspectionFailed.ToString & "/" & Me.m_SeasonSummary.TotalInspection.ToString
                If Me.m_SeasonSummary.TotalInspection <> 0 Then
                    _row.Item("FailedP") = Me.m_SeasonSummary.TotalInspectionFailed / Me.m_SeasonSummary.TotalInspection
                Else
                    _row.Item("FailedP") = 0
                End If
                _row.Item("Delivery") = Me.m_SeasonSummary.AverageDelivery
                _row.Item("LowMargin") = Me.m_SeasonSummary.LowMargin
                _row.Item("AvgMargin") = Me.m_SeasonSummary.AvgMargin
                _row.Item("HighMargin") = Me.m_SeasonSummary.HighMargin
                _row.Item("SubTotal") = Me.m_SeasonSummary.SubTotal - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty
                _row.Item("SubTotalOrdered") = Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty

                If Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty = 0 Then
                    _row.Item("SubTotalCompare") = 0
                Else
                    _row.Item("SubTotalCompare") = (Me.m_SeasonSummary.SubTotal - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty) / (Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty)
                End If
                'If no order detect don't add this summary
                If m_SeasonSummary.TotalOrders <> 0 Then
                    _tableSuppliers.Rows.Add(_row)
                End If
                _tableSuppliers.DefaultView.Sort = "PurchaseAmount DESC"
                Me.gvSupplier.DataSource = _tableSuppliers.DefaultView
                Me.gvSupplier.DataBind()
                Me.gvSupplier.Visible = Me.gvSupplier.Rows.Count > 0
            Catch ex As Exception
                Garzone.ExceptionManager.HandleException(ex, "Error on supplier sales season stats for " & Garzone.User.getOfficeName(Me.dropSeason.SelectedItem.Value))
                Me.gvSupplier.Visible = False
            End Try

        End If
    End Sub

    Private Function GenerateCustomerSalesBySupplierID(ByVal _supplierID As Integer) As DataTable
        Dim _dataTable As New DataTable
        Dim _row As DataRow
        Dim _customerID As Integer
        Dim _vwOrderRow As OrderDataSet.vw_OrderViewRow
        Dim _vwOrderRows As OrderDataSet.vw_OrderViewRow()
        Dim _customerRow As CustomerDataSet.CustomersRow
        Dim _oneLotRow As OrderDataSet.OrderLotRow
        Dim _oneOrderClaimRow As OrderDataSet.OrderClaimRow
        Dim _oneInternalInspection As OrderDataSet.OrdersInternalInspectionsRow

        Dim _vwDeliveryRow As DeliveryDataSet.vw_DeliveryShipmentViewRow
        Dim _oneOrderInspectionRow As OrderDataSet.OrdersInspectionsRow
        Dim _rowOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow
        Dim _rowsOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow()


        Dim _numOfOrders As New ArrayList
        Dim _total As Decimal = 0D
        Dim _subTotal As Decimal
        Dim _subTotalOrdered As Decimal = 0D
        Dim _totalPcs As Integer
        Dim _totalNet As Decimal = 0D
        Dim _totalBuy As Decimal = 0D
        Dim _totalClaims As Decimal = 0D
        Dim _claimSupplier As Decimal = 0D
        Dim _totalPenalty As Decimal = 0D
        Dim _penaltySupplier As Decimal = 0D
        Dim _totalInspection As Integer = 0I
        Dim _totalInspectionFailed As Integer = 0I
        Dim _InspectionFailedPercentage As Decimal
        Dim _totalDelivery As Integer = 0I
        Dim _averageDelivery As Decimal = 0D
        Dim _deliveryContainer As ArrayList
        Dim _lowMargin As Decimal = 0D
        Dim _currentMargin As Decimal = 0D
        Dim _avgMargin As Decimal = 0D
        Dim _highMargin As Decimal = 0D

        Dim _marginCalculator As Garzone.SaleCalculation

        _dataTable.Columns.Add(New DataColumn("CustomerName", GetType(String)))
        _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
        _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))

        For Each _customerID In Me.m_hashSupplierCustomer.Item(_supplierID)
            _total = 0
            _subTotal = 0D
            _subTotalOrdered = 0D
            _totalNet = 0
            _totalBuy = 0
            _totalClaims = 0
            _claimSupplier = 0D
            _totalPenalty = 0
            _penaltySupplier = 0D
            _totalPcs = 0
            _totalInspection = 0I
            _totalInspectionFailed = 0I
            _InspectionFailedPercentage = 0D
            _totalDelivery = 0I
            _averageDelivery = 0D
            _deliveryContainer = New ArrayList
            _lowMargin = 0D
            _currentMargin = 0D
            _avgMargin = 0D
            _highMargin = 0D
            _numOfOrders = New ArrayList

            Dim counter As Integer = 0
            Dim _arrMarginContainer As New ArrayList
            Dim _totalMargin As Decimal = 0D
            _customerRow = Me.m_ItemCustomer.DatasetCustomer.Customers.FindByCustomerID(_customerID)

            _vwOrderRows = Me.m_Item.DatasetOrder.vw_OrderView.Select("SupplierID=" & _supplierID.ToString & " and CustomerID=" & _customerID.ToString)
            For Each _vwOrderRow In _vwOrderRows
                '  If Me.m_isHeadOfficeUser = True Or Me.m_userOfficeID = _vwOrderRow.BranchOfficeID Then
                Select Case CType(_vwOrderRow.InternalValidationStatusID, Order.InternalValidationStatus)
                    Case Order.InternalValidationStatus.Authorized, Order.InternalValidationStatus.Completed, Order.InternalValidationStatus.Inproduction, Order.InternalValidationStatus.ProductionDocumentsReceived
                        For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_vwOrderRow.OrderID).GetOrderLotRows
                            If _numOfOrders.Contains(_oneLotRow.OrderID) = False Then
                                _numOfOrders.Add(_oneLotRow.OrderID)
                            End If

                            'Get the calculator already created
                            _marginCalculator = Me.m_hashTableLotsMargin.Item(_oneLotRow.OrderLotID)
                            _rowsOrderLotShipment = Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)

                            If _oneLotRow.IsBuyingPriceNull = False Then
                                For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                    _totalBuy += (_oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                Next
                            End If

                            If _oneLotRow.IsSellingPriceNull = False Then
                                _subTotalOrdered += (_marginCalculator.Margin * _oneLotRow.QuantityOrdered * _oneLotRow.ExchangeRateSelling * _oneLotRow.SellingPrice)

                                For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                    _total += (_rowOrderLotShipment.QuantityShipped * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling)
                                    _totalNet += (_marginCalculator.GrossSalePrice * _rowOrderLotShipment.QuantityShipped)
                                    _subTotal += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped * _marginCalculator.Margin)
                                Next

                            End If
                            For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                _totalPcs += _rowOrderLotShipment.QuantityShipped
                            Next

                            'Current margin
                            If _oneLotRow.SellingPrice <> 0 Then
                                _currentMargin = _marginCalculator.Margin
                            Else
                                _currentMargin = 0D
                            End If

                            _arrMarginContainer.Add(_currentMargin)

                            'Margin Low and high
                            If counter = 0 Then
                                _lowMargin = _currentMargin
                                _highMargin = _currentMargin
                            End If
                            _lowMargin = SeasonSummary.PopUpDecimal(_currentMargin, _lowMargin, False)
                            _highMargin = SeasonSummary.PopUpDecimal(_currentMargin, _highMargin, True)

                            'Claims calculation
                            For Each _oneOrderClaimRow In _oneLotRow.GetOrderClaimRows
                                _totalClaims += (_oneOrderClaimRow.ClaimTotalAmount - _oneOrderClaimRow.VenderAmount)
                                _claimSupplier += _oneOrderClaimRow.VenderAmount

                            Next

                            'Penalty calculation
                            For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                If _rowOrderLotShipment.IsMakerPenaltyValueNull = False Then
                                    _totalPenalty += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                    _penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                End If
                                If _rowOrderLotShipment.IsCustomerPenaltyValueNull = False Then
                                    _totalPenalty -= ((_rowOrderLotShipment.CustomerPenaltyValue / 100) * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                                End If
                            Next

                            'Inspection
                            'Internal Inspection calculation
                            For Each _oneInternalInspection In _oneLotRow.GetOrdersInternalInspectionsRows
                                If _oneInternalInspection.IsInspectionResultIDNull = False Then
                                    Select Case CType(_oneInternalInspection.InspectionResultID, Inspection.InspectionsResults)
                                        Case Inspection.InspectionsResults.Failed
                                            _totalInspectionFailed += 1
                                    End Select
                                End If
                            Next

                            _totalInspection += _oneLotRow.GetOrdersInternalInspectionsRows.Length

                            'Third party inspections calculation
                            For Each _oneOrderInspectionRow In _oneLotRow.GetOrdersInspectionsRows
                                If _oneOrderInspectionRow.IsResultIDNull = False Then
                                    Select Case CType(_oneOrderInspectionRow.ResultID, Inspection.InspectionsResults)
                                        Case Inspection.InspectionsResults.Failed
                                            _totalInspectionFailed += 1
                                    End Select
                                End If

                            Next
                            _totalInspection += _oneLotRow.GetOrdersInspectionsRows.Length

                            'Increase the counter
                            counter += 1
                        Next

                        'Calculate Delivery
                        For Each _vwDeliveryRow In Me.m_ItemDelivery.DatasetDelivery.vw_DeliveryShipmentView.Select("OrderID=" & _vwOrderRow.OrderID.ToString)
                            If Not _vwDeliveryRow.IsDeliveryNull Then
                                _deliveryContainer.Add(_vwDeliveryRow.Delivery)
                            End If

                        Next
                End Select
                'End If

            Next

            If _total <> 0 Then
                _avgMargin = (_totalNet - _totalBuy) / _total
            Else
                _avgMargin = 0D
            End If

            'Inspection failed
            If _totalInspection <> 0 Then
                _InspectionFailedPercentage = _totalInspectionFailed / _totalInspection
            Else
                _InspectionFailedPercentage = 0
            End If

            'Delivery
            For Each _oneDelivery As Integer In _deliveryContainer
                _totalDelivery += _oneDelivery
            Next
            If _deliveryContainer.Count = 0 Then
                _averageDelivery = 0D
            Else
                _averageDelivery = _totalDelivery / _deliveryContainer.Count
            End If

            'Create one row for current customer
            _row = _dataTable.NewRow

            _row.Item("CustomerName") = _customerRow.Name
            _row.Item("Orders") = _numOfOrders.Count
            _row.Item("TotalPieces") = _totalPcs
            _row.Item("PurchaseAmount") = -_totalBuy
            If Me.m_SeasonSummary.TotalSalesBuy <> 0 Then
                _row.Item("PurchasePercentage") = (_totalBuy / Me.m_SeasonSummary.TotalSalesBuy)
            Else
                _row.Item("PurchasePercentage") = 0
            End If

            _row.Item("Claims") = -_claimSupplier
            _row.Item("Penalty") = _penaltySupplier
            _row.Item("InspectionFail") = _totalInspectionFailed.ToString & "/" & _totalInspection.ToString
            _row.Item("FailedP") = _InspectionFailedPercentage
            _row.Item("Delivery") = _averageDelivery
            _row.Item("LowMargin") = _lowMargin
            _row.Item("AvgMargin") = _avgMargin
            _row.Item("HighMargin") = _highMargin
            _row.Item("SubTotal") = _subTotal - _totalClaims + _totalPenalty
            _row.Item("SubTotalOrdered") = _subTotalOrdered - _totalClaims + _totalPenalty
            If _subTotalOrdered - _totalClaims + _totalPenalty = 0 Then
                _row.Item("SubTotalCompare") = 0
            Else
                _row.Item("SubTotalCompare") = (_subTotal - _totalClaims + _totalPenalty) / (_subTotalOrdered - _totalClaims + _totalPenalty)
            End If

            If _numOfOrders.Count > 0 Then
                _dataTable.Rows.Add(_row)
            End If
        Next

        Return _dataTable

    End Function

    Private Function TransmitHashSupplierTable(ByVal _hashTable As Hashtable) As DataTable
        Dim _dataTable As New DataTable

        Dim _item As DictionaryEntry
        Dim _row As DataRow
        Dim _supplierRow As OrderDataSet.SuppliersRow
        Dim _oneLotRow As OrderDataSet.OrderLotRow
        Dim _oneOrderClaimRow As OrderDataSet.OrderClaimRow
        Dim _oneInternalInspection As OrderDataSet.OrdersInternalInspectionsRow

        Dim _vwDeliveryRow As DeliveryDataSet.vw_DeliveryShipmentViewRow
        Dim _oneOrderInspectionRow As OrderDataSet.OrdersInspectionsRow
        Dim _rowOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow
        Dim _rowsOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow()


        Dim _numOfOrders As New ArrayList
        Dim _total As Decimal = 0D
        Dim _subTotal As Decimal = 0D
        Dim _subTotalOrdered As Decimal = 0D
        Dim _totalPieces As Integer = 0I
        Dim _totalNet As Decimal = 0D
        Dim _totalBuy As Decimal = 0D
        Dim _totalClaims As Decimal = 0D
        Dim _claimSupplier As Decimal = 0D
        Dim _totalPenalty As Decimal = 0D
        Dim _penaltySupplier As Decimal = 0D
        Dim _totalInspection As Integer = 0I
        Dim _totalInspectionFailed As Integer = 0I
        Dim _InspectionFailedPercentage As Decimal
        Dim _totalDelivery As Integer = 0I
        Dim _averageDelivery As Decimal = 0D
        Dim _deliveryContainer As ArrayList
        Dim _lowMargin As Decimal = 0D
        Dim _currentMargin As Decimal = 0D
        Dim _avgMargin As Decimal = 0D
        Dim _highMargin As Decimal = 0D



        Dim _marginCalculator As Garzone.SaleCalculation

        _dataTable.Columns.Add(New DataColumn("SupplierID", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("SupplierName", GetType(String)))
        _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
        _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
        _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
        _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))


        For Each _item In _hashTable
            _total = 0
            _totalPieces = 0
            _totalNet = 0
            _subTotal = 0D
            _subTotalOrdered = 0D
            _totalBuy = 0D
            _totalClaims = 0D
            _claimSupplier = 0D
            _totalPenalty = 0D
            _penaltySupplier = 0D
            _totalInspection = 0I
            _totalInspectionFailed = 0I
            _InspectionFailedPercentage = 0D
            _totalDelivery = 0I
            _averageDelivery = 0D
            _deliveryContainer = New ArrayList
            _lowMargin = 0D
            _currentMargin = 0D
            _avgMargin = 0D
            _highMargin = 0D
            _numOfOrders = New ArrayList

            Dim counter As Integer = 0
            Dim _arrMarginContainer As New ArrayList
            Dim _totalMargin As Decimal = 0D

            _supplierRow = Me.m_Item.DatasetOrder.Suppliers.FindBySupplierID(CType(_item.Key, Integer))

            For Each _oneOrderID As Integer In CType(_item.Value, ArrayList)
                For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_oneOrderID).GetOrderLotRows
                    If _numOfOrders.Contains(_oneLotRow.OrderID) = False Then
                        _numOfOrders.Add(_oneLotRow.OrderID)
                    End If

                    'Get the calculator already created
                    _marginCalculator = Me.m_hashTableLotsMargin.Item(_oneLotRow.OrderLotID)
                    _rowsOrderLotShipment = Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)

                    If _oneLotRow.IsSellingPriceNull = False Then
                        _subTotalOrdered += _marginCalculator.Margin * _oneLotRow.QuantityOrdered * _oneLotRow.ExchangeRateSelling * _oneLotRow.SellingPrice

                        For Each _rowOrderLotShipment In _rowsOrderLotShipment
                            _total += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                            _totalNet += (_marginCalculator.GrossSalePrice * _rowOrderLotShipment.QuantityShipped)
                            _subTotal += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped * _marginCalculator.Margin)
                        Next

                    End If

                    If _oneLotRow.IsBuyingPriceNull = False Then
                        For Each _rowOrderLotShipment In _rowsOrderLotShipment
                            _totalBuy += (_oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                        Next
                    End If

                    For Each _rowOrderLotShipment In _rowsOrderLotShipment
                        _totalPieces += _rowOrderLotShipment.QuantityShipped
                        Me.m_TotalPieces += _rowOrderLotShipment.QuantityShipped
                    Next

                    'Current margin
                    If _oneLotRow.SellingPrice <> 0 Then
                        _currentMargin = _marginCalculator.Margin
                    Else
                        _currentMargin = 0D
                    End If

                    _arrMarginContainer.Add(_currentMargin)

                    'Margin Low and high
                    If counter = 0 Then
                        _lowMargin = _currentMargin
                        _highMargin = _currentMargin
                    End If
                    _lowMargin = SeasonSummary.PopUpDecimal(_currentMargin, _lowMargin, False)
                    _highMargin = SeasonSummary.PopUpDecimal(_currentMargin, _highMargin, True)

                    'Claims calculation
                    For Each _oneOrderClaimRow In _oneLotRow.GetOrderClaimRows
                        _totalClaims += (_oneOrderClaimRow.ClaimTotalAmount - _oneOrderClaimRow.VenderAmount)
                        _claimSupplier += _oneOrderClaimRow.VenderAmount
                        Me.m_claimSupplier += _oneOrderClaimRow.VenderAmount
                    Next

                    'Internal Inspection calculation
                    For Each _oneInternalInspection In _oneLotRow.GetOrdersInternalInspectionsRows
                        If _oneInternalInspection.IsInspectionResultIDNull = False Then
                            Select Case CType(_oneInternalInspection.InspectionResultID, Inspection.InspectionsResults)
                                Case Inspection.InspectionsResults.Failed
                                    _totalInspectionFailed += 1
                            End Select
                        End If
                    Next
                    _totalInspection += _oneLotRow.GetOrdersInternalInspectionsRows.Length

                    'Third party inspections calculation
                    For Each _oneOrderInspectionRow In _oneLotRow.GetOrdersInspectionsRows
                        If _oneOrderInspectionRow.IsResultIDNull = False Then
                            Select Case CType(_oneOrderInspectionRow.ResultID, Inspection.InspectionsResults)
                                Case Inspection.InspectionsResults.Failed
                                    _totalInspectionFailed += 1
                            End Select
                        End If
                    Next
                    _totalInspection += _oneLotRow.GetOrdersInspectionsRows.Length

                    'Penalty calculation
                    For Each _rowOrderLotShipment In Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)
                        If _rowOrderLotShipment.IsMakerPenaltyValueNull = False Then
                            _totalPenalty += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                            _penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                            Me.m_penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                        End If
                        If _rowOrderLotShipment.IsCustomerPenaltyValueNull = False Then
                            _totalPenalty -= ((_rowOrderLotShipment.CustomerPenaltyValue / 100) * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                        End If
                    Next

                    'Calculate Delivery
                    For Each _vwDeliveryRow In Me.m_ItemDelivery.DatasetDelivery.vw_DeliveryShipmentView.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)
                        If Not _vwDeliveryRow.IsDeliveryNull Then
                            _deliveryContainer.Add(_vwDeliveryRow.Delivery)
                        End If
                    Next

                    counter += 1

                Next
            Next


            Me.m_SeasonSummary.TotalOrders += _numOfOrders.Count

            If _total <> 0 Then
                _avgMargin = (_totalNet - _totalBuy) / _total
            Else
                _avgMargin = 0D
            End If

            'Inspection failed
            If _totalInspection <> 0 Then
                _InspectionFailedPercentage = _totalInspectionFailed / _totalInspection
            Else
                _InspectionFailedPercentage = 0
            End If

            'Delivery
            For Each _oneDelivery As Integer In _deliveryContainer
                _totalDelivery += _oneDelivery
            Next
            If _deliveryContainer.Count = 0 Then
                _averageDelivery = 0D
            Else
                _averageDelivery = _totalDelivery / _deliveryContainer.Count
            End If

            'Create one row for current customer
            _row = _dataTable.NewRow

            _row.Item("SupplierID") = _supplierRow.SupplierID
            _row.Item("SupplierName") = _supplierRow.Name
            _row.Item("TotalPieces") = _totalPieces
            _row.Item("Orders") = _numOfOrders.Count
            _row.Item("PurchaseAmount") = -_totalBuy
            If Me.m_SeasonSummary.TotalSalesBuy <> 0 Then
                _row.Item("PurchasePercentage") = (_totalBuy / Me.m_SeasonSummary.TotalSalesBuy)
            Else
                _row.Item("PurchasePercentage") = 0
            End If
            _row.Item("Claims") = -_claimSupplier
            _row.Item("Penalty") = _penaltySupplier
            _row.Item("InspectionFail") = _totalInspectionFailed.ToString & "/" & _totalInspection.ToString
            _row.Item("FailedP") = _InspectionFailedPercentage
            _row.Item("Delivery") = _averageDelivery
            _row.Item("LowMargin") = _lowMargin
            _row.Item("AvgMargin") = _avgMargin
            _row.Item("HighMargin") = _highMargin
            _row.Item("SubTotal") = _subTotal - _totalClaims + _totalPenalty
            _row.Item("SubTotalOrdered") = _subTotalOrdered - _totalClaims + _totalPenalty
            If _subTotalOrdered - _totalClaims + _totalPenalty = 0 Then
                _row.Item("SubTotalCompare") = 0
            Else
                _row.Item("SubTotalCompare") = (_subTotal - _totalClaims + _totalPenalty) / (_subTotalOrdered - _totalClaims + _totalPenalty)
            End If

            _dataTable.Rows.Add(_row)

        Next
        Return _dataTable
    End Function

    Private Sub cmdRefresh_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdRefresh.Click
        BindData()
    End Sub

    Public Sub ExportAll(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
        Dim _fileName As String
        _fileName = "Supplier sales stats by customer[" & Me.dropSeason.SelectedItem.Value & "]" & DateTime.Now.ToShortDateString & ".xls"

        'Binding data first
        BindData()
        SeasonSummary.exportExcelFile(Me.m_arrAllDataGrids, _fileName, Me.Response)

    End Sub

    Private Sub gvSupplier_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvSupplier.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim _dataTable As New DataTable
            Dim _row As DataRow
            Dim _dtgCustomers As DataGrid = e.Row.FindControl("dtgCustomers")
            Dim _supplierID As Integer = CType(e.Row.DataItem("SupplierID"), Integer)
            Dim _lblSupplierName As Label = CType(e.Row.FindControl("lblSupplierName"), Label)
            _lblSupplierName.Text = CType(e.Row.DataItem("SupplierName"), String)
            If _supplierID <> -1 Then
                'Normal row
                _dataTable = Me.GenerateCustomerSalesBySupplierID(_supplierID)
                _dtgCustomers.Attributes.Add("Name", e.Row.DataItem("SupplierName"))
                _row = _dataTable.NewRow

                _row.Item("CustomerName") = "Total"
                _row.Item("Orders") = CType(e.Row.DataItem("Orders"), Integer)
                _row.Item("TotalPieces") = CType(e.Row.DataItem("TotalPieces"), Integer)
                _row.Item("PurchaseAmount") = CType(e.Row.DataItem("PurchaseAmount"), Decimal)
                _row.Item("PurchasePercentage") = CType(e.Row.DataItem("PurchasePercentage"), Decimal)
                _row.Item("Claims") = CType(e.Row.DataItem("Claims"), Decimal)
                _row.Item("Penalty") = CType(e.Row.DataItem("Penalty"), Decimal)
                _row.Item("InspectionFail") = CType(e.Row.DataItem("InspectionFail"), String)
                _row.Item("FailedP") = CType(e.Row.DataItem("FailedP"), Decimal)
                _row.Item("Delivery") = CType(e.Row.DataItem("Delivery"), Integer)
                _row.Item("LowMargin") = CType(e.Row.DataItem("LowMargin"), Decimal)
                _row.Item("AvgMargin") = CType(e.Row.DataItem("AvgMargin"), Decimal)
                _row.Item("HighMargin") = CType(e.Row.DataItem("HighMargin"), Decimal)
                _row.Item("SubTotal") = CType(e.Row.DataItem("SubTotal"), Decimal)
                _row.Item("SubTotalOrdered") = CType(e.Row.DataItem("SubTotalOrdered"), Decimal)
                _row.Item("SubTotalCompare") = CType(e.Row.DataItem("SubTotalCompare"), Decimal)

                _dataTable.Rows.Add(_row)

                _dataTable.DefaultView.Sort = "PurchaseAmount DESC"
                _dtgCustomers.DataSource = _dataTable.DefaultView
                _dtgCustomers.DataBind()
            Else
                'Summary row
                If CType(e.Row.DataItem("Orders"), Integer) <> 0 Then
                    _dataTable.Columns.Add(New DataColumn("CustomerName", GetType(String)))
                    _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
                    _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
                    _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
                    _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
                    _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
                    _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))

                    'Create one row for current customer
                    _row = _dataTable.NewRow

                    _row.Item("CustomerName") = "Total"
                    _row.Item("Orders") = CType(e.Row.DataItem("Orders"), Integer)
                    _row.Item("TotalPieces") = CType(e.Row.DataItem("TotalPieces"), Integer)
                    _row.Item("PurchaseAmount") = CType(e.Row.DataItem("PurchaseAmount"), Decimal)
                    _row.Item("PurchasePercentage") = CType(e.Row.DataItem("PurchasePercentage"), Decimal)
                    _row.Item("Claims") = CType(e.Row.DataItem("Claims"), Decimal)
                    _row.Item("Penalty") = CType(e.Row.DataItem("Penalty"), Decimal)
                    _row.Item("InspectionFail") = CType(e.Row.DataItem("InspectionFail"), String)
                    _row.Item("FailedP") = CType(e.Row.DataItem("FailedP"), Decimal)
                    _row.Item("Delivery") = CType(e.Row.DataItem("Delivery"), Integer)
                    _row.Item("LowMargin") = CType(e.Row.DataItem("LowMargin"), Decimal)
                    _row.Item("AvgMargin") = CType(e.Row.DataItem("AvgMargin"), Decimal)
                    _row.Item("HighMargin") = CType(e.Row.DataItem("HighMargin"), Decimal)
                    _row.Item("SubTotal") = CType(e.Row.DataItem("SubTotal"), Decimal)
                    _row.Item("SubTotalOrdered") = CType(e.Row.DataItem("SubTotalOrdered"), Decimal)
                    _row.Item("SubTotalCompare") = CType(e.Row.DataItem("SubTotalCompare"), Decimal)
                    _dataTable.Rows.Add(_row)

                    _dataTable.DefaultView.Sort = "PurchaseAmount DESC"
                    _dtgCustomers.DataSource = _dataTable.DefaultView
                    _dtgCustomers.Attributes.Add("Name", "Summary")
                    _dtgCustomers.DataBind()
                End If

            End If
            'Add to arraylist to use in future
            Me.m_arrAllDataGrids.Add(_dtgCustomers)
        End If
    End Sub


End Class

你可能感兴趣的:(Datatable)