This commit is contained in:
Hüseyin
2026-06-16 09:07:10 +03:00
parent 2dfda9d553
commit bd08898bf1
91 changed files with 15477 additions and 11812 deletions

10
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

9
.idea/BordroRobot.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

10
.idea/go.imports.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GoImports">
<option name="excludedPackages">
<array>
<option value="golang.org/x/net/context" />
</array>
</option>
</component>
</project>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/BordroRobot.iml" filepath="$PROJECT_DIR$/.idea/BordroRobot.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

17
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "./app/main.go",
"env": {},
"args": []
}
]
}

BIN
app/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -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
}

View File

@@ -1,438 +1,438 @@
version: '3' version: '3'
vars: vars:
APP_NAME: "bordro-robotu" APP_NAME: "bordro-robotu"
BIN_DIR: "bin" BIN_DIR: "bin"
tasks: tasks:
## -------------------------- Build -------------------------- ## ## -------------------------- Build -------------------------- ##
build: build:
summary: Builds the application summary: Builds the application
cmds: cmds:
# Build for current OS # Build for current OS
- task: build:{{OS}} - task: build:{{OS}}
# Uncomment to build for specific OSes # Uncomment to build for specific OSes
# - task: build:linux # - task: build:linux
# - task: build:windows # - task: build:windows
# - task: build:darwin # - task: build:darwin
## ------> Windows <------- ## ------> Windows <-------
build:windows: build:windows:
summary: Builds the application for Windows summary: Builds the application for Windows
deps: deps:
- task: go:mod:tidy - task: go:mod:tidy
- task: build:frontend - task: build:frontend
- task: generate:icons - task: generate:icons
- task: generate:syso - task: generate:syso
vars: vars:
ARCH: '{{.ARCH}}' ARCH: '{{.ARCH}}'
cmds: cmds:
- go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/bordro-robotu.exe - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/bordro-robotu.exe
vars: vars:
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s -H windowsgui"{{else}}-gcflags=all="-N -l"{{end}}' BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s -H windowsgui"{{else}}-gcflags=all="-N -l"{{end}}'
env: env:
GOOS: windows GOOS: windows
CGO_ENABLED: 0 CGO_ENABLED: 0
GOARCH: '{{.ARCH | default ARCH}}' GOARCH: '{{.ARCH | default ARCH}}'
PRODUCTION: '{{.PRODUCTION | default "false"}}' PRODUCTION: '{{.PRODUCTION | default "false"}}'
build:windows:prod:arm64: build:windows:prod:arm64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:windows - task: build:windows
vars: vars:
ARCH: arm64 ARCH: arm64
PRODUCTION: "true" PRODUCTION: "true"
build:windows:prod:amd64: build:windows:prod:amd64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:windows - task: build:windows
vars: vars:
ARCH: amd64 ARCH: amd64
PRODUCTION: "true" PRODUCTION: "true"
build:windows:debug:arm64: build:windows:debug:arm64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:windows - task: build:windows
vars: vars:
ARCH: arm64 ARCH: arm64
build:windows:debug:amd64: build:windows:debug:amd64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:windows - task: build:windows
vars: vars:
ARCH: amd64 ARCH: amd64
## ------> Darwin <------- ## ------> Darwin <-------
build:darwin: build:darwin:
summary: Creates a production build of the application summary: Creates a production build of the application
deps: deps:
- task: go:mod:tidy - task: go:mod:tidy
- task: build:frontend - task: build:frontend
- task: generate:icons - task: generate:icons
cmds: cmds:
- go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}} - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/{{.APP_NAME}}
vars: vars:
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s"{{else}}-gcflags=all="-N -l"{{end}}' BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s"{{else}}-gcflags=all="-N -l"{{end}}'
env: env:
GOOS: darwin GOOS: darwin
CGO_ENABLED: 1 CGO_ENABLED: 1
GOARCH: '{{.ARCH | default ARCH}}' GOARCH: '{{.ARCH | default ARCH}}'
CGO_CFLAGS: "-mmacosx-version-min=10.15" CGO_CFLAGS: "-mmacosx-version-min=10.15"
CGO_LDFLAGS: "-mmacosx-version-min=10.15" CGO_LDFLAGS: "-mmacosx-version-min=10.15"
MACOSX_DEPLOYMENT_TARGET: "10.15" MACOSX_DEPLOYMENT_TARGET: "10.15"
PRODUCTION: '{{.PRODUCTION | default "false"}}' PRODUCTION: '{{.PRODUCTION | default "false"}}'
build:darwin:prod:arm64: build:darwin:prod:arm64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:darwin - task: build:darwin
vars: vars:
ARCH: arm64 ARCH: arm64
PRODUCTION: "true" PRODUCTION: "true"
build:darwin:prod:amd64: build:darwin:prod:amd64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:darwin - task: build:darwin
vars: vars:
ARCH: amd64 ARCH: amd64
PRODUCTION: "true" PRODUCTION: "true"
build:darwin:debug:arm64: build:darwin:debug:arm64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:darwin - task: build:darwin
vars: vars:
ARCH: arm64 ARCH: arm64
build:darwin:debug:amd64: build:darwin:debug:amd64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:darwin - task: build:darwin
vars: vars:
ARCH: amd64 ARCH: amd64
## ------> Linux <------- ## ------> Linux <-------
build:linux: build:linux:
summary: Builds the application for Linux summary: Builds the application for Linux
deps: deps:
- task: go:mod:tidy - task: go:mod:tidy
- task: build:frontend - task: build:frontend
- task: generate:icons - task: generate:icons
vars: vars:
ARCH: '{{.ARCH}}' ARCH: '{{.ARCH}}'
cmds: cmds:
- go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/bordro-robotu - go build {{.BUILD_FLAGS}} -o {{.BIN_DIR}}/bordro-robotu
vars: vars:
BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s"{{else}}-gcflags=all="-N -l"{{end}}' BUILD_FLAGS: '{{if eq .PRODUCTION "true"}}-tags production -ldflags="-w -s"{{else}}-gcflags=all="-N -l"{{end}}'
env: env:
GOOS: linux GOOS: linux
CGO_ENABLED: 1 CGO_ENABLED: 1
GOARCH: '{{.ARCH | default ARCH}}' GOARCH: '{{.ARCH | default ARCH}}'
PRODUCTION: '{{.PRODUCTION | default "false"}}' PRODUCTION: '{{.PRODUCTION | default "false"}}'
build:linux:prod:arm64: build:linux:prod:arm64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:linux - task: build:linux
vars: vars:
ARCH: arm64 ARCH: arm64
PRODUCTION: "true" PRODUCTION: "true"
build:linux:prod:amd64: build:linux:prod:amd64:
summary: Creates a production build of the application summary: Creates a production build of the application
cmds: cmds:
- task: build:linux - task: build:linux
vars: vars:
ARCH: amd64 ARCH: amd64
PRODUCTION: "true" PRODUCTION: "true"
build:linux:debug:arm64: build:linux:debug:arm64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:linux - task: build:linux
vars: vars:
ARCH: arm64 ARCH: arm64
build:linux:debug:amd64: build:linux:debug:amd64:
summary: Creates a debug build of the application summary: Creates a debug build of the application
cmds: cmds:
- task: build:linux - task: build:linux
vars: vars:
ARCH: amd64 ARCH: amd64
## -------------------------- Package -------------------------- ## ## -------------------------- Package -------------------------- ##
package: package:
summary: Packages a production build of the application into a bundle summary: Packages a production build of the application into a bundle
cmds: cmds:
# Package for current OS # Package for current OS
- task: package:{{OS}} - task: package:{{OS}}
# Package for specific os/arch # Package for specific os/arch
# - task: package:darwin:arm64 # - task: package:darwin:arm64
# - task: package:darwin:amd64 # - task: package:darwin:amd64
# - task: package:windows:arm64 # - task: package:windows:arm64
# - task: package:windows:amd64 # - task: package:windows:amd64
## ------> Windows <------ ## ------> Windows <------
package:windows: package:windows:
summary: Packages a production build of the application into a `.exe` bundle summary: Packages a production build of the application into a `.exe` bundle
cmds: cmds:
- task: create:nsis:installer - task: create:nsis:installer
vars: vars:
ARCH: '{{.ARCH}}' ARCH: '{{.ARCH}}'
vars: vars:
ARCH: '{{.ARCH | default ARCH}}' ARCH: '{{.ARCH | default ARCH}}'
package:windows:arm64: package:windows:arm64:
summary: Packages a production build of the application into a `.exe` bundle summary: Packages a production build of the application into a `.exe` bundle
cmds: cmds:
- task: package:windows - task: package:windows
vars: vars:
ARCH: arm64 ARCH: arm64
package:windows:amd64: package:windows:amd64:
summary: Packages a production build of the application into a `.exe` bundle summary: Packages a production build of the application into a `.exe` bundle
cmds: cmds:
- task: package:windows - task: package:windows
vars: vars:
ARCH: amd64 ARCH: amd64
generate:syso: generate:syso:
summary: Generates Windows `.syso` file summary: Generates Windows `.syso` file
dir: build dir: build
cmds: cmds:
- wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails.syso - wails3 generate syso -arch {{.ARCH}} -icon icon.ico -manifest wails.exe.manifest -info info.json -out ../wails.syso
vars: vars:
ARCH: '{{.ARCH | default ARCH}}' ARCH: '{{.ARCH | default ARCH}}'
create:nsis:installer: create:nsis:installer:
summary: Creates an NSIS installer summary: Creates an NSIS installer
label: "NSIS Installer ({{.ARCH}})" label: "NSIS Installer ({{.ARCH}})"
dir: build/nsis dir: build/nsis
sources: sources:
- "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}.exe" - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}.exe"
generates: generates:
- "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}-{{.ARCH}}-installer.exe" - "{{.ROOT_DIR}}\\bin\\{{.APP_NAME}}-{{.ARCH}}-installer.exe"
deps: deps:
- task: build:windows - task: build:windows
vars: vars:
PRODUCTION: "true" PRODUCTION: "true"
ARCH: '{{.ARCH}}' ARCH: '{{.ARCH}}'
cmds: cmds:
- makensis -DARG_WAILS_'{{.ARG_FLAG}}'_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi - makensis -DARG_WAILS_'{{.ARG_FLAG}}'_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi
vars: vars:
ARCH: '{{.ARCH | default ARCH}}' ARCH: '{{.ARCH | default ARCH}}'
ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}' ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
## ------> Darwin <------ ## ------> Darwin <------
package:darwin: package:darwin:
summary: Packages a production build of the application into a `.app` bundle summary: Packages a production build of the application into a `.app` bundle
platforms: [ darwin ] platforms: [ darwin ]
deps: deps:
- task: build:darwin - task: build:darwin
vars: vars:
PRODUCTION: "true" PRODUCTION: "true"
cmds: cmds:
- task: create:app:bundle - task: create:app:bundle
package:darwin:arm64: package:darwin:arm64:
summary: Packages a production build of the application into a `.app` bundle summary: Packages a production build of the application into a `.app` bundle
platforms: [ darwin/arm64 ] platforms: [ darwin/arm64 ]
deps: deps:
- task: package:darwin - task: package:darwin
vars: vars:
ARCH: arm64 ARCH: arm64
package:darwin:amd64: package:darwin:amd64:
summary: Packages a production build of the application into a `.app` bundle summary: Packages a production build of the application into a `.app` bundle
platforms: [ darwin/amd64 ] platforms: [ darwin/amd64 ]
deps: deps:
- task: package:darwin - task: package:darwin
vars: vars:
ARCH: amd64 ARCH: amd64
create:app:bundle: create:app:bundle:
summary: Creates an `.app` bundle summary: Creates an `.app` bundle
cmds: cmds:
- mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources} - mkdir -p {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/{MacOS,Resources}
- cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources - cp build/icons.icns {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/Resources
- cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS - cp {{.BIN_DIR}}/{{.APP_NAME}} {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents/MacOS
- cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents - cp build/Info.plist {{.BIN_DIR}}/{{.APP_NAME}}.app/Contents
## ------> Linux <------ ## ------> Linux <------
package:linux: package:linux:
summary: Packages a production build of the application for Linux summary: Packages a production build of the application for Linux
platforms: [ linux ] platforms: [ linux ]
deps: deps:
- task: build:linux - task: build:linux
vars: vars:
PRODUCTION: "true" PRODUCTION: "true"
cmds: cmds:
- task: create:appimage - task: create:appimage
create:appimage: create:appimage:
summary: Creates an AppImage summary: Creates an AppImage
dir: build/appimage dir: build/appimage
platforms: [ linux ] platforms: [ linux ]
deps: deps:
- task: build:linux - task: build:linux
vars: vars:
PRODUCTION: "true" PRODUCTION: "true"
- task: generate:linux:dotdesktop - task: generate:linux:dotdesktop
cmds: cmds:
# Copy binary + icon to appimage dir # Copy binary + icon to appimage dir
- cp {{.APP_BINARY}} {{.APP_NAME}} - cp {{.APP_BINARY}} {{.APP_NAME}}
- cp ../appicon.png appicon.png - cp ../appicon.png appicon.png
# Generate AppImage # Generate AppImage
- wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage - wails3 generate appimage -binary {{.APP_NAME}} -icon {{.ICON}} -desktopfile {{.DESKTOP_FILE}} -outputdir {{.OUTPUT_DIR}} -builddir {{.ROOT_DIR}}/build/appimage
vars: vars:
APP_NAME: '{{.APP_NAME}}' APP_NAME: '{{.APP_NAME}}'
APP_BINARY: '../../bin/{{.APP_NAME}}' APP_BINARY: '../../bin/{{.APP_NAME}}'
ICON: '../appicon.png' ICON: '../appicon.png'
DESKTOP_FILE: '{{.APP_NAME}}.desktop' DESKTOP_FILE: '{{.APP_NAME}}.desktop'
OUTPUT_DIR: '../../bin' OUTPUT_DIR: '../../bin'
generate:linux:dotdesktop: generate:linux:dotdesktop:
summary: Generates a `.desktop` file summary: Generates a `.desktop` file
dir: build dir: build
sources: sources:
- "appicon.png" - "appicon.png"
generates: generates:
- '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop' - '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop'
cmds: cmds:
- mkdir -p {{.ROOT_DIR}}/build/appimage - mkdir -p {{.ROOT_DIR}}/build/appimage
# Run `wails3 generate .desktop -help` for all the options # Run `wails3 generate .desktop -help` for all the options
- wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}" - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile {{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop -categories "{{.CATEGORIES}}"
# -comment "A comment" # -comment "A comment"
# -terminal "true" # -terminal "true"
# -version "1.0" # -version "1.0"
# -genericname "Generic Name" # -genericname "Generic Name"
# -keywords "keyword1;keyword2;" # -keywords "keyword1;keyword2;"
# -startupnotify "true" # -startupnotify "true"
# -mimetype "application/x-extension1;application/x-extension2;" # -mimetype "application/x-extension1;application/x-extension2;"
vars: vars:
APP_NAME: '{{.APP_NAME}}' APP_NAME: '{{.APP_NAME}}'
EXEC: '{{.APP_NAME}}' EXEC: '{{.APP_NAME}}'
ICON: 'appicon' ICON: 'appicon'
CATEGORIES: 'Development;' CATEGORIES: 'Development;'
OUTPUTFILE: '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop' OUTPUTFILE: '{{.ROOT_DIR}}/build/appimage/{{.APP_NAME}}.desktop'
## -------------------------- Misc -------------------------- ## ## -------------------------- Misc -------------------------- ##
generate:icons: generate:icons:
summary: Generates Windows `.ico` and Mac `.icns` files from an image summary: Generates Windows `.ico` and Mac `.icns` files from an image
dir: build dir: build
sources: sources:
- "appicon.png" - "appicon.png"
generates: generates:
- "icons.icns" - "icons.icns"
- "icons.ico" - "icons.ico"
method: timestamp method: timestamp
cmds: cmds:
# Generates both .ico and .icns files # Generates both .ico and .icns files
- wails3 generate icons -input appicon.png - wails3 generate icons -input appicon.png
install:frontend:deps: install:frontend:deps:
summary: Install frontend dependencies summary: Install frontend dependencies
dir: frontend dir: frontend
sources: sources:
- package.json - package.json
- package-lock.json - package-lock.json
generates: generates:
- node_modules/* - node_modules/*
preconditions: preconditions:
- sh: npm version - sh: npm version
msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/" msg: "Looks like npm isn't installed. Npm is part of the Node installer: https://nodejs.org/en/download/"
cmds: cmds:
# - npm install --silent --no-progress # - npm install --silent --no-progress
- npm install - npm install
build:frontend: build:frontend:
summary: Build the frontend project summary: Build the frontend project
dir: frontend dir: frontend
sources: sources:
- "**/*" - "**/*"
generates: generates:
- dist/* - dist/*
deps: deps:
- install:frontend:deps - install:frontend:deps
- generate:bindings - generate:bindings
cmds: cmds:
- npm run build -q - npm run build -q
generate:bindings: generate:bindings:
summary: Generates bindings for the frontend summary: Generates bindings for the frontend
sources: sources:
- "**/*.go" - "**/*.go"
generates: generates:
- "frontend/bindings/**/*" - "frontend/bindings/**/*"
cmds: cmds:
- wails3 generate bindings -silent - wails3 generate bindings -silent
# - wails3 generate bindings -silent # - wails3 generate bindings -silent
go:mod:tidy: go:mod:tidy:
summary: Runs `go mod tidy` summary: Runs `go mod tidy`
internal: true internal: true
generates: generates:
- go.sum - go.sum
sources: sources:
- go.mod - go.mod
cmds: cmds:
- go mod tidy - go mod tidy
# ----------------------- dev ----------------------- # # ----------------------- dev ----------------------- #
run: run:
summary: Runs the application summary: Runs the application
cmds: cmds:
- task: run:{{OS}} - task: run:{{OS}}
run:windows: run:windows:
cmds: cmds:
- '{{.BIN_DIR}}\\{{.APP_NAME}}.exe' - '{{.BIN_DIR}}\\{{.APP_NAME}}.exe'
run:linux: run:linux:
cmds: cmds:
- '{{.BIN_DIR}}/{{.APP_NAME}}' - '{{.BIN_DIR}}/{{.APP_NAME}}'
dev:frontend: dev:frontend:
summary: Runs the frontend in development mode summary: Runs the frontend in development mode
dir: frontend dir: frontend
deps: deps:
- task: install:frontend:deps - task: install:frontend:deps
cmds: cmds:
- npm run dev - npm run dev
dev: dev:
summary: Runs the application in development mode summary: Runs the application in development mode
cmds: cmds:
- wails3 tool watcher -config ./build/devmode.config.toml - wails3 tool watcher -config ./build/devmode.config.toml
env: env:
# This is the default vite dev server port # This is the default vite dev server port
FRONTEND_DEVSERVER_URL: 'http://localhost:5173' FRONTEND_DEVSERVER_URL: 'http://localhost:5173'
dev:reload: dev:reload:
summary: Reloads the application summary: Reloads the application
cmds: cmds:
- task: run - task: run

34
app/bordro-robotu/.gitignore vendored Normal file
View File

@@ -0,0 +1,34 @@
.DS_Store
.thumbs.db
node_modules
/.node_modules
# Quasar core related directories
.quasar
/dist
/quasar.config.*.temporary.compiled*
# Cordova related directories and files
/src-cordova/node_modules
/src-cordova/platforms
/src-cordova/plugins
/src-cordova/www
# Capacitor related directories and files
/src-capacitor/www
/src-capacitor/node_modules
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
# local .env files
.env.local*

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/wails.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- <link rel="stylesheet" href="/style.css" /> -->
<title>Wails + Vue</title>
<script type="module" crossorigin src="/assets/index-CvjddRoH.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-QSDk4erA.css">
</head>
<body>
<div id="app"></div>
</body>

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="32" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path fill="#F7DF1E" d="M0 0h256v256H0V0Z"></path><path d="m67.312 213.932l19.59-11.856c3.78 6.701 7.218 12.371 15.465 12.371c7.905 0 12.89-3.092 12.89-15.12v-81.798h24.057v82.138c0 24.917-14.606 36.259-35.916 36.259c-19.245 0-30.416-9.967-36.087-21.996m85.07-2.576l19.588-11.341c5.157 8.421 11.859 14.607 23.715 14.607c9.969 0 16.325-4.984 16.325-11.858c0-8.248-6.53-11.17-17.528-15.98l-6.013-2.58c-17.357-7.387-28.87-16.667-28.87-36.257c0-18.044 13.747-31.792 35.228-31.792c15.294 0 26.292 5.328 34.196 19.247l-18.732 12.03c-4.125-7.389-8.591-10.31-15.465-10.31c-7.046 0-11.514 4.468-11.514 10.31c0 7.217 4.468 10.14 14.778 14.608l6.014 2.577c20.45 8.765 31.963 17.7 31.963 37.804c0 21.654-17.012 33.51-39.867 33.51c-22.339 0-36.774-10.654-43.819-24.574"></path></svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@@ -0,0 +1,146 @@
:root {
font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: rgba(27, 38, 54, 1);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
* {
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
}
@font-face {
font-family: "Inter";
font-style: normal;
font-weight: 400;
src: local(""),
url("./Inter-Medium.ttf") format("truetype");
}
h3 {
font-size: 3em;
line-height: 1.1;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
button {
width: 60px;
height: 30px;
line-height: 30px;
border-radius: 3px;
border: none;
margin: 0 0 0 20px;
padding: 0 8px;
cursor: pointer;
}
.result {
height: 20px;
line-height: 20px;
}
body {
margin: 0;
display: flex;
place-items: center;
place-content: center;
min-width: 320px;
min-height: 100vh;
}
.container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
#app {
max-width: 1280px;
margin: 0 auto;
text-align: center;
}
.result {
height: 20px;
line-height: 20px;
margin: 1.5rem auto;
text-align: center;
}
.footer {
margin-top: 1rem;
align-content: center;
text-align: center;
color: rgba(255, 255, 255, 0.67);
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
.input-box .btn:hover {
background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%);
color: #333333;
}
.input-box .input {
border: none;
border-radius: 3px;
outline: none;
height: 30px;
line-height: 30px;
padding: 0 10px;
color: black;
background-color: rgba(240, 240, 240, 1);
-webkit-font-smoothing: antialiased;
}
.input-box .input:hover {
border: none;
background-color: rgba(255, 255, 255, 1);
}
.input-box .input:focus {
border: none;
background-color: rgba(255, 255, 255, 1);
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
app/bordro_robot.db Normal file

Binary file not shown.

View File

@@ -1,32 +1,32 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>My Product</string> <string>My Product</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>bordro-robotu</string> <string>bordro-robotu</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.wails.bordro-robotu</string> <string>com.wails.bordro-robotu</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.1.0</string> <string>0.1.0</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>This is a comment</string> <string>This is a comment</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>0.1.0</string> <string>0.1.0</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>icons</string> <string>icons</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.13.0</string> <string>10.13.0</string>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
<string>true</string> <string>true</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© now, My Company</string> <string>© now, My Company</string>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
<dict> <dict>
<key>NSAllowsLocalNetworking</key> <key>NSAllowsLocalNetworking</key>
<true/> <true/>
</dict> </dict>
</dict> </dict>
</plist> </plist>

View File

@@ -1,27 +1,27 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>My Product</string> <string>My Product</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>bordro-robotu</string> <string>bordro-robotu</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.wails.bordro-robotu</string> <string>com.wails.bordro-robotu</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.1.0</string> <string>0.1.0</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>This is a comment</string> <string>This is a comment</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>0.1.0</string> <string>0.1.0</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>icons</string> <string>icons</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>10.13.0</string> <string>10.13.0</string>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
<string>true</string> <string>true</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>© now, My Company</string> <string>© now, My Company</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,26 +1,26 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright (c) 2018-Present Lea Anthony # Copyright (c) 2018-Present Lea Anthony
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# Fail script on any error # Fail script on any error
set -euxo pipefail set -euxo pipefail
# Define variables # Define variables
APP_DIR="${APP_NAME}.AppDir" APP_DIR="${APP_NAME}.AppDir"
# Create AppDir structure # Create AppDir structure
mkdir -p "${APP_DIR}/usr/bin" mkdir -p "${APP_DIR}/usr/bin"
cp -r "${APP_BINARY}" "${APP_DIR}/usr/bin/" cp -r "${APP_BINARY}" "${APP_DIR}/usr/bin/"
cp "${ICON_PATH}" "${APP_DIR}/" cp "${ICON_PATH}" "${APP_DIR}/"
cp "${DESKTOP_FILE}" "${APP_DIR}/" cp "${DESKTOP_FILE}" "${APP_DIR}/"
# Download linuxdeploy and make it executable # Download linuxdeploy and make it executable
wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage wget -q -4 -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
chmod +x linuxdeploy-x86_64.AppImage chmod +x linuxdeploy-x86_64.AppImage
# Run linuxdeploy to bundle the application # Run linuxdeploy to bundle the application
./linuxdeploy-x86_64.AppImage --appdir "${APP_DIR}" --output appimage ./linuxdeploy-x86_64.AppImage --appdir "${APP_DIR}" --output appimage
# Rename the generated AppImage # Rename the generated AppImage
mv "${APP_NAME}*.AppImage" "${APP_NAME}.AppImage" mv "${APP_NAME}*.AppImage" "${APP_NAME}.AppImage"

View File

@@ -1,35 +1,35 @@
[config] [config]
root_path = "." root_path = "."
# debug | info | warn | error | mute # debug | info | warn | error | mute
# Defaults to Info if not provided # Defaults to Info if not provided
log_level = "warn" log_level = "warn"
# Debounce setting for ignoring reptitive file system notifications # Debounce setting for ignoring reptitive file system notifications
debounce = 1000 # Milliseconds debounce = 1000 # Milliseconds
# Sets what files the watcher should ignore # Sets what files the watcher should ignore
[config.ignore] [config.ignore]
# Directories to ignore # Directories to ignore
dir = [".git", "node_modules", "frontend", "bin"] dir = [".git", "node_modules", "frontend", "bin"]
# Files to ignore # Files to ignore
file = [".DS_Store", ".gitignore", ".gitkeep"] file = [".DS_Store", ".gitignore", ".gitkeep"]
# File extensions to watch # File extensions to watch
watched_extension = ["*.go"] watched_extension = ["*.go"]
# Add .gitignore paths to ignore # Add .gitignore paths to ignore
git_ignore = true git_ignore = true
[config.background] [config.background]
cmd = "wails3 task dev:frontend" cmd = "wails3 task dev:frontend"
[[config.executes]] [[config.executes]]
cmd = "go mod tidy" cmd = "go mod tidy"
blocking = true blocking = true
[[config.executes]] [[config.executes]]
cmd = "wails3 task build" cmd = "wails3 task build"
blocking = true blocking = true
[[config.executes]] [[config.executes]]
cmd = "KILL_STALE" cmd = "KILL_STALE"
[[config.executes]] [[config.executes]]
cmd = "./bin/bordro-robotu" cmd = "./bin/bordro-robotu"
primary = true primary = true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
app/build/icon2.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,15 +1,15 @@
{ {
"fixed": { "fixed": {
"file_version": "0.1.0" "file_version": "0.1.0"
}, },
"info": { "info": {
"0000": { "0000": {
"ProductVersion": "0.1.0", "ProductVersion": "0.1.0",
"CompanyName": "My Company", "CompanyName": "Notitek Yazılım A.Ş",
"FileDescription": "My Product Description", "FileDescription": "Bordro Robotu",
"LegalCopyright": "© now, My Company", "LegalCopyright": "© now, Notitek Yazılım A.Ş",
"ProductName": "My Product", "ProductName": "Bordro Robotu",
"Comments": "This is a comment" "Comments": "Luca Bordro Robotu"
} }
} }
} }

View File

@@ -1,108 +1,108 @@
Unicode true Unicode true
#### ####
## Please note: Template replacements don't work in this file. They are provided with default defines like ## Please note: Template replacements don't work in this file. They are provided with default defines like
## mentioned underneath. ## mentioned underneath.
## If the keyword is not defined, "wails_tools.nsh" will populate them. ## If the keyword is not defined, "wails_tools.nsh" will populate them.
## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually ## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually
## from outside of Wails for debugging and development of the installer. ## from outside of Wails for debugging and development of the installer.
## ##
## For development first make a wails nsis build to populate the "wails_tools.nsh": ## For development first make a wails nsis build to populate the "wails_tools.nsh":
## > wails build --target windows/amd64 --nsis ## > wails build --target windows/amd64 --nsis
## Then you can call makensis on this file with specifying the path to your binary: ## Then you can call makensis on this file with specifying the path to your binary:
## For a AMD64 only installer: ## For a AMD64 only installer:
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe ## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
## For a ARM64 only installer: ## For a ARM64 only installer:
## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe ## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
## For a installer with both architectures: ## For a installer with both architectures:
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe ## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
#### ####
## The following information is taken from the wails_tools.nsh file, but they can be overwritten here. ## The following information is taken from the wails_tools.nsh file, but they can be overwritten here.
#### ####
## !define INFO_PROJECTNAME "my-project" # Default "bordro-robotu" ## !define INFO_PROJECTNAME "my-project" # Default "bordro-robotu"
## !define INFO_COMPANYNAME "My Company" # Default "My Company" ## !define INFO_COMPANYNAME "My Company" # Default "My Company"
## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product" ## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product"
## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0" ## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0"
## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company" ## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© now, My Company"
### ###
## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe" ## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" ## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
#### ####
## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html ## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
#### ####
## Include the wails tools ## Include the wails tools
#### ####
!include "wails_tools.nsh" !include "wails_tools.nsh"
# The version information for this two must consist of 4 parts # The version information for this two must consist of 4 parts
VIProductVersion "${INFO_PRODUCTVERSION}.0" VIProductVersion "${INFO_PRODUCTVERSION}.0"
VIFileVersion "${INFO_PRODUCTVERSION}.0" VIFileVersion "${INFO_PRODUCTVERSION}.0"
VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}" VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer" VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}" VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware # Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
ManifestDPIAware true ManifestDPIAware true
!include "MUI.nsh" !include "MUI.nsh"
!define MUI_ICON "..\icon.ico" !define MUI_ICON "..\icon.ico"
!define MUI_UNICON "..\icon.ico" !define MUI_UNICON "..\icon.ico"
# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314 # !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps !define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer. !define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page. !insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer # !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page. !insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
!insertmacro MUI_PAGE_INSTFILES # Installing page. !insertmacro MUI_PAGE_INSTFILES # Installing page.
!insertmacro MUI_PAGE_FINISH # Finished installation page. !insertmacro MUI_PAGE_FINISH # Finished installation page.
!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page !insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page
!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer !insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1 ## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
#!uninstfinalize 'signtool --file "%1"' #!uninstfinalize 'signtool --file "%1"'
#!finalize 'signtool --file "%1"' #!finalize 'signtool --file "%1"'
Name "${INFO_PRODUCTNAME}" Name "${INFO_PRODUCTNAME}"
OutFile "..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file. OutFile "..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder). InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
ShowInstDetails show # This will always show the installation details. ShowInstDetails show # This will always show the installation details.
Function .onInit Function .onInit
!insertmacro wails.checkArchitecture !insertmacro wails.checkArchitecture
FunctionEnd FunctionEnd
Section Section
!insertmacro wails.setShellContext !insertmacro wails.setShellContext
!insertmacro wails.webview2runtime !insertmacro wails.webview2runtime
SetOutPath $INSTDIR SetOutPath $INSTDIR
!insertmacro wails.files !insertmacro wails.files
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
!insertmacro wails.writeUninstaller !insertmacro wails.writeUninstaller
SectionEnd SectionEnd
Section "uninstall" Section "uninstall"
!insertmacro wails.setShellContext !insertmacro wails.setShellContext
RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
RMDir /r $INSTDIR RMDir /r $INSTDIR
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk" Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
!insertmacro wails.deleteUninstaller !insertmacro wails.deleteUninstaller
SectionEnd SectionEnd

View File

@@ -1,179 +1,179 @@
# DO NOT EDIT - Generated automatically by `wails build` # DO NOT EDIT - Generated automatically by `wails build`
!include "x64.nsh" !include "x64.nsh"
!include "WinVer.nsh" !include "WinVer.nsh"
!include "FileFunc.nsh" !include "FileFunc.nsh"
!ifndef INFO_PROJECTNAME !ifndef INFO_PROJECTNAME
!define INFO_PROJECTNAME "bordro-robotu" !define INFO_PROJECTNAME "bordro-robotu"
!endif !endif
!ifndef INFO_COMPANYNAME !ifndef INFO_COMPANYNAME
!define INFO_COMPANYNAME "My Company" !define INFO_COMPANYNAME "My Company"
!endif !endif
!ifndef INFO_PRODUCTNAME !ifndef INFO_PRODUCTNAME
!define INFO_PRODUCTNAME "My Product" !define INFO_PRODUCTNAME "My Product"
!endif !endif
!ifndef INFO_PRODUCTVERSION !ifndef INFO_PRODUCTVERSION
!define INFO_PRODUCTVERSION "0.1.0" !define INFO_PRODUCTVERSION "0.1.0"
!endif !endif
!ifndef INFO_COPYRIGHT !ifndef INFO_COPYRIGHT
!define INFO_COPYRIGHT "© now, My Company" !define INFO_COPYRIGHT "© now, My Company"
!endif !endif
!ifndef PRODUCT_EXECUTABLE !ifndef PRODUCT_EXECUTABLE
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe" !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
!endif !endif
!ifndef UNINST_KEY_NAME !ifndef UNINST_KEY_NAME
!define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
!endif !endif
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}" !define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
!ifndef REQUEST_EXECUTION_LEVEL !ifndef REQUEST_EXECUTION_LEVEL
!define REQUEST_EXECUTION_LEVEL "admin" !define REQUEST_EXECUTION_LEVEL "admin"
!endif !endif
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}" RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
!ifdef ARG_WAILS_AMD64_BINARY !ifdef ARG_WAILS_AMD64_BINARY
!define SUPPORTS_AMD64 !define SUPPORTS_AMD64
!endif !endif
!ifdef ARG_WAILS_ARM64_BINARY !ifdef ARG_WAILS_ARM64_BINARY
!define SUPPORTS_ARM64 !define SUPPORTS_ARM64
!endif !endif
!ifdef SUPPORTS_AMD64 !ifdef SUPPORTS_AMD64
!ifdef SUPPORTS_ARM64 !ifdef SUPPORTS_ARM64
!define ARCH "amd64_arm64" !define ARCH "amd64_arm64"
!else !else
!define ARCH "amd64" !define ARCH "amd64"
!endif !endif
!else !else
!ifdef SUPPORTS_ARM64 !ifdef SUPPORTS_ARM64
!define ARCH "arm64" !define ARCH "arm64"
!else !else
!error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY" !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
!endif !endif
!endif !endif
!macro wails.checkArchitecture !macro wails.checkArchitecture
!ifndef WAILS_WIN10_REQUIRED !ifndef WAILS_WIN10_REQUIRED
!define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later." !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
!endif !endif
!ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
!define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}" !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
!endif !endif
${If} ${AtLeastWin10} ${If} ${AtLeastWin10}
!ifdef SUPPORTS_AMD64 !ifdef SUPPORTS_AMD64
${if} ${IsNativeAMD64} ${if} ${IsNativeAMD64}
Goto ok Goto ok
${EndIf} ${EndIf}
!endif !endif
!ifdef SUPPORTS_ARM64 !ifdef SUPPORTS_ARM64
${if} ${IsNativeARM64} ${if} ${IsNativeARM64}
Goto ok Goto ok
${EndIf} ${EndIf}
!endif !endif
IfSilent silentArch notSilentArch IfSilent silentArch notSilentArch
silentArch: silentArch:
SetErrorLevel 65 SetErrorLevel 65
Abort Abort
notSilentArch: notSilentArch:
MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}" MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
Quit Quit
${else} ${else}
IfSilent silentWin notSilentWin IfSilent silentWin notSilentWin
silentWin: silentWin:
SetErrorLevel 64 SetErrorLevel 64
Abort Abort
notSilentWin: notSilentWin:
MessageBox MB_OK "${WAILS_WIN10_REQUIRED}" MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
Quit Quit
${EndIf} ${EndIf}
ok: ok:
!macroend !macroend
!macro wails.files !macro wails.files
!ifdef SUPPORTS_AMD64 !ifdef SUPPORTS_AMD64
${if} ${IsNativeAMD64} ${if} ${IsNativeAMD64}
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}" File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
${EndIf} ${EndIf}
!endif !endif
!ifdef SUPPORTS_ARM64 !ifdef SUPPORTS_ARM64
${if} ${IsNativeARM64} ${if} ${IsNativeARM64}
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}" File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
${EndIf} ${EndIf}
!endif !endif
!macroend !macroend
!macro wails.writeUninstaller !macro wails.writeUninstaller
WriteUninstaller "$INSTDIR\uninstall.exe" WriteUninstaller "$INSTDIR\uninstall.exe"
SetRegView 64 SetRegView 64
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}" WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}" WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}" WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}" WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
IntFmt $0 "0x%08X" $0 IntFmt $0 "0x%08X" $0
WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0" WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
!macroend !macroend
!macro wails.deleteUninstaller !macro wails.deleteUninstaller
Delete "$INSTDIR\uninstall.exe" Delete "$INSTDIR\uninstall.exe"
SetRegView 64 SetRegView 64
DeleteRegKey HKLM "${UNINST_KEY}" DeleteRegKey HKLM "${UNINST_KEY}"
!macroend !macroend
!macro wails.setShellContext !macro wails.setShellContext
${If} ${REQUEST_EXECUTION_LEVEL} == "admin" ${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
SetShellVarContext all SetShellVarContext all
${else} ${else}
SetShellVarContext current SetShellVarContext current
${EndIf} ${EndIf}
!macroend !macroend
# Install webview2 by launching the bootstrapper # Install webview2 by launching the bootstrapper
# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment # See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
!macro wails.webview2runtime !macro wails.webview2runtime
!ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
!define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime" !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
!endif !endif
SetRegView 64 SetRegView 64
# If the admin key exists and is not empty then webview2 is already installed # If the admin key exists and is not empty then webview2 is already installed
ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
${If} $0 != "" ${If} $0 != ""
Goto ok Goto ok
${EndIf} ${EndIf}
${If} ${REQUEST_EXECUTION_LEVEL} == "user" ${If} ${REQUEST_EXECUTION_LEVEL} == "user"
# If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv" ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
${If} $0 != "" ${If} $0 != ""
Goto ok Goto ok
${EndIf} ${EndIf}
${EndIf} ${EndIf}
SetDetailsPrint both SetDetailsPrint both
DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}" DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
SetDetailsPrint listonly SetDetailsPrint listonly
InitPluginsDir InitPluginsDir
CreateDirectory "$pluginsdir\webview2bootstrapper" CreateDirectory "$pluginsdir\webview2bootstrapper"
SetOutPath "$pluginsdir\webview2bootstrapper" SetOutPath "$pluginsdir\webview2bootstrapper"
File "MicrosoftEdgeWebview2Setup.exe" File "MicrosoftEdgeWebview2Setup.exe"
ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install' ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
SetDetailsPrint both SetDetailsPrint both
ok: ok:
!macroend !macroend

