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);