mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 18:52:56 +00:00
hot fix #1
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Invoice represents a complete invoice with auto-fill capabilities
|
||||
type Invoice struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
|
||||
// Invoice identification
|
||||
InvoiceNumber string `json:"invoice_number" gorm:"size:50;uniqueIndex;not null"`
|
||||
InvoiceType string `json:"invoice_type" gorm:"size:20;default:'faktura'"` // "faktura", "zalohova_faktura", "proforma_faktura", "dobropis"
|
||||
VariableSymbol string `json:"variable_symbol" gorm:"size:20"`
|
||||
ConstantSymbol string `json:"constant_symbol" gorm:"size:20"`
|
||||
SpecificSymbol string `json:"specific_symbol" gorm:"size:20"`
|
||||
|
||||
// Invoice dates
|
||||
IssueDate time.Time `json:"issue_date" gorm:"not null"`
|
||||
DueDate time.Time `json:"due_date" gorm:"not null"`
|
||||
TaxableSupplyDate time.Time `json:"taxable_supply_date"`
|
||||
|
||||
// Supplier information (auto-filled from club settings)
|
||||
SupplierName string `json:"supplier_name" gorm:"size:255;not null"`
|
||||
SupplierICO string `json:"supplier_ico" gorm:"size:20"`
|
||||
SupplierDIC string `json:"supplier_dic" gorm:"size:20"`
|
||||
SupplierAddress string `json:"supplier_address" gorm:"type:text"`
|
||||
SupplierCity string `json:"supplier_city" gorm:"size:100"`
|
||||
SupplierZIP string `json:"supplier_zip" gorm:"size:10"`
|
||||
SupplierCountry string `json:"supplier_country" gorm:"size:100;default:'Česká republika'"`
|
||||
|
||||
// Supplier bank information (auto-filled)
|
||||
BankName string `json:"bank_name" gorm:"size:255"`
|
||||
BankAccount string `json:"bank_account" gorm:"size:50"`
|
||||
BankIBAN string `json:"bank_iban" gorm:"size:50"`
|
||||
BankSWIFT string `json:"bank_swift" gorm:"size:20"`
|
||||
|
||||
// Customer information (manual or auto-fill from database)
|
||||
CustomerID *uint `json:"customer_id" gorm:"index"`
|
||||
CustomerName string `json:"customer_name" gorm:"size:255;not null"`
|
||||
CustomerICO string `json:"customer_ico" gorm:"size:20"`
|
||||
CustomerDIC string `json:"customer_dic" gorm:"size:20"`
|
||||
CustomerAddress string `json:"customer_address" gorm:"type:text"`
|
||||
CustomerCity string `json:"customer_city" gorm:"size:100"`
|
||||
CustomerZIP string `json:"customer_zip" gorm:"size:10"`
|
||||
CustomerCountry string `json:"customer_country" gorm:"size:100;default:'Česká republika'"`
|
||||
CustomerEmail string `json:"customer_email" gorm:"size:255"`
|
||||
CustomerPhone string `json:"customer_phone" gorm:"size:50"`
|
||||
|
||||
// Financial summary
|
||||
TotalAmount float64 `json:"total_amount" gorm:"type:decimal(15,2);not null"`
|
||||
TotalVAT float64 `json:"total_vat" gorm:"type:decimal(15,2);not null"`
|
||||
TotalAmountVAT float64 `json:"total_amount_vat" gorm:"type:decimal(15,2);not null"`
|
||||
TotalAmountWithoutVAT float64 `json:"total_amount_without_vat" gorm:"type:decimal(15,2);not null"`
|
||||
Currency string `json:"currency" gorm:"size:3;default:'CZK'"`
|
||||
|
||||
// Invoice status and workflow
|
||||
Status string `json:"status" gorm:"size:20;default:'draft'"` // "draft", "sent", "paid", "overdue", "cancelled"
|
||||
PaymentStatus string `json:"payment_status" gorm:"size:20;default:'unpaid'"` // "unpaid", "partially_paid", "paid", "overdue"
|
||||
PaymentDate *time.Time `json:"payment_date"`
|
||||
PaidAmount float64 `json:"paid_amount" gorm:"type:decimal(15,2);default:0"`
|
||||
|
||||
// Additional information
|
||||
Note string `json:"note" gorm:"type:text"`
|
||||
PaymentNote string `json:"payment_note" gorm:"type:text"`
|
||||
InternalNote string `json:"internal_note" gorm:"type:text"`
|
||||
|
||||
// PDF and sending
|
||||
PDFPath string `json:"pdf_path" gorm:"size:500"`
|
||||
PDFGeneratedAt *time.Time `json:"pdf_generated_at"`
|
||||
SentAt *time.Time `json:"sent_at"`
|
||||
SentTo string `json:"sent_to" gorm:"type:text"` // JSON array of emails
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy uint `json:"created_by"`
|
||||
UpdatedBy uint `json:"updated_by"`
|
||||
|
||||
// Relations
|
||||
Items []InvoiceItem `json:"items,omitempty" gorm:"foreignKey:InvoiceID;constraint:OnDelete:CASCADE"`
|
||||
Payments []InvoicePayment `json:"payments,omitempty" gorm:"foreignKey:InvoiceID;constraint:OnDelete:CASCADE"`
|
||||
Customer *InvoiceCustomer `json:"customer,omitempty" gorm:"foreignKey:CustomerID"`
|
||||
}
|
||||
|
||||
// InvoiceItem represents individual line items in an invoice
|
||||
type InvoiceItem struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
InvoiceID uint `json:"invoice_id" gorm:"not null;index"`
|
||||
|
||||
// Item details
|
||||
Description string `json:"description" gorm:"type:text;not null"`
|
||||
Quantity float64 `json:"quantity" gorm:"type:decimal(12,3);not null"`
|
||||
Unit string `json:"unit" gorm:"size:20;default:'ks'"` // "ks", "hod", "m", "kg", etc.
|
||||
UnitPrice float64 `json:"unit_price" gorm:"type:decimal(15,2);not null"`
|
||||
TotalPrice float64 `json:"total_price" gorm:"type:decimal(15,2);not null"`
|
||||
|
||||
// VAT information
|
||||
VATRate float64 `json:"vat_rate" gorm:"type:decimal(5,2);not null"` // 0, 10, 21
|
||||
VATAmount float64 `json:"vat_amount" gorm:"type:decimal(15,2);not null"`
|
||||
TotalWithVAT float64 `json:"total_with_vat" gorm:"type:decimal(15,2);not null"`
|
||||
|
||||
// Additional fields
|
||||
Code string `json:"code" gorm:"size:100"` // Product code or service code
|
||||
Note string `json:"note" gorm:"type:text"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
// Relations
|
||||
Invoice Invoice `json:"invoice,omitempty" gorm:"foreignKey:InvoiceID"`
|
||||
}
|
||||
|
||||
// InvoicePayment represents payments received for invoices
|
||||
type InvoicePayment struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
InvoiceID uint `json:"invoice_id" gorm:"not null;index"`
|
||||
|
||||
// Payment details
|
||||
Amount float64 `json:"amount" gorm:"type:decimal(15,2);not null"`
|
||||
Currency string `json:"currency" gorm:"size:3;default:'CZK'"`
|
||||
PaymentDate time.Time `json:"payment_date" gorm:"not null"`
|
||||
PaymentMethod string `json:"payment_method" gorm:"size:50"` // "bank_transfer", "cash", "card", "other"
|
||||
|
||||
// Bank transfer details
|
||||
VariableSymbol string `json:"variable_symbol" gorm:"size:20"`
|
||||
ConstantSymbol string `json:"constant_symbol" gorm:"size:20"`
|
||||
SpecificSymbol string `json:"specific_symbol" gorm:"size:20"`
|
||||
BankAccount string `json:"bank_account" gorm:"size:50"`
|
||||
|
||||
// Additional information
|
||||
Note string `json:"note" gorm:"type:text"`
|
||||
ReferenceNumber string `json:"reference_number" gorm:"size:255"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy uint `json:"created_by"`
|
||||
|
||||
// Relations
|
||||
Invoice Invoice `json:"invoice,omitempty" gorm:"foreignKey:InvoiceID"`
|
||||
}
|
||||
|
||||
// InvoiceCustomer represents customer database for auto-fill
|
||||
type InvoiceCustomer struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
|
||||
// Basic information
|
||||
Name string `json:"name" gorm:"size:255;not null"`
|
||||
ICO string `json:"ico" gorm:"size:20;uniqueIndex"`
|
||||
DIC string `json:"dic" gorm:"size:20"`
|
||||
|
||||
// Address
|
||||
Address string `json:"address" gorm:"type:text"`
|
||||
City string `json:"city" gorm:"size:100"`
|
||||
ZIP string `json:"zip" gorm:"column:zip;size:10"`
|
||||
Country string `json:"country" gorm:"size:100;default:'Česká republika'"`
|
||||
|
||||
// Contact information
|
||||
Email string `json:"email" gorm:"size:255"`
|
||||
Phone string `json:"phone" gorm:"size:50"`
|
||||
Website string `json:"website" gorm:"size:255"`
|
||||
|
||||
// Business information
|
||||
BusinessType string `json:"business_type" gorm:"size:100"` // "individual", "company", "non_profit"
|
||||
VATPayer bool `json:"vat_payer" gorm:"default:true"`
|
||||
|
||||
// Notes and metadata
|
||||
Notes string `json:"notes" gorm:"type:text"`
|
||||
Active bool `json:"active" gorm:"default:true"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy uint `json:"created_by"`
|
||||
UpdatedBy uint `json:"updated_by"`
|
||||
|
||||
// Relations
|
||||
Invoices []Invoice `json:"invoices,omitempty" gorm:"foreignKey:CustomerID"`
|
||||
}
|
||||
|
||||
// InvoiceTemplate represents invoice templates for different types
|
||||
type InvoiceTemplate struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
|
||||
// Template identification
|
||||
Name string `json:"name" gorm:"size:255;not null"`
|
||||
Type string `json:"type" gorm:"size:50;not null"` // "standard", "proforma", "credit_note"
|
||||
Description string `json:"description" gorm:"type:text"`
|
||||
|
||||
// Template content (HTML with placeholders)
|
||||
HeaderHTML string `json:"header_html" gorm:"type:text"`
|
||||
BodyHTML string `json:"body_html" gorm:"type:text"`
|
||||
FooterHTML string `json:"footer_html" gorm:"type:text"`
|
||||
|
||||
// CSS styling
|
||||
CSS string `json:"css" gorm:"type:text"`
|
||||
|
||||
// Default settings
|
||||
DefaultVATRate float64 `json:"default_vat_rate" gorm:"type:decimal(5,2);default:21"`
|
||||
DefaultPaymentTerm int `json:"default_payment_term" gorm:"default:14"` // days
|
||||
|
||||
// Status
|
||||
Active bool `json:"active" gorm:"default:true"`
|
||||
Default bool `json:"default" gorm:"default:false"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
CreatedBy uint `json:"created_by"`
|
||||
UpdatedBy uint `json:"updated_by"`
|
||||
}
|
||||
|
||||
// InvoiceSettings represents global invoice settings
|
||||
type InvoiceSettings struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
|
||||
// Company information (auto-fill source)
|
||||
CompanyName string `json:"company_name" gorm:"size:255;not null"`
|
||||
CompanyICO string `json:"company_ico" gorm:"size:20;not null"`
|
||||
CompanyDIC string `json:"company_dic" gorm:"size:20"`
|
||||
CompanyAddress string `json:"company_address" gorm:"type:text"`
|
||||
CompanyCity string `json:"company_city" gorm:"size:100"`
|
||||
CompanyZIP string `json:"company_zip" gorm:"size:10"`
|
||||
CompanyCountry string `json:"company_country" gorm:"size:100;default:'Česká republika'"`
|
||||
|
||||
// Bank information
|
||||
BankName string `json:"bank_name" gorm:"size:255"`
|
||||
BankAccount string `json:"bank_account" gorm:"size:50"`
|
||||
BankIBAN string `json:"bank_iban" gorm:"size:50"`
|
||||
BankSWIFT string `json:"bank_swift" gorm:"size:20"`
|
||||
|
||||
// Invoice numbering
|
||||
InvoiceNumberFormat string `json:"invoice_number_format" gorm:"size:100;default:'F{year}{seq:6}'"` // Format with placeholders
|
||||
NextInvoiceNumber int `json:"next_invoice_number" gorm:"default:1"`
|
||||
CurrentYear int `json:"current_year"`
|
||||
|
||||
// Default settings
|
||||
DefaultPaymentTerm int `json:"default_payment_term" gorm:"default:14"` // days
|
||||
DefaultVATRate float64 `json:"default_vat_rate" gorm:"type:decimal(5,2);default:21"`
|
||||
DefaultCurrency string `json:"default_currency" gorm:"size:3;default:'CZK'"`
|
||||
|
||||
// Email settings
|
||||
EmailFrom string `json:"email_from" gorm:"size:255"`
|
||||
EmailSubject string `json:"email_subject" gorm:"size:255;default:'Faktura č. {invoice_number}'"`
|
||||
EmailBody string `json:"email_body" gorm:"type:text"`
|
||||
|
||||
// PDF settings
|
||||
PDFLogoPath string `json:"pdf_logo_path" gorm:"size:500"`
|
||||
PDFFooter string `json:"pdf_footer" gorm:"type:text"`
|
||||
|
||||
// Legal information
|
||||
RegistrationNumber string `json:"registration_number" gorm:"size:50"`
|
||||
TaxRegistrationNumber string `json:"tax_registration_number" gorm:"size:50"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
UpdatedBy uint `json:"updated_by"`
|
||||
}
|
||||
|
||||
// InvoiceSequence represents invoice number sequences
|
||||
type InvoiceSequence struct {
|
||||
ID uint `json:"id" gorm:"primaryKey"`
|
||||
|
||||
// Sequence identification
|
||||
Type string `json:"type" gorm:"size:50;not null"` // "faktura", "zalohova_faktura", "proforma_faktura", "dobropis"
|
||||
Year int `json:"year" gorm:"not null"`
|
||||
|
||||
// Sequence numbers
|
||||
CurrentNumber int `json:"current_number" gorm:"default:1"`
|
||||
Prefix string `json:"prefix" gorm:"size:20"`
|
||||
Suffix string `json:"suffix" gorm:"size:20"`
|
||||
Padding int `json:"padding" gorm:"default:6"`
|
||||
|
||||
// Metadata
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
Reference in New Issue
Block a user