diff options
| author | Nikolaus Gotsche <n@softwarefools.com> | 2018-08-29 04:27:16 +0200 |
|---|---|---|
| committer | Nikolaus Gotsche <n@softwarefools.com> | 2018-08-29 04:27:16 +0200 |
| commit | ad7b23c17dbe05e7e6a4ad3ea023f692f832a938 (patch) | |
| tree | 0832c6fa8e8be7a66a59e371222aab19c3a2bf5d | |
| parent | ed43a6d9c450483914281e5fc3b6877116fc6ad0 (diff) | |
LaTeX templating and bills begin
| -rw-r--r-- | interact.go | 43 | ||||
| -rw-r--r-- | main.go | 8 | ||||
| -rw-r--r-- | sqlite.go | 143 | ||||
| -rw-r--r-- | texify.go | 84 |
4 files changed, 250 insertions, 28 deletions
diff --git a/interact.go b/interact.go index 8e25c97..55dcabb 100644 --- a/interact.go +++ b/interact.go @@ -158,6 +158,30 @@ func interact() { }) shell.AddCmd(&ishell.Cmd{ + Name: "editcustomer", + Help: "<id> Edit the Customer of the following id", + Func: func(c *ishell.Context) { + //c.Print("\033[H\033[2J") + arg := "none" + if len(c.Args) > 0 { + arg = strings.Join(c.Args, " ") + argi,err := strconv.Atoi(arg) + if err == nil{ + //c.Println(boldGreen("Edit Project",argi)) + editCustomer(argi) + allCustomers() + //stdOut() + }else{ + c.Println(boldRed(arg,"is not a valid id!")) + } + }else{ + c.Println(boldRed("editcustomer <id> - Please enter an id")) + allCustomers() + } + }, + }) + + shell.AddCmd(&ishell.Cmd{ Name: "start", Help: "<DateTime> - Start Task at a specific Time 'YYYY-MM-DD HH:MM' Or 'HH:MM'", Func: func(c *ishell.Context) { @@ -252,6 +276,25 @@ func interact() { }, }) +// Gather Tasks For Bills + shell.AddCmd(&ishell.Cmd{ + Name: "bill", + Help: "Select Tasks to be billed", + Func: func(c *ishell.Context) { + ids,str := getUnfinishedList() + choices := c.Checklist(str, + "What Tasks do you want to bill ?", + nil) + out := func() (c []int) { + for _, v := range choices { + c = append(c, ids[v]) + } + return + } + c.Println("Your choices are",out() ) + }, + }) + shell.Run() // teardown @@ -14,7 +14,7 @@ import ( //var svar string var starttime,stoptime string -var projectid, edittaskid, editprojectid int +var projectid, edittaskid, editprojectid, editcustomerid int var deltask int var addcustomer bool var newproject, newtask, stoptask, allproj, runinter, test bool @@ -65,6 +65,10 @@ func init() { "editproject", 0, "Specify which project to edit") + flag.IntVar(&editcustomerid, + "editcustomer", + 0, + "Specify which customer to edit") flag.IntVar(&projectid, "project", 0, @@ -183,6 +187,8 @@ func main() { editTask(edittaskid) } else if (editprojectid>0) { editProject(editprojectid) + } else if (editcustomerid>0) { + editCustomer(editcustomerid) } else if (projectid>0) { setProject(projectid) stdOut() @@ -9,6 +9,7 @@ import ( "strings" "regexp" "strconv" + "unicode/utf8" _ "github.com/mattn/go-sqlite3" "github.com/fatih/color" @@ -37,6 +38,7 @@ var err error var currproject project var opentask task + func initDB(filename string) { if _, err := os.Stat(filename); os.IsNotExist(err) { db, err = sql.Open("sqlite3", filename) @@ -59,6 +61,7 @@ func initDB(filename string) { checkout INTEGER NOT NULL); CREATE TABLE customers( id INTEGER PRIMARY KEY AUTOINCREMENT, + company VARCHAR(240), name VARCHAR(240), address VARCHAR(240) DEFAULT 'None', satz REAL DEFAULT 1, @@ -66,16 +69,19 @@ func initDB(filename string) { CREATE TABLE bills( id INTEGER PRIMARY KEY AUTOINCREMENT, identity VARCHAR(240), + timerange VARCHAR(240), project INTEGER NOT NULL, tasks VARCHAR(240), - text VARCHAR(240), + times VARCHAR(240), + hours VARCHAR(240), + moneys VARCHAR(240), date TIMESTAMP DEFAULT '1791-09-30 19:07'); ` _, err = db.Exec(sqlstmt) checkErr(err) - stmt, err := db.Prepare("INSERT INTO customers(id, name) values(?, ?)") + stmt, err := db.Prepare("INSERT INTO customers(id,company,name) values(?, ?, ?)") checkErr(err) - _, err = stmt.Exec(0,"Annonymus") + _, err = stmt.Exec(0,"None","Annonymus") checkErr(err) }else{ db, err = sql.Open("sqlite3", filename) @@ -214,6 +220,66 @@ func updateProject(id int) { checkErr(err) } +func getCustomerName(id int) (cust string) { + rows, err := db.Query("SELECT company, name FROM customers WHERE id = ?",id) + checkErr(err) + var nam,com string + for rows.Next() { + err = rows.Scan(&com, &nam) + checkErr(err) + } + cust = fmt.Sprintf("%s: %s",com,nam) + return +} + +func getProjectName(id int) (pro string,cust string) { + rows, err := db.Query("SELECT name, customer FROM projects WHERE id = ?",id) + checkErr(err) + //rows, err := stmt.Exec(id) + //checkErr(err) + cid := 0 + for rows.Next() { + err = rows.Scan(&pro, &cid) + checkErr(err) + } + cust = getCustomerName(cid) + return +} + +func getUnfinishedList() ([]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") + var id,project int + var task string + var start,stop time.Time + + defer rows.Close() + for rows.Next() { + err = rows.Scan(&id, &project, &start, &stop, &task) + checkErr(err) + if project != lastpr { + pr,_ := getProjectName(project) + 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) + }else{ + pre = strings.Repeat(" ", prelen) + } + dur := float64(stop.Sub(start))/(1000000000*60*60) + 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)) + } + return outids,outstr +} + func getOpenTask() { rows,err := db.Query("SELECT id, project, start, task, checkout FROM timetable WHERE stop = '1791-09-30 19:07'") checkErr(err) @@ -256,17 +322,18 @@ func showLastProject() { } } func addCustomer() { + com := getInput("Enter Customer Company: ") nam := getInput("Enter Customer Name: ") - add := getInput("Enter Address (separate lines by ;): ") + add := getInput("Enter Address (separate lines by ; [Street;Zip;City]): ") satstr := getInput("Hourly Rate: ") sat,err := strconv.ParseFloat(satstr,64) checkErr(err) - stmt, err := db.Prepare("INSERT INTO customers(name, address, satz) values(?, ?, ?)") + stmt, err := db.Prepare("INSERT INTO customers(company, name, address, satz) values(?, ?, ?, ?)") checkErr(err) - _, err = stmt.Exec(nam,add,sat) + _, err = stmt.Exec(com,nam,add,sat) checkErr(err) - fmt.Println(" Customer Added:",nam, add, sat) + fmt.Println(" Customer Added:",com ,nam, add, sat) } func newProject() { @@ -398,9 +465,11 @@ func setProject (nid int) { func allCustomers() { rows,err := db.Query("SELECT * FROM customers") + //rows,err := db.Query("SELECT (id, company, name, address, satz, lastbill) FROM customers") checkErr(err) var uid int + var comp string var name string var addr string var satz float64 @@ -408,9 +477,9 @@ func allCustomers() { fmt.Println("___All Customers________________") for rows.Next() { - err = rows.Scan(&uid, &name, &addr, &satz, &last) + err = rows.Scan(&uid, &comp, &name, &addr, &satz, &last) checkErr(err) - fmt.Printf(" %v:%s, Rate:%.2f(€/h) , Last:%s\n",uid,name,satz,last.Local().Format("2006-01-02 15:04 MST")) + fmt.Printf(" %v:%s: %s, Rate:%.2f(€/h) , Last:%s\n",uid,comp,name,satz,last.Local().Format("2006-01-02 15:04 MST")) } } @@ -420,12 +489,13 @@ func allProjects() { checkErr(err) var cid int + var com string var nam string var adr string var sat float64 var lst time.Time for rows3.Next() { - err = rows3.Scan(&cid, &nam, &adr, &sat, &lst) + err = rows3.Scan(&cid, &com, &nam, &adr, &sat, &lst) checkErr(err) rows,err := db.Query("SELECT * FROM projects WHERE customer = $1",cid) @@ -439,7 +509,7 @@ func allProjects() { var customer int var start,stop time.Time - fmt.Println("____For",nam) + fmt.Println("____For",com,nam) for rows.Next() { err = rows.Scan(&uid, &prname, &first, &last, &finish, &customer) checkErr(err) @@ -490,6 +560,57 @@ func deleteTask(id int) { } } +func editCustomer(id int) { + boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc() + boldRed := color.New(color.FgRed, color.Bold).SprintFunc() + var comp,name,addr string + var satz float64 + rows,err := db.Query("SELECT company, name, address, satz FROM customers WHERE id = $1",id) + checkErr(err) + if rows.Next() { + err = rows.Scan(&comp, &name, &addr, &satz) + checkErr(err) + }else{ + fmt.Println(boldRed("There Is No Customer"),id) + return + //os.Exit(0) + } + rows.Close() //good habit to close + + fmt.Println(boldGreen("Edit Customer",id)) + fmt.Println("Old Company Name:",comp) + in := getInput("Enter New:") + if in!=""{ + comp=in + } + fmt.Println("Old Name:",name) + in = getInput("Enter New:") + if in!=""{ + name=in + } + fmt.Println("Old Adress:",addr) + in = getInput("Enter New:") + if in!=""{ + addr=in + } + fmt.Println("Old Hourly Rate:",satz) + for{ + satzstr := getInput("Enter New:") + if satzstr!=""{ + satz,err = strconv.ParseFloat(satzstr,64) + if err != nil { + fmt.Println(satzstr,boldRed("can not be Parsed as a Float."), "Try a shape of X.X") + //os.Exit(0) + }else{break} + }else{break} + } + stmt, err := db.Prepare("UPDATE customers SET company = ?, name = ?, address = ?, satz = ? WHERE id = ?") + checkErr(err) + _, err = stmt.Exec(comp,name,addr,satz,id) + checkErr(err) + fmt.Println("...Customer",id,"Updated") +} + func editTask(id int) { boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc() boldRed := color.New(color.FgRed, color.Bold).SprintFunc() @@ -5,35 +5,87 @@ import ( "text/template" ) -type Todo struct { - Name string - Adresse string - Number uint +type FeeItem struct{ + Task string + Timeframe string + Hours int + Price float64 +} + +type Data struct { + InvDate string + WorkDate string + InvNo string + ProjName string + CustComp string + CustName string + CustStr string + CustZip string + CustCity string + TaxID string + MyName string + MyStr string + MyZip string + MyCity string + MyTel string + MyMob string + MyMail string + MyUrl string + BankNum string + BankLZ string + BankName string + Iban string + Bic string } func tmpltest() { //Sampledata - td := Todo{"Jemand Wiadschosei", "123 Fakestreet 299",99} + dat := Data{"17.6.18", + "3.4.-7.6.18", + "HN 07/18", + "Testkopfstrasse 132", + "Somecompany", + "Jemand Wiadschosei", + "Fakestreet 123", + "6996", + "Busenhausen", + "6575-6544", + "Meinam Sauluschtig", + "Saubastrasse 86", + "1111", + "Nicetown", + "+43 (1) 655 555 23", + "+43 (0) 650 555 32", + "Meinam@sauluscht.ig", + "www.saulust.com", + "7272626272", + "20220", + "Might Bank Inc.", + "IB47 2382 4338 2822 1222", + "BICBICBIC"} + var inv []FeeItem + + inv = append(inv,FeeItem{"Modellierung Dachkonstruktion", "1.4.-27.4.18",13,325}) + inv = append(inv,FeeItem{"Dokument Vorbereitung", "9.4.-5.5.18",15,375}) + inv = append(inv,FeeItem{"Begehungen und Besprechungen", "1.4.-19.4.18",12,300}) + inv = append(inv,FeeItem{"Wichtig aussehen", "5.5.-5.5.18",2,50}) //Parse Templates tmpl, err := template.New("invoice").Delims("[[","]]").ParseGlob("templates/*.tex") checkErr(err) - //if err != nil { - // panic(err) - //} - //t, err := template.New("todos").Parse("You have a task named \"{{ .Name}}\" with description: \"{{ .Description}}\"") - //if err != nil { - // panic(err) - //} - //err = tmpl.Execute(os.Stdout, td) //Open File - f, err := os.Create("outtex/1_data.tex") + datf, err := os.Create("outtex/1_data.tex") checkErr(err) - defer f.Close() + invf, err := os.Create("outtex/1_invoice.tex") + checkErr(err) + defer datf.Close() + defer invf.Close() //Execute Template //err = tmpl.ExecuteTemplate(os.Stdout, "invoice.tex", td) - err = tmpl.ExecuteTemplate(f, "_data.tex", td) + err = tmpl.ExecuteTemplate(datf, "_data.tex", dat) + checkErr(err) + err = tmpl.ExecuteTemplate(invf, "_invoice.tex", inv) checkErr(err) } |