View File

@@ -1,9 +1,9 @@
package runtime package runtime
import _ "embed" import _ "embed"
//go:embed runtime.js //go:embed runtime.js
var RuntimeJS []byte var RuntimeJS []byte
//go:embed runtime.debug.js //go:embed runtime.debug.js
var RuntimeDebugJS []byte var RuntimeDebugJS []byte

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity type="win32" name="com.wails.bordro-robotu" version="0.1.0" processorArchitecture="*"/> <assemblyIdentity type="win32" name="com.wails.bordro-robotu" version="0.1.0" processorArchitecture="*"/>
<dependency> <dependency>
<dependentAssembly> <dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<asmv3:application> <asmv3:application>
<asmv3:windowsSettings> <asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 --> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported --> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported -->
</asmv3:windowsSettings> </asmv3:windowsSettings>
</asmv3:application> </asmv3:application>
</assembly> </assembly>

View File

@@ -1,9 +1,9 @@
root = true root = true
[*] [*]
charset = utf-8 charset = utf-8
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true

View File

@@ -1,7 +1,7 @@
/dist /dist
/src-capacitor /src-capacitor
/src-cordova /src-cordova
/.quasar /.quasar
/node_modules /node_modules
.eslintrc.cjs .eslintrc.cjs
/quasar.config.*.temporary.compiled* /quasar.config.*.temporary.compiled*

