summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolaus Gotsche <n@softwarefools.com>2018-08-29 04:27:16 +0200
committerNikolaus Gotsche <n@softwarefools.com>2018-08-29 04:27:16 +0200
commitad7b23c17dbe05e7e6a4ad3ea023f692f832a938 (patch)
tree0832c6fa8e8be7a66a59e371222aab19c3a2bf5d
parented43a6d9c450483914281e5fc3b6877116fc6ad0 (diff)
LaTeX templating and bills begin
-rw-r--r--interact.go43
-rw-r--r--main.go8
-rw-r--r--sqlite.go143
-rw-r--r--texify.go84
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
diff --git a/main.go b/main.go
index 32861c0..6cc9185 100644
--- a/main.go
+++ b/main.go
@@ -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()
diff --git a/sqlite.go b/sqlite.go
index 7a8dc4d..38b488e 100644
--- a/sqlite.go
+++ b/sqlite.go
@@ -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()
diff --git a/texify.go b/texify.go
index 53ca5b3..01ccd8f 100644
--- a/texify.go
+++ b/texify.go
@@ -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)
}