import pandas as pd
from PowerPlatform.Dataverse.client import DataverseClient
from azure.identity import DefaultAzureCredential
from datetime import datetime
class ReportExporter:
"""Export Dataverse data to reports."""
def __init__(self, org_url: str):
self.client = DataverseClient(
base_url=org_url,
credential=DefaultAzureCredential()
)
def export_sales_summary(self, output_file: str):
"""Export sales data for reporting."""
accounts = []
for page in self.client.get(
"account",
select=["accountid", "name", "revenue", "numberofemployees",
"createdon", "modifiedon"],
filter="statecode eq 0", # Active only
orderby=["revenue desc"],
top=10000
):
accounts.extend(page)
# Opportunities
opportunities = []
for page in self.client.get(
"opportunity",
select=["opportunityid", "name", "estimatedvalue",
"statuscode", "parentaccountid", "createdon"],
top=10000
):
opportunities.extend(page)
# Create DataFrames
df_accounts = pd.DataFrame(accounts)
df_opportunities = pd.DataFrame(opportunities)
# Generate report
with pd.ExcelWriter(output_file) as writer:
df_accounts.to_excel(writer, sheet_name="Accounts", index=False)
df_opportunities.to_excel(writer, sheet_name="Opportunities", index=False)
# Summary sheet
summary = pd.DataFrame({
"Metric": [
"Total Accounts",
"Total Opportunities",
"Total Revenue",
"Export Date"
],
"Value": [
len(df_accounts),
len(df_opportunities),
df_accounts["revenue"].sum() if "revenue" in df_accounts else 0,
datetime.now().isoformat()
]
})
summary.to_excel(writer, sheet_name="Summary", index=False)
return output_file
def export_activity_log(self, days_back: int = 30) -> str:
"""Export recent activity for audit."""
from_date = pd.Timestamp.now(tz='UTC') - pd.Timedelta(days=days_back)
activities = []
for page in self.client.get(
"activitypointer",
select=["activityid", "subject", "activitytypecode",
"createdon", "ownerid"],
filter=f"createdon gt {from_date.isoformat()}",
orderby=["createdon desc"],
top=10000
):
activities.extend(page)
df = pd.DataFrame(activities)
output = f"activity_log_{datetime.now():%Y%m%d}.csv"
df.to_csv(output, index=False)
return output
# Usage
exporter = ReportExporter("https://myorg.crm.dynamics.com")
report_file = exporter.export_sales_summary("sales_report.xlsx")
print(f"Report saved to {report_file}")