summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolaus Gotsche <n@softwarefools.com>2018-10-26 15:36:21 +0200
committerNikolaus Gotsche <n@softwarefools.com>2018-10-26 15:36:21 +0200
commit3fb09744cc5264fdf3740364a9c6f6f5b64707cc (patch)
treeca3a8a716a163783febd1859fe37f9217331a79e
parentd06db7af6014e8498672899218a05adf36ab1aa3 (diff)
Export tested, structs made Public0.3.4
-rw-r--r--importexport.go44
-rw-r--r--interact.go42
-rwxr-xr-xmakefile1
-rw-r--r--sqlite.go311
-rw-r--r--texify.go8
5 files changed, 263 insertions, 143 deletions
diff --git a/importexport.go b/importexport.go
new file mode 100644
index 0000000..471a022
--- /dev/null
+++ b/importexport.go
@@ -0,0 +1,44 @@
+package main
+
+import (
+ "os"
+ "github.com/atotto/encoding/csv"
+ //"bufio"
+ //"encoding/csv"
+)
+
+func ExportTasks(in []Task,filename string) {
+ file ,err := os.Create(filename)
+ checkErr(err)
+ defer file.Close()
+
+ w := csv.NewWriter(file)
+ defer w.Flush()
+ for _,i := range in {
+ w.WriteStruct(i)
+ }
+}
+
+func ExportProjects(in []Project,filename string) {
+ file ,err := os.Create(filename)
+ checkErr(err)
+ defer file.Close()
+
+ w := csv.NewWriter(file)
+ defer w.Flush()
+ for _,i := range in {
+ w.WriteStruct(i)
+ }
+}
+
+func ExportCustomers(in []Customer,filename string) {
+ file ,err := os.Create(filename)
+ checkErr(err)
+ defer file.Close()
+
+ w := csv.NewWriter(file)
+ defer w.Flush()
+ for _,i := range in {
+ w.WriteStruct(i)
+ }
+}
diff --git a/interact.go b/interact.go
index 06892ed..bc20f2b 100644
--- a/interact.go
+++ b/interact.go
@@ -89,8 +89,8 @@ func interact(fulldb bool) {
Closes the current task 'now' and remember it to continue later.
The User is not asked to enter a comment.`,
Func: func(c *ishell.Context) {
- if opentask.id > 0 {
- setPauseTask(opentask.id)
+ if opentask.Id > 0 {
+ setPauseTask(opentask.Id)
c.Println("Pausing Task", pausetask)
}
closeTask(false)
@@ -212,7 +212,7 @@ func interact(fulldb bool) {
c.Println(boldRed(arg, "is not a valid id!"))
}
} else {
- tids := getTaskIds()
+ tids := GetTaskIds()
selids, lids := GetTaskList(tids, false,false)
choice := c.MultiChoice(lids, "Select a Task to Edit")
if choice > -1 {
@@ -243,7 +243,7 @@ func interact(fulldb bool) {
c.Println(boldRed(arg, "is not a valid id!"))
}
} else {
- pids := getProjectIds()
+ pids := GetProjectIds()
selids, lids := getProjectList(pids)
choice := c.MultiChoice(lids, "Select a Project to Edit")
if choice > -1 {
@@ -274,7 +274,7 @@ func interact(fulldb bool) {
c.Println(boldRed(arg, "is not a valid id!"))
}
} else {
- tids := getTaskIds()
+ tids := GetTaskIds()
selids, lids := GetTaskList(tids, false,false)
choice := c.MultiChoice(lids, "Select a Task to Edit")
//c.Println(tids)
@@ -308,7 +308,7 @@ func interact(fulldb bool) {
c.Println(boldRed(arg, "is not a valid id!"))
}
} else {
- pids := getProjectIds()
+ pids := GetProjectIds()
selids, lids := getProjectList(pids)
choice := c.MultiChoice(lids, "Select a Project to Edit")
//c.Println(pids)
@@ -501,12 +501,22 @@ func interact(fulldb bool) {
Func: func(c *ishell.Context) {
//multichoice("Geh scheissn")
- nm,st := GetTaskSums(currproject.id)
+ nm,st := GetTaskSums(currproject.Id)
i := Multichoice("Sicha?",st)
fmt.Println(nm[i])
- //some := []string{"Nice","Shit this","is. Truly","Man"}
- //out := getInterAutoInput("Got milk?",some)
- //fmt.Println(out)
+ prid := GetProjectIds()
+ cuid := GetCustomerIds()
+ taid := GetTaskIds()
+ prs := GetSelectedProjects(prid)
+ cus := GetSelectedCustomers(cuid)
+ tas := GetSelectedTasks(taid)
+ c.Println("Tasks:",len(tas))
+ c.Println("Projects:",len(prs))
+ c.Println("Customers:",len(cus))
+
+ ExportCustomers(cus,"export.customers")
+ ExportProjects(prs,"export.projects")
+ ExportTasks(tas,"export.tasks")
},
})
@@ -589,10 +599,10 @@ func interact(fulldb bool) {
count, hours, dur := AnalyzeTasks(seltasks)
//c.Printf("%v Tasks Selected. Totaling %.2f (h) - Dates: %s\n",count,hours,dur)
- proj, cust := getProject(billprojid)
+ proj, cust := GetProject(billprojid)
// IF CUSTOMER 0 NO BILL CAN BE CREATED
- if cust.id == 0 {
- c.Println(boldRed("Customer ", cust.company, " with id ", cust.id, " Cannot be billed. Please move ", proj.name, " to a valid Customer"))
+ if cust.Id == 0 {
+ c.Println(boldRed("Customer ", cust.Company, " with id ", cust.Id, " Cannot be billed. Please move ", proj.Name, " to a valid Customer"))
return
}
@@ -607,7 +617,7 @@ func interact(fulldb bool) {
c.ShowPrompt(false)
//fullbillinfo := fmt.Sprintf("For: %s - %s - %.2f(€/h) - Invoice: %s Id:%v\nProject: %s - Id:%v\n%v Tasks Selected. Totaling %.2f (h) - Dates: %s\nProjected Income: %.2f(€)\n",cust.company,cust.name,cust.satz,billident,billid,proj.name,proj.id,count,hours,dur,hours*cust.satz)
- fullbillinfo := fmt.Sprintf("For: %s - %s - %.2f(€/h) \nProject: %s - Id:%v\n%v Tasks Selected. Totaling %.2f (h) - Dates: %s\nProjected Income: %.2f(€)\n", cust.company, cust.name, cust.satz, proj.name, proj.id, count, hours, dur, hours*cust.satz)
+ fullbillinfo := fmt.Sprintf("For: %s - %s - %.2f(€/h) \nProject: %s - Id:%v\n%v Tasks Selected. Totaling %.2f (h) - Dates: %s\nProjected Income: %.2f(€)\n", cust.Company, cust.Name, cust.Satz, proj.Name, proj.Id, count, hours, dur, hours*cust.Satz)
sep := "-------------------------\n"
restinfo := "Here some Info about the rest"
restids := selids
@@ -660,7 +670,7 @@ func interact(fulldb bool) {
}
}
c.Printf("%T %v - %T %v\n", tsk, tsk, hrf, hrf)
- allitems = append(allitems, billitem{tsk, itdur, hrf, Round(hrf*cust.satz, 5)})
+ allitems = append(allitems, billitem{tsk, itdur, hrf, Round(hrf*cust.Satz, 5)})
c.Print("<<Continue>>")
c.ReadLine()
//c.ShowPrompt(true)
@@ -668,7 +678,7 @@ func interact(fulldb bool) {
}
billid, billident := newBill(billprojid)
//c.Println(green("Bill Completed"))
- fullbill := bill{billid, billident, dur, proj.id, proj.name, time.Time{}, time.Time{}, allitems}
+ fullbill := bill{billid, billident, dur, proj.Id, proj.Name, time.Time{}, time.Time{}, allitems}
saveBill(fullbill)
checkTasks(selids, billid)
c.ProgressBar().Indeterminate(true)
diff --git a/makefile b/makefile
index b9cc10b..8ec4e55 100755
--- a/makefile
+++ b/makefile
@@ -25,6 +25,7 @@ fetch_stuff:
@go get github.com/BurntSushi/toml
@go get github.com/atrox/homedir
@go get github.com/pborman/getopt/v2
+ @go get github.com/atotto/encoding/csv
@mkdir -p outpdf
@mkdir -p outtex
@echo "All nessecary libaries installed"
diff --git a/sqlite.go b/sqlite.go
index 68ce3f1..2746ebe 100644
--- a/sqlite.go
+++ b/sqlite.go
@@ -15,33 +15,36 @@ import (
_ "github.com/mattn/go-sqlite3"
)
-type project struct {
- id int
- name string
- comment string
- first time.Time
- last time.Time
- finished int // id of last paid bill
- customer int
-}
-
-type task struct {
- id int
- projectid int
- start time.Time
- stop time.Time
- taskname string
- comment string
- checkout int // id of bill
-}
-
-type customer struct {
- id int
- company string
- name string
- address string
- satz float64
- lastbill time.Time // Last time a bill was paid
+// Datatype of SQL projects table
+type Project struct {
+ Id int
+ Name string
+ Comment string
+ First time.Time
+ Last time.Time
+ Finished int // id of last paid bill
+ Customer int
+}
+
+// Datatype of SQL timetable table
+type Task struct {
+ Id int
+ Projectid int
+ Start time.Time
+ Stop time.Time
+ Taskname string
+ Comment string
+ Checkout int // id of bill
+}
+
+// Datatype of SQL customer table
+type Customer struct {
+ Id int
+ Company string
+ Name string
+ Address string
+ Satz float64
+ Lastbill time.Time // Last time a bill was paid
}
type billitem struct {
@@ -64,8 +67,8 @@ type bill struct {
var db *sql.DB
var err error
-var currproject project
-var opentask task
+var currproject Project
+var opentask Task
var pausetask int
// Database Operations
@@ -200,7 +203,7 @@ func newTaskTime(tim string) {
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
fmt.Println(frame(boldGreen("Starting Task at ", tim),true))
bonus := ""
- if opentask.id == 0 {
+ if opentask.Id == 0 {
timstr := "1791-09-30 19:07"
//zone, _ := time.Now().Zone()
if isDateTime(tim) {
@@ -221,22 +224,22 @@ func newTaskTime(tim string) {
fmt.Println(nli+timstr)
task := getInterInput(sli+"Specify Task: ")
if task == "" {
- nm,st := GetTaskSums(currproject.id)
+ nm,st := GetTaskSums(currproject.Id)
ch := Multichoice("What Task should be Started at "+timstr+"?",st)
task = nm[ch]
bonus = line("xxx",true)
}
//if proj == 0 {
- _, err = stmt.Exec(currproject.id, timstr, task, 0)
+ _, err = stmt.Exec(currproject.Id, timstr, task, 0)
//} else {
// _, err = stmt.Exec(proj, timstr, task, 0)
//}
checkErr(err)
- fmt.Println(bonus+nli+"...new task inserted into", currproject.name, ": ", task)
+ fmt.Println(bonus+nli+"...new task inserted into", currproject.Name, ": ", task)
fmt.Println(bonus+frame(posR(),false))
getOpenTask()
- updateProject(currproject.id)
+ updateProject(currproject.Id)
} else {
fmt.Println(nli+boldRed("Another Task is already Open"))
//fmt.Println(frame("Close Task First",false))
@@ -255,7 +258,7 @@ func newTask(resume bool) {
}else{
fmt.Println(frame(boldGreen("Starting Task Now"),true))
}
- if opentask.id > 0 {
+ if opentask.Id > 0 {
fmt.Println(nli+boldRed("Another Task is already Open"))
//showOpenTask()
fmt.Println(frame(negR(),false))
@@ -265,7 +268,7 @@ func newTask(resume bool) {
if pausetask == 0 {
fmt.Println(nli+boldRed("No Task was Paused"))
if isInterSure(nli+"Resume older task?"){
- nm,st := GetTaskSums(currproject.id)
+ nm,st := GetTaskSums(currproject.Id)
ch := Multichoice("What Task should be resumed?",st)
task = nm[ch]
bonus = line("xxx",true)
@@ -277,15 +280,15 @@ func newTask(resume bool) {
idx := []int{pausetask}
tsks := GetSelectedTasks(idx)
fulltask := tsks[0]
- fmt.Println(nli+"Resuming Task ", pausetask, " - ", fulltask.taskname)
+ fmt.Println(nli+"Resuming Task ", pausetask, " - ", fulltask.Taskname)
//fmt.Println()
- task = fulltask.taskname
+ task = fulltask.Taskname
}
} else {
//fmt.Println(boldGreen("Starting new Task"))
task = getInterInput(sli+"Specify Task: ")
if task == "" {
- nm,st := GetTaskSums(currproject.id)
+ nm,st := GetTaskSums(currproject.Id)
ch := Multichoice("What Task should be restarted?",st)
task = nm[ch]
bonus = line("xxx",true)
@@ -293,14 +296,14 @@ func newTask(resume bool) {
}
stmt, err := db.Prepare("INSERT INTO timetable(project, task, checkout) values(?, ?, ?)")
checkErr(err)
- _, err = stmt.Exec(currproject.id, task, 0)
+ _, err = stmt.Exec(currproject.Id, task, 0)
checkErr(err)
if !resume {
- fmt.Println(bonus+nli+"...New Task inserted into", currproject.name, ": ", task)
+ fmt.Println(bonus+nli+"...New Task inserted into", currproject.Name, ": ", task)
}
fmt.Println(bonus+frame(posR(),false))
getOpenTask()
- updateProject(currproject.id)
+ updateProject(currproject.Id)
}
func newBill(proj int) (int, string) {
@@ -437,12 +440,12 @@ func closeTaskTime(tim string) {
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
//fmt.Println(boldGreen("Stoping Task ", opentask.id, ":", opentask.taskname))
fmt.Println(frame(boldGreen("Stoping Task"),true))
- if opentask.id == 0 {
+ if opentask.Id == 0 {
fmt.Println(nli+boldRed("There is no Open Task"))
fmt.Println(frame(negR(),false))
return
}else{
- fmt.Println(nli,"ID ",opentask.id, ":", opentask.taskname)
+ fmt.Println(nli,"ID ",opentask.Id, ":", opentask.Taskname)
}
//timt,err := time.Parse("2006-01-02 15:04",tim)
timst, timstr := "1791-09-30 19:07", "1791-09-30 19:07"
@@ -464,19 +467,19 @@ func closeTaskTime(tim string) {
checkErr(err)
//fmt.Println(timst,timt,opentask.start)
- if timt.After(opentask.start) {
+ if timt.After(opentask.Start) {
//timstr := timt.UTC().Format("2006-01-02 15:04")
com := ""
if isInterSure(sli+"Do You Want to enter a Comment?") {
com = getInterMultiInput(nli+"Comment:")
}
- fmt.Println(nli,"...Closing Task", opentask.id, "at", timst)
+ fmt.Println(nli,"...Closing Task", opentask.Id, "at", timst)
stmt, err := db.Prepare("UPDATE timetable SET stop = datetime(?,'utc'), comment = ? WHERE id = ?")
checkErr(err)
- _, err = stmt.Exec(timstr, com, opentask.id)
+ _, err = stmt.Exec(timstr, com, opentask.Id)
checkErr(err)
- opentask.id = 0
- updateProject(opentask.projectid)
+ opentask.Id = 0
+ updateProject(opentask.Projectid)
fmt.Println(frame(posR(),false))
} else {
fmt.Println(nli,boldRed("Cannot Stop before the Beginning!"))
@@ -491,34 +494,34 @@ func closeTask(loud bool) {
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
if loud {
fmt.Println(frame(boldGreen("Stoping Task"),true))
- if opentask.id == 0 {
+ if opentask.Id == 0 {
fmt.Println(nli,boldRed("There is no Open Task"))
fmt.Println(frame(negR(),false))
return
}else{
- fmt.Println(nli,"ID ",opentask.id, ":", opentask.taskname)
+ fmt.Println(nli,"ID ",opentask.Id, ":", opentask.Taskname)
}
//fmt.Println(boldGreen("Stoping Task ", opentask.id, ":", opentask.taskname))
}else{
- if opentask.id == 0 {
+ if opentask.Id == 0 {
fmt.Println(boldRed("There is no Open Task"))
}
}
- if time.Now().After(opentask.start.Local()) {
+ if time.Now().After(opentask.Start.Local()) {
com := ""
if loud {
if isInterSure(sli+"Do You Want to enter a Comment?") {
com = getInterMultiInput(nli+"Comment:")
}
- fmt.Println(nli+"...Closing Task", opentask.id)
+ fmt.Println(nli+"...Closing Task", opentask.Id)
fmt.Println(frame(posR(),false))
}
stmt, err := db.Prepare("UPDATE timetable SET stop = datetime('now'), comment = ? WHERE id = ?")
checkErr(err)
- _, err = stmt.Exec(com, opentask.id)
+ _, err = stmt.Exec(com, opentask.Id)
checkErr(err)
- opentask.id = 0
- updateProject(opentask.projectid)
+ opentask.Id = 0
+ updateProject(opentask.Projectid)
} else {
if loud {
fmt.Println(nli,boldRed("Cannot Stop before the Beginning!"))
@@ -692,7 +695,9 @@ func checkCustomerProjects(in []int) (multicust, multiproj bool, projid []int) {
return
}
-func getProject(id int) (outpr project, outcu customer) {
+// return a project and a customer struct that corresponds
+// to a project id.
+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
@@ -702,13 +707,13 @@ func getProject(id int) (outpr project, outcu customer) {
for rows.Next() {
err = rows.Scan(&pid, &name, &comm, &first, &last, &finished, &customer)
checkErr(err)
- outpr.id = pid
- outpr.name = name
- outpr.comment = comm
- outpr.first = first
- outpr.last = last
- outpr.finished = finished
- outpr.customer = customer
+ outpr.Id = pid
+ outpr.Name = name
+ outpr.Comment = comm
+ outpr.First = first
+ outpr.Last = last
+ outpr.Finished = finished
+ outpr.Customer = customer
}
row, err := db.Query("SELECT * FROM customers WHERE id = ?", customer)
checkErr(err)
@@ -720,18 +725,56 @@ func getProject(id int) (outpr project, outcu customer) {
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
+ outcu.Id = cid
+ outcu.Company = comp
+ outcu.Name = cuname
+ outcu.Address = addy
+ outcu.Satz = satz
+ outcu.Lastbill = lastb
+ }
+ return
+}
+// Return the []customers corresponding to an []int of customer ids
+func GetSelectedCustomers(in []int) (out []Customer) {
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in), " ", " , ", -1), "[]")
+ que := fmt.Sprintf("SELECT * FROM customers WHERE id IN (%s)", ins)
+ rows, err := db.Query(que)
+ checkErr(err)
+
+ var id int
+ var rat float64
+ var last time.Time
+ var nam, com, add string
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&id, &com, &nam, &add, &rat, &last)
+ out = append(out, Customer{id,com,nam,add,rat,last})
+ }
+ return
+}
+
+// Return the []projects corresponding to an []int of project ids
+func GetSelectedProjects(in []int) (out []Project) {
+ ins := strings.Trim(strings.Replace(fmt.Sprint(in), " ", " , ", -1), "[]")
+ que := fmt.Sprintf("SELECT * FROM projects WHERE id IN (%s)", ins)
+ rows, err := db.Query(que)
+ checkErr(err)
+
+ var id,fin, cust int
+ var first, last time.Time
+ var nam, com string
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&id, &nam, &com, &first, &last, &fin, &cust)
+ out = append(out, Project{id,nam,com,first,last,fin,cust})
}
return
}
-// Return the []tasks correspintding to an []int of task ids
-func GetSelectedTasks(in []int) (outtask []task) {
+// Return the []tasks corresponding to an []int of task ids
+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)
@@ -744,27 +787,27 @@ func GetSelectedTasks(in []int) (outtask []task) {
defer rows.Close()
for rows.Next() {
err = rows.Scan(&id, &project, &start, &stop, &tsk, &com, &checkout)
- outtask = append(outtask, task{id, project, start, stop, tsk, com, checkout})
+ outtask = append(outtask, Task{id, project, start, stop, tsk, com, checkout})
}
return
}
-
-//Return sum of Hours and Dateranges
-func AnalyzeTasks(in []task) (count int, hours float64, duration string) {
+// Loop through all Tasks in a Slice and
+// Return count, sum of Hours and Dateranges
+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
+ lstart = t.Start
+ hstop = t.Stop
}
count++
- dur := float64(t.stop.Sub(t.start)) / (1000000000 * 60 * 60)
+ dur := float64(t.Stop.Sub(t.Start)) / (1000000000 * 60 * 60)
hours = hours + dur
- if lstart.After(t.start) {
- lstart = t.start
+ if lstart.After(t.Start) {
+ lstart = t.Start
}
- if hstop.Before(t.stop) {
- hstop = t.stop
+ if hstop.Before(t.Stop) {
+ hstop = t.Stop
}
//txt := fmt.Sprintf("%s - (%v) - %.2f h",task, durstr, dur)
}
@@ -794,6 +837,7 @@ func getProjectList(in []int) ([]int, []string) {
}
return outids, outstr
}
+
// Returns two Lists of Task ids and corresponding strings for Multichoice selection.
// Depending on showcust the name of the customer will be displayed too
// Depending on exclude Tasks of project 0 will be in the Return Lists
@@ -811,9 +855,9 @@ func GetTaskList(in []int, showcust,exclude bool) ([]int, []string) {
//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")
- if exclude {
+/* if exclude {
rows, err = db.Query("SELECT id, project, start, stop, task FROM timetable WHERE stop != '1791-09-30 19:07' AND checkout = 0 AND project != 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)
//}
@@ -825,8 +869,8 @@ func GetTaskList(in []int, showcust,exclude bool) ([]int, []string) {
for rows.Next() {
err = rows.Scan(&id, &project, &start, &stop, &task)
checkErr(err)
+ pr, cu := getProjectName(project)
if project != lastpr {
- pr, cu := getProjectName(project)
if showcust {
pre = fmt.Sprintf("%v| %v: ", cu, pr)
} else {
@@ -842,12 +886,16 @@ func GetTaskList(in []int, showcust,exclude bool) ([]int, []string) {
durstr := fmt.Sprintf("%v - %v", start.Local().Format("Mon Jan _2 2006 15:04"), stop.Local().Format("15:04"))
txt := fmt.Sprintf("%s - (%v) - %.2f h", task, durstr, dur)
- outids = append(outids, id)
- outstr = append(outstr, fmt.Sprintf("%s%s", pre, txt))
+ if !(exclude && cu == "No one") {
+ outids = append(outids, id)
+ outstr = append(outstr, fmt.Sprintf("%s%s", pre, txt))
+ }
}
return outids, outstr
}
-func getProjectIds() []int {
+
+// Returns slice of ids of all Projects except Project 0
+func GetProjectIds() []int {
var ids []int
rows, err := db.Query("SELECT id FROM projects WHERE id != 0") // ORDER BY id DESC")
checkErr(err)
@@ -862,7 +910,24 @@ func getProjectIds() []int {
return ids
}
-func getTaskIds() []int {
+// Returns slice of ids of all Customers except Customer 0
+func GetCustomerIds() []int {
+ var ids []int
+ rows, err := db.Query("SELECT id FROM customers WHERE id != 0") // ORDER BY id DESC")
+ checkErr(err)
+ var id int
+
+ defer rows.Close()
+ for rows.Next() {
+ err = rows.Scan(&id)
+ checkErr(err)
+ ids = append(ids, id)
+ }
+ return ids
+}
+
+// Returns Slice of All Task ids except open ones
+func GetTaskIds() []int {
var ids []int
rows, err := db.Query("SELECT id FROM timetable WHERE stop != '1791-09-30 19:07'") // ORDER BY id DESC")
checkErr(err)
@@ -928,11 +993,11 @@ func getOpenTask() {
//fmt.Println(id, "Open Task:", task, project, start)
}
//rows.Close() //good habit to close
- opentask.id = id
- opentask.projectid = project
- opentask.start = start
- opentask.taskname = task
- opentask.checkout = checkout
+ opentask.Id = id
+ opentask.Projectid = project
+ opentask.Start = start
+ opentask.Taskname = task
+ opentask.Checkout = checkout
//opentask.checkout = checkout != 0
}
@@ -970,14 +1035,14 @@ func showStatus(full bool) {
// Get all Tasks of the current Project and display them with simmilar name
func ShowProjectSum() {
- _,st := GetTaskSums(currproject.id)
+ _,st := GetTaskSums(currproject.Id)
fmt.Println(sub("Tasks"))
fmt.Println(StrLines(st,nli))
fmt.Println(sub(""))
}
func showCurrentTask() {
- if opentask.id == 0 {
+ if opentask.Id == 0 {
if pausetask > 0 {
//fmt.Printf("___Task %v Paused___________\n", pausetask)
st := fmt.Sprintf("Task %v Paused", pausetask)
@@ -989,10 +1054,10 @@ func showCurrentTask() {
} else {
//fmt.Println("___Open Task________________")
fmt.Println(sub("Open Task"))
- dur := float64(time.Now().Sub(opentask.start)) / (1000000000 * 60 * 60)
+ dur := float64(time.Now().Sub(opentask.Start)) / (1000000000 * 60 * 60)
//fmt.Printf(" %v: %v - (%v) - %.2f h\n", opentask.id, opentask.taskname, opentask.start.Local().Format("Mon Jan _2 2006 15:04"), dur)
//fmt.Println(opentask.id,":", opentask.taskname,"-", opentask.start.Local().Format("Mon Jan _2 2006 15:04"),dur,"h")
- fmt.Printf("%s %v: %v - (%v) - %.2f h\n", nli, opentask.id, opentask.taskname, opentask.start.Local().Format("Mon Jan _2 2006 15:04"), dur)
+ fmt.Printf("%s %v: %v - (%v) - %.2f h\n", nli, opentask.Id, opentask.Taskname, opentask.Start.Local().Format("Mon Jan _2 2006 15:04"), dur)
fmt.Println(frame("",false))
}
}
@@ -1003,8 +1068,8 @@ func showOpenProject(alone bool) {
if alone {
fmt.Println(frame(boldGreen("Current Project"),true))
}
- fmt.Println(nli,currproject.id, ":", currproject.name, "- Started:", currproject.first.Local().Format("Mon _2 Jan 2006"))
- fmt.Println(nli," Last Changes", currproject.last.Local().Format("2006 Mon Jan _2 15:04"))
+ fmt.Println(nli,currproject.Id, ":", currproject.Name, "- Started:", currproject.First.Local().Format("Mon _2 Jan 2006"))
+ fmt.Println(nli," Last Changes", currproject.Last.Local().Format("2006 Mon Jan _2 15:04"))
//fmt.Println(frame("Current Project",true))
}
@@ -1039,7 +1104,7 @@ func newProject() {
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc()
fmt.Println(frame(boldGreen("Creating new Project"),true))
- if opentask.id > 0 {
+ if opentask.Id > 0 {
fmt.Println(nli,boldRed("There is an Open Task"))
fmt.Println(frame(negR(),false))
//showOpenTask()
@@ -1077,13 +1142,13 @@ func newProject() {
}
func getClosedTasks(num int) {
- rows, err := db.Query("SELECT * FROM timetable WHERE stop != '1791-09-30 19:07' ORDER BY datetime(start)", currproject.id)
+ rows, err := db.Query("SELECT * FROM timetable WHERE stop != '1791-09-30 19:07' ORDER BY datetime(start)", currproject.Id)
checkErr(err)
if num > 0 {
- rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout > 0 AND stop != '1791-09-30 19:07' ORDER BY datetime(start) DESC LIMIT $2", currproject.id, num)
+ rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout > 0 AND stop != '1791-09-30 19:07' ORDER BY datetime(start) DESC LIMIT $2", currproject.Id, num)
checkErr(err)
} else {
- rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout > 0 AND stop != '1791-09-30 19:07' ORDER BY datetime(start)", currproject.id)
+ rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout > 0 AND stop != '1791-09-30 19:07' ORDER BY datetime(start)", currproject.Id)
checkErr(err)
}
var id, proj, check int
@@ -1118,10 +1183,10 @@ func getClosedTasks(num int) {
rows.Close()
if num > 0 {
- rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout = 0 AND stop != '1791-09-30 19:07'ORDER BY datetime(start) DESC LIMIT $2", currproject.id, num)
+ rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout = 0 AND stop != '1791-09-30 19:07'ORDER BY datetime(start) DESC LIMIT $2", currproject.Id, num)
checkErr(err)
} else {
- rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout = 0 AND stop != '1791-09-30 19:07'ORDER BY datetime(start)", currproject.id)
+ rows, err = db.Query("SELECT * FROM timetable WHERE project = $1 AND checkout = 0 AND stop != '1791-09-30 19:07'ORDER BY datetime(start)", currproject.Id)
checkErr(err)
}
sum2 := 0.0
@@ -1178,14 +1243,14 @@ func getLastProject() {
}
rows.Close() //good habit to close
- currproject.id = nuid
- currproject.name = nprname
- currproject.comment = nprcom
- currproject.first = nfirst
- currproject.last = nlast
- currproject.finished = nfinish
+ currproject.Id = nuid
+ currproject.Name = nprname
+ currproject.Comment = nprcom
+ currproject.First = nfirst
+ currproject.Last = nlast
+ currproject.Finished = nfinish
//currproject.finish = nfinish != 0
- currproject.customer = ncustom
+ currproject.Customer = ncustom
}
@@ -1193,7 +1258,7 @@ func setProject(nid int) {
boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc()
boldRed := color.New(color.FgRed, color.Bold).SprintFunc()
fmt.Println(frame(boldGreen("Opening Project ", nid),true))
- if opentask.id > 0 {
+ if opentask.Id > 0 {
fmt.Println(nli,boldRed("There is an Open Task"))
//fmt.Println(frame("",false))
showCurrentTask()
@@ -1227,14 +1292,14 @@ func setProject(nid int) {
checkErr(err)
}
rows.Close() //good habit to close
- currproject.id = uid
- currproject.name = prname
- currproject.comment = comm
- currproject.first = first
- currproject.last = last
- currproject.finished = finish
+ currproject.Id = uid
+ currproject.Name = prname
+ currproject.Comment = comm
+ currproject.First = first
+ currproject.Last = last
+ currproject.Finished = finish
//currproject.finish = finish != 0
- currproject.customer = custo
+ currproject.Customer = custo
updateProject(uid)
showOpenProject(false)
diff --git a/texify.go b/texify.go
index ffa0fba..99a7261 100644
--- a/texify.go
+++ b/texify.go
@@ -52,10 +52,10 @@ type Data struct {
Bic string
}
-func billTemplate(billdata bill, cust customer) Filenames {
+func billTemplate(billdata bill, cust Customer) Filenames {
billid := billdata.id
custr, cuzip, cucity, cucou := "", "", "", ""
- addr := String2StringArray(cust.address, ";")
+ addr := String2StringArray(cust.Address, ";")
for i, a := range addr {
switch i {
case 0:
@@ -75,8 +75,8 @@ func billTemplate(billdata bill, cust customer) Filenames {
billdata.identity,
billdata.projectname,
- cust.company,
- cust.name,
+ cust.Company,
+ cust.Name,
custr,
cuzip,
cucity,