diff --git a/plans/assets/gullberg-wordmark.svg b/plans/assets/gullberg-wordmark.svg new file mode 100644 index 0000000..9cfe919 --- /dev/null +++ b/plans/assets/gullberg-wordmark.svg @@ -0,0 +1,13 @@ + + + GULLBERG + sanatorium + diff --git a/plans/documents/gullberg-forretningsplan.md b/plans/documents/gullberg-forretningsplan.md new file mode 100644 index 0000000..47cae1f --- /dev/null +++ b/plans/documents/gullberg-forretningsplan.md @@ -0,0 +1,27 @@ +# Huset + +Utkast, skrives av eierne: hva huset er, hvor det ligger, hvor mange rom det har og i hvilken stand. + +# Forretningen + +Utkast, skrives av eierne: de to inntektene, romleie til studenter og timeshare-uker, og hva hver av dem gir i året. + +# Eierne + +Utkast, skrives av eierne: hvem aksjonærene er, hvordan styret er satt sammen, og hvordan søsknene som ikke blir med er løst ut. + +# Lånet + +Utkast, skrives av eierne: hvor mye, til hva, og hvordan det betjenes. + +# Budsjettet + +Utkast, skrives av eierne: inntekter, drift, renter og avdrag for et normalår, og hvor rapportene står. + +# Det som mangler + +Utkast, skrives av eierne: de største manglene ved huset, hva de koster å rette, og planen for det. Lista på siden holdes oppdatert. + +# Forvaltningen + +Utkast, skrives av eierne: at Klingenberg Bygg forvalter huset, og hva det innebærer. diff --git a/plans/gullberg.yaml b/plans/gullberg.yaml new file mode 100644 index 0000000..2786ba8 --- /dev/null +++ b/plans/gullberg.yaml @@ -0,0 +1,196 @@ +# GULLBERG sanatorium - et Klingenberg Bygg-prosjekt på +# gullberg.klingenbergbygg.no. UTKAST 2026-09-30, til samtale; ikke +# bygget eller satt ut. +# +# Et selskap med trolig fire aksjonærer eier huset etter at dødsboet er +# gjort opp, og låner for å løse ut søsknene som ikke blir med videre. +# Lånet betjenes av to inntekter: studenter som leier rom rimelig, og +# timeshare-uker. Siden viser forretningen til verden og til långiveren, +# driver huset (romsøknader, uker, styrets liste over det som er bra, det +# som mangler og det som er planlagt) og rapporterer pengene til +# aksjonærene og långiveren. +# +# Åpne spørsmål, fra samtalen: +# - antall rom, leie, leietid, hvor huset ligger (husleieloven) +# - hvem de fire aksjonærene er, og om søsken som løses ut får en plass +# - timeshare bare for aksjonærene, eller solgt til andre også +# - långiveren: bank (egne skjemaer; siden blir dokumentasjonen) eller +# privat (kan bruke långiverens side selv) +# - hva som er offentlig: her er rom og publiserte planer offentlige, +# tallene bare for aksjonærer og långiver +# - selskapsform (AS?) og aksjonæravtale +# - hvem som er kontakt og avsender (under er plassholdere) +business: GULLBERG sanatorium +language: no +# Plassholder til styret har en adresse. +contact: { name: Styret i Gullberg, email: bl@klingenbergbygg.no, group: styret } +people: memberships +mail: { from: "Gullberg ", reply_to: bl@klingenbergbygg.no } +about: > + Et gammelt hus med rom til studenter som trenger et rimelig sted å bo, + og uker for dem som eier det. Drevet av eierne, forvaltet av + Klingenberg Bygg. + +groups: + - { id: styret, label: Styret } + - { id: aksjonaerer, label: Aksjonærer } + - { id: langiver, label: Långiver } + - { id: leietakere, label: Leietakere } +invites_by: [styret] + +does: + - id: rom + for: leie-rom + text: > + Rom til studenter, rimelig og for et studieår av gangen. Du søker + her, kommer på visning og sier selv ja til tilbudet. + - id: huset + text: > + Huset drives av eierne, med Klingenberg Bygg som forvalter. Det som + mangler, står på lista sammen med planen for det, og tallene går + jevnlig til eierne og långiveren. + +# Forretningsplanen, ord for ord: ett kort per del. Skal skrives av +# eierne; filen har bare delene og hva som hører hjemme i dem. +documents: + - id: forretningsplan + question: Hvordan går Gullberg rundt? + description: Forretningsplanen for Gullberg, slik eierne har lagt den fram for långiveren. + file: documents/gullberg-forretningsplan.md + +needs: + # Offentlig: en student søker rom. + - id: leie-rom + who: en student som trenger et rimelig rom for studieåret + wants: et rom å bo på til en leie som går opp med studielånet + lands_in: romsoknader + handled_by: styret + stages: [open, visning, tilbud, akseptert, signert, avslatt] + stages_text: { open: "mottatt", visning: "visning avtalt", tilbud: "tilbud sendt", akseptert: "tilbud godtatt", signert: "kontrakt signert", avslatt: "avsluttet uten leie" } + done_when: [signert, avslatt] + success: [signert] + turned_down_from: [open, visning, tilbud] + moves_by: { akseptert: [submitter], avslatt: [submitter, styret] } + mails: { open: submitter, visning: submitter, tilbud: submitter, akseptert: bl@klingenbergbygg.no, signert: submitter } + grants: { signert: leietakere } + max_fields: 4 + collects: + - { name: name } + - { name: email, type: email } + - { name: telefon, type: tel } + - { name: studiested } + - { name: innflytting, type: date, optional: true } + - { name: om, type: textarea, optional: true } + + # Rommene som er ledige, som bildekort styret legger inn og tar ned. + - id: ledig-rom + who: styret, når et rom blir ledig + wants: at studenter ser rommet før de søker + enters_as: styret + lands_in: rom + handled_by: styret + watched_by: [public] + presents: true + public_states: [open] + stages: [open, utleid] + stages_text: { open: "ledig", utleid: "leid ut" } + done_when: [utleid] + success: [utleid] + leaves_after: { utleid: { minutes: 10 } } + max_fields: 3 + collects: + - { name: tittel } + - { name: bilde, type: picture } + - { name: om, type: textarea } + + # Styrets liste: det som er bra, det som mangler, det som er planlagt. + # Aksjonærene ser alt; allmennheten bare planene styret har publisert, + # og de står som kunngjøringer. + - id: liste + who: styret, om huset og driften + wants: én liste over det som er bra, det som mangler og det som er planlagt, med pris og tid + enters_as: styret + lands_in: liste + handled_by: styret + watched_by: [aksjonaerer, public] + public_states: [publisert] + stages: [open, vedtatt, publisert, forkastet] + stages_text: { open: "utkast", vedtatt: "vedtatt", publisert: "publisert", forkastet: "forkastet" } + done_when: [publisert, forkastet] + success: [publisert] + max_fields: 3 + collects: + - { name: tittel } + - { name: slag, type: select, options: [Kvalitet, Mangel, Plan] } + - { name: beskrivelse, type: textarea } + - { name: kostnad, optional: true } + - { name: naar, optional: true } + + # Budsjettrapporten: tallene i felt, ikke bare en PDF. Långiveren + # kvitterer eller spør; styret svarer. + - id: rapport + who: styret, hvert kvartal + wants: at aksjonærene og långiveren ser hvordan det går, i tall + enters_as: styret + lands_in: rapporter + handled_by: styret + watched_by: [aksjonaerer, langiver] + stages: [open, kvittert, sporsmal, besvart] + stages_text: { open: "lagt fram", kvittert: "kvittert av långiver", sporsmal: "långiver har spørsmål", besvart: "besvart" } + reached_from: { sporsmal: [open], besvart: [sporsmal], kvittert: [open, besvart] } + done_when: [kvittert] + success: [kvittert] + moves_by: { kvittert: [langiver], sporsmal: [langiver], besvart: [styret] } + mails: { sporsmal: bl@klingenbergbygg.no } + max_fields: 7 + collects: + - { name: periode } + - { name: leieinntekter } + - { name: timeshare } + - { name: driftskostnader } + - { name: renter-og-avdrag } + - { name: saldo } + - { name: kommentar, type: textarea } + - { name: dokument, type: file, optional: true } + + # Aksjonærene: uker i huset, og saker til styret. + - id: uke + who: en aksjonær som vil bruke huset en periode + wants: en uke i huset, bekreftet av styret + enters_as: aksjonaerer + lands_in: uker + handled_by: styret + stages: [open, bekreftet, avslatt] + stages_text: { open: "ønsket", bekreftet: "bekreftet", avslatt: "ikke ledig" } + done_when: [bekreftet, avslatt] + success: [bekreftet] + max_fields: 3 + collects: + - { name: fra, type: date } + - { name: til, type: date } + - { name: merknad, type: textarea, optional: true } + + - id: sak + who: en aksjonær som vil ha noe avgjort + wants: at styret tar saken opp og avgjør den + enters_as: aksjonaerer + lands_in: saker + handled_by: styret + watched_by: [aksjonaerer] + stages: [open, sakslisten, vedtatt, avvist] + stages_text: { open: "meldt", sakslisten: "på sakslisten", vedtatt: "vedtatt", avvist: "avvist" } + done_when: [vedtatt, avvist] + success: [vedtatt] + max_fields: 2 + collects: + - { name: tittel } + - { name: sak, type: textarea } + +personas: + - { id: student-bergen, need: leie-rom, text: "Jeg begynner på master til høsten og har ikke råd til hybel i sentrum. Et rimelig rom i et stort hus høres perfekt ut." } + - { id: student-kort, need: leie-rom, text: "Jeg skal på utveksling og trenger et rom bare for ett semester. Går det an?" } + - { id: styret-rom, need: ledig-rom, text: "Rommet i andre etasje blir ledig til jul, og jeg har et fint bilde av det. Det vil jeg legge ut." } + - { id: styret-mangel, need: liste, text: "Taket på uthuset lekker. Det må stå på lista, og vi må ha en plan og en pris for det." } + - { id: styret-kvartal, need: rapport, text: "Tredje kvartal er gjort opp. Leia kom inn, men fyringsolja ble dyrere enn vi trodde." } + - { id: aksjonaer-sommer, need: uke, text: "Vi vil gjerne være i huset første uka i juli med barna." } + - { id: aksjonaer-sak, need: sak, text: "Jeg mener vi bør se på solceller før vi tar opp mer lån. Kan styret ta det opp?" } diff --git a/src/trainer/build.rs b/src/trainer/build.rs index e9c842b..ecb6deb 100644 --- a/src/trainer/build.rs +++ b/src/trainer/build.rs @@ -664,11 +664,14 @@ impl Plan { // small application and the firm's large one, and is one // page either way. A bucket only a role ever writes to has // its group's desk and nothing to publish. - // Unless it presents: the people are entered from inside - // precisely so that everyone can see them. + // Unless it presents - the people are entered from inside + // precisely so that everyone can see them - or publishes: + // a board's list whose public view is only the stages it + // has published (`public_states`) is announcements. if need.watched_by.iter().any(|g| g == PUBLIC) && need.enters_as.is_some() && !need.presents + && need.public_states.is_empty() && !self .needs .iter()