View File

@@ -1,69 +1,69 @@
module.exports = { module.exports = {
// https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
// This option interrupts the configuration hierarchy at this file // This option interrupts the configuration hierarchy at this file
// Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
root: true, root: true,
parserOptions: { parserOptions: {
ecmaVersion: 2021, // Allows for the parsing of modern ECMAScript features ecmaVersion: 2021, // Allows for the parsing of modern ECMAScript features
}, },
env: { env: {
node: true, node: true,
browser: true, browser: true,
'vue/setup-compiler-macros': true 'vue/setup-compiler-macros': true
}, },
// Rules order is important, please avoid shuffling them // Rules order is important, please avoid shuffling them
extends: [ extends: [
// Base ESLint recommended rules // Base ESLint recommended rules
// 'eslint:recommended', // 'eslint:recommended',
// Uncomment any of the lines below to choose desired strictness, // Uncomment any of the lines below to choose desired strictness,
// but leave only one uncommented! // but leave only one uncommented!
// See https://eslint.vuejs.org/rules/#available-rules // See https://eslint.vuejs.org/rules/#available-rules
'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention)
// 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)
// 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)
// https://github.com/prettier/eslint-config-prettier#installation // https://github.com/prettier/eslint-config-prettier#installation
// usage with Prettier, provided by 'eslint-config-prettier'. // usage with Prettier, provided by 'eslint-config-prettier'.
'prettier' 'prettier'
], ],
plugins: [ plugins: [
// https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
// required to lint *.vue files // required to lint *.vue files
'vue', 'vue',
// https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674
// Prettier has not been included as plugin to avoid performance impact // Prettier has not been included as plugin to avoid performance impact
// add it as an extension for your IDE // add it as an extension for your IDE
], ],
globals: { globals: {
ga: 'readonly', // Google Analytics ga: 'readonly', // Google Analytics
cordova: 'readonly', cordova: 'readonly',
__statics: 'readonly', __statics: 'readonly',
__QUASAR_SSR__: 'readonly', __QUASAR_SSR__: 'readonly',
__QUASAR_SSR_SERVER__: 'readonly', __QUASAR_SSR_SERVER__: 'readonly',
__QUASAR_SSR_CLIENT__: 'readonly', __QUASAR_SSR_CLIENT__: 'readonly',
__QUASAR_SSR_PWA__: 'readonly', __QUASAR_SSR_PWA__: 'readonly',
process: 'readonly', process: 'readonly',
Capacitor: 'readonly', Capacitor: 'readonly',
chrome: 'readonly' chrome: 'readonly'
}, },
// add your custom rules here // add your custom rules here
rules: { rules: {
'prefer-promise-reject-errors': 'off', 'prefer-promise-reject-errors': 'off',
// allow debugger during development only // allow debugger during development only
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
// custom rules // custom rules
'vue/multi-word-component-names': 'off' 'vue/multi-word-component-names': 'off'
} }
} }

View File

@@ -1,33 +1,34 @@
.DS_Store .DS_Store
.thumbs.db .thumbs.db
node_modules node_modules
/.node_modules
# Quasar core related directories
.quasar # Quasar core related directories
/dist .quasar
/quasar.config.*.temporary.compiled* /dist
/quasar.config.*.temporary.compiled*
# Cordova related directories and files
/src-cordova/node_modules # Cordova related directories and files
/src-cordova/platforms /src-cordova/node_modules
/src-cordova/plugins /src-cordova/platforms
/src-cordova/www /src-cordova/plugins
/src-cordova/www
# Capacitor related directories and files
/src-capacitor/www # Capacitor related directories and files
/src-capacitor/node_modules /src-capacitor/www
/src-capacitor/node_modules
# Log files
npm-debug.log* # Log files
yarn-debug.log* npm-debug.log*
yarn-error.log* yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea # Editor directories and files
*.suo .idea
*.ntvs* *.suo
*.njsproj *.ntvs*
*.sln *.njsproj
*.sln
# local .env files
.env.local* # local .env files
.env.local*

View File

@@ -1,5 +1,5 @@
# pnpm-related options # pnpm-related options
shamefully-hoist=true shamefully-hoist=true
strict-peer-dependencies=false strict-peer-dependencies=false
# to get the latest compatible packages when creating the project https://github.com/pnpm/pnpm/issues/6463 # to get the latest compatible packages when creating the project https://github.com/pnpm/pnpm/issues/6463
resolution-mode=highest resolution-mode=highest

View File

@@ -1,3 +1,3 @@
{ {
"recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
} }

View File

@@ -1,41 +1,41 @@
# Quasar App (frontend) # Quasar App (frontend)
A Quasar Project A Quasar Project
## Install the dependencies ## Install the dependencies
```bash ```bash
yarn yarn
# or # or
npm install npm install
``` ```
### Start the app in development mode (hot-code reloading, error reporting, etc.) ### Start the app in development mode (hot-code reloading, error reporting, etc.)
```bash ```bash
quasar dev quasar dev
``` ```
### Lint the files ### Lint the files
```bash ```bash
yarn lint yarn lint
# or # or
npm run lint npm run lint
``` ```
### Format the files ### Format the files
```bash ```bash
yarn format yarn format
# or # or
npm run format npm run format
``` ```
### Build the app for production ### Build the app for production
```bash ```bash
quasar build quasar build
``` ```
### Customize the configuration ### Customize the configuration
See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js). See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js).

View File

@@ -4,10 +4,18 @@
import {Call} from '@wailsio/runtime'; import {Call} from '@wailsio/runtime';
/** /**
* @function Create * @function Create
* @returns {Promise<void>} * @returns {Promise<void>}
**/ **/
export async function Create() { export async function Create() {
return Call.ByName("company.Company.Create", ...Array.prototype.slice.call(arguments, 0)); return Call.ByName("company.Company.Create", ...Array.prototype.slice.call(arguments, 0));
} }
/**
* @function Edit
* @returns {Promise<void>}
**/
export async function Edit() {
return Call.ByName("company.Company.Edit", ...Array.prototype.slice.call(arguments, 0));
}

View File

@@ -4,7 +4,7 @@
import {Call} from '@wailsio/runtime'; import {Call} from '@wailsio/runtime';
/** /**
* @function Companies * @function Companies
* @returns {Promise<Company[], void>} * @returns {Promise<Company[], void>}
**/ **/
@@ -12,7 +12,7 @@ export async function Companies() {
return Call.ByName("srv.Srv.Companies", ...Array.prototype.slice.call(arguments, 0)); return Call.ByName("srv.Srv.Companies", ...Array.prototype.slice.call(arguments, 0));
} }
/** /**
* @function CreateCompany * @function CreateCompany
* @param name {string} * @param name {string}
* @param memberNumber {string} * @param memberNumber {string}
@@ -24,17 +24,32 @@ export async function CreateCompany(name, memberNumber, username, password) {
return Call.ByName("srv.Srv.CreateCompany", ...Array.prototype.slice.call(arguments, 0)); return Call.ByName("srv.Srv.CreateCompany", ...Array.prototype.slice.call(arguments, 0));
} }
/** /**
* @function Rpa * @function EditCompany
* @param month {number} * @param id {number}
* @param year {number} * @param name {string}
* @param memberNumber {string}
* @param username {string}
* @param password {string}
* @returns {Promise<void>} * @returns {Promise<void>}
**/ **/
export async function Rpa(month, year) { export async function EditCompany(id, name, memberNumber, username, password) {
return Call.ByName("srv.Srv.EditCompany", ...Array.prototype.slice.call(arguments, 0));
}
/**
* @function Rpa
* @param companyID {number}
* @param month {number}
* @param year {number}
* @param devMode {boolean}
* @returns {Promise<void>}
**/
export async function Rpa(companyID, month, year, devMode) {
return Call.ByName("srv.Srv.Rpa", ...Array.prototype.slice.call(arguments, 0)); return Call.ByName("srv.Srv.Rpa", ...Array.prototype.slice.call(arguments, 0));
} }
/** /**
* @function UploadExcel * @function UploadExcel
* @returns {Promise<string>} * @returns {Promise<string>}
**/ **/

View File

@@ -1,21 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title><%= productName %></title> <title><%= productName %></title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="description" content="<%= productDescription %>"> <meta name="description" content="<%= productDescription %>">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no"> <meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>"> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">
<link rel="icon" type="image/png" sizes="128x128" href="icons/favicon-128x128.png"> <link rel="icon" type="image/png" sizes="128x128" href="icons/favicon-128x128.png">
<link rel="icon" type="image/png" sizes="96x96" href="icons/favicon-96x96.png"> <link rel="icon" type="image/png" sizes="96x96" href="icons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16x16.png">
<link rel="icon" type="image/ico" href="favicon.ico"> <link rel="icon" type="image/ico" href="favicon.ico">
</head> </head>
<body> <body>
<!-- quasar:entry-point --> <!-- quasar:entry-point -->
</body> </body>
</html> </html>

View File

@@ -1,39 +1,39 @@
{ {
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"src/*": [ "src/*": [
"src/*" "src/*"
], ],
"app/*": [ "app/*": [
"*" "*"
], ],
"components/*": [ "components/*": [
"src/components/*" "src/components/*"
], ],
"layouts/*": [ "layouts/*": [
"src/layouts/*" "src/layouts/*"
], ],
"pages/*": [ "pages/*": [
"src/pages/*" "src/pages/*"
], ],
"assets/*": [ "assets/*": [
"src/assets/*" "src/assets/*"
], ],
"boot/*": [ "boot/*": [
"src/boot/*" "src/boot/*"
], ],
"stores/*": [ "stores/*": [
"src/stores/*" "src/stores/*"
], ],
"vue$": [ "vue$": [
"node_modules/vue/dist/vue.runtime.esm-bundler.js" "node_modules/vue/dist/vue.runtime.esm-bundler.js"
] ]
} }
}, },
"exclude": [ "exclude": [
"dist", "dist",
".quasar", ".quasar",
"node_modules" "node_modules"
] ]
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,37 +1,37 @@
{ {
"name": "frontend", "name": "frontend",
"version": "0.0.1", "version": "0.0.1",
"description": "A Quasar Project", "description": "A Quasar Project",
"productName": "Quasar App", "productName": "Quasar App",
"author": "ctengiz <cagatay.tengiz@gmail.com>", "author": "ctengiz <cagatay.tengiz@gmail.com>",
"private": true, "private": true,
"scripts": { "scripts": {
"lint": "eslint --ext .js,.vue ./", "lint": "eslint --ext .js,.vue ./",
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore", "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"dev": "quasar dev", "dev": "quasar dev",
"build": "quasar build" "build": "quasar build"
}, },
"dependencies": { "dependencies": {
"@quasar/extras": "^1.16.4", "@quasar/extras": "^1.16.4",
"@wailsio/runtime": "^3.0.0-alpha.20", "@wailsio/runtime": "^3.0.0-alpha.20",
"quasar": "^2.8.0", "quasar": "^2.8.0",
"vue": "^3.4.18", "vue": "^3.4.18",
"vue-router": "^4.0.12" "vue-router": "^4.0.12"
}, },
"devDependencies": { "devDependencies": {
"@quasar/app-vite": "^1.4.3", "@quasar/app-vite": "^1.4.3",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"eslint": "^8.11.0", "eslint": "^8.11.0",
"eslint-config-prettier": "^8.1.0", "eslint-config-prettier": "^8.1.0",
"eslint-plugin-vue": "^9.0.0", "eslint-plugin-vue": "^9.0.0",
"postcss": "^8.4.14", "postcss": "^8.4.14",
"prettier": "^2.5.1", "prettier": "^2.5.1",
"@wailsio/runtime": "latest" "@wailsio/runtime": "latest"
}, },
"engines": { "engines": {
"node": "^20 || ^18 || ^16", "node": "^20 || ^18 || ^16",
"npm": ">= 6.13.4", "npm": ">= 6.13.4",
"yarn": ">= 1.21.1" "yarn": ">= 1.21.1"
} }
} }

View File

@@ -1,27 +1,27 @@
/* eslint-disable */ /* eslint-disable */
// https://github.com/michael-ciniawsky/postcss-load-config // https://github.com/michael-ciniawsky/postcss-load-config
module.exports = { module.exports = {
plugins: [ plugins: [
// https://github.com/postcss/autoprefixer // https://github.com/postcss/autoprefixer
require('autoprefixer')({ require('autoprefixer')({
overrideBrowserslist: [ overrideBrowserslist: [
'last 4 Chrome versions', 'last 4 Chrome versions',
'last 4 Firefox versions', 'last 4 Firefox versions',
'last 4 Edge versions', 'last 4 Edge versions',
'last 4 Safari versions', 'last 4 Safari versions',
'last 4 Android versions', 'last 4 Android versions',
'last 4 ChromeAndroid versions', 'last 4 ChromeAndroid versions',
'last 4 FirefoxAndroid versions', 'last 4 FirefoxAndroid versions',
'last 4 iOS versions' 'last 4 iOS versions'
] ]
}) })
// https://github.com/elchininet/postcss-rtlcss // https://github.com/elchininet/postcss-rtlcss
// If you want to support RTL css, then // If you want to support RTL css, then
// 1. yarn/npm install postcss-rtlcss // 1. yarn/npm install postcss-rtlcss
// 2. optionally set quasar.config.js > framework > lang to an RTL language // 2. optionally set quasar.config.js > framework > lang to an RTL language
// 3. uncomment the following line: // 3. uncomment the following line:
// require('postcss-rtlcss') // require('postcss-rtlcss')
] ]
} }

View File

@@ -1,146 +1,146 @@
:root { :root {
font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif; sans-serif;
font-size: 16px; font-size: 16px;
line-height: 24px; line-height: 24px;
font-weight: 400; font-weight: 400;
color-scheme: light dark; color-scheme: light dark;
color: rgba(255, 255, 255, 0.87); color: rgba(255, 255, 255, 0.87);
background-color: rgba(27, 38, 54, 1); background-color: rgba(27, 38, 54, 1);
font-synthesis: none; font-synthesis: none;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
} }
* { * {
user-select: none; user-select: none;
-webkit-user-select: none; -webkit-user-select: none;
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
} }
@font-face { @font-face {
font-family: "Inter"; font-family: "Inter";
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
src: local(""), src: local(""),
url("./Inter-Medium.ttf") format("truetype"); url("./Inter-Medium.ttf") format("truetype");
} }
h3 { h3 {
font-size: 3em; font-size: 3em;
line-height: 1.1; line-height: 1.1;
} }
a { a {
font-weight: 500; font-weight: 500;
color: #646cff; color: #646cff;
text-decoration: inherit; text-decoration: inherit;
} }
a:hover { a:hover {
color: #535bf2; color: #535bf2;
} }
button { button {
width: 60px; width: 60px;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
border-radius: 3px; border-radius: 3px;
border: none; border: none;
margin: 0 0 0 20px; margin: 0 0 0 20px;
padding: 0 8px; padding: 0 8px;
cursor: pointer; cursor: pointer;
} }
.result { .result {
height: 20px; height: 20px;
line-height: 20px; line-height: 20px;
} }
body { body {
margin: 0; margin: 0;
display: flex; display: flex;
place-items: center; place-items: center;
place-content: center; place-content: center;
min-width: 320px; min-width: 320px;
min-height: 100vh; min-height: 100vh;
} }
.container { .container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
h1 { h1 {
font-size: 3.2em; font-size: 3.2em;
line-height: 1.1; line-height: 1.1;
} }
#app { #app {
max-width: 1280px; max-width: 1280px;
margin: 0 auto; margin: 0 auto;
text-align: center; text-align: center;
} }
.result { .result {
height: 20px; height: 20px;
line-height: 20px; line-height: 20px;
margin: 1.5rem auto; margin: 1.5rem auto;
text-align: center; text-align: center;
} }
.footer { .footer {
margin-top: 1rem; margin-top: 1rem;
align-content: center; align-content: center;
text-align: center; text-align: center;
color: rgba(255, 255, 255, 0.67); color: rgba(255, 255, 255, 0.67);
} }
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
:root { :root {
color: #213547; color: #213547;
background-color: #ffffff; background-color: #ffffff;
} }
a:hover { a:hover {
color: #747bff; color: #747bff;
} }
button { button {
background-color: #f9f9f9; background-color: #f9f9f9;
} }
} }
.input-box .btn:hover { .input-box .btn:hover {
background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%);
color: #333333; color: #333333;
} }
.input-box .input { .input-box .input {
border: none; border: none;
border-radius: 3px; border-radius: 3px;
outline: none; outline: none;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
padding: 0 10px; padding: 0 10px;
color: black; color: black;
background-color: rgba(240, 240, 240, 1); background-color: rgba(240, 240, 240, 1);
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
} }
.input-box .input:hover { .input-box .input:hover {
border: none; border: none;
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
} }
.input-box .input:focus { .input-box .input:focus {
border: none; border: none;
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
} }

