From 0d8ad2381bf2f6899f37a9666c7ccbea9495c300 Mon Sep 17 00:00:00 2001 From: OwusuBlessing Date: Mon, 9 Sep 2024 14:03:14 +0100 Subject: [PATCH] added manager and execuytive generator --- data/raw/document.pdf | Bin 70797 -> 99539 bytes src/api/routes/sops.py | 78 +++++++++- src/models/response_schemas.py | 24 ++- src/prompts/sops.py | 65 ++++++-- src/services/document_parser.py | 197 +++++++++++++++++++++++ src/services/sop_generator.py | 268 ++++++++++++++++++-------------- test.py | 85 ++-------- 7 files changed, 506 insertions(+), 211 deletions(-) create mode 100644 src/services/document_parser.py diff --git a/data/raw/document.pdf b/data/raw/document.pdf index 86ec9da40c7c0a93049c8785391bcb173ddb7f2b..8cd88fcba5dbc4249dd4567124cc1b0f98635a76 100644 GIT binary patch delta 70646 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 delta 41768 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%0Aj!UAE|%o;IlNs2i4i+RK*k)|{9aLPv)VQ8vT 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 Y(@Nfozyfjb@PaVW=;&nBWHHhH1Ax!7MF0Q* diff --git a/src/api/routes/sops.py b/src/api/routes/sops.py index 89b7ddf..23e22c3 100644 --- a/src/api/routes/sops.py +++ b/src/api/routes/sops.py @@ -1,9 +1,8 @@ import os from flask import Blueprint, request, jsonify, current_app from werkzeug.utils import secure_filename - -from src.services.sop_generator import (SopGeneratorDocument, - SopPersonalAssessment,SopGeneratorExecutive) +from src.services.sop_generator import (SopPersonalAssessment,SopGeneratorExecutive) +from src.services.document_parser import DocumentParser from src.utils.utils import delete_all_files_in_directory from src.utils.document_loader import load_document @@ -103,7 +102,7 @@ def generate_questions_from_sop(): return jsonify({"error": "Document cannot extract SOPs", "message": status_check["message"]}), 400 # Generate SOPs based on the roles provided - sop_generator = SopGeneratorDocument() + sop_generator = DocumentParser() sops = sop_generator.generate_sops_from_doc(docs) # Cleanup: Delete all files in the upload directory after processing @@ -147,7 +146,7 @@ def generate_sops(): docs = load_document(file_path) # Generate SOPs based on the roles provided - sop_generator = SopGeneratorDocument() + sop_generator = DocumentParser() sops = sop_generator.extract_sops_from_doc(docs) # Cleanup: Delete all files in the upload directory after processing delete_all_files_in_directory(upload_folder) @@ -277,7 +276,7 @@ def generate_executive_sops_from_doc(): # Use the utility function to generate docs from the file docs = load_document(file_path) - sop_doc = SopGeneratorDocument() + sop_doc = DocumentParser() vision_mission = sop_doc.extract_vision_mission(docs) if not vision_mission: @@ -380,4 +379,69 @@ def generate_sops_from_questionnaire(): return jsonify({"sops": serializable_result, "message": "SOPs successfully generated from questionnaire."}), 200 except Exception as e: - return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500 \ No newline at end of file + return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500 + + + + +@sops_bp.route('/executive/get_roles_doc', methods=['POST']) +def generate_sops_from_questionnaire(): + try: + # Retrieve form data + reference_roles = request.get_json().get('reference_roles') # List of reference roles in JSON format + document = request.files.get('document') # The uploaded document + + if not reference_roles or not document: + return jsonify({"error": "Missing data", "message": "Reference roles or document not provided."}), 400 + + # Use extractor to extract roles from the document + extractor = DocumentParser() + extracted_data = extractor.extract_departments_and_managers_workers([document]) + + if not extracted_data: + return jsonify({"error": "Extraction error", "message": "No roles were extracted from the document."}), 400 + + # Extract all managers with their name, title (position), and classification (role: PRP or SRP) + extracted_managers = [] + for department in extracted_data['departments']: + extracted_managers.extend([{ + 'name': manager['name'], + 'position': manager.get('position', 'Unknown Position'), # Assuming title is the position + 'role': manager.get('classification', 'Unknown Role') # PRP or SRP classification + } for manager in department['managers']]) + + # Prepare assigned, unassigned, and unavailable managers + assigned_managers = [manager for manager in extracted_managers if manager['name'] in reference_roles] + unassigned_managers = [{'name': role, 'position': 'Reference Role', 'role': 'N/A'} for role in reference_roles if role not in [manager['name'] for manager in extracted_managers]] + unavailable_managers = [manager for manager in extracted_managers if manager['name'] not in reference_roles] + + # Return the results with detailed manager information + return jsonify({ + "assigned_roles": assigned_managers, + "unassigned_roles": unassigned_managers, + "unavailable_roles": unavailable_managers + }), 200 + + except Exception as e: + return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500 + + + + + + assigned_roles = [role for role in reference_roles if role in extracted_roles] + unassigned_roles = [role for role in reference_roles if role not in extracted_roles] + unavailable_roles = [role for role in extracted_roles if role not in reference_roles] + + # Return the results + return jsonify({ + "assigned_roles": assigned_roles, + "unassigned_roles": unassigned_roles, + "unavailable_roles": unavailable_roles + }), 200 + + + except Exception as e: + return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500 + + diff --git a/src/models/response_schemas.py b/src/models/response_schemas.py index 3e1c7bd..101e02a 100644 --- a/src/models/response_schemas.py +++ b/src/models/response_schemas.py @@ -35,17 +35,26 @@ class Categories(BaseModel): class ExecutivesSops(BaseModel): executive_sops: List[RoleSops] -class ManagerialRole(BaseModel): - title: str - responsibilities: List[str] +class Manager(BaseModel): + name: str + position: str + role: str + responsibilities: List[str] = Field(default_factory=list) + +class Worker(BaseModel): + name: str + position: str + responsibilities: List[str] = Field(default_factory=list) class Department(BaseModel): name: str - managerial_roles: List[ManagerialRole] + managers: List[Manager] = Field(default_factory=list) # Updated to managers + workers: List[Worker] = Field(default_factory=list) # New field for workers -class DepartmentsAndRolesResponse(BaseModel): +class DepartmentsAndWorkersResponse(BaseModel): departments: List[Department] + class ManagerSOPs(BaseModel): must: List[str] = Field(default_factory=list) shall: List[str] = Field(default_factory=list) @@ -60,4 +69,7 @@ class DepartmentManagerSOPs(BaseModel): managers: List[ManagerWithSOPs] class ExecutiveManagerSOPsResponse(BaseModel): - departments: List[DepartmentManagerSOPs] \ No newline at end of file + departments: List[DepartmentManagerSOPs] + + + diff --git a/src/prompts/sops.py b/src/prompts/sops.py index a10e6cf..7b27705 100644 --- a/src/prompts/sops.py +++ b/src/prompts/sops.py @@ -93,31 +93,45 @@ def get_vision_mission_extraction_from_doc(): -def get_departments_and_roles_extraction_prompt(): +def get_departments_managers_workers_extraction_prompt(): return """ - Extract departments and their senior managerial roles from the document. - Include only managerial positions (e.g., Department Head, Director, Manager). - For each role, list 2-3 key responsibilities. - Do not add any departments or roles that are not explicitly mentioned in the document. + Extract departments, their managers, and workers from the document. + For each department, include the managers (e.g., Department Head, Director, Manager) and their key responsibilities. + Additionally, for each department, extract the workers and their positions, and list 1-2 key responsibilities for each worker. + Do not add any departments, managers, or workers that are not explicitly mentioned in the document. + Managers: Include the managers (e.g., Department Head, Manager), their role , and key responsibilities. + - **PRP (Primary Responsible Person)**: A manager who has primary responsibility for decision-making and overseeing operations. + - **SRP (Secondary Responsible Person)**: A manager who supports the PRP, often assisting with tasks and providing backup in decision-making. + Format as JSON: { "departments": [ { "name": "Department Name", - "managerial_roles": [ + "managers": [ { - "title": "Managerial Role Title", + "name": "Manager Name", + "position": "manager Position", + "role": "PRP or SRP", # The classification field either PRP or SRP + "responsibilities": ["Key Responsibility 1", "Key Responsibility 2"] + } + ], + "workers": [ + { + "name": "Worker Name", + "position": "Worker Position", "responsibilities": ["Key Responsibility 1", "Key Responsibility 2"] } ] } ] } - If no departments or roles are found in the document, return an empty list for departments. + If no departments, managers, or workers are found in the document, return an empty list for departments. """ + def get_sop_for_department_managers(): return '''Generate Standard Operating Procedures (SOPs) for the specified managerial role in the given department. @@ -186,4 +200,37 @@ def get_sop_executive_from_questionnaire(): ] } Ensure that each specified department has its own set of SOPs. - ''' \ No newline at end of file + ''' + +def generate_llm_comparison_prompt(reference_roles, extracted_managers): + reference_roles_str = ', '.join(reference_roles) + extracted_managers_str = '\n'.join([f"- {manager['name']} (Position: {manager['position']}, Role: {manager['role']})" for manager in extracted_managers]) + + prompt = f""" + You are tasked with comparing a list of reference roles with the extracted roles from a document. + + Reference roles: + [{reference_roles_str}] + + Extracted roles: + {extracted_managers_str} + + Please classify the roles into the following categories: + 1. **Assigned Roles**: Roles that are found in both the reference list and the extracted list. + 2. **Unassigned Roles**: Roles that are found in the reference list but not in the extracted list. + 3. **Unavailable Roles**: Roles that are found in the extracted list but not in the reference list. + + Return the result in the following JSON format: + { + "assigned_roles": [ + {"name": "Role Name", "position": "Role Position", "role": "PRP or SRP"} + ], + "unassigned_roles": [ + {"name": "Role Name", "position": "Reference Role"} + ], + "unavailable_roles": [ + {"name": "Role Name", "position": "Role Position", "role": "PRP or SRP"} + ] + } + """ + return prompt diff --git a/src/services/document_parser.py b/src/services/document_parser.py new file mode 100644 index 0000000..20e65a8 --- /dev/null +++ b/src/services/document_parser.py @@ -0,0 +1,197 @@ +import os +import json +from openai import OpenAI +from pydantic import BaseModel, Field +from typing import List, Dict, Optional +from src.prompts.sops import * +from src.models.response_schemas import * +from dotenv import load_dotenv +load_dotenv() + + +#SopGeneratorDocument +class DocumentParser: + def __init__(self): + self.api_key = os.getenv("OPENAI_API_KEY") + self.client = OpenAI(api_key=self.api_key) + self.model = "gpt-4o-2024-08-06" + + def _extract_text_from_docs(self, docs): + """Extract text content from document objects.""" + return [doc.page_content for doc in docs] + # Existing methods... + + def extract_sops_from_doc(self, docs) -> VisionMissionResponse: + """ + Extracts Vision, Mission, and SOPs categorized into 'must,' 'shall,' and 'will' from the document. + + :param docs: The document(s) from which to extract information. + :return: VisionMissionResponse containing the vision, mission, and role-specific SOPs. + """ + + try: + docs_text = self._extract_text_from_docs(docs) + prompt = get_sop_extraction_from_doc() + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + { + "role": "system", + "content": f'''{prompt}''' + }, + { + "role": "user", + "content": [{"type": "text", "text": text} for text in docs_text], + } + ], + response_format=SOPsResponse, + max_tokens=4096, + temperature=0.1 + ) + + # Parse the response from the LLM + extracted_text = json.loads(response.choices[0].message.content) + + return extracted_text + + except: + return False + + def extract_vision_mission(self, docs) -> VisionMissionResponse: + """ + Extracts Vision, Mission, and SOPs categorized into 'must,' 'shall,' and 'will' from the document. + + :param docs: The document(s) from which to extract information. + :return: VisionMissionResponse containing the vision, mission, and role-specific SOPs. + """ + + try: + docs_text = self._extract_text_from_docs(docs) + prompt = get_vision_mission_extraction_from_doc() + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + { + "role": "system", + "content": f'''{prompt}''' + }, + { + "role": "user", + "content": [{"type": "text", "text": text} for text in docs_text], + } + ], + response_format=VisionMissionResponse, + max_tokens=4096, + temperature=0.1 + ) + + # Parse the response from the LLM + extracted_text = json.loads(response.choices[0].message.content) + + return extracted_text + + except: + return False + + '''def extract_departments_and_managers(self, docs): + """ + Extract departments and managerial roles from the document. + + :param docs: List of document chunks + :return: Dictionary containing departments and their managerial roles + """ + try: + docs_text = self._extract_text_from_docs(docs) + prompt = get_departments_and_roles_extraction_prompt() + + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": [{"type": "text", "text": text} for text in docs_text]} + ], + response_format=DepartmentsAndRolesResponse, + max_tokens=4096, + temperature=0.1 + ) + + + return json.loads(response.choices[0].message.content) + except json.JSONDecodeError: + return False''' + + + def extract_departments_and_managers_workers(self, docs): + """ + Extract departments, managers, and workers from the document. + + :param docs: List of document chunks + :return: Dictionary containing departments, their managers, and workers. + """ + try: + docs_text = self._extract_text_from_docs(docs) + prompt = get_departments_managers_workers_extraction_prompt() # Update your prompt to handle managers and workers + + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": [{"type": "text", "text": text} for text in docs_text]} + ], + response_format=DepartmentsAndWorkersResponse, # Use the updated response schema + max_tokens=4096, + temperature=0.1 + ) + + return json.loads(response.choices[0].message.content) + + except json.JSONDecodeError: + return False + + + def generate_sops_(self, docs, reference_roles): + try: + # First, extract departments and managers from the document + sop_doc = DocumentParser() + departments_and_roles = sop_doc.extract_departments_and_managers(docs) + + + + # Prepare extracted roles (only managers) + extracted_managers = [] + for department in departments_and_roles['departments']: + extracted_managers.extend([ + { + 'name': manager['name'], + 'position': manager.get('title', 'Unknown Position'), + 'role': manager.get('classification', 'Unknown Role') # PRP or SRP classification + } + for manager in department['managerial_roles'] + ]) + + # Generate prompt for the LLM to compare reference roles with extracted roles + prompt = generate_llm_comparison_prompt(reference_roles, extracted_managers) + + # Send prompt to the LLM for comparison + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + {"role": "system", "content": "You are a role comparison assistant."}, + {"role": "user", "content": prompt} + ], + max_tokens=1024, + temperature=0.1 + ) + + # Parse LLM response (assuming it returns a structured JSON with assigned, unassigned, and unavailable roles) + comparison_result = json.loads(response.choices[0].message.content) + + # Return the result as a JSON response + return jsonify(comparison_result), 200 + + except Exception as e: + return jsonify({"error": "Processing error", "message": f"An error occurred: {str(e)}"}), 500 + + + + \ No newline at end of file diff --git a/src/services/sop_generator.py b/src/services/sop_generator.py index f0d8c3b..ff118c5 100644 --- a/src/services/sop_generator.py +++ b/src/services/sop_generator.py @@ -5,117 +5,9 @@ from pydantic import BaseModel, Field from typing import List, Dict, Optional from src.prompts.sops import * from src.models.response_schemas import * - -class SopGeneratorDocument: - def __init__(self): - self.api_key = os.getenv("OPENAI_API_KEY") - self.client = OpenAI(api_key=self.api_key) - self.model = "gpt-4o-2024-08-06" - - def _extract_text_from_docs(self, docs): - """Extract text content from document objects.""" - return [doc.page_content for doc in docs] - # Existing methods... - - def extract_sops_from_doc(self, docs) -> VisionMissionResponse: - """ - Extracts Vision, Mission, and SOPs categorized into 'must,' 'shall,' and 'will' from the document. - - :param docs: The document(s) from which to extract information. - :return: VisionMissionResponse containing the vision, mission, and role-specific SOPs. - """ - - try: - docs_text = self._extract_text_from_docs(docs) - prompt = get_sop_extraction_from_doc() - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - { - "role": "system", - "content": f'''{prompt}''' - }, - { - "role": "user", - "content": [{"type": "text", "text": text} for text in docs_text], - } - ], - response_format=SOPsResponse, - max_tokens=4096, - temperature=0.1 - ) - - # Parse the response from the LLM - extracted_text = json.loads(response.choices[0].message.content) - - return extracted_text - - except: - return False - - def extract_vision_mission(self, docs) -> VisionMissionResponse: - """ - Extracts Vision, Mission, and SOPs categorized into 'must,' 'shall,' and 'will' from the document. - - :param docs: The document(s) from which to extract information. - :return: VisionMissionResponse containing the vision, mission, and role-specific SOPs. - """ - - try: - docs_text = self._extract_text_from_docs(docs) - prompt = get_vision_mission_extraction_from_doc() - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - { - "role": "system", - "content": f'''{prompt}''' - }, - { - "role": "user", - "content": [{"type": "text", "text": text} for text in docs_text], - } - ], - response_format=VisionMissionResponse, - max_tokens=4096, - temperature=0.1 - ) - - # Parse the response from the LLM - extracted_text = json.loads(response.choices[0].message.content) - - return extracted_text - - except: - return False - - def extract_departments_and_managers(self, docs): - """ - Extract departments and managerial roles from the document. - - :param docs: List of document chunks - :return: Dictionary containing departments and their managerial roles - """ - try: - docs_text = self._extract_text_from_docs(docs) - prompt = get_departments_and_roles_extraction_prompt() - - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - {"role": "system", "content": prompt}, - {"role": "user", "content": [{"type": "text", "text": text} for text in docs_text]} - ], - response_format=DepartmentsAndRolesResponse, - max_tokens=4096, - temperature=0.1 - ) - - - return json.loads(response.choices[0].message.content) - except json.JSONDecodeError: - return False - +from src.services.document_parser import DocumentParser +from dotenv import load_dotenv +load_dotenv() @@ -271,7 +163,155 @@ class SopGeneratorExecutive: def generate_sops_for_department_managers(self, docs): try: # First, extract departments and managers - sop_doc = SopGeneratorDocument() + sop_doc = DocumentParser() + departments_and_roles = sop_doc.extract_departments_and_managers_workers(docs) + + if not departments_and_roles or not departments_and_roles.get('departments'): + return False + + departments_with_sops = [] + + for department in departments_and_roles['departments']: + managers_with_sops = [] + for role in department['managers']: + prompt = get_sop_for_department_managers() + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": f"Generate SOPs for {role['position']} in {department['name']} department."} + ], + response_format=ManagerSOPs, + max_tokens=1024, + temperature=0.1 + ) + manager_sops = json.loads(response.choices[0].message.content) + managers_with_sops.append(ManagerWithSOPs(title=role['position'], sops=manager_sops)) + + departments_with_sops.append(DepartmentManagerSOPs( + name=department['name'], + managers=managers_with_sops + )) + + return ExecutiveManagerSOPsResponse(departments=departments_with_sops) + + except Exception as e: + print(f"Error in generate_sops_for_department_managers: {str(e)}") + return False + + + def generate_sops_from_questionnaire(self, questionnaire_data: dict, executives: List[str], managers: List[str], departments: List[str]): + try: + prompt = get_sop_executive_from_questionnaire() + + # Prepare the questionnaire data for the prompt + user_content = json.dumps(questionnaire_data, indent=2) + + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + {"role": "system", "content": prompt}, + {"role": "user", "content": f"Generate SOPs based on this questionnaire:\n{user_content}\n\nExecutives to consider: {', '.join(executives)}\nManagers to consider: {', '.join(managers)}\nDepartments to consider: {', '.join(departments)}"} + ], + response_format={"type": "json_object"}, + max_tokens=4096, + temperature=0.1 + ) + + sops_data = json.loads(response.choices[0].message.content) + + # Process executive SOPs + executive_sops = {} + for executive in executives: + if executive in sops_data['executives']: + executive_sops[executive] = Categories(**sops_data['executives'][executive]) + else: + executive_sops[executive] = Categories() + + # Process department manager SOPs + departments_with_sops = [] + for dept_name in departments: + dept_data = next((d for d in sops_data['departments'] if d['name'].lower() == dept_name.lower()), None) + if dept_data: + managers_with_sops = [ + ManagerWithSOPs( + title=manager, + sops=ManagerSOPs(**dept_data['managers']) + ) + for manager in managers + + ] + if managers_with_sops: + departments_with_sops.append(DepartmentManagerSOPs( + name=dept_name, + managers=managers_with_sops + )) + + return { + "executive_sops": executive_sops, + "department_sops": ExecutiveManagerSOPsResponse(departments=departments_with_sops) + } + + except Exception as e: + print(f"Error in generate_sops_from_questionnaire: {str(e)}") + return False + + + +class SopGeneratorManager: + def __init__(self): + self.api_key = os.getenv("OPENAI_API_KEY") + self.client = OpenAI(api_key=self.api_key) + self.model = "gpt-4o-mini" + + def extract_sops_from_executive_vision_goals_doc(self, data: dict,executives:List) -> SOPsResponse: + """ + Extracts SOPs categorized into 'must,' 'shall,' and 'will' based on executive vision and goals. + + :param data: A dictionary containing vision and goals. + :return: SOPsResponse containing the SOPs for executives + """ + try: + + vision = data.get("vision", "No vision provided") + goals = data.get("goals", "No goals provided") + + prompt = get_sop_executive_from_vision_goals(executives) + + user_content = f''' + Vision: {vision} + Goals: {goals} + ''' + + response = self.client.beta.chat.completions.parse( + model=self.model, + messages=[ + { + "role": "system", + "content": f'''{prompt}''' + }, + { + "role": "user", + "content": user_content, + } + ], + response_format=Categories, + max_tokens=2048, + temperature=0.1 + ) + + extracted_text = json.loads(response.choices[0].message.content) + return extracted_text + + except Exception as e: + print(f"Error occurred: {str(e)}") + return False + + + def generate_sops_for_department_managers(self, docs): + try: + # First, extract departments and managers + sop_doc = DocumentParser() departments_and_roles = sop_doc.extract_departments_and_managers(docs) if not departments_and_roles or not departments_and_roles.get('departments'): @@ -363,5 +403,7 @@ class SopGeneratorExecutive: except Exception as e: print(f"Error in generate_sops_from_questionnaire: {str(e)}") return False - + + + diff --git a/test.py b/test.py index d593496..bb19d4d 100644 --- a/test.py +++ b/test.py @@ -1,81 +1,14 @@ -from src.services.sop_generator import SopGeneratorDocument, SopGeneratorExecutive +from src.services.sop_generator import SopGeneratorExecutive from src.utils.document_loader import load_document - -file_path = "/root/ds_erp_ai/data/raw/document.doc" +from src.services.document_parser import DocumentParser +from src.services.sop_generator import SopGeneratorExecutive +file_path = r"C:\Users\User\Desktop\Blessing_AI\MKD\test_erp_ai\erp_ai\test\erp_ai\data\raw\document.doc" docs = load_document(file_path) -sop_doc = SopGeneratorDocument() -sop_executive = SopGeneratorExecutive() + if __name__ == "__main__": - # Test the generate_sops_from_questionnaire function - questionnaire_data = { - "organizational_vision": { - "question_1_answer": "Our vision is to lead the market in innovative product solutions.", - "question_2_answer": "We see our organization contributing by expanding into new regions and enhancing service quality.", - "question_3_answer": "The key elements of our vision focus on scalability, customer satisfaction, and technological advancement." - }, - "organizational_strategic_goals": { - "question_1_answer": "The strategic direction is to increase market share and improve operational efficiency.", - "question_2_answer": "We aim to achieve a 20% reduction in operating costs by streamlining internal processes.", - "question_3_answer": "The process aligns with our goal to reduce costs while maintaining high product quality." - }, - "departmental_strategic_goals": { - "sales_department_answer": "Increase sales by 15% in the next fiscal year through better lead generation and customer retention.", - "finance_department_answer": "Ensure a balanced budget by optimizing resource allocation and reducing overhead costs." - } - } - - executives = ["CEO", "COO"] - managers = ["Sales Manager", "Finance Manager"] + SOP = DocumentParser() + so = SopGeneratorExecutive() + info = SOP.extract_departments_and_managers_workers(docs) + print(info) - sops_from_questionnaire = sop_executive.generate_sops_from_questionnaire(questionnaire_data, executives, managers) - - if sops_from_questionnaire: - print("Generated SOPs from Questionnaire:") - - # Print Executive SOPs - print("\nExecutive SOPs:") - for executive, sops in sops_from_questionnaire["executive_sops"].items(): - print(f" {executive}:") - print(" Must SOPs:") - for sop in sops.must: - print(f" - {sop}") - print(" Shall SOPs:") - for sop in sops.shall: - print(f" - {sop}") - print(" Will SOPs:") - for sop in sops.will: - print(f" - {sop}") - - # Print Department Manager SOPs - print("\nDepartment Manager SOPs:") - for department in sops_from_questionnaire["department_sops"].departments: - print(f" Department: {department.name}") - for manager in department.managers: - print(f" Manager: {manager.title}") - print(" Must SOPs:") - for sop in manager.sops.must: - print(f" - {sop}") - print(" Shall SOPs:") - for sop in manager.sops.shall: - print(f" - {sop}") - print(" Will SOPs:") - for sop in manager.sops.will: - print(f" - {sop}") - else: - print("Failed to generate SOPs from questionnaire.") - - # You can keep the previous tests if you want - departments_and_roles = sop_doc.extract_departments_and_managers(docs) - if departments_and_roles: - print("\nExtracted Departments and Roles:") - for department in departments_and_roles.get('departments', []): - print(f"\nDepartment: {department['name']}") - for role in department.get('managerial_roles', []): - print(f" Role: {role['title']}") - print(f" Responsibilities: {', '.join(role['responsibilities'])}") - else: - print("Failed to extract departments and roles.") - - v_ms = sop_doc.extract_vision_mission(docs) - print(f"\nVision and Mission: {v_ms}")