From 4053d951bff1b8b069433fdc70ead3b73be74383 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Sat, 30 Mar 2024 15:26:57 +0300 Subject: [PATCH 01/19] refresh company list after create company --- app/BotService.go | 19 - app/frontend/bindings/lib/company/Company.js | 2 +- app/frontend/bindings/lib/srv/Srv.js | 11 +- app/go.mod | 44 +- app/go.sum | 674 ++++++++++++++++++- app/lib/bot/luca.go | 409 +++++++++++ app/lib/company/company.go | 26 + app/lib/model/bordro.go | 350 ++++++++++ app/lib/srv/srv.go | 82 ++- 9 files changed, 1569 insertions(+), 48 deletions(-) delete mode 100644 app/BotService.go create mode 100644 app/lib/bot/luca.go create mode 100644 app/lib/model/bordro.go diff --git a/app/BotService.go b/app/BotService.go deleted file mode 100644 index 03f4dc4..0000000 --- a/app/BotService.go +++ /dev/null @@ -1,19 +0,0 @@ -package main - -import "github.com/wailsapp/wails/v3/pkg/application" - -type BotService struct{} - -var excelFilePath string - -func (g *BotService) ClaimFile() string { - - dialog := application.OpenFileDialog() - dialog.SetTitle("Lütfen yüklenecek Excel dosyanızı seçiniz") - file, err := dialog.PromptForSingleSelection() - if err != nil { - return "" - } - excelFilePath = file - return file -} diff --git a/app/frontend/bindings/lib/company/Company.js b/app/frontend/bindings/lib/company/Company.js index e117ea8..df97b33 100644 --- a/app/frontend/bindings/lib/company/Company.js +++ b/app/frontend/bindings/lib/company/Company.js @@ -4,7 +4,7 @@ import {Call} from '@wailsio/runtime'; -/** +/** * @function Create * @returns {Promise} **/ diff --git a/app/frontend/bindings/lib/srv/Srv.js b/app/frontend/bindings/lib/srv/Srv.js index 573224e..47c6d89 100644 --- a/app/frontend/bindings/lib/srv/Srv.js +++ b/app/frontend/bindings/lib/srv/Srv.js @@ -4,7 +4,7 @@ import {Call} from '@wailsio/runtime'; -/** +/** * @function Companies * @returns {Promise} **/ @@ -12,7 +12,7 @@ export async function Companies() { return Call.ByName("srv.Srv.Companies", ...Array.prototype.slice.call(arguments, 0)); } -/** +/** * @function CreateCompany * @param name {string} * @param memberNumber {string} @@ -24,17 +24,18 @@ export async function CreateCompany(name, memberNumber, username, password) { return Call.ByName("srv.Srv.CreateCompany", ...Array.prototype.slice.call(arguments, 0)); } -/** +/** * @function Rpa + * @param companyName {string} * @param month {number} * @param year {number} * @returns {Promise} **/ -export async function Rpa(month, year) { +export async function Rpa(companyName, month, year) { return Call.ByName("srv.Srv.Rpa", ...Array.prototype.slice.call(arguments, 0)); } -/** +/** * @function UploadExcel * @returns {Promise} **/ diff --git a/app/go.mod b/app/go.mod index b422ba9..c9345a2 100644 --- a/app/go.mod +++ b/app/go.mod @@ -5,15 +5,31 @@ go 1.22 toolchain go1.22.1 require ( + cloud.google.com/go/vision v1.2.0 + github.com/go-rod/rod v0.114.8 github.com/jmoiron/sqlx v1.3.5 github.com/wailsapp/wails/v3 v3.0.0-alpha.0 github.com/xuri/excelize/v2 v2.8.1 + google.golang.org/api v0.172.0 modernc.org/sqlite v1.29.5 ) require ( + cloud.google.com/go v0.112.0 // indirect + cloud.google.com/go/compute v1.23.4 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/longrunning v0.5.4 // indirect + cloud.google.com/go/vision/v2 v2.7.5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/leaanthony/slicer v1.5.0 // indirect @@ -27,10 +43,30 @@ require ( github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect - golang.org/x/crypto v0.19.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sys v0.17.0 // indirect + github.com/ysmood/fetchup v0.2.3 // indirect + github.com/ysmood/goob v0.4.0 // indirect + github.com/ysmood/got v0.34.1 // indirect + github.com/ysmood/gson v0.7.3 // indirect + github.com/ysmood/leakless v0.8.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.41.0 // indirect modernc.org/mathutil v1.6.0 // indirect diff --git a/app/go.sum b/app/go.sum index 746985e..53516e9 100644 --- a/app/go.sum +++ b/app/go.sum @@ -1,19 +1,215 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.23.4 h1:EBT9Nw4q3zyE7G45Wvv3MzolIrCJEuHys5muLY0wvAw= +cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-rod/rod v0.114.8 h1:2Mr2kO17blDAwWU4+eOBPgRf0w+6bfUxsPc7Nzd9VXk= +github.com/go-rod/rod v0.114.8/go.mod h1:aiedSEFg5DwG/fnNbUOTPMTTWX3MRj6vIs/a684Mthw= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= @@ -31,6 +227,7 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= @@ -38,6 +235,19 @@ github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7 github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= @@ -52,32 +262,477 @@ github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGu github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE= github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4= github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ= +github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns= +github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= +github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18= +github.com/ysmood/gop v0.0.2 h1:VuWweTmXK+zedLqYufJdh3PlxDNBOfFHjIZlPT2T5nw= +github.com/ysmood/gop v0.0.2/go.mod h1:rr5z2z27oGEbyB787hpEcx4ab8cCiPnKxn0SUHt6xzk= +github.com/ysmood/got v0.34.1 h1:IrV2uWLs45VXNvZqhJ6g2nIhY+pgIG1CUoOcqfXFl1s= +github.com/ysmood/got v0.34.1/go.mod h1:yddyjq/PmAf08RMLSwDjPyCvHvYed+WjHnQxpH851LM= +github.com/ysmood/gotrace v0.6.0 h1:SyI1d4jclswLhg7SWTL6os3L1WOKeNn/ZtzVQF8QmdY= +github.com/ysmood/gotrace v0.6.0/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM= +github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE= +github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg= +github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak= +github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.172.0 h1:/1OcMZGPmW1rX2LCu2CmGUD1KXK1+pfzxotxyRUCCdk= +google.golang.org/api v0.172.0/go.mod h1:+fJZq6QXWfa9pXhnIzsjx4yI22d4aI9ZpLb58gvXjis= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 h1:rIo7ocm2roD9DcFIX67Ym8icoGCKSARAiPljFhh5suQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= @@ -94,3 +749,6 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go new file mode 100644 index 0000000..781fda5 --- /dev/null +++ b/app/lib/bot/luca.go @@ -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, "") + 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, "") + 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) { +// +//} diff --git a/app/lib/company/company.go b/app/lib/company/company.go index 7166815..7b667a0 100644 --- a/app/lib/company/company.go +++ b/app/lib/company/company.go @@ -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 +} diff --git a/app/lib/model/bordro.go b/app/lib/model/bordro.go new file mode 100644 index 0000000..ab789fa --- /dev/null +++ b/app/lib/model/bordro.go @@ -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 + +} diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index 92141ce..9e47f25 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -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, + }) +} -- 2.40.1 From 56fbba2ab79543a8be10a055bae986b2fcbe855a Mon Sep 17 00:00:00 2001 From: hysn99 Date: Sat, 30 Mar 2024 15:35:53 +0300 Subject: [PATCH 02/19] rod helper added --- app/lib/bot/rodhelper.go | 25 ++++++++++ app/lib/ocr/readpdf-75de5191c083.json | 12 +++++ app/lib/ocr/screenshot.png | Bin 0 -> 21800 bytes app/lib/ocr/visionapi.go | 67 ++++++++++++++++++++++++++ docs/deneme.xlsx | Bin 0 -> 15026 bytes 5 files changed, 104 insertions(+) create mode 100644 app/lib/bot/rodhelper.go create mode 100644 app/lib/ocr/readpdf-75de5191c083.json create mode 100644 app/lib/ocr/screenshot.png create mode 100644 app/lib/ocr/visionapi.go create mode 100644 docs/deneme.xlsx diff --git a/app/lib/bot/rodhelper.go b/app/lib/bot/rodhelper.go new file mode 100644 index 0000000..d6445ec --- /dev/null +++ b/app/lib/bot/rodhelper.go @@ -0,0 +1,25 @@ +package bot + +import ( + "time" + + "github.com/go-rod/rod" +) + +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(50*time.Millisecond, nil, nil, nil) + wait() + err := frm.WaitLoad() + return err +} diff --git a/app/lib/ocr/readpdf-75de5191c083.json b/app/lib/ocr/readpdf-75de5191c083.json new file mode 100644 index 0000000..3a6344e --- /dev/null +++ b/app/lib/ocr/readpdf-75de5191c083.json @@ -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" +} diff --git a/app/lib/ocr/screenshot.png b/app/lib/ocr/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..85564c19f4a213f15ddabd15e092a73e939c73ce GIT binary patch literal 21800 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 G`hNi^^8O3} literal 0 HcmV?d00001 diff --git a/app/lib/ocr/visionapi.go b/app/lib/ocr/visionapi.go new file mode 100644 index 0000000..04c9734 --- /dev/null +++ b/app/lib/ocr/visionapi.go @@ -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 +} diff --git a/docs/deneme.xlsx b/docs/deneme.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ffdf3fbf04c6b91178206f395daa53dd0ee0383 GIT binary patch literal 15026 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 m@8o5ZY4A5H000PYugW(zowNUO_WuAz_^5^e literal 0 HcmV?d00001 -- 2.40.1 From 5ec8f05e16f87d435093cc6ce1df98a355d5c755 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Sun, 31 Mar 2024 23:55:05 +0300 Subject: [PATCH 03/19] application dynamics fixed and error handling done --- app/lib/bot/luca.go | 460 ++++++++++++++++++++------------------- app/lib/bot/rodhelper.go | 67 +++++- app/lib/helper/helper.go | 30 +++ app/lib/model/bordro.go | 314 +++++++++++++------------- app/lib/srv/srv.go | 40 ++-- 5 files changed, 497 insertions(+), 414 deletions(-) create mode 100644 app/lib/helper/helper.go diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index 781fda5..dce2b63 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -2,12 +2,14 @@ package bot import ( "bordrobot/lib/company" + "bordrobot/lib/helper" "bordrobot/lib/model" "bordrobot/lib/ocr" + "errors" "fmt" "io/ioutil" "log" - "regexp" + "strconv" "strings" "time" @@ -16,57 +18,96 @@ import ( "github.com/go-rod/rod/lib/proto" ) +var pageErrors []string + 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 +type errorInfo struct { + Error string + Index int } -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) + +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"`, + } + 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 + + captchaMsg, err = ocr.VisionApi("./processFolder/screenshot.png") + fmt.Print(captchaMessage) + + trimmedMsg := strings.ReplaceAll(captchaMsg[0], " ", "") + 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 (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). @@ -88,243 +129,177 @@ func NewLucaBot() *Luca { 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())`)) + err := WaitLoad(page) if err != nil { + return err + } + err = FillInput(page, "#musteriNo", company.MemberNumber) + if err != nil { + return err } 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") + err = FillInput(page, "#kullaniciAdi", company.Username) if err != nil { - fmt.Errorf("hata verdi handle") + 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(500) + 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." { - fmt.Println("Şifre hatalı") + return errors.New("Ş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 - } + VerifyCaptcha(page) } + fmt.Println(result) wait := page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil) wait() - _, err = page.Evaluate(rod.Eval(`gonder('formTarget');`)) + _, err = page.Evaluate(rod.Eval(`()=>{gonder('formTarget');}`)) + if err != nil { + return err + } 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 { +func (l *Luca) BordroYaz(data []*model.Bordro, month float64, year float64) error { page := l.Page allPages, err := page.Browser().Pages() if err != nil { - log.Fatal(err) + return err } newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do") if err != nil { - log.Fatal(err) + return err } - - //fs4, err := newPage.Element("#frm4") - //if err != nil { - // log.Fatal(err) - //} fs2, err := newPage.Element("#frm2") if err != nil { - log.Fatal(err) + return err } frame, err := fs2.Frame() fs3, err := newPage.Element("#frm3") if err != nil { - log.Fatal(err) + return 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) + return err } - wait = newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil) - wait() - - wait = newPage.WaitRequestIdle(500*time.Millisecond, nil, nil, nil) - wait() + err = ClickItem(frame, "#apy1000m0i1ITD", 1) + if err != nil { + return err + } + fmt.Println(err) + err = ClickItem(frame3, "#apy1000m33i4ITX", 1) + if err != nil { + return err + } + err = newPage.WaitLoad() + if err != nil { + return err + } + Wait(newPage, 1500) for i := 0; i < len(data); i++ { - options := strings.Split(isyeriSelectBox, "") - 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 - } + if i != 0 { + err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) + if err != nil { + return err } } + err = WaitLoad(frame3) + if err != nil { + return err + } + isyeriId := "" + bolumId := "" + bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option") + for j := 0; j < len(bordroCompanySelectBox); j++ { + text, err := bordroCompanySelectBox[j].Text() + value, err := bordroCompanySelectBox[j].Property("value") + if err != nil { + return err + } + if strings.Trim(text, " ") == data[i].Sube.Value { + isyeriId = value.String() + break + } + fmt.Print(text, value) + } - isyeriId := vls element, err := frame3.Element("#isyeriId") + if err != nil { + return err + } selectInput := Select{Element: element, Selector: "#isyeriId"} - selectInput.SelectItem(isyeriId) - + err = selectInput.SelectItem(isyeriId) + if err != nil { + return err + } err = WaitLoad(frame3) if err != nil { return err } - bolumSelectBox, err := websiteMessage(frame3, "#bolumId", "innerHTML") - fmt.Println(bolumSelectBox) - bolums := strings.Split(bolumSelectBox, "") - 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 - } + bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option") + if err != nil { + return err + } + for j := 0; j < len(bordroDepartmentSelectBox); j++ { + text, err := bordroDepartmentSelectBox[j].Text() + value, err := bordroDepartmentSelectBox[j].Property("value") + if err != nil { + return err } + if strings.Trim(text, " ") == data[i].Bolum.Value { + bolumId = value.String() + break + } + fmt.Print(text, value) } - bolumId := bolum element, err = frame3.Element("#bolumId") + if err != nil { + return err + } selectInput = Select{Element: element, Selector: "#bolumId"} - selectInput.SelectItem(bolumId) - + err = selectInput.SelectItem(bolumId) + if err != nil { + return err + } 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) + aktarimDonem := strconv.FormatFloat(month, 'f', -1, 64) + err = ClickItem(frame3, "#tr"+aktarimDonem+" > td:nth-child(1)", 2) if err != nil { log.Fatal(err) } @@ -335,25 +310,58 @@ func (l *Luca) BordroYaz(data []*model.Bordro) error { return err } - // wait = newPage.WaitRequestIdle(1000*time.Millisecond, nil, nil, nil) - // wait() + var isEmpty bool = false //var targetID string elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']") + if err != nil { + return err + } + elemsProcess, err := frame3.Elements("#scroll > table > tbody > tr > td > a") + if err != nil { + return err + } trs, err := frame3.Elements("#scroll > table > tbody > tr") + if err != nil { + return err + } var foundIndex int = -1 - for i := 0; i < len(elems); i++ { - tex, err := elems[i].Text() + if len(elems) == 0 { + isEmptyError := errorInfo{ + Error: "Böyle Bir Kullanıcı Bulunamadı", + Index: i, + } + pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) + continue + } + for j := 0; j < len(elems); j++ { + tex, err := elems[j].Text() + if err != nil { + return err + } + process, err := elemsProcess[j].Text() if err != nil { return err } if tex == data[i].TCKimlikNo.Value { - //targetID = tex - foundIndex = i + foundIndex = j + if process == "Bordro Sil" { + isEmpty = true + } break } fmt.Print(elems, tex) } + if isEmpty == true { + isEmptyError := errorInfo{ + Error: "Yazılı Bordro Var Lütfen Siliniz", + Index: i, + } + pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) + + continue + } if foundIndex != -1 { + trs[foundIndex].Click(proto.InputMouseButtonLeft, 2) } err = WaitLoad(frame3) @@ -363,11 +371,10 @@ func (l *Luca) BordroYaz(data []*model.Bordro) error { } 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") + 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 + log.Fatal(err) } - calculate.Click(proto.InputMouseButtonLeft, 1) err = WaitLoad(frame3) if err != nil { return err @@ -383,6 +390,7 @@ func (l *Luca) BordroYaz(data []*model.Bordro) error { } } + CloseBrowser(l.Browser) return err } diff --git a/app/lib/bot/rodhelper.go b/app/lib/bot/rodhelper.go index d6445ec..89863bb 100644 --- a/app/lib/bot/rodhelper.go +++ b/app/lib/bot/rodhelper.go @@ -1,9 +1,11 @@ package bot import ( + "fmt" "time" "github.com/go-rod/rod" + "github.com/go-rod/rod/lib/proto" ) type Select struct { @@ -12,14 +14,73 @@ type Select struct { } 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'));`)) + _, 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(50*time.Millisecond, nil, nil, nil) + 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.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 (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 + +// } diff --git a/app/lib/helper/helper.go b/app/lib/helper/helper.go new file mode 100644 index 0000000..2a10878 --- /dev/null +++ b/app/lib/helper/helper.go @@ -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 +} diff --git a/app/lib/model/bordro.go b/app/lib/model/bordro.go index ab789fa..9f8ad67 100644 --- a/app/lib/model/bordro.go +++ b/app/lib/model/bordro.go @@ -107,181 +107,179 @@ type Bordro struct { DigerIstisnalar BordroProperty //90 } -func getPageId(id int) string { +func getPageId(id string) string { switch id { - case 4: - return "#normalGun0" - case 5: - return "#normalGun1" //, "checkbox" - case 6: + 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 7: + case "YakitKart2": return "" - case 8: + case "GrupBesPersonelPayiKesintisi": return "" - case 9: - return "#ekKazancCarpan0" - case 10: - return "#ekKazancCarpan1" - case 11: + case "IstisnadanKaynaklananKesinti": return "" - case 12: - return "#ekKazancCarpan3" - case 13: - return "#ekKazancCarpan4" - case 14: + case "EmekliSandigiCalisanPrimKesintisi": return "" - case 15: - return "#ekKazancDeger5" - case 16: + case "PesinYillikIzinKesintisi": 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: + case "TelefonLimitAsimKesintisi": return "" - case 27: + case "ZimmetTamirKesintisi": return "" - case 28: - return "#ekKazancDeger16" - case 29: - return "#ekKazancDeger17" - case 30: - return "#ekKazancDeger18" - case 31: - return "#ekKazancDeger19" - case 32: - return "#ekKazancDeger23" - case 33: + case "YakitAsimKesintisi": return "" - case 34: + case "DigerAvanslar": return "" - case 35: + case "DigerKesintiler": return "" - case 36: + case "ZorunluBesKesintisi": return "" - case 37: + case "ZimmetliBilgisayarTamirUcreti": return "" - case 38: + case "HarcTutarlari2": return "" - case 39: - return "#ekKazancDeger21" - case 40: + case "PrimAvansi": return "" - case 41: + case "MasrafKesintisi": 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: + case "BireyselEmekPrimi": return "#bireyselEmeklilikIstisna" - case 89: + case "OzelsigortaPrimi": return "#ozelSigortaIstisna" - case 90: + case "DigerIstisnalar": return "#digerIstisna" default: return "" @@ -332,11 +330,11 @@ func NewFromExcelLine(rows []string) (*Bordro, error) { if len(rows) > i { indexField.SetInt(int64(i)) valueField.SetString(rows[i]) - idField.SetString(getPageId(i)) + idField.SetString(getPageId(fieldName)) } else { indexField.SetInt(int64(i)) valueField.SetString("") - idField.SetString(getPageId(i)) + idField.SetString(getPageId(fieldName)) } fmt.Print(field) diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index 9e47f25..4eb20ed 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -69,19 +69,14 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { } //todo: readb company details by name b := bot.NewLucaBot() - b.Login(user) - //b.BordroYaz(data,b.page,,) + err = b.Login(user) + if err != nil { + //todo: inform user about process and errors + emitLog("Şifreniz Hatalı") + return nil - //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ı slog.Debug("inputs", "year", year, "month", month) f, err := excelize.OpenFile(s.xlsFileName) @@ -114,22 +109,13 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { // 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]) - //} + err = b.BordroYaz(data, month, year) + if err != nil { + //emitLog(err.message) + return err + } else { + emitLog("işlem başarılı") + } return nil } -- 2.40.1 From 321a76096f3657ed9738350f88ca977332bb53fe Mon Sep 17 00:00:00 2001 From: hysn99 Date: Tue, 2 Apr 2024 09:51:14 +0300 Subject: [PATCH 04/19] edit dialog added --- .../src/components/dlg/EditCompany.vue | 66 ++++++++++ app/frontend/src/pages/IndexPage.vue | 28 +++++ app/lib/bot/luca.go | 119 ++++++++++++++---- app/lib/company/company.go | 5 + app/lib/ocr/screenshot.png | Bin 21800 -> 13057 bytes app/lib/srv/srv.go | 16 ++- 6 files changed, 209 insertions(+), 25 deletions(-) create mode 100644 app/frontend/src/components/dlg/EditCompany.vue diff --git a/app/frontend/src/components/dlg/EditCompany.vue b/app/frontend/src/components/dlg/EditCompany.vue new file mode 100644 index 0000000..a7ceae2 --- /dev/null +++ b/app/frontend/src/components/dlg/EditCompany.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/app/frontend/src/pages/IndexPage.vue b/app/frontend/src/pages/IndexPage.vue index 1c4cf59..77263a6 100644 --- a/app/frontend/src/pages/IndexPage.vue +++ b/app/frontend/src/pages/IndexPage.vue @@ -34,6 +34,13 @@ color="secondary" /> +
+ +
{{ ld.xlsFile }}
@@ -75,6 +82,7 @@ diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index 67e90c1..eae8728 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -52,7 +52,6 @@ type userInfo struct { } func (s *Srv) Rpa(companyName string, month float64, year float64) error { - emitLog("") type CompanyInfo struct { company *company.Company // float64.Company türünü gömme month float64 // yeni bir alan ekliyoruz -- 2.40.1 From ce9a40de24f14187eb12c885d249336cb924fd09 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Thu, 4 Apr 2024 20:41:18 +0300 Subject: [PATCH 11/19] update --- app/lib/srv/srv.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index eae8728..f1089e0 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -108,7 +108,6 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { if rows[0][0] == "" { rows = rows[1:] } - var insertMessage []string var lastItem bool = false // data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur for i := 1; i < len(rows); i++ { @@ -137,14 +136,10 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { err := b.BordroYaz(int(month), int(year), brd, lastItem) var str string if err != nil { - insertMessage = append(insertMessage, err.Error()) - for _, v := range insertMessage { - str += "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + v + ", " - } - emitLog(str) + emitLog(err.Error()) } else { - str += "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı, " + str = "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı, " emitLog(str) } -- 2.40.1 From a5612d6d9e11b82c36840374f85644b4925c0d33 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Thu, 4 Apr 2024 21:33:06 +0300 Subject: [PATCH 12/19] update --- app/lib/bot/luca.go | 22 +++++++++++----------- app/lib/srv/srv.go | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index d681c88..e638d67 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -534,17 +534,6 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { return err } var foundIndex int = -1 - if len(elems) == 0 { - err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) - if err != nil { - return err - } - err = WaitLoad(frame3) - if err != nil { - return err - } - return errors.New("Böyle Bir Kullanıcı Bulunamadı") - } for j := 0; j < len(elems); j++ { tex, err := elems[j].Text() if err != nil { @@ -563,6 +552,17 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { } fmt.Print(elems, tex) } + 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 { diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index f1089e0..dba03cf 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -136,10 +136,10 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error { err := b.BordroYaz(int(month), int(year), brd, lastItem) var str string if err != nil { - emitLog(err.Error()) + 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ı, " + str = "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı, " + "Kullanıcı Adı: " + brd.AdSoyad emitLog(str) } -- 2.40.1 From bfcb484104d003c407811491a9fbeb2768fc348e Mon Sep 17 00:00:00 2001 From: hysn99 Date: Mon, 15 Apr 2024 14:50:36 +0300 Subject: [PATCH 13/19] project flow completed --- app/frontend/bindings/lib/company/Company.js | 8 ++ app/frontend/bindings/lib/srv/Srv.js | 17 +++- .../src/components/dlg/EditCompany.vue | 9 +- app/frontend/src/pages/IndexPage.vue | 37 ++++---- app/lib/bot/luca.go | 89 +++++++++++++----- app/lib/company/company.go | 18 +++- app/lib/run/db.go | 1 + app/lib/srv/srv.go | 22 +++-- app/processFolder/screenshot.png | Bin 13263 -> 13937 bytes 9 files changed, 143 insertions(+), 58 deletions(-) diff --git a/app/frontend/bindings/lib/company/Company.js b/app/frontend/bindings/lib/company/Company.js index df97b33..ea282ff 100644 --- a/app/frontend/bindings/lib/company/Company.js +++ b/app/frontend/bindings/lib/company/Company.js @@ -11,3 +11,11 @@ import {Call} from '@wailsio/runtime'; export async function Create() { return Call.ByName("company.Company.Create", ...Array.prototype.slice.call(arguments, 0)); } + +/** + * @function Edit + * @returns {Promise} + **/ +export async function Edit() { + return Call.ByName("company.Company.Edit", ...Array.prototype.slice.call(arguments, 0)); +} diff --git a/app/frontend/bindings/lib/srv/Srv.js b/app/frontend/bindings/lib/srv/Srv.js index 47c6d89..d0e5058 100644 --- a/app/frontend/bindings/lib/srv/Srv.js +++ b/app/frontend/bindings/lib/srv/Srv.js @@ -24,14 +24,27 @@ export async function CreateCompany(name, memberNumber, username, password) { return Call.ByName("srv.Srv.CreateCompany", ...Array.prototype.slice.call(arguments, 0)); } +/** + * @function EditCompany + * @param id {number} + * @param name {string} + * @param memberNumber {string} + * @param username {string} + * @param password {string} + * @returns {Promise} + **/ +export async function EditCompany(id, name, memberNumber, username, password) { + return Call.ByName("srv.Srv.EditCompany", ...Array.prototype.slice.call(arguments, 0)); +} + /** * @function Rpa - * @param companyName {string} + * @param companyID {number} * @param month {number} * @param year {number} * @returns {Promise} **/ -export async function Rpa(companyName, month, year) { +export async function Rpa(companyID, month, year) { return Call.ByName("srv.Srv.Rpa", ...Array.prototype.slice.call(arguments, 0)); } diff --git a/app/frontend/src/components/dlg/EditCompany.vue b/app/frontend/src/components/dlg/EditCompany.vue index a7ceae2..5576800 100644 --- a/app/frontend/src/components/dlg/EditCompany.vue +++ b/app/frontend/src/components/dlg/EditCompany.vue @@ -40,24 +40,19 @@ defineEmits([ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent() const props = defineProps({ + id: Number, name: String, memberNumber: Number, userName: String, password: String - // companyName: String, - // initialMemberNumber: Number, - // username: String, - // password: String }) const ld = reactive({ + id : props.id || 0, name: props.name || '', memberNumber: props.memberNumber || 0, userName: props.userName || '', password: props.password || '', }) -console.log(props) - - diff --git a/app/frontend/src/pages/IndexPage.vue b/app/frontend/src/pages/IndexPage.vue index 60e7875..8fe670b 100644 --- a/app/frontend/src/pages/IndexPage.vue +++ b/app/frontend/src/pages/IndexPage.vue @@ -7,12 +7,18 @@ @@ -44,6 +39,11 @@ no-caps color="secondary" /> +
{{ ld.xlsFile }} -- 2.40.1 From 0f51cd2848c5412650b55a29b7ce74b097b65930 Mon Sep 17 00:00:00 2001 From: hysn99 Date: Fri, 26 Apr 2024 15:01:18 +0300 Subject: [PATCH 16/19] decimal price bug solved --- app/lib/bot/luca.go | 14 +++++++++++++- app/lib/srv/srv.go | 14 +++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index 406dfaa..1d52659 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -636,6 +636,7 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { for i := 0; i < len(rsp); i++ { if k == rsp[i].Value { + Wait(frame3, 200) if rsp[i].itemType == "selectBox" { elemBox, err := frame3.Element("#" + rsp[i].Index) if err != nil { @@ -653,7 +654,18 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { if err != nil { return err } - err = el.Input(v.String()) + if strings.Contains(rsp[i].Index, "Carpan") { + 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) + } + + err = el.Input(value) elementInsertControl = false break } diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index af6dc52..4f7f516 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -6,6 +6,7 @@ import ( "bordrobot/lib/run" "fmt" "log/slog" + "strings" "github.com/shopspring/decimal" "github.com/wailsapp/wails/v3/pkg/application" @@ -115,9 +116,9 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) b.ClosingBrowserFromExternalLink() return nil } - if rows[0][0] == "" { - rows = rows[1:] - } + // if rows[0][0] == "" { + // rows = rows[1:] + // } var lastItem bool = false // data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur for i := 1; i < len(rows); i++ { @@ -134,6 +135,13 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) key := rows[0][ndx] 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) } -- 2.40.1 From 06a2175726fa4135b9d135f8d1d28f2151b59f5c Mon Sep 17 00:00:00 2001 From: hysn99 Date: Mon, 29 Apr 2024 13:23:53 +0300 Subject: [PATCH 17/19] update --- app/lib/bot/luca.go | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index 1d52659..b83d66b 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -628,6 +628,7 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { } for k, v := range b.Ucretler { var elementInsertControl bool = true + var displayControl bool = true tt := v.String() if k == "Normal Gün" { continue @@ -664,8 +665,38 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { 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) - err = el.Input(value) + } + 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 } -- 2.40.1 From 88bdbb969dd6c47760fa0791e9e38c8152b26342 Mon Sep 17 00:00:00 2001 From: huseyindervis Date: Thu, 23 May 2024 08:45:10 +0300 Subject: [PATCH 18/19] Header S, G, N, H parameters added --- app/lib/bot/bordro.go | 10 ++++++++ app/lib/bot/luca.go | 60 +++++++++++++++++++++++++++++++++++++++---- app/lib/srv/srv.go | 48 +++++++++++++++++++++++++++++++++- 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/app/lib/bot/bordro.go b/app/lib/bot/bordro.go index 5b84b89..18ffbc1 100644 --- a/app/lib/bot/bordro.go +++ b/app/lib/bot/bordro.go @@ -8,4 +8,14 @@ type LucaBordro struct { 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" +) diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index b83d66b..f3fdda2 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -30,9 +30,14 @@ type errorInfo struct { Index int } type BordroPageScript struct { - Index string - Value string - itemType string + Index string + Value string + itemType string + DomSelectValue struct { + Index string + Value string + itemType string + } } func (l *Luca) ErrFunc(index bool) { @@ -348,6 +353,16 @@ func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) ([]BordroPageSc } 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) @@ -627,6 +642,8 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { break } 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() @@ -637,6 +654,11 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { for i := 0; i < len(rsp); i++ { if k == rsp[i].Value { + var hashValue string + if len(splitValue) > 1 { + hashValue = strings.TrimSpace(splitValue[1]) + fmt.Println(hashValue) + } Wait(frame3, 200) if rsp[i].itemType == "selectBox" { elemBox, err := frame3.Element("#" + rsp[i].Index) @@ -655,12 +677,40 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { if err != nil { return err } - if strings.Contains(rsp[i].Index, "Carpan") { - el, err = frame3.Element("#" + rsp[i+1].Index) + // //s ve g olunca i yi çalıştır n ve b olunca i+1 i + if hashValue == "S" || hashValue == "G" { + 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 + } + } + } value := v.String() if strings.Contains(value, ".") { value = strings.Replace(value, ".", ",", -1) diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index 4f7f516..dba6885 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -128,11 +128,54 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) 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, _ := range brd.Ucretler { + if strings.Contains(k, keySplitOne) { //k=olan + if strings.Contains(k, "B") && strings.Contains(tseK, "N") { + emitLog("Şube : aynı anda B ve N Sütunu Girilemez ") + status = true + break + + } + if strings.Contains(k, "N") && strings.Contains(tseK, "B") { + emitLog("Şube : aynı anda N ve B Sütunu Girilemez ") + status = true + + break + } + if strings.Contains(k, "G") && strings.Contains(tseK, "S") { + emitLog("Şube : aynı anda G ve S Sütunu Girilemez ") + status = true + + break + } + if strings.Contains(k, "S") && strings.Contains(tseK, "G") { + emitLog("Şube : 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, ",") { @@ -147,6 +190,9 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) } } } + if status { + break + } if i == len(rows)-1 { lastItem = true } -- 2.40.1 From ac071a8cda6f991d706762ef88a3c06b49f6680b Mon Sep 17 00:00:00 2001 From: huseyindervis Date: Thu, 23 May 2024 17:18:09 +0300 Subject: [PATCH 19/19] s and g , n and b distinction was made --- app/lib/bot/luca.go | 40 +++++++++++++++++++--- app/lib/srv/srv.go | 81 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 102 insertions(+), 19 deletions(-) diff --git a/app/lib/bot/luca.go b/app/lib/bot/luca.go index f3fdda2..2a98205 100644 --- a/app/lib/bot/luca.go +++ b/app/lib/bot/luca.go @@ -316,6 +316,7 @@ func (l *Luca) Login(company company.Company, month float64, year float64) error } 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 @@ -647,6 +648,9 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { var elementInsertControl bool = true var displayControl bool = true tt := v.String() + if tt == "0" { + continue + } if k == "Normal Gün" { continue } @@ -677,8 +681,26 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { 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" { + 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 @@ -711,6 +733,14 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { } } } + 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) @@ -775,10 +805,10 @@ func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error { if err != nil { return err } - saveButtonMessage, err := ReceiveDOMMessages(frame3, ".alert-container", "innerText") - 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() diff --git a/app/lib/srv/srv.go b/app/lib/srv/srv.go index dba6885..87cb7cc 100644 --- a/app/lib/srv/srv.go +++ b/app/lib/srv/srv.go @@ -118,6 +118,49 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) } // if rows[0][0] == "" { // rows = rows[1:] + // } + // type hashtagValue struct { + // B string + // N string + // G string + // S string + // } + // checkHeader := make(map[string]*hashtagValue) + + // 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 @@ -141,31 +184,41 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) keySplitOne := strings.TrimSpace(keySplit[0]) tseK := strings.TrimSpace(keySplit[1]) fmt.Print(tseK) - for k, _ := range brd.Ucretler { + 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") { - emitLog("Şube : aynı anda B ve N Sütunu Girilemez ") - status = true - break + 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") { - emitLog("Şube : aynı anda N ve B Sütunu Girilemez ") - status = true + if col != "" && a != "0" { + emitLog(key + " : aynı anda N ve B Sütunu Girilemez ") + status = true - break + break + } } if strings.Contains(k, "G") && strings.Contains(tseK, "S") { - emitLog("Şube : aynı anda G ve S Sütunu Girilemez ") - status = true + if col != "" && a != "0" { + emitLog(key + ": aynı anda G ve S Sütunu Girilemez ") + status = true - break + break + } } if strings.Contains(k, "S") && strings.Contains(tseK, "G") { - emitLog("Şube : aynı anda S ve G Sütunu Girilemez ") - status = true + if col != "" && a != "0" { + emitLog(key + ": aynı anda S ve G Sütunu Girilemez ") + status = true - break + break + } } } @@ -191,7 +244,7 @@ func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) } } if status { - break + continue } if i == len(rows)-1 { lastItem = true -- 2.40.1