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 0000000..39fa0bc Binary files /dev/null and b/app/processFolder/screenshot.png differ diff --git a/docs/bordro deneme data.xlsx b/docs/bordro deneme data.xlsx new file mode 100644 index 0000000..1ffdf3f Binary files /dev/null and b/docs/bordro deneme data.xlsx differ