This commit is contained in:
2025-07-12 16:48:50 +04:00
parent ca6fc6f7a5
commit 545fd75d71
15 changed files with 279 additions and 161 deletions

View File

@@ -14,4 +14,6 @@ println(model.sheet)
println(model.sheet.export()!)
model.sheet.export(path: '~/Downloads/test.csv')!
model.sheet.export(path: '~/code/github/freeflowuniverse/starlight_template/src/content/test.csv')!
// model.sheet.export(path: '~/code/github/freeflowuniverse/starlight_template/src/content/test.csv')!
model.sheet

View File

@@ -0,0 +1 @@
name:bizmodel_example

View File

@@ -0,0 +1,14 @@
# Bizmodel Params
In this section we can find all the parameters for the bizmodel.
## how to use and read
The params are defined in the different instruction files e.g. revenue_params.md
Often you will see something like `revenue_growth:'10:1000,20:1100'` this can be read as month 10 it 1000, month 20 its 1100.
The software will extrapolate.

View File

@@ -0,0 +1,85 @@
# HR Params
## Revenue Items (non recurring)
This company is a cloud company ...
- name, e.g. for a specific project
- descr, description of the revenue line item
- revenue_items: does one of revenue, is not exterpolated
- revenue_growth: is a revenue stream which is being extrapolated
- revenue_setup, revenue for 1 item '1000usd'
- revenue_setup_delay
- revenue_monthly, revenue per month for 1 item
- revenue_monthly_delay, how many months before monthly revenue starts
- maintenance_month_perc, how much percent of revenue_setup will come back over months
- cogs_setup, cost of good for 1 item at setup
- cogs_setup_delay, how many months before setup cogs starts, after sales
- cogs_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_monthly, cost of goods for the monthly per 1 item
- cogs_monthly_delay, how many months before monthly cogs starts, after sales
- cogs_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
- nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200, default is 1)
- nr_months_recurring: how many months is recurring, if 0 then no recurring
```js
!!bizmodel.revenue_define bizname:'test'
descr:'OEM Deals'
revenue_items:'10:1000000EUR,15:3333,20:1200000'
cogs_setup_perc: '1:5%,20:10%'
!!bizmodel.revenue_define bizname:'test'
descr:'License Deals'
revenue_growth:'10:1000,20:1100'
cogs_perc: '10%'
rev_delay_month: 1
!!bizmodel.revenue_define bizname:'test'
descr:'3NODE License Sales 1 Time'
//means revenue is 100 month 1, 200 month 60
revenue_item:'1:100,60:200'
revenue_nr:'10:1000,24:2000,60:40000'
cogs_perc: '10%'
rev_delay_month: 1
```
## Revenue Items Recurring
possible parameters
- name, e.g. for a specific project
- descr, description of the revenue line item
- revenue_setup, revenue for 1 item '1000usd'
- revenue_monthly, revenue per month for 1 item
- revenue_setup_delay, how many months before revenue comes in after sales
- revenue_monthly_delay, how many months before monthly revenue starts
- cogs_setup, cost of good for 1 item at setup
- cogs_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_monthly, cost of goods for the monthly per 1 item
- cogs_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
- nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200)
- nr_months: how many months is recurring
if currency not specified then is always in USD
```js
!!bizmodel.revenue_recurring_define bizname:'test'
name: '3node_lic'
descr:'3NODE License Sales Recurring Basic'
revenue_setup:'1:100,60:50'
// revenue_setup:'5'
revenue_monthly_delay:3
revenue_monthly:'1:1,60:1'
// cogs_setup:'1:0'
cogs_setup_perc:'50%'
revenue_setup_delay:1
cogs_monthly_perc:'50%'
nr_sold:'10:1000,24:2000,60:40000'
60 is the default
nr_months:60
```

View File

