File size: 5,951 Bytes
e8ae44a
3db95d2
 
f22fae1
e8ae44a
3db95d2
 
f22fae1
3db95d2
f22fae1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3db95d2
 
 
 
 
 
 
e8ae44a
3db95d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e8ae44a
 
3db95d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f22fae1
3db95d2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import streamlit as st
from compliance_lib import *
import PyPDF2  
st.set_page_config(page_title="Anupalan Karta – Compliance Checker",
                   layout="wide")
st.title('🛡️ Anupalan Karta (अनुपालंकर्ता)')
st.subheader('Unified compliance self-check Tool')
st.markdown("""
            ## Introduction

**Anupalan Karta** (अनुपालंकर्ता) is a simple tool to help business owners, data architects, and data owners quickly check if their policies and procedures meet important regulations like GDPR, EU AI Act, and ISO 27001.

### Why is this important?

- Regulations protect your business from legal risks, fines, and reputational harm.
- Checking compliance early helps you fix gaps before audits or problems arise.
- Anupalan Karta gives you a fast, automated review and clear feedback, so you know where you stand.

## How to use

1. **Choose your input:**  
   On the left, either paste your policy text, enter a public website link, or upload a file (.txt, .md, .pdf).

2. **Select frameworks:**  
   Pick which compliance standards you want to check (you can select more than one).

3. **Run the check:**  
   Click "Run compliance check" to see which requirements you meet and which need attention.

4. **Get your report:**  
   Optionally, generate a summary report with next steps, and download it as a Markdown file.

**Who is this for?**  
This tool is designed for business owners, data architects, and anyone responsible for data and compliance in their organization. No technical expertise is needed—just your policy documents.

---

**Need a deeper compliance review or expert guidance?**  
Visit [anktechsol.com](https://anktechsol.com) for professional compliance consulting, detailed policy analysis, and tailored solutions for your business.

---
""")

# default state
if "check_run" not in st.session_state:
    st.session_state.check_run = False
    st.session_state.raw_text = ""

# ------ side bar ----
with st.sidebar:
        st.subheader('📥 Input options')
        option = st.radio('Choose data source:',['Paste text','URL of public policy','Upload file'])
        raw_text=""
        if(option=='Paste text'):
           raw_text= st.text_area('Paste your policy / procedures here')
            
        
        elif option == 'URL of public policy':
            Url = st.text_area("Public URL (HTTPS)", key="input_text")
            raw_text = fetchText(Url) if Url else st.warning
            if Url:
                raw_text, error = fetchText(Url)
                if error:
                    st.warning(error)
            else:
                raw_text = ""
            # print(raw_text)
        else:
            fileUpload = st.file_uploader("Upload .txt, .md or .pdf", ['txt', 'md', 'pdf'])
            if fileUpload:
                file_type = fileUpload.name.split('.')[-1].lower()
        
                if file_type in ["txt", "md"]:
                    raw_text = fileUpload.read().decode("utf-8", errors="ignore")
        
                elif file_type=="pdf":
                    try:
                        pdf_reader = PyPDF2.PdfReader(fileUpload)
                        for page in pdf_reader.pages:
                            raw_text += page.extract_text() or ""
                    except Exception as e:
                        st.error(f"Error reading PDF: {e}")
                    if raw_text and st.session_state.get("last_input") != raw_text:
                       st.session_state.check_run = False
                       st.session_state.last_input = raw_text
          
        # "Framework to Check", ["GDPR", "EU_AI_ACT", "ISO_27001"]
        selectedFw=st.multiselect('Framework to Check',list(RULES.keys()),default=list(RULES.keys()))
        st.markdown("---")



  # ------- side bar end -----

# <====== main code =====>
# strip removes all the leading and trailing whitespace characters from a stringif run_btn and raw_text.strip():
if "results" not in st.session_state:
    st.session_state.results = None
    st.session_state.selectedFw=[]

if st.sidebar.button("Run Compliance Check") and raw_text.strip():
#  reset_results()   
 with st.spinner("Running rule-based checks…."):
    st.session_state.results=run_check(raw_text, selectedFw)
    st.session_state.selectedFw=selectedFw
    st.session_state.check_run=True     
if st.session_state.get("check_run"):
    results = st.session_state.results
    selectedFw = st.session_state.selectedFw
        # 📊 Checklist results
    st.subheader('📊 Checklist results')
    for fw in selectedFw:
            # Count how many rules passed for that framework
            passed = sum(1 for _, ok in results[fw] if ok)  # _ is unused, ok is True/False
            total = len(results[fw])
             
            st.write(f"**{fw}: {passed}/{total} items passed**")  # Example: EU_AI_ACT: 0/2 items passed
            st.progress(passed / total)

            for label, ok in results[fw]:
                st.write(("✅" if ok else "❌") + "  " + label)  # Example: ❌ Lawful basis documented
            st.markdown("---")

        # 📝 Generate narrative report
        
    st.subheader('📝 Generate narrative report')
    if st.button('Generate AI report'):
            with st.spinner("Calling model… this may take ~30 s"):
                bullet = "\n".join(
                    f"- {fw}: {sum(ok for _, ok in results[fw])}/{len(results[fw])} passed"
                    for fw in selectedFw
                )
                prompt=AI_REPORT_PROMPT.format(bullet=bullet)
                report=generate_report(prompt)
                st.markdown("#### Draft report")
                st.code(report, language="markdown")
                st.download_button("⬇️ Download .md",report.encode('utf-8'),file_name="anupalan_karta_report.md",
                           mime="text/markdown")
    else:
           st.info("Awaiting input…")