update PrintJob model and add Invoice
This commit is contained in:
@@ -2,6 +2,9 @@ package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"git.dynamicdiscord.de/kalipso/zineshop/utils"
|
||||
"gorm.io/gorm"
|
||||
"math"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
@@ -18,12 +21,33 @@ const (
|
||||
TriFold PrintOption = "-o Fold=TriFold -o Binding=TopBinding"
|
||||
)
|
||||
|
||||
type PrintJob struct {
|
||||
type OldPrintJob struct {
|
||||
Pdf string
|
||||
Amount uint
|
||||
Options []PrintOption
|
||||
}
|
||||
|
||||
type Invoice struct {
|
||||
gorm.Model
|
||||
PrintJobs []PrintJob
|
||||
PricePerClick float64
|
||||
PartCosts float64
|
||||
}
|
||||
|
||||
type PrintJob struct {
|
||||
gorm.Model
|
||||
ShopItemID uint
|
||||
ShopItem ShopItem
|
||||
VariantID uint
|
||||
Variant ItemVariant
|
||||
PaperTypeId uint
|
||||
PaperType Paper `gorm:"foreignKey:PaperTypeId"`
|
||||
CoverPaperTypeId *uint
|
||||
CoverPaperType *Paper `gorm:"foreignKey:CoverPaperTypeId"`
|
||||
Amount uint
|
||||
InvoiceID uint
|
||||
}
|
||||
|
||||
func GetPrintMode(mode string) PrintOption {
|
||||
if mode == "LongEdge" {
|
||||
return LongEdge
|
||||
@@ -40,7 +64,7 @@ func GetPrintMode(mode string) PrintOption {
|
||||
return CreateBooklet
|
||||
}
|
||||
|
||||
func NewPrintJob(shopItem ShopItem, variant ItemVariant, coverPage bool, amount uint) (PrintJob, error) {
|
||||
func NewPrintJob(shopItem ShopItem, variant ItemVariant, paperType Paper, coverPaperType *Paper, amount uint) (PrintJob, error) {
|
||||
if shopItem.Pdf == "" {
|
||||
return PrintJob{}, fmt.Errorf("ShopItem has no PDF assigned")
|
||||
}
|
||||
@@ -49,32 +73,44 @@ func NewPrintJob(shopItem ShopItem, variant ItemVariant, coverPage bool, amount
|
||||
return PrintJob{}, fmt.Errorf("Amount to big. This is denied for security reasons")
|
||||
}
|
||||
|
||||
var result PrintJob
|
||||
result.Pdf = shopItem.Pdf
|
||||
result.Amount = amount
|
||||
|
||||
if variant.Name == "Colored" {
|
||||
result.Options = append(result.Options, Colored)
|
||||
result := PrintJob{
|
||||
ShopItem: shopItem,
|
||||
Variant: variant,
|
||||
PaperType: paperType,
|
||||
CoverPaperType: coverPaperType,
|
||||
Amount: amount,
|
||||
}
|
||||
|
||||
if coverPage {
|
||||
result.Options = append(result.Options, CoverPage)
|
||||
}
|
||||
|
||||
result.Options = append(result.Options, GetPrintMode(shopItem.PrintMode))
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (p *PrintJob) IsColored() bool {
|
||||
return p.Variant.Name == "Colored"
|
||||
}
|
||||
|
||||
func (p *PrintJob) GeneratePrintOptions() []PrintOption {
|
||||
var result []PrintOption
|
||||
if p.Variant.Name == "Colored" {
|
||||
result = append(result, Colored)
|
||||
}
|
||||
|
||||
if p.CoverPaperType != nil {
|
||||
result = append(result, CoverPage)
|
||||
}
|
||||
|
||||
result = append(result, GetPrintMode(p.ShopItem.PrintMode))
|
||||
return result
|
||||
}
|
||||
|
||||
func (p *PrintJob) Execute() error {
|
||||
baseCommand := "lp -d KonicaBooklet"
|
||||
baseCommand += fmt.Sprintf(" -n %v ", p.Amount)
|
||||
|
||||
for _, option := range p.Options {
|
||||
for _, option := range p.GeneratePrintOptions() {
|
||||
baseCommand += fmt.Sprintf(" %v ", option)
|
||||
}
|
||||
|
||||
baseCommand += fmt.Sprintf(" -- %s", p.Pdf)
|
||||
baseCommand += fmt.Sprintf(" -- %s", p.ShopItem.Pdf)
|
||||
|
||||
parts := strings.Fields(baseCommand)
|
||||
|
||||
@@ -91,3 +127,34 @@ func (p *PrintJob) Execute() error {
|
||||
fmt.Printf("Output:\n%s\n", output)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PrintJob) CalculatePrintCosts() (float64, error) {
|
||||
pageCount := utils.CountPagesAtPath(p.ShopItem.Pdf)
|
||||
printMode := GetPrintMode(p.ShopItem.PrintMode)
|
||||
|
||||
//Get actual pagecount depending on printmode
|
||||
actualPageCount := pageCount
|
||||
|
||||
if printMode == CreateBooklet {
|
||||
dividedCount := float64(pageCount) / 4.0
|
||||
actualPageCount = int(math.Ceil(dividedCount))
|
||||
}
|
||||
|
||||
if printMode == LongEdge || printMode == ShortEdge {
|
||||
dividedCount := float64(pageCount) / 2.0
|
||||
actualPageCount = int(math.Ceil(dividedCount))
|
||||
}
|
||||
|
||||
PPC := 0.002604
|
||||
partCost := 0.0067
|
||||
if p.IsColored() {
|
||||
partCost = 0.0478
|
||||
}
|
||||
printingCosts := float64(actualPageCount) * p.PaperType.Price
|
||||
printingCosts += float64(actualPageCount/2) * PPC
|
||||
printingCosts += partCost * float64(actualPageCount)
|
||||
|
||||
fmt.Printf("Printing Costs per Zine: %v\n", printingCosts)
|
||||
fmt.Printf("Printing Costs Total: %v\n", printingCosts*float64(p.Amount))
|
||||
return printingCosts, nil
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ type ItemVariant struct {
|
||||
type ShopItem struct {
|
||||
gorm.Model
|
||||
Name string `json:"name" binding:"required" gorm:"unique;not null"`
|
||||
Abstract string `json:"Abstract" binding:"required"`
|
||||
Abstract string `json:"abstract" binding:"required"`
|
||||
Description string `json:"description" binding:"required"`
|
||||
Category Category `json:"category"`
|
||||
Variants []ItemVariant `json:"variant"`
|
||||
|
||||
Reference in New Issue
Block a user