@@ -1,85 +1,44 @@
# HR Params
## Revenue Items (non recurring)
This company is a cloud company ...
- name, e.g. for a specific project
- bizname, is the name of the biz model we are populating
- name, name of product, project
- descr, description of the revenue line item
- revenue_items: does one of revenue, is not exterpolated
- revenue_growth: is a revenue stream which is being extrapolated
- revenue_setup, revenue for 1 item '1000usd'
- revenue_setup_delay
- revenue_monthly, revenue per month for 1 item
- revenue_monthly_delay, how many months before monthly revenue starts
- maintenance_month_perc, how much percent of revenue_setup will come back over months
- cogs_setup, cost of good for 1 item at setup
- cogs_setup_delay, how many months before setup cogs starts, after sales
- cogs_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_monthly, cost of goods for the monthly per 1 item
- cogs_monthly_delay, how many months before monthly cogs starts, after sales
- cogs_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
## descrete revenue (not per item)
- revenue: one of revenue, is not extrapolated, a deal at certain time
- revenue_growth: is a revenue stream which is being extrapolated
- cogs_percent: percent of revenue
- cogs_delay: delay in months between cogs and revenue
## grouped per items sold
- nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200, default is 1)
- nr_months_recurring: how many months is recurring, if 0 then no recurring
- nr_months_recurring: e.g. 60 is 5 years
- revenue_item_setup, revenue for 1 item '1000usd'
- revenue_item_setup_delay, delay between sell and recognition of sale in months
- revenue_item_monthly, revenue per month for 1 item
- revenue_item_monthly_delay, how many months before monthly revenue starts
- revenue_item_maintenance_perc, how much percent of revenue_item_setup will come back over months
- cogs_item_setup, cost of good for 1 item at setup
- cogs_item_setup_delay, how many months before setup cogs starts, after sales
- cogs_item_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_item_monthly, cost of goods for the monthly per 1 item
- cogs_item_monthly_delay, how many months before monthly cogs starts, after sales
- cogs_item_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
## results in
- revenue_total which is per product
- cogs_total
```js
!!bizmodel.revenue_define bizname:'test'
!!bizmodel.revenue_define bizname:'test' name:'oem1'
descr:'OEM Deals'
revenue_items:'10:1000000EUR,15:3333,20:1200000'
cogs_setup_perc: '1:5%,20:10%'
!!bizmodel.revenue_define bizname:'test'
descr:'License Deals'
revenue_growth:'10:1000,20:1100'
cogs_perc: '10%'
rev_delay_month: 1
!!bizmodel.revenue_define bizname:'test'
descr:'3NODE License Sales 1 Time'
//means revenue is 100 month 1, 200 month 60
revenue_item:'1:100,60:200'
revenue_nr:'10:1000,24:2000,60:40000'
cogs_perc: '10%'
rev_delay_month: 1
revenue:'10:1000000EUR,15:3333,20:1200000'
cogs_percent: '1:5%,20:10%'
```
## Revenue Items Recurring
possible parameters
- name, e.g. for a specific project
- descr, description of the revenue line item
- revenue_setup, revenue for 1 item '1000usd'
- revenue_monthly, revenue per month for 1 item
- revenue_setup_delay, how many months before revenue comes in after sales
- revenue_monthly_delay, how many months before monthly revenue starts
- cogs_setup, cost of good for 1 item at setup
- cogs_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_monthly, cost of goods for the monthly per 1 item
- cogs_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
- nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200)
- nr_months: how many months is recurring
if currency not specified then is always in USD
```js
!!bizmodel.revenue_recurring_define bizname:'test'
name: '3node_lic'
descr:'3NODE License Sales Recurring Basic'
revenue_setup:'1:100,60:50'
// revenue_setup:'5'
revenue_monthly_delay:3
revenue_monthly:'1:1,60:1'
// cogs_setup:'1:0'
cogs_setup_perc:'50%'
revenue_setup_delay:1
cogs_monthly_perc:'50%'
nr_sold:'10:1000,24:2000,60:40000'
60 is the default
nr_months:60
```

View File

