Nothing
## ---- include=FALSE, cache=FALSE----------------------------------------------
library(businessPlanR)
## ---- set-options, echo=FALSE, cache=FALSE-----------------------------------------
old_options <- options(width=85)
## ----------------------------------------------------------------------------------
set_types(
types=list(
"Obst"=rgb(0.1,0.9,0.2,0.8),
"Gemüse"=rgb(0.2,0.9,0.4,0.8),
"Merchandise"=rgb(0.3,0.8,0.3,0.8),
"Kreditaufnahme"=rgb(0.3,0.7,0.2,0.8)
),
class="revenue",
name="Saftladen"
)
## ----------------------------------------------------------------------------------
options("businessPlanR")
## ----------------------------------------------------------------------------------
set_types(
types=list(
"Löhne und Gehälter"=rgb(0.7,0.2,0.4,0.8),
"Sozialabgaben"=rgb(0.7,0.2,0.4,0.8),
"Waren"=rgb(0.7,0.3,0.5,0.8),
"Infrastruktur"=rgb(0.75,0.2,0.4,0.8),
"Abschreibung"=rgb(0.9,0.2,0.4,0.8),
"Kredittilgung"=rgb(0.9,0.2,0.4,0.8),
"Zinsen"=rgb(0.9,0.2,0.4,0.8),
"Steuern"=rgb(0.9,0.2,0.4,0.8)
),
class="expense",
name="Saftladen"
)
## ----------------------------------------------------------------------------------
saftladen_2024_2026 <- operations(
period=c("2024.01", "2026.12")
)
## ----------------------------------------------------------------------------------
# By default, revenues are repeated every month until
# the value changes.
rev_merch_2024_2026 <- revenue(
type="Merchandise",
category="Merch",
name="T-Shirts",
valid_types="Saftladen",
"2024.03"=30,
"2024.08"=40,
"2025.03"=50,
"2025.09"=70,
"2026.02"=90,
"2026.07"=100,
"2026.10"=110
)
# We plan to produce our T-shirts in January each year.
# Since these expenses should not be repeated every month,
# we can set missing="0"; alternatives are "rep" for repeat
# (default) or "interpol" for automatic interpolation.
exp_merch_2024_2026 <- expense(
type="Waren",
category="Merch",
name="T-Shirts",
missing="0",
valid_types="Saftladen",
"2024.01"=200,
"2025.01"=400,
"2026.01"=600
)
## ----------------------------------------------------------------------------------
get_value(rev_merch_2024_2026)
get_value(exp_merch_2024_2026)
## ----------------------------------------------------------------------------------
# By default, the sales are repeated each month until
# the value changes.
rev_merch_2024_2026 <- revenue(
type="Merchandise",
category="Merch",
name="T-Shirts",
per_use=10,
valid_types="Saftladen",
"2024.03"=3,
"2024.08"=4,
"2025.03"=5,
"2025.09"=7,
"2026.02"=9,
"2026.07"=10,
"2026.10"=11
)
get_value(rev_merch_2024_2026)
## ----------------------------------------------------------------------------------
get_value(rev_merch_2024_2026, resolution="quarter")
get_value(exp_merch_2024_2026, resolution="year")
## ----------------------------------------------------------------------------------
update_operations(saftladen_2024_2026) <- rev_merch_2024_2026
update_operations(saftladen_2024_2026) <- exp_merch_2024_2026
## ----------------------------------------------------------------------------------
saftladen_inc_stamt <- table_model(
# Gross income from various sources
"Bruttoeinnahmen"=model_node(
revenue=c(
"Obst",
"Gemüse",
"Merchandise"
)
),
# Gross revenue, i.e. minus costs of goods
"Bruttoertrag"=model_node(
carry="Bruttoeinnahmen",
expense=c(
"Waren"
)
),
# Gross profit, i.e. minus operating and depreciation expenses
"Betriebsergebnis"=model_node(
carry="Bruttoertrag",
expense=c(
"Löhne und Gehälter",
"Sozialabgaben",
"Infrastruktur",
"Abschreibung"
)
),
# Operating profit, i.e. minus interest expenses
"Gewinn vor Steuern"=model_node(
carry="Betriebsergebnis",
expense=c(
"Zinsen"
)
),
# Profit after taxes
"Nettogewinn"=model_node(
carry="Gewinn vor Steuern",
expense=c(
"Steuern"
)
),
valid_types="Saftladen"
)
## ----------------------------------------------------------------------------------
condense(
saftladen_2024_2026,
model=saftladen_inc_stamt
)
## ----------------------------------------------------------------------------------
condense(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="quarter"
)
## ----------------------------------------------------------------------------------
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year"
)
## ----------------------------------------------------------------------------------
# Apples
update_operations(saftladen_2024_2026) <- revenue(
type="Obst",
category="Obst",
name="Äpfel",
valid_types="Saftladen",
"2024.01"=2200,
"2024.08"=3000,
"2024.09"=3400,
"2024.12"=2600,
"2025.01"=2300,
"2025.08"=3100,
"2025.09"=3500,
"2025.12"=2700,
"2026.01"=2400,
"2026.08"=3200,
"2026.09"=3600,
"2026.12"=2800
)
update_operations(saftladen_2024_2026) <- expense(
type="Waren",
category="Obst",
name="Äpfel",
valid_types="Saftladen",
"2024.01"=1650,
"2024.08"=2250,
"2024.09"=2550,
"2024.12"=1950,
"2025.01"=1725,
"2025.08"=2325,
"2025.09"=2625,
"2025.12"=2025,
"2026.01"=1800,
"2026.08"=2400,
"2026.09"=2700,
"2026.12"=2100
)
# Grapes
update_operations(saftladen_2024_2026) <- revenue(
type="Obst",
category="Obst",
name="Trauben",
missing="interpol",
valid_types="Saftladen",
"2024.01"=480,
"2025.01"=590,
"2026.01"=730,
"2026.12"=820
)
update_operations(saftladen_2024_2026) <- expense(
type="Waren",
category="Obst",
name="Trauben",
missing="interpol",
valid_types="Saftladen",
"2024.01"=340,
"2025.01"=410,
"2026.01"=510,
"2026.12"=580
)
# Potatoes
update_operations(saftladen_2024_2026) <- revenue(
type="Gemüse",
category="Gemüse",
name="Kartoffeln",
missing="interpol",
valid_types="Saftladen",
"2024.01"=2440,
"2025.01"=2670,
"2026.01"=2800,
"2026.12"=2980
)
update_operations(saftladen_2024_2026) <- expense(
type="Waren",
category="Gemüse",
name="Kartoffeln",
missing="interpol",
valid_types="Saftladen",
"2024.01"=1950,
"2025.01"=2130,
"2026.01"=2240,
"2026.12"=2400
)
## ----------------------------------------------------------------------------------
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year"
)
## ----------------------------------------------------------------------------------
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year",
detailed=TRUE
)
## ----------------------------------------------------------------------------------
dep_cashreg1 <- depreciation(
type="Abschreibung",
category="Laden",
name="Kasse 1",
amount=450,
obsolete=72,
invest_month="2024.01",
valid_types="Saftladen"
)
dep_cashreg2 <- depreciation(
type="Abschreibung",
category="Laden",
name="Kasse 2",
amount=450,
obsolete=72,
invest_month="2025.07",
valid_types="Saftladen"
)
## ----------------------------------------------------------------------------------
update_operations(
saftladen_2024_2026,
as_transaction=list(
c(
to="expense",
aspect="investment",
valid_types="Saftladen",
type="Infrastruktur"
),
c(
to="expense",
aspect="depreciation",
valid_types="Saftladen",
type="Abschreibung"
)
)
) <- dep_cashreg1
update_operations(
saftladen_2024_2026,
as_transaction=list(
c(
to="expense",
aspect="investment",
valid_types="Saftladen",
type="Infrastruktur"
),
c(
to="expense",
aspect="depreciation",
valid_types="Saftladen",
type="Abschreibung"
)
)
) <- dep_cashreg2
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year"
)
## ----------------------------------------------------------------------------------
dep_plan <- transaction_plan(plan_type="depreciation")
update_plan(dep_plan) <- dep_cashreg1
update_plan(dep_plan) <- dep_cashreg2
kable_bpR(
dep_plan,
dep_names=c(
investment="Investition",
depreciation="Abschreibung",
value="Wert",
sum="Summe"
),
resolution="year",
years=2024:2029
)
## ----------------------------------------------------------------------------------
loan_2024 <- loan(
type="Kreditaufnahme",
category="Bank",
name="Anschubfinanzierung",
amount=5000,
period=60,
interest=0.075,
first_month="2024.01",
schedule=c("amortization"),
valid_types="Saftladen"
)
update_operations(
saftladen_2024_2026,
as_transaction=list(
c(
to="expense",
aspect="principal",
valid_types="Saftladen",
type="Kredittilgung"
),
c(
to="expense",
aspect="interest",
valid_types="Saftladen",
type="Zinsen"
),
c(
to="revenue",
aspect="balance_start",
valid_types="Saftladen",
type="Kreditaufnahme"
)
)
) <- loan_2024
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year"
)
## ----------------------------------------------------------------------------------
loan_plan <- transaction_plan(plan_type="loan")
update_plan(loan_plan) <- loan_2024
kable_bpR(
loan_plan,
loan_names=c(
balance_start="Restschuld Beginn",
interest="Zinsen",
principal="Tilgung",
total="Zahlung",
cumsum="Kumuliert",
balance_remain="Restschuld Ende",
sum="Summe"
),
resolution="year"
)
## ----------------------------------------------------------------------------------
saftladen_cashflow <- table_model(
"Einzahlungen"=model_node(
revenue=c(
"Obst",
"Gemüse",
"Merchandise",
"Kreditaufnahme"
)
),
"Auszahlungen"=model_node(
expense=c(
"Löhne und Gehälter",
"Sozialabgaben",
"Infrastruktur",
"Waren",
"Zinsen",
"Kredittilgung",
"Steuern"
)
)
)
kable_bpR(
saftladen_2024_2026,
model=saftladen_cashflow,
resolution="year",
cashflow=TRUE
)
## ----------------------------------------------------------------------------------
assumed <- list(
total_customers=1860, # number of potential customers?
pct_year_1st=25, # how many of them will buy at our store?
pct_year_last=35, # how will the number progress?
pct_demand=30, # how much will they buy from us?
kg_per_customer=c( # how many Kg were cosumed in recent years?
apples=23
),
exp_per_kg=c( # how much will it cost to buy goods?
apples=2.3
),
rev_per_kg=c( # at what price will we sell?
apples=3.49
)
)
## ----------------------------------------------------------------------------------
n_customers <- function(data, years){
customer_pct <- seq(
from=data[["pct_year_1st"]],
to=data[["pct_year_last"]],
length.out=length(years)
) / 100
result <- round(data[["total_customers"]] * customer_pct)
names(result) <- years
return(result)
}
n_customers(data=assumed, years=2024:2026)
## ----------------------------------------------------------------------------------
kg_sale <- function(what, data, years){
avg_amount_total <- data[["kg_per_customer"]][[what]]
result <- round(
avg_amount_total *
(data[["pct_demand"]] / 100) *
n_customers(data=data, years=years)
)
return(result)
}
kg_sale(what="apples", data=assumed, years=2024:2026)
## ----------------------------------------------------------------------------------
spread_sales <- function(what, distribution, data, years){
yearly_sales <- kg_sale(what=what, data=data, years=years)
distrib <- round(as.vector(sapply(
yearly_sales,
function(kg){
kg * distribution
}
)))
names(distrib) <- paste0(rep(years, each=length(distribution)), names(distribution))
return(distrib)
}
sales_apples_kg <- spread_sales(
what="apples",
distribution=c(
".01"=0.20,
".08"=0.27,
".09"=0.30,
".12"=0.23
),
data=assumed,
years=2024:2026
)
# multiply by prices
(sales_apples_expense <- round(sales_apples_kg * assumed[["exp_per_kg"]][["apples"]]))
(sales_apples_revenue <- round(sales_apples_kg * assumed[["rev_per_kg"]][["apples"]]))
## ----------------------------------------------------------------------------------
update_operations(saftladen_2024_2026) <- revenue(
type="Obst",
category="Obst",
name="Äpfel",
valid_types="Saftladen",
.list=as.list(sales_apples_revenue)
)
update_operations(saftladen_2024_2026) <- expense(
type="Waren",
category="Obst",
name="Äpfel",
valid_types="Saftladen",
.list=as.list(sales_apples_expense)
)
kable_bpR(
saftladen_2024_2026,
model=saftladen_inc_stamt,
resolution="year"
)
## ---- reset-options, echo=FALSE, cache=FALSE----------------------------------
options(old_options)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.