From a40db140b2be4ec170abc4f1961188bc369d9b8f Mon Sep 17 00:00:00 2001
From: osman <ahmed.osman@rwth-aachen.de>
Date: Tue, 21 Nov 2023 10:28:21 +0200
Subject: [PATCH] update get price-estimate

---
 demos/demo2/demo2_dzwald.py | 73 +++++++++++++++++++++++++------------
 1 file changed, 50 insertions(+), 23 deletions(-)

diff --git a/demos/demo2/demo2_dzwald.py b/demos/demo2/demo2_dzwald.py
index ad50d6a..ea712c6 100644
--- a/demos/demo2/demo2_dzwald.py
+++ b/demos/demo2/demo2_dzwald.py
@@ -12,6 +12,7 @@ import datetime
 import base64
 from urllib.parse import quote
 import requests
+import json
 
 import api
 import broker_api
@@ -24,8 +25,24 @@ sys.path.insert(0, os.path.dirname(parentdir))
 
 from model import enums, models, configs, security, utils
 
+class bcolors:
+    HEADER = '\033[95m'
+    OKBLUE = '\033[94m'
+    OKCYAN = '\033[96m'
+    OKGREEN = '\033[92m'
+    WARNING = '\033[93m'
+    FAIL = '\033[91m'
+    ENDC = '\033[0m'
+    BOLD = '\033[1m'
+    UNDERLINE = '\033[4m'
+
 # print info logs to console
-logger = logging.getLogger("broker_api")
+logger = logging.getLogger("dzwald")
+ch = logging.StreamHandler()
+ch.setLevel(logging.INFO)
+formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ch.setFormatter(formatter)
+logger.addHandler(ch)
 logger.setLevel(logging.INFO)
 
 # Thing ID and secret in the S3I-Identityprovider
@@ -211,14 +228,14 @@ def create_holzliste():
             menge=4.7,
             stammlaenge=4.3,
             stammnummer="2",
-            mittendurchmesser=63.0,
+            mittendurchmesser=37.0,
             gueteklasse=enums.Gueteklasse.Qualitaet_A
         ),
         models.Einzelstamm(
             menge=2.7,
             stammlaenge=2.3,
             stammnummer="3",
-            mittendurchmesser=63.0,
+            mittendurchmesser=37.0,
             gueteklasse=enums.Gueteklasse.Qualitaet_A,
             klammerstammabschnittsnummer="1"
         ),
@@ -250,7 +267,7 @@ def create_holzliste():
         polterliste=[polter],
         sortimentstyp=enums.Sortimentstyp.Stammholz,
         sorte=enums.Sorte.lang,
-        holzart=enums.Holzart.Fichte,
+        holzart=enums.Holzart.Kiefer,
         preismatrix=create_preismatrix())
 
     return holzliste
@@ -266,7 +283,7 @@ def create_zu_faellende_baeume():
     baum1 = models.StehenderBaum(
         hoehe=20.3,
         bhd=30.2,
-        baumart=enums.Holzart.Fichte,
+        baumart=enums.Holzart.Kiefer,
         position=models.Standort(koordinate=koordinate_baum1,
                                  notiz="Die Position Fichte")
     )
@@ -278,7 +295,7 @@ def create_zu_faellende_baeume():
     baum2 = models.StehenderBaum(
         hoehe=17.0,
         bhd=31.2,
-        baumart=enums.Holzart.Eiche,
+        baumart=enums.Holzart.Kiefer,
         position=models.Standort(koordinate=koordinate_baum2, notiz="Die Position Eiche")
     )
 
@@ -289,7 +306,7 @@ def create_zu_faellende_baeume():
     baum3 = models.StehenderBaum(
         hoehe=15.3,
         bhd=20.2,
-        baumart=enums.Holzart.Buche,
+        baumart=enums.Holzart.Kiefer,
         position=models.Standort(koordinate=koordinate_baum3, notiz="Die Position Buche")
     )
 
