summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interact.go12
-rw-r--r--sqlite.go79
-rw-r--r--texify.go31
-rw-r--r--utils.go29
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()
diff --git a/sqlite.go b/sqlite.go
index f51a459..3335f11 100644
--- a/sqlite.go
+++ b/sqlite.go
@@ -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,&timestr,&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() {
diff --git a/texify.go b/texify.go
index 71a9988..4e9015e 100644
--- a/texify.go
+++ b/texify.go
@@ -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
diff --git a/utils.go b/utils.go
index c94f94b..ad9693d 100644
--- a/utils.go
+++ b/utils.go
@@ -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
+}