Imports Microsoft.Office.Interop

Public Class frmFaktSammelRgDrucken

    Dim Sammelrechung = -1
    Dim Firma = 1
    Dim loaded = False

    Sub New()

        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()

        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.

    End Sub

    Sub New(Firma)

        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()

        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
        Me.Firma = Firma
    End Sub

    Private Sub RadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton.CheckedChanged, RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged, RadioButton4.CheckedChanged, RadioButton6.CheckedChanged
        lblSB.Visible = False : cboSB.Visible = False
        cboSB.changeItem("")
        If DirectCast(sender, RadioButton).Checked Then Sammelrechung = sender.tag
        Select Case Sammelrechung
            Case 1 : txtZeitraumBis.Text = Now.AddDays(-1).ToShortDateString
            Case 2 'txtZeitraumBis.Text = CDate(Now.ToString("01.MM.yyyy")).AddDays(-1)
                If Now.Day > 15 Then
                    txtZeitraumBis.Text = CDate(Now.ToString("15.MM.yyyy"))
                Else
                    txtZeitraumBis.Text = CDate(Now.ToString("01.MM.yyyy")).AddDays(-1)
                End If
            Case 3 : txtZeitraumBis.Text = CDate(Now.ToString("01.MM.yyyy")).AddDays(-1)
            Case 4 ': txtZeitraumBis.Text = CDate(Now.ToString("01.MM.yyyy")).AddDays(-1) '???
                If Now.Day >= 20 Then
                    txtZeitraumBis.Text = CDate(Now.ToString("20.MM.yyyy"))
                ElseIf Now.Day >= 10 Then
                    txtZeitraumBis.Text = CDate(Now.ToString("10.MM.yyyy")).AddDays(-1)
                Else
                    txtZeitraumBis.Text = CDate(Now.ToString("01.MM.yyyy")).AddDays(-1)
                End If
            Case 5 : txtZeitraumBis.Text = Now.AddDays((Now.DayOfWeek) * -1).ToShortDateString
                'Case 6 : txtZeitraumBis.Text = Now.AddDays(-1).ToShortDateString
            Case 7 : txtZeitraumBis.Text = Now.ToShortDateString : lblSB.Visible = True : cboSB.Visible = True : cboSB.changeItem(VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME)
        End Select
        initDGV()
    End Sub


    Sub initDGV()
        With MyDatagridview1
            Dim whereAbfArt = ""
            If cboAbfertigungsart._value <> "" Then whereAbfArt = " AND (SELECT Abfertigungsart FROM Speditionsbuch WHERE Speditionsbuch.FilialenNr=Rechnungsausgang.FilialenNr and Speditionsbuch.AbfertigungsNr=Rechnungsausgang.AbfertigungsNr and Speditionsbuch.UnterNr=Rechnungsausgang.SpeditionsbuchUnterNr)='" & cboAbfertigungsart._value & "'  "

            Dim sqlStr = " SELECT Rechnungsausgang.RechnungsKundenNr, max(Rechnungsausgang.[RechnungsName 1]) as [RechnungsName 1]," & If(Sammelrechung = 7, "AvisoId", "0") & " as AvisoId,max(Rechnungsausgang.[RechnungsLandKz]) as [RechnungsLandKz] , count(*) as Anzahl" & If(Sammelrechung = 7, ",max([LKW Kennzeichen]) as LKW", "") & " 
                            ,(SELECT CASE WHEN Rechnungsdruck =0 THEN 'POST' WHEN Rechnungsdruck=1 THEN 'FAX' WHEN Rechnungsdruck=2 THEN 'E-MAIL' ELSE '-' END FROM Adressen WHERE AdressenNr=Rechnungsausgang.RechnungsKundenNr ) as Rechnungsdruck 
                             FROM Rechnungsausgang  
	                         WHERE Rechnungsausgang.Status IN (0,2) And Rechnungsausgang.Firma_ID = '" & cboFirma._value & "' And Rechnungsausgang.Sammelrechnung = '" & Sammelrechung & "' And CONVERT(DATE,Rechnungsausgang.Abfertigungsdatum,104) <= '" & txtZeitraumBis._value & "'
                                " & If(Sammelrechung = 7 And cboSB._value <> "", " AND Rechnungsausgang.Sachbearbeiter='" & cboSB._value & "' ", "") & "
                                " & whereAbfArt & "
                                AND Rechnungsausgang.FakturierungsGruppe='" & cboFaktGrp._value & "' 
                              GROUP BY RechnungsKundenNr " & If(Sammelrechung = 7, ",AvisoId", "") & "
                              ORDER BY Rechnungsausgang.RechnungsKundenNr "
            'Rechnungsausgang.Status IN (0,2) --> vormals nur 2
            .SET_SQL(sqlStr, "FMZOLL")
            .LOAD()
            .Columns("RechnungsKundenNr").Width = 120
            .Columns("RechnungsKundenNr").HeaderText = "KundenNr"
            .Columns("RechnungsName 1").HeaderText = "Firma"
            .Columns("RechnungsLandKz").Visible = False
            .Columns("Anzahl").Width = 42
            .Columns("Rechnungsdruck").Width = 80
            .Columns("Rechnungsdruck").HeaderText = "Rg.Art"
            .Columns("Rechnungsdruck").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns("Anzahl").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            .Columns(2).Visible = False
            If .Columns.Count = 7 Then
                .Columns("LKW").Width = 80
            End If

            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            .ClearSelection()
        End With
    End Sub

    Private Sub frmFaktSammelRgDrucken_Load(sender As Object, e As EventArgs) Handles Me.Load
        txtZeitraumBis.Text = Now.ToShortDateString
        txtRechnungsdatum.Text = Now.ToShortDateString

        cboAbfertigungsart.fillWithSQL("SELECT Abfertigungsart,[Abfertigungsbezeichnung] FROM [Abfertigungsarten] ORDER BY Abfertigungsart  ", True, "FMZOLL", True)

        Dim FirmaTmp = VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
        If VERAG_PROG_ALLGEMEIN.cBerechtignunen.CHECK_BERECHTIGUNG_bool("OFFERTE_FREMD_VERAGIMEX", "SDL") Then
            FirmaTmp = "VERAGIMEX"
        End If

        Select Case FirmaTmp
            Case "VERAG"
                cboFirma.fillWithSQL("Select [Firma_ID], [Firma_Bez]  FROM  [tblFirma] WHERE Firma_ID<>20", False, "FMZOLL")
                cboFirma.changeItem("1")
                cboSB.fillWithSQL("SELECT [mit_username] FROM [tblMitarbeiter] where mit_firma IN ('VERAG'" & If(VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME = "ADMIN", ",'ALL'", "") & ") and mit_gekuendigt=0 AND  (mit_abteilung IN ('VRR','BH')	OR [mit_id] IN (SELECT  [beroz_bergrId]  FROM [tblBerechtigungsObjekteZuordnung]  where [beroz_beroId]=90 AND  beroz_art='B')) order by mit_username", False, "ADMIN", True)
        Case "IMEX"
                cboFirma.fillWithSQL("SELECT [Firma_ID],[Firma_Bez]  FROM  [tblFirma] WHERE Firma_ID=20", False, "FMZOLL")
                cboFirma.changeItem("20")
                cboSB.fillWithSQL("SELECT [mit_username] FROM [tblMitarbeiter] where  mit_firma='IMEX'  and mit_gekuendigt=0 AND  (mit_abteilung IN ('VRR','BH')	OR (SELECT COUNT(*)  FROM [tblBerechtigungsObjekteZuordnung]  where [beroz_beroId]=90 AND [beroz_bergrId]=[mit_id] AND beroz_art='B')>0) order by mit_username", False, "ADMIN", True)
            Case "UNISPED"
                cboFirma.fillWithSQL("SELECT [Firma_ID],[Firma_Bez]  FROM  [tblFirma] WHERE Firma_ID IN (21,22,23) ", False, "FMZOLL")
                cboFirma.changeItem("20")
                cboSB.fillWithSQL("SELECT [mit_username] FROM [tblMitarbeiter] where  mit_firma='UNISPED'  and mit_gekuendigt=0 AND  (mit_abteilung IN ('VRR','BH')	OR (SELECT COUNT(*)  FROM [tblBerechtigungsObjekteZuordnung]  where [beroz_beroId]=90 AND [beroz_bergrId]=[mit_id] AND beroz_art='B')>0) order by mit_username", False, "ADMIN", True)
            Case "VERAGIMEX"
                cboFirma.fillWithSQL("SELECT [Firma_ID],[Firma_Bez]  FROM  [tblFirma] ", False, "FMZOLL")
                Select Case VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA
                    Case "VERAG" : cboFirma.changeItem("1")
                    Case "IMEX" : cboFirma.changeItem("20")
                End Select
                cboSB.fillWithSQL("SELECT [mit_username] FROM [tblMitarbeiter] where mit_firma IN ('IMEX','VERAG'" & If(VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME = "ADMIN", ",'ALL'", "") & ") and mit_gekuendigt=0 AND  (mit_abteilung IN ('VRR','BH')	OR [mit_id] IN (SELECT  [beroz_bergrId]  FROM [tblBerechtigungsObjekteZuordnung]  where [beroz_beroId]=90 AND  beroz_art='B')) order by mit_username", False, "ADMIN", True)
        End Select
        '  cboFirma.fillWithSQL("SELECT  [Firma_ID],[Firma_Bez] FROM [tblFirma] WHERE Firma_ID NOT IN(3) ORDER BY Firma_ID  ", True, "FMZOLL")
        cboFirma.changeItem(Firma)
        cboSB.changeItem(VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME)


        cboFaktGrp.Items.Clear()
        cboFaktGrp.fillWithSQL("SELECT [Code],[Bezeichnung] FROM tblFakturierungsgruppe", False, "ADMIN", False)
        cboFaktGrp.changeItem(VERAG_PROG_ALLGEMEIN.cAllgemein.MITARBEITER.mit_fakturierungsgruppe)

        cProgramFunctions.initDrucker(cboPrinter)

        RadioButton.Checked = True
        loaded = True
        initDGV()
    End Sub

    Private Sub txtRechnungsdatum_TextChanged(sender As Object, e As EventArgs) Handles txtRechnungsdatum.Leave, cboFirma.SelectedIndexChanged, txtZeitraumBis.Leave, cboSB.SelectedIndexChanged
        initDGV()
    End Sub

    Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
        doSammelrechnung(1)
    End Sub

    Function getSelectionKdNr() As String
        getSelectionKdNr = ""
        If MyDatagridview1.SelectedRows.Count > 0 Then
            If MyDatagridview1.SelectedRows.Count = MyDatagridview1.Rows.Count Then Return "" ' Alle ausgewählt

            For Each r As DataGridViewRow In MyDatagridview1.SelectedRows
                getSelectionKdNr &= r.Cells("RechnungsKundenNr").Value & ","
            Next
            getSelectionKdNr = getSelectionKdNr.Substring(0, getSelectionKdNr.Length - 1)
        End If
    End Function

    Function getSelectionKdNr_Simple() As String
        If MyDatagridview1.Rows.Count = 1 Then Return MyDatagridview1.Rows(0).Cells("RechnungsKundenNr").Value
        If MyDatagridview1.SelectedRows.Count = 1 Then Return MyDatagridview1.SelectedRows(0).Cells("RechnungsKundenNr").Value

        If MyDatagridview1.Rows.Count > 0 Then ' Wenn alle gliech sind, dann wir die KdNr zurückgegben
            Dim kdTmp = MyDatagridview1.Rows(0).Cells("RechnungsKundenNr").Value
            For Each r As DataGridViewRow In MyDatagridview1.SelectedRows
                If r.Cells("RechnungsKundenNr").Value <> kdTmp Then Return ""
            Next
            Return kdTmp
        End If
        Return ""
    End Function


    Function getSelectionLandKz() As String
        getSelectionLandKz = ""
        If MyDatagridview1.Rows.Count > 0 Then
            If MyDatagridview1.SelectedRows.Count > 0 Then
                For Each r As DataGridViewRow In MyDatagridview1.SelectedRows
                    If r.Cells("RechnungsLandKz").Value IsNot DBNull.Value Then
                        If getSelectionLandKz = "" Then
                            getSelectionLandKz = r.Cells("RechnungsLandKz").Value
                        Else
                            If getSelectionLandKz <> r.Cells("RechnungsLandKz").Value Then
                                Return ""
                            End If
                        End If
                    End If
                Next
            Else
                For Each r As DataGridViewRow In MyDatagridview1.Rows
                    If r.Cells("RechnungsLandKz").Value IsNot DBNull.Value Then
                        If getSelectionLandKz = "" Then
                            getSelectionLandKz = r.Cells("RechnungsLandKz").Value
                        Else
                            If getSelectionLandKz <> r.Cells("RechnungsLandKz").Value Then
                                Return ""
                            End If
                        End If
                    End If
                Next
            End If
        End If
    End Function


    Private Sub MyDatagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles MyDatagridview1.SelectionChanged
        '        MyDatagridview1.ClearSelection()
    End Sub

    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
        doSammelrechnung(3)
    End Sub

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click, Button2.Click

        If Not IsNumeric(getSelectionKdNr_Simple) Then MsgBox("Es muss eine eindeutige KundenNr ausgewählt werden!") : Exit Sub

        'RG-Druck - Mail (+Kopie)
        Dim RG_DRUCK = 2
        If sender Is Button2 Then
            RG_DRUCK = 5
        End If

        Dim f As New frmFaktEmail(cboFirma._value, Sammelrechung, CDate(txtZeitraumBis.Text), CDate(txtRechnungsdatum.Text), cboPrinter.Text, RG_DRUCK, cbxEinzelAnlagen.Checked, cbxSammelbericht.Checked, getSelectionKdNr_Simple, -1, Nothing, cboSB._value,, getAvisoIds, cbxEVOLOG.Checked, cbxTransFerry.Checked, cboFaktGrp._value, cboAbfertigungsart._value)
        f.ShowDialog(Me)
        initDGV()
        'Else
        '    doSammelrechnung(2)
        'End If
    End Sub

    Function getAvisoIds() As List(Of Integer)
        If Sammelrechung <> 7 Then Return Nothing
        Dim AvisoIds As New List(Of Integer)
        If MyDatagridview1.SelectedRows.Count > 0 Then
            For Each r In MyDatagridview1.SelectedRows
                If r.cells("AvisoId").value Is DBNull.Value Then
                    MsgBox("Nich alle Speditionsbcuheinträge haben eine Aviso-Id. LKW Abrechnung wird abgebrochen.") : Return (New List(Of Integer))
                End If
                AvisoIds.Add(r.cells("AvisoId").value)
            Next
        End If
        Return AvisoIds
    End Function

    Sub doSammelrechnung(ausgabeArt As Integer, Optional vorschau As Boolean = False)
        Try
            If cboFirma._value = "" Then MsgBox("Bitte Firma angeben!") : Exit Sub
            If txtZeitraumBis.Text = "" Then MsgBox("Bitte Zeitraum-Bis angeben!") : Exit Sub
            If txtRechnungsdatum.Text = "" Then MsgBox("Bitte Rechnungsdatum angeben!") : Exit Sub

            Me.Enabled = False
            Me.Cursor = Cursors.WaitCursor
            Dim listPDFs As New List(Of String)
            Dim SonstAnlagen As New List(Of String)
            Dim RechnungsNrisSet As Boolean = False
            RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(cboFirma._value, Sammelrechung, CDate(txtZeitraumBis.Text), CDate(txtRechnungsdatum.Text), cboPrinter.Text, cbxEinzelAnlagen.Checked, cbxSammelbericht.Checked, getSelectionKdNr, If(ausgabeArt = 1, -1, 4), listPDFs, cboSB._value,,, getAvisoIds, cbxEVOLOG.Checked, SonstAnlagen, vorschau, cbxTransFerry.Checked, cboFaktGrp._value, cboAbfertigungsart._value)

            '-------------- für PDF-Sammel-Rechnung -------------- 

            If Not RechnungsNrisSet Then
                initDGV()
                Me.Enabled = True
                Me.Cursor = Cursors.Default
                Exit Sub
            End If


            If cbxZusammenfassen.Checked Then ' Gibt an, ob mehrere Sammelrechnung zusammengefasst werden sollten

                Select Case ausgabeArt
                    Case 2 'MAIL 
                        If listPDFs.Count > 0 Then
                            Try
                                Dim outl As New Outlook.Application
                                Dim Mail As Microsoft.Office.Interop.Outlook.MailItem
                                Mail = outl.CreateItem(0)
                                Mail.Subject = "VERAG Sammel-Rechnung"
                                Mail.HTMLBody = getSammelRgTExt(getSelectionLandKz)
                                If IsNumeric(getSelectionKdNr) Then Mail.To = VERAG_PROG_ALLGEMEIN.cKundenKontakte.getMailAdress(CInt(getSelectionKdNr()), "Rechnung an")
                                For Each pdf In listPDFs
                                    Mail.Attachments.Add(pdf, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue)
                                Next
                                For Each pdf In SonstAnlagen
                                    Mail.Attachments.Add(pdf, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue)
                                Next
                                Mail.Display()
                            Catch ex As Exception
                                MsgBox("Fehler beim Öffnen des Mail-Programmes.") ' PDF wird geöffnet!")
                                '  Process.Start(pdf)
                            End Try
                        End If
                    Case 3 'PDF + öffnen
                        Dim pathPDF = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("VERAG_Sammelrechnung.pdf", ".pdf", False, False)
                        If FormularManagerNEU.MergePdfFiles(listPDFs, pathPDF) Then
                            Process.Start(pathPDF)
                        Else
                            MsgBox("Fehler beim zusammenführen der PDFs.")
                        End If
                End Select

            Else 'nein (Standard)
                Select Case ausgabeArt
                    Case 2 'MAIL 
                        If listPDFs.Count > 0 Then
                            For Each pdf In listPDFs
                                Try
                                    Dim outl As New Outlook.Application
                                    Dim Mail As Microsoft.Office.Interop.Outlook.MailItem
                                    Mail = outl.CreateItem(0)
                                    Mail.Subject = "VERAG Sammel-Rechnung"
                                    If IsNumeric(getSelectionKdNr) Then Mail.To = VERAG_PROG_ALLGEMEIN.cKundenKontakte.getMailAdress(CInt(getSelectionKdNr()), "Rechnung an")
                                    Mail.HTMLBody = getSammelRgTExt(getSelectionLandKz) '  Sehr geehrte Damen und Herren,<br><br>anbei erhalten Sie Ihre Sammel-Rechnung."
                                    Mail.Attachments.Add(pdf, Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue)
                                    Mail.Display()
                                Catch ex As Exception
                                    MsgBox("Fehler beim Öffnen des Mail-Programmes. PDF wird geöffnet!")
                                    Process.Start(pdf)
                                End Try
                            Next

                        End If
                    Case 3 'PDF + öffnen
                        For Each pdf In listPDFs
                            Process.Start(pdf)
                        Next
                        For Each pdf In SonstAnlagen
                            Process.Start(pdf)
                        Next
                End Select
            End If
            '-------------- ENDE -------------- 

        Catch ex As Exception
            MsgBox(ex.Message & ex.StackTrace)
        End Try
        initDGV()
        Me.Enabled = True
        Me.Cursor = Cursors.Default
    End Sub

    Function getSammelRgTExt(RechnungsLandKz) As String

        If RechnungsLandKz = "" Then

            getSammelRgTExt = "Sehr geehrte Damen und Herren,<br>"
            getSammelRgTExt &= "Dear Ladies and Gentlemen,<br>"
            getSammelRgTExt &= "Sayin Bayanlar ve Baylar,<br>"
            getSammelRgTExt &= "<br>"
            getSammelRgTExt &= "im Anhang senden wir Ihnen die o.g. Rechnung.<br>"
            getSammelRgTExt &= "attached we send you the invoice mentioned above.<br>"
            getSammelRgTExt &= "ekte baslikta yazan faturayi bulabilirsinz.<br>"
            getSammelRgTExt &= "<br>"
            getSammelRgTExt &= "<br><br><br>Mit freundlichen Grüßen / Best regards / Saygilarimizla<br><br>VERAG Spedition AG<br><br>" & cFakturierung.getSignature(RechnungsLandKz, cboFirma._value)
            Return "<div style=""font-family:Calibri, Arial"">" & getSammelRgTExt & "</div>"
        End If

        Select Case RechnungsLandKz
            Case "TR"
                getSammelRgTExt = "Sayin Bayanlar ve Baylar,<br><br>ekte baslikta yazan faturayi bulabilirsinz."
                getSammelRgTExt &= "<br><br><br>Saygilarimizla<br><br>VERAG Spedition AG<br><br>" & cFakturierung.getSignature(RechnungsLandKz, cboFirma._value)
            Case "A", "AT", "D", "DE", "CH"
                getSammelRgTExt = "Sehr geehrte Damen und Herren,<br><br>im Anhang senden wir Ihnen die o.g. Rechnung."
                getSammelRgTExt &= "<br><br><br>Mit freundlichen Grüßen<br><br>VERAG Spedition AG<br><br>" & cFakturierung.getSignature(RechnungsLandKz, cboFirma._value)
            Case Else
                getSammelRgTExt = "Dear Ladies and Gentlemen,<br><br>attached we send you the invoice mentioned above."
                getSammelRgTExt &= "<br><br><br>Best regards<br><br>VERAG Spedition AG<br><br>" & cFakturierung.getSignature(RechnungsLandKz, cboFirma._value)
        End Select

        getSammelRgTExt = "<div style=""font-family:Calibri, Arial"">" & getSammelRgTExt & "</div>"
    End Function
    Private Sub lkl_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles lkl.LinkClicked
        MyDatagridview1.ClearSelection()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        doSammelrechnung(3, True)
    End Sub

    Private Sub cboFaktGrp_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboFaktGrp.SelectedIndexChanged
        initDGV()
    End Sub

    Private Sub cboAbfertigungsart_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboAbfertigungsart.SelectedIndexChanged
        initDGV()
    End Sub
End Class