Imports System.IO
Module ArdisTextMapper
Private bestandsNaam As String
Private writer As System.IO.StreamWriter = Nothing
Public Sub stopArdisTextOpslag()
If writer IsNot Nothing Then
writer.Close()
End If
writer = Nothing
bestandsNaam = Nothing
End Sub
Private Sub startNieuweArdisDataOpslag(pathNaarMap As String)
LogBestandTextMapper.WriteToFile("ArdisText", "Starten van nieuwe dataopslag van text bestand")
Dim regDate As Date = Date.Now()
Dim datum As String = regDate.ToString("yyyy-MM-dd")
Dim uren As String = regDate.ToString("HH-mm-ss")
bestandsNaam &= datum & "_" & uren & ".txt"
Try
Dim fullPath As String = Path.Combine(pathNaarMap, bestandsNaam)
System.IO.File.WriteAllText(fullPath, "")
writer = My.Computer.FileSystem.OpenTextFileWriter(fullPath, True)
'header (wordt genegeerd door ardis)
writer.WriteLine("Rol" & vbTab & "Aantal" & vbTab & "PlaatMateriaal" & vbTab & "Barcode" & vbTab & "LadeSequentieNr" & vbTab & "DossierCode" & vbTab & "ExtraInfo" & vbTab & "Lengte" & vbTab & "Breedte" & vbTab & "Dikte" & vbTab & "Kleur" & vbTab & "Decor" & vbTab & "EtiketLijn1" & vbTab & "EtiketLijn2" & vbTab & "EtiketLijn3" & vbTab & "EtiketInfo" & vbTab & "EtiketLijn4" & vbTab & "Rework" & vbTab & "Kar" & vbTab & "Banding" & vbTab & "KamerfreesTrayId" & vbTab & "KamerfreesSlotNr")
LogBestandTextMapper.WriteToFile("ArdisText", "Starten van nieuwe dataopslag van text bestand", True)
Catch ex As Exception
Throw New Exception("Ardis text bestand kon niet worden aangemaakt " & ex.Message)
End Try
End Sub
Public Sub opslaan(type As ItemType, ardisdata As ArdisData, Optional trayNummer As String = "", Optional slotNummer As String = "")
Dim typeNaam As String = EnumMapper.GeefArdisTextBijItemType(type)
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag " & typeNaam & " met ardisData")
bestandsNaam = "ImportFile_" & typeNaam & "_"
If writer Is Nothing Then
startNieuweArdisDataOpslag(Configs.ardisPathTextFile())
End If
opslaan(ardisdata, trayNummer, slotNummer)
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag " & typeNaam & " met ardisData", True)
End Sub
'opslaan van de sifonladen die verwerkt gaan worden voor ze verwerkt zijn
Public Sub opslaanSifonLadeVoorVerwerking(ardisdata As ArdisData, bestandsNaamSifon As String)
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag sifon lade voor verwerking met barcode: " & ardisdata.PartCalc)
bestandsNaam = bestandsNaamSifon.Replace(".txt", "") & "_Verwerkt_Sifon_"
If writer Is Nothing Then
startNieuweArdisDataOpslag(Configs.sifonLadeGeefVerplaatsFolderPath)
End If
opslaan(ardisdata, "", "")
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag sifon lade voor verwerking met barcode: " & ardisdata.PartCalc, True)
End Sub
'opslaan van de spoelbakLaden die verwerkt gaan worden voor ze verwerkt zijn
Public Sub opslaanSpoelbakLadeVoorVerwerking(ardisdata As ArdisData, bestandsNaamSpoelbak As String)
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag spoelbak lade voor verwerking met barcode: " & ardisdata.PartCalc)
bestandsNaam = bestandsNaamSpoelbak.Replace(".txt", "") & "_Verwerkte_Spoelbak_"
If writer Is Nothing Then
startNieuweArdisDataOpslag(Configs.spoelbakLadeGeefVerplaatsFolderPath)
End If
opslaan(ardisdata, "", "")
LogBestandTextMapper.WriteToFile("ArdisText", "Starten opslag spoelbak lade voor verwerking met barcode: " & ardisdata.PartCalc, True)
End Sub
'opslaan van de laden die niet voldeden aan de dossiercoden en dus niet verwerkt zijn geweest
Public Sub opslaanNietVerwerkteSpecialLaden(lijnen As List(Of String), bestandsNaamSpecial As String)
LogBestandTextMapper.WriteToFile("ArdisText", "Opslaan niet verwerkte special laden")
Dim nieuweBestandsNaam = ""
Dim indexVanUitgelezenInfo As Integer = bestandsNaamSpecial.IndexOf("_Uitgelezen_")
If indexVanUitgelezenInfo > 0 Then
Dim aantalKeerUitgelezen As Integer = bestandsNaamSpecial.Substring(bestandsNaamSpecial.LastIndexOf("_") + 1).Replace(".txt", "")
nieuweBestandsNaam = bestandsNaamSpecial.Remove(bestandsNaamSpecial.LastIndexOf("_") + 1) & (aantalKeerUitgelezen + 1) & ".txt"
Else
nieuweBestandsNaam = bestandsNaamSpecial.Replace(".txt", "") & "_Uitgelezen_1" & ".txt"
End If
Dim fullPath As String = Path.Combine(Configs.geefPathArdisSpecialFolder, nieuweBestandsNaam)
writer = My.Computer.FileSystem.OpenTextFileWriter(fullPath, True)
Try
For Each lijn As String In lijnen
writer.WriteLine(lijn)
Next
LogBestandTextMapper.WriteToFile("ArdisText", "Opslaan niet verwerkte special laden", True)
Catch ex As Exception
Throw New Exception("Fout bij wegschrijven niet verwerkte special laden" & ex.Message)
End Try
End Sub
Public Sub verwijderSpecialLadenBestand(bestandsNaamSpecial As String)
Dim padNaarBestand As String = Configs.geefPathArdisSpecialFolder
Dim fullPath As String = Path.Combine(padNaarBestand, bestandsNaamSpecial)
Try
File.Delete(fullPath)
Catch ex As ReadOnlyException
Throw New Exception("Het special laden bestand " & bestandsNaamSpecial & " is readonly")
Catch ex As PathTooLongException
Throw New Exception("Het path naar het special laden bestand " & bestandsNaamSpecial & " is te lang")
Catch ex As IOException
Throw New Exception("Het special laden bestand " & bestandsNaamSpecial & " is niet bereikbaar")
End Try
End Sub
Private Sub opslaan(ByVal ardisdata As ArdisData, trayNummer As String, slotNummer As String)
LogBestandTextMapper.WriteToFile("ArdisText", " - Starten opslag van ardisData " & If(trayNummer.Equals(""), "", "met traynummer, slotnummer: " & trayNummer & "," & slotNummer))
ardisdata.updateKommasNaarPunten()
Try
writer.Write(ardisdata.PartRef & vbTab) 'rol/onderdeel
writer.Write(ardisdata.PartQty & vbTab) 'aantal
writer.Write(ardisdata.PartMat & vbTab) 'plaatmateriaal
writer.Write(ardisdata.PartCalc & vbTab) 'barcode
writer.Write(ardisdata.PartRemark2 & vbTab) 'ladesequenty
writer.Write(ardisdata.PartRemark & vbTab) 'dossiercode
writer.Write(ardisdata.PartExt09 & vbTab) 'extrainfo
writer.Write(CStr(ardisdata.PartL).Replace(",", ".") & vbTab) 'lengte
writer.Write(CStr(ardisdata.PartW).Replace(",", ".") & vbTab) 'breedte
writer.Write(CStr(ardisdata.PartExt06).Replace(",", ".") & vbTab) 'dikte
writer.Write(ardisdata.PartExt07 & vbTab) 'kleur
writer.Write(ardisdata.PartExt08 & vbTab) 'decor
writer.Write(ardisdata.PartExt01 & vbTab) 'etiketlijn1
writer.Write(ardisdata.PartExt02 & vbTab) 'etiketlijn2
writer.Write(ardisdata.PartExt03 & vbTab) 'etiketlijn3
writer.Write(ardisdata.PartExt05 & vbTab) 'etiketinfo
writer.Write(ardisdata.PartExt04 & vbTab) 'etiketlijn4
writer.Write(ardisdata.PartRemark3 & vbTab) 'rework
writer.Write(ardisdata.PartGroup & vbTab) 'kar
writer.Write(ardisdata.PartLevel & vbTab) 'banding
writer.Write(trayNummer & vbTab) 'KamerfreesTrayId
writer.Write(slotNummer) 'KamerfreesSlotNr
writer.WriteLine()
LogBestandTextMapper.WriteToFile("ArdisText", " - Starten opslag van ardisData " & If(trayNummer.Equals(""), "", "met traynummer, slotnummer: " & trayNummer & "," & slotNummer), True)
Catch ex As Exception
Throw New Exception("Ardis data kon niet worden opgeslagen" & ex.Message)
End Try
End Sub
Public Function geefSpecialLadenMetDossierCode(dossierCode As String) As SpecialLadenOnderdelen
LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met dossierCode: " & dossierCode)
Dim specialLaden As SpecialLadenOnderdelen = opvragenSpecialLadenOnderdelen(dossierCode, True)
LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met dossierCode: " & dossierCode, True)
Return specialLaden
End Function
Function geefSpecialLadenMetBatchnummer(batchnummer As String) As SpecialLadenOnderdelen
LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met batchnummer: " & batchnummer)
Dim specialLaden As SpecialLadenOnderdelen = opvragenSpecialLadenOnderdelen(batchnummer, False)
LogBestandTextMapper.WriteToFile("ArdisText", "Opvragen sifonLade met batchnummer: " & batchnummer, True)
Return specialLaden
End Function
Private Function opvragenSpecialLadenOnderdelen(code As String, isLadeCode As Boolean)
Dim specialLaden As SpecialLadenOnderdelen
For Each tekstBestandPath As String In Directory.GetFiles(Configs.geefPathArdisSpecialFolder)
Dim allText As String = My.Computer.FileSystem.ReadAllText(tekstBestandPath)
allText = allText.Trim
'alle lijnen van 1 bestand
Dim lijnen As String() = allText.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
'een special laden object maken gevuld met de opgehaalde waarden
specialLaden = vulSpecialLade(lijnen, code, isLadeCode)
specialLaden.bestandsNaam = tekstBestandPath.Substring(tekstBestandPath.LastIndexOf("\") + 1)
'controleren of dit de lade(n) bevat die we willen
Dim bevatCode As Boolean
If isLadeCode Then
bevatCode = specialLaden.bevatDossierCode(code)
Else
bevatCode = specialLaden.bevatBatchnummer(code)
End If
If bevatCode Then
Return specialLaden
End If
Next
Throw New Exception("Gelieve een geldige code in te voeren")
End Function
Private Function vulSpecialLade(lijnen() As String, code As String, isLadeCode As Boolean) As SpecialLadenOnderdelen
Dim nieuweSpecialLaden As New SpecialLadenOnderdelen
Dim velden() As String
Dim ardisData As ArdisData
For Each lijn As String In lijnen
'alle velden scheiden
velden = lijn.Split(New String() {vbTab}, StringSplitOptions.None)
'alleen als er wel degelijk ardisdata in het bestand staat het opslaan
If velden.Count > 15 Then
'kijken of we een dossiercode moeten controleren of batchnummer
Dim isGeldig As Boolean
If isLadeCode Then
isGeldig = velden(5).Equals(code)
Else
isGeldig = velden(18).Contains(code)
End If
'kijken of de lade de dossiercode bevat
If isGeldig Then
'kijken wat voor rol de lijn heeft (aka onderdeel: zijkantplaat, rug,...)
ardisData = maakArdisData(velden)
Select Case ardisData.PartRef
Case "ZijkantPlaat"
nieuweSpecialLaden.voegZijkantToe(ardisData)
Case "Rug"
nieuweSpecialLaden.voegRugToe(ardisData)
Case "Bodem"
nieuweSpecialLaden.voegBodemToe(ardisData)
Case "Front"
nieuweSpecialLaden.voegFrontToe(ardisData)
End Select
Else
If Not lijn.Equals("") Then
nieuweSpecialLaden.voegLijnAndereLadeToe(lijn)
End If
End If
End If
Next
Return nieuweSpecialLaden
End Function
'''
''' Opvragen van Ardis data's aan de hand van de lade code.
'''
''' De lade code
''' Lijst van Ardis data's
Public Function GeefArdisDatasMetLadeCode(ladeCode As String) As List(Of ArdisData)
LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met lade code: {ladeCode}")
Dim ardisDatas As List(Of ArdisData) = OphalenArdisDatasMetCode(ladeCode, True)
LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met lade code: {ladeCode}", True)
Return ardisDatas
End Function
'''
''' Opvragen van Ardis data's aan de hand van het batch nummer.
'''
''' Het batch nummer
''' Lijst van Ardis datbatchNummera's
Public Function GeefArdisDatasMetBatchNummer(batchNummer As String) As List(Of ArdisData)
LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met batch nummer: {batchNummer}")
Dim ardisDatas As List(Of ArdisData) = OphalenArdisDatasMetCode(batchNummer, False)
LogBestandTextMapper.WriteToFile("ArdisText", $"Opvragen sifonladen met batch nummer: {batchNummer}", True)
Return ardisDatas
End Function
Private Function OphalenArdisDatasMetCode(code As String, isLadeCode As Boolean) As List(Of ArdisData)
'Lijst initialiseren.
Dim ardisDatas As New List(Of ArdisData)
'Alle bestanden overlopen in de directory met bestanden.
For Each tekstBestandPath As String In Directory.GetFiles(Configs.geefPathArdisSpecialFolder)
'Alle tekst uit een bestand lezen en spaties vooraan en achteraan verwijderen.
Dim allText As String = My.Computer.FileSystem.ReadAllText(tekstBestandPath).Trim()
'De verschillende lijnen omzetten in een array.
Dim lijnen As String() = allText.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
'De lijnen overlopen.
For Each lijn As String In lijnen
'Controleren of een lijn de juiste code bevat. Dit gebeurt hier, omdat de conversie naar Ardis data teveel tijd zou kosten.
'Bijhouden of lijn de juiste code bevat.
Dim bevatCode As Boolean = False
'Alle velden scheiden.
Dim velden = lijn.Split(New String() {vbTab}, StringSplitOptions.None)
'Controleren of de lijn wel lang genoeg is.
If velden.Count > 19 Then
'Genoeg lijnen, controleren welk type code is gebruikt, dossier (lade) code of batchnummer.
If isLadeCode Then
'Dossier (lade) code controleren.
bevatCode = velden(5).Equals(code) 'PartRemark
Else
'Batch nummer controleren. De kar bevat dit nummer.
bevatCode = velden(18).Contains(code) 'PartGroup
End If
End If
'Als de lijn de correcte code bevat wordt het geconverteerd naar Ardis data en toegevoegd aan de lijst.
If bevatCode Then
'Aanmaken ardis data.
Dim ardisData As ArdisData = maakArdisData(velden)
'Toevoegen bestandsnaam.
ardisData.Bestandsnaam = tekstBestandPath.Substring(tekstBestandPath.LastIndexOf("\", StringComparison.Ordinal) + 1)
'Toevoegen aan lijst.
ardisDatas.Add(ardisData)
End If
Next
Next
Return ardisDatas
End Function
'''
''' Ardis data maken aan de hand van de verschillende velden van 1 lijn.
'''
''' Velden van 1 lijn.
''' Nieuwe Ardis data
Private Function MaakArdisData(velden As String()) As ArdisData
Dim ardisData As New ArdisData
ardisData.PartRef = velden(0) 'rol
ardisData.PartQty = velden(1) 'aantal
ardisData.PartMat = velden(2) 'plaatmateriaal
ardisData.PartCalc = velden(3) 'barcode
ardisData.PartRemark2 = velden(4) 'ladesequentyNR
ardisData.PartRemark = velden(5) 'dossiercode
ardisData.PartExt09 = velden(6) 'extrainfo
ardisData.PartL = velden(7) 'lengte
ardisData.PartW = velden(8) 'breedte
ardisData.PartExt06 = velden(9) 'dikte
ardisData.PartExt07 = velden(10) 'kleur
ardisData.PartExt08 = velden(11) 'decor
ardisData.PartExt01 = velden(12) 'etiketlijn1
ardisData.PartExt02 = velden(13) 'etiketlijn2
ardisData.PartExt03 = velden(14) 'etiketlijn3
ardisData.PartExt05 = velden(15) 'etiketinfo
ardisData.PartExt04 = velden(16) 'etiketlijn4
ardisData.PartRemark3 = velden(17) 'rework
ardisData.PartGroup = velden(18) 'kar
ardisData.PartLevel = velden(19) 'banding
If velden.Length > 20 Then
ardisData.KamerfreesTrayId = velden(20)
ardisData.KamerfreesSlotNr = velden(21)
Else
ardisData.KamerfreesTrayId = String.Empty
ardisData.KamerfreesSlotNr = String.Empty
End If
Return (ardisData)
End Function
End Module