@@ -0,0 +1,73 @@
# Revenue
```
!!bizmodel.revenue_define bizname:'test' name:'oem1' ...
```
## Params
- bizname, is the name of the biz model we are populating
- name, name of product, project
- descr, description of the revenue line item
## descrete revenue/cogs (not per item)
cogs stands for cost of goods
- revenue: one of revenue, is not extrapolated, a deal at certain time
- revenue_growth: is a revenue stream which is being extrapolated
- cogs_percent: percent of revenue
- cogs_delay: delay in months between cogs and revenue
## grouped per items sold
- nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200, default is 1)
- nr_months_recurring: e.g. 60 is 5 years
- revenue_item_setup, revenue for 1 item '1000usd'
- revenue_item_setup_delay, delay between sell and recognition of sale in months
- revenue_item_monthly, revenue per month for 1 item
- revenue_item_monthly_delay, how many months before monthly revenue starts
- revenue_item_maintenance_perc, how much percent of revenue_item_setup will come back over months
- cogs_item_setup, cost of good for 1 item at setup
- cogs_item_setup_delay, how many months before setup cogs starts, after sales
- cogs_item_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
- cogs_item_monthly, cost of goods for the monthly per 1 item
- cogs_item_monthly_delay, how many months before monthly cogs starts, after sales
- cogs_item_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
## results in
follow rows in sheets
- {name}_ + all the arg names as mentioned above...
- {name}_revenue_total
- {name}_cogs_total
## to use
### basic example
```v
heroscript:='
Next will define an OEM product in month 10, 1 Million EUR, ... cogs is a percent which is 20% at start but goes to 10% after 20 months.
!!bizmodel.revenue_define bizname:'test' name:'oem1'
descr:'OEM Deals'
revenue:'10:1000000EUR,15:3333,20:1200000'
cogs_percent: '1:20%,20:10%'
'
This time we have the cogs defined in fixed manner, the default currency is USD doesn't have to be mentioned.
!!bizmodel.revenue_define bizname:'test' name:'oem2'
descr:'OEM Deals'
revenue:'10:1000000EUR,15:3333,20:1200000'
cogs: '10:100000,15:1000,20:120000'
'
```

View File

