From 5b4e287d6f2d804101763400bb22c3d82e899fc7 Mon Sep 17 00:00:00 2001
From: sukanya <sukanya.k@niveussolutions.com>
Date: Fri, 21 Mar 2025 10:35:31 +0530
Subject: [PATCH] first commit

---
 __init__.py                                   |   0
 __pycache__/__init__.cpython-310.pyc          | Bin 0 -> 148 bytes
 __pycache__/config.cpython-310.pyc            | Bin 0 -> 508 bytes
 __pycache__/process_data.cpython-310.pyc      | Bin 0 -> 2931 bytes
 ..._process_data.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 7192 bytes
 config.json                                   |  29 ++++++
 config.py                                     |  31 +++++++
 data/HinduInput.xlsx                          | Bin 0 -> 7851 bytes
 data/HinduInput1.xlsx                         | Bin 0 -> 10736 bytes
 data/Jan16.xlsx                               | Bin 0 -> 20594 bytes
 data/Jan16_1.xlsx                             | Bin 0 -> 17617 bytes
 data/evldec17.xlsx                            | Bin 0 -> 5582 bytes
 data/speak2.xlsx                              | Bin 0 -> 5948 bytes
 main.py                                       |   7 ++
 process_data.py                               |  87 ++++++++++++++++++
 pytest.ini                                    |   2 +
 requirements.txt                              |   2 +
 sonar-project.properties                      |  11 +++
 tests/__init__.py                             |   0
 tests/__pycache__/__init__.cpython-310.pyc    | Bin 0 -> 154 bytes
 ...st_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2672 bytes
 ...cel_operation.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3632 bytes
 ...yload_mapping.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2706 bytes
 ...ts_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 1951 bytes
 tests/test_api_client.py                      |  44 +++++++++
 tests/test_excel_operation.py                 |  49 ++++++++++
 tests/test_payload_mapping.py                 |  53 +++++++++++
 utils/__init__.py                             |   2 +
 utils/__pycache__/__init__.cpython-310.pyc    | Bin 0 -> 259 bytes
 utils/__pycache__/api_client.cpython-310.pyc  | Bin 0 -> 555 bytes
 .../excel_operations.cpython-310.pyc          | Bin 0 -> 759 bytes
 .../payload_mapping.cpython-310.pyc           | Bin 0 -> 645 bytes
 ...st_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2672 bytes
 ...cel_operation.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3632 bytes
 ...yload_mapping.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 2706 bytes
 ...t_unpack_data.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 3266 bytes
 ...ts_api_client.cpython-310-pytest-8.3.5.pyc | Bin 0 -> 1940 bytes
 utils/__pycache__/unpack_data.cpython-310.pyc | Bin 0 -> 994 bytes
 utils/api_client.py                           |  18 ++++
 utils/excel_operations.py                     |  17 ++++
 utils/payload_mapping.py                      |  46 +++++++++
 utils/unpack_data.py                          |  25 +++++
 42 files changed, 423 insertions(+)
 create mode 100644 __init__.py
 create mode 100644 __pycache__/__init__.cpython-310.pyc
 create mode 100644 __pycache__/config.cpython-310.pyc
 create mode 100644 __pycache__/process_data.cpython-310.pyc
 create mode 100644 __pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc
 create mode 100644 config.json
 create mode 100644 config.py
 create mode 100644 data/HinduInput.xlsx
 create mode 100644 data/HinduInput1.xlsx
 create mode 100644 data/Jan16.xlsx
 create mode 100644 data/Jan16_1.xlsx
 create mode 100644 data/evldec17.xlsx
 create mode 100644 data/speak2.xlsx
 create mode 100644 main.py
 create mode 100644 process_data.py
 create mode 100644 pytest.ini
 create mode 100644 requirements.txt
 create mode 100644 sonar-project.properties
 create mode 100644 tests/__init__.py
 create mode 100644 tests/__pycache__/__init__.cpython-310.pyc
 create mode 100644 tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc
 create mode 100644 tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc
 create mode 100644 tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc
 create mode 100644 tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc
 create mode 100644 tests/test_api_client.py
 create mode 100644 tests/test_excel_operation.py
 create mode 100644 tests/test_payload_mapping.py
 create mode 100644 utils/__init__.py
 create mode 100644 utils/__pycache__/__init__.cpython-310.pyc
 create mode 100644 utils/__pycache__/api_client.cpython-310.pyc
 create mode 100644 utils/__pycache__/excel_operations.cpython-310.pyc
 create mode 100644 utils/__pycache__/payload_mapping.cpython-310.pyc
 create mode 100644 utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc
 create mode 100644 utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc
 create mode 100644 utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc
 create mode 100644 utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc
 create mode 100644 utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc
 create mode 100644 utils/__pycache__/unpack_data.cpython-310.pyc
 create mode 100644 utils/api_client.py
 create mode 100644 utils/excel_operations.py
 create mode 100644 utils/payload_mapping.py
 create mode 100644 utils/unpack_data.py

diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/__pycache__/__init__.cpython-310.pyc b/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..44df40220e6d47f62b93fcb297f1b3ebe46ef011
GIT binary patch
literal 148
zcmd1j<>g{vU|^W@^>#XleheazF(U&5g98HtLoo{j149Z!FoPze-%5rekT8PyWv-u*
zpPQ;*TAW&>?~<Qfnwy$eQmpThnU_+kAC#JyQj%X@lv$GMT9KTZqaPoinU`4-AFo$X
Yd5gm)H$SB`C)EyQU@;Q|0|N^K0B1EKt^fc4

literal 0
HcmV?d00001

diff --git a/__pycache__/config.cpython-310.pyc b/__pycache__/config.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..89f86a3be7f575f426db597c83e1ee380c036e7a
GIT binary patch
literal 508
zcmd1j<>g{vU|^8RIhFpAnStRkh=Ytd7#J8F7#J9eD;O9UQW#Pga~Pr+QW;a2Qka{W
z`gx<6QW+L7r!p;MjA99ANMU4QU}0!xW@O0YFk~o}EN5h70KrHGMut?D6c$N_DArV#
z6jn)wD7I9V6gEkQDE3sA6n065D2`N?6b?y-D9%)t6i!KoD6UkN6fQ}IDDD)-U<OU@
zmmoL!RdFZh=cQ$)>tz+^=iOo~y2b7o;29qp<a0~F(=Q-2B;GZ`+0`fB&C|#AmY{!V
z2$~QdRLH~C(Zw|=_?D!be~_<ZNQkRTe2{B!fWKd`YjC`?f2d!`EztnSNFRSkmv}c%
zS09()_}~!75Kre@A`ok!f-aGMj=rAGnmo5yzz$-`FG$V11$AS5T4qk_EtZ`8#FSfX
z&i;OGp6*4=3=9lKEFgjvM6iJfb`Svy<swc728NXkMf@NE5b?`YKO;XkRll@2wMgG3
zKe;qFHLs*t-y<_GrBpvCH8G_mzq}~3B-OPdIW<Qg8Zrfyw>WHa^HWN5QtcQ)@g~N=
Vz`!BM!_31d^Phu-gAoRK7y<Dld;9<Z

literal 0
HcmV?d00001

diff --git a/__pycache__/process_data.cpython-310.pyc b/__pycache__/process_data.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a3c6b5ea023cd1de63ed081aa210f6a00ee9472c
GIT binary patch
literal 2931
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
YG$+*#lzEFmwGaoB45J7m4+ydV0RHCKtpET3

literal 0
HcmV?d00001

diff --git a/__pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_process_data.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7d0e17374174aef97fa0e0810d72c3318cd2458c
GIT binary patch
literal 7192
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
KPneBSfDr)l5sOy<

literal 0
HcmV?d00001

diff --git a/config.json b/config.json
new file mode 100644
index 0000000..6861120
--- /dev/null
+++ b/config.json
@@ -0,0 +1,29 @@
+{
+  "API_URL": "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email",
+  "INPUT_EXCEL_FILE": "/home/user/Documents/Hindu/ReadtowriteExcel/data/HinduInput1.xlsx",
+  "OUTPUT_EXCEL_FILE": "data/evldec17.xlsx",
+
+  "OUTPUT_HEADERS": [
+    "Cefr Level",
+    "Scenario",
+    "Scenario Question",
+    "Subject",
+    "Email Content"
+  ],
+
+  "FORMATTED_RESPONSES_COUNT": 1,
+
+  "PAYLOAD_FIELDS_STATIC": {
+    "user_id": 7600001,
+    "question_id": 100456,
+    "answer_id": 120000789
+  },
+
+  "INPUT_FIELDS_DYNAMIC": {
+    "Cefr Level": "cefr_level",
+    "Scenario": "scenario",
+    "Scenario Question": "scenario_question",
+    "Subject": "subject",
+    "Email Content": "email_content"
+  }
+}
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..c41a51f
--- /dev/null
+++ b/config.py
@@ -0,0 +1,31 @@
+# # config.py
+#
+# API_URL = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email"
+# INPUT_EXCEL_FILE = "data/Jan16_1.xlsx"
+# OUTPUT_EXCEL_FILE = "data/evldec17.xlsx"
+# #Headers means out headers to display in excel sheet
+# HEADERS = [
+#     "Cefr Level",
+#     "Scenario",
+#     "Scenario Question",
+#     "Subject",
+#     "Email Content"
+# ]
+#
+# # Response configuration
+# FORMATTED_RESPONSES_COUNT = 3
+
+import json
+
+# Load configuration from JSON
+with open("config.json", "r") as config_file:
+    CONFIG = json.load(config_file)
+
+# Extract values dynamically
+API_URL = CONFIG["API_URL"]
+INPUT_EXCEL_FILE = CONFIG["INPUT_EXCEL_FILE"]
+OUTPUT_EXCEL_FILE = CONFIG["OUTPUT_EXCEL_FILE"]
+OUTPUT_HEADERS = CONFIG["OUTPUT_HEADERS"]
+FORMATTED_RESPONSES_COUNT = CONFIG["FORMATTED_RESPONSES_COUNT"]
+PAYLOAD_FIELDS_STATIC = CONFIG["PAYLOAD_FIELDS_STATIC"]  # Static fields (user_id, question_id, etc.)
+INPUT_FIELDS_DYNAMIC = CONFIG["INPUT_FIELDS_DYNAMIC"]  # Mapping for dynamic unpacking
diff --git a/data/HinduInput.xlsx b/data/HinduInput.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..e0a142fb1b268bf7ffb9bb91d9f2b65ef1b4d9ca
GIT binary patch
literal 7851
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

literal 0
HcmV?d00001

diff --git a/data/HinduInput1.xlsx b/data/HinduInput1.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..e9df0b042a5f525634084a3d79209c91d1adbe31
GIT binary patch
literal 10736
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

literal 0
HcmV?d00001