View File

@@ -1,216 +1,216 @@
/* eslint-env node */ /* eslint-env node */
/* /*
* This file runs in a Node context (it's NOT transpiled by Babel), so use only * This file runs in a Node context (it's NOT transpiled by Babel), so use only
* the ES6 features that are supported by your Node version. https://node.green/ * the ES6 features that are supported by your Node version. https://node.green/
*/ */
// Configuration for your app // Configuration for your app
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js
const { configure } = require('quasar/wrappers'); const { configure } = require('quasar/wrappers');
module.exports = configure(function (/* ctx */) { module.exports = configure(function (/* ctx */) {
return { return {
eslint: { eslint: {
// fix: true, // fix: true,
// include: [], // include: [],
// exclude: [], // exclude: [],
// rawOptions: {}, // rawOptions: {},
warnings: true, warnings: true,
errors: true errors: true
}, },
// https://v2.quasar.dev/quasar-cli-vite/prefetch-feature // https://v2.quasar.dev/quasar-cli-vite/prefetch-feature
// preFetch: true, // preFetch: true,
// app boot file (/src/boot) // app boot file (/src/boot)
// --> boot files are part of "main.js" // --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli-vite/boot-files // https://v2.quasar.dev/quasar-cli-vite/boot-files
boot: [ boot: [
], ],
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css
css: [ css: [
'app.scss' 'app.scss'
], ],
// https://github.com/quasarframework/quasar/tree/dev/extras // https://github.com/quasarframework/quasar/tree/dev/extras
extras: [ extras: [
// 'ionicons-v4', // 'ionicons-v4',
'mdi-v7', 'mdi-v7',
// 'fontawesome-v6', // 'fontawesome-v6',
// 'eva-icons', // 'eva-icons',
// 'themify', // 'themify',
// 'line-awesome', // 'line-awesome',
// 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
'roboto-font', // optional, you are not bound to it 'roboto-font', // optional, you are not bound to it
'material-icons', // optional, you are not bound to it 'material-icons', // optional, you are not bound to it
], ],
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build
build: { build: {
target: { target: {
browser: [ 'es2019', 'edge88', 'firefox78', 'chrome87', 'safari13.1' ], browser: [ 'es2019', 'edge88', 'firefox78', 'chrome87', 'safari13.1' ],
node: 'node20' node: 'node20'
}, },
vueRouterMode: 'hash', // available values: 'hash', 'history' vueRouterMode: 'hash', // available values: 'hash', 'history'
// vueRouterBase, // vueRouterBase,
// vueDevtools, // vueDevtools,
// vueOptionsAPI: false, // vueOptionsAPI: false,
// rebuildCache: true, // rebuilds Vite/linter/etc cache on startup // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup
// publicPath: '/', // publicPath: '/',
// analyze: true, // analyze: true,
// env: {}, // env: {},
// rawDefine: {} // rawDefine: {}
// ignorePublicFolder: true, // ignorePublicFolder: true,
// minify: false, // minify: false,
// polyfillModulePreload: true, // polyfillModulePreload: true,
// distDir // distDir
// extendViteConf (viteConf) {}, // extendViteConf (viteConf) {},
// viteVuePluginOptions: {}, // viteVuePluginOptions: {},
// vitePlugins: [ // vitePlugins: [
// [ 'package-name', { ..options.. } ] // [ 'package-name', { ..options.. } ]
// ] // ]
}, },
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer
devServer: { devServer: {
// https: true // https: true
open: true, // opens browser window automatically, open: true, // opens browser window automatically,
port: 5173 port: 5173
}, },
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework
framework: { framework: {
config: {}, config: {},
// iconSet: 'material-icons', // Quasar icon set // iconSet: 'material-icons', // Quasar icon set
// lang: 'en-US', // Quasar language pack // lang: 'en-US', // Quasar language pack
// For special cases outside of where the auto-import strategy can have an impact // For special cases outside of where the auto-import strategy can have an impact
// (like functional components as one of the examples), // (like functional components as one of the examples),
// you can manually specify Quasar components/directives to be available everywhere: // you can manually specify Quasar components/directives to be available everywhere:
// //
// components: [], // components: [],
// directives: [], // directives: [],
// Quasar plugins // Quasar plugins
plugins: [ plugins: [
'Dialog' 'Dialog'
] ]
}, },
// animations: 'all', // --- includes all animations // animations: 'all', // --- includes all animations
// https://v2.quasar.dev/options/animations // https://v2.quasar.dev/options/animations
animations: [], animations: [],
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#property-sourcefiles // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#property-sourcefiles
// sourceFiles: { // sourceFiles: {
// rootComponent: 'src/App.vue', // rootComponent: 'src/App.vue',
// router: 'src/router/index', // router: 'src/router/index',
// store: 'src/store/index', // store: 'src/store/index',
// registerServiceWorker: 'src-pwa/register-service-worker', // registerServiceWorker: 'src-pwa/register-service-worker',
// serviceWorker: 'src-pwa/custom-service-worker', // serviceWorker: 'src-pwa/custom-service-worker',
// pwaManifestFile: 'src-pwa/manifest.json', // pwaManifestFile: 'src-pwa/manifest.json',
// electronMain: 'src-electron/electron-main', // electronMain: 'src-electron/electron-main',
// electronPreload: 'src-electron/electron-preload' // electronPreload: 'src-electron/electron-preload'
// }, // },
// https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr
ssr: { ssr: {
// ssrPwaHtmlFilename: 'offline.html', // do NOT use index.html as name! // ssrPwaHtmlFilename: 'offline.html', // do NOT use index.html as name!
// will mess up SSR // will mess up SSR
// extendSSRWebserverConf (esbuildConf) {}, // extendSSRWebserverConf (esbuildConf) {},
// extendPackageJson (json) {}, // extendPackageJson (json) {},
pwa: false, pwa: false,
// manualStoreHydration: true, // manualStoreHydration: true,
// manualPostHydrationTrigger: true, // manualPostHydrationTrigger: true,
prodPort: 3000, // The default port that the production server should use prodPort: 3000, // The default port that the production server should use
// (gets superseded if process.env.PORT is specified at runtime) // (gets superseded if process.env.PORT is specified at runtime)
middlewares: [ middlewares: [
'render' // keep this as last one 'render' // keep this as last one
] ]
}, },
// https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa
pwa: { pwa: {
workboxMode: 'generateSW', // or 'injectManifest' workboxMode: 'generateSW', // or 'injectManifest'
injectPwaMetaTags: true, injectPwaMetaTags: true,
swFilename: 'sw.js', swFilename: 'sw.js',
manifestFilename: 'manifest.json', manifestFilename: 'manifest.json',
useCredentialsForManifestTag: false, useCredentialsForManifestTag: false,
// useFilenameHashes: true, // useFilenameHashes: true,
// extendGenerateSWOptions (cfg) {} // extendGenerateSWOptions (cfg) {}
// extendInjectManifestOptions (cfg) {}, // extendInjectManifestOptions (cfg) {},
// extendManifestJson (json) {} // extendManifestJson (json) {}
// extendPWACustomSWConf (esbuildConf) {} // extendPWACustomSWConf (esbuildConf) {}
}, },
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova
cordova: { cordova: {
// noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing
}, },
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor
capacitor: { capacitor: {
hideSplashscreen: true hideSplashscreen: true
}, },
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron
electron: { electron: {
// extendElectronMainConf (esbuildConf) // extendElectronMainConf (esbuildConf)
// extendElectronPreloadConf (esbuildConf) // extendElectronPreloadConf (esbuildConf)
// specify the debugging port to use for the Electron app when running in development mode // specify the debugging port to use for the Electron app when running in development mode
inspectPort: 5858, inspectPort: 5858,
bundler: 'packager', // 'packager' or 'builder' bundler: 'packager', // 'packager' or 'builder'
packager: { packager: {
// https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options
// OS X / Mac App Store // OS X / Mac App Store
// appBundleId: '', // appBundleId: '',
// appCategoryType: '', // appCategoryType: '',
// osxSign: '', // osxSign: '',
// protocol: 'myapp://path', // protocol: 'myapp://path',
// Windows only // Windows only
// win32metadata: { ... } // win32metadata: { ... }
}, },
builder: { builder: {
// https://www.electron.build/configuration/configuration // https://www.electron.build/configuration/configuration
appId: 'frontend' appId: 'frontend'
} }
}, },
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex
bex: { bex: {
contentScripts: [ contentScripts: [
'my-content-script' 'my-content-script'
], ],
// extendBexScriptsConf (esbuildConf) {} // extendBexScriptsConf (esbuildConf) {}
// extendBexManifestJson (json) {} // extendBexManifestJson (json) {}
} }
} }
}); });

View File

@@ -1,11 +1,11 @@
<template> <template>
<router-view /> <router-view />
</template> </template>
<script> <script>
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'App' name: 'App'
}) })
</script> </script>

View File

@@ -1,15 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360">
<path <path
d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" /> d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" />
<path fill="#050A14" <path fill="#050A14"
d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" /> d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" />
<path fill="#00B4FF" <path fill="#00B4FF"
d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" /> d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" />
<path fill="#00B4FF" <path fill="#00B4FF"
d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" /> d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" />
<path fill="#050A14" <path fill="#050A14"
d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" /> d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" />
<path fill="#00B4FF" <path fill="#00B4FF"
d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" /> d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" />
<path fill="none" d="M-565.2 324H-252v15.8h-313.2z" /> <path fill="none" d="M-565.2 324H-252v15.8h-313.2z" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1,36 +1,36 @@
<template> <template>
<div class="container d-flex justify-content-center align-items-center" style="height: 100vh;"> <div class="container d-flex justify-content-center align-items-center" style="height: 100vh;">
<form @submit.prevent="submitForm"> <form @submit.prevent="submitForm">
<div class="mb-3"> <div class="mb-3">
<button type="button" class="btn btn-primary" @click="openFileDialog"> <button type="button" class="btn btn-primary" @click="openFileDialog">
<b-icon-file-earmark-excel /> <b-icon-file-earmark-excel />
Dosya Seç Dosya Seç
</button> </button>
</div> </div>
</form> </form>
</div> </div>
</template> </template>
<script> <script>
import {ClaimFile} from "../../bindings/main/BotService.js"; import {ClaimFile} from "../../bindings/main/BotService.js";
export default { export default {
methods: { methods: {
openFileDialog() { openFileDialog() {
ClaimFile().then((resultValue) => { ClaimFile().then((resultValue) => {
let value = resultValue; let value = resultValue;
if(value != '') if(value != '')
{ {
alert("Dosya Seçildi") alert("Dosya Seçildi")
} }
}).catch((err) => { }).catch((err) => {
alert("Dosya Seçilemedi") alert("Dosya Seçilemedi")
console.log(err); console.log(err);
}); });
} }
} }
}; };
</script> </script>
<style> <style>
/* Add custom styles here if needed */ /* Add custom styles here if needed */
</style> </style>

View File

@@ -1,78 +1,78 @@
<template> <template>
<div class="login"> <div class="login">
<h2 class="mb-4">Luca Girişi</h2> <h2 class="mb-4">Luca Girişi</h2>
<form @submit.prevent="login"> <form @submit.prevent="login">
<div class="form-group"> <div class="form-group">
<label for="username">Kullanıcı Adı:</label> <label for="username">Kullanıcı Adı:</label>
<input type="text" id="username" class="form-control" v-model="username" required> <input type="text" id="username" class="form-control" v-model="username" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="password">Şifre:</label> <label for="password">Şifre:</label>
<input type="password" id="password" class="form-control" v-model="password" required> <input type="password" id="password" class="form-control" v-model="password" required>
</div> </div>
<button style="margin-top: 15px;" type="submit" class="btn btn-primary">Login</button> <button style="margin-top: 15px;" type="submit" class="btn btn-primary">Login</button>
</form> </form>
</div> </div>
</template> </template>
<script> <script>
import {Login} from "../../bindings/main/LoginService.js"; import {Login} from "../../bindings/main/LoginService.js";
export default { export default {
data() { data() {
return { return {
username: '', username: '',
password: '' password: ''
}; };
}, },
methods: { methods: {
login() { login() {
let that = this let that = this
Login(this.username, this.password).then((resultValue) => { Login(this.username, this.password).then((resultValue) => {
let value = resultValue; let value = resultValue;
console.log("entered") console.log("entered")
if(value.LoggedIn) if(value.LoggedIn)
{ {
that.$router.push({ name: 'Dashboard' }); that.$router.push({ name: 'Dashboard' });
} }
}).catch((err) => { }).catch((err) => {
console.log(err); console.log(err);
}); });
} }
} }
}; };
</script> </script>
<!-- <!--
<script setup> <script setup>
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import {Login} from "../../bindings/main/LoginService"; import {Login} from "../../bindings/main/LoginService";
import {Events} from "@wailsio/runtime"; import {Events} from "@wailsio/runtime";
const name = ref('') const name = ref('')
const result = ref('Please enter your name below 👇') const result = ref('Please enter your name below 👇')
const time = ref('Listening for Time event...') const time = ref('Listening for Time event...')
const doLogin = () => { const doLogin = () => {
let localName = name.value; let localName = name.value;
if (!localName) { if (!localName) {
localName = 'anonymous'; localName = 'anonymous';
} }
Login(localName).then((resultValue) => { Login(localName).then((resultValue) => {
result.value = resultValue; result.value = resultValue;
}).catch((err) => { }).catch((err) => {
console.log(err); console.log(err);
}); });
} }
onMounted(() => { onMounted(() => {
Events.On('time', (timeValue) => { Events.On('time', (timeValue) => {
time.value = timeValue.data; time.value = timeValue.data;
}); });
}) })
defineProps({ defineProps({
msg: String, msg: String,
}) })
</script> --> </script> -->

View File

@@ -1,53 +1,53 @@
<template> <template>
<q-dialog ref="dialogRef" persistent @hide="onDialogHide"> <q-dialog ref="dialogRef" persistent @hide="onDialogHide">
<q-card style="width: 600px;"> <q-card style="width: 600px;">
<q-card-section class="bg-purple text-white"> <q-card-section class="bg-purple text-white">
<span class="text-h6 text-weight-bolder">Şirket Ekleme</span> <span class="text-h6 text-weight-bolder">Şirket Ekleme</span>
</q-card-section> </q-card-section>
<q-card-section> <q-card-section>
<q-input v-model="ld.name" label="Şirket Adı"/> <q-input v-model="ld.name" label="Şirket Adı"/>
<q-input v-model="ld.memberNumber" label="Üye No"/> <q-input v-model="ld.memberNumber" label="Üye No"/>
<q-input v-model="ld.username" label="Kullanıcı Adı"/> <q-input v-model="ld.username" label="Kullanıcı Adı"/>
<q-input v-model="ld.password" label="Parola"/> <q-input v-model="ld.password" label="Parola"/>
</q-card-section> </q-card-section>
<q-card-actions align="right"> <q-card-actions align="right">
<q-btn label="İptal" <q-btn label="İptal"
icon="cancel" icon="cancel"
no-caps outline no-caps outline
@click="onDialogCancel" @click="onDialogCancel"
/> />
<q-btn label="Kaydet" no-caps outline color="positive" <q-btn label="Kaydet" no-caps outline color="positive"
icon="check" icon="check"
@click="onDialogOK(toRaw(ld))"/> @click="onDialogOK(toRaw(ld))"/>
</q-card-actions> </q-card-actions>
</q-card> </q-card>
</q-dialog> </q-dialog>
</template> </template>
<script setup> <script setup>
import { useDialogPluginComponent } from 'quasar' import { useDialogPluginComponent } from 'quasar'
import { reactive, toRaw } from 'vue' import { reactive, toRaw } from 'vue'
defineEmits([ defineEmits([
// REQUIRED; need to specify some events that your // REQUIRED; need to specify some events that your
// component will emit through useDialogPluginComponent() // component will emit through useDialogPluginComponent()
...useDialogPluginComponent.emits, ...useDialogPluginComponent.emits,
]) ])
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent() const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent()
const ld = reactive({ const ld = reactive({
name: '', name: '',
memberNumber: '', memberNumber: '',
username: '', username: '',
password: '', password: '',
}) })
</script> </script>
<style scoped> <style scoped>
</style> </style>

View File

@@ -0,0 +1,61 @@
<template>
<q-dialog ref="dialogRef" persistent @hide="onDialogHide">
<q-card style="width: 600px;">
<q-card-section class="bg-purple text-white">
<p>Şirket Adı: {{ props.name }}</p>
<!-- <span class="text-h6 text-weight-bolder">{{props.name}}</span> -->
</q-card-section>
<q-card-section>
<q-input v-model="ld.name" label="Şirket Adı"/>
<q-input v-model="ld.memberNumber" label="Üye No"/>
<q-input v-model="ld.userName" label="Kullanıcı Adı"/>
<q-input v-model="ld.password" label="Parola"/>
</q-card-section>
<q-card-actions align="right">
<q-btn label="İptal"
icon="cancel"
no-caps outline
@click="onDialogCancel"
/>
<q-btn label="Kaydet" no-caps outline color="positive"
icon="check"
@click="onDialogOK(toRaw(ld))"/>
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script setup>
import { useDialogPluginComponent } from 'quasar'
import { reactive, toRaw ,defineProps } from 'vue'
defineEmits([
// REQUIRED; need to specify some events that your
// component will emit through useDialogPluginComponent()
...useDialogPluginComponent.emits,
])
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent()
const props = defineProps({
id: Number,
name: String,
memberNumber: 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 || '',
})
</script>
<style scoped>
</style>

View File

@@ -1 +1 @@
// app global css in SCSS form // app global css in SCSS form

View File

@@ -1,25 +1,25 @@
// Quasar SCSS (& Sass) Variables // Quasar SCSS (& Sass) Variables
// -------------------------------------------------- // --------------------------------------------------
// To customize the look and feel of this app, you can override // To customize the look and feel of this app, you can override
// the Sass/SCSS variables found in Quasar's source Sass/SCSS files. // the Sass/SCSS variables found in Quasar's source Sass/SCSS files.
// Check documentation for full list of Quasar variables // Check documentation for full list of Quasar variables
// Your own variables (that are declared here) and Quasar's own // Your own variables (that are declared here) and Quasar's own
// ones will be available out of the box in your .vue/.scss/.sass files // ones will be available out of the box in your .vue/.scss/.sass files
// It's highly recommended to change the default colors // It's highly recommended to change the default colors
// to match your app's branding. // to match your app's branding.
// Tip: Use the "Theme Builder" on Quasar's documentation website. // Tip: Use the "Theme Builder" on Quasar's documentation website.
$primary : #1976D2; $primary : #1976D2;
$secondary : #26A69A; $secondary : #26A69A;
$accent : #9C27B0; $accent : #9C27B0;
$dark : #1D1D1D; $dark : #1D1D1D;
$dark-page : #121212; $dark-page : #121212;
$positive : #21BA45; $positive : #21BA45;
$negative : #C10015; $negative : #C10015;
$info : #31CCEC; $info : #31CCEC;
$warning : #F2C037; $warning : #F2C037;

