""" Order detail dialog. Mainly a debugging aid: shows exactly what JIRA sent back for this ticket (raw payload), plus the tracking numbers ShipStation supplied and the JIRA status they suggest - handy for the end-of-day close-out without having to piece it together by hand. Also offers quick jumps out to JIRA and Google Maps, since those are common next steps when something about a ticket needs a closer look. """ from __future__ import annotations import json import webbrowser from PyQt6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QTextEdit, QLabel, QPushButton from app.external_links import jira_ticket_url, google_maps_search_url from app.models import Order from app.ticket_validation import validate_ticket from app.tracking import suggest_jira_status def _format_tracking_line(t: dict) -> str: kind = "RETURN" if t.get("is_return") else "outgoing" carrier = t.get("carrier") carrier_suffix = f" ({carrier})" if carrier else "" return f" {t.get('number')} - {kind}{carrier_suffix}" class OrderDetailDialog(QDialog): def __init__(self, order: Order, parent=None): super().__init__(parent) self.setWindowTitle(f"Order Detail - {order.ticket_number or order.external_id}") self.resize(700, 600) layout = QVBoxLayout(self) tracking = order.tracking_numbers or [] tracking_lines = [_format_tracking_line(t) for t in tracking] suggested = suggest_jira_status(tracking) info = order.shipping_info or {} address_line2 = f" {info.get('address2')}" if info.get("address2") else "" issues = validate_ticket(order.skus, order.line_items) summary_lines = [ f"Ticket #: {order.ticket_number or '(none found)'}", f"Company: {order.company}", f"Created by: {order.creator or '(unknown)'}", f"SKUs: {', '.join(order.skus or []) or '(none extracted)'}", f"Status: {order.status}", ] if issues: summary_lines.append("") summary_lines.append("\u26a0 Flagged for review:") summary_lines.extend(f" - {issue.message}" for issue in issues) summary_lines.extend( [ "", "Shipping info (used by the emergency Send to ShipStation action):", f" Name: {info.get('name') or '(missing)'}", f" Address: {info.get('address1') or '(missing)'}{address_line2}", f" {info.get('city', '')}, {info.get('state', '')} {info.get('zip', '')}".rstrip(), f" Phone: {info.get('phone') or '(none)'} Email: {info.get('email') or '(none)'}", "", "Tracking numbers:", ] ) summary_lines.extend(tracking_lines or [" (none pulled yet)"]) if suggested: summary_lines.append("") summary_lines.append(f"Suggested JIRA status: {suggested}") summary_label = QLabel("\n".join(summary_lines)) layout.addWidget(summary_label) link_buttons = QHBoxLayout() jira_button = QPushButton("View in JIRA") jira_button.clicked.connect(lambda: self._open_url(jira_ticket_url(order.ticket_number))) link_buttons.addWidget(jira_button) maps_button = QPushButton("Look Up Address on Google Maps") maps_button.clicked.connect(lambda: self._open_url(google_maps_search_url(order.shipping_info))) link_buttons.addWidget(maps_button) link_buttons.addStretch() layout.addLayout(link_buttons) layout.addWidget(QLabel("Raw payload from source system:")) text = QTextEdit() text.setReadOnly(True) text.setFontFamily("Courier New") text.setPlainText(json.dumps(order.raw_data, indent=2, default=str)) layout.addWidget(text) close_button = QPushButton("Close") close_button.clicked.connect(self.accept) layout.addWidget(close_button) def _open_url(self, url: str | None) -> None: if url: webbrowser.open(url)