Skip to content

Commit 064364a

Browse files
Merge pull request #133 from NessieCanCode/extract-sections-into-functions
Refactor invoice generation into reusable sections
2 parents 8a9be0d + 96a89ac commit 064364a

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

src/invoice.py

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,12 @@ def _profile_sections(profile):
8383
[line for line in to_info if line.strip()])
8484

8585

86-
def generate_invoice(buffer, invoice_data):
87-
"""Create the PDF invoice into ``buffer``."""
88-
doc = SimpleDocTemplate(
89-
buffer,
90-
pagesize=LETTER,
91-
rightMargin=40,
92-
leftMargin=40,
93-
topMargin=40,
94-
bottomMargin=40,
95-
)
96-
styles = getSampleStyleSheet()
97-
styles.add(ParagraphStyle(name="RightAlign", parent=styles["Normal"], alignment=TA_RIGHT))
98-
styles.add(ParagraphStyle(name="Heading", parent=styles["Heading1"], fontSize=16, spaceAfter=10))
99-
styles.add(ParagraphStyle(name="SubHeading", parent=styles["Heading2"], fontSize=12, spaceAfter=8))
100-
101-
elements = []
102-
elements.append(Paragraph("Recharge Services Invoice", styles["Heading"]))
103-
elements.append(Spacer(1, 12))
86+
def _header_elements(invoice_data, styles):
87+
"""Return flowables for the invoice header section."""
88+
elements = [
89+
Paragraph("Recharge Services Invoice", styles["Heading"]),
90+
Spacer(1, 12),
91+
]
10492

10593
header_table_data = [
10694
[
@@ -113,8 +101,7 @@ def generate_invoice(buffer, invoice_data):
113101
],
114102
]
115103
header_table = Table(header_table_data, colWidths=[250, 250])
116-
elements.append(header_table)
117-
elements.append(Spacer(1, 20))
104+
elements.extend([header_table, Spacer(1, 20)])
118105

119106
elements.append(Paragraph("<b>From (Billed By)</b>", styles["SubHeading"]))
120107
for line in invoice_data["from_info"]:
@@ -126,7 +113,12 @@ def generate_invoice(buffer, invoice_data):
126113
elements.append(Paragraph(line, styles["Normal"]))
127114
elements.append(Spacer(1, 20))
128115

129-
elements.append(Paragraph("<b>Invoice Summary</b>", styles["SubHeading"]))
116+
return elements
117+
118+
119+
def _table_elements(invoice_data, styles):
120+
"""Return flowables for the invoice summary table."""
121+
elements = [Paragraph("<b>Invoice Summary</b>", styles["SubHeading"])]
130122
table_data = [["Description", "Billing Period", "Qty / Units", "Rate", "Amount"]]
131123
for item in invoice_data["items"]:
132124
table_data.append(
@@ -155,18 +147,21 @@ def generate_invoice(buffer, invoice_data):
155147
]
156148
)
157149
)
158-
elements.append(table)
159-
elements.append(Spacer(1, 20))
150+
elements.extend([table, Spacer(1, 20)])
151+
return elements
160152

161-
elements.append(Paragraph("Payment Instructions", styles["SubHeading"]))
153+
154+
def _note_elements(invoice_data, styles):
155+
"""Return flowables for payment instructions and notes."""
156+
elements = [Paragraph("Payment Instructions", styles["SubHeading"])]
162157
for line in invoice_data["bank_info"]:
163158
elements.append(Paragraph(line, styles["Normal"]))
164159
elements.append(Spacer(1, 20))
165160

166161
elements.append(Paragraph("Notes", styles["SubHeading"]))
167162
elements.append(Paragraph(invoice_data["notes"], styles["Normal"]))
168-
169163
elements.append(Spacer(1, 20))
164+
170165
elements.append(
171166
Paragraph(
172167
"Generated by Recharge Management System on "
@@ -175,6 +170,28 @@ def generate_invoice(buffer, invoice_data):
175170
styles["Normal"],
176171
)
177172
)
173+
return elements
174+
175+
176+
def generate_invoice(buffer, invoice_data):
177+
"""Create the PDF invoice into ``buffer``."""
178+
doc = SimpleDocTemplate(
179+
buffer,
180+
pagesize=LETTER,
181+
rightMargin=40,
182+
leftMargin=40,
183+
topMargin=40,
184+
bottomMargin=40,
185+
)
186+
styles = getSampleStyleSheet()
187+
styles.add(ParagraphStyle(name="RightAlign", parent=styles["Normal"], alignment=TA_RIGHT))
188+
styles.add(ParagraphStyle(name="Heading", parent=styles["Heading1"], fontSize=16, spaceAfter=10))
189+
styles.add(ParagraphStyle(name="SubHeading", parent=styles["Heading2"], fontSize=12, spaceAfter=8))
190+
191+
elements = []
192+
elements.extend(_header_elements(invoice_data, styles))
193+
elements.extend(_table_elements(invoice_data, styles))
194+
elements.extend(_note_elements(invoice_data, styles))
178195

179196
doc.build(elements)
180197

0 commit comments

Comments
 (0)