Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports DevExpress.ExpressApp.Win
Imports Nuvolar.Module.Win
Imports DevExpress.ExpressApp
Imports DevExpress.Xpo
Imports DevExpress.Data.Filtering
Imports DevExpress.XtraBars.Alerter
Imports DevExpress.ExpressApp.Utils
Imports DevExpress.ExpressApp.Xpo
Imports Nuvolar.Module.GeneralFunction
Imports System.Data.SqlClient

Partial Public Class NuvolarWindowsFormsApplication
    Inherits WinApplication
    Public Sub New()
        InitializeComponent()
    End Sub

    Private Sub NuvolarWindowsFormsApplication_DatabaseVersionMismatch(ByVal sender As Object, ByVal e As DevExpress.ExpressApp.DatabaseVersionMismatchEventArgs) Handles MyBase.DatabaseVersionMismatch
#If EASYTEST Then
        e.Updater.Update()
        e.Handled = True
#Else
        If System.Diagnostics.Debugger.IsAttached Then
            e.Updater.Update()
            e.Handled = True
        Else
            Throw New InvalidOperationException( _
             "The application cannot connect to the specified database, because the latter doesn't exist or its version is older than that of the application." & vbCrLf & _
             "This error occurred  because the automatic database update was disabled when the application was started without debugging." & vbCrLf & _
             "To avoid this error, you should either start the application under Visual Studio in debug mode, or modify the " & _
             "source code of the 'DatabaseVersionMismatch' event handler to enable automatic database update, " & _
             "or manually create a database using the 'DBUpdater' tool." & vbCrLf & _
             "Anyway, refer to the 'Update Application and Database Versions' help topic at http://www.devexpress.com/Help/?document=ExpressApp/CustomDocument2795.htm " & _
             "for more detailed information. If this doesn't help, please contact our Support Team at http://www.devexpress.com/Support/Center/")
        End If
