This repository has been archived by the owner on Jan 10, 2023. It is now read-only.
/
types.go
100 lines (79 loc) · 1.66 KB
/
types.go
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
package main
import (
"gorm.io/gorm"
)
type Trip struct {
gorm.Model
Name string
OwnerID int
ChatID int64
Language string
Members []TripMember
}
type TripMember struct {
gorm.Model
UserID int
Username string
FirstName string
TripID uint
Trip Trip
}
type Expense struct {
gorm.Model
Description string
Amount int
TripID uint
PayingID uint
TripMember TripMember `gorm:"foreignKey:PayingID"`
Trip Trip
}
type Debt struct {
gorm.Model
ExpenseID uint
DebtorID uint
Amount uint
IsClosed bool
}
func (trip *Trip) addMember(userID int, username string, name string) *TripMember {
member := TripMember {
UserID: userID,
TripID: trip.ID,
Username: username,
FirstName: name,
}
db.Create(&member)
return &member
}
func (trip *Trip) addExpense(payingID int, amount int, description string) (*Expense, error) {
var member TripMember
result := db.Where("user_id", payingID).Where("trip_id", trip.ID).Find(&member)
if result.Error != nil {
return nil, newError("you-are-not-a-trip-member")
}
expense := &Expense {
Amount: amount,
TripID: trip.ID,
PayingID: member.ID,
Description: description,
}
db.Create(expense)
return expense, nil
}
func (expense *Expense) split(payingID int) {
var members []TripMember
db.Where("trip_id", expense.TripID).Where("user_id <> ?", payingID).Find(&members)
debtSum := expense.Amount / (len(members) + 1)
for _, member := range members {
member.addDebt(expense.ID, uint(debtSum))
}
}
func (member *TripMember) addDebt(expenseID uint, memberDebt uint) *Debt {
debt := &Debt {
ExpenseID: expenseID,
DebtorID: member.ID,
Amount: memberDebt,
IsClosed: false,
}
db.Create(debt)
return debt
}