...
This commit is contained in:
@@ -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
|
||||
|
||||
1
examples/biztools/playbook copy/.collection
Normal file
1
examples/biztools/playbook copy/.collection
Normal file
@@ -0,0 +1 @@
|
||||
name:bizmodel_example
|
||||
14
examples/biztools/playbook copy/params.md
Normal file
14
examples/biztools/playbook copy/params.md
Normal 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.
|
||||
|
||||
|
||||
|
||||
85
examples/biztools/playbook copy/revenue_params.md
Normal file
85
examples/biztools/playbook copy/revenue_params.md
Normal 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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
||||
73
lib/biz/bizmodel/docu/revenue.md
Normal file
73
lib/biz/bizmodel/docu/revenue.md
Normal 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'
|
||||
'
|
||||
|
||||
|
||||
|
||||
```
|
||||
@@ -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) ! {
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user