Skip to content

Commit db24baf

Browse files
committed
Move StatementData to file and create func
1 parent e85250e commit db24baf

File tree

2 files changed

+111
-97
lines changed

2 files changed

+111
-97
lines changed

refactoring/theatre-practice/statement.go

Lines changed: 3 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -2,113 +2,19 @@ package theatre
22

33
import (
44
"fmt"
5-
"math"
65

76
"github.com/leekchan/accounting"
87
)
98

109
type StatementPrinter struct{}
1110

12-
type StatementData struct {
13-
Customer string
14-
Performances []EnrichedPerformance
15-
TotalAmount int
16-
TotalVolumeCredits int
17-
plays map[string]Play
18-
}
19-
20-
type EnrichedPerformance struct {
21-
Name string
22-
Amount int
23-
Audience int
24-
Type string
25-
}
26-
2711
func (s StatementPrinter) Print(invoice Invoice, plays map[string]Play) (string, error) {
28-
statementData := StatementData{}
29-
statementData.plays = plays
30-
statementData.Customer = invoice.Customer
31-
32-
enrichedPerformances := []EnrichedPerformance{}
33-
for _, perf := range invoice.Performances {
34-
ep, err := statementData.enrichPerformance(perf)
35-
if err != nil {
36-
return "", err
37-
}
38-
enrichedPerformances = append(enrichedPerformances, ep)
39-
}
40-
statementData.Performances = enrichedPerformances
41-
42-
statementData.TotalAmount = statementData.totalAmount()
43-
statementData.TotalVolumeCredits = statementData.totalVolumeCredits()
44-
45-
return renderPlayText(statementData)
46-
}
47-
48-
func (s StatementData) enrichPerformance(perf Performance) (EnrichedPerformance, error) {
49-
result := EnrichedPerformance{}
50-
amount, err := s.amount(perf)
12+
statementData, err := CreateStatementData(invoice, plays)
5113
if err != nil {
52-
return EnrichedPerformance{}, err
14+
return "", err
5315
}
54-
result.Amount = amount
55-
result.Audience = perf.Audience
56-
result.Name = s.playFor(perf).Name
57-
result.Type = s.playFor(perf).Type
58-
59-
return result, nil
60-
}
6116

62-
func (s StatementData) amount(perf Performance) (int, error) {
63-
result := 0
64-
65-
switch s.playFor(perf).Type {
66-
case "tragedy":
67-
result = 40000
68-
if perf.Audience > 30 {
69-
result += 1000 * (perf.Audience - 30)
70-
}
71-
case "comedy":
72-
result = 30000
73-
if perf.Audience > 20 {
74-
result += 10000 + 500*(perf.Audience-20)
75-
}
76-
result += 300 * perf.Audience
77-
default:
78-
return 0, fmt.Errorf("unknown type: %s", s.playFor(perf).Type)
79-
}
80-
81-
return result, nil
82-
}
83-
84-
func (s StatementData) playFor(perf Performance) Play {
85-
return s.plays[perf.PlayID]
86-
}
87-
88-
func (s StatementData) totalAmount() int {
89-
result := 0
90-
for _, perf := range s.Performances {
91-
result += perf.Amount
92-
}
93-
return result
94-
}
95-
96-
func (s StatementData) totalVolumeCredits() int {
97-
result := 0
98-
for _, perf := range s.Performances {
99-
result += s.volumeCreditsFor(perf)
100-
}
101-
return result
102-
}
103-
104-
func (StatementData) volumeCreditsFor(perf EnrichedPerformance) int {
105-
result := 0
106-
result += int(math.Max(float64(perf.Audience)-30, 0))
107-
108-
if perf.Type == "comedy" {
109-
result += int(math.Floor(float64(perf.Audience) / 5))
110-
}
111-
return result
17+
return renderPlayText(statementData)
11218
}
11319

11420
func renderPlayText(data StatementData) (string, error) {
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package theatre
2+
3+
import (
4+
"fmt"
5+
"math"
6+
)
7+
8+
type StatementData struct {
9+
Customer string
10+
Performances []enrichedPerformance
11+
TotalAmount int
12+
TotalVolumeCredits int
13+
plays map[string]Play
14+
}
15+
16+
type enrichedPerformance struct {
17+
Name string
18+
Amount int
19+
Audience int
20+
Type string
21+
}
22+
23+
func CreateStatementData(invoice Invoice, plays map[string]Play) (StatementData, error) {
24+
result := StatementData{}
25+
result.plays = plays
26+
result.Customer = invoice.Customer
27+
28+
enrichedPerformances := []enrichedPerformance{}
29+
for _, perf := range invoice.Performances {
30+
ep, err := result.enrichPerformance(perf)
31+
if err != nil {
32+
return StatementData{}, err
33+
}
34+
enrichedPerformances = append(enrichedPerformances, ep)
35+
}
36+
result.Performances = enrichedPerformances
37+
38+
result.TotalAmount = result.totalAmount()
39+
result.TotalVolumeCredits = result.totalVolumeCredits()
40+
41+
return result, nil
42+
}
43+
44+
func (s StatementData) enrichPerformance(perf Performance) (enrichedPerformance, error) {
45+
result := enrichedPerformance{}
46+
amount, err := s.amount(perf)
47+
if err != nil {
48+
return enrichedPerformance{}, err
49+
}
50+
result.Amount = amount
51+
result.Audience = perf.Audience
52+
result.Name = s.playFor(perf).Name
53+
result.Type = s.playFor(perf).Type
54+
55+
return result, nil
56+
}
57+
58+
func (s StatementData) amount(perf Performance) (int, error) {
59+
result := 0
60+
61+
switch s.playFor(perf).Type {
62+
case "tragedy":
63+
result = 40000
64+
if perf.Audience > 30 {
65+
result += 1000 * (perf.Audience - 30)
66+
}
67+
case "comedy":
68+
result = 30000
69+
if perf.Audience > 20 {
70+
result += 10000 + 500*(perf.Audience-20)
71+
}
72+
result += 300 * perf.Audience
73+
default:
74+
return 0, fmt.Errorf("unknown type: %s", s.playFor(perf).Type)
75+
}
76+
77+
return result, nil
78+
}
79+
80+
func (s StatementData) playFor(perf Performance) Play {
81+
return s.plays[perf.PlayID]
82+
}
83+
84+
func (s StatementData) totalAmount() int {
85+
result := 0
86+
for _, perf := range s.Performances {
87+
result += perf.Amount
88+
}
89+
return result
90+
}
91+
92+
func (s StatementData) totalVolumeCredits() int {
93+
result := 0
94+
for _, perf := range s.Performances {
95+
result += s.volumeCreditsFor(perf)
96+
}
97+
return result
98+
}
99+
100+
func (StatementData) volumeCreditsFor(perf enrichedPerformance) int {
101+
result := 0
102+
result += int(math.Max(float64(perf.Audience)-30, 0))
103+
104+
if perf.Type == "comedy" {
105+
result += int(math.Floor(float64(perf.Audience) / 5))
106+
}
107+
return result
108+
}

0 commit comments

Comments
 (0)