aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/invoice/invoice.go
blob: 9cbc4e765692719fe7c13fc931934d151ae26caa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* openbills - Server for web based Libre Billing Software
 * Copyright (C) 2023-2025  Vidhu Kant Sharma <vidhukant@vidhukant.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package invoice

import (
	"gorm.io/gorm"
	"time"
	d "vidhukant.com/openbills/db"
	u "vidhukant.com/openbills/util"
)

var db *gorm.DB

func init() {
	db = d.DB

	db.AutoMigrate(&Invoice{}, &InvoiceItem{}, &CustomField{})
}

type InvoiceItem struct {
	ID        uint
	InvoiceID uint
	Quantity  string // float
	// fields below these must be kept in sync with
	// item.SavedItem. I'm not extending that struct because
	// there are some things that I don't want / want in a
	// different format. In short, it's *not* worth the headache
	Name          string
	BrandName     string
	Category      string
	Description   string
	HSN           string
	UnitOfMeasure string
	VariantName   string
	UnitPrice     string // float
	GSTPercentage string // float
}

// user can add as many custom fields as they like
type CustomField struct {
	ID        uint
	InvoiceID uint
	Key       string
	Value     string
}

type Invoice struct {
	gorm.Model
	InvoiceDate   time.Time
	InvoiceNumber uint
	IsDraft       bool
	Note          string
	Items         []InvoiceItem
	CustomFields  []CustomField

	BillingAddressText       string
	BillingAddressCity       string
	BillingAddressState      string
	BillingAddressPostalCode string
	BillingAddressCountry    string

	ShippingAddressText       string
	ShippingAddressCity       string
	ShippingAddressState      string
	ShippingAddressPostalCode string
	ShippingAddressCountry    string

	IssuerFirmName    string
	IssuerFirmGstin   string
	IssuerFirmPhone   string
	IssuerFirmEmail   string
	IssuerFirmWebsite string

	IssuerFirmAddressText       string
	IssuerFirmAddressCity       string
	IssuerFirmAddressState      string
	IssuerFirmAddressPostalCode string
	IssuerFirmAddressCountry    string

	CustomerName        string
	CustomerGstin       string
	CustomerContactName string
	CustomerPhone       string
	CustomerEmail       string
	CustomerWebsite     string
}