@startuml
/' For available options see
http://plantuml.com/component-diagram
http://plantuml.com/class-diagram '/

title
 <b>Class_diagram of <u>FourSchlag</u> project</b>
 <i>Description:</i> Reduced package / class dependencies of <i>SALES</i> KPI calculations
 <i>Version:</i> <b>DRAFT</b>, 13th Dec 2016
 <i>Author:</i> Mei Yuan
end title


left to right direction

package fourschlag {
    package fourschlag.entities {
        package fourschlag.entities.accessors {
            package fourschlag.entities.accessors.fixedcosts {
                Interface ActualFixedCostsAccessor

                Interface ForecastFixedCostsAccessor
            }

            package fourschlag.entities.accessors.sales {
                Interface ActualSalesAccessor

                Interface ForecastSalesAccessor
            }

            Interface ExchangeRateAccessor

            Interface OrgStructureAccessor

            Interface RegionAccessor
        }


        package fourschlag.entities.tables {
            package fourschlag.entities.tables.kpi {
                package fourschlag.entities.tables.kpi.fixedcosts {
                    Class ActualFixedCostsEntity

                    Class FixedCostsEntity

                    Class ForecastFixedCostsEntity

                    ' inheritances from FixedCostsEntity
                    FixedCostsEntity <|-- ActualFixedCostsEntity
                    FixedCostsEntity <|-- ForecastFixedCostsEntity
                }

                package fourschlag.entities.tables.kpi.sales {
                    Class ActualSalesEntity
                    Class ForecastSalesEntity
                    Class SalesEntity

                    ' inheritances from SalesEntity
                    SalesEntity <|-- ActualSalesEntity
                    SalesEntity <|-- ForecastSalesEntity

                }

                Class KpiEntity

                ' inheritances from KpiEntity
                KpiEntity <|-- FixedCostsEntity
                KpiEntity <|-- SalesEntity
            }

            Class ExchangeRateEntity

            Class OrgStructureEntity

            Class RegionEntity
        }

        package fourschlag.entities.types {
            package fourschlag.entities.types.comparators {
                Class OutputDataTypeComparator {
                    + int: compare()
                }
            }

            Enum Currency

            Enum DataSource

            Enum EntryType

            Enum KeyPerformanceIndicators

            Class OutputDataType

            Class Period

            Enum SalesType

            Class ValidatedResult

            Class ValidatedResultTopdown

            Class ZeroMonthPeriod

            ' inheritances from ValidatedResult
            ValidatedResult <|-- ValidatedResultTopdown

            ' inheritances from Period
            Period <|-- ZeroMonthPeriod
        }
    }


 package fourschlag.services {
        package fourschlag.services.data {
            package fourschlag.services.data.requests {
                package fourschlag.services.data.requests.kpi {
                    Class FixedCostsKpiRequest

                    Abstract Class KpiRequest

                    Class SalesKpiRequest
                }

                Class ExchangeRateRequest {
                    +double : getExchangeRate()
                }

                ' TODO: wichtige Methode hier eintragen
                Class FixedCostsRequest {
                    + boolean : setForecastFixedCosts()
                    + List<ForecastFixedCostsEntity> : getForecastFixedCosts()
                    + ForecastFixedCostsEntity : getForecastFixedCosts()
                    + List<ForecastFixedCostsEntity> : getForecastFixedCosts()
                    + Map<String, Set<String>> : getSubregionsAndSbu()
                }

                Class SalesRequest

                Class OrgStructureAndRegionRequest {
                    +Set<String> : getRegionsAsSetFromSales()
                    +Set<String> : getProductMainGroupsAsSetFromSales()
                }

                Abstract Class Request {
                    +Session : getSession()
                    +MappingManager : getManager()
                }

                ' inherits for Request
                Request <|-- KpiRequest
                Request <|-- ExchangeRateRequest
                Request <|-- FixedCostsRequest
                Request <|-- OrgStructureAndRegionRequest
                Request <|-- SalesRequest
                KpiRequest <|-- FixedCostsKpiRequest
                KpiRequest <|-- SalesKpiRequest

            }
                namespace fourschlag.services.data.requests{
                    .KpiRequest o-- ExchangeRateRequest
                }

            package fourschlag.services.data.service {
                Class FixedCostsService {
                    +Stream<OutputDataType> : getFixedCostsKpis()
                }

                Class SalesService {
                ' TODO: auf Stream anpassen! vgl mit FixedCosts
                    +List<OutputDataType> : getSalesKPIs()
                }

                Abstract Class Service {
                    +CassandraConnection : getConnection()
                    +{static}int : getNumberOfMonths()
                }

                Service <|-- SalesService
                Service <|-- FixedCostsService
            }
        }

        package fourschlag.services.db {
            Class CassandraConnection

            Enum ClusterEndpoints

            Class ConnectionPool {
                + getConnection()
            }

            Enum KeyspaceNames
        }
        namespace fourschlag.services.db{
            .CassandraConnection *-- ClusterEndpoints : has
            .CassandraConnection *-- KeyspaceNames : has
            .CassandraConnection ..> ConnectionPool : create
        }

        package fourschlag.services.web {
            package fourschlag.services.web.ws {
            'TODO: methoden bei den Webservices hinzufügen
                Class ForecastFixedCostsWS

                Class ForecastSalesWS

                Class ForecastWS {
                    +Response : getSalesKPIs()
                }

                Class ParameterValidator
            }
            namespace fourschlag.services.web.ws{
            .ForecastFixedCostsWS o-- FixedCostsService : use
            .ForecastSalesWS o-- SalesService : use
            .ForecastWS o-- FixedCostsService : use
            .ForecastWS o-- SalesService : use
            .ForecastWS *-- CassandraConnection : use
            .ForecastWS o-- OutputDataTypeComparator : use
            .ForecastFixedCostsWS *-- CassandraConnection : use
            .ForecastSalesWS *-- CassandraConnection : use
            }
        }
    }
            fourschlag.services.data.service *-- CassandraConnection : use
            fourschlag.services.data.requests o-- fourschlag.entities.accessors : use
            fourschlag.services.data.requests *-- CassandraConnection : use
}
@enduml