diff --git a/data/Jan16.xlsx b/data/Jan16.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..b8d7521ff0b49fbdc79b833ee365e8117c03f012
GIT binary patch
literal 20594
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
CR++{C

literal 0
HcmV?d00001

diff --git a/data/Jan16_1.xlsx b/data/Jan16_1.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..e3b3c060ee4e368a8d5413ddfb8bdabd76ff8b43
GIT binary patch
literal 17617
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

literal 0
HcmV?d00001

diff --git a/data/evldec17.xlsx b/data/evldec17.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..5f85c34eeb6d2322cb6be0cc9cfca1e94c80b1a8
GIT binary patch
literal 5582
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
TQozZ;$zaFCz)%Gm&tm`p-6q{(

literal 0
HcmV?d00001

diff --git a/data/speak2.xlsx b/data/speak2.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..950c2b1d8a78ac56a096ae4a390da1346cd96ea6
GIT binary patch
literal 5948
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

literal 0
HcmV?d00001

diff --git a/main.py b/main.py
new file mode 100644
index 0000000..5824937
--- /dev/null
+++ b/main.py
@@ -0,0 +1,7 @@
+# main.py
+from process_data import process_rows
+
+if __name__ == "__main__":
+    print("Starting the data processing...")
+    process_rows()
+    print("Processing completed!")
diff --git a/process_data.py b/process_data.py
new file mode 100644
index 0000000..ee1366c
--- /dev/null
+++ b/process_data.py
@@ -0,0 +1,87 @@
+# process_data.py
+
+import time
+from config import API_URL, INPUT_EXCEL_FILE, OUTPUT_EXCEL_FILE, OUTPUT_HEADERS, FORMATTED_RESPONSES_COUNT
+from utils import load_excel, save_excel, create_output_workbook
+from utils.unpack_data import unpack_input_data  # Import the new unpack function
+from utils.api_client import send_api_request
+#pands data format
+
+
+def process_rows():
+    # Load input workbook
+    workbook = load_excel(INPUT_EXCEL_FILE)
+    sheet = workbook.active
+
+    # Generate dynamic output headers
+    output_headers = OUTPUT_HEADERS + [
+        f"Formatted Response{i + 1}" for i in range(FORMATTED_RESPONSES_COUNT)
+    ] + [
+        f"Response Time{i + 1} (seconds)" for i in range(FORMATTED_RESPONSES_COUNT)
+    ]
+
+    # Create output workbook
+    output_workbook = create_output_workbook(output_headers)
+    output_sheet = output_workbook.active
+
+    for row_index, row in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=2):
+        if all(cell is None for cell in row):
+            print(f"Skipping empty row {row_index}")
+            continue
+
+        # Map input columns to header keys dynamically
+        input_data = {header: row[i] for i, header in enumerate(OUTPUT_HEADERS)}
+
+        # Check if all required fields are present
+        if any(value is None for value in input_data.values()):
+            print(f"Skipping row {row_index}: Missing required data")
+            continue
+
+        print(f"Processing row {row_index}")
+
+        # Unpack input data and prepare the payload
+        payload = unpack_input_data(input_data)
+
+        responses = []
+        response_times = []
+
+        for _ in range(FORMATTED_RESPONSES_COUNT):
+            try:
+                response, response_time = send_api_request(API_URL, payload)
+
+                # Check if the response is an actual response object and contains status_code
+                if isinstance(response, dict):  # The response is likely the JSON data
+                    formatted_response = "Response:\n"
+                    for key, value in response.items():
+                        if isinstance(value, str) and "\n" in value:
+                            formatted_response += f"{key.capitalize()}:\n{value.strip()}\n"
+                        else:
+                            formatted_response += f"{key.capitalize()}: {value}\n"
+                    formatted_response += "-" * 50
+                    responses.append(formatted_response)
+                else:
+                    # If the response doesn't contain JSON, handle error (may need to add a check here)
+                    error_response = f"Error: Invalid response format received\n"
+                    responses.append(error_response)
+
+                response_times.append(response_time)
+            except Exception as e:
+                # Handle unexpected exceptions
+                error_message = f"Exception occurred: {str(e)}"
+                responses.append(error_message)
+                response_times.append(0)
+
+            time.sleep(1)
+
+        # Append data to the output sheet
+        output_row = list(input_data.values()) + [
+            responses[i] if i < len(responses) else "N/A" for i in range(FORMATTED_RESPONSES_COUNT)
+        ] + [
+            response_times[i] if i < len(response_times) else 0 for i in range(FORMATTED_RESPONSES_COUNT)
+        ]
+
+        output_sheet.append(output_row)
+
+    # Save the output workbook
+    save_excel(output_workbook, OUTPUT_EXCEL_FILE)
+    print(f"Responses saved in {OUTPUT_EXCEL_FILE}")
diff --git a/pytest.ini b/pytest.ini
new file mode 100644
index 0000000..03f586d
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,2 @@
+[pytest]
+pythonpath = .
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..f376ed8
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+openpyxl
+requests
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 0000000..da772ba
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,11 @@
+# Required metadata
+sonar.projectKey=my-project-key
+sonar.projectName=My Python Project
+sonar.projectVersion=1.0
+
+# Path to source directories
+sonar.sources=.
+
+# Language-specific configuration
+sonar.language=py
+sonar.sourceEncoding=UTF-8
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/__pycache__/__init__.cpython-310.pyc b/tests/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1964e52297c51b701839ab20ec864b3bd5b221a1
GIT binary patch
literal 154
zcmd1j<>g{vU|>*vdnX-4KL!!Vn2~{j!GVE+p_qk%fgyz<m_d`#ZzV$!NEku<venPX
z&rQ`YElw@ccgasK%}vcKDc1MM%u6ZN4@yl;DakJ{$}CBBtw>JI(Jx6YE-BWJkI&4@
eEQycTE2zB1VUwGmQks)$2Qs#piGhKEg#iE(&?J}u

literal 0
HcmV?d00001

diff --git a/tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..36526a09f50af7813b17a2e4c48c112c3267d9eb
GIT binary patch
literal 2672
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

literal 0
HcmV?d00001

diff --git a/tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7b9cb75a4d4fa43460d59804d22240654c475aac
GIT binary patch
literal 3632
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

literal 0
HcmV?d00001

diff --git a/tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b8e2430f2a0d2ed7bddb726c78e5bcfba017e44a
GIT binary patch
literal 2706
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
G4+j9_Ak0tz

literal 0
HcmV?d00001

diff --git a/tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..abe196ebf00ba77038141ba18c850e83909aba3b
GIT binary patch
literal 1951
zcmd1j<>g{vU|_KSdOJOgg@NHQh=Yt-7#J8F7#J9e^B5QyQW#Pga~Pr+!8B7YGZO<N
zLoQ1cD<edPEs6~+!yd(+!jQt0!;#Aw#mUH!!kogA!<EY&#m&f&%9+C2%$UlV!q&`~
z!k)s>!qCjv%oxQ35l`Vv;R1<7@un~aGiY+Z1i8ddlkpa7L1IaA#!Ds!1_n*WTLQ(Y
zc`5OU1)1?hsfDGf#U)j|P)4y{L4I*b6=z9iZmJ%LNCs&EnF7Mx3=9nH3=9m;ApaOK
zGBDIIW--(<r7)&2r7+K7s$t4vjAuw;NnuTAs$qy{N@1&I2Dvelv6iKTxrVuhrI{&)
zsg|{t4W^@(y@s`hJ)5bPqlTk6yo6-|YYJx#M;c=a7f3vfX(3ArcM019_Js^(48=Aj
zEDJblSQj!DIhL?2-~_Sq7*n{xZ1#nWDLiwS#29KhQ+QMOYB)0)#TaV2O1Mf`7I4>a
zEo5wFY+_7dU}31`sAW&#uVt@cgWEe9#a^}=cCftyaC<Aj_OdNxEUE?D#kP<!k1<66
z%qGoVhF}IwLBCt<#ihx~sl~-r+`);t1v#k-DTyVCnoPIYic1npN{er?fcTj&m>C!{
zUokT<{1VS7DJdwn($`O|0ISza&d=3PEXcgYoSj;Ei?u8<r!;jX<1Z##+m(z}LaG`C
zl?Ix{3bwWiAf~Zq@h#q>)Z&8tyyDb&kjX2VZZQ{B8h{AnUwnzh#i>OlV5O#-#UMe`
zB4!2#1|&_ObfC#|i>D~Hq_ik69&Fz&maO9Zyj$GGnJKC9scC7c$t6Xgq<)Lbp`fxP
zwYVfcvFMgyd~#w=PJB^nK~ZvkZb4#E>Mb6Jg39=$(#)Ka%)H`TY&rSKi8;l$B;t!R
z@=J44z)IuObMliCbK>(7b5n0|#uq21rGiYj#peiiYG!_(Yf({t(JkTlwEUvn#FF^b
zih`WPyu^~s{5(zWTb#N1$=UHBH$$1A6n%>qED8&UTg;_JIk(sg5-W4^6H|)#7#J9e
zL_nVA200HBBu2N8IED}o#6lBfj@e3vB25MchF`Aw8Tq-X`lZFGMfxuJ$)&lec_qdA
z9+`P5rTRgsi76%d<wcn#sjd~tsX6+f5Gsa{;Cz^zlbM=VqE}FPOBN&*kDfu}p-F}f
zl=B1_7#P@C_!zmES(rE&`55b%Y8Z>O85kIn89})eiaC)ps|+IpLkU9`;{v7>#)XVE
z4Drk<Otp-lf+dr&mZ^lLhOveToH?0mSuz=FS!<YUShJaG*=pE|eM(ptu%)opu%$7k
zuz|$E*@L}=eE|nJTN;+IF5s+TUdUKvR>Hb~3&hG}OkoGJSr;;<aDcNVJE&-?VFzbR
zjuP$?)&)E@97x%ct(G-~yOy<v1#WK#ioGl~tYCY2;P&Q%?PXcWSX2bIiv^r5dBAMa
z>;+{@UcV}C#{f?Sx5Uhx(xTKN4p5Q+1z{1WcrOB#d_}w<F>qSp2eE`egfNHz1v@zX
zX!73TfR&`TxKb;UQwu<;viO!j5Tu|5#XeZ5NF1aQlw*n{KrBfRAq66&L4*v5kOdKP
zAVMBgZgUnXg4oI+LIp&CodQa>MXDgK8i-H_5gH%@lqkU|vq%e+vZb-7t5i@{0=b}=
zhk=2C51OJXKq*QeWGUY*4p?q20y*!NWIQB)>p^l!W`3StQ7SlP-{OP|-C~D|fjxJN
z4Wgw;2jmdm(!9(PkYn^fS+WRJzuXciEy>I&)&tc@kemQ6OTcNm2;>ZiKhS){VUwGm
eQks)$2MYdTP;4kMa4_;P@-VV7v4KbdK1KljL=e*e

literal 0
HcmV?d00001

diff --git a/tests/test_api_client.py b/tests/test_api_client.py
new file mode 100644
index 0000000..3306641
--- /dev/null
+++ b/tests/test_api_client.py
@@ -0,0 +1,44 @@
+import os
+import pytest
+import requests
+from unittest.mock import patch
+from utils.api_client import send_api_request
+
+@patch("requests.post")
+@patch("time.time")
+def test_send_api_request_success(mock_time, mock_post):
+    # Mock API response
+    mock_response = mock_post.return_value
+    mock_response.json.return_value = {"status": "success", "data": "Sample data"}
+
+    # Mock timing for response calculation
+    mock_time.side_effect = [1000, 1002]  # Start and end time (2 seconds response time)
+
+    url = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email"
+    payload = {
+        "user_id": 7600001,
+        "question_id": 100456,
+        "answer_id": 120000789,
+        "cefr_level": "C1",
+        "subject": "Subject: Project Feedback",
+        "scenario": "addressing issue or giving feedback",
+        "scenario_question": "You are a team leader in a company, and one of your team members recently completed an important project. You need to provide feedback on their work, talking about both the positives and the areas for improvement. The goal is to note their hard work, encourage them, and give guidance for future projects.",
+        "email_content": "Hi Emma, I wanted to say a big thank you for all your hard work on the Marketing Campaign Launch project. It was a big project, and you did a great job!..."
+    }
+
+    response_data, response_time = send_api_request(url, payload)
+
+    assert response_data == {"status": "success", "data": "Sample data"}
+    assert response_time == 2
+
+@patch("requests.post")
+def test_send_api_request_error(mock_post):
+    # Simulate request failure
+    mock_post.side_effect = requests.exceptions.RequestException("API Failure")
+
+    url = "https://step-fastapi-email-pro-qa-1054173481485.asia-south1.run.app/evaluate_email"
+    payload = {}
+    response_data, response_time = send_api_request(url, payload)
+
+    assert response_data == {}
+    assert response_time == 0
diff --git a/tests/test_excel_operation.py b/tests/test_excel_operation.py
new file mode 100644
index 0000000..76759db
--- /dev/null
+++ b/tests/test_excel_operation.py
@@ -0,0 +1,49 @@
+import pytest
+import openpyxl
+from utils.excel_operations import load_excel, save_excel, create_output_workbook
+import os
+
+@pytest.fixture
+def sample_workbook(tmp_path):
+    """Create a sample workbook for testing."""
+    file_path = tmp_path / "test.xlsx"
+    workbook = openpyxl.Workbook()
+    sheet = workbook.active
+    sheet.append(["Name", "Age", "City"])
+    sheet.append(["John Doe", 30, "New York"])
+    workbook.save(file_path)
+    return file_path
+
+def test_load_excel(sample_workbook):
+    """Test loading an existing Excel file."""
+    workbook = load_excel(sample_workbook)
+    sheet = workbook.active
+
+    assert sheet.cell(row=1, column=1).value == "Name"
+    assert sheet.cell(row=2, column=1).value == "John Doe"
+
+def test_save_excel(tmp_path):
+    """Test saving an Excel file."""
+    workbook = openpyxl.Workbook()
+    sheet = workbook.active
+    sheet.append(["Product", "Price"])
+    sheet.append(["Laptop", 1200])
+
+    file_path = tmp_path / "output.xlsx"
+    save_excel(workbook, file_path)
+
+    # Verify the file is created and data is saved correctly
+    loaded_workbook = openpyxl.load_workbook(file_path)
+    loaded_sheet = loaded_workbook.active
+
+    assert loaded_sheet.cell(row=1, column=1).value == "Product"
+    assert loaded_sheet.cell(row=2, column=2).value == 1200
+
+def test_create_output_workbook():
+    """Test creating a new workbook with headers."""
+    headers = ["ID", "Name", "Department"]
+    workbook = create_output_workbook(headers)
+    sheet = workbook.active
+
+    assert sheet.cell(row=1, column=1).value == "ID"
+    assert sheet.cell(row=1, column=3).value == "Department"
diff --git a/tests/test_payload_mapping.py b/tests/test_payload_mapping.py
new file mode 100644
index 0000000..3647c49
--- /dev/null
+++ b/tests/test_payload_mapping.py
@@ -0,0 +1,53 @@
+import pytest
+from utils.payload_mapping import get_payload_mapping
+from config import PAYLOAD_FIELDS_STATIC
+
+
+def test_get_payload_mapping_complete_data():
+    input_data = {
+        "cefr_level": "c1",
+        "scenario": "addressing issue or giving feedback",
+        "scenario_question": "You are a team leader providing project feedback.",
+        "subject": "Subject: Project Feedback",
+        "email_content": "Hi Emma, great work on the project!"
+    }
+
+    expected_payload = PAYLOAD_FIELDS_STATIC.copy()
+    expected_payload.update(input_data)
+
+    assert get_payload_mapping(input_data) == expected_payload
+
+
+def test_get_payload_mapping_partial_data():
+    input_data = {
+        "cefr_level": "b1",
+        "email_content": "Reminder: Please submit your report."
+    }
+
+    expected_payload = PAYLOAD_FIELDS_STATIC.copy()
+    expected_payload.update(input_data)
+
+    assert get_payload_mapping(input_data) == expected_payload
+
+
+def test_get_payload_mapping_empty_data():
+    input_data = {}
+
+    expected_payload = PAYLOAD_FIELDS_STATIC.copy()
+
+    assert get_payload_mapping(input_data) == expected_payload
+
+
+def test_get_payload_mapping_overwrite_static_fields():
+    input_data = {
+        "user_id": 7600001,  # Attempt to overwrite static field
+        "email_content": "Custom content for testing."
+    }
+
+    expected_payload = PAYLOAD_FIELDS_STATIC.copy()
+    expected_payload["email_content"] = "Custom content for testing."
+
+    # Static fields should not change
+    expected_payload["user_id"] = PAYLOAD_FIELDS_STATIC["user_id"]
+
+    assert get_payload_mapping(input_data) == expected_payload
diff --git a/utils/__init__.py b/utils/__init__.py
new file mode 100644
index 0000000..e0a55c6
--- /dev/null
+++ b/utils/__init__.py
@@ -0,0 +1,2 @@
+# utils/__init__.py
+from .excel_operations import load_excel, save_excel, create_output_workbook
diff --git a/utils/__pycache__/__init__.cpython-310.pyc b/utils/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..231ff3a54ded608ca0d7c36f6b9be25382f43f63
GIT binary patch
literal 259
zcmd1j<>g{vU|{&>-khGuz`*br#6iYP3=9ko3=9m#5)2FsDGVu$ISjdsQH;4vQB1ka
zQOt}CDNMl(n#?a585kHenQw9B<R_-Yr&c7V=G@{cPAp4>vc-~%QWHy3<MT^P3Q9}j
z%kzt}lk)Sk{WMu_34m3{=NF_FC6;97=M@)$>?~qtU|=X>VPIfb$xy@wVuOfZw)z?Q
zxvBc4#i>R5F8Rr&xv6<2#rhtZc`2p(L8*x;CHdt=nI);NAP4A|mSpA>>&M4u=4F<|
a$LkeT-r}&y%}*)KNwotxw-{uP1S0^S-bS4O

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/api_client.cpython-310.pyc b/utils/__pycache__/api_client.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3108cdc02a3096ae411dab7b07bdace4eb16733a
GIT binary patch
literal 555
zcmd1j<>g{vU|{eHZcZ0rVqka-;vi!t1_lNP1_p*=83qQ16owSW9EK<e%^1a)!j!_?
z!Vtxj!Whh;$?_7U&o3FI1H=MhHU<U;konFa6ABm@7^);n7#1)rWT<5-Va#HxVW?qD
zVeDn9Wrm2>Fi9}fveYmyU|z^j!;;1n&JfJN!cf9eY0k({%gV@5C0xRq!c@Xm!`jR^
zn_(_fGb1BICPNA{NF^IXBtr^AEo&WXFqAH5EN9SU@zZ3y#gbK=pI0U97~rW8lv-Gt
zT3n*wT2z!@WTjBV$iTp$$$pEaBr`Yl7Do|8w)hrHL4I*b5y&gII9)4}QwvHm^Yd=8
z78GUXmE2-3E-BJvyTx2ulyi%{Ah9whKQZMNS8+*VQAs?^oZ^D~yyDbbyhW)H7DR$E
zbtOX)KLZ29FMIur{M=Oi(&E%2eV6>?(%jU%l45<2%)FFR{h-vul#=}NqRf(1kli`@
zr6rj;#rlZ_neoXvnW=dtdIgoY1d3DhQsO~kP)CEpx>$sPfq{vUgNcukhmnt&k4cD8
zgps3x>0gl`$e+wbEDQ_`Ma&=qBmi~_5+T6Az;KJhCO1E&G$+*#6g0&kQ#qJ87<rfg
Dya|Xn

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/excel_operations.cpython-310.pyc b/utils/__pycache__/excel_operations.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aee0c5ade75a793ad4e109f3ea75860fe74af5ed
GIT binary patch
literal 759
zcmd1j<>g{vU|>+oK9&BMk%8ech=Yuo7#J8F7#J9eRTvl;QW#Pga~Pr+QkYVhTNt7k
zQ&>`1TNt94QrJ@1TNt94Qy7C8G&x>^^!p_<f+#2kv6&ed7@R>Sfh;UxSio4run?r4
zu}a$~KQToiF;Bs@A~`ijAuTf}RUt7iMWHCQq_ikcp(G<!p*+7RJ1IXuTThee7Ds+T
zYF<HQMb0hWoczR;c$l0f<1J2*-uQyVl8luMMXU@A48L6UGxBp&^-GIWi}YRclS^|`
z^Gb^KJu>rBO7(+M6H`j^%ZoBgQo%OsmzHGa6zivgToIpNkXn>jl9``ZtXEKZiwkTM
zScV1U2T-tZF%_{hFfb&8*ie5mfY@-4@-Z+l)G#bys9{{l$jAT=9HuIn;KZ_26hA4H
z<SQhCeXZxG$#{#UII%1h<V~2ria<7keFGub7#J9Cae-9DgB`>Ha}Xa>5h!d?LLTH8
z5C(_53<CoLDC8G1)H2pEW--+=)i5n!2E_v-Lk%P@)SQb_6H8JR5*6}N%i+Nej*i5X
z6orh`#FW&cVm(ckB9K>aafCx7<`!FGa!F=c>Mgd!f`Zh%6iwz^JW$2)d5O8HMVug4
zvleHhrj|gw0g9d?uwTTI!FI;ymzETimcZka2jnl1=Qx<y7`Yf(7>fiL7#N^7gM%LI
hU9c#UkqC1+Y;yBcN^?@}K*_HdY!V{}69)?q3jiabvl;*Z

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/payload_mapping.cpython-310.pyc b/utils/__pycache__/payload_mapping.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1ea7b6d76b6eb27bb775def279c43c93e2548db0
GIT binary patch
literal 645
zcmd1j<>g{vU|<N#IhAh2#=!6x#6iYP3=9ko3=9m#5)2FsDGVu$ISjdsQH+cXDNHHM
zEeugiDJ;PZnyfEDdNdhti3T`E`uID##JhRA`nUwg2ZuO@cseIDf~27sWFj*I1A{Zj
zR51nyh7yJaj0+iR8EY69Fx4<DWMpKhVGL%_WK3jYWMJS@P*70tO)Mx@$jmD!Em25G
zEJ;)-$yX@JNL46Etjx(zOi?H<DJo4aDJ@D>C`v6X%`8eyQAnx;t8fhPR7k1JOU%to
zPRz-v)Z+ph=U9|pYz1b43<sMV4>ngLB{R81(@G&EBUJ&!%*@YAEUHvU&d)1J%*@No
zOGh?Lp){``F*!Rm1<7Sl3xZNhN{jN4>;M@CF*Z3rw;(6A1mXCi)WnoZkdKm56^c{y
zN<d7I=Ntn(^}ue_WG(^)*)5jj{DR6`Y^4P$i6yC;Ot-iY4!^|?4T_ZvMeGa=48L6T
zGxBp&^-GIWi}YRclS^|`^Gb^KJu>rBO7(+M6H`j^%ZoBgQe7*OQ*-o7OEPnc^`R!j
z=Oz{uWag#o6;$35PERd~M-!I=#Tpv}0|N&)7c&b}5hnu!gP$hzEw<$RytK@8uv5W;
iV22<P91IK$w>WHa^HWN5QtdzqqL_t&fq_SwhY0{8v#rDc

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_api_client.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b731e60c28aed7c98b131f10999c9ddddcbc07df
GIT binary patch
literal 2672
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

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_excel_operation.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c7e7edb22b4a8c0b2006baeb7df32c4aca28b7a9
GIT binary patch
literal 3632
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

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_payload_mapping.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8037ab1f8e54a6fc3da3b652201f15bbba453ec4
GIT binary patch
literal 2706
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
G;Q#>EnaoZA

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/test_unpack_data.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..299a011a22e4dc30f8e83fe59df3f592d7b88dbe
GIT binary patch
literal 3266
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

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc b/utils/__pycache__/tests_api_client.cpython-310-pytest-8.3.5.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4371551a407444531af35da580e629513e93bea3
GIT binary patch
literal 1940
zcmd1j<>g{vU|?YSc01jdg@NHQh=Yt-7#J8F7#J9e^B5QyQW#Pga~Pr+!8B7YGZO<N
zLoQ1cD<edPEs6~+!yd(+!jQt0!;#Aw#R-;U&f&`Cj^buyNaajnX=Y62Okr(iOkqo5
zZ((R=Y-Wt&frzJYq;P^nqIgpngBdirUV>cWr^$GWwIH!1IYX22mOyc8UP^poL1uhW
zYGG+=aY+>~lu@i#kY8L<#aWV>o2myQl9@odp_rS2fq|WYfx#K%6(dFlh8o5!hFYc+
z#uTO$<~d9?Oj(Ta3@I!rtm#ZO4Dn1UY_-fO>?s_XjI}H!%r(q4EX_<YOtq}FY%m?Q
z>@}=4?Ac7U95o!p;Uz2!SW`G_IMNtXxIp4*Obc03xJ%d;urFjNV<@&MVOhXY!@7{M
z$gzZF0Vjx+$C$zmX0tD3OyQZsB*sw7nZldGSHqdfD8^9BRl-%mvVgmWYawGZV-sTv
z0}DefM=g5_e=U0r8{FQ>DE6||u!HRtfZJOEwwG-oV^J;GF1Ce?d5kFnU^Z#?G6XYd
z3i{n*FD^|^PAx93;to#CEyzh#NJ%V7)MUEFR$P);Qd)eA1;o#M!OXyr`HGo=;g@(u
zNl8JmmA-yz1z5daa(=FUVnOCD=IqqUTdZY?Ii;y98GkX^+OA}*5>nMDs5H<lR<N~I
z05Od<i*NB3r4|?D=M|^MgG^q@bc?y5(f~vl|Kdw5E>0~f0V_4tECvahz68ZNk|t0(
z(B!$rQ<Pd#T9g+Lw(k~8R&jpbE$-sXl+^gtw6xUZk|JgX28LT)4h5AZsl_GniAA>r
z<C7C}a^j0p3yPBSa|;rSQg87%6ja71m1gFYWabs$V#~=-PRuF3B@thokzbmV0#+KI
zo|B)Hm=m9un45ZwGrl-6Efr+KEj~xEQ#14PT#JhGi*5<Wr{x#rCYHpfRutqU<|US7
z=I3d0-{Q>8PtJ}9xf#j?rRZC{U{P2&++r>*%DKf}kXV_MpO{j_%fP@;Bm#0hH^_OA
zAThdy#4&_$AQqY+bIevU6lpRrF#K}W&&bbB)h{hhEz)<%PcF?(%_}L^_sGmkDb){3
zO-w1tFE7e0Np-DAPR-FTEy>I&)(3@CF*qM4=VYelmFN{z-jW3g#-nG@cxaMg1?4;e
z1_lN;7CuHUW)>z6Mn1+mrW(c~Z3YI0WJYL41yP*HnN^07fuV#Ui*W%{3gbe?8isi0
z6sB6n6y_9`OvYNK5|$dq8YXb&WUgh&WT<7WVXk4#W~ybYVJr42VO_wM!dk<Y#+bqe
z5(j4w_7e659N=teSi-u1vxa#gW06@2>jEwiD~~aS9n5B3$e6+b&X(*coGDy2?BHz4
zQNmrqx`3yK11Vdw)v~5=*Rs~I!0qiov6rQW6>KjL+}>QUy(|kEi;BQ@v4FEB5137w
zy`XH#>sQ6?7~rYkmYA7ST9jG@D&~qfK<NS$jzys2y@&_I1*a805K9n52!RMtu!GZ&
zChsi{SV?+|E43mywE&bVi*E@8K?+(>?1P1h#6cQCIi^Sg#F7LNQXoPaM96>$Sr8!y
zBIFqu7&JMH6hUld5TODhz)k@r+agsER}Dm{g9r@}0ZNqMlv$(&O4-ub(^V=cD}mfn
z4DuZxG(}Z_Qj|W(QodUpu-sY%a^5Y;cu4-%gXEIT{5-v)RB+0^#R(U>#SRq%d+rt+
zL`#tl$RWI?d6^|3$LN8wWD&Tm;R4k~kURh`MZl@K2;=~W577L=VUwGmQks)$2MYLN
WP!uRJa4_;P@-VV7vVlkeK1KlGunm;}

literal 0
HcmV?d00001

diff --git a/utils/__pycache__/unpack_data.cpython-310.pyc b/utils/__pycache__/unpack_data.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..536a455ec684288462331114e7d4f4c481b62146
GIT binary patch
literal 994
zcmd1j<>g{vU|^8RIh8(#nStRkh=Yuo7#J8F7#J9eRTvl;QW#Pga~N_NqZk=MY^EHh
zT;?cdMursT6qXi-D3%n~U<OULmmvL`jJHHQ{Q^Qm;@v!5eO!X$T_XJ)eLbBu8E*-v
zr<TMQBv$6+C#J;bCKeQA=A|byf;2%f3j+fKD+2?AGss>a1_p*qhFZoFh6RiZ8C)1*
z`C^!AnQED97#1+qFr_dqWLm(ykfDaLhS`RpkgbFzg(-!(g`tLV0V_y#Gh;Jjkx~jv
zFhdDj4P!H7FoPy*q7Wkk1DAq=f<kCsL1J=tu|j5EL1~FXN@7W(LP}*`Vs2(~Vopw_
zLTPbkUb=!;u)m*fN@`kWUTTU0)ValaTwntni_(j&z$}n)U}NIJ#%QEuCYNYhDTHLC
zDu9@o`FV*&l?uuEc_oRNc_3qp63db8)kxJ#*V9o*E6UGRaIHvA&C!Hf5tLd|T9k)m
z3&=Qy{2~Rv{Jd0%1qDT^1&KweDGJa)RY=P(QYgttRd5XOR47U<EKMygf$31lOan_5
z<(DgD7AvIY7L-)#fqig`0VNVZ5zh>Y01%d7U|?uus9}g@uVt)ZOkv1o3S(eoC}c_j
z1t?PyD8l?!GH5d0V$w6X#afn_Q<_=?ia{{(%RxUQKQ~psv^cd$-z7h}G&eP`q*&i0
zGcTo7KPWXZr6j++D6=FL>}~zhlFXc9{ZequfWuO+pz;={O?qlxYDGbjohZmTAp4ja
z#2Bhnpz07IuV<5!pPZOeY^Mj;;-|@81oF)-*36RB+~Qlz>8T~RSc^-FG7D}oC+6hb
zVgoz4xCrE3O_p0+2-9xyLM%v40XyXucPc1q;?puyb5d?`LxVd$JGBz*Q3%1oz`$@z
z5TY+0VHC*C#XJlQ3@ls%%wmjU%q)x?%tgWs3=Dpnthd;b^YhX&(;@B@1&4ti%y?*;
n13M3_0b&n4e2c&~a@geNr<CTT+JSOXF&hH|0}lfaBM%b*AutJ5

literal 0
HcmV?d00001

diff --git a/utils/api_client.py b/utils/api_client.py
new file mode 100644
index 0000000..b0fdf29
--- /dev/null
+++ b/utils/api_client.py
@@ -0,0 +1,18 @@
+# utils/api_client.py
+
+import requests
+import time
+
+def send_api_request(url, payload):
+    try:
+        # Assuming it's a POST request
+        start_time = time.time()
+        response = requests.post(url, json=payload)
+        response_time = time.time() - start_time
+
+        # Assuming response.json() gives us the actual data as a dictionary
+        return response.json(), response_time
+
+    except Exception as e:
+        print(f"API Request Error: {str(e)}")
+        return {}, 0  # Return an empty dict and 0 time on error
diff --git a/utils/excel_operations.py b/utils/excel_operations.py
new file mode 100644
index 0000000..8602302
--- /dev/null
+++ b/utils/excel_operations.py
@@ -0,0 +1,17 @@
+# utils/excel_operations.py
+import openpyxl
+
+def load_excel(file_path):
+    """Load an Excel file and return the workbook."""
+    return openpyxl.load_workbook(file_path)
+
+def save_excel(workbook, file_path):
+    """Save the workbook to a file."""
+    workbook.save(file_path)
+
+def create_output_workbook(headers_name):
+    """Create a new workbook and add headers."""
+    workbook = openpyxl.Workbook()
+    sheet = workbook.active
+    sheet.append(headers_name)
+    return workbook
diff --git a/utils/payload_mapping.py b/utils/payload_mapping.py
new file mode 100644
index 0000000..b8aa874
--- /dev/null
+++ b/utils/payload_mapping.py
@@ -0,0 +1,46 @@
+# # utils/payload_mapping.py
+#
+# def get_payload_mapping(cefr_level, scenario, scenario_question, subject, email_content):
+#     """
+#     Maps input data to the payload structure required by the API with fixed user_id, question_id, and answer_id.
+#
+#     Args:
+#         cefr_level (str): The CEFR level of the input data.
+#         scenario (str): The scenario description.
+#         scenario_question (str): The scenario question.
+#         subject (str): The subject or topic.
+#         email_content (str): The email content.
+#
+#     Returns:
+#         dict: The payload ready to be sent to the API.
+#     """
+#     return {
+#         "cefr_level": cefr_level,
+#         "user_id": 7600001,  # Static user ID
+#         "question_id": 100456,  # Static question ID
+#         "answer_id": 120000789,  # Static answer ID
+#         "scenario": scenario,
+#         "scenario_question": scenario_question,
+#         "subject": subject,
+#         "email_content": email_content
+#     }
+
+from config import PAYLOAD_FIELDS_STATIC
+
+def get_payload_mapping(input_data):
+    """
+    Maps input data to the payload structure required by the API dynamically.
+
+    Args:
+        input_data (dict): The dictionary containing dynamically unpacked input data.
+
+    Returns:
+        dict: The complete payload ready to be sent to the API.
+    """
+    # Start with manually configured static fields from config.json
+    payload = PAYLOAD_FIELDS_STATIC.copy()  # Ensuring we don't modify the original dictionary
+
+    # Add dynamically unpacked fields
+    payload.update(input_data)
+
+    return payload
diff --git a/utils/unpack_data.py b/utils/unpack_data.py
new file mode 100644
index 0000000..48d7df6
--- /dev/null
+++ b/utils/unpack_data.py
@@ -0,0 +1,25 @@
+from config import INPUT_FIELDS_DYNAMIC
+from utils.payload_mapping import get_payload_mapping
+
+def unpack_input_data(input_data):
+    """
+    Unpacks input data dynamically using JSON-defined mappings.
+
+    Args:
+        input_data (dict): The dictionary containing raw input data (e.g., from Excel).
+
+    Returns:
+        dict or None: The prepared payload for the API request or None if the row is empty.
+    """
+    unpacked_data = {}
+
+    # Loop through INPUT_FIELDS mapping from config.json to dynamically unpack data
+    for excel_field, payload_key in INPUT_FIELDS_DYNAMIC.items():
+        unpacked_data[payload_key] = input_data.get(excel_field, "").strip()  # Strip whitespace
+
+    # Check if all unpacked values are empty
+    if all(value == "" for value in unpacked_data.values()):
+        return None  # Skip empty rows
+
+    # Pass valid data to get_payload_mapping
+    return get_payload_mapping(unpacked_data)
-- 
GitLab