Add common area share into calculation
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="Web site created using create-react-app"
|
content="Solimieten-Tool der Allmende Gundelfingen"
|
||||||
/>
|
/>
|
||||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||||
<!--
|
<!--
|
||||||
|
|||||||
85
src/Data.js
85
src/Data.js
@@ -5,44 +5,102 @@ class Flat {
|
|||||||
this.sizePrivate = sizePrivate;
|
this.sizePrivate = sizePrivate;
|
||||||
this.isWbs = isWbs;
|
this.isWbs = isWbs;
|
||||||
this.sizeShared = 0;
|
this.sizeShared = 0;
|
||||||
|
// Normal flats have as many people as rooms
|
||||||
|
// WGs and cluster flats have one more room
|
||||||
if (!wgRoomList) {
|
if (!wgRoomList) {
|
||||||
this.wgRoomList = [];
|
this.wgRoomList = [];
|
||||||
|
this.numPeople = numRooms;
|
||||||
} else {
|
} else {
|
||||||
this.wgRoomList = wgRoomList;
|
this.wgRoomList = wgRoomList;
|
||||||
this.sizeShared = this.sizePrivate;
|
this.sizeShared = this.sizePrivate;
|
||||||
for (var i = 0; i < this.wgRoomList.length; i++) {
|
for (var i = 0; i < this.wgRoomList.length; i++) {
|
||||||
this.sizeShared -= this.wgRoomList[i].size;
|
this.sizeShared -= this.wgRoomList[i].size;
|
||||||
}
|
}
|
||||||
|
this.numPeople = numRooms - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a string representation of the flat
|
||||||
print() {
|
print() {
|
||||||
return this.name + " (" + this.numRooms + " Zimmer)";
|
return this.name + " (" + this.numRooms + " Zimmer)";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculates the share of the internal shared area the party has to pay for
|
||||||
|
// This is only applicable for WGs and clusters, i.e. when a room is selected.
|
||||||
|
calcInternalAreaShare(room = null) {
|
||||||
|
return room ? this.sizeShared / this.numPeople * room.numPeople : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculates the share of the project wide common area
|
||||||
|
// the party has to pay for.
|
||||||
|
// Currently done by number of people in the party.
|
||||||
|
calcCommonAreaShare(room = null) {
|
||||||
|
var numPeople;
|
||||||
|
if (room) {
|
||||||
|
numPeople = room.numPeople;
|
||||||
|
} else {
|
||||||
|
numPeople = this.numRooms;
|
||||||
|
}
|
||||||
|
|
||||||
|
return commonArea / numPeopleTotal * numPeople;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculates the total area the party has to pay for
|
||||||
|
// Includes the private area, share of the common area and for
|
||||||
|
// WGs and clusters the share of the internal shared area
|
||||||
|
calcTotalPayedArea(room = null) {
|
||||||
|
var commonAreaShare = this.calcCommonAreaShare(room);
|
||||||
|
|
||||||
|
if (!room) {
|
||||||
|
return this.sizePrivate + commonAreaShare;
|
||||||
|
} else {
|
||||||
|
return room.size + commonAreaShare + this.calcInternalAreaShare(room);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Room {
|
||||||
|
constructor(name, size, numPeople = 1) {
|
||||||
|
this.name = name;
|
||||||
|
this.size = size;
|
||||||
|
this.numPeople = numPeople;
|
||||||
|
}
|
||||||
|
|
||||||
|
print() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const flatData = {
|
export const flatData = {
|
||||||
"north": {
|
"north": {
|
||||||
0: [
|
0: [
|
||||||
new Flat("W 0.1", 4, 82.7, false, false, [{ label: "0.1 02", size: 12.8 }, { label: "0.1 03", size: 12.8 }, { label: "0.1 04", size: 14.6 }]), // Todo: make WG
|
new Flat("W 0.1", 4, 82.7, false, false, [
|
||||||
|
new Room("0.1 02", 12.8), new Room("0.1 03", 12.8), new Room("0.1 04", 14.6)
|
||||||
|
]),
|
||||||
new Flat("W 0.2", 2, 53.1, true),
|
new Flat("W 0.2", 2, 53.1, true),
|
||||||
new Flat("W 0.3", 3, 62, true)
|
new Flat("W 0.3", 3, 62, true)
|
||||||
],
|
],
|
||||||
1: [
|
1: [
|
||||||
new Flat("W 1.1", 4, 82.5, true),
|
new Flat("W 1.1", 4, 82.5, true),
|
||||||
new Flat("W 1.2", 1, 35.4, true),
|
new Flat("W 1.2", 1, 35.4, true),
|
||||||
new Flat("W 1.3", 4, 61, true, false, [{ label: "1.3 02", size: 11.88 }, { label: "1.3 03", size: 11.41 }, { label: "1.3 04", size: 11.89 }])
|
new Flat("W 1.3", 4, 61, true, false, [
|
||||||
|
new Room("1.3 02", 11.88), new Room("1.3 03", 11.41), new Room("1.3 04", 11.89)
|
||||||
|
])
|
||||||
],
|
],
|
||||||
2: [
|
2: [
|
||||||
new Flat("W 2.1", 4, 82.6, true),
|
new Flat("W 2.1", 4, 82.6, true),
|
||||||
new Flat("W 2.2", 2, 45.3, true),
|
new Flat("W 2.2", 2, 45.3, true),
|
||||||
new Flat("W 2.3", 5, 148.77, true, true, [{ label: "1 Person", size: 25.32 }, { label: "2 Personen", size: 44.52 }, { label: "1 Person (rollstuhlgerecht)", size: 39.8 }]),
|
new Flat("W 2.3", 5, 148.77, true, true, [
|
||||||
|
new Room("1 Person", 25.32), new Room("2 Personen", 44.52, 2), new Room("1 Person (rollstuhlgerecht)", 39.8)
|
||||||
|
]),
|
||||||
new Flat("W 2.4", 2, 62.5, true, true)
|
new Flat("W 2.4", 2, 62.5, true, true)
|
||||||
],
|
],
|
||||||
3: [
|
3: [
|
||||||
new Flat("W 3.1", 4, 82.6),
|
new Flat("W 3.1", 4, 82.6),
|
||||||
new Flat("W 3.2", 5, 148.77, true, true, [{ label: "1 Person", size: 25.32 }, { label: "2 Personen", size: 44.52 }, { label: "1 Person (rollstuhlgerecht)", size: 39.8 }]),
|
new Flat("W 3.2", 5, 148.77, true, true, [
|
||||||
|
new Room("1 Person", 25.32), new Room("2 Personen", 44.52, 2), new Room("1 Person (rollstuhlgerecht)", 39.8)
|
||||||
|
]),
|
||||||
new Flat("W 3.3", 3, 61.8, true)
|
new Flat("W 3.3", 3, 61.8, true)
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -54,7 +112,9 @@ export const flatData = {
|
|||||||
],
|
],
|
||||||
1: [
|
1: [
|
||||||
new Flat("W 1.4", 2, 55.7),
|
new Flat("W 1.4", 2, 55.7),
|
||||||
new Flat("W 1.5 (WG)", 5, 83.86, true, false, [{ label: "1.5 02", size: 15.72 }, { label: "1.5 03", size: 9.81 }, { label: "1.5 05", size: 11.48 }, { label: "1.5 06", size: 13.45 }]),
|
new Flat("W 1.5 (WG)", 5, 83.86, true, false,
|
||||||
|
[new Room("1.5 02", 15.72), new Room("1.5 03", 9.81), new Room("1.5 05", 11.48), new Room("1.5 06", 13.45)]
|
||||||
|
),
|
||||||
new Flat("W 1.6.0", 1, 25.6),
|
new Flat("W 1.6.0", 1, 25.6),
|
||||||
new Flat("W 1.6", 5, 95.7),
|
new Flat("W 1.6", 5, 95.7),
|
||||||
],
|
],
|
||||||
@@ -68,3 +128,18 @@ export const flatData = {
|
|||||||
|
|
||||||
export const minRent = 9.50;
|
export const minRent = 9.50;
|
||||||
export const maxRent = 15.60;
|
export const maxRent = 15.60;
|
||||||
|
|
||||||
|
const commonArea = 388.80;
|
||||||
|
|
||||||
|
// Calculate total number of people
|
||||||
|
var _numPeople = 0;
|
||||||
|
|
||||||
|
for (const building of Object.keys(flatData)) {
|
||||||
|
for (const floor of Object.keys(flatData[building])) {
|
||||||
|
for (const flat of flatData[building][floor]) {
|
||||||
|
_numPeople += flat.numPeople;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const numPeopleTotal = _numPeople;
|
||||||
@@ -58,6 +58,7 @@ export function FlatSelectionCard({ setSelectedFlat, onRoomSelected }) {
|
|||||||
setRoomOptions(flat.wgRoomList);
|
setRoomOptions(flat.wgRoomList);
|
||||||
}
|
}
|
||||||
setSelectedFlat(flatOptions[index]);
|
setSelectedFlat(flatOptions[index]);
|
||||||
|
onRoomSelected(null);
|
||||||
}
|
}
|
||||||
function roomSelected(e) {
|
function roomSelected(e) {
|
||||||
onRoomSelected(roomOptions[e.target.value]);
|
onRoomSelected(roomOptions[e.target.value]);
|
||||||
@@ -80,7 +81,7 @@ export function FlatSelectionCard({ setSelectedFlat, onRoomSelected }) {
|
|||||||
{flatOptions.map((flat, index) => <option value={index} >{flat.print()}</option>)}
|
{flatOptions.map((flat, index) => <option value={index} >{flat.print()}</option>)}
|
||||||
</Select>
|
</Select>
|
||||||
{roomOptions.length > 0 ? (<Select placeholder='Zimmer auswählen' onChange={roomSelected}>
|
{roomOptions.length > 0 ? (<Select placeholder='Zimmer auswählen' onChange={roomSelected}>
|
||||||
{roomOptions.map((room, index) => <option value={index} >{room.label} ({room.size} m²)</option>)}
|
{roomOptions.map((room, index) => <option value={index} >{room.print()} ({room.size} m²)</option>)}
|
||||||
</Select>) : null}
|
</Select>) : null}
|
||||||
</Stack>
|
</Stack>
|
||||||
</CardBody>
|
</CardBody>
|
||||||
@@ -101,10 +102,12 @@ export function FlatDetailsCard({ flat, room }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var sizeSharedBox = null;
|
var sizeSharedBox = null;
|
||||||
var sizeSharedShare = 0;
|
|
||||||
|
var commonAreaShare = flat.calcCommonAreaShare(room);
|
||||||
|
var internalAreaShare = flat.calcInternalAreaShare(room);
|
||||||
|
|
||||||
if (flat.wgRoomList.length > 0) {
|
if (flat.wgRoomList.length > 0) {
|
||||||
sizeSharedShare = flat.sizeShared / flat.wgRoomList.length;
|
|
||||||
sizeSharedBox = <Box>
|
sizeSharedBox = <Box>
|
||||||
<Heading size='xs' textTransform='uppercase'>
|
<Heading size='xs' textTransform='uppercase'>
|
||||||
Interne Gemeinschaftsfläche
|
Interne Gemeinschaftsfläche
|
||||||
@@ -116,6 +119,8 @@ export function FlatDetailsCard({ flat, room }) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var totalSizeToPay = flat.calcTotalPayedArea(room);
|
||||||
|
|
||||||
body = <CardBody>
|
body = <CardBody>
|
||||||
|
|
||||||
<Stack divider={<StackDivider />} spacing='4'>
|
<Stack divider={<StackDivider />} spacing='4'>
|
||||||
@@ -125,7 +130,7 @@ export function FlatDetailsCard({ flat, room }) {
|
|||||||
Bezeichnung
|
Bezeichnung
|
||||||
</Heading>
|
</Heading>
|
||||||
<Text pt='2' fontSize='sm'>
|
<Text pt='2' fontSize='sm'>
|
||||||
{flat.name} {room ? "Zimmer: " + room.label : null}
|
{flat.name} {room ? "Zimmer: " + room.print() : null}
|
||||||
</Text>
|
</Text>
|
||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
@@ -139,12 +144,21 @@ export function FlatDetailsCard({ flat, room }) {
|
|||||||
{sizeSharedBox}
|
{sizeSharedBox}
|
||||||
<Box>
|
<Box>
|
||||||
<Heading size='xs' textTransform='uppercase'>
|
<Heading size='xs' textTransform='uppercase'>
|
||||||
Fläche
|
Anteil Gemeinschaftsfläche
|
||||||
</Heading>
|
</Heading>
|
||||||
<Text pt='2' fontSize='sm'>
|
<Text pt='2' fontSize='sm'>
|
||||||
{(sizePrivate + sizeSharedShare).toFixed(2)} m² {sizeSharedShare ? ("(" + sizePrivate + " m² Zimmer + " + sizeSharedShare.toFixed(2) + " m² Anteil interne Gemeinschaftsfläche)") : null}
|
{commonAreaShare.toFixed(2)} m² {internalAreaShare ? ("(Allmendefläche) + " + internalAreaShare.toFixed(2) + " m² (WG/Cluster-Fläche)") : ""}
|
||||||
</Text>
|
</Text>
|
||||||
</Box>
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Heading size='xs' textTransform='uppercase'>
|
||||||
|
Zahlfläche
|
||||||
|
</Heading>
|
||||||
|
<Text pt='2' fontSize='sm'>
|
||||||
|
{sizePrivate.toFixed(2)} m² + {commonAreaShare.toFixed(2)} m² (Allmendefläche) {internalAreaShare ? " + " + (internalAreaShare.toFixed(2) + " m² (WG/Cluster-Fläche)") : null}
|
||||||
|
</Text>
|
||||||
|
<Text pt={3} size='s' fontWeight='bold'>Gesamt: {totalSizeToPay.toFixed(2)} m² </Text>
|
||||||
|
</Box>
|
||||||
</Stack>
|
</Stack>
|
||||||
</CardBody>;
|
</CardBody>;
|
||||||
|
|
||||||
@@ -254,10 +268,7 @@ export function SelfEvaluationCard({ rent, setRent }) {
|
|||||||
export function ResultsCard({ rent, flat, room }) {
|
export function ResultsCard({ rent, flat, room }) {
|
||||||
var body = <CardBody></CardBody>
|
var body = <CardBody></CardBody>
|
||||||
if (flat && (room || flat.wgRoomList.length === 0)) {
|
if (flat && (room || flat.wgRoomList.length === 0)) {
|
||||||
var totalSize = flat.sizePrivate;
|
var totalSize = flat.calcTotalPayedArea(room)
|
||||||
if (room) {
|
|
||||||
totalSize = room.size + flat.sizeShared / flat.wgRoomList.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
var relativeRent = rent / totalSize;
|
var relativeRent = rent / totalSize;
|
||||||
var rangePosition = ((relativeRent - minRent) / (maxRent - minRent)) * 100;
|
var rangePosition = ((relativeRent - minRent) / (maxRent - minRent)) * 100;
|
||||||
|
|||||||
Reference in New Issue
Block a user