# Core ###### tags: `nextup` ## Domain model ```plantuml package common { class Address { googlePlacesId: String latitude: BigDecimal longitude: BigDecimal streetName: String streetNumber: Sting zipCode: String city: String coutry: String } } package User { class User { email: String password: String roles: List<UserRole> status: UserStatus rolesString: String } enum UserRole { ADMIN, OWNER, TENANT, SYSTEM } enum UserStatus { ACTIVE, INACTIVE } } package Link { Link "1" --> "1" User RefreshToken "1" --> "1" User class Link { token: String type: LinkType expiresAt: Instant } class RefreshToken { token: String } enum LinkType { RESET_PASSWORD, ACTIVATION, } } package person { Person "1" --> "1" Address Person "1" --> "1" User IndividualPerson -up-|> Person LegalPerson -up-|> Person class Person { email: String firstName: String lastName: String phone: String note: String deleted: boolean } class IndividualPerson { title: Title gender: Gender } class LegalPerson { companyName: String companyId: String vatId: String } enum Gender { M, F, OTHER } enum Title { MR, MRS, OTHER } } package payment { class Payment { personPaid: String paymentDate: LocalDate booked: boolean type: PaymentType paymentPurpose: String amount: MonteryAmount coldRent: BigDecimal runningCost: BigDecimal heatingCost: BigDecimal tax: BigDecimal amountAdded: BigDecimal } enum PaymentType { CASH, BANK_TRANSFER } } package Rent { Debit "*" --> "0..1" Person: tenant Debit "0..1" <--> "*" Payment: payments class Debit { date: LocalDate paymentDueDate: String month: Month year: Year booked: boolean amount: MonteryAmount coldRentAmount: MonteryAmount heatingCost: MonteryAmount runningCost: MonteryAmount BigDecimal: taxAmount status: DebitStatus } enum RentType { RENT DEPOSIT } enum DebitStatus { OPEN, EXPECTED, OVERDUE, PAID, PARTIALLY_PAID, OVERPAID } } package account { Account "1" <--> "*" AccountTransaction class Account { name: String remainingAmount: BigDecimal } class AccountTransaction { type: TransactionType date: LocalDate amount: BigDecimal } enum TransactionType { CREDIT, DEBIT } } package rental { RentalObject "1" --> "1" Address RentalObject "*" --> "0..1" Person: owner RentalObject "0..1" <--> "*" RentalUnit RentalUnit "*" --> "1" Person: owner RentalUnitContract "*" --> "0..1" RentalUnit: rentalUnit RentalUnitContract "*" --> "0..1" RentalUnitContract: replacedContract RentalUnitContract "*" --> "*" Person: tenants RentalUnitContract "1" --> "0..1" RentalUnitContractDetails: moveInDetails RentalUnitContract "1" --> "0..1" RentalUnitContractDetails: moveOutDetails RentalUnitContract "0..1" <--> "*" Debit: debits RentalUnitContract "0..1" <--> "*" Account: account class RentalObject { name: String category: RentalObjectCategory totalArea: Quantity note: String iban: String bankAccountUuid: String accountId: Long internalCode: String folderUuid: String deleted: boolean } class RentalUnit { type: RentalUnitType floor: String livingArea: Quantity name: String description: String note: String withTax: boolean status: RentalUnitStatus folderUuid: String deleted: boolean } class RentalUnitContract { startDate: LocalDate endDate: LocalDate note: String rentDueDay: Integer coldRentAmount: MonetaryAmount heatingCost: MonetaryAmount runningCost: MonetaryAmount depositAmount: MonetaryAmount taxAmount: BigDecimal attachments: Set<String> withTax: boolean annexed: boolean deleted: boolean } class RentalUnitContractDetails { meterReadingGas: BigDecimal meterReadingWater: BigDecimal meterReadingElectricity: BigDecimal note: String attachments: Set<String> } enum RentalObjectCategory { ENTIRE_BUILDING, HOUSING_UNITS, FAMILY_HOUSE } enum RentalUnitType { APARTMENT, GARAGE, PARKING_LOT, COMMERCIAL } enum RentalUnitStatus { ACTIVE, INACTIVE } } package email { class EmailTemplate { subject: String body: String type: EmailTemplateType } enum EmailTemplateType { RESET_PASSWORD, RESET_PASSWORD_SUCCESS, ACTIVATION, RENTAL_UNIT_OWNER, RENTAL_OBJECT_OWNER } } package content { enum ContentResourceType { RENTAL_OBJECT, RENTAL_UNIT, COST } } ```