From b3464278ac593eea14a5ce3b53d3e53b5fe723c6 Mon Sep 17 00:00:00 2001 From: Dom Date: Sun, 2 Dec 2018 12:20:29 +0100 Subject: [PATCH] first commit --- webActions.go | 252 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 webActions.go diff --git a/webActions.go b/webActions.go new file mode 100644 index 0000000..e6e398d --- /dev/null +++ b/webActions.go @@ -0,0 +1,252 @@ +package paxan + +import ( + "io" + "log" + "net/http" + "net/http/cookiejar" + "net/url" + "os" + "strconv" + "strings" + "time" + + "github.com/PuerkitoBio/goquery" +) + +type paxanWebOrder struct { + InvoiceNumber int + Type string + Date string +} + +type paxanWebOrderEntry struct { + Position string + ArticleNumber int + Description string + Amount string + Price string + Total string + Amount2 string + Price2 string + Total2 string +} + +func downloadFile(filepath string, resp *http.Response) error { + // Create the file + file, err := os.Create(filepath) + if err != nil { + return err + } + defer file.Close() + + // Write the body to file + _, err = io.Copy(file, resp.Body) + if err != nil { + return err + } + + return nil +} + +// NewClient - Login +func NewClient(user string, password string) (*http.Client, error) { + // New http client with cookie + cookieJar, _ := cookiejar.New(nil) + client := &http.Client{ + Jar: cookieJar, + } + + loginvalues := make(url.Values) + loginvalues.Set("performAction", "processLogin") + loginvalues.Set("personlogin", user) + loginvalues.Set("personpwd", password) + loginvalues.Set("firma", "paxan") + _, err := client.PostForm("https://www.hakopaxan-shop.de/html/login.html", loginvalues) + if err != nil { + return nil, err + } + + return client, nil +} + +// CloseClient - Logout +func CloseClient(client *http.Client) error { + // Logout + _, err := client.Get("https://www.hakopaxan-shop.de/html/logout-performAction-processLogout.html") + if err != nil { + return err + } + + return nil +} + +// DownloadPricelists - Download both price lists +func DownloadPricelists(client *http.Client) error { + // Download preisliste + r, err := client.Get("https://www.hakopaxan-shop.de/csv/preisliste.csv") + if err != nil { + return err + } + downloadFile(("preisliste-" + time.Now().Format("20060102150405") + ".csv"), r) + + // Download spreisliste + r, err = client.Get("https://www.hakopaxan-shop.de/csv/spreisliste.csv") + if err != nil { + return err + } + downloadFile(("spreisliste-" + time.Now().Format("20060102150405") + ".csv"), r) + + return nil +} + +func paxanGetOrders(client *http.Client) ([]paxanWebOrder, error) { + var list []paxanWebOrder + kvs := make(map[string]string) + + r, err := client.Get("https://www.hakopaxan-shop.de/html/customerDocumentList.html?customerDocumentListId=invoice&requestedPeriod=365") + if err != nil { + return nil, err + } + + doc, err := goquery.NewDocumentFromReader(io.Reader(r.Body)) + if err != nil { + return nil, err + } + + var headline []string + // Find the table header + doc.Find(".tableHeader").Each(func(i int, s *goquery.Selection) { + s.Find(".tableCell").Each(func(i int, s *goquery.Selection) { + title := s.Contents().Text() + title = strings.Replace(title, "\n", "", -1) + title = strings.TrimSpace(title) + + headline = append(headline, title) + }) + }) + + // Find the table items + doc.Find(".tableRowGroup").Each(func(i int, s *goquery.Selection) { + s.Find(".tableCell").Each(func(j int, s *goquery.Selection) { + title := "undefined" + if j < len(headline) { + title = headline[j] + } + + text := s.Contents().Text() + text = strings.Replace(text, "\n", "", -1) + text = strings.Split(text, ":")[1] + text = strings.TrimSpace(text) + kvs[title] = text + //fmt.Printf("%s - %s\n", title, text) + }) + //fmt.Println(kvs) + + num, _ := strconv.Atoi(kvs["Beleg-Nr."]) + n := paxanWebOrder{InvoiceNumber: num, Type: kvs["Belegart"], Date: kvs["Datum"]} + list = append(list, n) + }) + + return list, nil +} + +func paxanGetOrderDetails(client *http.Client, orderNumber int) ([]paxanWebOrderEntry, error) { + var list []paxanWebOrderEntry + + url := "https://www.hakopaxan-shop.de/html/customerDocument-customerDocumentId-" + strconv.Itoa(orderNumber) + "-customerDocumentListId-invoice-requestedPeriod-365.html" + r, err := client.Get(url) + if err != nil { + return nil, err + } + + doc, err := goquery.NewDocumentFromReader(io.Reader(r.Body)) + if err != nil { + return nil, err + } + + // Go through table row by row + doc.Find(".tableRowGroup").Each(func(i int, s *goquery.Selection) { + var row []string + s.Find(".tableCell").Each(func(j int, s *goquery.Selection) { + text := s.Contents().Text() + if j == 2 { + text = s.Find(".lineItemName").Text() + } + + text = strings.Replace(text, "\n", "", -1) + text = strings.TrimSpace(text) + row = append(row, text) + + }) + + num, _ := strconv.Atoi(row[1]) + n := paxanWebOrderEntry{Position: row[0], + ArticleNumber: num, + Description: row[2], + Amount: row[3], + Price: row[4], + Total: row[5], + Amount2: row[6], + Price2: row[7], + Total2: row[8]} + list = append(list, n) + }) + + return list, nil +} + +// ExportNewOrders - Export new orders into orders.csv +func ExportNewOrders(client *http.Client, lastOrder int) error { + f, err := os.OpenFile("orders.csv", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + if err != nil { + return err + } + defer f.Close() + + orders, err := paxanGetOrders(client) + if err != nil { + return err + } + + i, j := 0, 0 + for _, order := range orders { + if order.InvoiceNumber <= lastOrder { + continue + } + + orderDetails, err := paxanGetOrderDetails(client, order.InvoiceNumber) + if err != nil { + return err + } + + for _, orderDetail := range orderDetails { + text := strconv.Itoa(order.InvoiceNumber) + ";" + + order.Type + ";" + + order.Date + ";" + + + orderDetail.Position + ";" + + strconv.Itoa(orderDetail.ArticleNumber) + ";" + + orderDetail.Description + ";" + + orderDetail.Amount + ";" + + orderDetail.Price + ";" + + orderDetail.Total + ";" + + orderDetail.Amount2 + ";" + + orderDetail.Price2 + ";" + + orderDetail.Total2 + "\n" + + _, err = f.WriteString(text) + if err != nil { + return err + } + + j++ + } + + i++ + } + + log.Printf("Added %d order(s) with %d article(s)", i, j) + + return nil +}