diff --git a/src/popup/popup.css b/src/popup/popup.css index 438d4d2..0307f68 100644 --- a/src/popup/popup.css +++ b/src/popup/popup.css @@ -459,6 +459,21 @@ body { color: var(--text-light); } +.pdf-item-status.failed { + color: var(--red); +} + +/* Error details for erroneous documents */ +.pdf-item-error { + font-size: 10px; + color: var(--red); + margin-top: 4px; + padding: 4px 6px; + background: rgba(229, 57, 53, 0.08); + border-radius: 3px; + line-height: 1.3; +} + /* Price display */ .pdf-price { font-weight: 600; diff --git a/src/popup/popup.ts b/src/popup/popup.ts index 9e483cc..02cc4f4 100644 --- a/src/popup/popup.ts +++ b/src/popup/popup.ts @@ -464,6 +464,9 @@ function renderPDFItem(pdf: DocumentProxy, section: 'pending' | 'basket' | 'prod break; } + // Show detailed error info for erroneous documents + const hasErrorDetails = pdf.binectStatus === 'failed' && pdf.errorMessage && pdf.binectStatusCode === 7; + return `
${getStatusIcon(pdf.binectStatus)}
@@ -478,6 +481,7 @@ function renderPDFItem(pdf: DocumentProxy, section: 'pending' | 'basket' | 'prod
${pdf.recipientAddress ? `
${escapeHtml(pdf.recipientAddress.split('\n')[0])}
` : ''}
${statusText}
+ ${hasErrorDetails ? `
${escapeHtml(pdf.errorMessage!)}
` : ''}
${actionsHtml} @@ -896,6 +900,8 @@ async function handleRefreshStatus(id: string) { newStatus = 'sent'; } else if (result.status === 6) { newStatus = 'canceled'; + } else if (result.status === 7) { + newStatus = 'failed'; // Erroneous } else if (result.status === 3 || result.status === 4) { newStatus = 'in_production'; } else if (result.status === 2) { @@ -906,7 +912,8 @@ async function handleRefreshStatus(id: string) { binectStatus: result.status, binectStatusText: result.statusText, price: result.price, - recipientAddress: result.recipientAddress + recipientAddress: result.recipientAddress, + errorMessage: result.errorDetails }; // Update in background @@ -923,6 +930,7 @@ async function handleRefreshStatus(id: string) { pdf.binectStatusText = result.statusText; if (result.price) pdf.price = result.price; if (result.recipientAddress) pdf.recipientAddress = result.recipientAddress; + if (result.errorDetails) pdf.errorMessage = result.errorDetails; renderPDFList(); } catch (error) { diff --git a/src/utils/binect-api.ts b/src/utils/binect-api.ts index 060c248..053010f 100644 --- a/src/utils/binect-api.ts +++ b/src/utils/binect-api.ts @@ -334,6 +334,7 @@ export interface DocumentStatusInfo { statusText: string; price?: number; recipientAddress?: string; + errorDetails?: string; // Error details for erroneous documents } /** @@ -425,17 +426,25 @@ export async function getDocumentStatus( // Extract price and recipient if available let price: number | undefined; let recipientAddress: string | undefined; + let errorDetails: string | undefined; if (doc.letter?.letterData) { price = doc.letter.letterData.price?.priceAfterTax; recipientAddress = doc.letter.letterData.recipientAddress; } + // Extract error details for erroneous documents (status 7) + if (doc.status.code === 7 && doc.letter?.errors && doc.letter.errors.length > 0) { + errorDetails = doc.letter.errors.map(e => e.message).join('; '); + console.log('[Binect API] Document errors:', errorDetails); + } + return { status: doc.status.code, statusText: doc.status.text || getStatusText(doc.status.code), price, recipientAddress, + errorDetails, }; } catch (error) { console.error('[Binect API] Get status error:', error);