nghweigeok's picture
Add new feature: Verify and correct purchase order supplier id
b794a09 verified
import streamlit as st
# Import backend functions
from backend import (
validate_incoterms_xml,
suggest_correct_incoterm,
validate_po_supplier_xml,
suggest_correct_supplier,
apply_combined_corrections,
)
def main():
"""
Main function to set up the Streamlit web application.
Validates both Incoterms location and Purchase Order Supplier ID,
and provides AI-based suggestions for corrections.
"""
# Configure Streamlit page layout and initial settings
st.set_page_config(
page_title="TM XML Validator",
layout="centered",
initial_sidebar_state="auto",
)
# Display the title and description of the app
st.title("TM XML Validator")
st.write(
"Upload your XML file to validate Incoterms and Purchase Order Supplier ID."
)
# File upload widget for XML files
uploaded_file = st.file_uploader("Upload an XML file", type="xml")
if uploaded_file:
try:
st.subheader("Validation Results")
# Perform Incoterms validation
incoterm_status, original_location, incoterm_suggestion = (
handle_incoterms_validation(uploaded_file)
)
# Perform Supplier ID validation
supplier_status, original_supplier_id, supplier_suggestion = (
handle_supplier_validation(uploaded_file)
)
# Handle corrections if either validation fails
if incoterm_status == "invalid" or supplier_status == "invalid":
st.subheader("Suggested Corrections")
# Checkbox for Incoterm correction suggestion
apply_incoterm_correction = False
if incoterm_suggestion:
apply_incoterm_correction = st.checkbox(
f"Accept suggested Incoterm correction: {incoterm_suggestion}"
)
# Checkbox for Supplier correction suggestion
apply_supplier_correction = False
if supplier_suggestion:
apply_supplier_correction = st.checkbox(
f"Accept suggested Supplier ID correction: {supplier_suggestion}"
)
# Apply corrections and provide corrected XML for download
corrected_xml = apply_combined_corrections(
uploaded_file,
incoterm_correction=(
incoterm_suggestion if apply_incoterm_correction else None
),
supplier_correction=(
supplier_suggestion if apply_supplier_correction else None
),
)
st.download_button(
label="Apply Selected Corrections and Download Corrected XML",
data=corrected_xml,
file_name=f"corrected_combined_{uploaded_file.name}",
mime="application/xml",
)
except Exception as e:
st.error(f"An error occurred: {str(e)}")
def handle_incoterms_validation(file):
"""
Validates Incoterms in the uploaded XML file and provides correction suggestions if needed.
Args:
file: Uploaded XML file.
Returns:
tuple: (validation status, original location, suggested correction).
"""
try:
# Validate Incoterms location
status, original_location = validate_incoterms_xml(file)
if status == "valid":
st.success("Incoterms Validation Passed: The location is correctly mapped.")
st.markdown(f"**Location Name:** {original_location}")
return "valid", original_location, None
elif status == "invalid":
st.error("Incoterms Validation Failed: Incorrect location found.")
st.markdown(f"**Incorrect Location Name:** {original_location}")
# Provide suggested correction
suggestion_sentence, ai_suggestion = suggest_correct_incoterm(
original_location
)
st.warning(f"Suggested Correction for Location: {suggestion_sentence}")
return "invalid", original_location, ai_suggestion
except Exception as e:
st.error(f"An error occurred during Incoterms validation: {str(e)}")
return "error", None, None
def handle_supplier_validation(file):
"""
Validates Supplier ID in the uploaded XML file and provides correction suggestions if needed.
Args:
file: Uploaded XML file.
Returns:
tuple: (validation status, original supplier ID, suggested correction).
"""
try:
# Validate Supplier ID
status, supplier_id, tag_path = validate_po_supplier_xml(file)
if status == "valid":
st.success(
"Supplier Validation Passed: The supplier information is correct."
)
st.markdown(f"**Supplier ID:** {supplier_id}")
return "valid", supplier_id, None
elif status == "invalid":
st.error(
"Supplier Validation Failed: Incorrect supplier information found."
)
st.markdown(f"**Incorrect Supplier ID:** {supplier_id}")
# Provide suggested correction
suggestion_sentence, ai_suggestion = suggest_correct_supplier(supplier_id)
st.warning(f"Suggested Correction for Supplier ID: {suggestion_sentence}")
return "invalid", supplier_id, ai_suggestion
except Exception as e:
st.error(f"An error occurred during Supplier validation: {str(e)}")
return "error", None, None
# Entry point of the app
if __name__ == "__main__":
main()