Workshop: Wiederholungs-Übung (08.02.)

In diesem Workshop werden wir noch einmal eine durchgehende Übung bearbeiten, um die (nach der Umfragen) größten Unklarheiten noch einmal anzugehen. 

Anforderungstext

Sie sollen ein Softwaresystem für "EV-Experts.com" erstellen. 

EV-Experts.com sells and installs charging stations für EVs (electric vehicles). A customer (who wants to have a charging station for his EV in his house) fills in a contact form on EV-Experts.com. A sales person then calls the customer by phone and clarifies what the customer wants. The sales person then uses a configurator tool to offer a charging station with some details and a price, which he emails to the customer. If the customer accepts the price, the sales person hands over to an engineer. If not, the process is finished. The engineer uses a planning tool to plan the charging station. The sales person checks the planning tool, if the original price still covers the costs. If yes, the sales person hands over to the engineer again, and the charging station is ready to be built. If the original price was too low, the sales person adapts the price for the charging station in his configurator and emails it again to the customer. If the customer accepts the also the higher price, the sales person hands over to the engineer, and charging station is now ready to be built. If not, the process is finished. The engineer later also installs the charging station in the customer's house, in close coordination with the customer. 

Additional Hints

Aufgaben

Use-Case-Diagramm

Zeichnen Sie das Use-Case-Diagramm. 

Textuelles Use-Case-Szenario

Schreiben Sie das textuelle Use-Case-Szenario für den am ausführlichsten beschriebenen Use Case auf. 

Hier ist der Link zu einer Beispiel-Lösung

Use-Case-Szenario als Aktivitätsdiagramm

Schreiben Sie das obige Use-Case-Szenario als Aktivitätsdiagramm auf. 

Hier ist der Link zu einer Beispiel-Lösung. 

Fachliches Datenmodell

Erstellen Sie das fachliche Datenmodell. 

CRUD-Matrix

Stellen Sie die CRUD-Matrix auf und bestimmen Sie, welche Use Cases mindestens noch fehlen. 

Hier ist ein Link zu einer Beispiel-Lösung

Fachliches => logisches Datenmodell

1. Bestimmen Sie die Datentypen (Stamm-, Änderungs-, Bestands-, Bewegungsdaten).

2. Entfernen Sie unnötige Klassen.

Beachten Sie die Hinweise oben! Es steht nur der "Order"-Use-Case im Fokus. Den "Install"-Use-Case können Sie ignorieren. 

3. Welche Klassen müssen Sie hinzufügen? 

Hier nur die Stellen markiert, bei denen man Klassen hinzufügen muss:

Und dies die Variante mit den ergänzten Klassen (noch als ungerichtete Beziehungen): 

4. Zeichnen Sie das logische Datenmodell.

Statusdiagramm

1. Welche Status durchläuft das Entity "Contract"? Zeichnen Sie das Statusdiagramm. 

2. Implementieren Sie das Entity mit der Statusfolge.

ACHTUNG - ungetesteter Code, nur als Anhaltspunkt zu verstehen!


package thkoeln.archilab.exercises.chargingstation;

public enum ContractStatusType {
REQUESTED,
OFFERED,
ACCEPTED,
REJECTED,
IN_PLANNING,
PLANNED,
READY_TO_BUILD
}

package thkoeln.archilab.exercises.chargingstation;

public interface CustomerActivities {
public void accept();
public void reject();
}


package thkoeln.archilab.exercises.chargingstation;

public interface SalesPersonActivities {
public void updatePricing( Double price );
public void handOverToPlanning();
public void checkPlan( Boolean priceIsStillOK );
}


package thkoeln.archilab.exercises.chargingstation;

public interface EngineerActivities {
public void providePlan( Plan plan );
}


package thkoeln.archilab.exercises.chargingstation;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.ManyToOne;

import static thkoeln.archilab.exercises.chargingstation.ContractStatusType.*;

import java.util.Date;

@Getter
@NoArgsConstructor
public class Contract implements CustomerActivities, EngineerActivities, SalesPersonActivities {

@Setter
private String details;

private Double price;
private Boolean customerHasAccepted;
private Boolean handedOverToPlanning = Boolean.FALSE;
private Boolean priceIsStillOK = Boolean.FALSE;

@Setter
@ManyToOne
private Plan plan;

private Date date = new Date();

public ContractStatusType state() {
if( priceIsStillOK ) return READY_TO_BUILD;
if( plan != null ) return PLANNED;
if( handedOverToPlanning ) return IN_PLANNING;
if( customerHasAccepted != null ) {
return customerHasAccepted ? ACCEPTED : REJECTED;
}
if( price != null ) return OFFERED;
return REQUESTED;
}

@Override
public void accept() {
// todo - throw exception(s) when called in the wrong state
customerHasAccepted = Boolean.TRUE;
}

@Override
public void reject() {
// todo - throw exception(s) when called in the wrong state
customerHasAccepted = Boolean.TRUE;
}

@Override
public void providePlan(Plan plan) {
// todo - throw exception(s) when called in the wrong state
this.plan = plan;
}

@Override
public void updatePricing(Double price) {
// todo - throw exception(s) when called in the wrong state
this.price = price;
}

@Override
public void handOverToPlanning() {
// todo - throw exception(s) when called in the wrong state
this.handedOverToPlanning = Boolean.TRUE;
}

@Override
public void checkPlan(Boolean priceIsStillOK) {
// todo - throw exception(s) when called in the wrong state
this.priceIsStillOK = priceIsStillOK;
}
}