merge
This commit is contained in:
21
app/lib/bot/bordro.go
Normal file
21
app/lib/bot/bordro.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package bot
|
||||
|
||||
import "github.com/shopspring/decimal"
|
||||
|
||||
type LucaBordro struct {
|
||||
Sube string
|
||||
Bolum string
|
||||
TcNo string
|
||||
AdSoyad string
|
||||
Ucretler map[string]decimal.Decimal
|
||||
//Header map[string]string
|
||||
}
|
||||
type BordroPageSelectBoxType struct {
|
||||
B string
|
||||
N string
|
||||
}
|
||||
|
||||
const (
|
||||
BIndex = "B"
|
||||
NIndex = "N"
|
||||
)
|
||||
950
app/lib/bot/luca.go
Normal file
950
app/lib/bot/luca.go
Normal file
@@ -0,0 +1,950 @@
|
||||
package bot
|
||||
|
||||
import (
|
||||
"bordrobot/lib/company"
|
||||
"bordrobot/lib/helper"
|
||||
"bordrobot/lib/ocr"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
"github.com/go-rod/rod/lib/launcher"
|
||||
"github.com/go-rod/rod/lib/proto"
|
||||
)
|
||||
|
||||
var pageErrors []string
|
||||
var scriptIndexArray []BordroPageScript
|
||||
|
||||
type Luca struct {
|
||||
Page *rod.Page
|
||||
Browser *rod.Browser
|
||||
}
|
||||
type errorInfo struct {
|
||||
Error string
|
||||
Index int
|
||||
}
|
||||
type BordroPageScript struct {
|
||||
Index string
|
||||
Value string
|
||||
itemType string
|
||||
DomSelectValue struct {
|
||||
Index string
|
||||
Value string
|
||||
itemType string
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Luca) ErrFunc(index bool) {
|
||||
if index {
|
||||
CloseBrowser(l.Browser)
|
||||
}
|
||||
}
|
||||
func (l *Luca) ClosingBrowserFromExternalLink() {
|
||||
CloseBrowser(l.Browser)
|
||||
}
|
||||
func VerifyCaptcha(page *rod.Page) error {
|
||||
//captcha := "#captcha"
|
||||
picturePreparation := []string{
|
||||
`document.getElementsByTagName("body")[0].style.backgroundImage = "none"`,
|
||||
`document.getElementsByClassName("baslik1")[0].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik2")[0].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = "none"`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = "none"`,
|
||||
`document.getElementsByClassName("captcha-container")[0].style.display ='none'`,
|
||||
}
|
||||
for i := 0; i < len(picturePreparation); i++ {
|
||||
wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Print(err)
|
||||
}
|
||||
datas, err := page.Screenshot(true, &proto.PageCaptureScreenshot{})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = helper.CreateFolder("./processFolder")
|
||||
err = ioutil.WriteFile("./processFolder/screenshot.png", datas, 0644)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
//captchaMessage, err := ReceiveDOMMessages(page, captcha, "src")
|
||||
picturePreparation = []string{
|
||||
`document.getElementsByTagName("body")[0].style.backgroundImage = ""`,
|
||||
`document.getElementsByClassName("baslik1")[0].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik2")[0].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = ""`,
|
||||
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = ""`,
|
||||
}
|
||||
for i := 0; i < len(picturePreparation); i++ {
|
||||
wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Print(err)
|
||||
}
|
||||
var captchaMsg string
|
||||
screenshot, err := page.Screenshot(true, &proto.PageCaptureScreenshot{})
|
||||
if err != nil {
|
||||
return errors.New("Captcha Sayfasında Hata Oluştu. İşlem Sonlanıyor.")
|
||||
}
|
||||
//captchaMsg, err = ocr.VisionApi("./processFolder/screenshot.png")
|
||||
captchaMsg, err = ocr.DecodeTwoCaptcha(context.Background(), screenshot, "luca")
|
||||
if err != nil {
|
||||
return errors.New("Captcha Servisinde Hata Oluştu. İşlem Sonlanıyor.")
|
||||
}
|
||||
|
||||
trimmedMsg := strings.ReplaceAll(captchaMsg, " ", "")
|
||||
trimmedMsg = strings.Replace(trimmedMsg, "\"", "", -1)
|
||||
page.MustElement("#captcha-input").MustInput(strings.ToLower(trimmedMsg))
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementById(document.forms[0].submit())`))
|
||||
if err != nil {
|
||||
}
|
||||
err = WaitLoad(page)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
getUrl := page.MustInfo().URL
|
||||
splitUrl := strings.Split(getUrl, "/")
|
||||
uri := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
|
||||
if uri != "main.erp" {
|
||||
_, err = page.Evaluate(rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`))
|
||||
//rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`)
|
||||
|
||||
VerifyCaptcha(page)
|
||||
fmt.Println("captcha tekrar deneme fonksiyonuna sok")
|
||||
//captcha tekrar denenecek
|
||||
}
|
||||
return nil
|
||||
|
||||
}
|
||||
func NewLucaBot(devMode bool) *Luca {
|
||||
l := launcher.New().
|
||||
Headless(devMode).
|
||||
Devtools(true)
|
||||
|
||||
//defer l.Cleanup()
|
||||
|
||||
url := l.MustLaunch()
|
||||
browser := rod.New().
|
||||
ControlURL(url).
|
||||
Trace(true).
|
||||
//SlowMotion(1 * time.Second).
|
||||
MustConnect()
|
||||
page := browser.MustPage("https://agiris.luca.com.tr/LUCASSO/giris.erp")
|
||||
fmt.Println(page)
|
||||
|
||||
return &Luca{Page: page, Browser: browser}
|
||||
}
|
||||
|
||||
func (l *Luca) Login(company company.Company, month float64, year float64) error {
|
||||
page := l.Page
|
||||
err := WaitLoad(page)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = FillInput(page, "#musteriNo", company.MemberNumber)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Timeout(500)
|
||||
err = FillInput(page, "#kullaniciAdi", company.Username)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Timeout(500)
|
||||
err = FillInput(page, "#parola", company.Password)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Timeout(500)
|
||||
|
||||
result, err := page.Evaluate(rod.Eval(`()=>{girisbtn()}`))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
page.Timeout(1000)
|
||||
loginDialog := "body > div.swal2-container.swal2-fade.swal2-in > div > div.swal2-content"
|
||||
|
||||
loginDialogMessage, err := ReceiveDOMMessages(page, loginDialog, "innerText")
|
||||
if err != nil {
|
||||
errString := err.Error()
|
||||
if !strings.Contains(errString, "Sellector Bulunamadı") {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if loginDialogMessage == "Müşteri No, Kullanıcı Adı veya Parola hatalıdır." {
|
||||
return errors.New("Şifre hatalı")
|
||||
|
||||
}
|
||||
err = WaitLoad(page)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
getUrl := page.MustInfo().URL
|
||||
splitUrl := strings.Split(getUrl, "/")
|
||||
splitUrlPage := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
|
||||
if splitUrlPage != "main.erp" {
|
||||
VerifyCaptcha(page)
|
||||
}
|
||||
fmt.Println(result)
|
||||
wait := page.WaitRequestIdle(1000*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
_, err = page.Evaluate(rod.Eval(`()=>{gonder('formTarget');}`))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Wait(page, 2000)
|
||||
|
||||
allPages, err := page.Browser().Pages()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
|
||||
err = WaitLoad(newPage)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frm4, err := newPage.Element("#frm4")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frame4, err := frm4.Frame()
|
||||
Wait(frame4, 1500)
|
||||
err = WaitLoad(newPage)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(frame4, 1500)
|
||||
companiesSelectBoxWait, err := frame4.Element("#SirketCombo > option")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = companiesSelectBoxWait.WaitLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
companiesSelectBox, err := frame4.Elements("#SirketCombo > option")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var vls string = ""
|
||||
for j := 0; j < len(companiesSelectBox); j++ {
|
||||
tex, err := companiesSelectBox[j].Text()
|
||||
value, err := companiesSelectBox[j].Property("value")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tex == company.Name {
|
||||
vls = value.String()
|
||||
break
|
||||
}
|
||||
}
|
||||
Wait(newPage, 500)
|
||||
element, err := frame4.Element("#SirketCombo")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
selectInput := Select{Element: element, Selector: "#SirketCombo"}
|
||||
err = selectInput.SelectItem(vls)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = WaitLoad(frame4)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(frame4, 1500)
|
||||
companiesSelectYear, err := frame4.Elements("#DonemCombo > option")
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for j := 0; j < len(companiesSelectYear); j++ {
|
||||
tex, err := companiesSelectYear[j].Text()
|
||||
value, err := companiesSelectYear[j].Property("value")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if strings.Contains(tex, strconv.Itoa(int(year))) {
|
||||
vls = value.String()
|
||||
break
|
||||
}
|
||||
}
|
||||
Wait(newPage, 500)
|
||||
element, err = frame4.Element("#DonemCombo")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
selectInput = Select{Element: element, Selector: "#DonemCombo"}
|
||||
err = selectInput.SelectItem(vls)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = WaitLoad(frame4)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = ClickItem(frame4, "#SirName > button.no-bold.green > i", 1)
|
||||
|
||||
err = WaitLoad(frame4)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(newPage, 500)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) ([]BordroPageScript, error) {
|
||||
scriptIndexArray = []BordroPageScript{}
|
||||
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++ {
|
||||
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)
|
||||
elem, err := table[t+1].Element("input")
|
||||
if elem == nil {
|
||||
mainText = ""
|
||||
fmt.Print("Hatalı Text")
|
||||
continue
|
||||
}
|
||||
id, err := elem.Attribute("id")
|
||||
|
||||
fmt.Print(err)
|
||||
pageScript := BordroPageScript{
|
||||
Value: text,
|
||||
Index: *id,
|
||||
itemType: "input",
|
||||
}
|
||||
scriptIndexArray = append(scriptIndexArray, pageScript)
|
||||
mainText = ""
|
||||
}
|
||||
|
||||
} else {
|
||||
if t <= len(table)-2 {
|
||||
if text != "" {
|
||||
if mainText == "N\nB" {
|
||||
aa, err := table[t].Element("select")
|
||||
id, err := aa.Attribute("id")
|
||||
dd := len(scriptIndexArray) - 2
|
||||
scriptIndexArray[dd].DomSelectValue.Index = *id
|
||||
scriptIndexArray[dd].DomSelectValue.Value = mainText
|
||||
scriptIndexArray[dd].DomSelectValue.itemType = "select"
|
||||
fmt.Print(aa, id, err)
|
||||
|
||||
}
|
||||
inputBox, err := table[t+1].Element("input")
|
||||
selectBox, err := table[t+1].Element("select")
|
||||
fmt.Print(err)
|
||||
if inputBox != nil {
|
||||
types, err := inputBox.Attribute("type")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if *types != "hidden" {
|
||||
id, err := inputBox.Attribute("id")
|
||||
pageScript := BordroPageScript{
|
||||
Value: text,
|
||||
Index: *id,
|
||||
itemType: "input",
|
||||
}
|
||||
scriptIndexArray = append(scriptIndexArray, pageScript)
|
||||
fmt.Print(inputBox, err, id, types)
|
||||
}
|
||||
|
||||
} else if selectBox != nil {
|
||||
id, err := selectBox.Attribute("id")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pageScript := BordroPageScript{
|
||||
Value: text,
|
||||
Index: *id,
|
||||
itemType: "selectBox",
|
||||
}
|
||||
scriptIndexArray = append(scriptIndexArray, pageScript)
|
||||
}
|
||||
mainText = ""
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
fmt.Print(err)
|
||||
}
|
||||
return scriptIndexArray, nil
|
||||
}
|
||||
func (l *Luca) PayrollPageLogin() error {
|
||||
newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fs2, err := newPage.Element("#frm2")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frame, err := fs2.Frame()
|
||||
fs3, err := newPage.Element("#frm3")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frame3, err := fs3.Frame()
|
||||
err = newPage.WaitLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = frame.WaitLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(newPage, 500)
|
||||
err = ClickItem(frame, "#apy1000m0i1ITD", 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(err)
|
||||
err = ClickItem(frame3, "#apy1000m36i4ITX", 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = newPage.WaitLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(newPage, 1500)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error {
|
||||
newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frame3, err := l.GetFrame(newPage, "#frm3")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
isyeriId := ""
|
||||
bolumId := ""
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(frame3, 2000)
|
||||
err = WaitDomElement(frame3, "#isyeriId > option", 50)
|
||||
if err != nil {
|
||||
return errors.New("işyeri bulunurken hata ile karşılaşıldı")
|
||||
}
|
||||
bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
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, " ") == b.Sube { //.Sube.Value
|
||||
isyeriId = value.String()
|
||||
break
|
||||
}
|
||||
}
|
||||
if isyeriId == "" {
|
||||
return errors.New("Kayıtlı Şube Bulunamadı")
|
||||
}
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(frame3, 1000)
|
||||
element, err := frame3.Element("#isyeriId")
|
||||
element.WaitLoad()
|
||||
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
|
||||
}
|
||||
Wait(frame3, 2500)
|
||||
err = WaitDomElement(frame3, "#bolumId > option", 50)
|
||||
if err != nil {
|
||||
return errors.New("bölüm bulunurken hata ile karşılaşıldı")
|
||||
}
|
||||
bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
element, err = frame3.Element("#bolumId > option")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
element.WaitLoad()
|
||||
err = WaitLoad(frame3)
|
||||
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, " ") == b.Bolum { //.Bolum.Value
|
||||
bolumId = value.String()
|
||||
break
|
||||
}
|
||||
}
|
||||
if bolumId == "" {
|
||||
return errors.New("Kayıtlı Bölüm Bulunamadı")
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Wait(frame3, 1000)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return 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
|
||||
}
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
Wait(frame3, 1500)
|
||||
var isEmpty bool = false
|
||||
//var targetID string
|
||||
err = WaitDomElement(frame3, "#scroll > table > tbody > tr > td[id^='tcKimlikNo']", 50)
|
||||
if err != nil {
|
||||
return errors.New("tablo okunurken hata ile karşılaşıldı")
|
||||
}
|
||||
|
||||
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
|
||||
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 == b.TcNo { //.TCKimlikNo.Value
|
||||
foundIndex = j
|
||||
if process == "Bordro Sil" {
|
||||
isEmpty = true
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
if foundIndex == -1 {
|
||||
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
|
||||
}
|
||||
return errors.New("Böyle Bir Kullanıcı Bulunamadı")
|
||||
}
|
||||
if isEmpty == true {
|
||||
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
|
||||
}
|
||||
return errors.New("Yazılı Bordro Var Lütfen Siliniz")
|
||||
}
|
||||
if foundIndex != -1 && isEmpty == false {
|
||||
|
||||
trs[foundIndex].Click(proto.InputMouseButtonLeft, 2)
|
||||
}
|
||||
Wait(newPage, 1500)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
}
|
||||
rsp, err := l.BordroTableMaping(frame3, b)
|
||||
if err != nil {
|
||||
return errors.New("Bordro Tablosu Çekilemedi")
|
||||
}
|
||||
sgkDayFlag := false
|
||||
|
||||
//rsp den dönden değerler ile matchlencek ve yazılcak
|
||||
firsts := make(map[string]decimal.Decimal)
|
||||
if value, ok := b.Ucretler["Normal Gün"]; ok {
|
||||
// Anahtarı ve değeri yeni map'e ekle
|
||||
firsts["Normal Gün"] = value
|
||||
}
|
||||
if value, ok := b.Ucretler["Hafta Tatili"]; ok {
|
||||
// Anahtarı ve değeri yeni map'e ekle
|
||||
firsts["Hafta Tatili"] = value
|
||||
}
|
||||
if value, ok := b.Ucretler["Genel Tatil"]; ok {
|
||||
// Anahtarı ve değeri yeni map'e ekle
|
||||
firsts["Genel Tatil"] = value
|
||||
}
|
||||
if value, ok := b.Ucretler["Ücretli İzin"]; ok {
|
||||
// Anahtarı ve değeri yeni map'e ekle
|
||||
firsts["Ücretli İzin"] = value
|
||||
if !value.IsZero() {
|
||||
sgkDayFlag = true
|
||||
}
|
||||
}
|
||||
if value, ok := b.Ucretler["Rapor"]; ok {
|
||||
// Anahtarı ve değeri yeni map'e ekle
|
||||
firsts["Rapor"] = value
|
||||
if !value.IsZero() {
|
||||
sgkDayFlag = true
|
||||
}
|
||||
}
|
||||
keys := []string{"Normal Gün", "Hafta Tatili", "Genel Tatil", "Ücretli İzin", "Rapor"}
|
||||
|
||||
for _, v := range keys {
|
||||
fmt.Print(v)
|
||||
for i := 0; i < len(rsp); i++ {
|
||||
value, ok := firsts[v]
|
||||
if !ok {
|
||||
fmt.Printf("Key %s not found in map\n", v)
|
||||
break
|
||||
}
|
||||
if v == rsp[i].Value {
|
||||
el, err := frame3.Element("#" + rsp[i].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !value.Equal(value.Truncate(0)) {
|
||||
nevvl := strings.ReplaceAll(value.String(), ".", ",")
|
||||
strv := nevvl
|
||||
err = el.Input(strv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
err = el.Input(value.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
el.Eval(`this.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'}))`)
|
||||
// valueStr := value.String()
|
||||
// // JS ile değeri ata, input tetikle, blur tetikle (Enter yerine geçer)
|
||||
// script := fmt.Sprintf(`this.value = "%s"; this.dispatchEvent(new Event("input", { bubbles: true })); this.blur();`, strings.ReplaceAll(valueStr, `"`, `\"`))
|
||||
|
||||
// _, err = el.Eval(script)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
break
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
display, err := frame3.Element("#puantajGunTable")
|
||||
if err != nil {
|
||||
return errors.New("Puantaj Gün Tablosu Bulunamadı.")
|
||||
}
|
||||
dsp, err := display.Attribute("style")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// `display: none;` içerip içermediğini kontrol et
|
||||
if dsp != nil && !strings.Contains(*dsp, "display: none;") {
|
||||
if sgkDayFlag {
|
||||
ClickItem(frame3, "#ayGun2", 1)
|
||||
} else {
|
||||
ClickItem(frame3, "#ayGun1", 1)
|
||||
}
|
||||
}
|
||||
|
||||
for k, v := range b.Ucretler {
|
||||
splitValue := strings.SplitN(k, " #", 2)
|
||||
k = strings.TrimSpace(splitValue[0])
|
||||
var elementInsertControl bool = true
|
||||
var displayControl bool = true
|
||||
tt := v.String()
|
||||
if tt == "0" {
|
||||
continue
|
||||
}
|
||||
if k == "Normal Gün" || k == "Hafta Tatili" || k == "Genel Tatil" || k == "Ücretli İzin" || k == "Rapor" {
|
||||
continue
|
||||
}
|
||||
Wait(frame3, 100)
|
||||
for i := 0; i < len(rsp); i++ {
|
||||
|
||||
if k == rsp[i].Value {
|
||||
var hashValue string
|
||||
if len(splitValue) > 1 {
|
||||
hashValue = strings.TrimSpace(splitValue[1])
|
||||
}
|
||||
Wait(frame3, 200)
|
||||
if rsp[i].itemType == "selectBox" {
|
||||
elemBox, err := frame3.Element("#" + rsp[i].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
selectInput = Select{Element: elemBox, Selector: "#" + rsp[i].Index}
|
||||
err = selectInput.SelectItem(v.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
elementInsertControl = false
|
||||
break
|
||||
}
|
||||
el, err := frame3.Element("#" + rsp[i].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// //s ve g olunca i yi çalıştır n ve b olunca i+1 i
|
||||
if (hashValue == "S" || hashValue == "G") && k != "ARGE-Destek ve Tasarım Faaliyeti" {
|
||||
if rsp[i+1].Value != hashValue {
|
||||
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 err
|
||||
}
|
||||
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return 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 err
|
||||
}
|
||||
return errors.New(k + hashValue + "Sütun Bulunamadı")
|
||||
}
|
||||
el, err = frame3.Element("#" + rsp[i].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if hashValue == "B" || hashValue == "N" {
|
||||
if strings.Contains(rsp[i].Index, "Carpan") {
|
||||
b := BordroPageSelectBoxType{
|
||||
B: "1", // Buraya gerçek değeri koyun
|
||||
N: "0", // Buraya gerçek değeri koyun
|
||||
}
|
||||
var dynamicValue string
|
||||
if hashValue == "B" {
|
||||
dynamicValue = b.B
|
||||
} else {
|
||||
dynamicValue = b.N
|
||||
}
|
||||
elemBox, err := frame3.Element("#" + rsp[i].DomSelectValue.Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
selectInput = Select{Element: elemBox, Selector: "#" + rsp[i].DomSelectValue.Index}
|
||||
err = selectInput.SelectItem(dynamicValue)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
el, err = frame3.Element("#" + rsp[i+1].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
if k == "ARGE-Destek ve Tasarım Faaliyeti" {
|
||||
if hashValue == "S" {
|
||||
el, err = frame3.Element("#" + rsp[i+1].Index)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
value := v.String()
|
||||
if strings.Contains(value, ".") {
|
||||
value = strings.Replace(value, ".", ",", -1)
|
||||
}
|
||||
elemF := el
|
||||
if strings.Contains(rsp[i].Index, rsp[i].Index) {
|
||||
for {
|
||||
parentElement, err := elemF.Parent()
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
|
||||
}
|
||||
innerHTML, err := parentElement.HTML()
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
|
||||
}
|
||||
|
||||
// innerHTML'deki etiket adını al
|
||||
tagName1 := strings.Split(innerHTML, ">")[0]
|
||||
tagName := strings.TrimPrefix(tagName1, "<")
|
||||
fmt.Println("Tag name:", tagName)
|
||||
fmt.Print(tagName)
|
||||
if strings.Contains(tagName, "table") {
|
||||
if strings.Contains(tagName1, " display: none;") {
|
||||
displayControl = false
|
||||
}
|
||||
break
|
||||
}
|
||||
elemF = parentElement
|
||||
}
|
||||
|
||||
}
|
||||
if displayControl {
|
||||
err = el.Input(value)
|
||||
}
|
||||
elementInsertControl = false
|
||||
break
|
||||
}
|
||||
}
|
||||
if elementInsertControl {
|
||||
if tt != "0" {
|
||||
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 err
|
||||
}
|
||||
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return 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 err
|
||||
}
|
||||
return errors.New(k + " Sütunu Bulunamadı Taslak Hatası, ")
|
||||
}
|
||||
}
|
||||
}
|
||||
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
saveButtonMessage, _ := ReceiveDOMMessages(frame3, ".alert-container", "innerText")
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
if saveButtonMessage != "Bordro hesaplanıyor." {
|
||||
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 err
|
||||
}
|
||||
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return 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 err
|
||||
|
||||
}
|
||||
return errors.New(saveButtonMessage)
|
||||
}
|
||||
|
||||
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)")
|
||||
newBordroPage.WaitLoad()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return 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 err
|
||||
}
|
||||
return err
|
||||
}
|
||||
140
app/lib/bot/rodhelper.go
Normal file
140
app/lib/bot/rodhelper.go
Normal file
@@ -0,0 +1,140 @@
|
||||
package bot
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
"github.com/go-rod/rod/lib/proto"
|
||||
)
|
||||
|
||||
type Select struct {
|
||||
Element *rod.Element
|
||||
Selector string
|
||||
}
|
||||
|
||||
func (elemSelector *Select) SelectItem(changeValue string) error {
|
||||
_, err := elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").value = "` + changeValue + `";}`))
|
||||
_, err = elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").dispatchEvent(new Event('change'));}`))
|
||||
return err
|
||||
|
||||
}
|
||||
func WaitLoad(frm *rod.Page) error { // belli bir süre redirect ten önceki js fonksiyonunun tamamlanması bekleniyor
|
||||
wait := frm.WaitRequestIdle(100*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
err := frm.WaitLoad()
|
||||
return err
|
||||
}
|
||||
func ReceiveDOMMessages(page *rod.Page, selector string, searchValue string) (string, error) {
|
||||
// Tek bir öğe alınması, hata durumunu kontrol etmek için
|
||||
elemd := page.MustElements(selector)
|
||||
|
||||
// Eğer elem boş ise, yani nil ise, hata döndür
|
||||
if len(elemd) == 0 {
|
||||
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
|
||||
return "", err
|
||||
}
|
||||
elem := page.MustElement(selector)
|
||||
// Eğer elem boş ise, yani nil ise, hata döndür
|
||||
if elem == nil {
|
||||
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Öğenin metnini al
|
||||
//text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()
|
||||
// text := elem.MustEval(`() => this.innerText`).String()
|
||||
text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()
|
||||
|
||||
return text, nil
|
||||
}
|
||||
func FillInput(frm *rod.Page, selector string, value string) error {
|
||||
el, err := frm.Element(selector)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = el.Input(value)
|
||||
|
||||
return err
|
||||
|
||||
}
|
||||
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
|
||||
}
|
||||
func Wait(frm *rod.Page, millisecond time.Duration) {
|
||||
wait := frm.WaitRequestIdle(millisecond*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
}
|
||||
func CloseBrowser(browser *rod.Browser) {
|
||||
browser.Close()
|
||||
}
|
||||
func (l *Luca) GetPageByUrl(url string) (*rod.Page, error) {
|
||||
allPages, err := l.Page.Browser().Pages()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
|
||||
}
|
||||
func (l *Luca) GetFrame(page *rod.Page, selector string) (*rod.Page, error) {
|
||||
err := page.WaitLoad()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
frm, err := page.Element(selector)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
frame, err := frm.Frame()
|
||||
return frame, nil
|
||||
}
|
||||
|
||||
func WaitDomElement(page *rod.Page, selector string, duration time.Duration) error {
|
||||
if page == nil {
|
||||
return errors.New("page is nil sellector : " + selector)
|
||||
}
|
||||
//todo: [hd] : timeout taki 10 integer değerini const olarak al ve bunu bastır
|
||||
element, err := page.Timeout(duration * time.Second).Element(selector)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = element.WaitLoad()
|
||||
return err
|
||||
}
|
||||
|
||||
func ReceiveDOMMessagesElements(page *rod.Page, selector string, searchValue string, duration time.Duration) (rod.Elements, error) {
|
||||
//todo
|
||||
// Tek bir öğe alınması, hata durumunu kontrol etmek için
|
||||
elemd, err := page.Timeout(duration * time.Second).Elements(selector)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Eğer elem boş ise, yani nil ise, hata döndür
|
||||
if len(elemd) == 0 {
|
||||
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return elemd, nil
|
||||
}
|
||||
|
||||
// func (elemSelector *Select) MultipleEvalute(changeValue []string) error {
|
||||
// for i := 0; i < len(changeValue); i++ {
|
||||
// _, err := elemSelector.Element.Evaluate(rod.Eval(changeValue[i]))
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
// return nil
|
||||
|
||||
// }
|
||||
@@ -5,11 +5,17 @@ import (
|
||||
)
|
||||
|
||||
type Company struct {
|
||||
Id int `db:"id"`
|
||||
Name string `db:"name"`
|
||||
MemberNumber string `db:"member_number"`
|
||||
Username string `db:"username"`
|
||||
Password string `db:"password"`
|
||||
}
|
||||
type CompanyInfo struct {
|
||||
Company Company
|
||||
Month float64
|
||||
Year float64
|
||||
}
|
||||
|
||||
func (c *Company) Create() error {
|
||||
sq := `
|
||||
@@ -19,3 +25,40 @@ VALUES (:name, :member_number, :username, :password)
|
||||
_, err := run.DB.NamedExec(sq, &c)
|
||||
return err
|
||||
}
|
||||
func (c *Company) Edit() error {
|
||||
sq := `
|
||||
UPDATE company SET
|
||||
name = :name,
|
||||
member_number = :member_number,
|
||||
username = :username,
|
||||
password = :password
|
||||
WHERE id = :id;`
|
||||
_, err := run.DB.NamedExec(sq, &c)
|
||||
return err
|
||||
}
|
||||
|
||||
//func GetCompany(companyName string) (Company, error) {
|
||||
// sq := `
|
||||
// SELECT * FROM company WHERE company = ?
|
||||
// `
|
||||
// err := run.DB.Get(&Company, sq, companyName)
|
||||
// if err != nil {
|
||||
// return Company{}, err
|
||||
// }
|
||||
// return Company{}, nil
|
||||
//}
|
||||
//
|
||||
|
||||
func GetCompany(companyID float64) (Company, error) {
|
||||
var company Company
|
||||
|
||||
sq := `
|
||||
SELECT * FROM company WHERE id = ?
|
||||
`
|
||||
err := run.DB.Get(&company, sq, companyID)
|
||||
if err != nil {
|
||||
return Company{}, err
|
||||
}
|
||||
|
||||
return company, nil
|
||||
}
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
package company
|
||||
|
||||
import (
|
||||
"bordrobot/lib/run"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestCompany_Create(t *testing.T) {
|
||||
err := run.InitDB("../..")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
c := &Company{
|
||||
Name: "Deneme Firması",
|
||||
MemberNumber: "1234",
|
||||
Username: "u1",
|
||||
Password: "p1",
|
||||
}
|
||||
|
||||
err = c.Create()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
run.DB.Close()
|
||||
}
|
||||
package company
|
||||
|
||||
import (
|
||||
"bordrobot/lib/run"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestCompany_Create(t *testing.T) {
|
||||
err := run.InitDB("../..")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
c := &Company{
|
||||
Name: "Deneme Firması",
|
||||
MemberNumber: "1234",
|
||||
Username: "u1",
|
||||
Password: "p1",
|
||||
}
|
||||
|
||||
err = c.Create()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
run.DB.Close()
|
||||
}
|
||||
|
||||
30
app/lib/helper/helper.go
Normal file
30
app/lib/helper/helper.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package helper
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
type errorInfo struct {
|
||||
Error string
|
||||
Index int
|
||||
}
|
||||
|
||||
func (e *errorInfo) ErrorHandle() {
|
||||
//apiden veya txt ye yaz
|
||||
}
|
||||
func CreateFolder(folderName string) error {
|
||||
|
||||
if _, err := os.Stat(folderName); os.IsNotExist(err) {
|
||||
// Klasör yoksa oluştur
|
||||
err := os.Mkdir(folderName, 0755)
|
||||
if err != nil {
|
||||
fmt.Println("Klasör oluşturulamadı:", err)
|
||||
return err
|
||||
}
|
||||
fmt.Println("Klasör oluşturuldu:", folderName)
|
||||
} else {
|
||||
fmt.Println("Klasör zaten var:", folderName)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
348
app/lib/model/bordro.go
Normal file
348
app/lib/model/bordro.go
Normal file
@@ -0,0 +1,348 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
//"github.com/go-rod/rod"
|
||||
)
|
||||
|
||||
type BordroProperty struct {
|
||||
Index int
|
||||
Value string
|
||||
Id string
|
||||
//DomType string
|
||||
}
|
||||
|
||||
type Bordro struct {
|
||||
Sube BordroProperty // 0
|
||||
Bolum BordroProperty //
|
||||
TCKimlikNo BordroProperty //
|
||||
AdiSoyadi BordroProperty //
|
||||
NormalGun BordroProperty //4
|
||||
HaftaTatili BordroProperty //
|
||||
X75 BordroProperty //
|
||||
EksikGunNeden BordroProperty //
|
||||
ArgeDestekVeTasarim BordroProperty //
|
||||
FazlaMesai BordroProperty // 9
|
||||
GeceMesaisi BordroProperty //10
|
||||
BayramMesaisi BordroProperty //
|
||||
Yol BordroProperty //12
|
||||
YemekGun BordroProperty //13
|
||||
YemekTutar BordroProperty //
|
||||
Aile BordroProperty //15
|
||||
Cocuk BordroProperty //
|
||||
Evlenme BordroProperty //17
|
||||
Dogum BordroProperty //18
|
||||
Olum BordroProperty //19
|
||||
Askerlik BordroProperty //20
|
||||
Ozelsigorta BordroProperty //21
|
||||
BireyselEmeklilik BordroProperty //22
|
||||
HayatSigortasi BordroProperty //23
|
||||
PrimNet BordroProperty //24
|
||||
PrimBrut BordroProperty //
|
||||
IkramiyeNet BordroProperty //25
|
||||
IkramiyeBrut BordroProperty //
|
||||
KıdemTazminatı BordroProperty //28
|
||||
IhbarTazminati BordroProperty //29
|
||||
Bayram BordroProperty //30
|
||||
Yakacak BordroProperty //31
|
||||
HuzurHakki BordroProperty //32
|
||||
HediyeKart BordroProperty
|
||||
YakitKart BordroProperty
|
||||
YillikIzin BordroProperty
|
||||
MaasFarki BordroProperty
|
||||
AyirilisPaketi BordroProperty
|
||||
RamazanKumanyasi BordroProperty
|
||||
TelefonDesteği BordroProperty //39
|
||||
EkOdemeNet BordroProperty
|
||||
EkOdemeBrut BordroProperty
|
||||
IsAramaIzni BordroProperty
|
||||
Prim2 BordroProperty //43
|
||||
Prim3 BordroProperty
|
||||
Prim4 BordroProperty
|
||||
CalismaIzniHarci BordroProperty
|
||||
OzeldurumOdenesi BordroProperty
|
||||
EmekliSandigiCalisanPrimi BordroProperty
|
||||
LisanTazminati BordroProperty
|
||||
OdulOdenesi BordroProperty
|
||||
IsSonuTazminati BordroProperty
|
||||
VergiIstisnasiEkOdeme BordroProperty
|
||||
KresYardimi BordroProperty //53
|
||||
EsnekYanHak BordroProperty
|
||||
AracKullanim BordroProperty
|
||||
EgitimDesteği BordroProperty
|
||||
DelegeUcreti BordroProperty
|
||||
HarcTutarlari BordroProperty
|
||||
SendikaIscilikFarkUcretleri BordroProperty
|
||||
IsinmaDesteği BordroProperty
|
||||
SoforlukMesaisi BordroProperty
|
||||
Avans BordroProperty
|
||||
Icra BordroProperty
|
||||
Sendika BordroProperty
|
||||
HediyeKart2 BordroProperty
|
||||
YemekAyni BordroProperty
|
||||
RamazanKumanyasiAyni BordroProperty
|
||||
BagimliOSSKesintisi BordroProperty
|
||||
CalismaIzniHarciAyni BordroProperty
|
||||
TrafikCezasiKesintisi BordroProperty
|
||||
BesKesintisi BordroProperty
|
||||
YakitKart2 BordroProperty
|
||||
GrupBesPersonelPayiKesintisi BordroProperty
|
||||
IstisnadanKaynaklananKesinti BordroProperty
|
||||
EmekliSandigiCalisanPrimKesintisi BordroProperty
|
||||
PesinYillikIzinKesintisi BordroProperty
|
||||
TelefonLimitAsimKesintisi BordroProperty
|
||||
ZimmetTamirKesintisi BordroProperty
|
||||
YakitAsimKesintisi BordroProperty
|
||||
DigerAvanslar BordroProperty
|
||||
DigerKesintiler BordroProperty
|
||||
ZorunluBesKesintisi BordroProperty
|
||||
ZimmetliBilgisayarTamirUcreti BordroProperty
|
||||
HarcTutarlari2 BordroProperty
|
||||
PrimAvansi BordroProperty
|
||||
MasrafKesintisi BordroProperty
|
||||
BireyselEmekPrimi BordroProperty //88
|
||||
OzelsigortaPrimi BordroProperty //89
|
||||
DigerIstisnalar BordroProperty //90
|
||||
}
|
||||
|
||||
func getPageId(id string) string {
|
||||
switch id {
|
||||
case "NormalGun":
|
||||
return "#normalGun0" //Normal Gün
|
||||
case "HaftaTatili":
|
||||
return "#normalGun1" //, "checkbox" Hafta Tatili
|
||||
case "X75":
|
||||
return "" //x7.5
|
||||
case "EksikGunNeden":
|
||||
return "" //Eksik Gün Neden
|
||||
case "ArgeDestekVeTasarim":
|
||||
return "" //ARGE-Destek ve Tasarım Faaliyeti
|
||||
case "FazlaMesai":
|
||||
return "#ekKazancCarpan0" //Fazla Mesai
|
||||
case "GeceMesaisi":
|
||||
return "#ekKazancCarpan1" //Gece Mesaisi
|
||||
case "BayramMesaisi":
|
||||
return "" //Bayram Mesaisi
|
||||
case "Yol":
|
||||
return "#ekKazancCarpan3" //Yol
|
||||
case "YemekGun":
|
||||
return "#ekKazancCarpan4" //Yemek (Gün)
|
||||
case "YemekTutar":
|
||||
return "" //Yemek (Tutar)
|
||||
case "Aile":
|
||||
return "#ekKazancDeger5" //Aile
|
||||
case "Cocuk":
|
||||
return "" //Çocuk
|
||||
case "Evlenme":
|
||||
return "#ekKazancDeger7" //Evlenme
|
||||
case "Dogum":
|
||||
return "#ekKazancDeger8" //Doğum
|
||||
case "Olum":
|
||||
return "#ekKazancDeger9" //Ölüm
|
||||
case "Askerlik":
|
||||
return "#ekKazancDeger10" //Askerlik
|
||||
case "Ozelsigorta":
|
||||
return "#ekKazancDeger11" //Özel Sigorta
|
||||
case "BireyselEmeklilik":
|
||||
return "#ekKazancDeger12" //Bireysel Emeklilik
|
||||
case "HayatSigortasi":
|
||||
return "#ekKazancDeger13" //Hayat Sigortası
|
||||
case "PrimNet":
|
||||
return "#ekKazancDeger14" //Prim (Net)
|
||||
case "PrimBrut":
|
||||
return "#ekKazancDeger15" //Prim (Brüt)
|
||||
case "IkramiyeNet":
|
||||
return "" //İkramiye (Net)
|
||||
case "IkramiyeBrut":
|
||||
return "" //İkramiye (Brüt)
|
||||
case "KıdemTazminatı":
|
||||
return "#ekKazancDeger16" //Kıdem Tazminatı
|
||||
case "IhbarTazminati":
|
||||
return "#ekKazancDeger17" //İhbar Tazminatı
|
||||
case "Bayram":
|
||||
return "#ekKazancDeger18" //Bayram
|
||||
case "Yakacak":
|
||||
return "#ekKazancDeger19" //Yakacak
|
||||
case "HuzurHakki":
|
||||
return "#ekKazancDeger23" //Huzur Hakkı
|
||||
case "HediyeKart":
|
||||
return "" //Hediye Kart*
|
||||
case "YakitKart":
|
||||
return "" //Yakıt Kart*
|
||||
case "YillikIzin":
|
||||
return "" //Yıllık İzin
|
||||
case "MaasFarki":
|
||||
return "" //Maaş Farkı
|
||||
case "AyirilisPaketi":
|
||||
return "" //Ayrılış Paketi
|
||||
case "RamazanKumanyasi":
|
||||
return "" //Ramazan Kumanyası*
|
||||
case "TelefonDesteği":
|
||||
return "#ekKazancDeger21" //Telefon Desteği
|
||||
case "EkOdemeNet":
|
||||
return "" //Ek Ödeme (Net)
|
||||
case "EkOdemeBrut":
|
||||
return "" //Ek Ödeme (Brüt)
|
||||
case "IsAramaIzni":
|
||||
return "" //İş Arama İzni
|
||||
case "Prim2":
|
||||
return "#ekKazancDeger20" //Prim2
|
||||
case "Prim3":
|
||||
return "" //Prim3
|
||||
case "Prim4":
|
||||
return "" //Prim4
|
||||
case "CalismaIzniHarci":
|
||||
return "" //Çalışma İzni Harç. Vb.*
|
||||
case "OzeldurumOdenesi":
|
||||
return "" //Özel Durum Ödemesi
|
||||
case "EmekliSandigiCalisanPrimi":
|
||||
return "" //Emekli Sandığı Çalışan Primi
|
||||
case "LisanTazminati":
|
||||
return "" //Lisan Tazminatı
|
||||
case "OdulOdenesi":
|
||||
return "" //Ödül Ödemesi
|
||||
case "IsSonuTazminati":
|
||||
return "" //İş Sonu Tazminatı
|
||||
case "VergiIstisnasiEkOdeme":
|
||||
return "" //Vergi İstisnası Ek Ödeme
|
||||
case "KresYardimi":
|
||||
return "#ekKazancDeger22" //Kreş Yardımı
|
||||
case "EsnekYanHak":
|
||||
return "" //Esnek Yan Hak
|
||||
case "AracKullanim":
|
||||
return "" //Araç Kullanım
|
||||
case "EgitimDesteği":
|
||||
return "" //Eğitim Desteği
|
||||
case "DelegeUcreti":
|
||||
return "" //Delege Ücreti
|
||||
case "HarcTutarlari":
|
||||
return "" //Harç Tutarları*
|
||||
case "SendikaIscilikFarkUcretleri":
|
||||
return "" //Sendika İşçilik Fark Ücretleri
|
||||
case "IsinmaDesteği":
|
||||
return "" //Isınma Desteği
|
||||
case "SoforlukMesaisi":
|
||||
return "" //Şoförlük Mesaisi
|
||||
case "Avans":
|
||||
return "" //Avans
|
||||
case "Icra":
|
||||
return "" //icra
|
||||
case "Sendika":
|
||||
return "" //Sendika
|
||||
case "HediyeKart2":
|
||||
return "" //Hediye Kart
|
||||
case "YemekAyni":
|
||||
return "" //Yemek (Ayni)
|
||||
case "RamazanKumanyasiAyni":
|
||||
return "" //Ramazan Kumanyası (Ayni)
|
||||
case "BagimliOSSKesintisi":
|
||||
return "" //Bağımlı (Eş-Çocuk) ÖSS Kesintisi
|
||||
case "CalismaIzniHarciAyni":
|
||||
return "" //Çalışma İzni Harç. Vb.(Ayni)
|
||||
case "TrafikCezasiKesintisi":
|
||||
return "" //Trafik Cezası Kesintisi
|
||||
case "BesKesintisi":
|
||||
return ""
|
||||
case "YakitKart2":
|
||||
return ""
|
||||
case "GrupBesPersonelPayiKesintisi":
|
||||
return ""
|
||||
case "IstisnadanKaynaklananKesinti":
|
||||
return ""
|
||||
case "EmekliSandigiCalisanPrimKesintisi":
|
||||
return ""
|
||||
case "PesinYillikIzinKesintisi":
|
||||
return ""
|
||||
case "TelefonLimitAsimKesintisi":
|
||||
return ""
|
||||
case "ZimmetTamirKesintisi":
|
||||
return ""
|
||||
case "YakitAsimKesintisi":
|
||||
return ""
|
||||
case "DigerAvanslar":
|
||||
return ""
|
||||
case "DigerKesintiler":
|
||||
return ""
|
||||
case "ZorunluBesKesintisi":
|
||||
return ""
|
||||
case "ZimmetliBilgisayarTamirUcreti":
|
||||
return ""
|
||||
case "HarcTutarlari2":
|
||||
return ""
|
||||
case "PrimAvansi":
|
||||
return ""
|
||||
case "MasrafKesintisi":
|
||||
return ""
|
||||
case "BireyselEmekPrimi":
|
||||
return "#bireyselEmeklilikIstisna"
|
||||
case "OzelsigortaPrimi":
|
||||
return "#ozelSigortaIstisna"
|
||||
case "DigerIstisnalar":
|
||||
return "#digerIstisna"
|
||||
default:
|
||||
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)
|
||||
// }
|
||||
|
||||
// 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) {
|
||||
bordro := Bordro{} // Yeni bir Bordro örneği oluştur
|
||||
//her indexi eşitleyebilirsin bordro objesine veya tek
|
||||
// Iterate over the fields of MyStruct
|
||||
objValue := reflect.ValueOf(&bordro).Elem()
|
||||
objType := objValue.Type()
|
||||
for i := 0; i < objValue.NumField(); i++ {
|
||||
field := objValue.Field(i)
|
||||
fieldName := objType.Field(i).Name
|
||||
indexField := field.FieldByName("Index")
|
||||
valueField := field.FieldByName("Value")
|
||||
idField := field.FieldByName("Id")
|
||||
|
||||
if len(rows) > i {
|
||||
indexField.SetInt(int64(i))
|
||||
valueField.SetString(rows[i])
|
||||
idField.SetString(getPageId(fieldName))
|
||||
} else {
|
||||
indexField.SetInt(int64(i))
|
||||
valueField.SetString("")
|
||||
idField.SetString(getPageId(fieldName))
|
||||
}
|
||||
|
||||
fmt.Print(field)
|
||||
fmt.Print(fieldName)
|
||||
}
|
||||
fmt.Print(objType)
|
||||
//bordro.Sube = ExcelCellValue{ExcelIndex: 0}
|
||||
|
||||
return &bordro, nil
|
||||
|
||||
}
|
||||
BIN
app/lib/ocr.rar
Normal file
BIN
app/lib/ocr.rar
Normal file
Binary file not shown.
65
app/lib/ocr/geminiCaptcha.go
Normal file
65
app/lib/ocr/geminiCaptcha.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package ocr
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/carlmjohnson/requests"
|
||||
)
|
||||
|
||||
func DecodeGeminiCaptcha(ctx context.Context, image []byte, typ string) (string, error) {
|
||||
var captchaResult string
|
||||
var errBody string
|
||||
|
||||
url := "https://notvis.notitek.com.tr" + "/api/captcha/gemini"
|
||||
|
||||
err := requests.
|
||||
URL(url).
|
||||
Header("X-Api-Key", "3c43c4eb-4b5d-4636-8dd5-3d573a7a0a27").
|
||||
//Header("Content-Type", "application/json").
|
||||
//Header("Authorization", "Bearer "+l.sessionID).
|
||||
BodyBytes(image).
|
||||
ToString(&captchaResult).
|
||||
Method("POST").
|
||||
AddValidator(
|
||||
requests.ValidatorHandler(
|
||||
requests.DefaultValidator,
|
||||
requests.ToString(&errBody),
|
||||
)).
|
||||
Fetch(ctx)
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, requests.ErrInvalidHandled) {
|
||||
err = errors.New(errBody)
|
||||
}
|
||||
}
|
||||
return captchaResult, err
|
||||
}
|
||||
|
||||
func DecodeTwoCaptcha(ctx context.Context, image []byte, typ string) (string, error) {
|
||||
var captchaResult string
|
||||
var errBody string
|
||||
|
||||
url := "https://notvis.notitek.com.tr" + "/api/captcha/twoCaptcha"
|
||||
|
||||
err := requests.
|
||||
URL(url).
|
||||
Header("X-Api-Key", "3c43c4eb-4b5d-4636-8dd5-3d573a7a0a27").
|
||||
BodyBytes(image).
|
||||
ToString(&captchaResult).
|
||||
Method("POST").
|
||||
AddValidator(
|
||||
requests.ValidatorHandler(
|
||||
requests.DefaultValidator,
|
||||
requests.ToString(&errBody),
|
||||
)).
|
||||
Fetch(ctx)
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, requests.ErrInvalidHandled) {
|
||||
err = errors.New(errBody)
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
return captchaResult, err
|
||||
}
|
||||
12
app/lib/ocr/readpdf-75de5191c083.json
Normal file
12
app/lib/ocr/readpdf-75de5191c083.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"type": "service_account",
|
||||
"project_id": "readpdf-247814",
|
||||
"private_key_id": "75de5191c0835028caf9413f8023f26e353064f8",
|
||||
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJ0D23gU4luBgN\nRUmhL9h1qaBqNcv5KGPYUjDcdCGTixea8nOkOxZwYLmKU3VpEmizAAxe2zVrTH0J\nalJwW+u6UUKrgIDbV68/IzYKKKQ7HwrpVnjh0T8kSFTCsfoCcTAmhlFLvHtQBUdU\nxl1E5X+Ckp3K2LOZwi5lrlK3VttSuzFTWmQ2ZMjeEdxwPjsyTsM8XWQ+SQUoPYFj\nuLcqHFf8caZFPWXrxXluTOcJOl/N5OAvObrftUz2stNnwhuPI7648umzdeAuMWGW\nrRd0ZTPDtH0xx56nvSoghNREw9imNVKIlUPwSwCBZ5iNH6fiTO5IdeDG9qWf/STJ\nwVvaDj1xAgMBAAECggEAAdCVktOJgwf8xLcddQ2bwghxy4K1qtqUy0Ux8J7lY7uZ\nzWg7Z1FWClH/A8zBqYg42M3ko+sPYpT1gDgsivDIqzbqhTr1QwOu17/WpJC+U/8b\nd1hdDerLyTpn82LrqfSf8ji9p74Hfdi4+NIv1IbGdsN1bSA1vT7kcUBNY3NXKuSa\nm5ceq6cSzuPH8qxjgkMIxxARCQtNVksMk8lIBoXNk4xxBgGnOwgHWEK9bGarPXZO\n8Z9ruWHCAJL1fiXjyJbVhdz4q8euVdR10KpF+u0/lHx2JMlLBPuIDlC8sxpwX+/V\nSw5wFziGETJiiRgkKxEqKIt/WvjHxDHWkaNZPcXkgQKBgQD0rJvKn4/oS/4kECFo\nAPFZs7uHiMDuTKh9P4aE7Pu1b3sEXAfsjMk3N5j1eV8ACFLzOfCjAStue1MFj81S\nz4dl9NBRNUdE+uTORmiX/Ch2t6bSlKNi8CdkHHKAs6kVk2Wr2XBD0fYKEmGkuh++\nMenBPZuOBjSULy4v1wumW/2UTQKBgQDTJ7tNFzt7hMoW3/djasIHUdJ4m1JZWa1A\n4fDUfvCFARUUr0k1TxcHAtQ5wQwue+uF5J7OixI+xavwHSXBTPQLbn2V2Ypbaa/F\nNr63IR2IKrtwJzt8LTXBvREESajjolvb31Vxf14/0nJgW67bjaLu5/Yq3/mjjRIZ\nqg7PpdNvtQKBgQCD8PTOLn9/CEPTFLO/DwsXkVmmO/O2TbZqXDBhTB5sd+KBtlM7\nl6wGT7/3V+0H6nU43lzKuh2+pVhe3m4dovXj4EHaGP4Gz7lFFyjeFMeJRX37ftYg\ny1qinMiOaNPcY7DnHAlzOS0Rv1nSZ+AoQ2hHob5ZtzTxWAPzHmcU3fR/3QKBgQC8\nJOvcffXvUlurVDafa/GlCgAKnQMcQC6C4I9xGAaBzHwXKTSG/ojbI2csatnK1Xn/\nnLzv9rT0H7fbRG1utn3BbdsS2XpRh3Mpu2Tl0ej5enH3Nc3oEHSUwz1VX7jP08wb\ntvzwG3hET+S//RFp6eMjEqaif111oG5fVcrKtMwX/QKBgCCTlt3lBaZPuUInLEIK\nNRqR7iZnepJsDUMYJj/T/zg+JL0novWViVEQaFB88soNGXjV6WRmytlUDi3PpNe/\nswfxQICn+ylZtYD8VoHL1+l9kDBVUQlKmZuMgh8YKEWKHoAok5gZYedB4Gtte1XQ\n+ase2cuWUegX3FAlcMf3GBqE\n-----END PRIVATE KEY-----\n",
|
||||
"client_email": "my-vision-sa@readpdf-247814.iam.gserviceaccount.com",
|
||||
"client_id": "101714157123021750580",
|
||||
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||
"token_uri": "https://oauth2.googleapis.com/token",
|
||||
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/my-vision-sa%40readpdf-247814.iam.gserviceaccount.com"
|
||||
}
|
||||
BIN
app/lib/ocr/screenshot.png
Normal file
BIN
app/lib/ocr/screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
67
app/lib/ocr/visionapi.go
Normal file
67
app/lib/ocr/visionapi.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package ocr
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"google.golang.org/api/option"
|
||||
|
||||
vision "cloud.google.com/go/vision/apiv1"
|
||||
)
|
||||
|
||||
var credsPath = "C:/Users/huseyin/Desktop/project/notitek/BordroRobot/app/lib/ocr/readpdf-75de5191c083.json"
|
||||
|
||||
func detectText(filePath string) ([]string, error) {
|
||||
ctx := context.Background()
|
||||
|
||||
client, err := vision.NewImageAnnotatorClient(ctx, option.WithCredentialsFile(credsPath))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ImageAnnotatorClient oluşturulamadı: %v", err)
|
||||
}
|
||||
|
||||
f, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Dosya açılamadı: %v", err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
image, err := vision.NewImageFromReader(f)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Resim oluşturulamadı: %v", err)
|
||||
}
|
||||
|
||||
annotations, err := client.DetectTexts(ctx, image, nil, 10)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Metin tespit edilemedi: %v", err)
|
||||
}
|
||||
|
||||
res := make([]string, 0)
|
||||
if len(annotations) == 0 {
|
||||
return nil, fmt.Errorf("Metin tespit edilemedi: %v", err)
|
||||
} else {
|
||||
fmt.Println("Metin:")
|
||||
for _, annotation := range annotations {
|
||||
// fmt.Println(annotation)
|
||||
res = append(res, annotation.Description)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return res, nil
|
||||
|
||||
}
|
||||
|
||||
func VisionApi(path string) ([]string, error) {
|
||||
filePath := path // Örnek bir dosya yolu
|
||||
|
||||
resp, err := detectText(filePath)
|
||||
if err != nil {
|
||||
fmt.Printf("Metin tespit edilemedi: %v\n", err)
|
||||
return nil, err
|
||||
}
|
||||
for _, txt := range resp {
|
||||
fmt.Println(txt)
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
package run
|
||||
|
||||
import "github.com/wailsapp/wails/v3/pkg/application"
|
||||
|
||||
var APP *application.App
|
||||
package run
|
||||
|
||||
import "github.com/wailsapp/wails/v3/pkg/application"
|
||||
|
||||
var APP *application.App
|
||||
|
||||
@@ -38,6 +38,7 @@ func InitDB(path string) error {
|
||||
|
||||
companySchema := `
|
||||
create table company (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name text not null unique,
|
||||
member_number text not null,
|
||||
username text not null,
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
package srv
|
||||
|
||||
import (
|
||||
"bordrobot/lib/bot"
|
||||
"bordrobot/lib/company"
|
||||
"bordrobot/lib/run"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"strings"
|
||||
|
||||
"github.com/shopspring/decimal"
|
||||
"github.com/wailsapp/wails/v3/pkg/application"
|
||||
"github.com/xuri/excelize/v2"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type Srv struct {
|
||||
@@ -28,10 +33,25 @@ func (s *Srv) CreateCompany(name, memberNumber, username, password string) error
|
||||
|
||||
return c.Create()
|
||||
}
|
||||
func (s *Srv) EditCompany(id float64, name, memberNumber, username, password string) error {
|
||||
c := &company.Company{
|
||||
Id: int(id),
|
||||
Name: name,
|
||||
MemberNumber: memberNumber,
|
||||
Username: username,
|
||||
Password: password,
|
||||
}
|
||||
|
||||
return c.Edit()
|
||||
}
|
||||
|
||||
func (s *Srv) UploadExcel() string {
|
||||
dialog := application.OpenFileDialog()
|
||||
dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx")
|
||||
// dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx;*.ods")
|
||||
dialog.AddFilter("Excel 97-2003", "*.xls")
|
||||
dialog.AddFilter("Excel 2007+", "*.xlsx")
|
||||
dialog.AddFilter("LibreOffice Calc", "*.ods")
|
||||
|
||||
dialog.SetTitle("Bordro Excel Dosyası Yükleme")
|
||||
file, err := dialog.PromptForSingleSelection()
|
||||
if err != nil {
|
||||
@@ -41,11 +61,38 @@ func (s *Srv) UploadExcel() string {
|
||||
return file
|
||||
}
|
||||
|
||||
func (s *Srv) Rpa(companyName string, month float64, year float64) error {
|
||||
//todo: readb company details by name
|
||||
//todo: save xls to application folder as /name/year/month.xlsx
|
||||
type userInfo struct {
|
||||
userName string
|
||||
password string
|
||||
accountNo string
|
||||
}
|
||||
|
||||
//wails nümerik değerleri float gönderiyor.. int gönderimi araştırılmalı
|
||||
func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) error {
|
||||
type CompanyInfo struct {
|
||||
company *company.Company // float64.Company türünü gömme
|
||||
month float64 // yeni bir alan ekliyoruz
|
||||
year float64
|
||||
}
|
||||
user, err := company.GetCompany(companyID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// companyInfo := CompanyInfo{
|
||||
// company: &user,
|
||||
// month: month,
|
||||
// year: year,
|
||||
// }
|
||||
|
||||
//todo: readb company details by name
|
||||
b := bot.NewLucaBot(devMode)
|
||||
emitLog("Aktarım Başladı")
|
||||
err = b.Login(user, month, year)
|
||||
if err != nil {
|
||||
//todo: inform user about process and errors
|
||||
emitLog("Şifreniz Hatalı")
|
||||
return nil
|
||||
}
|
||||
err = b.PayrollPageLogin()
|
||||
slog.Debug("inputs", "year", year, "month", month)
|
||||
|
||||
f, err := excelize.OpenFile(s.xlsFileName)
|
||||
@@ -62,21 +109,170 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error {
|
||||
}()
|
||||
|
||||
sheets := f.GetSheetList()
|
||||
cols, err := f.GetCols(sheets[0])
|
||||
rows, err := f.GetRows(sheets[0])
|
||||
fmt.Println(rows)
|
||||
if err != nil {
|
||||
slog.Error(err.Error())
|
||||
return err
|
||||
}
|
||||
for _, row := range cols {
|
||||
//todo: process excel and do data input
|
||||
if len(rows) < 3 {
|
||||
emitLog("Boş Excel Yüklemesi")
|
||||
b.ClosingBrowserFromExternalLink()
|
||||
return nil
|
||||
}
|
||||
// if rows[0][0] == "" {
|
||||
// rows = rows[1:]
|
||||
// }
|
||||
// type hashtagValue struct {
|
||||
// B string
|
||||
// N string
|
||||
// G string
|
||||
// S string
|
||||
// }
|
||||
// checkHeader := make(map[string]*hashtagValue)
|
||||
|
||||
//todo: inform user about process and errors
|
||||
run.APP.Events.Emit(&application.WailsEvent{
|
||||
Name: "logProcess",
|
||||
Data: row[1],
|
||||
})
|
||||
// for _, col := range rows[0] {
|
||||
// if strings.Contains(col, "Cagatay") {
|
||||
// fmt.Print("deneme")
|
||||
// }
|
||||
// var keySplitOne string
|
||||
// hs := &hashtagValue{
|
||||
// B: "",
|
||||
// N: "",
|
||||
// G: "",
|
||||
// S: "",
|
||||
// }
|
||||
// key := col
|
||||
// if strings.Contains(col, "#") {
|
||||
// keySplit := strings.SplitN(col, " #", 2)
|
||||
// key = strings.TrimSpace(keySplit[0])
|
||||
// keySplitOne = strings.TrimSpace(keySplit[0])
|
||||
// fmt.Print(keySplitOne)
|
||||
// if existingHS, ok := checkHeader[key]; ok {
|
||||
// hs = existingHS
|
||||
// }
|
||||
|
||||
// // Burada keySplitOne değerine göre hs struct'ının hangi alanını dolduracağımızı belirliyoruz
|
||||
// if keySplit[1] == "B" {
|
||||
// hs.B = keySplit[1]
|
||||
// } else if keySplit[1] == "N" {
|
||||
// hs.N = keySplit[1]
|
||||
// } else if keySplit[1] == "G" {
|
||||
// hs.G = keySplit[1]
|
||||
// } else if keySplit[1] == "S" {
|
||||
// hs.S = keySplit[1]
|
||||
// }
|
||||
// }
|
||||
// checkHeader[key] = hs
|
||||
|
||||
// }
|
||||
var lastItem bool = false
|
||||
// data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur
|
||||
for i := 1; i < len(rows); i++ {
|
||||
brd := &bot.LucaBordro{
|
||||
Sube: rows[i][0],
|
||||
Bolum: rows[i][1],
|
||||
TcNo: rows[i][2],
|
||||
AdSoyad: rows[i][3],
|
||||
Ucretler: make(map[string]decimal.Decimal),
|
||||
//Header: make(map[string]string),
|
||||
}
|
||||
var status bool = false
|
||||
//var ExcelError string
|
||||
for ndx, col := range rows[i] {
|
||||
if ndx > 3 {
|
||||
key := rows[0][ndx]
|
||||
|
||||
if strings.Contains(key, "#") {
|
||||
keySplit := strings.SplitN(key, " #", 2)
|
||||
keySplitOne := strings.TrimSpace(keySplit[0])
|
||||
tseK := strings.TrimSpace(keySplit[1])
|
||||
fmt.Print(tseK)
|
||||
for k, d := range brd.Ucretler {
|
||||
if strings.Contains(k, keySplitOne) { //k=olan
|
||||
a := d.String()
|
||||
fmt.Print(a)
|
||||
if strings.Contains(k, "B") && strings.Contains(tseK, "N") {
|
||||
if col != "" && a != "0" {
|
||||
emitLog(key + " : aynı anda B ve N Sütunu Girilemez ")
|
||||
status = true
|
||||
break
|
||||
}
|
||||
|
||||
}
|
||||
if strings.Contains(k, "N") && strings.Contains(tseK, "B") {
|
||||
if col != "" && a != "0" {
|
||||
emitLog(key + " : aynı anda N ve B Sütunu Girilemez ")
|
||||
status = true
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
if strings.Contains(k, "G") && strings.Contains(tseK, "S") {
|
||||
if col != "" && a != "0" {
|
||||
emitLog(key + ": aynı anda G ve S Sütunu Girilemez ")
|
||||
status = true
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
if strings.Contains(k, "S") && strings.Contains(tseK, "G") {
|
||||
if col != "" && a != "0" {
|
||||
emitLog(key + ": aynı anda S ve G Sütunu Girilemez ")
|
||||
status = true
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if status {
|
||||
break
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
brd.Ucretler[key], err = decimal.NewFromString(col)
|
||||
if err != nil {
|
||||
if strings.Contains(col, ",") {
|
||||
col = strings.Replace(col, ",", "", -1)
|
||||
brd.Ucretler[key], err = decimal.NewFromString(col)
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
}
|
||||
}
|
||||
// emitLog(`excel okunurken sorun oluştu`)
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
if status {
|
||||
continue
|
||||
}
|
||||
if i == len(rows)-1 {
|
||||
lastItem = true
|
||||
}
|
||||
err := b.BordroYaz(int(month), int(year), brd, lastItem)
|
||||
var str string
|
||||
if err != nil {
|
||||
emitLog("Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "Kullanıcı Adı: " + brd.AdSoyad + err.Error())
|
||||
|
||||
} else {
|
||||
str = "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı, " + "Kullanıcı Adı: " + brd.AdSoyad
|
||||
emitLog(str)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
emitLog("İşlem Tamamlandı")
|
||||
b.ClosingBrowserFromExternalLink()
|
||||
return nil
|
||||
}
|
||||
|
||||
func emitLog(logMessage string) {
|
||||
run.APP.Events.Emit(&application.WailsEvent{
|
||||
Name: "logProcess",
|
||||
Data: logMessage,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user