@startuml
left to right direction
'https://plantuml.com/class-diagram

package data_all.framework.model {

    abstract class AllEntity {
        id: Integer
        processed_update: Boolean
        processed_full_update: Boolean
        {classifier} set_processed_update()
        {classifier} set_processed_full_update()
        unset_processed_update()
        unset_processed_full_update()
        {classifier} remove_all()
        {classifier} __query_all()
        {classifier} get_all(page:Integer)
        {classifier} find_all()
        {classifier} find_all_as_dict()
        {classifier} find_all_as_str()
        {classifier} get_by_id()
        {classifier} find_by_id()
        {classifier} find_by_not_processed_update()
        {classifier} find_by_not_processed_full_update()
        set_all_processed_full_update()
        set_all_processed_update()
        {classifier} count()
    }
    abstract class AllImport {
        datum_reported: Date
		location: String
		location_group: String
		{classifier} download_file()
		{classifier} import_file()
		{classifier} full_update_dimension_tables()
		{classifier} full_update_fact_table()
		{classifier} full_update_star_schema()
		{classifier} update_dimension_tables()
		{classifier} update_fact_table()
		{classifier} update_star_schema()
	}
    abstract class AllDateReported {
        id: Integer
		date_reported:  String
	    year_week:  String
	    datum: Date
	    year: Integer
	    month: Integer
	    day_of_month: Integer
	    day_of_week: Integer
	    week_of_year: Integer
		get_name_for_weekday()
		{classifier} get_names_for_weekday()
		{classifier} get_datum_parts(my_date_rep: String)
		{classifier} get_datum(my_year: Integer, my_month: Integer, my_day: Integer)
		{classifier} get_datum_as_str(my_year: Integer, my_month: Integer, my_day: Integer)
		{classifier} my_year_week(my_iso_year: Integer, week_number: Integer)
		{classifier} create_new_object_factory(my_date_rep: String)
    }
    abstract class AllLocation {
        id: Integer
	    location:  String
	    {classifier} remove_all()
	    {classifier} get_all_as_page(page: Integer)
	    {classifier} get_all()
	    {classifier} get_all_as_dict()
	    {classifier} get_by_id(other_id: Integer)
	    {classifier} find_by_id(other_id: Integer)
    }
    abstract class AllLocationGroup {
        id: Integer
	    location_group:  String
	    {classifier} remove_all()
	    {classifier} get_all_as_page(page: Integer)
	    {classifier} get_all()
	    {classifier} get_all_as_dict()
	    {classifier} get_by_id(other_id: Integer)
	    {classifier} find_by_id(other_id: Integer)
    }
    abstract class AllFactTable {
	    id: Integer
	    {classifier} remove_all()
	    {classifier} get_all_as_page(page: Integer)
	    {classifier} get_all()
	    {classifier} get_all_as_dict()
	    {classifier} get_by_id(other_id: Integer)
	    {classifier} find_by_id(other_id: Integer)
    }

    AllLocation "1" *--> "*" AllLocationGroup : region
    AllFactTable "1" *--> "*" AllLocation : country
    AllFactTable "1" *--> "*" AllDateReported : date_reported
}


package data_ecdc {
    entity EcdcImport {}
    entity EcdcData {}
    entity EcdcDateReported {}
    entity EcdcCountry {}
    entity EcdcContinent {}

    AllImport <|- EcdcImport
    AllDateReported <|- EcdcDateReported
    AllLocation <|- EcdcCountry
    AllLocationGroup <|- EcdcContinent
    AllFactTable <|- EcdcData

    EcdcCountry "1" *--> "*" EcdcContinent : region
    EcdcData "1" *--> "*" EcdcCountry : country
    EcdcData "1" *--> "*" EcdcDateReported : date_reported
}

package data_owid {
    entity OwidImport {}
    entity OwidData {}
    entity OwidDateReported {}
    entity OwidCountry {}
    entity OwidContinent {}

    AllImport <|- OwidImport
    AllDateReported <|- OwidDateReported
    AllLocation <|- OwidCountry
    AllLocationGroup <|- OwidContinent
    AllFactTable <|- OwidData

    OwidCountry "1" *--> "*" OwidContinent : region
    OwidData "1" *--> "*" OwidCountry : country
    OwidData "1" *--> "*" OwidDateReported : date_reported
}

package data_rki {
    entity RkiData {}
    entity RkiMeldedatum {}
    entity RkiImport {}
    entity RkiLandkreis {}
    entity RkiBundesland {}
    entity RkiAltersgruppe {}

    AllImport <|- RkiImport
    AllDateReported <|- RkiMeldedatum
    AllLocation <|- RkiLandkreis
    AllLocationGroup <|- RkiBundesland
    AllFactTable <|- RkiData

    RkiLandkreis "1" *--> "*" RkiBundesland : region
    RkiData "1" *--> "*" RkiLandkreis : country
    RkiData "1" *--> "*" RkiMeldedatum : date_reported
    RkiData "1" *--> "*" RkiAltersgruppe : altersgruppe
}

package data_vaccination {
    entity VaccinationImport {}
    entity VaccinationData {}
    entity VaccinationDateReported {}

    AllImport <|- VaccinationImport
    AllDateReported <|- VaccinationDateReported
    AllFactTable <|- VaccinationData

    VaccinationData "1" *--> "*" VaccinationDateReported : date_reported
}

package data_who {
    entity WhoData {}
    entity WhoDateReported {}
    entity WhoImport {}
    entity WhoCountry {}
    entity WhoCountryRegion {}

    AllImport <|- WhoImport
    AllDateReported <|- WhoDateReported
    AllLocation <|- WhoCountry
    AllLocationGroup <|- WhoCountryRegion
    AllFactTable <|- WhoData

    WhoCountry "1" *--> "*" WhoCountryRegion : region
    WhoData "1" *--> "*" WhoCountry : country
    WhoData "1" *--> "*" WhoDateReported : date_reported

}

@enduml
