diff --git a/examples/biztools/bizmodel.vsh b/examples/biztools/bizmodel.vsh index 921ca10a..1ed37de5 100755 --- a/examples/biztools/bizmodel.vsh +++ b/examples/biztools/bizmodel.vsh @@ -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 diff --git a/examples/biztools/playbook copy/.collection b/examples/biztools/playbook copy/.collection new file mode 100644 index 00000000..3ab6d45f --- /dev/null +++ b/examples/biztools/playbook copy/.collection @@ -0,0 +1 @@ +name:bizmodel_example \ No newline at end of file diff --git a/examples/biztools/playbook/bizmodel.md b/examples/biztools/playbook copy/bizmodel.md similarity index 100% rename from examples/biztools/playbook/bizmodel.md rename to examples/biztools/playbook copy/bizmodel.md diff --git a/examples/biztools/playbook/cost_centers.md b/examples/biztools/playbook copy/cost_centers.md similarity index 100% rename from examples/biztools/playbook/cost_centers.md rename to examples/biztools/playbook copy/cost_centers.md diff --git a/examples/biztools/playbook/costs_params.md b/examples/biztools/playbook copy/costs_params.md similarity index 100% rename from examples/biztools/playbook/costs_params.md rename to examples/biztools/playbook copy/costs_params.md diff --git a/examples/biztools/playbook/debug.md b/examples/biztools/playbook copy/debug.md similarity index 100% rename from examples/biztools/playbook/debug.md rename to examples/biztools/playbook copy/debug.md diff --git a/examples/biztools/playbook/department_params.md b/examples/biztools/playbook copy/department_params.md similarity index 100% rename from examples/biztools/playbook/department_params.md rename to examples/biztools/playbook copy/department_params.md diff --git a/examples/biztools/playbook/funding_params.md b/examples/biztools/playbook copy/funding_params.md similarity index 100% rename from examples/biztools/playbook/funding_params.md rename to examples/biztools/playbook copy/funding_params.md diff --git a/examples/biztools/playbook/hr_params.md b/examples/biztools/playbook copy/hr_params.md similarity index 100% rename from examples/biztools/playbook/hr_params.md rename to examples/biztools/playbook copy/hr_params.md diff --git a/examples/biztools/playbook copy/params.md b/examples/biztools/playbook copy/params.md new file mode 100644 index 00000000..3bf15f34 --- /dev/null +++ b/examples/biztools/playbook copy/params.md @@ -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. + + + diff --git a/examples/biztools/playbook copy/revenue_params.md b/examples/biztools/playbook copy/revenue_params.md new file mode 100644 index 00000000..689ebd2e --- /dev/null +++ b/examples/biztools/playbook copy/revenue_params.md @@ -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 +``` + diff --git a/examples/biztools/playbook/revenue_params.md b/examples/biztools/playbook/revenue_params.md index 689ebd2e..70cc57ee 100644 --- a/examples/biztools/playbook/revenue_params.md +++ b/examples/biztools/playbook/revenue_params.md @@ -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 -``` - diff --git a/lib/biz/bizmodel/docu/revenue.md b/lib/biz/bizmodel/docu/revenue.md new file mode 100644 index 00000000..498d4367 --- /dev/null +++ b/lib/biz/bizmodel/docu/revenue.md @@ -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' +' + + + +``` \ No newline at end of file diff --git a/lib/biz/bizmodel/export.v b/lib/biz/bizmodel/export.v index 10dd07e4..90475504 100644 --- a/lib/biz/bizmodel/export.v +++ b/lib/biz/bizmodel/export.v @@ -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) ! { diff --git a/lib/biz/bizmodel/play_product_revenue.v b/lib/biz/bizmodel/play_product_revenue.v index af905df5..126e51ee 100644 --- a/lib/biz/bizmodel/play_product_revenue.v +++ b/lib/biz/bizmodel/play_product_revenue.v @@ -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(