View File

@@ -1,31 +1,31 @@
<template> <template>
<q-layout view="lHh Lpr lFf"> <q-layout view="lHh Lpr lFf">
<q-header elevated style="margin-top: 40px;"> <q-header elevated style="margin-top: 40px;">
<q-toolbar> <q-toolbar>
<q-toolbar-title> <q-toolbar-title>
Bordro Robotu Bordro Robotu
</q-toolbar-title> </q-toolbar-title>
<q-space/> <q-space/>
</q-toolbar> </q-toolbar>
</q-header> </q-header>
<q-page-container style="margin-top: 40px;"> <q-page-container style="margin-top: 40px;">
<router-view/> <router-view/>
</q-page-container> </q-page-container>
</q-layout> </q-layout>
</template> </template>
<script setup> <script setup>
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.header-input .q-field .q-field__control-container .q-field__native, .q-field__label { .header-input .q-field .q-field__control-container .q-field__native, .q-field__label {
color: white !important; color: white !important;
} }
</style> </style>

View File

@@ -1,38 +1,38 @@
import { createApp } from 'vue'; import { createApp } from 'vue';
import App from './App.vue'; import App from './App.vue';
import { createRouter, createWebHistory } from 'vue-router'; // Import Vue Router import { createRouter, createWebHistory } from 'vue-router'; // Import Vue Router
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
import { BootstrapIconsPlugin } from "bootstrap-icons-vue"; import { BootstrapIconsPlugin } from "bootstrap-icons-vue";
// Import components for routing // Import components for routing
import LoginPage from './components/LoginPage.vue'; import LoginPage from './components/LoginPage.vue';
import Dashboard from './components/Dashboard.vue'; // Assuming you have a Dashboard view import Dashboard from './components/Dashboard.vue'; // Assuming you have a Dashboard view
// Define routes // Define routes
const routes = [ const routes = [
{ path: '/Dashboard', { path: '/Dashboard',
name: 'Dashboard', name: 'Dashboard',
components : { components : {
default : Dashboard default : Dashboard
} }
}, // Route to Dashboard }, // Route to Dashboard
{ path: '/', { path: '/',
name: 'LoginPage', name: 'LoginPage',
components : { components : {
default : LoginPage default : LoginPage
} }
}, // Route to Login }, // Route to Login
// You can define more routes here // You can define more routes here
]; ];
// Create router instance // Create router instance
const router = createRouter({ const router = createRouter({
history: createWebHistory(process.env.BASE_URL), history: createWebHistory(process.env.BASE_URL),
routes, routes,
}); });
// Create Vue app and use router // Create Vue app and use router
const app = createApp(App); const app = createApp(App);
app.use(BootstrapIconsPlugin); app.use(BootstrapIconsPlugin);
app.use(router); app.use(router);
app.mount('#app'); app.mount('#app');

View File

@@ -1,31 +1,31 @@
<template> <template>
<div class="fullscreen bg-blue text-white text-center q-pa-md flex flex-center"> <div class="fullscreen bg-blue text-white text-center q-pa-md flex flex-center">
<div> <div>
<div style="font-size: 30vh"> <div style="font-size: 30vh">
404 404
</div> </div>
<div class="text-h2" style="opacity:.4"> <div class="text-h2" style="opacity:.4">
Oops. Nothing here... Oops. Nothing here...
</div> </div>
<q-btn <q-btn
class="q-mt-xl" class="q-mt-xl"
color="white" color="white"
text-color="blue" text-color="blue"
unelevated unelevated
to="/" to="/"
label="Go Home" label="Go Home"
no-caps no-caps
/> />
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
export default defineComponent({ export default defineComponent({
name: 'ErrorNotFound' name: 'ErrorNotFound'
}) })
</script> </script>

View File

@@ -1,131 +1,202 @@
<template> <template>
<q-page padding> <q-page padding>
<q-card> <q-card>
<q-card-section> <q-card-section>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<q-select v-model="ld.companyID" <q-select v-model="ld.companyID"
label="Şirket" label="Şirket"
option-label="Name" option-label="Name"
option-value="Name" option-value="Id"
:options="ld.companies" :options="ld.companies"
map-options map-options
emit-value emit-value
> >
<template v-slot:after> <template v-slot:after>
<q-btn <q-btn
label="Yeni Şirket Ekle" label="Düzenle"
color="primary" color="primary"
@click="createCompany" @click="editCompany"
no-caps no-caps
/> />
</template> <q-btn
</q-select> label="Yeni Şirket Ekle"
</div> color="primary"
</div> @click="createCompany"
</q-card-section> no-caps
/>
<q-card-section> </template>
<div class="row q-col-gutter-sm items-center"> </q-select>
<div class="col-shrink"> </div>
<q-btn label="Excel Yükle" </div>
@click="upload" </q-card-section>
no-caps
color="secondary" <q-card-section>
/> <div class="row q-col-gutter-sm items-center">
</div> <div class="col-shrink">
<div class="col-11 text-right"> <q-btn label="Excel Yükle"
{{ ld.xlsFile }} @click="upload"
</div> no-caps
<div class="col-6"> color="secondary"
<q-select v-model="ld.year" :options="[2024, 2025, 2026, 2027, 2028]" />
label="Aktarım Yıl" <q-checkbox
/> label="Tarayıcı Görünmesin"
</div> v-model="ld.right"
<div class="col-6"> style="font-size : 15px"
<q-select v-model="ld.month" :options="[1,2,3,4,5,6,7,8,9,10,11,12]" />
label="Aktarım Ay" </div>
/> <div class="col-11 text-right">
</div> {{ ld.xlsFile }}
<div class="col-12"> </div>
<q-btn <div class="col-6">
no-caps <q-select v-model="ld.year" :options="[2024, 2025, 2026, 2027, 2028]"
label="Aktarıma Başla" label="Aktarım Yıl"
color="warning" />
class="full-width" </div>
@click="doRpa" <div class="col-6">
:disable="!ld.xlsFile || !ld.companyID" <q-select v-model="ld.month" :options="[1,2,3,4,5,6,7,8,9,10,11,12]"
/> label="Aktarım Ay"
</div> />
</div> </div>
</q-card-section> <div class="col-12">
<q-btn
<q-card-section> no-caps
<div style="max-height: 200px; overflow: scroll; border: 1px gray solid;" class="q-pa-xs"> label="Aktarıma Başla"
<span v-for="(ln, ndx) in ld.logProcess" :key="ndx"> color="warning"
{{ ndx }} {{ ln }} class="full-width"
</span> @click="doRpa"
</div> :disable="!ld.xlsFile || !ld.companyID"
</q-card-section> />
</q-card> </div>
</div>
</q-page> </q-card-section>
</template>
<q-card-section>
<script setup> <!-- <q-card>
import { onMounted, reactive } from 'vue' <q-tabs
import Company from 'components/dlg/Company.vue' v-model="tab"
import { useQuasar } from 'quasar' dense
import { Companies, CreateCompany, Rpa, UploadExcel } from 'app/bindings/lib/srv/Srv' class="text-grey"
import * as wails from '@wailsio/runtime' active-color="primary"
indicator-color="primary"
const $q = useQuasar() align="justify"
narrow-indicator
const ld = reactive({ >
companyID: null, <q-tab name="mails" label="Mails"></q-tab>
companies: [], <q-tab name="alarms" label="Alarms"></q-tab>
xlsFile: '', <q-tab name="movies" label="Movies"></q-tab>
logProcess: [], </q-tabs>
year: 2024,
month: 1, <q-separator></q-separator>
})
<q-tab-panels v-model="tab" animated>
onMounted(() => { <q-tab-panel name="mails">
getCompanies() <div class="text-h6"></div>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
wails.Events.On('logProcess', function (ev) { </q-tab-panel>
ld.logProcess.push(ev.data)
}) <q-tab-panel name="alarms">
}) <div class="text-h6">Alarms</div>
Lorem ipsum dolor sit amet consectetur adipisicing elit.
const createCompany = function () { </q-tab-panel>
$q.dialog({
component: Company, <q-tab-panel name="movies">
parent: this, <div class="text-h6">Movies</div>
// ---------------------- Lorem ipsum dolor sit amet consectetur adipisicing elit.
// props that are passed to component instance </q-tab-panel>
}).onOk(data => { </q-tab-panels>
CreateCompany(data.name, data.memberNumber, data.username, data.password).then(()=>{ </q-card> -->
getCompanies() <div style="max-height: 200px; overflow: scroll; border: 1px gray solid; display: grid;" class="q-pa-xs">
}) <span v-for="(ln, ndx) in ld.logProcess" :key="ndx">
}) {{ ndx }} {{ ln }}
} </span>
</div>
const getCompanies = function () { </q-card-section>
ld.companies.splice(0) </q-card>
Companies().then(res => {
ld.companies.push(...res) </q-page>
}) </template>
}
<script setup>
const upload = function () { import { onMounted, reactive,ref } from 'vue'
UploadExcel().then(res => { import Company from 'components/dlg/Company.vue'
ld.xlsFile = res import EditCompanyPage from 'components/dlg/EditCompany.vue'
}) import { useQuasar } from 'quasar'
} import { Companies, CreateCompany, Rpa, UploadExcel ,EditCompany} from 'app/bindings/lib/srv/Srv'
import * as wails from '@wailsio/runtime'
const doRpa = function () {
Rpa(ld.companyID, ld.month, ld.year).catch(err => console.log(err)) const $q = useQuasar()
}
const ld = reactive({
</script> companyID: null,
companies: [],
xlsFile: '',
logProcess: [],
year: 2024,
month: 1,
right : true
})
// let tab = ref('mails')
onMounted(() => {
getCompanies()
wails.Events.On('logProcess', function (ev) {
ld.logProcess.push(ev.data)
})
})
const editCompany = function () {
const selectedCompanyID = ld.companyID;
const selectedCompany = ld.companies.find(company => company.Id === selectedCompanyID);
$q.dialog({
component: EditCompanyPage,
parent: this,
componentProps: {
id : parseInt(selectedCompany.Id),
name: selectedCompany.Name,
memberNumber: selectedCompany.MemberNumber,
userName : selectedCompany.Username,
password : selectedCompany.Password,
},
// ----------------------
// props that are passed to component instance
}).onOk(data => {
EditCompany(data.id, data.name, data.memberNumber, data.userName, data.password).then(()=>{
getCompanies()
})
})
}
const createCompany = function () {
$q.dialog({
component: Company,
parent: this,
// ----------------------
// props that are passed to component instance
}).onOk(data => {
CreateCompany(data.name, data.memberNumber, data.username, data.password).then(()=>{
getCompanies()
})
})
}
const getCompanies = function () {
ld.companies.splice(0)
Companies().then(res => {
ld.companies.push(...res)
console.log(ld.companies)
})
}
const upload = function () {
UploadExcel().then(res => {
ld.xlsFile = res
})
}
const doRpa = function () {
ld.logProcess = []
Rpa(ld.companyID, ld.month, ld.year,ld.right).catch(err => console.log(err))
}
</script>

View File

@@ -1,39 +1,39 @@
<template> <template>
<q-page padding> <q-page padding>
<q-input v-model="ld.name" label='İsim'/> <q-input v-model="ld.name" label='İsim'/>
<q-btn label="Selamla" @click="doGreet" /> <q-btn label="Selamla" @click="doGreet" />
{{ld.result}} {{ld.result}}
</q-page> </q-page>
</template> </template>
<script setup> <script setup>
import { onMounted, reactive } from 'vue' import { onMounted, reactive } from 'vue'
// import {Events} from "@wailsio/runtime"; // import {Events} from "@wailsio/runtime";
const ld = reactive({ const ld = reactive({
name: '', name: '',
result: '', result: '',
time: '' time: ''
}) })
/* /*
onMounted(() => { onMounted(() => {
Events.On('time', (timeValue) => { Events.On('time', (timeValue) => {
console.log(timeValue) console.log(timeValue)
ld.time = timeValue.data; ld.time = timeValue.data;
}); });
}) })
*/ */
const doGreet = () => { const doGreet = () => {
let localName = ld.name; let localName = ld.name;
if (!localName) { if (!localName) {
localName = 'anonymous'; localName = 'anonymous';
} }
Greet(localName).then((resultValue) => { Greet(localName).then((resultValue) => {
ld.result = resultValue; ld.result = resultValue;
}).catch((err) => { }).catch((err) => {
console.log(err); console.log(err);
}); });
} }
</script> </script>

View File

@@ -1,30 +1,30 @@
import { route } from 'quasar/wrappers' import { route } from 'quasar/wrappers'
import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router' import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router'
import routes from './routes' import routes from './routes'
/* /*
* If not building with SSR mode, you can * If not building with SSR mode, you can
* directly export the Router instantiation; * directly export the Router instantiation;
* *
* The function below can be async too; either use * The function below can be async too; either use
* async/await or return a Promise which resolves * async/await or return a Promise which resolves
* with the Router instance. * with the Router instance.
*/ */
export default route(function (/* { store, ssrContext } */) { export default route(function (/* { store, ssrContext } */) {
const createHistory = process.env.SERVER const createHistory = process.env.SERVER
? createMemoryHistory ? createMemoryHistory
: (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory) : (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory)
const Router = createRouter({ const Router = createRouter({
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: () => ({ left: 0, top: 0 }),
routes, routes,
// Leave this as is and make changes in quasar.conf.js instead! // Leave this as is and make changes in quasar.conf.js instead!
// quasar.conf.js -> build -> vueRouterMode // quasar.conf.js -> build -> vueRouterMode
// quasar.conf.js -> build -> publicPath // quasar.conf.js -> build -> publicPath
history: createHistory(process.env.VUE_ROUTER_BASE) history: createHistory(process.env.VUE_ROUTER_BASE)
}) })
return Router return Router
}) })

View File

@@ -1,19 +1,19 @@
const routes = [ const routes = [
{ {
path: '/', path: '/',
component: () => import('layouts/MainLayout.vue'), component: () => import('layouts/MainLayout.vue'),
children: [ children: [
{ path: '', component: () => import('pages/IndexPage.vue') }, { path: '', component: () => import('pages/IndexPage.vue') },
{ path: '/page2', component: () => import('pages/page2.vue') }, { path: '/page2', component: () => import('pages/page2.vue') },
] ]
}, },
// Always leave this as last one, // Always leave this as last one,
// but you can also remove it // but you can also remove it
{ {
path: '/:catchAll(.*)*', path: '/:catchAll(.*)*',
component: () => import('pages/ErrorNotFound.vue') component: () => import('pages/ErrorNotFound.vue')
} }
] ]
export default routes export default routes

3183
app/frontend/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,15 +5,33 @@ go 1.22
toolchain go1.22.1 toolchain go1.22.1
require ( 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/jmoiron/sqlx v1.3.5
github.com/shopspring/decimal v1.3.1
github.com/wailsapp/wails/v3 v3.0.0-alpha.0 github.com/wailsapp/wails/v3 v3.0.0-alpha.0
github.com/xuri/excelize/v2 v2.8.1 github.com/xuri/excelize/v2 v2.8.1
google.golang.org/api v0.172.0
modernc.org/sqlite v1.29.5 modernc.org/sqlite v1.29.5
) )
require ( 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/carlmjohnson/requests v0.24.3
github.com/dustin/go-humanize v1.0.1 // 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/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/imdario/mergo v0.3.12 // indirect github.com/imdario/mergo v0.3.12 // indirect
github.com/leaanthony/slicer v1.5.0 // indirect github.com/leaanthony/slicer v1.5.0 // indirect
@@ -27,10 +45,30 @@ require (
github.com/wailsapp/wails/v2 v2.3.2-0.20230117193915-45c3a501d9e6 // indirect 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/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
golang.org/x/crypto v0.19.0 // indirect github.com/ysmood/fetchup v0.2.3 // indirect
golang.org/x/net v0.21.0 // indirect github.com/ysmood/goob v0.4.0 // indirect
golang.org/x/sys v0.17.0 // indirect github.com/ysmood/got v0.34.1 // indirect
golang.org/x/text v0.14.0 // 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.25.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/oauth2 v0.18.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.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/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
modernc.org/libc v1.41.0 // indirect modernc.org/libc v1.41.0 // indirect
modernc.org/mathutil v1.6.0 // indirect modernc.org/mathutil v1.6.0 // indirect

View File

@@ -1,19 +1,217 @@
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/carlmjohnson/requests v0.24.3 h1:LYcM/jVIVPkioigMjEAnBACXl2vb42TVqiC8EYNoaXQ=
github.com/carlmjohnson/requests v0.24.3/go.mod h1:duYA/jDnyZ6f3xbcF5PpZ9N8clgopubP2nK5i6MVMhU=
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 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 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 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 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 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 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= 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 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY=
github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
@@ -31,6 +229,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/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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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 h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
@@ -38,6 +237,21 @@ 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.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= 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/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
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 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
@@ -52,32 +266,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/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 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= 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= github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= 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.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
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 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.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.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
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.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.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-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-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.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.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.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-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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= 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.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
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 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 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
@@ -94,3 +753,6 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= 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 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= 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=

21
app/lib/bot/bordro.go Normal file
View File

@@ -0,0 +1,21 @@
package bot
import "github.com/shopspring/decimal"
type LucaBordro struct {
Sube string
Bolum string
TcNo string
AdSoyad string
Ucretler map[string]decimal.Decimal
//Header map[string]string
}
type BordroPageSelectBoxType struct {
B string
N string
}
const (
BIndex = "B"
NIndex = "N"
)

950
app/lib/bot/luca.go Normal file
View File

@@ -0,0 +1,950 @@
package bot
import (
"bordrobot/lib/company"
"bordrobot/lib/helper"
"bordrobot/lib/ocr"
"context"
"errors"
"fmt"
"io/ioutil"
"strconv"
"strings"
"time"
"github.com/shopspring/decimal"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/rod/lib/proto"
)
var pageErrors []string
var scriptIndexArray []BordroPageScript
type Luca struct {
Page *rod.Page
Browser *rod.Browser
}
type errorInfo struct {
Error string
Index int
}
type BordroPageScript struct {
Index string
Value string
itemType string
DomSelectValue struct {
Index string
Value string
itemType string
}
}
func (l *Luca) ErrFunc(index bool) {
if index {
CloseBrowser(l.Browser)
}
}
func (l *Luca) ClosingBrowserFromExternalLink() {
CloseBrowser(l.Browser)
}
func VerifyCaptcha(page *rod.Page) error {
//captcha := "#captcha"
picturePreparation := []string{
`document.getElementsByTagName("body")[0].style.backgroundImage = "none"`,
`document.getElementsByClassName("baslik1")[0].style.display = "none"`,
`document.getElementsByClassName("baslik2")[0].style.display = "none"`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = "none"`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = "none"`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = "none"`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = "none"`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = "none"`,
`document.getElementsByClassName("captcha-container")[0].style.display ='none'`,
}
for i := 0; i < len(picturePreparation); i++ {
wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil)
wait()
_, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`))
if err != nil {
return err
}
fmt.Print(err)
}
datas, err := page.Screenshot(true, &proto.PageCaptureScreenshot{})
if err != nil {
panic(err)
}
err = helper.CreateFolder("./processFolder")
err = ioutil.WriteFile("./processFolder/screenshot.png", datas, 0644)
if err != nil {
panic(err)
}
//captchaMessage, err := ReceiveDOMMessages(page, captcha, "src")
picturePreparation = []string{
`document.getElementsByTagName("body")[0].style.backgroundImage = ""`,
`document.getElementsByClassName("baslik1")[0].style.display = ""`,
`document.getElementsByClassName("baslik2")[0].style.display = ""`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = ""`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = ""`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = ""`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = ""`,
`document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = ""`,
}
for i := 0; i < len(picturePreparation); i++ {
wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil)
wait()
_, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`))
if err != nil {
return err
}
fmt.Print(err)
}
var captchaMsg string
screenshot, err := page.Screenshot(true, &proto.PageCaptureScreenshot{})
if err != nil {
return errors.New("Captcha Sayfasında Hata Oluştu. İşlem Sonlanıyor.")
}
//captchaMsg, err = ocr.VisionApi("./processFolder/screenshot.png")
captchaMsg, err = ocr.DecodeTwoCaptcha(context.Background(), screenshot, "luca")
if err != nil {
return errors.New("Captcha Servisinde Hata Oluştu. İşlem Sonlanıyor.")
}
trimmedMsg := strings.ReplaceAll(captchaMsg, " ", "")
trimmedMsg = strings.Replace(trimmedMsg, "\"", "", -1)
page.MustElement("#captcha-input").MustInput(strings.ToLower(trimmedMsg))
_, err = page.Evaluate(rod.Eval(`document.getElementById(document.forms[0].submit())`))
if err != nil {
}
err = WaitLoad(page)
if err != nil {
return err
}
getUrl := page.MustInfo().URL
splitUrl := strings.Split(getUrl, "/")
uri := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
if uri != "main.erp" {
_, err = page.Evaluate(rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`))
//rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`)
VerifyCaptcha(page)
fmt.Println("captcha tekrar deneme fonksiyonuna sok")
//captcha tekrar denenecek
}
return nil
}
func NewLucaBot(devMode bool) *Luca {
l := launcher.New().
Headless(devMode).
Devtools(true)
//defer l.Cleanup()
url := l.MustLaunch()
browser := rod.New().
ControlURL(url).
Trace(true).
//SlowMotion(1 * time.Second).
MustConnect()
page := browser.MustPage("https://agiris.luca.com.tr/LUCASSO/giris.erp")
fmt.Println(page)
return &Luca{Page: page, Browser: browser}
}
func (l *Luca) Login(company company.Company, month float64, year float64) error {
page := l.Page
err := WaitLoad(page)
if err != nil {
return err
}
err = FillInput(page, "#musteriNo", company.MemberNumber)
if err != nil {
return err
}
page.Timeout(500)
err = FillInput(page, "#kullaniciAdi", company.Username)
if err != nil {
return err
}
page.Timeout(500)
err = FillInput(page, "#parola", company.Password)
if err != nil {
return err
}
page.Timeout(500)
result, err := page.Evaluate(rod.Eval(`()=>{girisbtn()}`))
if err != nil {
return err
}
page.Timeout(1000)
loginDialog := "body > div.swal2-container.swal2-fade.swal2-in > div > div.swal2-content"
loginDialogMessage, err := ReceiveDOMMessages(page, loginDialog, "innerText")
if err != nil {
errString := err.Error()
if !strings.Contains(errString, "Sellector Bulunamadı") {
return err
}
}
if loginDialogMessage == "Müşteri No, Kullanıcı Adı veya Parola hatalıdır." {
return errors.New("Şifre hatalı")
}
err = WaitLoad(page)
if err != nil {
return err
}
getUrl := page.MustInfo().URL
splitUrl := strings.Split(getUrl, "/")
splitUrlPage := strings.Split(splitUrl[len(splitUrl)-1], ";")[0]
if splitUrlPage != "main.erp" {
VerifyCaptcha(page)
}
fmt.Println(result)
wait := page.WaitRequestIdle(1000*time.Millisecond, nil, nil, nil)
wait()
_, err = page.Evaluate(rod.Eval(`()=>{gonder('formTarget');}`))
if err != nil {
return err
}
Wait(page, 2000)
allPages, err := page.Browser().Pages()
if err != nil {
return err
}
newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
err = WaitLoad(newPage)
if err != nil {
return err
}
frm4, err := newPage.Element("#frm4")
if err != nil {
return err
}
frame4, err := frm4.Frame()
Wait(frame4, 1500)
err = WaitLoad(newPage)
if err != nil {
return err
}
Wait(frame4, 1500)
companiesSelectBoxWait, err := frame4.Element("#SirketCombo > option")
if err != nil {
return err
}
err = companiesSelectBoxWait.WaitLoad()
if err != nil {
return err
}
companiesSelectBox, err := frame4.Elements("#SirketCombo > option")
if err != nil {
return err
}
var vls string = ""
for j := 0; j < len(companiesSelectBox); j++ {
tex, err := companiesSelectBox[j].Text()
value, err := companiesSelectBox[j].Property("value")
if err != nil {
return err
}
if err != nil {
return err
}
if tex == company.Name {
vls = value.String()
break
}
}
Wait(newPage, 500)
element, err := frame4.Element("#SirketCombo")
if err != nil {
return err
}
selectInput := Select{Element: element, Selector: "#SirketCombo"}
err = selectInput.SelectItem(vls)
if err != nil {
return err
}
err = WaitLoad(frame4)
if err != nil {
return err
}
Wait(frame4, 1500)
companiesSelectYear, err := frame4.Elements("#DonemCombo > option")
if err != nil {
return err
}
for j := 0; j < len(companiesSelectYear); j++ {
tex, err := companiesSelectYear[j].Text()
value, err := companiesSelectYear[j].Property("value")
if err != nil {
return err
}
if err != nil {
return err
}
if strings.Contains(tex, strconv.Itoa(int(year))) {
vls = value.String()
break
}
}
Wait(newPage, 500)
element, err = frame4.Element("#DonemCombo")
if err != nil {
return err
}
selectInput = Select{Element: element, Selector: "#DonemCombo"}
err = selectInput.SelectItem(vls)
if err != nil {
return err
}
err = WaitLoad(frame4)
if err != nil {
return err
}
err = ClickItem(frame4, "#SirName > button.no-bold.green > i", 1)
err = WaitLoad(frame4)
if err != nil {
return err
}
Wait(newPage, 500)
return err
}
func (l *Luca) BordroTableMaping(frame *rod.Page, b *LucaBordro) ([]BordroPageScript, error) {
scriptIndexArray = []BordroPageScript{}
table, err := frame.Elements("#scroll > div > table > tbody > tr > td > table > tbody > tr > td") //table kontrol et var mı yok mu diye
if err != nil {
return nil, err
}
//table := frame.MustElements(".i2")
var mainText string
for t := 0; t < len(table); t++ {
inputElement, err := table[t].Element("input")
text, err := table[t].Text()
fmt.Print(mainText)
if text != "" {
mainText = text
}
if inputElement != nil {
if mainText != "" {
fmt.Print(t)
elem, err := table[t+1].Element("input")
if elem == nil {
mainText = ""
fmt.Print("Hatalı Text")
continue
}
id, err := elem.Attribute("id")
fmt.Print(err)
pageScript := BordroPageScript{
Value: text,
Index: *id,
itemType: "input",
}
scriptIndexArray = append(scriptIndexArray, pageScript)
mainText = ""
}
} else {
if t <= len(table)-2 {
if text != "" {
if mainText == "N\nB" {
aa, err := table[t].Element("select")
id, err := aa.Attribute("id")
dd := len(scriptIndexArray) - 2
scriptIndexArray[dd].DomSelectValue.Index = *id
scriptIndexArray[dd].DomSelectValue.Value = mainText
scriptIndexArray[dd].DomSelectValue.itemType = "select"
fmt.Print(aa, id, err)
}
inputBox, err := table[t+1].Element("input")
selectBox, err := table[t+1].Element("select")
fmt.Print(err)
if inputBox != nil {
types, err := inputBox.Attribute("type")
if err != nil {
return nil, err
}
if *types != "hidden" {
id, err := inputBox.Attribute("id")
pageScript := BordroPageScript{
Value: text,
Index: *id,
itemType: "input",
}
scriptIndexArray = append(scriptIndexArray, pageScript)
fmt.Print(inputBox, err, id, types)
}
} else if selectBox != nil {
id, err := selectBox.Attribute("id")
if err != nil {
return nil, err
}
pageScript := BordroPageScript{
Value: text,
Index: *id,
itemType: "selectBox",
}
scriptIndexArray = append(scriptIndexArray, pageScript)
}
mainText = ""
}
}
}
fmt.Print(err)
}
return scriptIndexArray, nil
}
func (l *Luca) PayrollPageLogin() error {
newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do")
if err != nil {
return err
}
fs2, err := newPage.Element("#frm2")
if err != nil {
return err
}
frame, err := fs2.Frame()
fs3, err := newPage.Element("#frm3")
if err != nil {
return err
}
frame3, err := fs3.Frame()
err = newPage.WaitLoad()
if err != nil {
return err
}
err = frame.WaitLoad()
if err != nil {
return err
}
Wait(newPage, 500)
err = ClickItem(frame, "#apy1000m0i1ITD", 1)
if err != nil {
return err
}
fmt.Println(err)
err = ClickItem(frame3, "#apy1000m36i4ITX", 1)
if err != nil {
return err
}
err = newPage.WaitLoad()
if err != nil {
return err
}
Wait(newPage, 1500)
err = WaitLoad(frame3)
if err != nil {
return err
}
return err
}
func (l *Luca) BordroYaz(month, year int, b *LucaBordro, lastItem bool) error {
newPage, err := l.GetPageByUrl("https://auygs.luca.com.tr/Luca/luca.do")
if err != nil {
return err
}
frame3, err := l.GetFrame(newPage, "#frm3")
if err != nil {
return err
}
isyeriId := ""
bolumId := ""
err = WaitLoad(frame3)
if err != nil {
return err
}
Wait(frame3, 2000)
err = WaitDomElement(frame3, "#isyeriId > option", 50)
if err != nil {
return errors.New("işyeri bulunurken hata ile karşılaşıldı")
}
bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option")
if err != nil {
return err
}
for j := 0; j < len(bordroCompanySelectBox); j++ {
text, err := bordroCompanySelectBox[j].Text()
value, err := bordroCompanySelectBox[j].Property("value")
if err != nil {
return err
}
if strings.Trim(text, " ") == b.Sube { //.Sube.Value
isyeriId = value.String()
break
}
}
if isyeriId == "" {
return errors.New("Kayıtlı Şube Bulunamadı")
}
err = WaitLoad(frame3)
if err != nil {
return err
}
Wait(frame3, 1000)
element, err := frame3.Element("#isyeriId")
element.WaitLoad()
if err != nil {
return err
}
selectInput := Select{Element: element, Selector: "#isyeriId"}
err = selectInput.SelectItem(isyeriId)
if err != nil {
return err
}
err = WaitLoad(frame3)
if err != nil {
return err
}
Wait(frame3, 2500)
err = WaitDomElement(frame3, "#bolumId > option", 50)
if err != nil {
return errors.New("bölüm bulunurken hata ile karşılaşıldı")
}
bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option")
if err != nil {
return err
}
element, err = frame3.Element("#bolumId > option")
if err != nil {
return err
}
element.WaitLoad()
err = WaitLoad(frame3)
if err != nil {
return err
}
for j := 0; j < len(bordroDepartmentSelectBox); j++ {
text, err := bordroDepartmentSelectBox[j].Text()
value, err := bordroDepartmentSelectBox[j].Property("value")
if err != nil {
return err
}
if strings.Trim(text, " ") == b.Bolum { //.Bolum.Value
bolumId = value.String()
break
}
}
if bolumId == "" {
return errors.New("Kayıtlı Bölüm Bulunamadı")
}
element, err = frame3.Element("#bolumId")
if err != nil {
return err
}
selectInput = Select{Element: element, Selector: "#bolumId"}
err = selectInput.SelectItem(bolumId)
if err != nil {
return err
}
Wait(frame3, 1000)
err = WaitLoad(frame3)
if err != nil {
return err
}
err = ClickItem(frame3, "#tr"+strconv.FormatFloat(float64(month), 'f', -1, 64)+" > td:nth-child(1)", 2) //aktarım ayı
if err != nil {
return err
}
err = WaitLoad(frame3)
if err != nil {
return err
}
Wait(frame3, 1500)
var isEmpty bool = false
//var targetID string
err = WaitDomElement(frame3, "#scroll > table > tbody > tr > td[id^='tcKimlikNo']", 50)
if err != nil {
return errors.New("tablo okunurken hata ile karşılaşıldı")
}
elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']")
if err != nil {
return err
}
elemsProcess, err := frame3.Elements("#scroll > table > tbody > tr > td > a")
if err != nil {
return err
}
trs, err := frame3.Elements("#scroll > table > tbody > tr")
if err != nil {
return err
}
var foundIndex int = -1
for j := 0; j < len(elems); j++ {
tex, err := elems[j].Text()
if err != nil {
return err
}
process, err := elemsProcess[j].Text()
if err != nil {
return err
}
if tex == b.TcNo { //.TCKimlikNo.Value
foundIndex = j
if process == "Bordro Sil" {
isEmpty = true
}
break
}
}
if foundIndex == -1 {
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
err = WaitLoad(frame3)
if err != nil {
return err
}
return errors.New("Böyle Bir Kullanıcı Bulunamadı")
}
if isEmpty == true {
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
err = WaitLoad(frame3)
if err != nil {
return err
}
return errors.New("Yazılı Bordro Var Lütfen Siliniz")
}
if foundIndex != -1 && isEmpty == false {
trs[foundIndex].Click(proto.InputMouseButtonLeft, 2)
}
Wait(newPage, 1500)
err = WaitLoad(frame3)
if err != nil {
return err
}
rsp, err := l.BordroTableMaping(frame3, b)
if err != nil {
return errors.New("Bordro Tablosu Çekilemedi")
}
sgkDayFlag := false
//rsp den dönden değerler ile matchlencek ve yazılcak
firsts := make(map[string]decimal.Decimal)
if value, ok := b.Ucretler["Normal Gün"]; ok {
// Anahtarı ve değeri yeni map'e ekle
firsts["Normal Gün"] = value
}
if value, ok := b.Ucretler["Hafta Tatili"]; ok {
// Anahtarı ve değeri yeni map'e ekle
firsts["Hafta Tatili"] = value
}
if value, ok := b.Ucretler["Genel Tatil"]; ok {
// Anahtarı ve değeri yeni map'e ekle
firsts["Genel Tatil"] = value
}
if value, ok := b.Ucretler["Ücretli İzin"]; ok {
// Anahtarı ve değeri yeni map'e ekle
firsts["Ücretli İzin"] = value
if !value.IsZero() {
sgkDayFlag = true
}
}
if value, ok := b.Ucretler["Rapor"]; ok {
// Anahtarı ve değeri yeni map'e ekle
firsts["Rapor"] = value
if !value.IsZero() {
sgkDayFlag = true
}
}
keys := []string{"Normal Gün", "Hafta Tatili", "Genel Tatil", "Ücretli İzin", "Rapor"}
for _, v := range keys {
fmt.Print(v)
for i := 0; i < len(rsp); i++ {
value, ok := firsts[v]
if !ok {
fmt.Printf("Key %s not found in map\n", v)
break
}
if v == rsp[i].Value {
el, err := frame3.Element("#" + rsp[i].Index)
if err != nil {
return err
}
if !value.Equal(value.Truncate(0)) {
nevvl := strings.ReplaceAll(value.String(), ".", ",")
strv := nevvl
err = el.Input(strv)
if err != nil {
return err
}
} else {
err = el.Input(value.String())
if err != nil {
return err
}
}
el.Eval(`this.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'}))`)
// valueStr := value.String()
// // JS ile değeri ata, input tetikle, blur tetikle (Enter yerine geçer)
// script := fmt.Sprintf(`this.value = "%s"; this.dispatchEvent(new Event("input", { bubbles: true })); this.blur();`, strings.ReplaceAll(valueStr, `"`, `\"`))
// _, err = el.Eval(script)
// if err != nil {
// return err
// }
break
}
}
}
display, err := frame3.Element("#puantajGunTable")
if err != nil {
return errors.New("Puantaj Gün Tablosu Bulunamadı.")
}
dsp, err := display.Attribute("style")
if err != nil {
return err
}
// `display: none;` içerip içermediğini kontrol et
if dsp != nil && !strings.Contains(*dsp, "display: none;") {
if sgkDayFlag {
ClickItem(frame3, "#ayGun2", 1)
} else {
ClickItem(frame3, "#ayGun1", 1)
}
}
for k, v := range b.Ucretler {
splitValue := strings.SplitN(k, " #", 2)
k = strings.TrimSpace(splitValue[0])
var elementInsertControl bool = true
var displayControl bool = true
tt := v.String()
if tt == "0" {
continue
}
if k == "Normal Gün" || k == "Hafta Tatili" || k == "Genel Tatil" || k == "Ücretli İzin" || k == "Rapor" {
continue
}
Wait(frame3, 100)
for i := 0; i < len(rsp); i++ {
if k == rsp[i].Value {
var hashValue string
if len(splitValue) > 1 {
hashValue = strings.TrimSpace(splitValue[1])
}
Wait(frame3, 200)
if rsp[i].itemType == "selectBox" {
elemBox, err := frame3.Element("#" + rsp[i].Index)
if err != nil {
return err
}
selectInput = Select{Element: elemBox, Selector: "#" + rsp[i].Index}
err = selectInput.SelectItem(v.String())
if err != nil {
return err
}
elementInsertControl = false
break
}
el, err := frame3.Element("#" + rsp[i].Index)
if err != nil {
return err
}
// //s ve g olunca i yi çalıştır n ve b olunca i+1 i
if (hashValue == "S" || hashValue == "G") && k != "ARGE-Destek ve Tasarım Faaliyeti" {
if rsp[i+1].Value != hashValue {
newBordroPage, err := frame3.Element("body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)")
newBordroPage.WaitLoad()
if err != nil {
return err
}
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
err = WaitLoad(frame3)
if err != nil {
return err
}
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
return errors.New(k + hashValue + "Sütun Bulunamadı")
}
el, err = frame3.Element("#" + rsp[i].Index)
if err != nil {
return err
}
}
if hashValue == "B" || hashValue == "N" {
if strings.Contains(rsp[i].Index, "Carpan") {
b := BordroPageSelectBoxType{
B: "1", // Buraya gerçek değeri koyun
N: "0", // Buraya gerçek değeri koyun
}
var dynamicValue string
if hashValue == "B" {
dynamicValue = b.B
} else {
dynamicValue = b.N
}
elemBox, err := frame3.Element("#" + rsp[i].DomSelectValue.Index)
if err != nil {
return err
}
selectInput = Select{Element: elemBox, Selector: "#" + rsp[i].DomSelectValue.Index}
err = selectInput.SelectItem(dynamicValue)
if err != nil {
return err
}
el, err = frame3.Element("#" + rsp[i+1].Index)
if err != nil {
return err
}
}
}
if k == "ARGE-Destek ve Tasarım Faaliyeti" {
if hashValue == "S" {
el, err = frame3.Element("#" + rsp[i+1].Index)
if err != nil {
return err
}
}
}
value := v.String()
if strings.Contains(value, ".") {
value = strings.Replace(value, ".", ",", -1)
}
elemF := el
if strings.Contains(rsp[i].Index, rsp[i].Index) {
for {
parentElement, err := elemF.Parent()
if err != nil {
fmt.Println("Error:", err)
}
innerHTML, err := parentElement.HTML()
if err != nil {
fmt.Println("Error:", err)
}
// innerHTML'deki etiket adını al
tagName1 := strings.Split(innerHTML, ">")[0]
tagName := strings.TrimPrefix(tagName1, "<")
fmt.Println("Tag name:", tagName)
fmt.Print(tagName)
if strings.Contains(tagName, "table") {
if strings.Contains(tagName1, " display: none;") {
displayControl = false
}
break
}
elemF = parentElement
}
}
if displayControl {
err = el.Input(value)
}
elementInsertControl = false
break
}
}
if elementInsertControl {
if tt != "0" {
newBordroPage, err := frame3.Element("body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)")
newBordroPage.WaitLoad()
if err != nil {
return err
}
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
err = WaitLoad(frame3)
if err != nil {
return err
}
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
return errors.New(k + " Sütunu Bulunamadı Taslak Hatası, ")
}
}
}
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1)
if err != nil {
return err
}
saveButtonMessage, _ := ReceiveDOMMessages(frame3, ".alert-container", "innerText")
// if err != nil {
// return err
// }
if saveButtonMessage != "Bordro hesaplanıyor." {
newBordroPage, err := frame3.Element("body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)")
newBordroPage.WaitLoad()
if err != nil {
return err
}
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
err = WaitLoad(frame3)
if err != nil {
return err
}
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
return errors.New(saveButtonMessage)
}
err = WaitLoad(frame3)
if err != nil {
return err
}
newBordroPage, err := frame3.Element("body > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)")
newBordroPage.WaitLoad()
if err != nil {
return err
}
newBordroPage.Click(proto.InputMouseButtonLeft, 1)
err = WaitLoad(frame3)
if err != nil {
return err
}
err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1)
if err != nil {
return err
}
return err
}

