From a6f46be402dab03b737ede6d853df27b57b74395 Mon Sep 17 00:00:00 2001 From: Dom Date: Sun, 2 Jun 2019 18:17:50 +0200 Subject: [PATCH] add initial version --- bnn.go | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100755 bnn.go diff --git a/bnn.go b/bnn.go new file mode 100755 index 0000000..2593e05 --- /dev/null +++ b/bnn.go @@ -0,0 +1,235 @@ +package bnn + +import ( + "bufio" + "os" + "strconv" + "strings" +) + +// Info Structure of headline +type Info struct { + Kennung string //BNN als Kennung des Dateityps + Version int //3 als Versionsnummer der Schnittstelle + Zeichensatz int //0=AscII 1=Ansi + Versenderadresse string //Name, Ort ... des Händlers + Umfang string //V=vollständige Preisliste, T=Teilliste, S=Sonderliste + Inhalt string //Text, der die Preisliste näher beschreibt + Preiswaehrung string //Währung banküblich (DEM=DM, ATS=österr.Schilling, EUR=Euro) + DatumAb string //Preise gültig ab JJJJMMTT + DatumBis string //gültig bis, 0=unbestimmt + Abgabedatum string //Datum der Datei-Erstellung JJJJMMTT + Abgabezeit string //Uhrzeit der Datei-Erstellung SSMM + Dateizaehler int //Angabe der Dateinummer, Datei/Diskette1 +} + +// Item Structure of each Item +type Item struct { + ArtikelNr string //hausinterne Artikelnummer, mit der bestellt werden soll + Aenderungskennung string //N=neu, A=Änderung, X=ausgelistet, R=Restbestand, V=vorübergehend ausgelistet, W=wiedergelistet + AenderungsDatum int //letztes Artikel-Änderungsdatum JJJJMMTT + AenderungsZeit int //Uhrzeit letzte Artikel-Änderung SSMM + EANladen int //EAN-Nummer Ladeneinheit (1) + EANbestell int //EAN-Nummer Bestelleinheit (1) + Bezeichnung string //Artikelbezeichnung + Bezeichnung2 string //Zusatz-Artikelbezeichnung + Bezeichnung3 string //Bezeichnung für Etiketten- bzw. Kassentext + Handelsklasse string //Handelsklasse (in römischen Zahlen: I, II, III, IV ...) + HerstellerInverkehrbringer string //Herstellerkürzel (nach BNN-Liste) des Herstellers lt. Deklaration auf der Verpackung + Hersteller string //Herstellerkürzel (nach BNN-Liste) falls abweichend von der Verpackung + Herkunft string //Qualitätsland (Auto-Länderkennzeichen) + Qualitaet string //Qualitätskennung (nach BNN-IK-Liste) + Kontrollstelle string //EG-Kontrollstellen-Kennung + MHDRestlaufzeit int //übliche Restlaufzeit in Tagen + WGBNN int //Warengruppe BNNEH (nach BNN-Liste) + WGIfH int //Warengruppe Institut für Handelsforschung (Liste beim BNN erhältlich) + WGGH int //Warengruppe des jeweiligen Großhändlers + ErsatzArtikelNr string //Ersatz-Artikelnummer Ersatzartikel wird geliefert, falls sonst nicht lieferbar + MinBestellMenge int //Mindestbestellmenge in Bestelleinheit (1) + Bestelleinheit string //Bestelleinheit (1) = Verkaufseinheit des Lieferanten + BestelleinheitsMenge int //Anzahl Ladeneinheiten je Bestelleinheit (1) + Ladeneinheit string //Ladeneinheit (1) = Verkaufseinheit im Laden + Mengenfaktor int //Faktor zur Menge-Preis-Relation Ladeneinheit (2) + Gewichtsartikel bool //J=Ja, N=Nein Ja, wenn der Artikel nur abgewogen verkauft wird + PfandNrLadeneinheit string //hausinterne PfandNr für Ladeneinheit (1) + PfandNrBestelleinheit string //hausinterne PfandNr für Bestelleinheit (1) + GewichtLadeneinheit int //Bruttogewicht einer Ladeneinheit (1) in kg + GewichtBestelleinheit int //Bruttogewicht einer Bestelleinheit (1) in kg + Breite int //Packungsbreite der Ladeneinheit in cm + Hoehe int //Packungshöhe der Ladeneinheit in cm + Tiefe int //Packungstiefe der Ladeneinheit in cm + MwstKennung int //Mehrwertsteuer 1=reduziert 2=voll 3=LandwirtsSatz + VkFestpreis int //Festpreis Endkunde incl. MWSt. lt. Hersteller (Bücher) + EmpfVk int //empf.VK des Herstellers incl. MWSt. je Ladeneinheit + EmpfVkGH int //VK-Vorschlag des Lieferanten incl. MWSt. je Ladeneinheit + Preis int //Einzelpreis o. MWSt je Ladeneinheit Mengenfaktor beachten! + rabattfaehig bool //J=Ja, N=Nein + skontierfaehig bool //J=Ja, N=Nein + StaffelMenge1 int //Staffelmenge in Ladeneinheit (1) + StaffelPreis1 int //Staffelpreis je Ladeneinheit (1) o. MWSt. + rabattfaehig1 bool //J=Ja, N=Nein + skontierfaehig1 bool //J=Ja, N=Nein + StaffelMenge2 int //Staffelmenge in Ladeneinheit (1) + StaffelPreis2 int //Staffelpreis je Ladeneinheit (1) o. MWSt. + rabattfaehig2 bool //J=Ja, N=Nein + skontierfaehig2 bool //J=Ja, N=Nein + StaffelMenge3 int //Staffelmenge in Ladeneinheit (1) + StaffelPreis3 int //Staffelpreis je Ladeneinheit (1) o. MWSt. + rabattfaehig3 bool //J=Ja, N=Nein + skontierfaehig3 bool //J=Ja, N=Nein + StaffelMenge4 int //Staffelmenge in Ladeneinheit (1) + StaffelPreis4 int //Staffelpreis je Ladeneinheit (1) o. MWSt. + rabattfaehig4 bool //J=Ja, N=Nein + skontierfaehig4 bool //J=Ja, N=Nein + StaffelMenge5 int //Staffelmenge in Ladeneinheit (1) + StaffelPreis5 int //Staffelpreis je Ladeneinheit (1) o. MWSt. + rabattfaehig5 bool //J=Ja, N=Nein + skontierfaehig5 bool //J=Ja, N=Nein + Artikelart string //F=Frische (mit Tagespreisen), T=Trocken, W=NaturWaren, P=Pfand (dieser Artikel ist das Pfand selbst!), A=Artikel aus FrischePreisliste (aktuelles Angebot) + Aktionspreis string //A=Aktionspreis + AktionspreisGueltigAb string //Datum JJJJMMTT, 0 bzw. leer = ab sofort + AktionspreisGueltigBis string //Datum JJJJMMTT, 0 bzw. leer = unbestimmt + empfVkAktion int //Aktions-VK-Vorschlag incl. MWSt. + GrundpreisEinheit string //Einheit der Grundpreisauszeichnung (kg, l) + GrundpreisFaktor int //Mengen-Faktor der Grundpreiseinheit zur Ladeneinheit + LieferbarAb string //Datum JJJJMMTT + LieferbarBis string //Datum JJJJMMTT +} + +// Bnn Information of file +type Bnn struct { + Info Info + Items []Item +} + +func convertBnnBool(s string) bool { + if s == "J" { + return true + } + return false +} + +func convertStringToInt(s string) int { + ret, _ := strconv.Atoi(s) + return ret +} + +// ReadBnnFile Reads file and returns object with all containing information +func ReadBnnFile(path string) (Bnn, error) { + file, err := os.Open(path) + if err != nil { + return Bnn{}, err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + var lines []string + + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + + var content Bnn + + for i, line := range lines { + var item Item + + col := strings.Split(line, ";") + + // Headline contains infos + if i == 0 { + content.Info.Kennung = col[0] + content.Info.Version = convertStringToInt(col[1]) + content.Info.Zeichensatz = convertStringToInt(col[2]) + content.Info.Versenderadresse = col[3] + content.Info.Umfang = col[4] + content.Info.Inhalt = col[5] + content.Info.Preiswaehrung = col[6] + content.Info.DatumAb = col[7] + content.Info.DatumBis = col[8] + content.Info.Abgabedatum = col[9] + content.Info.Abgabezeit = col[10] + content.Info.Dateizaehler = convertStringToInt(col[11]) + continue + } + + // Jump over last line and exit + if len(col) == 3 { + break + } + + item.ArtikelNr = col[0] + item.Aenderungskennung = col[1] + item.AenderungsDatum = convertStringToInt(col[2]) + item.AenderungsZeit = convertStringToInt(col[3]) + item.EANladen = convertStringToInt(col[4]) + item.EANbestell = convertStringToInt(col[5]) + item.Bezeichnung = col[6] + item.Bezeichnung2 = col[7] + item.Bezeichnung3 = col[8] + item.Handelsklasse = col[9] + item.HerstellerInverkehrbringer = col[10] + item.Hersteller = col[11] + item.Herkunft = col[12] + item.Qualitaet = col[13] + item.Kontrollstelle = col[14] + item.MHDRestlaufzeit = convertStringToInt(col[15]) + item.WGBNN = convertStringToInt(col[16]) + item.WGIfH = convertStringToInt(col[17]) + item.WGGH = convertStringToInt(col[18]) + item.ErsatzArtikelNr = col[19] + item.MinBestellMenge = convertStringToInt(col[20]) + item.Bestelleinheit = col[21] + item.BestelleinheitsMenge = convertStringToInt(col[22]) + item.Ladeneinheit = col[23] + item.Mengenfaktor = convertStringToInt(col[24]) + item.Gewichtsartikel = convertBnnBool(col[25]) + item.PfandNrLadeneinheit = col[26] + item.PfandNrBestelleinheit = col[27] + item.GewichtLadeneinheit = convertStringToInt(col[28]) + item.GewichtBestelleinheit = convertStringToInt(col[29]) + item.Breite = convertStringToInt(col[30]) + item.Hoehe = convertStringToInt(col[31]) + item.Tiefe = convertStringToInt(col[32]) + item.MwstKennung = convertStringToInt(col[33]) + item.VkFestpreis = convertStringToInt(col[34]) + item.EmpfVk = convertStringToInt(col[35]) + item.EmpfVkGH = convertStringToInt(col[36]) + item.Preis = convertStringToInt(col[37]) + item.rabattfaehig = convertBnnBool(col[38]) + item.skontierfaehig = convertBnnBool(col[39]) + item.StaffelMenge1 = convertStringToInt(col[40]) + item.StaffelPreis1 = convertStringToInt(col[41]) + item.rabattfaehig1 = convertBnnBool(col[42]) + item.skontierfaehig1 = convertBnnBool(col[43]) + item.StaffelMenge2 = convertStringToInt(col[44]) + item.StaffelPreis2 = convertStringToInt(col[45]) + item.rabattfaehig2 = convertBnnBool(col[46]) + item.skontierfaehig2 = convertBnnBool(col[47]) + item.StaffelMenge3 = convertStringToInt(col[48]) + item.StaffelPreis3 = convertStringToInt(col[49]) + item.rabattfaehig3 = convertBnnBool(col[50]) + item.skontierfaehig3 = convertBnnBool(col[51]) + item.StaffelMenge4 = convertStringToInt(col[52]) + item.StaffelPreis4 = convertStringToInt(col[53]) + item.rabattfaehig4 = convertBnnBool(col[54]) + item.skontierfaehig4 = convertBnnBool(col[55]) + item.StaffelMenge5 = convertStringToInt(col[56]) + item.StaffelPreis5 = convertStringToInt(col[57]) + item.rabattfaehig5 = convertBnnBool(col[58]) + item.skontierfaehig5 = convertBnnBool(col[59]) + item.Artikelart = col[60] + item.Aktionspreis = col[61] + item.AktionspreisGueltigAb = col[62] + item.AktionspreisGueltigBis = col[63] + item.empfVkAktion = convertStringToInt(col[64]) + item.GrundpreisEinheit = col[65] + item.GrundpreisFaktor = convertStringToInt(col[66]) + item.LieferbarAb = col[67] + item.LieferbarBis = col[68] + + content.Items = append(content.Items, item) + } + + return content, nil +}