Beschreibung
Der folgende Skript prüft alle 5 Minuten den Ordner "Posteingang\UPS" in Outlook und sucht dort nach Zustellbenachrichtigungen. Wird eine Benachrichtigung gefunden, so wird die Auftragsnummer und Paketnummer mit Aufträgen in der Datenbank verglichen und die Email bei Übereinstimmung in das Dokumentenverzeichnis des entsprechenden Auftrags kopiert. Anschließend wird die Email als "abgeschlossen" und "gelesen" gekennzeichnet. Wird keine Übereinstimmung gefunden, wird die Email als "zu erledigen" gekennzeichnet.
Voraussetzung
Auftragsverwaltung ab Version 12.1.6
Ablauf des Skripts
1. Nach dem Start der Auftragsverwaltung wir der Skript sofort ausgeführt.
2. Prüfen des Ordners Posteingang\UPS in Outlook auf Emails ohne Kennzeichnung.
3. Suchen von Paketnummer, Auftragsnummer und Referenznummer 2 in der Email
4. Speichern der Email im Dokumentenordner des Auftrags falls ein passender Auftrag gefunden wurde.
5. Änderung des Email-Status auf "gelesen" und "abgeschlossen" wenn Auftrag gefunden wurde.
6. Änderung des Email-Status auf "zu erledigen" wenn Auftrag nicht gefunden wurde.
7. Wiederholung ab Schritt 2 im Hintergrund alle 5 Minuten.
Installation
Der Skript muss sich im Ordner "[Datenpfad]\Skripts\Autostart" befinden.
Skript
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Styletronix.AuftragsverwaltungV2.Common
Imports Styletronix.AuftragsverwaltungV2
Imports Styletronix.AuftragsverwaltungV2.IPC
Imports Styletronix
Imports Styletronix.Threading.Thread_Manager
Namespace LagerstandAbfrage
Public Class DynamicCode
Implements IPC.IPluginDetails
Implements IPC.ICommonPlugIn
#Region "Deklarationen"
Private Timer1 As Timers.Timer
Private _Host As Object
Private bgTask As BGThread
#End Region
#Region "PluginDetails"
Public ReadOnly Property Plugin_Company As String Implements IPC.IPluginDetails.Plugin_Company
Get
Return "Styletronix.net"
End Get
End Property
Public ReadOnly Property Plugin_Description As String Implements IPC.IPluginDetails.Plugin_Description
Get
Return "UPS Abliefernachweis aus Outlook importieren"
End Get
End Property
Public ReadOnly Property Plugin_Icon As System.Drawing.Image Implements IPC.IPluginDetails.Plugin_Icon
Get
Return Nothing
End Get
End Property
Public ReadOnly Property Plugin_Name As Object Implements IPC.IPluginDetails.Plugin_Name
Get
Return "UPS Abliefernachweis aus Outlook importieren"
End Get
End Property
Public ReadOnly Property Plugin_Version As System.Version Implements IPC.IPluginDetails.Plugin_Version
Get
Return New Version(1, 0, 0)
End Get
End Property
#End Region
#Region "CommonPlugIn"
Public Sub Initialize(Host As Object) Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.Initialize
Me._Host = Host
Me.Timer1 = New Timers.Timer(1000 * 1)
Me.Timer1.Start()
AddHandler Me.Timer1.Elapsed, AddressOf Timer1_Elapsed
End Sub
Public ReadOnly Property Plugin_HasConfigMenu As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.Plugin_HasConfigMenu
Get
Return False
End Get
End Property
Public Sub ShowConfigMenu() Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShowConfigMenu
Throw New NotImplementedException
End Sub
Public Function ShutDown() As Boolean Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDown
Me.Timer1.Stop()
If Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive Then
Me.bgTask.Cancel()
End If
Return True
End Function
Public Function ShutDownRequest() As AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result Implements AuftragsverwaltungV2.IPC.ICommonPlugIn.ShutDownRequest
If Not Me.bgTask Is Nothing AndAlso Me.bgTask.Thread.IsAlive Then
Me.bgTask.Cancel()
End If
Return New AuftragsverwaltungV2.IPC.ICommonPlugIn.Shutdown_Result With {.Cancel = False}
End Function
#End Region
Private Sub Timer1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs)
Me.Timer1.Interval = 1000 * 60 * 5
If Me.bgTask Is Nothing OrElse Me.bgTask.Thread.IsAlive = False Then
Me.bgTask = New BGThread
Styletronix.Threading.Thread_Manager.Instance.AddThread(Me.bgTask)
End If
Me.Timer1.Start()
End Sub
Private Class BGThread
Implements Styletronix.Threading.Thread_Manager.IThread
''' <summary>
''' Hier wird die eigentliche Funktion ausgeführt. Alles andere ist nur zur Initialisierung."
''' </summary>
''' <remarks></remarks>
Public Sub DoWork() Implements Styletronix.Threading.Thread_Manager.IThread.DoWork
Try
Dim Count As Int64 = 0
RaiseEvent Thread_Progress_Changed(Me, 0, "Verbinde zu Outlook...")
'Verbindung zu Outlook herstellen
Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application
'Zugriff zu Outlook über Redemption herstellen
Dim RDOSession = Global.Styletronix.AuftragsverwaltungV2.Common.Redemption.RedemptionLoader.new_RDOSession
RDOSession.MAPIOBJECT = OutlookApp.Session.MAPIOBJECT
RaiseEvent Thread_Progress_Changed(Me, 0, "Öffne Ordner in Outlook...")
'Ordner für Emails auswählen. Die Mails werden dort per Regel in Outlook einsortiert.
Dim Folder = RDOSession.GetFolderFromPath("Posteingang\UPS")
If Folder Is Nothing Then GoTo ende
RaiseEvent Thread_Progress_Changed(Me, 0, "Prüfe Emails...")
For Each element As Object In Folder.Items
Count += 1
RaiseEvent Thread_Progress_Changed(Me, 0, String.Format("Prüfe Email {0} ...", Count))
If Me._Cancel Then GoTo ende
'Prüfen, ob es sich um ein Email Element handelt
Dim Mail As Redemption.RDOMail = TryCast(element, Redemption.RDOMail)
If Not Mail Is Nothing Then
Try
'Betreff und Kennzeichnung der Email prüfen
If Mail.Subject.ToLower.StartsWith("UPS - ".ToLower) AndAlso Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olNoFlag Then
Dim txt = Mail.Body
Dim Kontrollnummer As String = ""
Dim Auftragnummer As String = ""
'Nach UPS Kontrollnummer in der Email suchen
Dim ret As Text.RegularExpressions.Match = Text.RegularExpressions.Regex.Match(txt, "Kontrollnummer:\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)
If ret.Success Then
Kontrollnummer = ret.Groups(1).Value
End If
'Nach Auftragsnummer in der Email suchen
ret = Text.RegularExpressions.Regex.Match(txt, "Auftragsnummer\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)
If ret.Success Then
Auftragnummer = ret.Groups(1).Value
End If
'Falls Auftragsnummer nicht angegeben wurde nach der Referneznummer 2 suchen
If String.IsNullOrWhiteSpace(Auftragnummer) Then
ret = Text.RegularExpressions.Regex.Match(txt, "Referenznummer 2:\s*(\w*)\s*", Text.RegularExpressions.RegexOptions.IgnoreCase Or Text.RegularExpressions.RegexOptions.Multiline)
If ret.Success Then
Auftragnummer = ret.Groups(1).Value
End If
End If
Dim MailOK As Boolean = False
'Auftrag mit der Kontrollnummer suchen
If Not String.IsNullOrWhiteSpace(Kontrollnummer) Then
Using dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)
Dim Aufträge As System.Linq.IQueryable(Of tbl_Auftrag) = From a In dc.tbl_Auftrag Where a.Paketnummer = Kontrollnummer
For Each Auftrag As tbl_Auftrag In Aufträge
'Dateiname für die Email festlegen
Dim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"
Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)
'Email speichern
Mail.SaveAs(Datei)
MailOK = True
Next
End Using
End If
'Auftrag anhand von Auftragsnummer suchen, falls der Auftrag anhand der Kontrollnummer nicht gefunden wurde.
If Not MailOK AndAlso Not String.IsNullOrWhiteSpace(Auftragnummer) Then
Dim p = Gemeinsam.ParseNummer(Auftragnummer)
If Not p.AuftragID Is Nothing AndAlso p.AuftragID > 0 Then
Dim AuftragID As Int64 = p.AuftragID
Using dc As New DC_AllgemeinDataContext(Einstellungen.SQL_Verbindungszeichenfolge)
Dim Auftrag As tbl_Auftrag = (From a In dc.tbl_Auftrag Where a.ID = AuftragID).FirstOrDefault
If Not Auftrag Is Nothing Then
'Dateiname für die Email festlegen
Dim Datei = Gemeinsam.Aufträge.GetDocumentFolder(Auftrag.ID) & "\" & Mail.Subject & ".msg"
Datei = Styletronix.Utils.Files.GetNotUsedFileName(Datei)
'Email speichern
Mail.SaveAs(Datei)
MailOK = True
'Falls dem Auftrag keine Paketnummer zugewiesen wurde, wird die UPS Kontrollnummer eingesetzt.
If Not String.IsNullOrWhiteSpace(Kontrollnummer) AndAlso String.IsNullOrWhiteSpace(Auftrag.Paketnummer) Then
Auftrag.Paketnummer = Kontrollnummer
dc.SubmitChanges()
End If
End If
End Using
End If
End If
If MailOK Then
'Wenn Auftrag gefunden wurde, den Status der Mail auf "Abgeschlossen" setzen und als "gelesen"kennzeichnen.
Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagComplete
Mail.UnRead = False
Else
'Wenn Auftrag nicht gefunden wurde den Status der Mail auf "Zu Erledigen" setzen.
Mail.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagMarked
End If
'Änderungen an der Email speichern.
Mail.Save()
End If
Catch ex As Exception
'Bei Fehler einen Eintrag im Log durchführen.
RaiseEvent Thread_Log_NewEntry(Me, "Fehler", String.Format("Fehler bei Prüfung der Mail {0}", Mail.Subject), ex, System.Diagnostics.EventLogEntryType.Warning)
End Try
End If
Next
ende:
RaiseEvent Thread_Progress_Changed(Me, 100, "Beenden...")
RDOSession = Nothing
OutlookApp = Nothing
Catch ex As Exception
'Bei Fehler einen Eintrag im Log durchführen.
RaiseEvent Thread_Log_NewEntry(Me, "Fehler", ex.Message, ex, System.Diagnostics.EventLogEntryType.Error)
End Try
'Nach dem Abschluss MUSS "Thread_Completed" aufgerufen werden, um die Statusanzeige in der Auftragsverwaltung zu bereinigen."
RaiseEvent Thread_Completed(Me, Nothing)
End Sub
#Region "IThread implementierung"
Public ReadOnly Property AllowCancel As Boolean Implements Styletronix.Threading.Thread_Manager.IThread.AllowCancel
Get
Return True
End Get
End Property
Private _BarSubItem As DevExpress.XtraBars.BarSubItem
Public Property BarSubItem As DevExpress.XtraBars.BarSubItem Implements Styletronix.Threading.Thread_Manager.IThread.BarSubItem
Get
Return Me._BarSubItem
End Get
Set(value As DevExpress.XtraBars.BarSubItem)
Me._BarSubItem = value
End Set
End Property
Private _Cancel As Boolean
Public Sub Cancel() Implements Styletronix.Threading.Thread_Manager.IThread.Cancel
Me._Cancel = True
End Sub
Public ReadOnly Property Caption As String Implements Styletronix.Threading.Thread_Manager.IThread.Caption
Get
Return "UPS Abliefernachweis aus Outlook importieren."
End Get
End Property
Private _Thread As System.Threading.Thread
Public Property Thread As System.Threading.Thread Implements Styletronix.Threading.Thread_Manager.IThread.Thread
Get
Return Me._Thread
End Get
Set(value As System.Threading.Thread)
value.SetApartmentState(System.Threading.ApartmentState.STA)
Me._Thread = value
End Set
End Property
Public Event Thread_Completed(sender As Object, Result As Object) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Completed
Public Event Thread_Log_NewEntry(sender As Object, Caption As String, Message As String, Exception As Object, Status As System.Diagnostics.EventLogEntryType) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Log_NewEntry
Public Event Thread_Progress_Changed(sender As Object, Progress As Integer, StatusText As String) Implements Styletronix.Threading.Thread_Manager.IThread.Thread_Progress_Changed
#End Region
End Class
End Class
End Namespace