Option Explicit On

Imports System.IO
Imports System.Text
Imports IntraSell_DLL
Imports IntraSell_DLL.Printing
Imports IntraSell_Net_Base
Imports IntraSell_Net_Base.dsVorgaengeTableAdapters
Imports Registrierkassa
Imports Registrierkassa.Model

Module ModulePOSPrinter

    Dim prt As ClassPrinter
    Dim WithEvents regKassa As Registrierkassa.RegistrierkassaInterface
    Public silent As Boolean = False
    Private localeSettings As New ClassSettings

    Sub New()
        Try
            regKassa = New Registrierkassa.Registrierkassa()
        Catch ex As Exception
            WriteLog("Error in ModulePOSPrinter.New " & ex.Message)
        End Try
        Try
            prt = New ClassPrinter(Nothing, ClassPrinter.HW_CONFIG_3)
        Catch ex As Exception
            WriteLog("Error in ModulePOSPrinter.New " & ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Issues a Thread 
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <param name="isUeberleitung"></param>
    ''' <param name="showPreview"></param>
    ''' <remarks></remarks>
    Public Sub VorgangDruckenThread(VorgangTyp As String,
                          VorgangNummer As Integer,
                          Optional isUeberleitung As Boolean = True,
                          Optional showPreview As Boolean = True)
        Dim t As New Threading.Thread(AddressOf VorgangDruckenWork)
        Dim params As New VorgangDruckenParameters With {
            .VorgangTyp = VorgangTyp,
            .VorgangNummer = VorgangNummer,
            .isUeberleitung = isUeberleitung,
            .showPreview = showPreview
        }
        t.Start(params)
    End Sub

    Public Sub VorgangDruckenWork(params As Object)
        Dim p As VorgangDruckenParameters = CType(params, VorgangDruckenParameters)
        VorgangDrucken(p.VorgangTyp, p.VorgangNummer, p.isUeberleitung, p.showPreview)
    End Sub

    Public Class VorgangDruckenParameters
        Public VorgangTyp As String
        Public VorgangNummer As Integer
        Public isUeberleitung As Boolean
        Public showPreview As Boolean
    End Class

    Function GetTemplateName() As String
        Dim templateName As String = Nothing
        Try
            If ExistsVarValue(PRINT_REPORT_TEMPLATE_NAME) Then
                templateName = VarValue(PRINT_REPORT_TEMPLATE_NAME)
                If templateName = "Kassabeleg80mm.rdlc" Then
                    templateName = "Kassabeleg.rdlc"
                End If
            End If
        Catch ex As Exception
            'Ignore
        End Try
        Return templateName
    End Function

    ''' <summary>
    ''' Vorgang mit oder ohne QR Code Drucken
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <param name="isUeberleitung"></param>
    ''' <param name="showPreview"></param>
    ''' <remarks></remarks>
    Public Sub VorgangDrucken(VorgangTyp As String,
                              VorgangNummer As Integer,
                              Optional isUeberleitung As Boolean = True,
                              Optional showPreview As Boolean = True)
        WriteLog("VorgangDrucken " & VorgangTyp & "-" & VorgangNummer)
        Try
            Cursor.Current = Cursors.WaitCursor

            Dim vorgangCheck = LadeVorgang(VorgangTyp, VorgangNummer)
            If vorgangCheck Is Nothing Then
                Dim msg = String.Format(Messages.ModuleBuchVorgang_Vorgang_fehlt, VorgangTyp & "-" & VorgangNummer)
                WriteLog(msg)
                Cursor.Current = Cursors.Default
                Return
            End If


            Dim runOpenAusdruck_InWord_Filename_RTF = True

            Dim templateName = GetTemplateName()
            If templateName IsNot Nothing AndAlso Not isUeberleitung Then
                If templateName.Contains(ModuleReports.Report_Kassabeleg80mm_Standard) _
                    OrElse templateName.Contains(ModuleReports.Report_Kassabeleg57mm_Standard) _
                    OrElse templateName.Contains(ModuleReports.Report_KassabelegA4_Standard) _
                    OrElse templateName.Contains(ModuleReports._Standard) Then 'in diesem Report wird die Datei filename nicht benötigt
                    runOpenAusdruck_InWord_Filename_RTF = False
                End If
            End If

            Dim filename As String = Nothing
            If runOpenAusdruck_InWord_Filename_RTF Then
                filename = OpenAusdruck_InWord_Filename_RTF(VorgangTyp, VorgangNummer, VORLAGE_RECHNUNG, True)
                If filename = "False" OrElse filename Is Nothing Then
                    WriteLog("Die Datei fehlt für Vorgang " & VorgangTyp & "-" & VorgangNummer)
                    Cursor.Current = Cursors.Default
                    Return
                End If
            End If

            If isUeberleitung Then
                RegKassaUeberleitung(VorgangTyp, VorgangNummer, filename)
            End If

            ErstelleQRCodeFile(VorgangTyp, VorgangNummer, 10)
            Dim qrCodeFile = GetQRCodeFile(VorgangTyp, VorgangNummer)

            Dim printAmHost = intrasell.vorgang.GetVorgangEigenschaft(VorgangTyp, VorgangNummer, "PRINT_AM_HOST")
            Dim gleicherHost = Net.Dns.GetHostName = printAmHost
            Dim print = True

            If printAmHost IsNot Nothing AndAlso printAmHost <> NOT_AVAILABLE AndAlso Not gleicherHost Then
                print = False
            End If

            If print Then
                If templateName <> "" Then 'Print mit Report engine 
                    Dim qrCodeFileKundenAdresse As String = Nothing
                    If VarValue_Default(PRINT_ZUSTELLADRESSE_QR_CODE, "true") Then
                        If vorgangCheck.KundNr > 1 AndAlso vorgangCheck.LieferMethode <> "Abholung" Then
                            Dim hatAdresse = SaveQRCodeAdresse(vorgangCheck.KundNr, qrCodeFileKundenAdresse)
                            If hatAdresse Then
                                If qrCodeFileKundenAdresse IsNot Nothing Then qrCodeFileKundenAdresse = GetAppPath() & qrCodeFileKundenAdresse
                            End If
                        End If
                    End If

                    Dim qrCodeFileFeedback As String = Nothing
                    If ExistsVarValue(PRINT_FEEDBACK_QRCODE) AndAlso VarValue_Default(PRINT_FEEDBACK_QRCODE, "false") Then
                        If vorgangCheck.KundNr > 1 Then
                            Dim hatAdresse = SaveQRCodeFeedback(vorgangCheck.KundNr, qrCodeFileFeedback)
                            If hatAdresse Then
                                If qrCodeFileFeedback IsNot Nothing Then qrCodeFileFeedback = GetAppPath() & qrCodeFileFeedback
                            End If
                        End If
                    End If

                    Dim rep = New ModuleReports
                    rep.PrintKassabeleg(VorgangTyp, VorgangNummer, filename, GetAppPath() & qrCodeFile, templateName, showPreview, qrCodeFileKundenAdresse, qrCodeFileFeedback)
                    If vorgangCheck.ZahlungsMethode IsNot Nothing Then
                        If "BAR" = vorgangCheck.ZahlungsMethode.ToUpper Then
                            PrintOpenKassa()
                        End If
                    End If
                Else 'POS DRUCK
                    If VarValue_Default("PRINT_LOGO", "true") Then
                        PrintLogo()
                    End If

                    PrintFile(filename)

                    If VarValue_Default(PRINT_ZUSTELLADRESSE_QR_CODE, "true") _
                      AndAlso vorgangCheck.KundNr > 1 _
                      AndAlso vorgangCheck.LieferMethode <> "Abholung" Then
                        PrintQRCodeAdresseAlsQRCode(vorgangCheck.KundNr)
                    End If

                    PrintQRCode(VorgangTyp, VorgangNummer)
                    PrintLineFeed()
                    If showPreview Then
                        OrderPreview.ShowFile(filename)
                        OrderPreview.Show()
                    End If
                End If

                SetAusgedruckt(VorgangTyp, VorgangNummer)
            Else
                WriteLog("Vorgang wird nicht gedruckt, weil für eine andere Kasse bestimmt ist")
            End If

            Dim signiertCmd As New IntraSellVorgangSigniertCommand()
            signiertCmd.Nummer = VorgangNummer
            signiertCmd.Typ = VorgangTyp
            signiertCmd.QRCodeFilename = qrCodeFile
            ModuleGlobal.RequestCommandDirekt(signiertCmd)

        Catch ex As Exception
            HandleAppError(ex)
            Throw ex
        Finally
            Cursor.Current = Cursors.Default
        End Try
    End Sub

    ''' <summary>
    ''' Erstelle QR Code Datei für eine Rechnung
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <param name="RetryNr">Maximale Anzahl der Retries, zwischen Retries wird 1 sekunde </param> 
    Private Sub ErstelleQRCodeFile(VorgangTyp As String,
                                VorgangNummer As Integer,
                                RetryNr As Integer)

        Dim qrCodeFile = GetQRCodeFile(VorgangTyp, VorgangNummer)
        Dim qrCodeFileAbsPath = GetAppPath() & qrCodeFile
        If VorgangTyp = VorgangTypen.AR AndAlso Not File.Exists(qrCodeFileAbsPath) Then
            Try
                'QR Code noch mal erstellen 
                WriteLog("QR Code wiederherstellen " & VorgangTyp & "-" & VorgangNummer)
                Dim beleg As Beleg = regKassa.LadeBeleg(VorgangNummer)
                If beleg IsNot Nothing Then
                    Dim qrCodeFilename = regKassa.GeneriereBarcodeParagraph10(beleg)
                End If

                If Not File.Exists(qrCodeFileAbsPath) Then
                    Dim PcHatSignaturEinheit = localeSettings.ReadBoolean(Variablen.PcHatSignaturEinheit, True)
                    If Not PcHatSignaturEinheit AndAlso RetryNr > 0 Then
                        Threading.Thread.Sleep(1000)
                        ErstelleQRCodeFile(VorgangTyp, VorgangNummer, RetryNr - 1)
                    End If
                End If

            Catch ex As Exception
                WriteLog("QR Code wiederherstellen fehlgeschlagen, wegen " & ex.Message)
            End Try
        End If
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="filename"></param>
    ''' <remarks></remarks>
    Sub PrintFile(filename As String, Optional printer As String = Nothing)
        Try
            WriteDebug(String.Format("PrintFile START {0} to {1}", filename, printer))
            Cursor.Current = Cursors.WaitCursor
            'Dim prt As ClassPrinter = New ClassPrinter(Nothing, 3)
            Dim content As String = My.Computer.FileSystem.ReadAllText(filename)

            Dim newContent = prt.CodeToPos(content)
            Dim fnameOhnePath = Path.GetFileName(filename) & ".pos"

            prt.WriteFile(fnameOhnePath, newContent) 'vielleicht problem wenn der Rechner sehr langsam ist ? Datei nicht fertig ?
            prt.PrintFile(fnameOhnePath, printer)
            Try
                Dim wait = VarValue_Default(POS_WAIT, "10")
                Threading.Thread.Sleep(wait) 'Wait at least one second til next file can be printed 
            Catch ex As Exception
                'Nothing
            End Try
            WriteDebug(String.Format("PrintFile END {0} to {1}", filename, printer))
        Finally
            Cursor.Current = Cursors.Default
        End Try
    End Sub

    ''' <summary>
    ''' String zentrierel
    ''' </summary>
    ''' <param name="s"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function Center(s As String) As String
        Dim countSpaces As Integer
        countSpaces = CInt((44 - Len(s)) / 2)
        Dim i As Integer
        For i = 0 To countSpaces
            s = " " & s
        Next
        Return s
    End Function

    ''' <summary>
    ''' Beleg an die RegKassa überleiten
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <param name="Filename"></param>
    ''' <remarks></remarks>
    Private Sub RegKassaUeberleitung(VorgangTyp As String, VorgangNummer As Integer, Filename As String)
        Try
            Dim fileContent As String = IO.File.ReadAllText(Filename)

            If Not IstKasseInitialisiert() Then
                fileContent.Replace("[QRCODE_TEXT]", "RK nicht initialisiert!")
                fileContent.Replace("[QRCODE]", "RK nicht initialisiert!")
                fileContent.Replace("[Bemerkung]", "")
                WriteLog(Messages.ModulePOSPrinter_RegKasse_nicht_initialisiert)
                Return
            End If

            Dim beleg = regKassa.DruckeBeleg(beleg:=KonvertiereBeleg(VorgangTyp, VorgangNummer))

            'QR Code andrucken - in der Vorlage müssen die QR Steuercodes eingepflegt werden
            If fileContent.Contains("[QRCODE_TEXT]") Then
                Dim maschinenlesbarenCode As String = beleg.SignaturwertUnsigniert & "_" & beleg.Signaturwert
                fileContent = fileContent.Replace("[QRCODE_TEXT]", maschinenlesbarenCode)
            End If

            'Eine Temp Datei qrcode.png wurde angelegt 
            If fileContent.Contains("[QRCODE]") Then
                Dim qrCodeFile = GetQRCodeFile(VorgangTyp, VorgangNummer)
                If File.Exists(qrCodeFile) Then
                    'Dim posLinesForImage As String = prt.loadImageToPOSPrinter(QRCodeImage, False)
                    'prt.printLoadedImage()
                    fileContent = fileContent.Replace("[QRCODE]", "") 'siehe PrintQRCode
                Else
                    If beleg.SignaturwertUnsigniert IsNot Nothing Then
                        fileContent = fileContent.Replace("[QRCODE]", beleg.SignaturwertUnsigniert)
                    Else
                        fileContent = fileContent.Replace("[QRCODE]", Messages.ModulePOSPrinter_RegKasse_Sicherheitseinrichtung_ausgefallen)
                    End If
                End If
            End If

            If beleg.Bemerkung IsNot Nothing Then
                If fileContent.Contains("[Bemerkung]") Then
                    fileContent = fileContent.Replace("[Bemerkung]", beleg.Bemerkung)
                Else 'Sicherheitseinrichtung ausgefallen muss immer angedruckt werden
                    fileContent += beleg.Bemerkung
                End If
            Else
                fileContent = fileContent.Replace("[Bemerkung]", "")
            End If

            My.Computer.FileSystem.WriteAllText(Filename, fileContent, False)
        Catch ex As Exception
            Throw
        End Try
    End Sub

    ''' <summary>
    ''' Dateiname für QR Codes Files
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function GetQRCodeFile(VorgangTyp As String, VorgangNummer As Integer) As String
        Return "qrcode_" & VorgangTyp & "_" & VorgangNummer & ".png"
    End Function

    ''' <summary>
    ''' Print QR Code
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <remarks></remarks>
    Sub PrintQRCode(VorgangTyp As String, VorgangNummer As Integer)
        Dim skip As Boolean = VarValue_Default(BARRECHNUNG_QRCODE_TEXT, False)
        If Not skip Then
            Dim qrCodeFile = GetQRCodeFile(VorgangTyp, VorgangNummer)
            Dim qrCodeFilenamePOS = qrCodeFile.Replace(".png", ".pos")
            If File.Exists(qrCodeFile) Then
                Dim QRCodeImage As Image = Image.FromFile(qrCodeFile)
                Dim prt As New ClassPrinter(Nothing, 3, QRCodeImage)
                prt.LoadImageToPOSPrinter(QRCodeImage, True, tmpFilename:=qrCodeFilenamePOS)
            End If
        End If
    End Sub


    ''' <summary>
    ''' Line Feed 4 lines 
    ''' </summary>
    ''' <remarks></remarks>
    Sub PrintLineFeed()
        'Print 4 Lines to tear off the paper
        If Not File.Exists("linefeed.pos") Then
            WriteFile("linefeed.pos", " " & ClassPrinter.LF &
            " " & ClassPrinter.LF &
            " " & ClassPrinter.LF &
            " " & ClassPrinter.LF &
            ClassPrinter.TEAR)
        End If
        PrintFile("linefeed.pos")
    End Sub


    ''' <summary>
    ''' Open Kassa Commando
    ''' </summary>
    ''' <remarks></remarks>
    Sub PrintOpenKassa()
        If Not File.Exists("open.pos") Then
            WriteFile("open.pos", " " & ClassPrinter.OPEN_CASSA)
        End If
        PrintFile("open.pos")
    End Sub

    ''' <summary>
    ''' PNG File with size 440 x 136 
    ''' </summary> 
    ''' <remarks></remarks>
    Public Sub PrintLogo(Optional logoFile = "vorlagen\logo.png")
        Dim prt1 As New ClassPrinter(Nothing, ClassPrinter.HW_CONFIG_3)
        If prt1.PrintCachedLogo("logo.pos") Then
            Return
        End If
        'Print with img - slow 
        If File.Exists(logoFile) Then
            Dim img As Image = Image.FromFile(logoFile)
            Dim prt As New ClassPrinter(Nothing, ClassPrinter.HW_CONFIG_3, img)
            prt.LoadImageToPOSPrinter(img, printFileImmediately:=True, tmpFilename:="logo.pos")
        End If
    End Sub

    ''' <summary>
    ''' Oeffne RegKassa Verwaltungsmasken
    ''' </summary>
    ''' <remarks></remarks>
    Sub KassaVerwaltung(parent As Form)
        AddHandler Registrierkassa.Registrierkassa.BelegErstellt, AddressOf BelegErstellt
        Call regKassa.KassaVerwaltung(parent)
    End Sub

    ''' <summary>
    ''' Startbeleg, Monatsbeleg Abarbeitung 
    ''' </summary>
    ''' <remarks></remarks>
    Sub BelegErstellt(sender As Object, args As EventArgs) ' Handles regKassa.BelegErstellt
        'Abarbeitung wenn ein Beleg in der Kassa Erstellt wurde
        Dim neuerBeleg As Beleg = CType(args, BelegEventArgs).beleg
        If IsNull(neuerBeleg) Then
            Return
        End If
        If IsNull(neuerBeleg.Bemerkung) Then
            Return
        End If
        'pruefe ob bereit angelegt 
        Dim bereitsAngelegt = FirstRow("Select nummer from buchVorgang where Nummer = " & neuerBeleg.FortlaufendeNummer & " and Typ ='AR'")
        If bereitsAngelegt = neuerBeleg.FortlaufendeNummer Then
            Return
        End If
        If "Startbeleg".Contains(neuerBeleg.Bemerkung) OrElse
            "Monatsbeleg".Contains(neuerBeleg.Bemerkung) Then
            regKassa = New Registrierkassa.Registrierkassa()
            RegKasseEinstellungenSpeichern(regKassa)

            If "Startbeleg".Contains(neuerBeleg.Bemerkung) Then
                SetVarValue(Variablen.REG_KASSE_STARTBELEG_QRCODE, GetQRCodeFile(VorgangTypen.AR, neuerBeleg.FortlaufendeNummer))
                SetVarValue(Variablen.REG_KASSE_STARTBELEG_MASCHINENLESBARENCODE_PAR10, neuerBeleg.MaschinenlesbarenCodeParagraph10)
            Else
                SetVarValue(Variablen.REG_KASSE_MONATSBELEG_QRCODE, GetQRCodeFile(VorgangTypen.AR, neuerBeleg.FortlaufendeNummer))
                SetVarValue(Variablen.REG_KASSE_MONATSBELEG_MASCHINENLESBARENCODE_PAR10, neuerBeleg.MaschinenlesbarenCodeParagraph10)
            End If

            'Beleg in IntraSell ebenfalls anlegen 

            Dim t As New buchvorgangTableAdapter()
            Dim ta As New buchvorgang_artikelTableAdapter()
            Dim DsVorgaenge As New IntraSell_Net_Base.dsVorgaenge()
            Dim vorgangRow As IntraSell_Net_Base.dsVorgaenge.buchvorgangRow = DsVorgaenge.buchvorgang.NewRow()

            vorgangRow.KundNr = FirstRow("select min(idnr) from ofAdressen") '0 'neuerBeleg
            vorgangRow.Typ = VorgangTypen.AR
            vorgangRow.Nummer = neuerBeleg.FortlaufendeNummer
            vorgangRow.Datum = neuerBeleg.Datum
            vorgangRow.MitarbeiterNr = MitarbeiterID
            vorgangRow.Abgeschlossen = True

            Dim rp As IntraSell_Net_Base.dsVorgaenge._buchvorgang_artikelRow = DsVorgaenge._buchvorgang_artikel.NewRow()
            rp.ID = 1
            rp.Typ = VorgangTypen.AR
            rp.Stk = 1
            rp.Nummer = neuerBeleg.FortlaufendeNummer
            rp.ArtNr = FirstRow("select min(artnr) from grArtikel")
            rp.Bezeichnung = neuerBeleg.GetPositionen().First().Bezeichnung
            rp.Preis_Netto = 0
            rp.MWST = 0
            rp.MWSTSatz = 0
            rp.Preis_Brutto = 0

            DsVorgaenge.buchvorgang.AddbuchvorgangRow(vorgangRow)
            DsVorgaenge._buchvorgang_artikel.Rows.Add(rp)
            'DsVorgaenge.WriteXml("c:\test.xml")
            t.Update(DsVorgaenge)
            ta.Update(DsVorgaenge)
            Dim msg = String.Format(Messages.ModulePOSPrinter_Monatsbeleg_gedruckt, neuerBeleg.FortlaufendeNummer)
            WriteLog(msg)
            UserMessagePopUp("Start/Monatsbeleg gedruckt", msg, vbInformation)
            VorgangDrucken(vorgangRow.Typ, vorgangRow.Nummer, False)
        End If

    End Sub

    ''' <summary>
    ''' Beleg für die RegKassa aus einem IntraSell Objekt erstellen
    ''' </summary>
    ''' <param name="VorgangTyp"></param>
    ''' <param name="VorgangNummer"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function KonvertiereBeleg(VorgangTyp As String, VorgangNummer As Integer) As Model.Beleg
        Dim sql As String

        sql = GetRecSource(VorgangTyp, VorgangNummer)
        Dim rs = OpenRecordsetInMemory(sql)

        If rs.Rows.Count <= 0 Then
            Throw New Exception(String.Format(Messages.Vorgang_Keine_Daten, VorgangTyp, VorgangNummer))
        End If

        Dim beleg = New Beleg With {
            .Datum = rs.Rows(0)("Datum"),
            .FortlaufendeNummer = rs.Rows(0)("Nummer"),
            .Umsatz = rs.Rows(0)("SummeBrutto")
        }

        'PART II - Positionen
        sql = $"select v.*, a.Beschreibung, a.MWST as MWSTArtikel from `buchVorgang-Artikel` v,  grArtikel a
                where v.artnr = a.artnr
                and v.Nummer={VorgangNummer} and v.Typ='{VorgangTyp}'"

        Dim rsArtRS = OpenRecordsetInMemory(sql)
        For Each rsArt In rsArtRS.Rows
            If IsNumeric(rsArt("MWSTArtikel")) Then
                beleg.AddPosition(position:=New Position(id:=rsArt("ID"),
                                                         Bezeichnung:=rsArt("Bezeichnung"),
                                                         PreisNetto:=rsArt("Preis_Netto"),
                                                         Stk:=rsArt("Stk"),
                                                         Mwst:=rsArt("MWSTArtikel")))
            Else
                Dim msg = String.Format(Messages.Vorgang_Konvertierung_abgebrochen, rsArt("ArtNr"), rsArt("Bezeichnung"), rsArt("MWSTArtikel"))
                Throw New Exception(msg)
            End If

        Next

        'Test ob die Positionen korrekt sind
        beleg.ToString()
        Return beleg
    End Function

    ''' <summary>
    ''' Append text to an existing file
    ''' </summary>
    ''' <param name="filename"></param>
    ''' <param name="text"></param>
    ''' <remarks></remarks>
    Sub AppendToFile(filename As String, text As String)
        If IsNothing(filename) Then
            Return
        End If
        Dim sb As New StringBuilder()
        sb.AppendLine(text)
        Using outfile As New StreamWriter(filename, True)
            outfile.Write(sb.ToString())
        End Using
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="filename"></param>
    ''' <param name="what"></param>
    ''' <param name="text"></param>
    ''' <remarks></remarks>
    Private Sub ReplaceInFile(filename As String, what As String, text As String)
        Dim fileReader As String = My.Computer.FileSystem.ReadAllText(filename).Replace(what, text)
        My.Computer.FileSystem.WriteAllText(filename, fileReader, False)
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="filename"></param>
    ''' <param name="content"></param>
    ''' <remarks></remarks>
    Sub WriteFile(filename As String, content As String)
        Try
            content = ConvertToAscii(content)
            FileOpen(1, filename, OpenMode.Output, OpenAccess.Write, OpenShare.LockReadWrite)
            Print(1, " ")
            Print(1, content)
            FileClose(1)
        Catch ex As Exception  'if the ticket cannot be printed then it comes to error beacuse the old file is still needed 
            Debug.WriteLine("ClassPrinter.writeFile:" & ex.Message)
        End Try

    End Sub


    ''' <summary>
    ''' Do not use !  Moved to IntraSell.dll ModuleCommons
    ''' </summary>
    ''' <param name="unicodeString"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function ConvertToAscii(unicodeString As String) As String
        Dim ascii As Encoding = Encoding.ASCII
        Dim unicode As Encoding = Encoding.Unicode
        Dim unicodeBytes As Byte() = unicode.GetBytes(unicodeString)
        Dim asciiBytes As Byte() = Encoding.Convert(unicode, ascii, unicodeBytes)

        ' Convert the new byte array into a char array and then into a string.
        Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length) - 1) As Char
        ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0)
        Dim asciiString As New String(asciiChars)
        Return asciiString
    End Function

    Function DruckeMonatsBeleg() As Boolean
        Try
            Dim localeSettings = New ClassSettings
            Dim PcHatSignaturEinheit = localeSettings.ReadBoolean(Variablen.PcHatSignaturEinheit, True)
            If PcHatSignaturEinheit Then
                LoescheLetzteNichtBenutzteNummer(VorgangTypen.AU)
                LoescheLetzteNichtBenutzteNummer(VorgangTypen.AR)
                Dim KundNr = GetBarrechnungKundNr()
                Dim existOffenVorgangNummmer = ExistiertNichtAbgeschlossenVorgang(VorgangTyp:="AR", KundNr:=KundNr)
                If existOffenVorgangNummmer > 0 Then
                    Dim msgStop = String.Format(Messages.ModulePOSPrinter_Vorgang_Offen, existOffenVorgangNummmer)
                    UserMessagePopUp("Monatsbeleg", msgStop, vbCritical)
                    RaiseEvent_PostMsgEvent(msgStop, vbInformation)
                    Return False
                Else
                    RegKasseEinstellungenSpeichern(regKassa)
                    RemoveHandler Registrierkassa.Registrierkassa.BelegErstellt, AddressOf BelegErstellt
                    AddHandler Registrierkassa.Registrierkassa.BelegErstellt, AddressOf BelegErstellt
                    regKassa.DruckeMonatsbeleg()
                    Return True
                End If
            Else
                Dim msgStop = Messages.ModulePOSPrinter_Keine_Signatur
                UserMessagePopUp("Monatsbeleg", msgStop, vbCritical)
                RaiseEvent_PostMsgEvent(msgStop, vbInformation)
                Return False
            End If

        Catch ex As Exception
            HandleAppError(ex, Hilfe:=Messages.ModulePOSPrinter_Monatsbeleg_Error)
        End Try
        Return False
    End Function

    ''' <summary>
    ''' Prüfung ob Monatsbeleg gedruckt wurde und wenn nicht dann wird Monatsbeleg ausgedruckt
    ''' </summary>
    ''' <returns>False - wenn Kasse nicht initialisiert oder beleg offen</returns>
    ''' <remarks></remarks>
    Function CheckMonatsBelegGedruckt() As BooleanWithMessage
        WriteLog("CheckMonatsBelegGedruckt")

        If Not IstKasseInitialisiert() Then
            WriteLog(Messages.ModulePOSPrinter_RegKasse_nicht_initialisiert)
            Return New BooleanWithMessage(False, Messages.ModulePOSPrinter_RegKasse_nicht_initialisiert)
        End If
        Dim lastMonatsbeleg As Date = VarValue_Default(LETZTER_MONATSBELEG, "01.04.2017")
        Dim monateVergangen = DateDiff(DateInterval.Month, lastMonatsbeleg, Today)
        If monateVergangen >= 1 Then
            Dim msg As String
            If lastMonatsbeleg = "01.04.2017" Then
                msg = Messages.ModulePOSPrinter_Monatsbeleg_wird_gedruckt
            Else
                msg = String.Format(Messages.ModulePOSPrinter_Monatsbeleg_wird_gedruckt_vorhanden, lastMonatsbeleg)
            End If

            'MsgBox(msg, vbInformation)
            UserMessagePopUp("Monatsbeleg", msg, vbInformation)
            DruckeMonatsBeleg()
            Dim firstOfMonth = Today.AddDays(1 + -1 * Today.Day)
            SetVarValue(LETZTER_MONATSBELEG, firstOfMonth)
            Return New BooleanWithMessage(True, msg)
        Else
            Return New BooleanWithMessage(True, "")
        End If
    End Function

    Private Function IstKasseInitialisiert() As Boolean
        Try
            If regKassa Is Nothing Then
                regKassa = New Registrierkassa.Registrierkassa()
            End If
            If regKassa.GetKassenidentifikationsnummer <> "" Then
                Return True
            End If
        Catch ex As Exception
            Return False
        End Try
        Return False
    End Function

    Private Sub RegKasseEinstellungenSpeichern(regKassa As RegistrierkassaInterface)
        SetVarValue(Variablen.REG_KASSE_IDENTIFIKATION, regKassa.GetKassenidentifikationsnummer)
        SetVarValue(Variablen.REG_KASSE_AES, regKassa.GetAES256Passwort)
        SetVarValue(Variablen.REG_KASSE_ZERTIFIKAT, regKassa.GetSignaturzertifikatSeriennummer)
    End Sub


    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CheckMonatsBeleg(formtoOpen As AbstractVorgangBar)
        Try
            Dim localeSettings = New ClassSettings
            Dim PcHatSignaturEinheit = localeSettings.ReadBoolean(Variablen.PcHatSignaturEinheit, True)
            If PcHatSignaturEinheit Then
                Dim KundNr = GetBarrechnungKundNr()
                Dim existOffenVorgangNummmer = ExistiertNichtAbgeschlossenVorgang(VorgangTyp:=VorgangTypen.AR, KundNr:=KundNr)
                If existOffenVorgangNummmer > 0 Then
                    Dim msgStop = String.Format(Messages.ModulePOSPrinter_Vorgang_Offen, existOffenVorgangNummmer)
                    'MsgBox(msgStop, vbCritical)
                    UserMessagePopUp("Monatsbeleg", msgStop, vbCritical)
                    formtoOpen.LadeVorgangNummer(VorgangTypen.AR, existOffenVorgangNummmer, True)
                    RaiseEvent_PostMsgEvent(msgStop, vbCritical)
                    Return
                End If

                Dim checkMonatsBelegGedruckt = ModulePOSPrinter.CheckMonatsBelegGedruckt()
                RaiseEvent_PostMsgEvent(checkMonatsBelegGedruckt.Message, vbInformation)
                'If Not checkMonatsBelegGedruckt.Result Then
                '   LadeVorgangNummer(VorgangTyp.AR, existVorgangNummmer)
                'End If
            End If
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    ''' <summary>
    ''' Warnungen für die Registrierkasse 
    ''' </summary>
    ''' <remarks></remarks>
    Function CheckRegistrierkasse() As String
        Dim letzteNummer = FirstRow("Select Nummer from buchVorgang where Typ='AR' and abgeschlossen<>0 order by Datum desc limit 1 ")
        If IsNumeric(letzteNummer) Then
            Dim beleg = regKassa.LadeBeleg(letzteNummer)
            If beleg IsNot Nothing Then
                If beleg.Bemerkung IsNot Nothing Then
                    If beleg.Bemerkung.Contains("Monatsbeleg") Or beleg.Bemerkung.Contains("Startbeleg") Then
                        Return Nothing
                    End If
                End If
                Return beleg.Bemerkung
            End If
        End If
        Return Nothing
    End Function

End Module
