Attribute VB_Name = "Inicio"
Option Explicit

Public Sub Main()
  'Inicio de la Aplicación
  On Error GoTo LineaError
  'Verifica si la aplicación ya se encuentra en uso
  If App.PrevInstance = True Then
    MsgBox "La aplicación ya se encuentra en uso", vbOKOnly + vbInformation
    End
  
  Else
        Dim VALCLAVE, VALCLAVE2, VALCLAVE3, valor As String
        Dim di As DRIVE_INFO
           
        VALCLAVE = GetSetting("BISALOG", "CLAVE", "VALOR1")
        
        If VALCLAVE = "" Then
          Dim numero As Long
          numero = Aleatorio(1, 999999999)
          
              'SaveSetting "BISALOG", "CLAVE", "VALOR1", CStr(numero)
         
              valor = InputBox("Ingrese el Nro de Licencia otorgado por Omnisciencia", "Numero Generado: P-" & CStr(numero))
                If valor <> "" Then
                
                 SaveSetting "BISALOG", "CLAVE", "VALOR1", CStr(numero)
                
                 SaveSetting "BISALOG", "CLAVE", "VALOR2", UCase(valor)
                 
                di = GetDriveInfo(0)
                      With di
                         Select Case di.bDriveType
                            Case 0
                               'MsgBox "[Not present]"
                            Case 1
                               SaveSetting "BISALOG", "CLAVE", "VALOR3", Trim$(.SerialNumber)
                            Case 2
                               'MsgBox "[ATAPI drive - info not available]"
                            Case Else
                               'MsgBox "[drive type not known]"
                         End Select
                      End With
                 '''' VERIFICARA QUE LO RECIEN CREADO SEA LO CORRECTO
                        VALCLAVE = GetSetting("BISALOG", "CLAVE", "VALOR1")
                        VALCLAVE2 = GetSetting("BISALOG", "CLAVE", "VALOR2")
                        If VALCLAVE2 = "" Then
                              MsgBox "Valor no valido"
                              DeleteSetting "BISALOG"
                              End
                        Else
                              'Dim bValor As Boolean
                              If ValidarNumeroLicencia(CStr(VALCLAVE), CStr(VALCLAVE2)) = False Then
                                  MsgBox "Clave de Registro no Válida"
                                  DeleteSetting "BISALOG"
                                  End
                              End If
            
                              VALCLAVE3 = GetSetting("BISALOG", "CLAVE", "VALOR3")
            
            
                                di = GetDriveInfo(0)
                                      With di
                                         Select Case di.bDriveType
                                            Case 0
                                               'MsgBox "[Not present]"
                                            Case 1
                                               If VALCLAVE3 <> Trim$(.SerialNumber) Then
                                                 MsgBox "Clave de Registro no Válida"
                                                 DeleteSetting "BISALOG"
                                                 End
                                               End If
                                            Case 2
                                               'MsgBox "[ATAPI drive - info not available]"
                                            Case Else
                                               'MsgBox "[drive type not known]"
                                         End Select
                                      End With
            
                        End If
                 
                 '''' FIN VERIFICARA QUE LO RECIEN CREADO SEA LO CORRECTO
                Else
                    MsgBox "Valor no valido"
                    End
                End If
        
        Else
            VALCLAVE2 = GetSetting("BISALOG", "CLAVE", "VALOR2")
            If VALCLAVE2 = "" Then
                  MsgBox "Valor no valido"
                  DeleteSetting "BISALOG"
                  End
            Else
                  Dim bValor As Boolean
                  If ValidarNumeroLicencia(CStr(VALCLAVE), CStr(VALCLAVE2)) = False Then
                      MsgBox "Clave de Registro no Válida"
                      DeleteSetting "BISALOG"
                      End
                  End If
                  
                  VALCLAVE3 = GetSetting("BISALOG", "CLAVE", "VALOR3")
                  
                    di = GetDriveInfo(0)
                          With di
                             Select Case di.bDriveType
                                Case 0
                                   'MsgBox "[Not present]"
                                Case 1
                                   If VALCLAVE3 <> Trim$(.SerialNumber) Then
                                     MsgBox "Clave de Registro no Válida"
                                     DeleteSetting "BISALOG"
                                     End
                                   End If
                                Case 2
                                   'MsgBox "[ATAPI drive - info not available]"
                                Case Else
                                   'MsgBox "[drive type not known]"
                             End Select
                          End With
            End If
  
        End If
    
    
    psRutaMDB = App.Path + IIf(Right(App.Path, 1) = "\", "", "\") + kARCHIVO_MDB
    
    If Dir("C:\Temp", vbDirectory) = Empty Then MkDir "C:\Temp"
    
    'Valida la ruta del mdb
    'KRUTAMDB
    If Not ValidarRuta(psRutaMDB, "Base de Datos " + kARCHIVO_MDB + " no existe en la ruta de la aplicación") Then End

    'Conectar a BD (Mdb)
    If Not oDBAdmin.AbrirBD(ADOCnn, kCONNECT_STRING + psRutaMDB) Then End
    
    InicializarVariables
    
    TraerDatosConfiguracion
    
    AlmacenarDatosConfiguracion

    TraerParametrosBDSQL
    
    VerificarDatosClientePorSincronizar
    
    Dim rsConfiguracion As New ADODB.Recordset
    Dim sSQL As String
    Dim NumiCierreCaja As Integer
    
    sSQL = "select iCierreCaja from configuracion"
    If oDBAdmin.EjecutarConsulta(ADOCnn, sSQL, rsConfiguracion) Then
      If Not rsConfiguracion.EOF Then
        NumiCierreCaja = IIf(IsNull(rsConfiguracion!iCierreCaja), 6, rsConfiguracion!iCierreCaja)
      Else
        NumiCierreCaja = 6
      End If
    Else
      NumiCierreCaja = 6
    End If
    
    If NumiCierreCaja = 6 Then
      ADOCnn.Execute "update configuracion set iCierreCaja=0"
    End If
    
    'Verificando Serie y Documento con SQL SERVER
    Call CorregirSerieOperacion
    Call CorregirSerieOperacionParalela
    
    'ConectarBDCliente
    
    'RecuperaImpresora
    RecuperaImpresora
    kSERIE_DISCO_DURO = CargarSerieMaquina(1)
    kSERIE_DISCO_DURO1 = CargarSerieMaquina(2)
    
    'Variable para controlar la sincronizacion
    idZ1 = ""
    boolSincronizarTodo = True
    boolSincronizarCierre = False
    
    'SINCRONIZA
    Sincronizar

    'Mostrar la pantalla de presentación
    frmSplash.Show
    DoEvents
    Sleep 1000
    
    'Mostrar la pantalla de ingreso al sistema
    'frmPassword.Show
    frmPassword.Show
    DoEvents
    
    'Cerrar pantalla de presentación
    Unload frmSplash
    Set frmSplash = Nothing
    
    'Dar foco a frmPassword
    frmPassword.SetFocus
   'frm_password_number.SetFocus
  End If
  
  Exit Sub
    
LineaError:

  MsgBox Err.Description, vbOKOnly + vbInformation
End Sub

Private Sub InicializarVariables()
  On Error GoTo LineaError
  
  psArchivoCfg = App.Path + "\" + kARCHIVO_CFG
  K_CambioTurno = 0
  bolExisteConexionBDCliente = False
  bolExistenProblemasConexionBDCliente = False
  dtFechaUltimaVerificacionConexionBDCliente = Now
  Exit Sub
  
LineaError:
  MsgBox Err.Description, vbOKOnly + vbInformation
End Sub

Public Sub RecuperaImpresora()
  On Error GoTo LineaError
  
  Dim sSQL As String
  Dim ADORS As New ADODB.Recordset
  
  kPAR_TURNO = ""
  
  'Datos de la Impresora
  sSQL = "SELECT sImpresora, sImpresoraAlterna, cCodiTurno, nFlagCortaPapel, nFlagCortaPapelALT FROM Configuracion"
  
  If Not oDBAdmin.EjecutarConsulta(ADOCnn, sSQL, ADORS) Then GoTo Salir

  If ADORS.RecordCount = 1 Then
    kPAR_IMPRESORA = LeerCampo(ADORS("sImpresora"))
    kPAR_IMPRESORA_ALTERNA = LeerCampo(ADORS("sImpresoraAlterna"))
    KImpresora = LeerCampo(ADORS("nFlagCortaPapel"))
    KImpresoraALT = LeerCampo(ADORS("nFlagCortaPapelALT"))
    kPAR_TURNO = LeerCampo(ADORS("cCodiTurno"))
  End If
  
  If kPAR_IMPRESORA = "" Then kPAR_IMPRESORA = printer.DeviceName
  If kPAR_IMPRESORA_ALTERNA = "" Then kPAR_IMPRESORA_ALTERNA = printer.DeviceName
  
  Exit Sub

LineaError:
  MsgBox Err.Description, vbOKOnly + vbInformation
  
Salir:
  Set ADORS = Nothing
End Sub

Public Sub TraerParametrosBDSQL()
Dim nMonto As Double
Dim cnSQL As ADODB.Connection
Dim sSQL As String
Dim ADORS As ADODB.Recordset


If Not oDBAdmin.AbrirBD(cnSQL, psConnectString) Then GoTo Salir 'OMNISYS

sSQL = "select nmonto1 from parametro where cCodParam='IGV'"

If Not oDBAdmin.EjecutarConsulta(cnSQL, sSQL, ADORS) Then GoTo Salir

If ADORS.RecordCount > 0 Then
    nMonto = ADORS!nmonto1
End If

kIGV = nMonto / 100

EscribirCfg "PARAMETROS", "nIGV", psArchivoCfg, CStr(kIGV)

Set cnSQL = Nothing

Exit Sub
Salir:
Set cnSQL = Nothing


End Sub

Public Sub TraerDatosConfiguracion()
  On Error GoTo LineaError

  'Traer los datos de configuración
  psUserName = LeerCfg("INICIO", "UserName", psArchivoCfg)
  psPassWord = LeerCfg("INICIO", "PassWord", psArchivoCfg)
  psDataBase = LeerCfg("INICIO", "DataBase", psArchivoCfg)
  psDataServer = LeerCfg("INICIO", "DataServer", psArchivoCfg)
  kOPERACION = LeerCfg("PARAMETROS", "cOpeB", psArchivoCfg)
  kOPERACIONF = LeerCfg("PARAMETROS", "cOpeF", psArchivoCfg)
  NC = LeerCfg("PARAMETROS", "NC", psArchivoCfg)
  OC = LeerCfg("PARAMETROS", "OC", psArchivoCfg)
  PADE = LeerCfg("PARAMETROS", "PADE", psArchivoCfg)
  PADV = LeerCfg("PARAMETROS", "PADV", psArchivoCfg)
  LIQ = LeerCfg("PARAMETROS", "LIQ", psArchivoCfg)
  kPAR_CAJA = LeerCfg("PARAMETROS", "Caja", psArchivoCfg)
  kPAR_ALMACEN = LeerCfg("PARAMETROS", "Almacen", psArchivoCfg)
  kPAR_PORCSERV = LeerCfg("PARAMETROS", "PorcServ", psArchivoCfg)
  KRUTAMDB = LeerCfg("INICIO", "RutaBDCliente", psArchivoCfg)
  kDSCTOFLAG = LeerCfg("PARAMETROS", "DFlag", psArchivoCfg)
  
  If kPAR_CAJA = Empty Then
    MsgBox "Debe ingresar parámetro de Caja en archivo de Configuración"
    End
  End If
  If kPAR_ALMACEN = Empty Then
    MsgBox "Debe ingresar parámetro de almacén en archivo de Configuración"
    End
  End If
  
  If kPAR_PORCSERV = Empty Then
    MsgBox "Debe ingresar parámetro de Porcentaje de Servicio en archivo de Configuración"
    End
  End If
  
  psConnectString = VBsprintf(kCONNECT_STRING_SQL, psUserName, psPassWord, psDataBase, psDataServer)
  
  'sw To SQL Server
  psServidorSQL = LeerCfg("SQLServer", "ServidorSQL", psArchivoCfg)
  psUserSQL = LeerCfg("SQLServer", "UserSQL", psArchivoCfg)
  psPwdUserSQL = LeerCfg("SQLServer", "PwdUserSQL", psArchivoCfg)
  psBaseDatosSQL = LeerCfg("SQLServer", "BaseDatosSQL", psArchivoCfg)
  psIdiomaSQLServer = UCase(LeerCfg("SQLServer", "IdionaSQLServer", psArchivoCfg))
  'sw Por defecto poner Idiona de SQL Server "ENGLISH"
  If Trim(psIdiomaSQLServer) = "" Then psIdiomaSQLServer = "ENGLISH"
  If psIdiomaSQLServer = "ENGLISH" Then
    'sw COINFIRMAR
    psFORMATO_FECHA_SQL_SERVER_INS = "yyyy/mm/dd hh:nn:ss"
  ElseIf psIdiomaSQLServer = "SPANISH" Then
    psFORMATO_FECHA_SQL_SERVER_INS = "yyyy/dd/mm hh:nn:ss"
  Else
    MsgBox "Comuníquese con el Proveedor, indicando:" & vbCrLf & vbCrLf & _
    "- Idioma Servidor SQL Server no es: 'SPANISH', 'ENGLISH'", vbCritical, "Problemas de Configuración"
    End
  End If
  
  psCadenaConexionSQLServer = VBsprintf(kCONNECT_STRING_SQL, psUserSQL, psPwdUserSQL, psBaseDatosSQL, psServidorSQL)
  
  
  Exit Sub
  
LineaError:
  MsgBox Err.Description, vbOKOnly + vbInformation
End Sub

Public Sub AlmacenarDatosConfiguracion()
  On Error GoTo LineaError

  'Almacena los datos de configuración
  EscribirCfg "INICIO", "UserName", psArchivoCfg, psUserName
  EscribirCfg "INICIO", "PassWord", psArchivoCfg, psPassWord
  EscribirCfg "INICIO", "DataBase", psArchivoCfg, psDataBase
  EscribirCfg "INICIO", "DataServer", psArchivoCfg, psDataServer
  EscribirCfg "PARAMETROS", "Caja", psArchivoCfg, kPAR_CAJA
  EscribirCfg "PARAMETROS", "cOpeB", psArchivoCfg, kOPERACION
  EscribirCfg "PARAMETROS", "NC", psArchivoCfg, NC
  EscribirCfg "PARAMETROS", "OC", psArchivoCfg, OC
  EscribirCfg "PARAMETROS", "PADE", psArchivoCfg, PADE
  EscribirCfg "PARAMETROS", "PADV", psArchivoCfg, PADV
  EscribirCfg "PARAMETROS", "LIQ", psArchivoCfg, LIQ
  EscribirCfg "PARAMETROS", "cOpeF", psArchivoCfg, kOPERACIONF
  EscribirCfg "INICIO", "RutaBDCliente", psArchivoCfg, KRUTAMDB
  
  Exit Sub
  
LineaError:
  MsgBox Err.Description, vbOKOnly + vbInformation
End Sub

Public Sub ConectarBDCliente(Optional EnviarMensajeError As Boolean = True)
    On Error GoTo LineaError
    
    Dim strMensajeAdvertencia As String
    
    strMensajeAdvertencia = vbCrLf & "Las Operaciones se guardaran temporalmente hasta que se restablesca la conexión."
    
    If Not oDBAdmin.AbrirBD(ADOCnn2, psCadenaConexionSQLServer, False) Then
      bolExisteConexionBDCliente = False
      bolExistenProblemasConexionBDCliente = True
        
      If EnviarMensajeError = True Then
        GoTo LineaError
      End If
    Else
      bolExisteConexionBDCliente = True
      bolExistenProblemasConexionBDCliente = False
    End If
    
    Exit Sub
    
LineaError:
    MsgBox "No se pudo conectar a la Base de Datos Cliente." & strMensajeAdvertencia
End Sub

Public Function VerificarFechaSistema() As Boolean
    Dim cnSQL As ADODB.Connection
    Dim sSQL As String
    Dim dFechaSistema As String
    Dim dFechaMaxOper As String
    Dim dFechaMaxOperPar As String
    Dim ADORS As ADODB.Recordset
    Dim bFechaOK As Boolean
    
    VerificarFechaSistema = True
    
    dFechaSistema = Date
        
    If Not oDBAdmin.AbrirBD(cnSQL, psConnectString, False) Then GoTo Salir
        
        
    sSQL = "SELECT 1 as Orden,Max(dOperFech) AS FechaMaximaOperacion FROM Operacion UNION " _
    & "SELECT 2 as Orden,  Max(dOperFech) AS FechaMaximaOperacionPar From Operacionparalela " _
    & "ORDER BY orden"
    
    
    
    If Not oDBAdmin.EjecutarConsulta(ADOCnn, sSQL, ADORS) Then
      GoTo Salir
    Else
      Do While Not ADORS.EOF
        If ADORS!orden = 1 Then
          dFechaMaxOper = ADORS!FechaMaximaOperacion & ""
        ElseIf ADORS!orden = 2 Then
          dFechaMaxOperPar = ADORS!FechaMaximaOperacion & ""
        End If
        ADORS.MoveNext
      Loop
    End If
    
    If dFechaMaxOper <> "" Then
      If CDate(Format(dFechaMaxOper, "dd/mm/yyyy")) > CDate(Format(dFechaSistema, "dd/mm/yyyy")) Then
        VerificarFechaSistema = False
      End If
    End If
        
    If dFechaMaxOperPar <> "" Then
      If CDate(Format(dFechaMaxOperPar, "dd/mm/yyyy")) > CDate(Format(dFechaSistema, "dd/mm/yyyy")) Then
        VerificarFechaSistema = False
      End If
    End If

Set cnSQL = Nothing

Exit Function
Salir:
Set cnSQL = Nothing
End Function

Private Sub VerificarDatosClientePorSincronizar()
  ConectarBDCliente True
  If bolExisteConexionBDCliente = True Then
    'Aqui se Sincroniza la informacion de puntos que no esten sincronizadas
    SincronizaDatosCliente
    oDBAdmin.CerrarBD ADOCnn2
    bolExisteConexionBDCliente = False
  End If
End Sub

Private Function CargarSerieMaquina(ByVal Tipo As Integer) As String
  Dim ADORS As ADODB.Recordset
  Dim sSQL As String
    
  sSQL = " SELECT nsmr " & _
        "   FROM _Tmp1 " & _
        "  WHERE prn= " & CStr(Tipo)
          
  If Not oDBAdmin.EjecutarConsulta(ADOCnn, sSQL, ADORS) Then GoTo Salir
  If Not ADORS.EOF Then
     CargarSerieMaquina = LeerCampo(ADORS!nsmr)
     Exit Function
  Else
     CargarSerieMaquina = ""
  End If
Salir:
  EscribirLog " No se ha encontrado el codigo de impresora"
End Function

Public Function EscribirLog(cadena As String)
  On Error Resume Next
  
  Dim filenumber
  Dim archivo As String
  
  archivo = App.Path + "\Err_" + Format(Date, "yyyymmdd") + ".log"
  
  filenumber = FreeFile
  Open archivo For Append As #filenumber
    Print #filenumber, CStr(Date) + " " + CStr(Time) + " " + cadena
  Close #filenumber
  
End Function