140
app/lib/bot/rodhelper.go Normal file
View File

@@ -0,0 +1,140 @@
package bot
import (
"errors"
"fmt"
"time"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/proto"
)
type Select struct {
Element *rod.Element
Selector string
}
func (elemSelector *Select) SelectItem(changeValue string) error {
_, err := elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").value = "` + changeValue + `";}`))
_, err = elemSelector.Element.Evaluate(rod.Eval(`()=>{document.querySelector("` + elemSelector.Selector + `").dispatchEvent(new Event('change'));}`))
return err
}
func WaitLoad(frm *rod.Page) error { // belli bir süre redirect ten önceki js fonksiyonunun tamamlanması bekleniyor
wait := frm.WaitRequestIdle(100*time.Millisecond, nil, nil, nil)
wait()
err := frm.WaitLoad()
return err
}
func ReceiveDOMMessages(page *rod.Page, selector string, searchValue string) (string, error) {
// Tek bir öğe alınması, hata durumunu kontrol etmek için
elemd := page.MustElements(selector)
// Eğer elem boş ise, yani nil ise, hata döndür
if len(elemd) == 0 {
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
return "", err
}
elem := page.MustElement(selector)
// Eğer elem boş ise, yani nil ise, hata döndür
if elem == nil {
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
return "", err
}
// Öğenin metnini al
//text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()
// text := elem.MustEval(`() => this.innerText`).String()
text := elem.MustEval(fmt.Sprintf(`() => this.%s`, searchValue)).String()
return text, nil
}
func FillInput(frm *rod.Page, selector string, value string) error {
el, err := frm.Element(selector)
if err != nil {
return err
}
err = el.Input(value)
return err
}
func ClickItem(frm *rod.Page, selector string, clickCount int) error {
// Sayfadan ilgili öğeyi bul
el, err := frm.Element(selector)
err = el.WaitLoad()
if err != nil {
return err
}
err = el.Click(proto.InputMouseButtonLeft, clickCount)
return err
}
func Wait(frm *rod.Page, millisecond time.Duration) {
wait := frm.WaitRequestIdle(millisecond*time.Millisecond, nil, nil, nil)
wait()
}
func CloseBrowser(browser *rod.Browser) {
browser.Close()
}
func (l *Luca) GetPageByUrl(url string) (*rod.Page, error) {
allPages, err := l.Page.Browser().Pages()
if err != nil {
return nil, err
}
return allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do")
}
func (l *Luca) GetFrame(page *rod.Page, selector string) (*rod.Page, error) {
err := page.WaitLoad()
if err != nil {
return nil, err
}
frm, err := page.Element(selector)
if err != nil {
return nil, err
}
frame, err := frm.Frame()
return frame, nil
}
func WaitDomElement(page *rod.Page, selector string, duration time.Duration) error {
if page == nil {
return errors.New("page is nil sellector : " + selector)
}
//todo: [hd] : timeout taki 10 integer değerini const olarak al ve bunu bastır
element, err := page.Timeout(duration * time.Second).Element(selector)
if err != nil {
return err
}
err = element.WaitLoad()
return err
}
func ReceiveDOMMessagesElements(page *rod.Page, selector string, searchValue string, duration time.Duration) (rod.Elements, error) {
//todo
// Tek bir öğe alınması, hata durumunu kontrol etmek için
elemd, err := page.Timeout(duration * time.Second).Elements(selector)
if err != nil {
return nil, err
}
// Eğer elem boş ise, yani nil ise, hata döndür
if len(elemd) == 0 {
err := fmt.Errorf("Sellector Bulunamadı: %v", selector)
return nil, err
}
return elemd, nil
}
// func (elemSelector *Select) MultipleEvalute(changeValue []string) error {
// for i := 0; i < len(changeValue); i++ {
// _, err := elemSelector.Element.Evaluate(rod.Eval(changeValue[i]))
// if err != nil {
// return err
// }
// }
// return nil
// }

