diff --git a/.gitignore b/.gitignore index 79dd72f..c0b8dec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ mkinvoice -makefont +makefont/makefont temp/* qr-images/* output/* diff --git a/makefont.go b/makefont/makefont.go similarity index 100% rename from makefont.go rename to makefont/makefont.go diff --git a/mkinvoice.go b/mkinvoice.go index e5274a1..dca9102 100644 --- a/mkinvoice.go +++ b/mkinvoice.go @@ -2,68 +2,73 @@ package main import ( "fmt" - "github.com/jung-kurt/gofpdf" - "gopkg.in/yaml.v2" "io/ioutil" "log" "os" "os/exec" "path/filepath" + + "github.com/jung-kurt/gofpdf" + "gopkg.in/yaml.v2" ) +// Metadata type type Metadata struct { - Invoice_nr string - Invoice_info string - Invoice_date string + InvoiceNr string + InvoiceInfo string + InvoiceDdate string Vat float64 Account string - Due_date string + DueDate string } +// Address type type Address struct { Name string Street string Zip string City string - Tel_no string + TelNo string Email string } +// InvoiceItem type type InvoiceItem struct { - Text string - Quantity float64 - Pice_per_unit float64 + Text string + Quantity float64 + PicePerUnit float64 } +// InvoiceData type type InvoiceData struct { - Metadata Metadata - Sender_address Address - Billing_address Address - Item []InvoiceItem + Metadata Metadata + SenderAddress Address + BillingAddress Address + Item []InvoiceItem } /* global variable declaration */ var pdf *gofpdf.Fpdf -var y_pos float64 -var invoice_data InvoiceData -var prog_dir string +var yPos float64 +var invoiceData InvoiceData +var progDir string -const margin_top = 7 -const logo_top = 6 -const logo_height = 20 -const line_spacing = 5 -const address_top = 50 -const line1_top = 100 -const tabstop_left = 20 -const tabstop_left_2 = 32 -const tabstop_address = 120 -const tabstop_count = 10 -const tabstop_price = 10 -const tabstop_total = 170 -const tabstop_logo = 155 -const tabstop_right = 200 +const marginTop = 7 +const logoTop = 6 +const logoHeight = 20 +const lineSpacing = 5 +const addressTop = 50 +const line1Top = 100 +const tabstopLeft = 20 +const tabstopLeftAlt = 32 +const tabstopAddress = 120 +const tabstopCount = 10 +const tabstopPrice = 10 +const tabstopTotal = 170 +const tabstopLogo = 155 +const tabstopRight = 200 -func ReadInvoiceData(filename string) { +func readInvoiceData(filename string) { data, err := ioutil.ReadFile(filename) if err != nil { log.Fatal(err) @@ -71,16 +76,16 @@ func ReadInvoiceData(filename string) { //fmt.Printf("File contents: %s", data) - err = yaml.Unmarshal([]byte(data), &invoice_data) + err = yaml.Unmarshal([]byte(data), &invoiceData) if err != nil { log.Fatalf("error: %v", err) } - fmt.Printf("--- t:\n%v\n\n", invoice_data) - fmt.Printf("%s\n", invoice_data.Billing_address.Name) + fmt.Printf("--- t:\n%v\n\n", invoiceData) + fmt.Printf("%s\n", invoiceData.BillingAddress.Name) } -func WriteText(x float64, y float64, text string, alignStr ...string) { +func writeText(x float64, y float64, text string, alignStr ...string) { tr := pdf.UnicodeTranslatorFromDescriptor("") align := "LT" if len(alignStr) > 0 { @@ -90,7 +95,7 @@ func WriteText(x float64, y float64, text string, alignStr ...string) { pdf.CellFormat(0, 11, tr(text), "", 0, align, false, 0, "") } -func SetupInvoice() { +func setupInvoice() { pdf = gofpdf.New("P", "mm", "A4", "") pdf.SetMargins(0, 0, 0) pdf.SetFontLocation("fonts") @@ -99,64 +104,64 @@ func SetupInvoice() { pdf.SetFont("Dejavusans", "", 10) } -func PrintPageHeader(firstPage bool) { +func printPageHeader(firstPage bool) { var opt gofpdf.ImageOptions pdf.AddPage() - y_pos = margin_top + yPos = marginTop pdf.SetFont("Dejavusans-Bold", "", 10) - WriteText(tabstop_left, y_pos, "nbit Informatik GmbH") + writeText(tabstopLeft, yPos, "nbit Informatik GmbH") pdf.SetFont("Dejavusans", "", 10) - y_pos = y_pos + line_spacing - WriteText(tabstop_left, y_pos, "Kirchweg 2") - y_pos = y_pos + line_spacing - WriteText(tabstop_left, y_pos, "3510 Konolfingen") - y_pos = y_pos + line_spacing - y_pos = y_pos + line_spacing - WriteText(tabstop_left, y_pos, "Tel.") - WriteText(tabstop_left_2, y_pos, "+41 31 792 00 40") - y_pos = y_pos + line_spacing - WriteText(tabstop_left, y_pos, "EMail") - WriteText(tabstop_left_2, y_pos, "joerg.lehmann@nbit.ch") - y_pos = y_pos + line_spacing + yPos = yPos + lineSpacing + writeText(tabstopLeft, yPos, "Kirchweg 2") + yPos = yPos + lineSpacing + writeText(tabstopLeft, yPos, "3510 Konolfingen") + yPos = yPos + lineSpacing + yPos = yPos + lineSpacing + writeText(tabstopLeft, yPos, "Tel.") + writeText(tabstopLeftAlt, yPos, "+41 31 792 00 40") + yPos = yPos + lineSpacing + writeText(tabstopLeft, yPos, "EMail") + writeText(tabstopLeftAlt, yPos, "joerg.lehmann@nbit.ch") + yPos = yPos + lineSpacing opt.ImageType = "png" opt.ReadDpi = true - pdf.ImageOptions("logos/nbit-logo.png", tabstop_logo, logo_top, 0, logo_height, false, opt, 0, "") + pdf.ImageOptions("logos/nbit-logo.png", tabstopLogo, logoTop, 0, logoHeight, false, opt, 0, "") } -func PrintAddress() { - fmt.Printf("Blabla: %s\n", invoice_data.Billing_address.Name) - y_pos = address_top - WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Name) - y_pos = y_pos + line_spacing - WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Street) - y_pos = y_pos + line_spacing - WriteText(tabstop_address, y_pos, invoice_data.Billing_address.Zip+" "+invoice_data.Billing_address.City) - y_pos = y_pos + line_spacing +func printAddress() { + fmt.Printf("Blabla: %s\n", invoiceData.BillingAddress.Name) + yPos = addressTop + writeText(tabstopAddress, yPos, invoiceData.BillingAddress.Name) + yPos = yPos + lineSpacing + writeText(tabstopAddress, yPos, invoiceData.BillingAddress.Street) + yPos = yPos + lineSpacing + writeText(tabstopAddress, yPos, invoiceData.BillingAddress.Zip+" "+invoiceData.BillingAddress.City) + yPos = yPos + lineSpacing - pdf.Line(tabstop_left, line1_top, tabstop_right, line1_top) + pdf.Line(tabstopLeft, line1Top, tabstopRight, line1Top) } -func PrintQR() { +func printQR() { var opt gofpdf.ImageOptions - cmd := exec.Command(filepath.Join(prog_dir, "qrbill.sh"), - "--account", invoice_data.Metadata.Account, + cmd := exec.Command(filepath.Join(progDir, "qrbill.sh"), + "--account", invoiceData.Metadata.Account, "--amount", "123.00", - "--creditor-name", invoice_data.Sender_address.Name, - "--creditor-street", invoice_data.Sender_address.Street, - "--creditor-postalcode", invoice_data.Sender_address.Zip, - "--creditor-city", invoice_data.Sender_address.City, - "--extra-infos", invoice_data.Metadata.Invoice_info, - "--debtor-name", invoice_data.Billing_address.Name, - "--debtor-street", invoice_data.Billing_address.Street, - "--debtor-postalcode", invoice_data.Billing_address.Zip, - "--debtor-city", invoice_data.Billing_address.City, - "--due-date", invoice_data.Metadata.Due_date, + "--creditor-name", invoiceData.SenderAddress.Name, + "--creditor-street", invoiceData.SenderAddress.Street, + "--creditor-postalcode", invoiceData.SenderAddress.Zip, + "--creditor-city", invoiceData.SenderAddress.City, + "--extra-infos", invoiceData.Metadata.InvoiceInfo, + "--debtor-name", invoiceData.BillingAddress.Name, + "--debtor-street", invoiceData.BillingAddress.Street, + "--debtor-postalcode", invoiceData.BillingAddress.Zip, + "--debtor-city", invoiceData.BillingAddress.City, + "--due-date", invoiceData.Metadata.DueDate, "--language", "de") cmd.Env = append(os.Environ(), - "INVNO="+invoice_data.Metadata.Invoice_nr, + "INVNO="+invoiceData.Metadata.InvoiceNr, ) stdoutStderr, err := cmd.CombinedOutput() fmt.Printf("%s\n", stdoutStderr) @@ -167,7 +172,7 @@ func PrintQR() { opt.ImageType = "jpeg" opt.ReadDpi = true - pdf.ImageOptions("qr-images/"+invoice_data.Metadata.Invoice_nr+".jpg", 0, 200, 0, 0, false, opt, 0, "") + pdf.ImageOptions("qr-images/"+invoiceData.Metadata.InvoiceNr+".jpg", 0, 200, 0, 0, false, opt, 0, "") } func main() { @@ -175,20 +180,20 @@ func main() { if err != nil { log.Fatal(err) } - prog_dir = dir + progDir = dir if len(os.Args) != 2 { fmt.Printf("usage: mkinvoice \n") os.Exit(1) } - ReadInvoiceData(os.Args[1]) - SetupInvoice() - PrintPageHeader(true) - PrintAddress() - PrintQR() + readInvoiceData(os.Args[1]) + setupInvoice() + printPageHeader(true) + printAddress() + printQR() - err = pdf.OutputFileAndClose(filepath.Join(prog_dir, "output", invoice_data.Metadata.Invoice_nr+".pdf")) + err = pdf.OutputFileAndClose(filepath.Join(progDir, "output", invoiceData.Metadata.InvoiceNr+".pdf")) if err == nil { fmt.Printf("Successfully created invoice\n") } else {