#End If
    End Sub
    Protected Overrides Function GetTraceLogDirectory() As String
        Return MyBase.GetTraceLogDirectory()
    End Function
    Protected Overrides Function CreateLogonWindowControllers() As System.Collections.Generic.List(Of DevExpress.ExpressApp.Controller)
        Dim _result As System.Collections.Generic.List(Of DevExpress.ExpressApp.Controller)
        Dim _CreateLogonWindowsControllerVC As New CreateLogonWindowsControllerVC
        _result = MyBase.CreateLogonWindowControllers()
        _result.Add(_CreateLogonWindowsControllerVC)
        Return _result
    End Function
    Protected Overrides Sub CreateDefaultObjectSpaceProvider(args As CreateCustomObjectSpaceProviderEventArgs)
        args.ObjectSpaceProvider = New XPObjectSpaceProvider(args.ConnectionString, args.Connection, True)
    End Sub
    Protected Overrides Sub OnLoggedOn(args As DevExpress.ExpressApp.LogonEventArgs)
        MyBase.OnLoggedOn(args)
        Dim _onew As Xpo.XPObjectSpace = Me.ObjectSpaceProvider.CreateObjectSpace()
        Dim _uow As New UnitOfWork(_onew.Session.DataLayer)
        Dim _User As DevExpress.Persistent.BaseImpl.User = _onew.FindObject(Of DevExpress.Persistent.BaseImpl.User)(CriteriaOperator.Parse("Oid=?", SecuritySystem.CurrentUserId))
        Nuvolar.Module.LockingModule.ReleaseAllLocking(_uow, _User)

        Dim cnn As New Object

        Dim sql As String = ""
        Select Case GLOBAL_SQLType
            Case [Module].eSQLType.MSSQL
                sql = "BEGIN TRANSACTION ROUNDQTT" + vbNewLine

                sql += "UPDATE StorageComputed SET QTTFree=ROUND(QTTFree,4) WHERE QTTFree<>ROUND(QTTFree,4)" + vbNewLine
                sql += "UPDATE StorageInRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4)" + vbNewLine
                sql += "UPDATE StorageInRows SET QTT_Out=ROUND(QTT_Out,4) WHERE QTT_Out<>ROUND(QTT_Out,4)" + vbNewLine
                sql += "UPDATE StorageOutRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4)" + vbNewLine
                sql += "UPDATE StorageOutRows SET QTT_To_DeliveryOut=ROUND(QTT_To_DeliveryOut,4) WHERE QTT_To_DeliveryOut<>ROUND(QTT_To_DeliveryOut,4)" + vbNewLine
                sql += "UPDATE DeliveryNoteInRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4)" + vbNewLine
                sql += "UPDATE DeliveryNoteOutRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4)" + vbNewLine
                sql += "UPDATE DeliveryNoteOutRows SET QTT_Invoiced=ROUND(QTT_Invoiced,4) WHERE QTT_Invoiced<>ROUND(QTT_Invoiced,4)" + vbNewLine

                sql += "COMMIT TRANSACTION ROUNDQTT;"


            Case [Module].eSQLType.MySQL
                sql = "START TRANSACTION;" + vbNewLine

                sql += "UPDATE StorageComputed SET QTTFree=ROUND(QTTFree,4) WHERE QTTFree<>ROUND(QTTFree,4);" + vbNewLine
                sql += "UPDATE StorageInRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4);" + vbNewLine
                sql += "UPDATE StorageInRows SET QTT_Out=ROUND(QTT_Out,4) WHERE QTT_Out<>ROUND(QTT_Out,4);" + vbNewLine
                sql += "UPDATE StorageOutRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4);" + vbNewLine
                sql += "UPDATE StorageOutRows SET QTT_To_DeliveryOut=ROUND(QTT_To_DeliveryOut,4) WHERE QTT_To_DeliveryOut<>ROUND(QTT_To_DeliveryOut,4);" + vbNewLine
                sql += "UPDATE DeliveryNoteInRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4);" + vbNewLine
                sql += "UPDATE DeliveryNoteOutRows SET QTT=ROUND(QTT,4) WHERE QTT<>ROUND(QTT,4);" + vbNewLine
                sql += "UPDATE DeliveryNoteOutRows SET QTT_Invoiced=ROUND(QTT_Invoiced,4) WHERE QTT_Invoiced<>ROUND(QTT_Invoiced,4);" + vbNewLine

                sql += "COMMIT;"


            Case [Module].eSQLType.PostgreSQL
                sql = "BEGIN;" + vbNewLine

                sql += "UPDATE ""StorageComputed"" SET ""QTTFree""=ROUND(""QTTFree"",4)"" WHERE ""QTTFree""<>ROUND(""QTTFree"",4);" + vbNewLine
                sql += "UPDATE ""StorageInRows"" SET ""QTT""=ROUND(""QTT"",4)"" WHERE ""QTT""<>ROUND(""QTT"",4);" + vbNewLine
                sql += "UPDATE ""StorageInRows"" SET ""QTT_Out""=ROUND(""QTT_Out"",4)"" WHERE ""QTT_Out""<>ROUND(""QTT_Out"",4);" + vbNewLine
                sql += "UPDATE ""StorageOutRows"" SET ""QTT""=ROUND(""QTT"",4)"" WHERE ""QTT""<>ROUND(""QTT"",4);" + vbNewLine
                sql += "UPDATE ""StorageOutRows"" SET ""QTT_To_DeliveryOut""=ROUND(""QTT_To_DeliveryOut"",4)"" WHERE ""QTT_To_DeliveryOut""<>ROUND(""QTT_To_DeliveryOut"",4);" + vbNewLine
                sql += "UPDATE ""DeliveryNoteInRows"" SET ""QTT""=ROUND(""QTT"",4)"" WHERE ""QTT""<>ROUND(""QTT"",4);" + vbNewLine
                sql += "UPDATE ""DeliveryNoteOutRows"" SET ""QTT""=ROUND(""QTT"",4)"" WHERE ""QTT""<>ROUND(""QTT"",4);" + vbNewLine
                sql += "UPDATE ""DeliveryNoteOutRows"" SET ""QTT_Invoiced""=ROUND(""QTT_Invoiced"",4)"" WHERE ""QTT_Invoiced""<>ROUND(""QTT_Invoiced"",4);" + vbNewLine

                sql += "COMMIT;"
        End Select
        Try
            Dim _row As Integer = _onew.Session.ExecuteNonQuery(sql)
        Catch ex As Exception

        End Try


    End Sub
    Protected Overrides Sub OnLoggingOff(args As DevExpress.ExpressApp.LoggingOffEventArgs)
        MyBase.OnLoggingOff(args)
        Dim _onew As Xpo.XPObjectSpace = Me.ObjectSpaceProvider.CreateObjectSpace()
        Dim _uow As New UnitOfWork(_onew.Session.DataLayer)
        Dim _User As DevExpress.Persistent.BaseImpl.User = _onew.FindObject(Of DevExpress.Persistent.BaseImpl.User)(CriteriaOperator.Parse("Oid=?", SecuritySystem.CurrentUserId))
        Nuvolar.Module.LockingModule.ReleaseAllLocking(_uow, _User)
    End Sub
End Class
