@@ -2,113 +2,19 @@ package theatre
22
33import (
44 "fmt"
5- "math"
65
76 "github.com/leekchan/accounting"
87)
98
109type 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-
2711func (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
11420func renderPlayText (data StatementData ) (string , error ) {
0 commit comments