///|
fn statement_name(kind : StatementKind) -> String {
match kind {
BalanceSheet => "balance_sheet"
IncomeStatement => "income_statement"
CashFlowStatement => "cash_flow_statement"
Management => "management"
}
}
///|
fn escape_csv(value : String) -> String {
if value.contains(",") || value.contains("\"") {
"\"" + value.replace(old="\"", new="\"\"") + "\""
} else {
value
}
}
///|
pub fn Report::to_csv(self : Report) -> String {
let out = StringBuilder::new()
out.write_string("statement,period,line,amount,entries\n")
for item in self.lines {
out.write_string(escape_csv(statement_name(self.kind)))
out.write_string(",")
out.write_string(escape_csv(self.period))
out.write_string(",")
out.write_string(escape_csv(item.line))
out.write_string(",")
out.write_string(item.amount.to_string())
out.write_string(",")
out.write_string(item.entries.to_string())
out.write_string("\n")
}
out.write_string("TOTAL,")
out.write_string(self.period)
out.write_string(",,")
out.write_string(self.total.to_string())
out.write_string(",\n")
out.to_string()
}
///|
pub fn Report::to_json(self : Report) -> String {
let parts : Array[String] = []
for item in self.lines {
parts.push(
"{\"line\":\"" +
item.line.replace(old="\"", new="\\\"") +
"\",\"amount\":" +
item.amount.to_string() +
",\"entries\":" +
item.entries.to_string() +
"}",
)
}
"{\"statement\":\"" +
statement_name(self.kind) +
"\",\"period\":\"" +
self.period +
"\",\"total\":" +
self.total.to_string() +
",\"lines\":[" +
parts.join(",") +
"]}"
}
///|
pub fn Report::to_markdown(self : Report) -> String {
let out = StringBuilder::new()
out.write_string("| Line | Amount | Entries |\n| --- | ---: | ---: |\n")
for item in self.lines {
out.write_string(
"| " +
item.line +
" | " +
item.amount.to_string() +
" | " +
item.entries.to_string() +
" |\n",
)
}
out.write_string("| **Total** | **" + self.total.to_string() + "** | |\n")
out.to_string()
}