View File

@@ -5,11 +5,17 @@ import (
) )
type Company struct { type Company struct {
Id int `db:"id"`
Name string `db:"name"` Name string `db:"name"`
MemberNumber string `db:"member_number"` MemberNumber string `db:"member_number"`
Username string `db:"username"` Username string `db:"username"`
Password string `db:"password"` Password string `db:"password"`
} }
type CompanyInfo struct {
Company Company
Month float64
Year float64
}
func (c *Company) Create() error { func (c *Company) Create() error {
sq := ` sq := `
@@ -19,3 +25,40 @@ VALUES (:name, :member_number, :username, :password)
_, err := run.DB.NamedExec(sq, &c) _, err := run.DB.NamedExec(sq, &c)
return err return err
} }
func (c *Company) Edit() error {
sq := `
UPDATE company SET
name = :name,
member_number = :member_number,
username = :username,
password = :password
WHERE id = :id;`
_, err := run.DB.NamedExec(sq, &c)
return err
}
//func GetCompany(companyName string) (Company, error) {
// sq := `
// SELECT * FROM company WHERE company = ?
// `
// err := run.DB.Get(&Company, sq, companyName)
// if err != nil {
// return Company{}, err
// }
// return Company{}, nil
//}
//
func GetCompany(companyID float64) (Company, error) {
var company Company
sq := `
SELECT * FROM company WHERE id = ?
`
err := run.DB.Get(&company, sq, companyID)
if err != nil {
return Company{}, err
}
return company, nil
}

View File

@@ -1,27 +1,27 @@
package company package company
import ( import (
"bordrobot/lib/run" "bordrobot/lib/run"
"testing" "testing"
) )
func TestCompany_Create(t *testing.T) { func TestCompany_Create(t *testing.T) {
err := run.InitDB("../..") err := run.InitDB("../..")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
c := &Company{ c := &Company{
Name: "Deneme Firması", Name: "Deneme Firması",
MemberNumber: "1234", MemberNumber: "1234",
Username: "u1", Username: "u1",
Password: "p1", Password: "p1",
} }
err = c.Create() err = c.Create()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
run.DB.Close() run.DB.Close()
} }

30
app/lib/helper/helper.go Normal file
View File

@@ -0,0 +1,30 @@
package helper
import (
"fmt"
"os"
)
type errorInfo struct {
Error string
Index int
}
func (e *errorInfo) ErrorHandle() {
//apiden veya txt ye yaz
}
func CreateFolder(folderName string) error {
if _, err := os.Stat(folderName); os.IsNotExist(err) {
// Klasör yoksa oluştur
err := os.Mkdir(folderName, 0755)
if err != nil {
fmt.Println("Klasör oluşturulamadı:", err)
return err
}
fmt.Println("Klasör oluşturuldu:", folderName)
} else {
fmt.Println("Klasör zaten var:", folderName)
}
return nil
}

348
app/lib/model/bordro.go Normal file
View File

@@ -0,0 +1,348 @@
package model
import (
"fmt"
"reflect"
//"github.com/go-rod/rod"
)
type BordroProperty struct {
Index int
Value string
Id string
//DomType string
}
type Bordro struct {
Sube BordroProperty // 0
Bolum BordroProperty //
TCKimlikNo BordroProperty //
AdiSoyadi BordroProperty //
NormalGun BordroProperty //4
HaftaTatili BordroProperty //
X75 BordroProperty //
EksikGunNeden BordroProperty //
ArgeDestekVeTasarim BordroProperty //
FazlaMesai BordroProperty // 9
GeceMesaisi BordroProperty //10
BayramMesaisi BordroProperty //
Yol BordroProperty //12
YemekGun BordroProperty //13
YemekTutar BordroProperty //
Aile BordroProperty //15
Cocuk BordroProperty //
Evlenme BordroProperty //17
Dogum BordroProperty //18
Olum BordroProperty //19
Askerlik BordroProperty //20
Ozelsigorta BordroProperty //21
BireyselEmeklilik BordroProperty //22
HayatSigortasi BordroProperty //23
PrimNet BordroProperty //24
PrimBrut BordroProperty //
IkramiyeNet BordroProperty //25
IkramiyeBrut BordroProperty //
KıdemTazminatı BordroProperty //28
IhbarTazminati BordroProperty //29
Bayram BordroProperty //30
Yakacak BordroProperty //31
HuzurHakki BordroProperty //32
HediyeKart BordroProperty
YakitKart BordroProperty
YillikIzin BordroProperty
MaasFarki BordroProperty
AyirilisPaketi BordroProperty
RamazanKumanyasi BordroProperty
TelefonDesteği BordroProperty //39
EkOdemeNet BordroProperty
EkOdemeBrut BordroProperty
IsAramaIzni BordroProperty
Prim2 BordroProperty //43
Prim3 BordroProperty
Prim4 BordroProperty
CalismaIzniHarci BordroProperty
OzeldurumOdenesi BordroProperty
EmekliSandigiCalisanPrimi BordroProperty
LisanTazminati BordroProperty
OdulOdenesi BordroProperty
IsSonuTazminati BordroProperty
VergiIstisnasiEkOdeme BordroProperty
KresYardimi BordroProperty //53
EsnekYanHak BordroProperty
AracKullanim BordroProperty
EgitimDesteği BordroProperty
DelegeUcreti BordroProperty
HarcTutarlari BordroProperty
SendikaIscilikFarkUcretleri BordroProperty
IsinmaDesteği BordroProperty
SoforlukMesaisi BordroProperty
Avans BordroProperty
Icra BordroProperty
Sendika BordroProperty
HediyeKart2 BordroProperty
YemekAyni BordroProperty
RamazanKumanyasiAyni BordroProperty
BagimliOSSKesintisi BordroProperty
CalismaIzniHarciAyni BordroProperty
TrafikCezasiKesintisi BordroProperty
BesKesintisi BordroProperty
YakitKart2 BordroProperty
GrupBesPersonelPayiKesintisi BordroProperty
IstisnadanKaynaklananKesinti BordroProperty
EmekliSandigiCalisanPrimKesintisi BordroProperty
PesinYillikIzinKesintisi BordroProperty
TelefonLimitAsimKesintisi BordroProperty
ZimmetTamirKesintisi BordroProperty
YakitAsimKesintisi BordroProperty
DigerAvanslar BordroProperty
DigerKesintiler BordroProperty
ZorunluBesKesintisi BordroProperty
ZimmetliBilgisayarTamirUcreti BordroProperty
HarcTutarlari2 BordroProperty
PrimAvansi BordroProperty
MasrafKesintisi BordroProperty
BireyselEmekPrimi BordroProperty //88
OzelsigortaPrimi BordroProperty //89
DigerIstisnalar BordroProperty //90
}
func getPageId(id string) string {
switch id {
case "NormalGun":
return "#normalGun0" //Normal Gün
case "HaftaTatili":
return "#normalGun1" //, "checkbox" Hafta Tatili
case "X75":
return "" //x7.5
case "EksikGunNeden":
return "" //Eksik Gün Neden
case "ArgeDestekVeTasarim":
return "" //ARGE-Destek ve Tasarım Faaliyeti
case "FazlaMesai":
return "#ekKazancCarpan0" //Fazla Mesai
case "GeceMesaisi":
return "#ekKazancCarpan1" //Gece Mesaisi
case "BayramMesaisi":
return "" //Bayram Mesaisi
case "Yol":
return "#ekKazancCarpan3" //Yol
case "YemekGun":
return "#ekKazancCarpan4" //Yemek (Gün)
case "YemekTutar":
return "" //Yemek (Tutar)
case "Aile":
return "#ekKazancDeger5" //Aile
case "Cocuk":
return "" //Çocuk
case "Evlenme":
return "#ekKazancDeger7" //Evlenme
case "Dogum":
return "#ekKazancDeger8" //Doğum
case "Olum":
return "#ekKazancDeger9" //Ölüm
case "Askerlik":
return "#ekKazancDeger10" //Askerlik
case "Ozelsigorta":
return "#ekKazancDeger11" //Özel Sigorta
case "BireyselEmeklilik":
return "#ekKazancDeger12" //Bireysel Emeklilik
case "HayatSigortasi":
return "#ekKazancDeger13" //Hayat Sigortası
case "PrimNet":
return "#ekKazancDeger14" //Prim (Net)
case "PrimBrut":
return "#ekKazancDeger15" //Prim (Brüt)
case "IkramiyeNet":
return "" //İkramiye (Net)
case "IkramiyeBrut":
return "" //İkramiye (Brüt)
case "KıdemTazminatı":
return "#ekKazancDeger16" //Kıdem Tazminatı
case "IhbarTazminati":
return "#ekKazancDeger17" //İhbar Tazminatı
case "Bayram":
return "#ekKazancDeger18" //Bayram
case "Yakacak":
return "#ekKazancDeger19" //Yakacak
case "HuzurHakki":
return "#ekKazancDeger23" //Huzur Hakkı
case "HediyeKart":
return "" //Hediye Kart*
case "YakitKart":
return "" //Yakıt Kart*
case "YillikIzin":
return "" //Yıllık İzin
case "MaasFarki":
return "" //Maaş Farkı
case "AyirilisPaketi":
return "" //Ayrılış Paketi
case "RamazanKumanyasi":
return "" //Ramazan Kumanyası*
case "TelefonDesteği":
return "#ekKazancDeger21" //Telefon Desteği
case "EkOdemeNet":
return "" //Ek Ödeme (Net)
case "EkOdemeBrut":
return "" //Ek Ödeme (Brüt)
case "IsAramaIzni":
return "" //İş Arama İzni
case "Prim2":
return "#ekKazancDeger20" //Prim2
case "Prim3":
return "" //Prim3
case "Prim4":
return "" //Prim4
case "CalismaIzniHarci":
return "" //Çalışma İzni Harç. Vb.*
case "OzeldurumOdenesi":
return "" //Özel Durum Ödemesi
case "EmekliSandigiCalisanPrimi":
return "" //Emekli Sandığı Çalışan Primi
case "LisanTazminati":
return "" //Lisan Tazminatı
case "OdulOdenesi":
return "" //Ödül Ödemesi
case "IsSonuTazminati":
return "" //İş Sonu Tazminatı
case "VergiIstisnasiEkOdeme":
return "" //Vergi İstisnası Ek Ödeme
case "KresYardimi":
return "#ekKazancDeger22" //Kreş Yardımı
case "EsnekYanHak":
return "" //Esnek Yan Hak
case "AracKullanim":
return "" //Araç Kullanım
case "EgitimDesteği":
return "" //Eğitim Desteği
case "DelegeUcreti":
return "" //Delege Ücreti
case "HarcTutarlari":
return "" //Harç Tutarları*
case "SendikaIscilikFarkUcretleri":
return "" //Sendika İşçilik Fark Ücretleri
case "IsinmaDesteği":
return "" //Isınma Desteği
case "SoforlukMesaisi":
return "" //Şoförlük Mesaisi
case "Avans":
return "" //Avans
case "Icra":
return "" //icra
case "Sendika":
return "" //Sendika
case "HediyeKart2":
return "" //Hediye Kart
case "YemekAyni":
return "" //Yemek (Ayni)
case "RamazanKumanyasiAyni":
return "" //Ramazan Kumanyası (Ayni)
case "BagimliOSSKesintisi":
return "" //Bağımlı (Eş-Çocuk) ÖSS Kesintisi
case "CalismaIzniHarciAyni":
return "" //Çalışma İzni Harç. Vb.(Ayni)
case "TrafikCezasiKesintisi":
return "" //Trafik Cezası Kesintisi
case "BesKesintisi":
return ""
case "YakitKart2":
return ""
case "GrupBesPersonelPayiKesintisi":
return ""
case "IstisnadanKaynaklananKesinti":
return ""
case "EmekliSandigiCalisanPrimKesintisi":
return ""
case "PesinYillikIzinKesintisi":
return ""
case "TelefonLimitAsimKesintisi":
return ""
case "ZimmetTamirKesintisi":
return ""
case "YakitAsimKesintisi":
return ""
case "DigerAvanslar":
return ""
case "DigerKesintiler":
return ""
case "ZorunluBesKesintisi":
return ""
case "ZimmetliBilgisayarTamirUcreti":
return ""
case "HarcTutarlari2":
return ""
case "PrimAvansi":
return ""
case "MasrafKesintisi":
return ""
case "BireyselEmekPrimi":
return "#bireyselEmeklilikIstisna"
case "OzelsigortaPrimi":
return "#ozelSigortaIstisna"
case "DigerIstisnalar":
return "#digerIstisna"
default:
return ""
}
}
// func (b *Bordro) FillBordroForm(rodForm *rod.Page) error {
// objValue := reflect.ValueOf(b).Elem()
// objType := objValue.Type()
// for i := 0; i < objValue.NumField(); i++ {
// field := objValue.Field(i)
// fieldName := objType.Field(i).Name
// valueField := field.FieldByName("Value")
// idField := field.FieldByName("Id")
// idValue := idField.Interface().(string)
// if idValue != "" {
// elem, err := rodForm.Element(idField.Interface().(string))
// if err != nil {
// return err
// }
// value := valueField.Interface().(string)
// // switch expression {
// // case "input":
// // //elem.Input(value)
// // }
// elem.Input(value)
// }
// fmt.Print(fieldName)
// }
// return nil
// }
// BordroProperty structının tipi de olabilir drop checkbox vs ayrı bir fonksiyon çalışabilir getPageId den dönebilirsin
func NewFromExcelLine(rows []string) (*Bordro, error) {
bordro := Bordro{} // Yeni bir Bordro örneği oluştur
//her indexi eşitleyebilirsin bordro objesine veya tek
// Iterate over the fields of MyStruct
objValue := reflect.ValueOf(&bordro).Elem()
objType := objValue.Type()
for i := 0; i < objValue.NumField(); i++ {
field := objValue.Field(i)
fieldName := objType.Field(i).Name
indexField := field.FieldByName("Index")
valueField := field.FieldByName("Value")
idField := field.FieldByName("Id")
if len(rows) > i {
indexField.SetInt(int64(i))
valueField.SetString(rows[i])
idField.SetString(getPageId(fieldName))
} else {
indexField.SetInt(int64(i))
valueField.SetString("")
idField.SetString(getPageId(fieldName))
}
fmt.Print(field)
fmt.Print(fieldName)
}
fmt.Print(objType)
//bordro.Sube = ExcelCellValue{ExcelIndex: 0}
return &bordro, nil
}

