diff options
| -rw-r--r-- | interact.go | 12 | ||||
| -rw-r--r-- | sqlite.go | 79 | ||||
| -rw-r--r-- | texify.go | 31 | ||||
| -rw-r--r-- | utils.go | 29 |
4 files changed, 140 insertions, 11 deletions
diff --git a/interact.go b/interact.go index 918b2a9..b494222 100644 --- a/interact.go +++ b/interact.go @@ -399,7 +399,7 @@ func interact() { }else{break} } c.Printf("%T %v - %T %v\n",tsk,tsk,hrf,hrf) - allitems = append(allitems,billitem{tsk,itdur,hrf,hrf*cust.satz}) + allitems = append(allitems,billitem{tsk,itdur,hrf,Round(hrf*cust.satz,5)}) c.Print("<<Continue>>") c.ReadLine() //c.ShowPrompt(true) @@ -408,11 +408,21 @@ func interact() { c.Println(green("Bill Completed")) fullbill := bill{billid,billident,dur,proj.id,proj.name,time.Time{},time.Time{},allitems} saveBill(fullbill) + checkTasks(selids,billid) + c.ProgressBar().Indeterminate(true) + c.ProgressBar().Start() testid := []int{billid} testbill := loadBills(testid) //c.Println(testbill[0].projectname,testbill[0].items) files := billTemplate(testbill[0],cust) c.Println(files) + err = runLatex(files.Main,testbill[0].identity) + c.ProgressBar().Stop() + if err== nil { + c.Println("Finished without Errors") + }else{ + c.Println("Finished with error:",err) + } c.Print("<<Continue>>") c.ReadLine() stdOut() @@ -183,7 +183,7 @@ func newBill(proj int) (int,string) { //boldRed := color.New(color.FgRed, color.Bold).SprintFunc() fmt.Println(boldGreen("Creating New Bill")) //Show 5 recent bills - + showLastBills(5) invno := getInput("Invoice Number: ") stmt, err := db.Prepare("INSERT INTO bills (identity, project, date) values(?, ?, datetime('now'))") checkErr(err) @@ -204,6 +204,28 @@ func saveBill(in bill) { checkErr(err) } +func showLastBills(count int) { + //boldRed := color.New(color.FgRed, color.Bold).SprintFunc() + rows, err := db.Query("SELECT * FROM bills ORDER BY date DESC LIMIT ?",count) + checkErr(err) + var id,proj int + var ident,timerange string + var date,paid time.Time + var taskstr,timestr,hourstr,moneystr string + defer rows.Close() + + //fmt.Println("___Open Task________________") + fmt.Printf("___Previous %v Bills________\n",count) + for rows.Next() { + err = rows.Scan(&id,&ident,&timerange,&proj,&taskstr,×tr,&hourstr,&moneystr,&paid,&date) + checkErr(err) + prn,_ := getProjectName(proj) + hsum := sumFloatArray(string2FloatArray(hourstr,";")) + msum := sumFloatArray(string2FloatArray(moneystr,";")) + fmt.Printf(" %s - %s (%v) %.1f[h]: %.2f[€]\n",ident,prn,date,hsum,msum) + } +} + func loadBills(in []int) (out []bill){ ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]") que := fmt.Sprintf("SELECT * FROM bills WHERE id IN (%s) ORDER BY project DESC",ins) @@ -225,6 +247,7 @@ func loadBills(in []int) (out []bill){ } return } + func strings2items(tasks, times, hours, moneys string) (out []billitem) { ta := string2StringArray(tasks,";") ti := string2StringArray(times,";") @@ -277,7 +300,7 @@ func closeTaskTime(tim string) { } timt,err := time.Parse("2006-01-02 15:04 MST",timst) checkErr(err) - + //fmt.Println(timst,timt,opentask.start) if (timt.After(opentask.start)) { //timstr := timt.UTC().Format("2006-01-02 15:04") @@ -315,6 +338,26 @@ func closeTask() { } } +func checkTasks(in []int,billid int) { + ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]") + que := fmt.Sprintf("UPDATE timetable SET checkout = ? WHERE id IN (%s)",ins) + //rows,err := db.Query(que) + stmt, err := db.Prepare(que) + checkErr(err) + _, err = stmt.Exec(billid) + checkErr(err) +} + +func uncheckTasks(in []int) { + ins := strings.Trim(strings.Replace(fmt.Sprint(in)," "," , ",-1),"[]") + que := fmt.Sprintf("UPDATE timetable SET checkout = ? WHERE id IN (%s)",ins) + //rows,err := db.Query(que) + stmt, err := db.Prepare(que) + checkErr(err) + _, err = stmt.Exec(0) + checkErr(err) +} + func updateProject(id int) { stmt, err := db.Prepare("UPDATE projects SET last = datetime('now') WHERE id = ?") checkErr(err) @@ -581,7 +624,7 @@ func showLastProject() { func addCustomer() { com := getInput("Enter Customer Company: ") nam := getInput("Enter Customer Name: ") - add := getInput("Enter Address (separate lines by ; [Street;Zip;City]): ") + add := getInput("Enter Address (separate lines by ; [Street;Zip;City;Country]): ") satstr := getInput("Hourly Rate: ") sat,err := strconv.ParseFloat(satstr,64) checkErr(err) @@ -621,14 +664,14 @@ func newProject() { } func getClosedTasks(num int) { - fmt.Println("___Past Tasks_______________") + fmt.Println("___Billed Tasks_______________") 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 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 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 @@ -646,8 +689,28 @@ func getClosedTasks(num int) { sum += dur } rows.Close() + fmt.Printf("Billed: %.2f h\n",sum) + fmt.Println("___Past Tasks_______________") + + 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) + 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) + checkErr(err) + } + sum2 := 0.0 + for rows.Next() { + err = rows.Scan(&id, &proj, &sta, &sto, &tas, &check) + checkErr(err) + dur = float64(sto.Sub(sta))/(1000000000*60*60) + fmt.Printf("%v: %v (%v-%v) - %.2f h\n",id,tas,sta.Local().Format("2006 Mon Jan _2 15:04"),sto.Local().Format("15:04"),dur) + //fmt.Println(id,tas,sta.Local().Format("2006 Mon Jan _2 15:04"),sto.Local().Format("15:04"),dur,"h") + sum2 += dur + } + rows.Close() fmt.Println("____________________________") - fmt.Printf("Gesamt: %.2f h\n",sum) + fmt.Printf("Unbilled: %.2f[h] Total: %.2f[h]\n",sum2,sum+sum2) } func getLastProject() { @@ -772,7 +835,7 @@ func allProjects() { for rows.Next() { err = rows.Scan(&uid, &prname, &first, &last, &finish, &customer) checkErr(err) - rows2,err := db.Query("SELECT start, stop FROM timetable WHERE project = $1 AND checkout = 0 AND stop != '1791-09-30 19:07'",uid) + rows2,err := db.Query("SELECT start, stop FROM timetable WHERE project = $1 AND stop != '1791-09-30 19:07'",uid) checkErr(err) sum := 0.0 for rows2.Next() { @@ -2,6 +2,8 @@ package main import ( "fmt" + "strings" + "os/exec" "os" "text/template" ) @@ -42,7 +44,7 @@ type Data struct { MyMob string MyMail string MyUrl string - + BankNum string BankLZ string BankName string @@ -102,7 +104,7 @@ func billTemplate(billdata bill, cust customer) (Filenames) { filenamedata := fmt.Sprintf("%v_data",billid) filenameinv := fmt.Sprintf("%v_invoice",billid) - filenamemain := fmt.Sprintf("outtex/%v_main.tex",billid) + filenamemain := fmt.Sprintf("%v_main.tex",billid) fnames := Filenames{filenamedata,filenameinv,filenamemain} //Parse Templates @@ -135,6 +137,31 @@ func billTemplate(billdata bill, cust customer) (Filenames) { return fnames } +func runLatex(inputfilename,outputfilename string) (error) { + fmt.Printf("Rendering: %s -> Output File: outpdf/Rechnung%s.pdf\n",inputfilename,cleanString(outputfilename)) + pref := strings.TrimSuffix(inputfilename,"_main.tex") + //cmdArgs := []string{"-synctex=1", "-interaction=nonstopmode", filename} + + binary, err := exec.LookPath("pdflatex") + checkErr(err) + + //env := os.Environ() + mainpdf := strings.Replace(inputfilename,".tex",".pdf",1) + cmd := fmt.Sprintf("cd outtex; %v -interaction=nonstopmode -output-directory='../outpdf' %s; cd ../outpdf; cp %s 'Rechnung%s.pdf'; rm %s_*",binary,inputfilename,mainpdf,cleanString(outputfilename),pref) + //fmt.Println(cmd) + //docmd := exec.Command(binary,cmdArgs[0], cmdArgs[1],cmdArgs[2]) + docmd := exec.Command("bash","-c",cmd) + //err = docmd.Run() + err = docmd.Start() + //out,err := docmd.Output() + //checkErr(err) + err = docmd.Wait() + //fmt.Println(string(out)) + //fmt.Printf("Finished with Error:%v\n",err) + return err +} + + func tmpltest() { //Sampledata @@ -4,6 +4,7 @@ import ( "fmt" "bufio" "os" + "math" "strings" "strconv" "runtime" @@ -95,3 +96,31 @@ func string2StringArray(in string,delim string)(out []string) { } return } + +func Round(x, unit float64) (float64) { + return math.Round(x/unit) * unit +} + +func cleanString(in string) (out string) { + work := strings.Replace(in,"/","-",-1) + work = strings.Replace(work,"*","-",-1) + work = strings.Replace(work,":","-",-1) + work = strings.Replace(work,"<","-",-1) + work = strings.Replace(work,">","-",-1) + work = strings.Replace(work,"?","-",-1) + work = strings.Replace(work,"|","-",-1) + work = strings.Replace(work,"+","-",-1) + work = strings.Replace(work,",","-",-1) + work = strings.Replace(work,";","-",-1) + work = strings.Replace(work,"=","-",-1) + work = strings.Replace(work,"[","-",-1) + out = strings.Replace(work,"]","-",-1) + return +} + +func sumFloatArray(in []float64) (sum float64) { + for _,e := range in{ + sum += e + } + return +} |
