README ¶
Golang invoice generator
A super fast golang package to generate invoices, delivery notes and quotations as pdf using https://github.com/go-pdf/fpdf.
Download from Github
go get -u github.com/angelodlfrtr/go-invoice-generator
Exemple output
Quick start
package main
import (
"io/ioutil"
"testing"
generator "github.com/angelodlfrtr/go-invoice-generator"
)
func TestNew(t *testing.T) {
doc, _ := generator.New(generator.Invoice, &generator.Options{
TextTypeInvoice: "FACTURE",
AutoPrint: true,
})
doc.SetHeader(&generator.HeaderFooter{
Text: "<center>Cupcake ipsum dolor sit amet bonbon. I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder.</center>",
Pagination: true,
})
doc.SetFooter(&generator.HeaderFooter{
Text: "<center>Cupcake ipsum dolor sit amet bonbon. I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder.</center>",
Pagination: true,
})
doc.SetRef("testref")
doc.SetVersion("someversion")
doc.SetDescription("A description")
doc.SetNotes("I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder! I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder! I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder! I love croissant cotton candy. Carrot cake sweet I love sweet roll cake powder! ")
doc.SetDate("02/03/2021")
doc.SetPaymentTerm("02/04/2021")
logoBytes, _ := ioutil.ReadFile("./example_logo.png")
doc.SetCompany(&generator.Contact{
Name: "Test Company",
Logo: &logoBytes,
Address: &generator.Address{
Address: "89 Rue de Brest",
Address2: "Appartement 2",
PostalCode: "75000",
City: "Paris",
Country: "France",
},
})
doc.SetCustomer(&generator.Contact{
Name: "Test Customer",
Address: &generator.Address{
Address: "89 Rue de Paris",
PostalCode: "29200",
City: "Brest",
Country: "France",
},
})
for i := 0; i < 3; i++ {
doc.AppendItem(&generator.Item{
Name: "Cupcake ipsum dolor sit amet bonbon, coucou bonbon lala jojo, mama titi toto",
Description: "Cupcake ipsum dolor sit amet bonbon, Cupcake ipsum dolor sit amet bonbon, Cupcake ipsum dolor sit amet bonbon",
UnitCost: "99876.89",
Quantity: "2",
Tax: &Tax{
Percent: "20",
},
})
}
doc.AppendItem(&generator.Item{
Name: "Test",
UnitCost: "99876.89",
Quantity: "2",
Tax: &Tax{
Amount: "89",
},
Discount: &Discount{
Percent: "30",
},
})
doc.AppendItem(&generator.Item{
Name: "Test",
UnitCost: "3576.89",
Quantity: "2",
Discount: &Discount{
Percent: "50",
},
})
doc.AppendItem(&generator.Item{
Name: "Test",
UnitCost: "889.89",
Quantity: "2",
Discount: &Discount{
Amount: "234.67",
},
})
doc.SetDefaultTax(&generator.Tax{
Percent: "10",
})
// doc.SetDiscount(&generator.Discount{
// Percent: "90",
// })
doc.SetDiscount(&generator.Discount{
Amount: "1340",
})
pdf, err := doc.Build()
if err != nil {
log.Fatal(err)
}
err = pdf.OutputFileAndClose("out.pdf")
if err != nil {
log.Fatal(err)
}
}
License
This SDK is distributed under the Apache License, Version 2.0, see LICENSE and NOTICE for more information.
Documentation ¶
Overview ¶
Package generator allows you to easily generate invoices, delivery notes and quotations in GoLang.
Index ¶
- Constants
- Variables
- type Address
- type Contact
- type Discount
- type Document
- func (d *Document) AppendItem(item *Item) *Document
- func (doc *Document) Build() (*fpdf.Fpdf, error)
- func (doc *Document) Pdf() *fpdf.Fpdf
- func (d *Document) SetCompany(company *Contact) *Document
- func (d *Document) SetCustomer(customer *Contact) *Document
- func (d *Document) SetDate(date string) *Document
- func (d *Document) SetDefaultTax(tax *Tax) *Document
- func (d *Document) SetDescription(desc string) *Document
- func (d *Document) SetDiscount(discount *Discount) *Document
- func (d *Document) SetFooter(footer *HeaderFooter) *Document
- func (d *Document) SetHeader(header *HeaderFooter) *Document
- func (d *Document) SetNotes(notes string) *Document
- func (d *Document) SetPaymentTerm(term string) *Document
- func (d *Document) SetRef(ref string) *Document
- func (d *Document) SetType(docType string) *Document
- func (doc *Document) SetUnicodeTranslator(fn UnicodeTranslateFunc)
- func (d *Document) SetVersion(version string) *Document
- func (doc *Document) Tax() decimal.Decimal
- func (doc *Document) TotalWithTax() decimal.Decimal
- func (doc *Document) TotalWithoutTax() decimal.Decimal
- func (doc *Document) TotalWithoutTaxAndWithoutDocumentDiscount() decimal.Decimal
- func (d *Document) Validate() error
- type HeaderFooter
- type Item
- type Options
- type Tax
- type UnicodeTranslateFunc
Constants ¶
const ( // Invoice define the "invoice" document type Invoice string = "INVOICE" // Quotation define the "quotation" document type Quotation string = "QUOTATION" // DeliveryNote define the "delievry note" document type DeliveryNote string = "DELIVERY_NOTE" // BaseMargin define base margin used in documents BaseMargin float64 = 10 // BaseMarginTop define base margin top used in documents BaseMarginTop float64 = 20 // HeaderMarginTop define base header margin top used in documents HeaderMarginTop float64 = 5 // MaxPageHeight define the maximum height for a single page MaxPageHeight float64 = 260 )
const ( // ItemColNameOffset ... ItemColNameOffset float64 = 10 // ItemColHTPriceOffset ... ItemColHTPriceOffset float64 = 97 // ItemColPriceInclVATOffset ... ItemColPriceInclVATOffset float64 = 113 // ItemColQtyOffset ... ItemColQtyOffset float64 = 127 // ItemColDiscountOffset ... ItemColDiscountOffset float64 = 140 // ItemColTaxOffset ... ItemColTaxOffset float64 = 157 // ItemColTotalTTCOffset ... ItemColTotalTTCOffset float64 = 175 )
Cols offsets
const ( DiscountTypeAmount string = "amount" DiscountTypePercent string = "percent" )
Discount types
const ( TaxTypeAmount string = "amount" TaxTypePercent string = "percent" )
Tax types
Variables ¶
var ( // BaseTextFontSize define the base font size for text in document BaseTextFontSize float64 = 8 // SmallTextFontSize define the small font size for text in document SmallTextFontSize float64 = 7 // ExtraSmallTextFontSize define the extra small font size for text in document ExtraSmallTextFontSize float64 = 6 // LargeTextFontSize define the large font size for text in document LargeTextFontSize float64 = 10 )
var ErrInvalidDiscount = errors.New("invalid discount")
ErrInvalidDiscount when percent and amount are empty
var ErrInvalidDocumentType = errors.New("invalid document type")
var ErrInvalidTax = errors.New("invalid tax")
ErrInvalidTax when percent and amount are empty
Functions ¶
This section is empty.
Types ¶
type Address ¶
type Address struct { Address string `json:"address,omitempty" validate:"required"` Address2 string `json:"address_2,omitempty"` PostalCode string `json:"postal_code,omitempty"` City string `json:"city,omitempty"` Country string `json:"country,omitempty"` }
Address represent an address
type Contact ¶
type Contact struct { Name string `json:"name,omitempty" validate:"required,min=1,max=256"` Logo []byte `json:"logo,omitempty"` // Logo byte array Address *Address `json:"address,omitempty"` Country string `json:"country,omitempty"` AddressLine string `json:"addressLine,omitempty"` ZipCode string `json:"zipCode,omitempty"` City string `json:"city,omitempty"` // AddtionnalInfo to append after contact informations. You can use basic html here (bold, italic tags). AddtionnalInfo []string `json:"additional_info,omitempty"` }
Contact contact a company informations
type Discount ¶
type Discount struct { Percent string `json:"percent,omitempty"` // Discount in percent ex 17 Amount string `json:"amount,omitempty"` // Discount in amount ex 123.40 // contains filtered or unexported fields }
Discount define discount as percent or fixed amount
type Document ¶
type Document struct { Options *Options `json:"options,omitempty"` Header *HeaderFooter `json:"header,omitempty"` Type string `json:"type,omitempty" validate:"required,oneof=INVOICE DELIVERY_NOTE QUOTATION"` Ref string `json:"ref,omitempty" validate:"required,min=1,max=32"` Version string `json:"version,omitempty" validate:"max=32"` ClientRef string `json:"client_ref,omitempty" validate:"max=64"` Description string `json:"description,omitempty" validate:"max=1024"` Notes string `json:"notes,omitempty"` Company *Contact `json:"company,omitempty" validate:"required"` Customer *Contact `json:"customer,omitempty" validate:"required"` Items []*Item `json:"items,omitempty"` Date string `json:"date,omitempty"` ValidityDate string `json:"validity_date,omitempty"` PaymentTerm string `json:"payment_term,omitempty"` DefaultTax *Tax `json:"default_tax,omitempty"` Discount *Discount `json:"discount,omitempty"` // contains filtered or unexported fields }
Document define base document
func (*Document) AppendItem ¶
AppendItem to document items
func (*Document) SetCompany ¶
SetCompany of document
func (*Document) SetCustomer ¶
SetCustomer of document
func (*Document) SetDefaultTax ¶
SetDefaultTax of document
func (*Document) SetDescription ¶
SetDescription of document
func (*Document) SetDiscount ¶
SetDiscount of document
func (*Document) SetFooter ¶
func (d *Document) SetFooter(footer *HeaderFooter) *Document
SetFooter set footer of document
func (*Document) SetHeader ¶
func (d *Document) SetHeader(header *HeaderFooter) *Document
SetHeader set header of document
func (*Document) SetPaymentTerm ¶
SetPaymentTerm of document
func (*Document) SetUnicodeTranslator ¶
func (doc *Document) SetUnicodeTranslator(fn UnicodeTranslateFunc)
SetUnicodeTranslator to use See https://pkg.go.dev/github.com/go-pdf/fpdf#UnicodeTranslator
func (*Document) SetVersion ¶
SetVersion of document
func (*Document) TotalWithTax ¶
TotalWithTax return total with tax and with document discount
func (*Document) TotalWithoutTax ¶
TotalWithoutTax return total without tax and with document discount
func (*Document) TotalWithoutTaxAndWithoutDocumentDiscount ¶
TotalWithoutTaxAndWithoutDocumentDiscount return total without tax and without document discount
type HeaderFooter ¶
type HeaderFooter struct {}
HeaderFooter define header or footer informations on document
func (*HeaderFooter) ApplyFunc ¶
func (hf *HeaderFooter) ApplyFunc(pdf *fpdf.Fpdf, fn fnc)
ApplyFunc allow user to apply custom func
type Item ¶
type Item struct { Name string `json:"name,omitempty" validate:"required"` Description string `json:"description,omitempty"` PriceExclVAT string `json:"unit_cost,omitempty"` PriceInclVAT string `json:"quantity,omitempty"` PayedPriceInclVAT string `json:"payed_price_incl_vat,omitempty"` PayedPriceExclVAT string `json:"payed_price_excl_vat,omitempty"` Tax *Tax `json:"tax,omitempty"` Discount *Discount `json:"discount,omitempty"` // contains filtered or unexported fields }
Item represent a 'product' or a 'service'
func (*Item) TaxWithTotalDiscounted ¶
TaxWithTotalDiscounted returns the tax with total discounted
func (*Item) TotalWithTaxAndDiscount ¶
TotalWithTaxAndDiscount returns the total with tax and discount
func (*Item) TotalWithoutTaxAndWithDiscount ¶
TotalWithoutTaxAndWithDiscount returns the total without tax and with discount
func (*Item) TotalWithoutTaxAndWithoutDiscount ¶
TotalWithoutTaxAndWithoutDiscount returns the total without tax and without discount
type Options ¶
type Options struct { AutoPrint bool `json:"auto_print,omitempty"` CurrencySymbol string `default:"€ " json:"currency_symbol,omitempty"` CurrencyPrecision int `default:"2" json:"currency_precision,omitempty"` CurrencyDecimal string `default:"." json:"currency_decimal,omitempty"` CurrencyThousand string `default:" " json:"currency_thousand,omitempty"` TextTypeInvoice string `default:"INVOICE" json:"text_type_invoice,omitempty"` TextTypeQuotation string `default:"QUOTATION" json:"text_type_quotation,omitempty"` TextTypeDeliveryNote string `default:"DELIVERY NOTE" json:"text_type_delivery_note,omitempty"` TextRefTitle string `default:"Ref." json:"text_ref_title,omitempty"` TextVersionTitle string `default:"Version" json:"text_version_title,omitempty"` TextDateTitle string `default:"Date" json:"text_date_title,omitempty"` TextPaymentTermTitle string `default:"Payment term" json:"text_payment_term_title,omitempty"` TextItemsNameTitle string `default:"Name" json:"text_items_name_title,omitempty"` TextItemsUnitCostTitle string `default:"Unit price" json:"text_items_unit_cost_title,omitempty"` TextItemsQuantityTitle string `default:"Qty" json:"text_items_quantity_title,omitempty"` TextItemsTotalHTTitle string `default:"Total no tax" json:"text_items_total_ht_title,omitempty"` TextItemsTaxTitle string `default:"Tax" json:"text_items_tax_title,omitempty"` TextItemsDiscountTitle string `default:"Discount" json:"text_items_discount_title,omitempty"` TextItemsTotalTTCTitle string `default:"Total" json:"text_items_total_ttc_title,omitempty"` TextTotalTotal string `default:"TOTAL" json:"text_total_total,omitempty"` TextTotalDiscounted string `default:"TOTAL DISCOUNTED" json:"text_total_discounted,omitempty"` TextTotalTax string `default:"TAX" json:"text_total_tax,omitempty"` TextTotalWithTax string `default:"TOTAL WITH TAX" json:"text_total_with_tax,omitempty"` BaseTextColor []int `default:"[35,35,35]" json:"base_text_color,omitempty"` GreyTextColor []int `default:"[82,82,82]" json:"grey_text_color,omitempty"` GreyBgColor []int `default:"[232,232,232]" json:"grey_bg_color,omitempty"` DarkBgColor []int `default:"[212,212,212]" json:"dark_bg_color,omitempty"` Font string `default:"Helvetica"` BoldFont string `default:"Helvetica"` UnicodeTranslateFunc UnicodeTranslateFunc }
Options for Document