Visual representation of the UML Design


classDiagram
    class Quote {
        + quoteID: int
        + projectID: int
        + windows: list<Window>
        + subtotal: double
        + tax: double
        + total: double
        + status: QuoteStatus
        + dateCreated: date
        + dateModified: date
        + notes: string
        + AddWindow(window: Window): void
        + RemoveWindow(windowID: int): void
        + UpdateWindow(window: Window): void
        + CalculateSubtotal(): double
        + CalculateTax(): double
        + CalculateTotal(): double
        + GetQuoteDetails(): dict
        + GeneratePDF(): void
    }

    class Customer {
        + customerID: int
        + name: string
        + email: string
        + phoneNumber: string
        + address: string
        + projectAddress: string
        + projects: list<Project>
        + UpdateDetails(details: dict): void
        + GetCustomerDetails(): dict
    }

    class Project {
        + projectID: int
        + customer: Customer
        + quotes: list<Quote>
        + status: ProjectStatus
        + dateStarted: date
        + estimatedCompletionDate: date
        + AddQuote(quote: Quote): void
        + RemoveQuote(quoteID: int): void
        + UpdateStatus(status: string): void
        + GetProjectDetails(): dict
    }

    class Window {
        + windowID: int
        + type: WindowType
        + width: double
        + height: double
        + description: string
        + sashes: list<Sash>
        + installationCost: double
        + AddSash(sash: Sash): void
        + RemoveSash(sashID: int): void
        + GetSashes(): list<Sash>
        + CalculateCost()
        + PrintData()
    }

    class Sash {
        + sashID: int
        + windowID: int
        + width: double
        + height: double
        + perimeter: double
        + frameCost: double
        + numLites: int
        + design: Design
        + finish: Finish
        + glazings: list<Glazing>
        + CalculatePerimeter()
        + CalculateDesignCost()
        + CalculateFinishCost()
        + AddGlazing(glazing: Glazing): void
        + RemoveGlazing(glazingID: int): void
        + GetGlazings(): list<Glazing>
    }

    class Glazing {
        + glazingID: int
        + type: GlazingType
        + area: double
        + cost: double
        + addOns: list<AddOn>
        + CalculateArea()
        + CalculateAddOnCost()
        + AddAddOn(addOn: Addon): void
        + RemoveAddOn(addOnID: int): void
        + GetAddOns(): list<AddOn>
    }

    class RateCard {
        + itemType: string
        + itemName: string
        + rate: double
        + GetRate(itemType: string, itemName: string): double
        + UpdateRate(itemType: string, itemName: string, newRate: double): void
    }

    Quote "1" --> "many" Window : contains
    Customer "1" --> "many" Project : has
    Project "1" --> "many" Quote : has
    Window "1" --> "many" Sash : contains
    Sash "1" --> "many" Glazing : has