128 lines
3.7 KiB
Python
128 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Send Daily Report via Email
|
|
|
|
Generates and emails the daily POTE summary report.
|
|
|
|
Usage:
|
|
python scripts/send_daily_report.py --to user@example.com
|
|
python scripts/send_daily_report.py --to user1@example.com,user2@example.com --test-smtp
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import sys
|
|
from datetime import date
|
|
from pathlib import Path
|
|
|
|
# Add project root to path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from pote.db import get_session
|
|
from pote.reporting.email_reporter import EmailReporter
|
|
from pote.reporting.report_generator import ReportGenerator
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Send daily POTE report via email")
|
|
parser.add_argument(
|
|
"--to", required=True, help="Recipient email addresses (comma-separated)"
|
|
)
|
|
parser.add_argument(
|
|
"--date",
|
|
help="Report date (YYYY-MM-DD), defaults to today",
|
|
default=None,
|
|
)
|
|
parser.add_argument(
|
|
"--test-smtp",
|
|
action="store_true",
|
|
help="Test SMTP connection before sending",
|
|
)
|
|
parser.add_argument(
|
|
"--lookback-days",
|
|
type=int,
|
|
default=1,
|
|
help="Include trades filed in the last N days ending on the report date (default: 1)",
|
|
)
|
|
parser.add_argument(
|
|
"--save-to-file",
|
|
help="Also save report to this file path",
|
|
default=None,
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Parse recipients
|
|
to_emails = [email.strip() for email in args.to.split(",")]
|
|
|
|
# Parse date if provided
|
|
report_date = None
|
|
if args.date:
|
|
try:
|
|
report_date = date.fromisoformat(args.date)
|
|
except ValueError:
|
|
logger.error(f"Invalid date format: {args.date}. Use YYYY-MM-DD")
|
|
sys.exit(1)
|
|
|
|
# Initialize email reporter
|
|
email_reporter = EmailReporter()
|
|
|
|
# Test SMTP connection if requested
|
|
if args.test_smtp:
|
|
logger.info("Testing SMTP connection...")
|
|
if not email_reporter.test_connection():
|
|
logger.error("SMTP connection test failed. Check your SMTP settings in .env")
|
|
logger.info(
|
|
"Required settings: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, FROM_EMAIL"
|
|
)
|
|
sys.exit(1)
|
|
logger.info("SMTP connection test successful!")
|
|
|
|
# Generate report
|
|
logger.info(f"Generating daily report for {report_date or date.today()}...")
|
|
with get_session() as session:
|
|
generator = ReportGenerator(session)
|
|
report_data = generator.generate_daily_summary(
|
|
report_date, lookback_days=args.lookback_days
|
|
)
|
|
|
|
# Format as text and HTML
|
|
text_body = generator.format_as_text(report_data, "daily")
|
|
html_body = generator.format_as_html(report_data, "daily")
|
|
|
|
# Save to file if requested
|
|
if args.save_to_file:
|
|
with open(args.save_to_file, "w") as f:
|
|
f.write(text_body)
|
|
logger.info(f"Report saved to {args.save_to_file}")
|
|
|
|
# Send email
|
|
subject = f"POTE Daily Report - {report_data['date']}"
|
|
logger.info(f"Sending report to {', '.join(to_emails)}...")
|
|
|
|
success = email_reporter.send_report(
|
|
to_emails=to_emails,
|
|
subject=subject,
|
|
body_text=text_body,
|
|
body_html=html_body,
|
|
)
|
|
|
|
if success:
|
|
logger.info("Report sent successfully!")
|
|
# Print summary to stdout
|
|
print("\n" + text_body + "\n")
|
|
sys.exit(0)
|
|
else:
|
|
logger.error("Failed to send report. Check logs for details.")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|