const MINIMUM_BASE_AREA = 0.5; const MINIMUM_AREA_THREE_RATS = 1.8; const AREA_PER_ADDITIONAL_RAT = 0.2; const MAXIMUM_FALL_HEIGHT = 0.5; const MINIMUM_LENGTH = 0.8; const MINIMUM_FLOOR_HEIGHT = 0.3; const FAILED_BASE_AREA = "base_area"; const FAILED_OVERALL_AREA = "overall_area"; const FAILED_FALL_HEIGHT = "fall_height"; const FAILED_NUM_RATS = "num_rats"; const FAILED_LENGTH = "length"; const FAILED_FLOOR_HEIGHT = "floor_height" const FAIL_CRITERIA = { [FAILED_BASE_AREA]: `Die Mindestgrundfläche des Käfigs muss ${MINIMUM_BASE_AREA}m² (also z.B. 100x50cm) betragen.`, [FAILED_OVERALL_AREA]: "Die Gesamtfläche im Käfig ist zu klein.", [FAILED_FALL_HEIGHT]: `Die mögliche Fallhöhe darf nicht mehr als ${(MAXIMUM_FALL_HEIGHT * 100).toFixed(0)}cm betragen.`, [FAILED_FLOOR_HEIGHT]: `Der Mindestabstand zwischen Ebenen muss ${(MINIMUM_FLOOR_HEIGHT * 100).toFixed(0)}cm betragen.`, [FAILED_NUM_RATS]: "Es müssen mindestens 3 Ratten zusammenleben, Paarhaltung ist nicht artgerecht.", [FAILED_LENGTH]: `Eine Seite des Käfig muss mindestens ${(MINIMUM_LENGTH * 100).toFixed(0)}cm lang sein um Rennen zu ermöglichen.`, }; class Dimensions { constructor(width, depth, height) { this.width = width; this.depth = depth; this.height = height; } toString() { return `${this.width}x${this.depth}x${this.height}`; } static fromDict(data) { const { width, depth, height } = data; return new Dimensions(width, depth, height); } } function overallAreaNeeded(numOfRats) { if (numOfRats < 3 || numOfRats > 15) { throw new Error("This formula works only from 3 to 15 rats"); } return MINIMUM_AREA_THREE_RATS + (numOfRats - 3) * AREA_PER_ADDITIONAL_RAT; } function cageCheck(dimensions, numRats, numFullFloors) { let failedCriteria = {}; if (numRats < 2 || numRats > 15) { failedCriteria[FAILED_NUM_RATS] = FAIL_CRITERIA[FAILED_NUM_RATS]; } const baseArea = dimensions.depth * dimensions.width; if (baseArea < MINIMUM_BASE_AREA) { failedCriteria[FAILED_BASE_AREA] = FAIL_CRITERIA[FAILED_BASE_AREA]; } const areaNeeded = overallAreaNeeded(numRats); if (baseArea * numFullFloors < areaNeeded) { failedCriteria[FAILED_OVERALL_AREA] = FAIL_CRITERIA[FAILED_OVERALL_AREA]; } if (dimensions.height / numFullFloors > MAXIMUM_FALL_HEIGHT) { failedCriteria[FAILED_FALL_HEIGHT] = FAIL_CRITERIA[FAILED_FALL_HEIGHT]; } if (dimensions.width < MINIMUM_LENGTH && dimensions.depth < MINIMUM_LENGTH) { failedCriteria[FAILED_LENGTH] = FAIL_CRITERIA[FAILED_LENGTH]; } if (dimensions.height / numFullFloors < MINIMUM_FLOOR_HEIGHT) { failedCriteria[FAILED_FLOOR_HEIGHT] = FAIL_CRITERIA[FAILED_FLOOR_HEIGHT]; } return failedCriteria; }