Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Align nullability of BO Vertrag and COM Vertragsteil with BO4E.NET #297

Merged
merged 4 commits into from
May 28, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bo/businessobject.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ func NewBusinessObject(typ botyp.BOTyp) BusinessObject {
bo = new(Vertrag)
bo.(*Vertrag).BoTyp = typ
bo.(*Vertrag).VersionStruktur = defaultVersionStruktur
bo.(*Vertrag).Vertragspartner1.BoTyp = botyp.GESCHAEFTSPARTNER
bo.(*Vertrag).Vertragspartner2.BoTyp = botyp.GESCHAEFTSPARTNER
// bo.(*Vertrag).Vertragspartner1.BoTyp = botyp.GESCHAEFTSPARTNER
hf-kklein marked this conversation as resolved.
Show resolved Hide resolved
// bo.(*Vertrag).Vertragspartner2.BoTyp = botyp.GESCHAEFTSPARTNER
hf-kklein marked this conversation as resolved.
Show resolved Hide resolved
case botyp.ZAEHLER:
bo = new(Zaehler)
bo.(*Zaehler).BoTyp = typ
Expand Down
14 changes: 7 additions & 7 deletions bo/vertrag.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ import (
// Vertrag ist ein Modell für die Abbildung von Vertragsbeziehungen. Das Objekt dient dazu, alle Arten von Verträgen, die in der Energiewirtschaft Verwendung finden, abzubilden.
type Vertrag struct {
Geschaeftsobjekt
Vertragsnummer string `json:"vertragsnummer,omitempty" validate:"alphanum,required"` // Vertragsnummer ist eine im Verwendungskontext eindeutige Nummer für den Vertrag
Beschreibung string `json:"beschreibung,omitempty"` // Beschreibung zum Vertrag
Vertragsstatus vertragsstatus.Vertragsstatus `json:"vertragstatus,omitempty" validate:"required"` // Vertragsstatus ist der Status des Vertrags
Vertragsnummer *string `json:"vertragsnummer,omitempty" validate:"alphanum,required"` // Vertragsnummer ist eine im Verwendungskontext eindeutige Nummer für den Vertrag
Beschreibung *string `json:"beschreibung,omitempty"` // Beschreibung zum Vertrag
Vertragsstatus *vertragsstatus.Vertragsstatus `json:"vertragstatus,omitempty" validate:"required"` // Vertragsstatus ist der Status des Vertrags
// vertragsstatus serializes as "vertragstatus" with single "s" for compatability.
Vertragsart vertragsart.Vertragsart `json:"vertragsart,omitempty" validate:"required"` // Vertragsart legt fest, um welche Art von Vertrag es sich handelt. Z.B. Netznutzungvertrag.
Vertragsart *vertragsart.Vertragsart `json:"vertragsart,omitempty" validate:"required"` // Vertragsart legt fest, um welche Art von Vertrag es sich handelt. Z.B. Netznutzungvertrag.
Sparte sparte.Sparte `json:"sparte,omitempty" validate:"required"` // Sparte sind Unterscheidungsmöglichkeiten für die Sparte
Vertragsbeginn time.Time `json:"vertragsbeginn,omitempty" validate:"required"` // Vertragsbeginn is the inclusive start
Vertragsende time.Time `json:"vertragsende,omitempty" validate:"required,gtfield=Vertragsbeginn"` // Vertragsende is the exclusive end
Vertragspartner1 Geschaeftspartner `json:"vertragspartner1,omitempty" validate:"required"` // Vertragspartner1 ist der "erstgenannte" Vertragspartner. In der Regel der Aussteller des Vertrags. Beispiel: "Vertrag zwischen Vertragspartner 1 ..."
Vertragspartner2 Geschaeftspartner `json:"vertragspartner2,omitempty" validate:"required"` // Vertragspartner2 ist der "zweitgenannte" Vertragspartner. In der Regel der Empfänger des Vertrags. Beispiel "Vertrag zwischen Vertragspartner 1 und Vertragspartner 2"
Vertragsende *time.Time `json:"vertragsende,omitempty" validate:"required,gtfield=Vertragsbeginn"` // Vertragsende is the exclusive end
Vertragspartner1 *Geschaeftspartner `json:"vertragspartner1,omitempty" validate:"required"` // Vertragspartner1 ist der "erstgenannte" Vertragspartner. In der Regel der Aussteller des Vertrags. Beispiel: "Vertrag zwischen Vertragspartner 1 ..."
Vertragspartner2 *Geschaeftspartner `json:"vertragspartner2,omitempty" validate:"required"` // Vertragspartner2 ist der "zweitgenannte" Vertragspartner. In der Regel der Empfänger des Vertrags. Beispiel "Vertrag zwischen Vertragspartner 1 und Vertragspartner 2"
UnterzeichnerVp1 []com.Unterschrift `json:"unterzeichnervp1,omitempty"` // UnterzeichnerVp1 ist der Unterzeichner des Vertragspartner1
UnterzeichnerVp2 []com.Unterschrift `json:"unterzeichnervp2,omitempty"` // UnterzeichnerVp2 ist der Unterzeichner des Vertragspartner2
Vertragskonditionen *com.Vertragskonditionen `json:"vertragskonditionen,omitempty"` // Vertragskonditionen ist eine Festlegungen zu Laufzeiten und Kündigungsfristen
Expand Down
50 changes: 25 additions & 25 deletions bo/vertrag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ func Test_Vertrag_Deserialization(t *testing.T) {
VersionStruktur: "2",
ExterneReferenzen: nil,
},
Vertragsnummer: "",
Beschreibung: "",
Vertragsstatus: vertragsstatus.ABGELEHNT,
Vertragsart: vertragsart.BUENDELVERTRAG,
Vertragsnummer: internal.Ptr(""),
Beschreibung: internal.Ptr(""),
Vertragsstatus: internal.Ptr(vertragsstatus.ABGELEHNT),
Vertragsart: internal.Ptr(vertragsart.BUENDELVERTRAG),
Sparte: sparte.STROM,
Vertragsbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragspartner1: bo.Geschaeftspartner{
Vertragsende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragspartner1: internal.Ptr(bo.Geschaeftspartner{
Geschaeftsobjekt: bo.Geschaeftsobjekt{
BoTyp: botyp.GESCHAEFTSPARTNER,
VersionStruktur: "1",
Expand All @@ -56,8 +56,8 @@ func Test_Vertrag_Deserialization(t *testing.T) {
Geschaeftspartnerrollen: []geschaeftspartnerrolle.Geschaeftspartnerrolle{
geschaeftspartnerrolle.DIENSTLEISTER,
},
},
Vertragspartner2: bo.Geschaeftspartner{
}),
Vertragspartner2: internal.Ptr(bo.Geschaeftspartner{
Geschaeftsobjekt: bo.Geschaeftsobjekt{
BoTyp: botyp.GESCHAEFTSPARTNER,
VersionStruktur: "1",
Expand All @@ -76,15 +76,15 @@ func Test_Vertrag_Deserialization(t *testing.T) {
Geschaeftspartnerrollen: []geschaeftspartnerrolle.Geschaeftspartnerrolle{
geschaeftspartnerrolle.DIENSTLEISTER,
},
},
}),
UnterzeichnerVp1: nil,
UnterzeichnerVp2: nil,
Vertragskonditionen: nil,
Vertragsteile: []com.Vertragsteil{
{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "DE0123456789012345678901234567890",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("DE0123456789012345678901234567890"),
},
},
Gemeinderabatt: decimal.NewNullDecimal(decimal.NewFromInt(50)),
Expand All @@ -108,7 +108,7 @@ func Test_Failed_VertragValidation(t *testing.T) {
"gtfield": {
bo.Vertrag{
Vertragsbeginn: time.Now(),
Vertragsende: time.Now().Add(time.Hour * -12),
Vertragsende: internal.Ptr(time.Now().Add(time.Hour * -12)),
},
},
}
Expand All @@ -126,14 +126,14 @@ func Test_Successful_Vertrag_Validation(t *testing.T) {
VersionStruktur: "1",
ExterneReferenzen: nil,
},
Vertragsnummer: "asd",
Beschreibung: "",
Vertragsstatus: vertragsstatus.ANGENOMMEN,
Vertragsart: vertragsart.BUENDELVERTRAG,
Vertragsnummer: internal.Ptr("asd"),
Beschreibung: internal.Ptr("asd"),
Vertragsstatus: internal.Ptr(vertragsstatus.ANGENOMMEN),
Vertragsart: internal.Ptr(vertragsart.BUENDELVERTRAG),
Sparte: sparte.STROM,
Vertragsbeginn: time.Now(),
Vertragsende: time.Now().Add(time.Hour * 24),
Vertragspartner1: bo.Geschaeftspartner{
Vertragsende: internal.Ptr(time.Now().Add(time.Hour * 24)),
Vertragspartner1: internal.Ptr(bo.Geschaeftspartner{
Geschaeftsobjekt: bo.Geschaeftsobjekt{
BoTyp: botyp.GESCHAEFTSPARTNER,
VersionStruktur: "1",
Expand All @@ -151,8 +151,8 @@ func Test_Successful_Vertrag_Validation(t *testing.T) {
Geschaeftspartnerrollen: []geschaeftspartnerrolle.Geschaeftspartnerrolle{
geschaeftspartnerrolle.DIENSTLEISTER,
},
},
Vertragspartner2: bo.Geschaeftspartner{
}),
Vertragspartner2: internal.Ptr(bo.Geschaeftspartner{
Geschaeftsobjekt: bo.Geschaeftsobjekt{
BoTyp: botyp.GESCHAEFTSPARTNER,
VersionStruktur: "1",
Expand All @@ -170,15 +170,15 @@ func Test_Successful_Vertrag_Validation(t *testing.T) {
Geschaeftspartnerrollen: []geschaeftspartnerrolle.Geschaeftspartnerrolle{
geschaeftspartnerrolle.DIENSTLEISTER,
},
},
}),
UnterzeichnerVp1: nil,
UnterzeichnerVp2: nil,
Vertragskonditionen: nil,
Vertragsteile: []com.Vertragsteil{
{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "DE0123456789012345678901234567890",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("DE0123456789012345678901234567890"),
},
},
Gemeinderabatt: decimal.NewNullDecimal(decimal.NewFromInt(50)),
Expand Down
12 changes: 6 additions & 6 deletions com/vertragsteil.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import "time"

// Vertragsteil wird dazu verwendet, eine vertragliche Leistung in Bezug zu einer Lokation (Markt- oder Messlokation) festzulegen.
type Vertragsteil struct {
Vertragsteilbeginn time.Time `json:"vertragsteilbeginn,omitempty" validate:"required"` // Vertragsteilbeginn ist der inklusive Start der Gültigkeit des Vertragsteils
Vertragsteilende time.Time `json:"vertragsteilende,omitempty" validate:"required,gtfield=Vertragsteilbeginn"` // Vertragsteilende ist das exklusive Ende der Gültigkeit des Vertragsteils
Lokation string `json:"lokation,omitempty" validate:"omitempty,alphanum,min=11,max=33"` // Lokation ist der Identifier für diejenigen Markt- oder Messlokation, die zu diesem Vertragsteil gehören. Verträge für mehrere Lokationen werden mit mehreren Vertragsteilen abgebildet.
VertraglichFixierteMenge *Menge `json:"vertraglichFixierteMenge,omitempty"` // VertraglichFixierteMenge ist die für die Lokation festgeschriebene Abnahmemenge
MinimaleAbnahmemenge *Menge `json:"minimaleAbnahmemenge,omitempty"` // MinimaleAbnahmemenge ist die, für die Lokation festgelegte Mindestabnahmemenge
MaximaleAbnahmemenge *Menge `json:"maximaleAbnahmemenge,omitempty"` // MaximaleAbnahmemenge ist die, für die Lokation festgelegte maximale Abnahmemenge
Vertragsteilbeginn *time.Time `json:"vertragsteilbeginn,omitempty"` // Vertragsteilbeginn ist der inklusive Start der Gültigkeit des Vertragsteils
Vertragsteilende *time.Time `json:"vertragsteilende,omitempty" validate:"gtfield=Vertragsteilbeginn"` // Vertragsteilende ist das exklusive Ende der Gültigkeit des Vertragsteils
Lokation *string `json:"lokation,omitempty" validate:"omitempty,alphanum,min=11,max=33"` // Lokation ist der Identifier für diejenigen Markt- oder Messlokation, die zu diesem Vertragsteil gehören. Verträge für mehrere Lokationen werden mit mehreren Vertragsteilen abgebildet.
VertraglichFixierteMenge *Menge `json:"vertraglichFixierteMenge,omitempty"` // VertraglichFixierteMenge ist die für die Lokation festgeschriebene Abnahmemenge
MinimaleAbnahmemenge *Menge `json:"minimaleAbnahmemenge,omitempty"` // MinimaleAbnahmemenge ist die, für die Lokation festgelegte Mindestabnahmemenge
MaximaleAbnahmemenge *Menge `json:"maximaleAbnahmemenge,omitempty"` // MaximaleAbnahmemenge ist die, für die Lokation festgelegte maximale Abnahmemenge
}
54 changes: 22 additions & 32 deletions com/vertragsteil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ import (
// TestVertragsteilDeserialization deserializes a Vertragsteil json
func Test_Vertragsteil_Deserialization(t *testing.T) {
var vertraqsteil = com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "DE0123456789012345678901234567890",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("DE0123456789012345678901234567890"),
VertraglichFixierteMenge: &com.Menge{
Wert: decimal.NewFromFloat(42),
Einheit: internal.Ptr(mengeneinheit.KUBIKMETER),
Expand Down Expand Up @@ -49,41 +49,31 @@ func Test_Vertragsteil_Deserialization(t *testing.T) {
func Test_Vertragsteil_Failed_Validation(t *testing.T) {
validate := validator.New()
invalidVertragsteile := map[string][]interface{}{
"required": {
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Time{},
},
com.Vertragsteil{
Vertragsteilende: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilbeginn: time.Time{},
},
},
"min": {
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "tooshort",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("tooshort"),
},
},
"max": {
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "tooooooooooooooooooooooooooooooolong",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("tooooooooooooooooooooooooooooooolong"),
},
},
"alphanum": {
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "not!alpha&num",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("not!alpha&num"),
},
},
"gtfield": {
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2024, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilbeginn: internal.Ptr(time.Date(2024, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
},
},
}
Expand All @@ -95,9 +85,9 @@ func Test_Successful_Vertragsteil_Validation(t *testing.T) {
validate := validator.New()
validVertragsteile := []interface{}{
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "DE0123456789012345678901234567890",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("DE0123456789012345678901234567890"),
VertraglichFixierteMenge: &com.Menge{
Wert: decimal.NewFromFloat(42),
Einheit: internal.Ptr(mengeneinheit.KUBIKMETER),
Expand All @@ -112,13 +102,13 @@ func Test_Successful_Vertragsteil_Validation(t *testing.T) {
},
},
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
},
com.Vertragsteil{
Vertragsteilbeginn: time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC),
Vertragsteilende: time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC),
Lokation: "543231012345",
Vertragsteilbeginn: internal.Ptr(time.Date(2022, 8, 1, 0, 0, 0, 0, time.UTC)),
Vertragsteilende: internal.Ptr(time.Date(2023, 8, 1, 0, 0, 0, 0, time.UTC)),
Lokation: internal.Ptr("543231012345"),
},
}
VerifySuccessfulValidations(t, validate, validVertragsteile)
Expand Down
Loading