BIN
app/lib/ocr.rar Normal file

Binary file not shown.

View File

@@ -0,0 +1,65 @@
package ocr
import (
"context"
"errors"
"github.com/carlmjohnson/requests"
)
func DecodeGeminiCaptcha(ctx context.Context, image []byte, typ string) (string, error) {
var captchaResult string
var errBody string
url := "https://notvis.notitek.com.tr" + "/api/captcha/gemini"
err := requests.
URL(url).
Header("X-Api-Key", "3c43c4eb-4b5d-4636-8dd5-3d573a7a0a27").
//Header("Content-Type", "application/json").
//Header("Authorization", "Bearer "+l.sessionID).
BodyBytes(image).
ToString(&captchaResult).
Method("POST").
AddValidator(
requests.ValidatorHandler(
requests.DefaultValidator,
requests.ToString(&errBody),
)).
Fetch(ctx)
if err != nil {
if errors.Is(err, requests.ErrInvalidHandled) {
err = errors.New(errBody)
}
}
return captchaResult, err
}
func DecodeTwoCaptcha(ctx context.Context, image []byte, typ string) (string, error) {
var captchaResult string
var errBody string
url := "https://notvis.notitek.com.tr" + "/api/captcha/twoCaptcha"
err := requests.
URL(url).
Header("X-Api-Key", "3c43c4eb-4b5d-4636-8dd5-3d573a7a0a27").
BodyBytes(image).
ToString(&captchaResult).
Method("POST").
AddValidator(
requests.ValidatorHandler(
requests.DefaultValidator,
requests.ToString(&errBody),
)).
Fetch(ctx)
if err != nil {
if errors.Is(err, requests.ErrInvalidHandled) {
err = errors.New(errBody)
}
return "", err
}
return captchaResult, err
}

View File

@@ -0,0 +1,12 @@
{
"type": "service_account",
"project_id": "readpdf-247814",
"private_key_id": "75de5191c0835028caf9413f8023f26e353064f8",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJ0D23gU4luBgN\nRUmhL9h1qaBqNcv5KGPYUjDcdCGTixea8nOkOxZwYLmKU3VpEmizAAxe2zVrTH0J\nalJwW+u6UUKrgIDbV68/IzYKKKQ7HwrpVnjh0T8kSFTCsfoCcTAmhlFLvHtQBUdU\nxl1E5X+Ckp3K2LOZwi5lrlK3VttSuzFTWmQ2ZMjeEdxwPjsyTsM8XWQ+SQUoPYFj\nuLcqHFf8caZFPWXrxXluTOcJOl/N5OAvObrftUz2stNnwhuPI7648umzdeAuMWGW\nrRd0ZTPDtH0xx56nvSoghNREw9imNVKIlUPwSwCBZ5iNH6fiTO5IdeDG9qWf/STJ\nwVvaDj1xAgMBAAECggEAAdCVktOJgwf8xLcddQ2bwghxy4K1qtqUy0Ux8J7lY7uZ\nzWg7Z1FWClH/A8zBqYg42M3ko+sPYpT1gDgsivDIqzbqhTr1QwOu17/WpJC+U/8b\nd1hdDerLyTpn82LrqfSf8ji9p74Hfdi4+NIv1IbGdsN1bSA1vT7kcUBNY3NXKuSa\nm5ceq6cSzuPH8qxjgkMIxxARCQtNVksMk8lIBoXNk4xxBgGnOwgHWEK9bGarPXZO\n8Z9ruWHCAJL1fiXjyJbVhdz4q8euVdR10KpF+u0/lHx2JMlLBPuIDlC8sxpwX+/V\nSw5wFziGETJiiRgkKxEqKIt/WvjHxDHWkaNZPcXkgQKBgQD0rJvKn4/oS/4kECFo\nAPFZs7uHiMDuTKh9P4aE7Pu1b3sEXAfsjMk3N5j1eV8ACFLzOfCjAStue1MFj81S\nz4dl9NBRNUdE+uTORmiX/Ch2t6bSlKNi8CdkHHKAs6kVk2Wr2XBD0fYKEmGkuh++\nMenBPZuOBjSULy4v1wumW/2UTQKBgQDTJ7tNFzt7hMoW3/djasIHUdJ4m1JZWa1A\n4fDUfvCFARUUr0k1TxcHAtQ5wQwue+uF5J7OixI+xavwHSXBTPQLbn2V2Ypbaa/F\nNr63IR2IKrtwJzt8LTXBvREESajjolvb31Vxf14/0nJgW67bjaLu5/Yq3/mjjRIZ\nqg7PpdNvtQKBgQCD8PTOLn9/CEPTFLO/DwsXkVmmO/O2TbZqXDBhTB5sd+KBtlM7\nl6wGT7/3V+0H6nU43lzKuh2+pVhe3m4dovXj4EHaGP4Gz7lFFyjeFMeJRX37ftYg\ny1qinMiOaNPcY7DnHAlzOS0Rv1nSZ+AoQ2hHob5ZtzTxWAPzHmcU3fR/3QKBgQC8\nJOvcffXvUlurVDafa/GlCgAKnQMcQC6C4I9xGAaBzHwXKTSG/ojbI2csatnK1Xn/\nnLzv9rT0H7fbRG1utn3BbdsS2XpRh3Mpu2Tl0ej5enH3Nc3oEHSUwz1VX7jP08wb\ntvzwG3hET+S//RFp6eMjEqaif111oG5fVcrKtMwX/QKBgCCTlt3lBaZPuUInLEIK\nNRqR7iZnepJsDUMYJj/T/zg+JL0novWViVEQaFB88soNGXjV6WRmytlUDi3PpNe/\nswfxQICn+ylZtYD8VoHL1+l9kDBVUQlKmZuMgh8YKEWKHoAok5gZYedB4Gtte1XQ\n+ase2cuWUegX3FAlcMf3GBqE\n-----END PRIVATE KEY-----\n",
"client_email": "my-vision-sa@readpdf-247814.iam.gserviceaccount.com",
"client_id": "101714157123021750580",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/my-vision-sa%40readpdf-247814.iam.gserviceaccount.com"
}

BIN
app/lib/ocr/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

67
app/lib/ocr/visionapi.go Normal file
View File

@@ -0,0 +1,67 @@
package ocr
import (
"context"
"fmt"
"os"
"google.golang.org/api/option"
vision "cloud.google.com/go/vision/apiv1"
)
var credsPath = "C:/Users/huseyin/Desktop/project/notitek/BordroRobot/app/lib/ocr/readpdf-75de5191c083.json"
func detectText(filePath string) ([]string, error) {
ctx := context.Background()
client, err := vision.NewImageAnnotatorClient(ctx, option.WithCredentialsFile(credsPath))
if err != nil {
return nil, fmt.Errorf("ImageAnnotatorClient oluşturulamadı: %v", err)
}
f, err := os.Open(filePath)
if err != nil {
return nil, fmt.Errorf("Dosya açılamadı: %v", err)
}
defer f.Close()
image, err := vision.NewImageFromReader(f)
if err != nil {
return nil, fmt.Errorf("Resim oluşturulamadı: %v", err)
}
annotations, err := client.DetectTexts(ctx, image, nil, 10)
if err != nil {
return nil, fmt.Errorf("Metin tespit edilemedi: %v", err)
}
res := make([]string, 0)
if len(annotations) == 0 {
return nil, fmt.Errorf("Metin tespit edilemedi: %v", err)
} else {
fmt.Println("Metin:")
for _, annotation := range annotations {
// fmt.Println(annotation)
res = append(res, annotation.Description)
}
}
return res, nil
}
func VisionApi(path string) ([]string, error) {
filePath := path // Örnek bir dosya yolu
resp, err := detectText(filePath)
if err != nil {
fmt.Printf("Metin tespit edilemedi: %v\n", err)
return nil, err
}
for _, txt := range resp {
fmt.Println(txt)
}
return resp, nil
}

View File

@@ -1,5 +1,5 @@
package run package run
import "github.com/wailsapp/wails/v3/pkg/application" import "github.com/wailsapp/wails/v3/pkg/application"
var APP *application.App var APP *application.App

View File

@@ -38,6 +38,7 @@ func InitDB(path string) error {
companySchema := ` companySchema := `
create table company ( create table company (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name text not null unique, name text not null unique,
member_number text not null, member_number text not null,
username text not null, username text not null,

View File

@@ -1,11 +1,16 @@
package srv package srv
import ( import (
"bordrobot/lib/bot"
"bordrobot/lib/company" "bordrobot/lib/company"
"bordrobot/lib/run" "bordrobot/lib/run"
"fmt"
"log/slog"
"strings"
"github.com/shopspring/decimal"
"github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/application"
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
"log/slog"
) )
type Srv struct { type Srv struct {
@@ -28,10 +33,25 @@ func (s *Srv) CreateCompany(name, memberNumber, username, password string) error
return c.Create() return c.Create()
} }
func (s *Srv) EditCompany(id float64, name, memberNumber, username, password string) error {
c := &company.Company{
Id: int(id),
Name: name,
MemberNumber: memberNumber,
Username: username,
Password: password,
}
return c.Edit()
}
func (s *Srv) UploadExcel() string { func (s *Srv) UploadExcel() string {
dialog := application.OpenFileDialog() dialog := application.OpenFileDialog()
dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx") // dialog.AddFilter("Excel Dosyaları", "*.xls;*.xlsx;*.ods")
dialog.AddFilter("Excel 97-2003", "*.xls")
dialog.AddFilter("Excel 2007+", "*.xlsx")
dialog.AddFilter("LibreOffice Calc", "*.ods")
dialog.SetTitle("Bordro Excel Dosyası Yükleme") dialog.SetTitle("Bordro Excel Dosyası Yükleme")
file, err := dialog.PromptForSingleSelection() file, err := dialog.PromptForSingleSelection()
if err != nil { if err != nil {
@@ -41,11 +61,38 @@ func (s *Srv) UploadExcel() string {
return file return file
} }
func (s *Srv) Rpa(companyName string, month float64, year float64) error { type userInfo struct {
//todo: readb company details by name userName string
//todo: save xls to application folder as /name/year/month.xlsx password string
accountNo string
}
//wails nümerik değerleri float gönderiyor.. int gönderimi araştırılmalı func (s *Srv) Rpa(companyID float64, month float64, year float64, devMode bool) error {
type CompanyInfo struct {
company *company.Company // float64.Company türünü gömme
month float64 // yeni bir alan ekliyoruz
year float64
}
user, err := company.GetCompany(companyID)
if err != nil {
return err
}
// companyInfo := CompanyInfo{
// company: &user,
// month: month,
// year: year,
// }
//todo: readb company details by name
b := bot.NewLucaBot(devMode)
emitLog("Aktarım Başladı")
err = b.Login(user, month, year)
if err != nil {
//todo: inform user about process and errors
emitLog("Şifreniz Hatalı")
return nil
}
err = b.PayrollPageLogin()
slog.Debug("inputs", "year", year, "month", month) slog.Debug("inputs", "year", year, "month", month)
f, err := excelize.OpenFile(s.xlsFileName) f, err := excelize.OpenFile(s.xlsFileName)
@@ -62,21 +109,170 @@ func (s *Srv) Rpa(companyName string, month float64, year float64) error {
}() }()
sheets := f.GetSheetList() sheets := f.GetSheetList()
cols, err := f.GetCols(sheets[0]) rows, err := f.GetRows(sheets[0])
fmt.Println(rows)
if err != nil { if err != nil {
slog.Error(err.Error()) slog.Error(err.Error())
return err return err
} }
for _, row := range cols { if len(rows) < 3 {
//todo: process excel and do data input emitLog("Boş Excel Yüklemesi")
b.ClosingBrowserFromExternalLink()
return nil
}
// if rows[0][0] == "" {
// rows = rows[1:]
// }
// type hashtagValue struct {
// B string
// N string
// G string
// S string
// }
// checkHeader := make(map[string]*hashtagValue)
//todo: inform user about process and errors // for _, col := range rows[0] {
run.APP.Events.Emit(&application.WailsEvent{ // if strings.Contains(col, "Cagatay") {
Name: "logProcess", // fmt.Print("deneme")
Data: row[1], // }
}) // var keySplitOne string
// hs := &hashtagValue{
// B: "",
// N: "",
// G: "",
// S: "",
// }
// key := col
// if strings.Contains(col, "#") {
// keySplit := strings.SplitN(col, " #", 2)
// key = strings.TrimSpace(keySplit[0])
// keySplitOne = strings.TrimSpace(keySplit[0])
// fmt.Print(keySplitOne)
// if existingHS, ok := checkHeader[key]; ok {
// hs = existingHS
// }
// // Burada keySplitOne değerine göre hs struct'ının hangi alanını dolduracağımızı belirliyoruz
// if keySplit[1] == "B" {
// hs.B = keySplit[1]
// } else if keySplit[1] == "N" {
// hs.N = keySplit[1]
// } else if keySplit[1] == "G" {
// hs.G = keySplit[1]
// } else if keySplit[1] == "S" {
// hs.S = keySplit[1]
// }
// }
// checkHeader[key] = hs
// }
var lastItem bool = false
// data := make([]*model.Bordro, 0) // []*Bordro türünde bir dilim oluştur
for i := 1; i < len(rows); i++ {
brd := &bot.LucaBordro{
Sube: rows[i][0],
Bolum: rows[i][1],
TcNo: rows[i][2],
AdSoyad: rows[i][3],
Ucretler: make(map[string]decimal.Decimal),
//Header: make(map[string]string),
}
var status bool = false
//var ExcelError string
for ndx, col := range rows[i] {
if ndx > 3 {
key := rows[0][ndx]
if strings.Contains(key, "#") {
keySplit := strings.SplitN(key, " #", 2)
keySplitOne := strings.TrimSpace(keySplit[0])
tseK := strings.TrimSpace(keySplit[1])
fmt.Print(tseK)
for k, d := range brd.Ucretler {
if strings.Contains(k, keySplitOne) { //k=olan
a := d.String()
fmt.Print(a)
if strings.Contains(k, "B") && strings.Contains(tseK, "N") {
if col != "" && a != "0" {
emitLog(key + " : aynı anda B ve N Sütunu Girilemez ")
status = true
break
}
}
if strings.Contains(k, "N") && strings.Contains(tseK, "B") {
if col != "" && a != "0" {
emitLog(key + " : aynı anda N ve B Sütunu Girilemez ")
status = true
break
}
}
if strings.Contains(k, "G") && strings.Contains(tseK, "S") {
if col != "" && a != "0" {
emitLog(key + ": aynı anda G ve S Sütunu Girilemez ")
status = true
break
}
}
if strings.Contains(k, "S") && strings.Contains(tseK, "G") {
if col != "" && a != "0" {
emitLog(key + ": aynı anda S ve G Sütunu Girilemez ")
status = true
break
}
}
}
}
if status {
break
}
}
brd.Ucretler[key], err = decimal.NewFromString(col)
if err != nil {
if strings.Contains(col, ",") {
col = strings.Replace(col, ",", "", -1)
brd.Ucretler[key], err = decimal.NewFromString(col)
if err != nil {
fmt.Print(err)
}
}
// emitLog(`excel okunurken sorun oluştu`)
fmt.Println(err)
}
}
}
if status {
continue
}
if i == len(rows)-1 {
lastItem = true
}
err := b.BordroYaz(int(month), int(year), brd, lastItem)
var str string
if err != nil {
emitLog("Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "Kullanıcı Adı: " + brd.AdSoyad + err.Error())
} else {
str = "Şube : " + brd.Sube + "Bölüm : " + brd.Bolum + "işlem başarılı, " + "Kullanıcı Adı: " + brd.AdSoyad
emitLog(str)
}
} }
emitLog("İşlem Tamamlandı")
b.ClosingBrowserFromExternalLink()
return nil return nil
} }
func emitLog(logMessage string) {
run.APP.Events.Emit(&application.WailsEvent{
Name: "logProcess",
Data: logMessage,
})
}

View File

@@ -1,13 +1,13 @@
package main package main
type LoginUser struct { type LoginUser struct {
UserName string UserName string
password string password string
Token string Token string
LoggedIn bool LoggedIn bool
} }
type LoginService struct{} type LoginService struct{}
func (g *LoginService) Login(userName string, password string) LoginUser { func (g *LoginService) Login(userName string, password string) LoginUser {
return LoginUser{password: password, UserName: userName, Token: "test", LoggedIn: true} return LoginUser{password: password, UserName: userName, Token: "test", LoggedIn: true}
} }

View File

@@ -5,8 +5,9 @@ import (
"bordrobot/lib/run" "bordrobot/lib/run"
"bordrobot/lib/srv" "bordrobot/lib/srv"
"embed" "embed"
"github.com/wailsapp/wails/v3/pkg/application"
"log" "log"
"github.com/wailsapp/wails/v3/pkg/application"
) )
// Wails uses Go's `embed` package to embed the frontend files into the binary. // Wails uses Go's `embed` package to embed the frontend files into the binary.

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
app/sadasdads.zip Normal file

Binary file not shown.

BIN
app/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,8 +1,8 @@
{ {
"name": "Vue + Vite", "name": "Vue + Vite",
"shortname": "vue", "shortname": "vue",
"author": "Lea Anthony", "author": "Lea Anthony",
"description": "Vue + Vite development server", "description": "Vue + Vite development server",
"helpurl": "https://wails.io", "helpurl": "https://wails.io",
"version": 3 "version": 3
} }

BIN
bordro_robot.db Normal file

Binary file not shown.

3
go.mod Normal file
View File

@@ -0,0 +1,3 @@
module BordroRobot
go 1.22.1

0
go.sum Normal file
View File