@@ -308,7 +325,7 @@ def create_zu_faellende_baeume():
 def create_holzpreisbereiche():
     # TODO: Warum braucht man Holzpreisbereich, wenn es schon Preismatrizen gibt?
     holzpreisbereich = models.Holzpreisbereich(
-        baumart=enums.Holzart.Fichte,
+        baumart=enums.Holzart.Kiefer,
         preis_von=50.0,
         preis_bis=80.0,
         sorte=enums.Sorte.lang,
@@ -354,7 +371,7 @@ def create_bestandesdaten():
         id=model.Identifier("https://www.company.com/submodels/bestandesdaten"),
         umring=create_umring(),
         waldbesitzer=create_example_contact(kontaktrolle=enums.Kontaktrolle.Waldbesitzer),
-        baumarten=[enums.Holzart.Fichte]
+        baumarten=[enums.Holzart.Kiefer]
     )
 
     return bestandesdaten
@@ -501,6 +518,7 @@ def getHolzpreisbereich(provider: api.ModelProvider, HolzlisteId: str):
     # TODO: REST
     # CALL to Forstify
     # create a placeholder reply for now
+    """
     reply = {
         "Baumart": "kie",
         "PreisVon": 14500.0,
@@ -511,28 +529,37 @@ def getHolzpreisbereich(provider: api.ModelProvider, HolzlisteId: str):
         "Datum": "8/4/2023, 10:56:39 AM",
         "Quelle": "Forstify Marktplatz Angebote"
     }
+    """
+    convert_table = {
+        "d3a": 34.0,
+        "d3b": 39.0,
+        "d4": 49.0,
+        "d5": 59.0,
+    }
+    headers = {"Content-Type": "application/json", "X-API-KEY": "1234"}
+    serializer = json_serialization.AASToJsonEncoder()
+    reply = requests.get(url="https://forstify-app-research.azurewebsites.net/api/v2/external/priceestimate", 
+                         headers=headers, data=json.dumps({"value": serializer.encode(holzliste_sm)}))
+    logger.info(f"{bcolors.OKCYAN}Received price-estimate: {reply.json()}{bcolors.ENDC}")
+    reply_json = reply.json()
     date_format = '%m/%d/%Y, %H:%M:%S %p'
     holzpreisbereich = models.Holzpreisbereich(
-        baumart=enums.Holzart(reply["Baumart"]),
-        preis_von=reply["PreisVon"],
-        preis_bis=reply["PreisBis"],
-        sorte=enums.Sorte(reply["Sorte"]),
-        mittendurchmesser_bis=reply["MittendurchmesserBis"],
-        mittendurchmesser_von=reply["MittendurchmesserVon"],
-        datum=datetime.datetime.strptime(reply["Datum"], date_format),
-        quelle=reply["Quelle"], 
+        baumart=enums.Holzart(reply_json["Baumart"]),
+        preis_von=float(reply_json["PreisVon"]),
+        preis_bis=float(reply_json["PreisBis"]),
+        sorte=enums.Sortimentstyp(reply_json["Sorte"]),
+        mittendurchmesser_bis=convert_table[reply_json["MittendurchmesserBis"]],
+        mittendurchmesser_von=convert_table[reply_json["MittendurchmesserVon"]],
+        datum=datetime.datetime.strptime(reply_json["Datum"], date_format),
+        quelle=reply_json["Quelle"], 
         holzliste=model.ModelReference.from_referable(holzliste_sm)
     )
     holzpreisbereiche_id = "https://www.company.com/submodels/holzpreisbereiche"
     holzpreisbereiche: model.SubmodelElementList =  provider.getValue(
         f"/aas/submodels/{helpers.encode_id(holzpreisbereiche_id)}/submodel"
         )
-    #headers = {"Content-Type": "application/json", "X-API-KEY": "1234"}
-    #serializer = json_serialization.AASToJsonEncoder()
-    #reply = requests.get(url="https://forstify-app-research.azurewebsites.net/api/v2/external/priceestimate", 
-    #                     headers=headers, data=serializer.encode(holzliste_sm))
     utils.add_items_to_se_list(holzpreisbereiche, [holzpreisbereich])
-    return reply
+    return reply_json
     
 
 
@@ -579,7 +606,7 @@ def main():
     #print(getHolzpreisbereich(provider, HolzlisteId))
 
     # set last flag to True to enable security
-    server = broker_api.S3IBServer(access_token, provider, dzwald_id, loop, "https://www.company.com/security", True)
+    server = broker_api.S3IBServer(access_token, provider, dzwald_id, loop, "https://www.company.com/security", False)
 
     # add callable associated with operation 'getHolzpreisbereich' to server
     callable = lambda **kwargs : getHolzpreisbereich(provider, **kwargs)
-- 
GitLab