-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpythonic_latex_invoice.py
More file actions
139 lines (104 loc) · 3.7 KB
/
pythonic_latex_invoice.py
File metadata and controls
139 lines (104 loc) · 3.7 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import argparse
import json
import os
import uuid
import shutil
import os.path
from datetime import date
from datetime import timedelta
def main():
config = get_config()
init(config)
populated_latex_src = populate_latex_src(config)
populated_latex_file_name = create_populated_latex_file(populated_latex_src, config)
compile_populated_latex_file(populated_latex_file_name)
clean_up(populated_latex_file_name)
shutil.move(config["output_file_name"] + ".pdf", "../")
def get_config():
config_file_name = parse_args()["config"]
config = {}
with open(config_file_name) as config_file:
config = json.load(config_file)
config["output_file_name"] = get_output_file_name(config_file_name)
return config
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--config", default="config.json")
return vars(parser.parse_args())
def get_output_file_name(config_file_name):
return config_file_name.replace("json", "").replace(".", "")
def init(config):
file = config["output_file_name"] + ".pdf"
os.path.isfile(file)
if os.path.isfile(file):
os.system(f"rm {file}")
def populate_latex_src(config):
with open("src/src.tex", "r") as file:
content = file.read()
content = (
content.replace("#bank_details#", config["bank_details"])
.replace("#my_name#", get_my_name(config["address"]))
.replace("#email#", config["email"])
.replace("#phone#", config["phone"])
.replace("#address#", make_latex_string(config["address"]))
.replace("#client_name#", get_client_name(config["client_address"]))
.replace("#client_address#", make_latex_string(config["client_address"]))
.replace("#id#", str(uuid.uuid4())[:4])
.replace("#due_date#", get_due_date())
.replace("#current_date#", date.today().strftime("%d.%m.%Y"))
.replace("#work_realized#", get_work_realized(config["work_realized"]))
.replace("#payment_sum#", calculate_sum(config["work_realized"]))
.replace("#custom_text#", config["custom_text"])
.replace("#footer#", get_footer(config))
.replace("#bank_details#", config["bank_details"])
)
return content
def get_client_name(client_address):
return client_address[0]
def get_my_name(address):
return address[0]
def get_due_date():
return (date.today() + timedelta(days=14)).strftime("%d.%m.%Y")
def make_latex_string(arr):
res = ""
for item in arr:
res += f"{item}\\\\"
return res
def get_work_realized(work_realized):
res = ""
for item in work_realized:
description = item["description"]
payment = item["payment"]
res += f"{description}& {payment} €\\\\"
res += "~&~\\\\"
sum = calculate_sum(work_realized)
res += f"\\textbf{{SUMME}} & \\textbf{{{sum}}} €"
return res
def calculate_sum(work_realized):
sum = 0
for item in work_realized:
sum += int(item["payment"])
return str(sum)
def get_footer(config):
res = ""
for item in config["address"]:
res += item + " | "
res += config["tax_id"] + " | "
res += config["homepage"]
return res
def create_populated_latex_file(content, config):
file_name = config["output_file_name"] + ".tex"
with open("src/" + file_name, "w") as the_file:
the_file.write(content)
return file_name
def compile_populated_latex_file(filename):
os.chdir("src")
os.system(f"xelatex {filename}")
os.system(f"xelatex {filename}")
def clean_up(populated_latex_file_name):
os.system("rm *.aux")
os.system("rm *.log")
os.system("rm *.out")
os.system(f"rm {populated_latex_file_name}")
if __name__ == "__main__":
main()