refresh company list after create company
This commit is contained in:
409
app/lib/bot/luca.go
Normal file
409
app/lib/bot/luca.go
Normal file
@@ -0,0 +1,409 @@
|
||||
package bot
|
||||
|
||||
import (
|
||||
"bordrobot/lib/company"
|
||||
"bordrobot/lib/model"
|
||||
"bordrobot/lib/ocr"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
"github.com/go-rod/rod/lib/launcher"
|
||||
"github.com/go-rod/rod/lib/proto"
|
||||
)
|
||||
|
||||
type Luca struct {
|
||||
Page *rod.Page
|
||||
Browser *rod.Browser
|
||||
}
|
||||
|
||||
func websiteMessage(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 clickItem(frm *rod.Page, selector string, clickCount int) error {
|
||||
// Sayfadan ilgili öğeyi bul
|
||||
dd, err := frm.Element(selector)
|
||||
err = dd.Click(proto.InputMouseButtonLeft, clickCount)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// func (elemSelector *rod.Element)SelectItem(frm *rod.Page, selector string, changeValue string) error {
|
||||
// elemSelector.Eval(`document.getElementById("` + selector + `").value = "` + changeValue + `";`)
|
||||
// elemSelector.Eval(`document.getElementById("` + selector + `").dispatchEvent(new Event('change'));`)
|
||||
// // _, err := frm.Evaluate(rod.Eval(`
|
||||
// // document.getElementById("` + selector + `").value = "` + changeValue + `";
|
||||
// // `))
|
||||
// // _, err = frm.Evaluate(rod.Eval(`
|
||||
// // document.getElementById("` + selector + `").dispatchEvent(new Event('change'));
|
||||
// // `))
|
||||
// return err
|
||||
|
||||
// }
|
||||
func NewLucaBot() *Luca {
|
||||
l := launcher.New().
|
||||
Headless(false).
|
||||
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) error {
|
||||
page := l.Page
|
||||
page.MustElement("#musteriNo").MustInput(company.MemberNumber)
|
||||
page.Timeout(500)
|
||||
page.MustElement("#kullaniciAdi").MustInput(company.Username)
|
||||
page.Timeout(500)
|
||||
page.MustElement("#parola").MustInput(company.Password)
|
||||
page.Timeout(500)
|
||||
page.MustWaitNavigation()
|
||||
|
||||
result, err := page.Evaluate(rod.Eval(`document.getElementById(girisbtn())`))
|
||||
if err != nil {
|
||||
}
|
||||
page.Timeout(500)
|
||||
loginDialog := "body > div.swal2-container.swal2-fade.swal2-in > div > div.swal2-content" // Örneğinizdeki CSS seçicisini buraya yazın
|
||||
loginDialogMessage, err := websiteMessage(page, loginDialog, "innerText")
|
||||
if err != nil {
|
||||
fmt.Errorf("hata verdi handle")
|
||||
}
|
||||
if loginDialogMessage == "Müşteri No, Kullanıcı Adı veya Parola hatalıdır." {
|
||||
fmt.Println("Şifre hatalı")
|
||||
}
|
||||
var captchaMsg []string
|
||||
getUrl := page.MustInfo().URL
|
||||
splitUrl := strings.Split(getUrl, "/")
|
||||
splitUrlPage := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
|
||||
if splitUrlPage != "main.erp" {
|
||||
captcha := "#captcha" // Örneğinizdeki CSS seçicisini buraya yazın
|
||||
wait := page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err := page.Evaluate(rod.Eval(`document.getElementsByTagName("body")[0].style.backgroundImage = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik1")[0].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik2")[0].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = "none"`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
datas, err := page.Screenshot(true, &proto.PageCaptureScreenshot{})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = ioutil.WriteFile("C:/Users/huseyin/Desktop/project/notitek/BordroRobot/app/lib/ocr/screenshot.png", datas, 0644)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
captchaMessage, err := websiteMessage(page, captcha, "src")
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByTagName("body")[0].style.backgroundImage = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik1")[0].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik2")[0].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = ""`))
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
_, err = page.Evaluate(rod.Eval(`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = ""`))
|
||||
captchaMsg, err = ocr.VisionApi("C:/Users/huseyin/Desktop/project/notitek/BordroRobot/app/lib/ocr/screenshot.png")
|
||||
if captchaMessage != "" {
|
||||
splitUrlPage = "captcha"
|
||||
}
|
||||
if err != nil {
|
||||
fmt.Errorf("captcha Getirilirken hata oluştu")
|
||||
}
|
||||
//fmt.Println(captchaMessage) //sil
|
||||
}
|
||||
fmt.Println(result) //sil
|
||||
|
||||
//page.MustElement("#captcha-input").MustInput(captchaMessage)
|
||||
|
||||
switch splitUrlPage {
|
||||
case "giris.erp":
|
||||
rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`)
|
||||
//kullanıcı adı ve şifre yanlış hatası verecek error basılacak
|
||||
case "captcha":
|
||||
captchaString := captchaMsg[0]
|
||||
page.MustElement("#captcha-input").MustInput(strings.Trim(captchaString, " "))
|
||||
captchaButton, err := page.Evaluate(rod.Eval(`document.getElementById(document.forms[0].submit())`))
|
||||
if err != nil {
|
||||
}
|
||||
fmt.Println("Sonuç:", captchaButton)
|
||||
getUrl = page.MustInfo().URL
|
||||
splitUrl = strings.Split(getUrl, "/")
|
||||
uri := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
|
||||
if uri != "main" {
|
||||
fmt.Println("captcha tekrar deneme fonksiyonuna sok")
|
||||
//captcha tekrar denenecek
|
||||
}
|
||||
}
|
||||
wait := page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
_, err = page.Evaluate(rod.Eval(`gonder('formTarget');`))
|
||||
|
||||
wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
return err
|
||||
|
||||
}
|
||||
func (l *Luca) NavigateBordroGiris() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *Luca) BordroYaz(data []*model.Bordro) error {
|
||||
page := l.Page
|
||||
allPages, err := page.Browser().Pages()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
//fs4, err := newPage.Element("#frm4")
|
||||
//if err != nil {
|
||||
// log.Fatal(err)
|
||||
//}
|
||||
fs2, err := newPage.Element("#frm2")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
frame, err := fs2.Frame()
|
||||
fs3, err := newPage.Element("#frm3")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
frame3, err := fs3.Frame()
|
||||
err = newPage.WaitLoad()
|
||||
//_, err = fs2.Evaluate(rod.Eval(`document.getElementById('apy1000m0i1ITD').dispatchEvent(new MouseEvent('mouseover', { 'bubbles': true }));`))
|
||||
err = clickItem(frame, "#apy1000m0i1ITD", 1)
|
||||
fmt.Println(err)
|
||||
err = clickItem(frame3, "#apy1000m33i4ITX", 1)
|
||||
fmt.Println(err)
|
||||
err = newPage.WaitLoad()
|
||||
wait := newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
isyeriSelectBox, err := websiteMessage(frame3, "#isyeriId", "innerHTML")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
wait = newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
wait = newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
wait()
|
||||
|
||||
for i := 0; i < len(data); i++ {
|
||||
options := strings.Split(isyeriSelectBox, "</option>")
|
||||
vls := ""
|
||||
bolum := ""
|
||||
|
||||
for _, option := range options {
|
||||
// "value" ve metin içeriğini almak için regex kullanma
|
||||
re := regexp.MustCompile(`value="(.+)"[^>]*>([^<]+)`)
|
||||
matches := re.FindStringSubmatch(option)
|
||||
if len(matches) >= 3 {
|
||||
value := matches[1]
|
||||
text := matches[2]
|
||||
|
||||
// "BESMART" değerini içeren option öğelerini bulma
|
||||
if text == data[0].Sube.Value {
|
||||
vls = value
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isyeriId := vls
|
||||
element, err := frame3.Element("#isyeriId")
|
||||
selectInput := Select{Element: element, Selector: "#isyeriId"}
|
||||
selectInput.SelectItem(isyeriId)
|
||||
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
bolumSelectBox, err := websiteMessage(frame3, "#bolumId", "innerHTML")
|
||||
fmt.Println(bolumSelectBox)
|
||||
bolums := strings.Split(bolumSelectBox, "</option>")
|
||||
for _, option := range bolums {
|
||||
// "value" ve metin içeriğini almak için regex kullanma
|
||||
re := regexp.MustCompile(`value="(.+)"[^>]*>([^<]+)`)
|
||||
matches := re.FindStringSubmatch(option)
|
||||
if len(matches) >= 3 {
|
||||
value := strings.Trim(matches[1], " ")
|
||||
text := strings.Trim(matches[2], " ")
|
||||
|
||||
// "BESMART" değerini içeren option öğelerini bulma
|
||||
if text == "FİNANS" {
|
||||
bolum = value
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bolumId := bolum
|
||||
element, err = frame3.Element("#bolumId")
|
||||
selectInput = Select{Element: element, Selector: "#bolumId"}
|
||||
selectInput.SelectItem(bolumId)
|
||||
|
||||
err = WaitLoad(frame3)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// wait = newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil)
|
||||
// wait()
|
||||
aktarimDonem := "1"
|
||||
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
|
||||
}
|
||||
|
||||
// wait = newPage.WaitRequestIdle(1000*time.Millisecond, nil, nil, nil)
|
||||
// wait()
|
||||
//var targetID string
|
||||
elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']")
|
||||
trs, err := frame3.Elements("#scroll > table > tbody > tr")
|
||||
var foundIndex int = -1
|
||||
for i := 0; i < len(elems); i++ {
|
||||
tex, err := elems[i].Text()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tex == data[i].TCKimlikNo.Value {
|
||||
//targetID = tex
|
||||
foundIndex = i
|
||||
break
|
||||
}
|
||||
fmt.Print(elems, tex)
|
||||
}
|
||||
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
|
||||
calculate, err := frame3.Element("body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
calculate.Click(proto.InputMouseButtonLeft, 1)
|
||||
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
|
||||
|
||||
}
|
||||
|
||||
// func (l *Luca)pageInsert(data, b* model.PageStruct){
|
||||
|
||||
// }
|
||||
|
||||
//type Luca struct {
|
||||
//}
|
||||
//
|
||||
//func NewLucaBot() *Luca {
|
||||
// return &Luca{}
|
||||
//}
|
||||
//func (l *Luca) Login() error {
|
||||
// return nil
|
||||
//}
|
||||
//func (l *Luca) NavigateBordroGiris() error {
|
||||
// return nil
|
||||
//}
|
||||
//
|
||||
//func (l *Luca) BordroYaz(b *model.Bordro) {
|
||||
//
|
||||
//}
|
||||
@@ -19,3 +19,29 @@ VALUES (:name, :member_number, :username, :password)
|
||||
_, 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(companyName string) (Company, error) {
|
||||
var company Company
|
||||
|
||||
sq := `
|
||||
SELECT * FROM company WHERE name = ?
|
||||
`
|
||||
err := run.DB.Get(&company, sq, companyName)
|
||||
if err != nil {
|
||||
return Company{}, err
|
||||
}
|
||||
|
||||
return company, nil
|
||||
}
|
||||
|
||||
350
app/lib/model/bordro.go
Normal file
350
app/lib/model/bordro.go
Normal file
@@ -0,0 +1,350 @@
|
||||
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 int) string {
|
||||
switch id {
|
||||
case 4:
|
||||
return "#normalGun0"
|
||||
case 5:
|
||||
return "#normalGun1" //, "checkbox"
|
||||
case 6:
|
||||
return ""
|
||||
case 7:
|
||||
return ""
|
||||
case 8:
|
||||
return ""
|
||||
case 9:
|
||||
return "#ekKazancCarpan0"
|
||||
case 10:
|
||||
return "#ekKazancCarpan1"
|
||||
case 11:
|
||||
return ""
|
||||
case 12:
|
||||
return "#ekKazancCarpan3"
|
||||
case 13:
|
||||
return "#ekKazancCarpan4"
|
||||
case 14:
|
||||
return ""
|
||||
case 15:
|
||||
return "#ekKazancDeger5"
|
||||
case 16:
|
||||
return ""
|
||||
case 17:
|
||||
return "#ekKazancDeger7"
|
||||
case 18:
|
||||
return "#ekKazancDeger8"
|
||||
case 19:
|
||||
return "#ekKazancDeger9"
|
||||
case 20:
|
||||
return "#ekKazancDeger10"
|
||||
case 21:
|
||||
return "#ekKazancDeger11"
|
||||
case 22:
|
||||
return "#ekKazancDeger12"
|
||||
case 23:
|
||||
return "#ekKazancDeger13"
|
||||
case 24:
|
||||
return "#ekKazancDeger14" //primNet
|
||||
case 25:
|
||||
return "#ekKazancDeger15"
|
||||
case 26:
|
||||
return ""
|
||||
case 27:
|
||||
return ""
|
||||
case 28:
|
||||
return "#ekKazancDeger16"
|
||||
case 29:
|
||||
return "#ekKazancDeger17"
|
||||
case 30:
|
||||
return "#ekKazancDeger18"
|
||||
case 31:
|
||||
return "#ekKazancDeger19"
|
||||
case 32:
|
||||
return "#ekKazancDeger23"
|
||||
case 33:
|
||||
return ""
|
||||
case 34:
|
||||
return ""
|
||||
case 35:
|
||||
return ""
|
||||
case 36:
|
||||
return ""
|
||||
case 37:
|
||||
return ""
|
||||
case 38:
|
||||
return ""
|
||||
case 39:
|
||||
return "#ekKazancDeger21"
|
||||
case 40:
|
||||
return ""
|
||||
case 41:
|
||||
return ""
|
||||
case 42:
|
||||
return ""
|
||||
case 43:
|
||||
return "#ekKazancDeger20"
|
||||
case 44:
|
||||
return ""
|
||||
case 45:
|
||||
return ""
|
||||
case 46:
|
||||
return ""
|
||||
case 47:
|
||||
return ""
|
||||
case 48:
|
||||
return ""
|
||||
case 49:
|
||||
return ""
|
||||
case 50:
|
||||
return ""
|
||||
case 51:
|
||||
return ""
|
||||
case 52:
|
||||
return ""
|
||||
case 53:
|
||||
return "#ekKazancDeger22"
|
||||
case 54:
|
||||
return ""
|
||||
case 55:
|
||||
return ""
|
||||
case 56:
|
||||
return ""
|
||||
case 57:
|
||||
return ""
|
||||
case 58:
|
||||
return ""
|
||||
case 59:
|
||||
return ""
|
||||
case 60:
|
||||
return ""
|
||||
case 61:
|
||||
return ""
|
||||
case 62:
|
||||
return ""
|
||||
case 63:
|
||||
return ""
|
||||
case 64:
|
||||
return ""
|
||||
case 65:
|
||||
return ""
|
||||
case 66:
|
||||
return ""
|
||||
case 67:
|
||||
return ""
|
||||
case 68:
|
||||
return ""
|
||||
case 69:
|
||||
return ""
|
||||
case 70:
|
||||
return ""
|
||||
case 71:
|
||||
return ""
|
||||
case 72:
|
||||
return ""
|
||||
case 73:
|
||||
return ""
|
||||
case 74:
|
||||
return ""
|
||||
case 75:
|
||||
return ""
|
||||
case 76:
|
||||
return ""
|
||||
case 77:
|
||||
return ""
|
||||
case 78:
|
||||
return ""
|
||||
case 79:
|
||||
return ""
|
||||
case 80:
|
||||
return ""
|
||||
case 81:
|
||||
return ""
|
||||
case 82:
|
||||
return ""
|
||||
case 83:
|
||||
return ""
|
||||
case 84:
|
||||
return ""
|
||||
case 85:
|
||||
return ""
|
||||
case 86:
|
||||
return ""
|
||||
case 87:
|
||||
return ""
|
||||
case 88:
|
||||
return "#bireyselEmeklilikIstisna"
|
||||
case 89:
|
||||
return "#ozelSigortaIstisna"
|
||||
case 90:
|
||||
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(i))
|
||||
} else {
|
||||
indexField.SetInt(int64(i))
|
||||
valueField.SetString("")
|
||||
idField.SetString(getPageId(i))
|
||||
}
|
||||
|
||||
fmt.Print(field)
|
||||
fmt.Print(fieldName)
|
||||
}
|
||||
fmt.Print(objType)
|
||||
//bordro.Sube = ExcelCellValue{ExcelIndex: 0}
|
||||
|
||||
return &bordro, nil
|
||||
|
||||
}
|
||||
@@ -1,11 +1,15 @@
|
||||
package srv
|
||||
|
||||
import (
|
||||
"bordrobot/lib/bot"
|
||||
"bordrobot/lib/company"
|
||||
"bordrobot/lib/model"
|
||||
"bordrobot/lib/run"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
|
||||
"github.com/wailsapp/wails/v3/pkg/application"
|
||||
"github.com/xuri/excelize/v2"
|
||||
"log/slog"
|
||||
)
|
||||
|
||||
type Srv struct {
|
||||
@@ -41,8 +45,40 @@ func (s *Srv) UploadExcel() string {
|
||||
return file
|
||||
}
|
||||
|
||||
type userInfo struct {
|
||||
userName string
|
||||
password string
|
||||
accountNo string
|
||||
}
|
||||
|
||||
func getUser(userId string) *userInfo {
|
||||
// user, ok := userDB[userId]
|
||||
//
|
||||
// if !ok {
|
||||
// return nil
|
||||
// }
|
||||
info := userInfo{accountNo: "3197485", userName: "NOTİTEK01", password: "Notitek2025."}
|
||||
//info := userInfo{accountNo: "3197485", userName: "NOTİTEK01", password: "sdaasd."}
|
||||
return &info
|
||||
}
|
||||
func (s *Srv) Rpa(companyName string, month float64, year float64) error {
|
||||
|
||||
user, err := company.GetCompany(companyName)
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
//todo: readb company details by name
|
||||
b := bot.NewLucaBot()
|
||||
b.Login(user)
|
||||
//b.BordroYaz(data,b.page,,)
|
||||
|
||||
//err := b.Login()
|
||||
//err := b.Login(şirket, accoun no, parola vsç..)
|
||||
//şirket login bilgilerini sqlite'tan oku
|
||||
//ardında BOT init et (global değişken de olmayabilir) init fonksyionu bot'u dönebilir
|
||||
//bot'ta login ol
|
||||
//bot'ta olması gereken veri yazma sayfasına browse et
|
||||
|
||||
//todo: save xls to application folder as /name/year/month.xlsx
|
||||
|
||||
//wails nümerik değerleri float gönderiyor.. int gönderimi araştırılmalı
|
||||
@@ -62,21 +98,45 @@ 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
|
||||
|
||||
//todo: inform user about process and errors
|
||||
run.APP.Events.Emit(&application.WailsEvent{
|
||||
Name: "logProcess",
|
||||
Data: row[1],
|
||||
})
|
||||
|
||||
if rows[0][0] == "" {
|
||||
rows = rows[1:]
|
||||
}
|
||||
data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur
|
||||
for i := 1; i < len(rows); i++ {
|
||||
bordroSatiri, err := model.NewFromExcelLine(rows[i])
|
||||
data = append(data, bordroSatiri)
|
||||
//
|
||||
fmt.Println(bordroSatiri, err)
|
||||
}
|
||||
b.BordroYaz(data)
|
||||
|
||||
//for _, row := range rows {
|
||||
// //todo: process excel and do data input
|
||||
// fmt.Println(row)
|
||||
// // satır satır execli oku,
|
||||
//
|
||||
// //yukarıda init edilen bot'ta' yazma kodunu çalıştır..
|
||||
//
|
||||
// bordroSatiri, err := model.NewFromExcelLine(row)
|
||||
// fmt.Println(bordroSatiri, err)
|
||||
// b.BordroYaz(bordroSatiri)
|
||||
//
|
||||
// //todo: inform user about process and errors
|
||||
// emitLog(row[1])
|
||||
//}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func emitLog(logMessage string) {
|
||||
run.APP.Events.Emit(&application.WailsEvent{
|
||||
Name: "logProcess",
|
||||
Data: logMessage,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user