SuperOffice Connector README
Overview
This directory contains Python scripts designed to integrate with the SuperOffice CRM API, primarily for data extraction and analysis related to sales and customer product information.
Authentication
Authentication is handled via the AuthHandler class, which uses a refresh token flow to obtain access tokens. Ensure that the .env file in the project root is correctly configured with SO_CLIENT_ID, SO_CLIENT_SECRET, SO_REFRESH_TOKEN, SO_REDIRECT_URI, SO_ENVIRONMENT, and SO_CONTEXT_IDENTIFIER.
Key SuperOffice Entities and Data Model Observations
During the development of reporting functionalities, the following observations were made regarding the SuperOffice data model:
1. Sale Entity
- Primary Source for Product Information: Contrary to initial expectations, product information is frequently stored as free-text within the
Headingfield of theSaleobject (e.g.,"2xOmnie CD-01 mit Nachlass"). This appears to be a common practice in the system, rather than utilizing structured product catalog items linked via quotes. - Contact Association: A significant number of
Saleobjects (Sale?$filter=Contact ne null) are not directly linked to aContactobject (Contact: null), making it challenging to attribute sales to specific customers programmatically. Our reporting scripts specifically filter for sales where aContactis present. - No Direct Quote/QuoteLine Linkage: Attempts to retrieve
QuoteorQuoteLineobjects directly viaSale/{saleId}/Quotes,Contact/{contactId}/Quotes, orSale/{saleId}/Activitiesresulted in500 Internal Server Errorsor empty result sets. This indicates that direct, API-accessible linkages betweenSalesandstructured QuoteLinesare often absent or not exposed via these endpoints.
2. Product Information Storage (Hypothesis & Workaround)
- Free-Text in Heading: The primary source for identifying products associated with a sale is the
Headingfield of theSaleentity itself. This field often contains product codes, descriptions, and other relevant details as free-text. - User-Defined Fields (UDFs): While
UserDefinedFieldswere inspected for structured product data (e.g.,RR-02-017-OMNIE), no such patterns were found in thesale_id=342243example. This suggests that UDFs are either not consistently used for product codes or are named in a way that doesn't align with common product terminology.
Scripts
list_products.py
- Purpose: Fetches and displays a list of all defined product families from the SuperOffice product catalog (
/List/ProductFamily/Items). - Usage:
python3 list_products.py
generate_customer_product_report.py
- Purpose: Generates a CSV report of customer sales, extracting product information from the
Sale.Headingfield using keyword matching. - Methodology:
- Retrieves the latest
SALE_LIMIT(e.g., 1000)Saleobjects, filtering only those with an associatedContact($filter=Contact ne null). - Extracts
SaleId,CustomerName, andSaleHeadingfor each relevant sale. - Searches the
SaleHeadingfor predefinedPRODUCT_KEYWORDS(e.g.,OMNIE,CD-01,Service). - Outputs the results to
product_report.csv.
- Retrieves the latest
- Usage:
python3 generate_customer_product_report.py
Future Work
- Analyse der leeren
product_report.csv: Untersuchen, warum dieproduct_report.csvauch nach der Filterung nachSale-Objekten mitContact-Verknüpfung leer bleibt. Es ist entscheidend zu verstehen, ob es keine solchen Verkäufe gibt oder ob ein Problem mit der Datenabfrage oder -verarbeitung vorliegt. - Manuelle Inspektion gefilterter
Sale-Objekte: Wenn der Report leer ist, müssen wir einigeSale-Objekte, die die BedingungContact ne nullerfüllen, manuell inspizieren, um ihre Struktur zu verstehen und festzustellen, ob dasHeading-Feld oder andere Felder Produktinformationen enthalten. - Verfeinerung der
PRODUCT_KEYWORDS: Die Liste der Produkt-Schlüsselwörter muss möglicherweise erweitert werden, basierend auf einer detaillierteren manuellen Analyse der Verkaufsüberschriften. - Erforschung alternativer API-Pfade: Falls der aktuelle Ansatz weiterhin Schwierigkeiten bereitet, müssen wir tiefer in die SuperOffice-API eintauchen, um strukturierte Produktdaten zu finden, auch wenn sie nicht direkt mit den Verkäufen verknüpft sind.