From 055ac013f91b0c97d14b3be4623f4e7756ba83a3 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Wed, 3 Apr 2024 15:07:22 +0300 Subject: [PATCH] payroll page mapping finished --- app/lib/bot/luca.go | 502 ++++++++++--------------------- app/lib/bot/rodhelper.go | 4 + app/lib/model/bordro.go | 54 ++-- app/lib/srv/srv.go | 15 +- app/processFolder/screenshot.png | Bin 0 -> 13263 bytes docs/bordro deneme data.xlsx | Bin 0 -> 15026 bytes 6 files changed, 209 insertions(+), 366 deletions(-) create mode 100644 app/processFolder/screenshot.png create mode 100644 docs/bordro deneme data.xlsx diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index 5dec7f5..5cad08f 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -304,18 +304,50 @@ func (l *Luca) GetPageByUrl(url string) (*rod.Page, error) { return allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do") } -func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) (string, error) { - table := frame.MustElements(".i2") - for t := 2; t < len(table); t += 2 { - // Satırın özelliklerini al - class, _ := table[t].Attribute("class") - if t == 89 { +func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) ([]BordroPageScript, error) { + table, err := frame.Elements("#scroll > div > table > tbody > tr > td > table > tbody > tr > td") //table kontrol et var mı yok mu diye + if err != nil { + return nil, err + } + //table := frame.MustElements(".i2") + var mainText string + for t := 0; t < len(table); t++ { + if t == 150 { fmt.Print("asda") } - id, _ := table[t+1].Attribute("id") + inputElement, err := table[t].Element("input") + text, err := table[t].Text() + fmt.Print(mainText) + if text != "" { + mainText = text + } + if inputElement != nil { + if mainText != "" { + fmt.Print(t) + inputElement, err := table[t+1].Element("input") + if inputElement == nil { + mainText = "" + fmt.Print("Hatalı Text") + continue + } + id, err := inputElement.Attribute("id") + + fmt.Print(err) + pageScript := BordroPageScript{ + Value: text, + Index: *id, + } + scriptIndexArray = append(scriptIndexArray, pageScript) + fmt.Println("Text:", text) + fmt.Println("ID:", *id) + fmt.Println("--------------------") + mainText = "" + } + + } + // Satırın özelliklerini al // Satırın textini al - text, err := table[t].Text() fmt.Print(err) @@ -343,31 +375,10 @@ func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) (string, error) // } // Sonuçları yazdır ///text boşsa id de boş oluyo - Id := "" - if id != nil { - Id = *id - fmt.Println("ID:", *id) - } else { - Id = "" - } - if text == "" { - text = "boş Text" - } - pageScript := BordroPageScript{ - Value: text, - Index: Id, - } - - scriptIndexArray = append(scriptIndexArray, pageScript) - fmt.Println("Text:", text) - fmt.Println("Class:", class) - fmt.Println("ID:", Id) - fmt.Println("--------------------") } - return "", nil + return scriptIndexArray, nil } - -func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { +func (l *Luca) PayrollPageLogin() error { newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do") if err != nil { return err @@ -387,6 +398,7 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { if err != nil { return err } + Wait(newPage, 200) err = ClickItem(frame, "#apy1000m0i1ITD", 1) if err != nil { return err @@ -401,11 +413,27 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { return err } Wait(newPage, 1500) - err = WaitLoad(frame3) if err != nil { return err } + return err +} + +func (l *Luca) BordroYaz(month, year int, b *LucaBordro) ([]string, error) { + newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do") + if err != nil { + return nil, err + } + fs3, err := newPage.Element("#frm3") + if err != nil { + return nil, err + } + frame3, err := fs3.Frame() + err = newPage.WaitLoad() + if err != nil { + return nil, err + } isyeriId := "" bolumId := "" bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option") @@ -413,37 +441,39 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { text, err := bordroCompanySelectBox[j].Text() value, err := bordroCompanySelectBox[j].Property("value") if err != nil { - return err + return nil, err } if strings.Trim(text, " ") == b.Sube { //.Sube.Value isyeriId = value.String() break } - fmt.Print(text, value) } element, err := frame3.Element("#isyeriId") + element.WaitLoad() if err != nil { - return err + return nil, err } selectInput := Select{Element: element, Selector: "#isyeriId"} err = selectInput.SelectItem(isyeriId) if err != nil { - return err + return nil, err } err = WaitLoad(frame3) if err != nil { - return err + return nil, err } bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option") + element, err = frame3.Element("#bolumId > option") + element.WaitLoad() if err != nil { - return err + return nil, err } for j := 0; j < len(bordroDepartmentSelectBox); j++ { text, err := bordroDepartmentSelectBox[j].Text() value, err := bordroDepartmentSelectBox[j].Property("value") if err != nil { - return err + return nil, err } if strings.Trim(text, " ") == b.Bolum { //.Bolum.Value bolumId = value.String() @@ -454,39 +484,39 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { element, err = frame3.Element("#bolumId") if err != nil { - return err + return nil, err } selectInput = Select{Element: element, Selector: "#bolumId"} err = selectInput.SelectItem(bolumId) if err != nil { - return err + return nil, err } err = WaitLoad(frame3) if err != nil { - return err + return nil, err } err = ClickItem(frame3, "#tr"+strconv.FormatFloat(float64(month), 'f', -1, 64)+" > td:nth-child(1)", 2) //aktarım ayı if err != nil { - return err + return nil, err } err = WaitLoad(frame3) if err != nil { - return err + return nil, err } var isEmpty bool = false //var targetID string elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']") if err != nil { - return err + return nil, err } elemsProcess, err := frame3.Elements("#scroll > table > tbody > tr > td > a") if err != nil { - return err + return nil, err } trs, err := frame3.Elements("#scroll > table > tbody > tr") if err != nil { - return err + return nil, err } var foundIndex int = -1 if len(elems) == 0 { @@ -495,15 +525,24 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { Index: 1, } pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) + if err != nil { + return nil, err + } + err = WaitLoad(frame3) + if err != nil { + return nil, err + } + return pageErrors, err } for j := 0; j < len(elems); j++ { tex, err := elems[j].Text() if err != nil { - return err + return nil, err } process, err := elemsProcess[j].Text() if err != nil { - return err + return nil, err } if tex == b.TcNo { //.TCKimlikNo.Value foundIndex = j @@ -520,316 +559,107 @@ func (l *Luca) BordroYazPage(month, year int, b *LucaBordro) error { Index: 1, } pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) + if err != nil { + return nil, err + } + err = WaitLoad(frame3) + if err != nil { + return nil, err + } + return pageErrors, err } - if foundIndex != -1 { + if foundIndex != -1 && isEmpty == false { trs[foundIndex].Click(proto.InputMouseButtonLeft, 2) } Wait(newPage, 1500) err = WaitLoad(frame3) if err != nil { - return err + return nil, err } - for k, v := range b.Ucretler { - fmt.Print(v, k) - //table'da key--> k i bul, - //takip eden ilk td'deki ilk input'a v'yi yaz - //table'da k'yi bulmazsan ve v de değer varsa hata dön - } rsp, err := l.BordroTableMaping(frame3, b) + if len(rsp) == 0 { + //hata ver + } fmt.Print(rsp) //rsp den dönden değerler ile matchlencek ve yazılcak for k, v := range b.Ucretler { - fmt.Print(v, k) - //table'da key--> k i bul, - //takip eden ilk td'deki ilk input'a v'yi yaz - //table'da k'yi bulmazsan ve v de değer varsa hata dön - // if strings.Contains(text, k) { - // Id := "" - // if id != nil { - // Id = *id - // fmt.Println("ID:", *id) - // } else { - // Id = "" - // } - // pageScript := BordroPageScript{ - // Value: text, - // Index: Id, - // } + for i := 0; i < len(rsp); i++ { + if k == rsp[i].Value { - // scriptIndexArray = append(scriptIndexArray, pageScript) - // break - // } + el, err := frame3.Element("#" + rsp[i].Index) + if err != nil { + return nil, err + } + err = el.Input(v.String()) + } + } + fmt.Print(v, k) + + } + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1) + if err != nil { + return nil, err + } + saveButtonMessage, err := ReceiveDOMMessages(frame3, ".alert-container", "innerText") + if err != nil { + return nil, err + } + if saveButtonMessage != "Bordro hesaplanıyor." { + isEmptyError := errorInfo{ + Error: saveButtonMessage, + Index: 1, + } + + pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) + newBordroPage, err := frame3.Element("body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)") + newBordroPage.WaitLoad() + if err != nil { + return nil, err + } + newBordroPage.Click(proto.InputMouseButtonLeft, 1) + err = WaitLoad(frame3) + if err != nil { + return nil, err + + } + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) + + if err != nil { + return nil, err + + } + return pageErrors, err } - // for i := 0; i < len(row); i++ { - // if i != 0 { - // err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) - // if err != nil { - // return err - // } - // } + err = WaitLoad(frame3) + if err != nil { + return nil, err + } + newBordroPage, err := frame3.Element("body > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)") + newBordroPage.WaitLoad() + if err != nil { + return nil, err + } + newBordroPage.Click(proto.InputMouseButtonLeft, 1) + err = WaitLoad(frame3) + if err != nil { + return nil, err - // table := frame3.MustElements(".i2") + } + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) - // // Tablodaki tüm satırları al - // // trss := table.MustElements("tr") + if err != nil { + return nil, err - // // Satırları döngü ile işleyerek textleri ve diğer özellikleri al - // // for t := 0; t < len(table); t++ { - // // // Satırın özelliklerini al - // // class, _ := table[t].Attribute("class") - // // id, _ := table[t+1].Attribute("id") + } - // // // Satırın textini al - // // text := table[t].MustText() - // // fmt.Println("Text:", text) - // // fmt.Println("Class:", *class) - // // if id != nil { - // // fmt.Println("ID:", *id) - // // } - // // fmt.Println("-----------------------------") - - // // } - - // elements := frame3.MustElements(".i2") - - // // Elementleri döngü ile işleyerek metinleri ve selectorları al - // var textsAndSelectors [][]string - // for _, el := range elements { - // // Elementin metnini al - // text := el.MustText() - // // Elementin selectorunu al - // selector := el.MustEval(`s => { - // var path = ""; - // for (; s && s.nodeType == Node.ELEMENT_NODE; s = s.parentNode) - // { - // idx = getElementIdx(s); - // xname = s.localName.toLowerCase(); - // path = "/" + xname + "[" + idx + "]" + path; - // } - // return path; - // }`).String() - // textsAndSelectors = append(textsAndSelectors, []string{text, selector}) - // } - - // // Sonuçları yazdır - // for _, item := range textsAndSelectors { - // fmt.Println("Text:", item[0]) - // fmt.Println("Selector:", item[1]) - // } - - // //row[i].FillBordroForm(frame3) - // //err yoksa hesapla ba - // err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1) - // if err != nil { - // log.Fatal(err) - // } - // err = WaitLoad(frame3) - // if err != nil { - // return err - // } - // newBordroPage, err := frame3.Element("body > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)") - // if err != nil { - // return err - // } - // newBordroPage.Click(proto.InputMouseButtonLeft, 1) - // err = WaitLoad(frame3) - // if err != nil { - // return err - - // } - // } - return err + return pageErrors, err } -// func (l *Luca) BordroYaz(data []*model.Bordro, month float64, year float64) error { -// page := l.Page -// allPages, err := page.Browser().Pages() -// if err != nil { -// return err -// } -// newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do") -// if err != nil { -// return err -// } -// fs3, err := newPage.Element("#frm3") -// if err != nil { -// return err -// } -// frame3, err := fs3.Frame() -// err = newPage.WaitLoad() -// if err != nil { -// return err -// } - -// for i := 0; i < len(data); i++ { -// if i != 0 { -// err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) -// if err != nil { -// return err -// } -// } -// err = WaitLoad(frame3) -// if err != nil { -// return err -// } -// isyeriId := "" -// bolumId := "" -// bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option") -// for j := 0; j < len(bordroCompanySelectBox); j++ { -// text, err := bordroCompanySelectBox[j].Text() -// value, err := bordroCompanySelectBox[j].Property("value") -// if err != nil { -// return err -// } -// if strings.Trim(text, " ") == data[i].Sube.Value { -// isyeriId = value.String() -// break -// } -// fmt.Print(text, value) -// } - -// element, err := frame3.Element("#isyeriId") -// if err != nil { -// return err -// } -// selectInput := Select{Element: element, Selector: "#isyeriId"} -// err = selectInput.SelectItem(isyeriId) -// if err != nil { -// return err -// } -// err = WaitLoad(frame3) -// if err != nil { -// return err -// } -// bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option") -// if err != nil { -// return err -// } -// for j := 0; j < len(bordroDepartmentSelectBox); j++ { -// text, err := bordroDepartmentSelectBox[j].Text() -// value, err := bordroDepartmentSelectBox[j].Property("value") -// if err != nil { -// return err -// } -// if strings.Trim(text, " ") == data[i].Bolum.Value { -// bolumId = value.String() -// break -// } -// fmt.Print(text, value) -// } - -// element, err = frame3.Element("#bolumId") -// if err != nil { -// return err -// } -// selectInput = Select{Element: element, Selector: "#bolumId"} -// err = selectInput.SelectItem(bolumId) -// if err != nil { -// return err -// } -// err = WaitLoad(frame3) -// if err != nil { -// return err -// } -// aktarimDonem := strconv.FormatFloat(month, 'f', -1, 64) -// err = ClickItem(frame3, "#tr"+aktarimDonem+" > td:nth-child(1)", 2) -// if err != nil { -// log.Fatal(err) -// } -// personel := data[i].TCKimlikNo //"54853109724" -// fmt.Println(personel) -// err = WaitLoad(frame3) -// if err != nil { -// return err -// } - -// var isEmpty bool = false -// //var targetID string -// elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']") -// if err != nil { -// return err -// } -// elemsProcess, err := frame3.Elements("#scroll > table > tbody > tr > td > a") -// if err != nil { -// return err -// } -// trs, err := frame3.Elements("#scroll > table > tbody > tr") -// if err != nil { -// return err -// } -// var foundIndex int = -1 -// if len(elems) == 0 { -// isEmptyError := errorInfo{ -// Error: "Böyle Bir Kullanıcı Bulunamadı", -// Index: i, -// } -// pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) -// continue -// } -// for j := 0; j < len(elems); j++ { -// tex, err := elems[j].Text() -// if err != nil { -// return err -// } -// process, err := elemsProcess[j].Text() -// if err != nil { -// return err -// } -// if tex == data[i].TCKimlikNo.Value { -// foundIndex = j -// if process == "Bordro Sil" { -// isEmpty = true -// } -// break -// } -// fmt.Print(elems, tex) -// } -// if isEmpty == true { -// isEmptyError := errorInfo{ -// Error: "Yazılı Bordro Var Lütfen Siliniz", -// Index: i, -// } -// pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) - -// continue -// } -// if foundIndex != -1 { - -// trs[foundIndex].Click(proto.InputMouseButtonLeft, 2) -// } -// err = WaitLoad(frame3) -// if err != nil { -// return err - -// } -// data[i].FillBordroForm(frame3) -// //err yoksa hesapla ba -// err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1) -// if err != nil { -// log.Fatal(err) -// } -// err = WaitLoad(frame3) -// if err != nil { -// return err -// } -// newBordroPage, err := frame3.Element("body > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)") -// if err != nil { -// return err -// } -// newBordroPage.Click(proto.InputMouseButtonLeft, 1) -// err = WaitLoad(frame3) -// if err != nil { -// return err - -// } -// } // CloseBrowser(l.Browser) -// return err - -// } // func (l *Luca)pageInsert(data, b* model.PageStruct){ diff --git a/app/lib/bot/rodhelper.go b/app/lib/bot/rodhelper.go index 89863bb..6b2cdc9 100644 --- a/app/lib/bot/rodhelper.go +++ b/app/lib/bot/rodhelper.go @@ -62,6 +62,10 @@ func FillInput(frm *rod.Page, selector string, value string) error { func ClickItem(frm *rod.Page, selector string, clickCount int) error { // Sayfadan ilgili öğeyi bul el, err := frm.Element(selector) + err = el.WaitLoad() + if err != nil { + return err + } err = el.Click(proto.InputMouseButtonLeft, clickCount) return err } diff --git a/app/lib/model/bordro.go b/app/lib/model/bordro.go index 9f8ad67..f5c9775 100644 --- a/app/lib/model/bordro.go +++ b/app/lib/model/bordro.go @@ -3,8 +3,7 @@ package model import ( "fmt" "reflect" - - "github.com/go-rod/rod" + //"github.com/go-rod/rod" ) type BordroProperty struct { @@ -285,33 +284,34 @@ func getPageId(id string) string { return "" } } -func (b *Bordro) FillBordroForm(rodForm *rod.Page) error { - objValue := reflect.ValueOf(b).Elem() - objType := objValue.Type() - for i := 0; i < objValue.NumField(); i++ { - field := objValue.Field(i) - fieldName := objType.Field(i).Name - valueField := field.FieldByName("Value") - idField := field.FieldByName("Id") - idValue := idField.Interface().(string) - if idValue != "" { - elem, err := rodForm.Element(idField.Interface().(string)) - if err != nil { - return err - } - value := valueField.Interface().(string) - // switch expression { - // case "input": - // //elem.Input(value) - // } - elem.Input(value) - } +// func (b *Bordro) FillBordroForm(rodForm *rod.Page) error { +// objValue := reflect.ValueOf(b).Elem() +// objType := objValue.Type() +// for i := 0; i < objValue.NumField(); i++ { +// field := objValue.Field(i) +// fieldName := objType.Field(i).Name +// valueField := field.FieldByName("Value") +// idField := field.FieldByName("Id") +// idValue := idField.Interface().(string) +// if idValue != "" { +// elem, err := rodForm.Element(idField.Interface().(string)) +// if err != nil { +// return err +// } +// value := valueField.Interface().(string) +// // switch expression { +// // case "input": +// // //elem.Input(value) - fmt.Print(fieldName) - } - return nil -} +// // } +// elem.Input(value) +// } + +// fmt.Print(fieldName) +// } +// return nil +// } // BordroProperty structının tipi de olabilir drop checkbox vs ayrı bir fonksiyon çalışabilir getPageId den dönebilirsin func NewFromExcelLine(rows []string) (*Bordro, error) { diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index 6aaf40a..33b80f8 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -76,6 +76,7 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { return nil } + err = b.PayrollPageLogin() slog.Debug("inputs", "year", year, "month", month) @@ -102,7 +103,7 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { if rows[0][0] == "" { rows = rows[1:] } - + var insertMessage []string // data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur for i := 1; i < len(rows); i++ { brd := &bot.LucaBordro{ @@ -125,10 +126,18 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { } } - err = b.BordroYazPage(int(month), int(year), brd) + message, err := b.BordroYaz(int(month), int(year), brd) + if len(message) > 0 { + insertMessage = append(insertMessage, message...) + } + if err != nil { + fmt.Print(err) + } } - + if len(insertMessage) > 0 && err != nil { + return nil + } if err != nil { //emitLog(err.message) return err diff --git a/app/processFolder/screenshot.png b/app/processFolder/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..39fa0bc50df1d2cee497f2c3a32307a36df0b7ef GIT binary patch literal 13263 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 literal 0 HcmV?d00001 diff --git a/docs/bordro deneme data.xlsx b/docs/bordro deneme data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ffdf3fbf04c6b91178206f395daa53dd0ee0383 GIT binary patch literal 15026 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 m@8o5ZY4A5H000PYugW(zowNUO_WuAz_^5^e literal 0 HcmV?d00001