-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql.go
411 lines (362 loc) · 11.7 KB
/
sql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
package main
import (
"database/sql"
"fmt"
"log"
"os"
"strconv"
"time"
_ "github.com/go-sql-driver/mysql"
)
type Graph struct {
X *string
Y *float64
Z *float64
}
type Table struct {
Col1 *string
Col2 *string
Col3 *string
Col4 *string
Col5 *string
Col6 *string
}
var db *sql.DB
func opendb() (db *sql.DB, messagebox Message) {
// Get a database handle.
var err error
// var user string
fmt.Println("Connecting to DB...")
fmt.Println("user:", os.Getenv("USER"))
fmt.Println("pass:", os.Getenv("PASS"))
fmt.Println("server:", os.Getenv("SERVER"))
fmt.Println("port:", os.Getenv("PORT"))
fmt.Println("Opening Database...")
connectstring := os.Getenv("USER") + ":" + os.Getenv("PASS") + "@tcp(" + os.Getenv("SERVER") + ":" + os.Getenv("PORT") + ")/orders?parseTime=true"
fmt.Println("Connection: ", connectstring)
db, err = sql.Open("mysql",
connectstring)
if err != nil {
messagebox.Success = false
messagebox.Body = err.Error()
fmt.Println("Message: ", messagebox.Body)
return nil, messagebox
}
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
return nil, handleerror(pingErr)
}
//Success!
fmt.Println("Returning Open DB...")
messagebox.Success = true
messagebox.Body = "Success"
return db, messagebox
}
func Orderlookup(ordernum int) (message Message, orderdetail OrderDetail) {
// Get a database handle.
var err error
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
db, message = opendb()
return handleerror(pingErr), orderdetail
}
//Query
var newquery string = "select a.id,b.user,b.time,c.user,c.time from orders a LEFT JOIN (select * FROM scans where station='pick') b ON a.id = b.ordernum LEFT JOIN (select * FROM scans where station='ship') c ON a.id = c.ordernum WHERE a.statusid not in (0) and a.id = ? order by 1,5;"
//Run Query
fmt.Println("Looking up order: ", ordernum)
location, err := time.LoadLocation("America/Chicago")
rows, err := db.Query(newquery, ordernum)
if err != nil {
return handleerror(err), orderdetail
}
defer rows.Close()
//Pull Data
for rows.Next() {
err := rows.Scan(&orderdetail.ID, &orderdetail.Picker, &orderdetail.Picktime, &orderdetail.Shipper, &orderdetail.Shiptime)
if err != nil {
return handleerror(err), orderdetail
}
}
if orderdetail.ID == 0 {
message.Body = "Order not found"
}
orderdetail.Picktime = orderdetail.Picktime.In(location)
orderdetail.Shiptime = orderdetail.Shiptime.In(location)
return message, orderdetail
}
// Error List
func ErrorList(startdate time.Time, enddate time.Time, limit int) (message Message, table []Table) {
// Get a database handle.
var err error
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
db, message = opendb()
return handleerror(pingErr), table
}
//Query
var newquery string = "select a.orderid, b.user, a.issue, a.comment, b.time FROM errors a left join scans b on a.orderid = b.ordernum WHERE a.issue in ('Missing','Incorrect') AND b.station = 'pick' and b.time between ? and ? order by 5 desc limit ?"
//Run Query
fmt.Println("Running Error List")
rows, err := db.Query(newquery, startdate, enddate, limit)
if err != nil {
return handleerror(err), table
}
defer rows.Close()
//Pull Data
for rows.Next() {
var r Table
err := rows.Scan(&r.Col1, &r.Col2, &r.Col3, &r.Col4, &r.Col5)
if err != nil {
return handleerror(err), table
}
table = append(table, r)
}
return message, table
}
// Errors reporting
func ErrorLookup(startdate time.Time, enddate time.Time) (message Message, graph []Graph) {
// Get a database handle.
var err error
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
db, message = opendb()
return handleerror(pingErr), graph
}
//Query
var newquery string = "select user, round(errors/hours,3) error_rate FROM (select user,usercode,count(*) as errors FROM (select a.orderid, a.issue,b.user,c.usercode,b.time from errors a inner join scans b on a.orderid = b.ordernum left join users c on b.user=c.username where b.station='pick' and a.issue in ('Incorrect','Missing') and time between ? and ?) d GROUP BY user,usercode) e LEFT JOIN (select payroll_id, sum(paid_hours) hours FROM shifts where clock_in between ? and ? group by payroll_id) f on e.usercode = f.payroll_id"
//Run Query
fmt.Println("Running Error Report")
rows, err := db.Query(newquery, startdate, enddate, startdate, enddate)
if err != nil {
return handleerror(err), graph
}
defer rows.Close()
//Pull Data
for rows.Next() {
var r Graph
err := rows.Scan(&r.X, &r.Y)
if err != nil {
return handleerror(err), graph
}
graph = append(graph, r)
}
return message, graph
}
func Efficiency(startdate time.Time, enddate time.Time) (message Message, graph []Graph) {
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
return handleerror(pingErr), graph
}
var newquery string = "SELECT d.user,sum(d.items)/sum(e.hours) FROM (SELECT a.date,a.user,c.usercode,sum(b.items_total) items FROM (SELECT ordernum, station, user, DATE(scans.time) as date from scans where station='pick' group by ordernum, station, user, DATE(scans.time)) a INNER JOIN (SELECT id, items_total from orders) b on a.ordernum = b.id LEFT JOIN (SELECT usercode,username from users) c on a.user = c.username GROUP BY a.date,a.user,c.usercode) d LEFT JOIN (SELECT DATE(clock_in) clockin,payroll_id, sum(paid_hours) hours from shifts where role='Shipping' group by DATE(clock_in),payroll_id) e on d.date = e.clockin and d.usercode = e.payroll_id WHERE d.items IS NOT NULL and e.hours IS NOT NULL and d.date between ? and ? GROUP BY d.user ORDER BY 1,2;"
//Run Query
fmt.Println("Running Report")
// location, err := time.LoadLocation("America/Chicago")
rows, err := db.Query(newquery, startdate, enddate)
if err != nil {
return handleerror(err), graph
}
defer rows.Close()
//Pull Data
for rows.Next() {
var r Graph
err := rows.Scan(&r.X, &r.Y)
if err != nil {
return handleerror(err), graph
}
graph = append(graph, r)
}
return message, graph
}
func Servicelevel(startdate time.Time, enddate time.Time) (message Message, graph []Graph) {
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
return handleerror(pingErr), graph
}
var newquery string = "SELECT week, sum(case when SL < 3 then 1 else 0 end)/count(*) as SL, sum(case when SL < 4 then 1 else 0 end)/count(*) as SL1 FROM (select DATE_ADD(cast(a.date_created as date), INTERVAL(-WEEKDAY(cast(a.date_created as date))) DAY) as week,TOTAL_WEEKDAYS(b.time,a.date_created) - 1 as SL FROM orders a LEFT JOIN scans b ON a.id = b.ordernum where b.station = 'ship' and a.date_created between ? and ?) c GROUP BY week ORDER BY 1"
//Run Query
fmt.Println("Running Report")
// location, err := time.LoadLocation("America/Chicago")
rows, err := db.Query(newquery, startdate, enddate)
if err != nil {
return handleerror(err), graph
}
defer rows.Close()
//Pull Data
for rows.Next() {
var r Graph
err := rows.Scan(&r.X, &r.Y, &r.Z)
if err != nil {
return handleerror(err), graph
}
graph = append(graph, r)
}
return message, graph
}
func Groupefficiency(startdate time.Time, enddate time.Time) (message Message, graph []Graph) {
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
return handleerror(pingErr), graph
}
var newquery string = "SELECT shipments.date, items/hours efficiency FROM (select CAST(c.time as date) date, sum(a.items_total) items from orders a LEFT JOIN (select * FROM scans where station='ship') c ON a.id = c.ordernum WHERE a.statusid not in (0) and c.time is not null GROUP BY CAST(c.time as date) ) shipments LEFT JOIN (select cast(clock_in as date) date,sum(paid_hours) hours FROM shifts WHERE role = 'Shipping' group by cast(clock_in as date)) d on d.date = shipments.date WHERE items is not null and hours is not null and d.date between ? and ? order by 1;"
//Run Query
fmt.Println("Running Report")
// location, err := time.LoadLocation("America/Chicago")
rows, err := db.Query(newquery, startdate, enddate)
if err != nil {
return handleerror(err), graph
}
defer rows.Close()
//Pull Data
for rows.Next() {
var r Graph
err := rows.Scan(&r.X, &r.Y)
if err != nil {
return handleerror(err), graph
}
graph = append(graph, r)
}
return message, graph
}
func ErrorEnter(comment string, issue string, orderid int) (message Message) {
if orderid == 0 {
return message
}
fmt.Println("Entering error...")
pingErr := db.Ping()
if pingErr != nil {
fmt.Println(pingErr)
return handleerror(pingErr)
}
var newquery string = "REPLACE INTO errors(comment,issue,orderid) VALUES (?,?,?)"
fmt.Println("Query: ", newquery)
rows, err := db.Query(newquery, comment, issue, orderid)
if err != nil {
fmt.Println(err)
return handleerror(err)
}
defer rows.Close()
message.Title = "Success"
message.Success = true
message.Body = "Successfully entered: " + strconv.Itoa(orderid) + " " + issue + " " + comment
return message
}
func Updatepass(user string, pass string, secret string) (message Message, success bool) {
pingErr := db.Ping()
if pingErr != nil {
return handleerror(pingErr), false
}
//Check for secret
if secret != os.Getenv("SECRET") {
message.Title = "Secret Auth Failed"
message.Body = "Secret Auth Failed"
return message, false
}
hashpass := hashAndSalt([]byte(pass))
fmt.Println("Creating password hash of length ", len(hashpass), ": ", hashpass)
var newquery string = "update users set password = ? where username = ? and password = ''"
rows, err := db.Query(newquery, hashpass, user)
if err != nil {
return handleerror(err), false
}
defer rows.Close()
message.Title = "Success"
message.Body = "Success"
message.Success = true
return message, true
}
// Authenticate user from DB
func userauth(user string, pass string) (permission string, message Message) {
// Get a database handle.
var err error
var dbpass string
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
return "notfound", handleerror(pingErr)
}
//set Variables
//Query
var newquery string = "select password, permissions from users where username = ?"
// fmt.Println(newquery)
rows, err := db.Query(newquery, user)
if err != nil {
return "notfound", handleerror(err)
}
defer rows.Close()
//Pull Data
for rows.Next() {
err := rows.Scan(&dbpass, &permission)
if err != nil {
return "notfound", handleerror(err)
}
}
err = rows.Err()
if err != nil {
return "notfound", handleerror(err)
}
fmt.Println("Checking Permissions: ", permission)
//If user has not set a password
if dbpass == "" {
message.Title = "Set Password"
message.Body = "Password not set, please create password"
return "newuser", message
}
//If Permissions do not exist for user
if permission == "" {
message.Title = "Permission not found"
message.Body = "Permissions not set for user. Please contact your system administrator."
return "notfound", message
}
if comparePasswords(dbpass, []byte(pass)) {
message.Title = "Success"
message.Body = "Successfully logged in"
message.Success = true
// permission = "notfound"
return permission, message
}
message.Title = "Login Failed"
message.Body = "Login Failed"
permission = "notfound"
return permission, message
}
// Authenticate user from DB
func userdata(user string) (permission string) {
// Get a database handle.
var err error
//Test Connection
pingErr := db.Ping()
if pingErr != nil {
log.Fatal(pingErr)
}
//set Variables
//Query
var newquery string = "select permissions from users where username = ?"
// fmt.Println(newquery)
rows, err := db.Query(newquery, user)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
//Pull Data
for rows.Next() {
err := rows.Scan(&permission)
if err != nil {
log.Fatal(err)
}
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
if permission == "" {
return "notfound"
}
return permission
}