@@ -1,7 +1,7 @@
module bizmodel
import os
import freeflowuniverse.herolib.web.docusaurus
// import freeflowuniverse.herolib.web.docusaurus
import freeflowuniverse.herolib.core.texttools
import freeflowuniverse.herolib.core.pathlib
@@ -61,43 +61,43 @@ pub enum ExportFormat {
}
pub fn (r Report) export(export Export) ! {
match export.format {
.docusaurus {
mut dir := pathlib.get_dir(path: r.path)!
dir.copy(dest: '${export.path}/docs', delete: true)!
mut factory := docusaurus.new()!
mut site := factory.get(
name: r.name
path: export.path
publish_path: export.path
init: true
config: docusaurus.Configuration{
navbar: docusaurus.Navbar{
title: 'Business Model'
items: [
docusaurus.NavbarItem{
href: 'https://threefold.info/kristof/'
label: 'ThreeFold Technology'
position: 'right'
},
docusaurus.NavbarItem{
href: 'https://threefold.io'
label: 'Operational Plan'
position: 'left'
},
]
}
main: docusaurus.Main{
url_home: 'docs/introduction'
}
} // TODO: is this needed
)!
site.generate()!
}
.mdbook {
panic('MDBook export not fully implemented')
}
}
// match export.format {
// .docusaurus {
// mut dir := pathlib.get_dir(path: r.path)!
// dir.copy(dest: '${export.path}/docs', delete: true)!
// mut factory := docusaurus.new()!
// mut site := factory.get(
// name: r.name
// path: export.path
// publish_path: export.path
// init: true
// config: docusaurus.Configuration{
// navbar: docusaurus.Navbar{
// title: 'Business Model'
// items: [
// docusaurus.NavbarItem{
// href: 'https://threefold.info/kristof/'
// label: 'ThreeFold Technology'
// position: 'right'
// },
// docusaurus.NavbarItem{
// href: 'https://threefold.io'
// label: 'Operational Plan'
// position: 'left'
// },
// ]
// }
// main: docusaurus.Main{
// url_home: 'docs/introduction'
// }
// } // TODO: is this needed
// )!
// site.generate()!
// }
// .mdbook {
// panic('MDBook export not fully implemented')
// }
// }
}
pub fn (model BizModel) write_introduction(path string) ! {

View File

@@ -3,22 +3,7 @@ module bizmodel
import freeflowuniverse.herolib.core.playbook { Action }
import freeflowuniverse.herolib.core.texttools
// - name, e.g. for a specific project
// - descr, description of the revenue line item
// - revenue_setup, revenue for 1 item '1000usd'
// - revenue_setup_delay
// - revenue_monthly, revenue per month for 1 item
// - revenue_monthly_delay, how many months before monthly revenue starts
// - maintenance_month_perc, how much percent of revenue_setup will come back over months
// - cogs_setup, cost of good for 1 item at setup
// - cogs_setup_delay, how many months before setup cogs starts, after sales
// - cogs_setup_perc: what is percentage of the cogs (can change over time) for setup e.g. 0:50%
// - cogs_monthly, cost of goods for the monthly per 1 item
// - cogs_monthly_delay, how many months before monthly cogs starts, after sales
// - cogs_monthly_perc: what is percentage of the cogs (can change over time) for monthly e.g. 0:5%,12:10%
// - nr_sold: how many do we sell per month (is in growth format e.g. 10:100,20:200, default is 1)
// - nr_months_recurring: how many months is recurring, if 0 then no recurring
//
// see lib/biz/bizmodel/docs/revenue.md
fn (mut m BizModel) revenue_action(action Action) !Action {
mut name := action.params.get_default('name', '')!
mut descr := action.params.get_default('descr', '')!
@@ -45,16 +30,11 @@ fn (mut m BizModel) revenue_action(action Action) !Action {
m.products[name] = &product
mut nr_months_recurring := action.params.get_int_default('nr_months_recurring', 60)!
if nr_months_recurring == 0 {
nr_months_recurring = 1
}
product.nr_months_recurring = nr_months_recurring
mut revenue := m.sheet.row_new(
name: '${name}_revenue'
growth: action.params.get_default('revenue', '0:0')!
name: '${name}_revenue_total'
growth: '0:0'
tags: 'rev name:${name}'
descr: 'Revenue for ${name2}'
extrapolate: false
@@ -62,8 +42,8 @@ fn (mut m BizModel) revenue_action(action Action) !Action {
// Handle revenue_items parameter (non-recurring revenue items)
mut revenue_items := m.sheet.row_new(
name: '${name}_revenue_items'
growth: action.params.get_default('revenue_items', '0:0')!
name: '${name}_revenue'
growth: action.params.get_default('revenue', '0:0')!
tags: 'rev name:${name}'
descr: 'Revenue items for ${name2}'
extrapolate: false
@@ -78,21 +58,37 @@ fn (mut m BizModel) revenue_action(action Action) !Action {
extrapolate: true
)!
// Handle revenue_item parameter (singular item)
mut revenue_item := m.sheet.row_new(
name: '${name}_revenue_item'
growth: action.params.get_default('revenue_item', '0:0')!
tags: 'rev name:${name}'
descr: 'Revenue item for ${name2}'
extrapolate: false
)!
// Handle revenue_nr parameter (number of revenue items)
mut revenue_nr := m.sheet.row_new(
name: '${name}_revenue_nr'
growth: action.params.get_default('revenue_nr', '0:0')!
name: '${name}_nr_sold'
growth: action.params.get_default('nr_sold', '0:0')!
tags: 'rev name:${name}'
descr: 'Number of revenue items for ${name2}'
descr: 'Items sold per month for ${name2}'
extrapolate: false
)!
mut nr_sold := m.sheet.row_new(
name: '${name}_nr_sold'
growth: action.params.get_default('nr_sold', '0')!
tags: 'rev name:${name}'
descr: 'nr of items sold/month for ${name2}'
aggregatetype: .avg
)!
if nr_sold.max() > 0 {
product.has_items = true
}
// Handle revenue_item parameter (singular item)
mut revenue_item := m.sheet.row_new(
name: '${name}_revenue_item_setup'
growth: action.params.get_default('revenue_item_setup', '0:0')!
tags: 'rev name:${name}'
descr: 'Item Revenue for ${name2}'
extrapolate: false
)!
@@ -118,9 +114,9 @@ fn (mut m BizModel) revenue_action(action Action) !Action {
1)!
mut cogs := m.sheet.row_new(
name: '${name}_cogs'
name: '${name}_cogs_total'
growth: action.params.get_default('cogs', '0:0')!
tags: 'rev name:${name}'
tags: 'cogs name:${name}'
descr: 'COGS for ${name2}'
extrapolate: false
)!
@@ -173,18 +169,6 @@ fn (mut m BizModel) revenue_action(action Action) !Action {
aggregatetype: .avg
)!
mut nr_sold := m.sheet.row_new(
name: '${name}_nr_sold'
growth: action.params.get_default('nr_sold', '0')!
tags: 'rev name:${name}'
descr: 'nr of items sold/month for ${name2}'
aggregatetype: .avg
)!
if nr_sold.max() > 0 {
product.has_items = true
}
// CALCULATE THE TOTAL (multiply with nr sold)
mut revenue_setup_total := revenue_setup.action(