summaryrefslogtreecommitdiff
path: root/sqlite.go
diff options
context:
space:
mode:
authorNikolaus Gotsche <n@softwarefools.com>2018-09-03 03:17:43 +0200
committerNikolaus Gotsche <n@softwarefools.com>2018-09-03 03:17:43 +0200
commitd6dd3088da980467909a5a43fb393260c3ff7c93 (patch)
tree9349252e785db39b1dd3e2f54e6acb8be0c45af9 /sqlite.go
parent0dfd786bdd7dffc13f941d5a37e814f9f8bda846 (diff)
Task Selection For Billing
Diffstat (limited to 'sqlite.go')
-rw-r--r--sqlite.go230
1 files changed, 221 insertions, 9 deletions
diff --git a/sqlite.go b/sqlite.go
index 38b488e..79ef4a7 100644
--- a/sqlite.go
+++ b/sqlite.go
@@ -20,7 +20,7 @@ type project struct{
name string
first time.Time
last time.Time
- finish bool
+ finished int // id of last paid bill
customer int
}
@@ -30,7 +30,16 @@ type task struct{
start time.Time
stop time.Time
taskname string
- checkout bool
+ checkout int // id of bill
+}
+
+type customer struct{
+ id int
+ company string
+ name string
+ address string
+ satz float64
+ lastbill time.Time
}
var db *sql.DB
@@ -75,6 +84,7 @@ func initDB(filename string) {
times VARCHAR(240),
hours VARCHAR(240),
moneys VARCHAR(240),
+ paid TIMESTAMP DEFAULT '1791-09-30 19:07',
date TIMESTAMP DEFAULT '1791-09-30 19:07');
`
_, err = db.Exec(sqlstmt)
@@ -150,6 +160,22 @@ func newTask(proj int) {
}
}
+func newBill(proj int) (int) {
+ boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc()
+ //boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
+ fmt.Println(boldGreen("Creating New Bill"))
+ //Show 5 recent bills
+
+ invno := getInput("Invoice Number: ")
+ stmt, err := db.Prepare("INSERT INTO bills (identity, project, date) values(?, ?, datetime('now'))")
+ checkErr(err)
+ answ, err := stmt.Exec(invno,proj)
+ checkErr(err)
+ lid,_ := answ.LastInsertId()
+ fmt.Println("Bill",invno,"Created with ID",lid)
+ return int(lid)
+}
+
func closeTaskTime(tim string) {
boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc()
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
@@ -229,6 +255,7 @@ func getCustomerName(id int) (cust string) {
checkErr(err)
}
cust = fmt.Sprintf("%s: %s",com,nam)
+ cust = fmt.Sprintf("%s",com)
return
}
@@ -246,13 +273,161 @@ func getProjectName(id int) (pro string,cust string) {
return
}
-func getUnfinishedList() ([]int, []string) {
+func checkCustomerProjects(in []int) (multicust,multiproj bool, projid []int) {
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]")
+ que := fmt.Sprintf("SELECT project FROM timetable WHERE id IN (%s) ORDER BY project DESC",ins)
+ rows,err := db.Query(que)
+ prid, cuid, altprid, altcuid := 0,0,0,0
+ multicust, multiproj = false,false
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&prid)
+ checkErr(err)
+ if altprid == 0{
+ altprid = prid
+ projid = append(projid,prid)
+ }else{
+ if altprid != prid {
+ multiproj = true
+ altprid = prid
+ projid = append(projid,prid)
+ }
+ }
+
+ crows, err := db.Query("SELECT customer FROM projects WHERE id = ?",prid)
+ checkErr(err)
+ for crows.Next() {
+ err = crows.Scan(&cuid)
+ checkErr(err)
+ if altcuid == 0{
+ altcuid = cuid
+ }else{
+ if altcuid != cuid {
+ multicust = true
+ altcuid = cuid
+ }
+ }
+ }
+ }
+ return
+}
+
+func getProject(id int) (outpr project,outcu customer) {
+ rows, err := db.Query("SELECT * FROM projects WHERE id = ?",id)
+ checkErr(err)
+ var pid,customer,finished int
+ var first,last time.Time
+ var name string
+
+ for rows.Next() {
+ err = rows.Scan(&pid, &name, &first, &last, &finished, &customer)
+ checkErr(err)
+ outpr.id = pid
+ outpr.name = name
+ outpr.first = first
+ outpr.last = last
+ outpr.finished = finished
+ outpr.customer = customer
+ }
+ row, err := db.Query("SELECT * FROM customers WHERE id = ?",customer)
+ checkErr(err)
+ var cid int
+ var comp,cuname,addy string
+ var satz float64
+ var lastb time.Time
+
+ for row.Next() {
+ err = row.Scan(&cid, &comp, &cuname, &addy, &satz, &lastb)
+ checkErr(err)
+ outcu.id = cid
+ outcu.company = comp
+ outcu.name = cuname
+ outcu.address = addy
+ outcu.satz = satz
+ outcu.lastbill = lastb
+ }
+ return
+}
+
+func getSelectedTasks(in []int) (outtask []task) {
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]")
+ que := fmt.Sprintf("SELECT * FROM timetable WHERE id IN (%s)",ins)
+ rows,err := db.Query(que)
+ checkErr(err)
+
+ var id,project,checkout int
+ var start,stop time.Time
+ var tsk string
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&id,&project,&start,&stop,&tsk,&checkout)
+ outtask = append(outtask,task{id,project,start,stop,tsk,checkout})
+ }
+ return
+}
+func analyzeTasks(in []task) (count int, hours float64, duration string) {
+ var lstart,hstop time.Time
+ for i,t := range in {
+ if i==0 {
+ lstart=t.start
+ hstop=t.stop
+ }
+ count++
+ dur := float64(t.stop.Sub(t.start))/(1000000000*60*60)
+ hours=hours+dur
+ if lstart.After(t.start){
+ lstart=t.start
+ }
+ if hstop.Before(t.stop){
+ hstop=t.stop
+ }
+ //txt := fmt.Sprintf("%s - (%v) - %.2f h",task, durstr, dur)
+ }
+ duration = fmt.Sprintf("%v - %v",lstart.Local().Format("01.02.2006"),hstop.Local().Format("01.02.2006"))
+ return
+}
+
+func getProjectList(in []int) ([]int,[]string) {
+ var outids []int
+ var outstr []string
+
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]")
+ que := fmt.Sprintf("SELECT id, name FROM projects WHERE id IN (%s) ORDER BY last DESC",ins)
+ rows,err := db.Query(que)
+ checkErr(err)
+
+ var id int
+ var name string
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&id, &name)
+ checkErr(err)
+ outids = append(outids,id)
+ outstr = append(outstr,name)
+ }
+ return outids,outstr
+}
+
+func getTaskList(in []int,showcust bool) ([]int, []string) {
var outids []int
var outstr []string
lastpr := 0
pre := ""
prelen := 0
- rows,err := db.Query("SELECT id, project, start, stop, task FROM timetable WHERE stop != '1791-09-30 19:07' AND checkout = 0 ORDER BY project DESC, stop DESC")
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]")
+ que := fmt.Sprintf("SELECT id, project, start, stop, task FROM timetable WHERE id IN (%s) ORDER BY project DESC, stop DESC",ins)
+ rows,err := db.Query(que)
+ checkErr(err)
+ //rows,err := db.Query("SELECT id, project, start, stop, task FROM timetable WHERE id IN (?) ORDER BY project DESC, stop DESC",ins)
+ //rows,err := db.Query("SELECT id, project, start, stop, task FROM timetable WHERE stop != '1791-09-30 19:07' AND checkout = 0 AND id IN ? ORDER BY project DESC, stop DESC",in)
+ if (len(in)==1 && in[0]==0){
+ rows,err = db.Query("SELECT id, project, start, stop, task FROM timetable WHERE stop != '1791-09-30 19:07' AND checkout = 0 ORDER BY project DESC, stop DESC")
+ }//else{
+ // rows,err = db.Query("SELECT id, project, start, stop, task FROM timetable WHERE stop != '1791-09-30 19:07' AND checkout = 0 AND id IN ? ORDER BY project DESC, stop DESC",in)
+ //}
var id,project int
var task string
var start,stop time.Time
@@ -262,8 +437,12 @@ func getUnfinishedList() ([]int, []string) {
err = rows.Scan(&id, &project, &start, &stop, &task)
checkErr(err)
if project != lastpr {
- pr,_ := getProjectName(project)
- pre =fmt.Sprintf(" %v: ",pr)
+ pr,cu := getProjectName(project)
+ if showcust {
+ pre =fmt.Sprintf("%v| %v: ",cu,pr)
+ }else{
+ pre =fmt.Sprintf("%v: ",pr)
+ }
prelen = utf8.RuneCountInString(pre)
lastpr = project
//outstr[len(outstr)-1]=fmt.Sprintf("%s\n%s - %s",outstr[len(outstr)-1],cu,pr)
@@ -298,7 +477,8 @@ func getOpenTask() {
opentask.projectid = project
opentask.start = start
opentask.taskname = task
- opentask.checkout = checkout != 0
+ opentask.checkout = checkout
+ //opentask.checkout = checkout != 0
}
func showOpenTask() {
@@ -422,7 +602,8 @@ func getLastProject() {
currproject.name = nprname
currproject.first = nfirst
currproject.last = nlast
- currproject.finish = nfinish != 0
+ currproject.finished = nfinish
+ //currproject.finish = nfinish != 0
currproject.customer = ncustom
}
@@ -454,7 +635,8 @@ func setProject (nid int) {
currproject.name = prname
currproject.first = first
currproject.last = last
- currproject.finish = finish != 0
+ currproject.finished = finish
+ //currproject.finish = finish != 0
currproject.customer = custo
updateProject(uid)
} else {
@@ -742,6 +924,17 @@ func editProject(id int) {
fmt.Println("...Project",id,"Updated")
}
+func isBill(id int) bool {
+
+ rows,err := db.Query("SELECT * FROM bills WHERE id = $1",id)
+ checkErr(err)
+ defer rows.Close()
+ if rows.Next() {
+ return true
+ } else {
+ return false
+ }
+}
func isTask(id int) bool {
rows,err := db.Query("SELECT * FROM timetable WHERE id = $1",id)
@@ -821,6 +1014,25 @@ func isSure() bool {
}
}
+func isElement(some int, group []int) (bool) {
+ for _,e := range group {
+ if e == some {
+ return true
+ }
+ }
+ return false
+}
+
+func removeItems(master, rem []int) ([]int) {
+ var out []int
+ for _,v := range master {
+ if !isElement(v,rem) {
+ out = append(out,v)
+ }
+ }
+ return out
+}
+
func checkErr(err error) {
if err != nil {
panic(err)