Skip to main content

invoice-document-pdf

Generating invoices, contracts, forms, receipts, and business documents as professional PDFs

معلومات المصدر

المستودع
cosmicstack-labs/mercury-agent-skills
آخر نشاط في المصدر
١٢ مايو ٢٠٢٦ في ٠٩:٠٢
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٤٧٦
التفرعات
٦٣

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
invoice-document-pdf
description
Generating invoices, contracts, forms, receipts, and business documents as professional PDFs
metadata
{"author":"cosmicstack-labs","version":"1.0.0","category":"pdf-generation","tags":["invoice","pdf-generation","business-documents","contracts","forms"]}
# Invoice & Document PDF Generation Generate professional business documents — invoices, contracts, receipts, forms — as polished PDFs. This skill covers templates, data-driven generation, batch processing, digital signatures, and workflow automation. --- ## Invoice PDF Structure A professional invoice follows a standard layout that makes it easy to process, pay, and reconcile. ### Standard Invoice Anatomy ```text ┌───────────────────────────────────────────┐ │ [LOGO] INVOICE │ │ Your Company #INV-2025-0042 │ │ 123 Business Rd │ │ City, State ZIP │ ├─────────────────┬─────────────────────────┤ │ Bill To: │ Invoice Details: │ │ Client Name │ Date: 2025-01-15 │ │ Client Address │ Due: 2025-02-14 │ │ City, State │ Terms: Net 30 │ │ │ PO #: PO-2025-001 │ ├─────────────────┴─────────────────────────┤ │ # │ Description │ Qty │ Rate│ Amt │ │ ───┼───────────────────┼─────┼─────┼─────┤ │ 1 │ Web Development │ 40 │ 150 │$6,000│ │ 2 │ UI/UX Design │ 20 │ 125 │$2,500│ │ 3 │ DevOps Setup │ 8 │ 175 │$1,400│ ├────────────────────────┴─────┴─────┴─────┤ │ Subtotal: $9,900 │ │ Tax (8%): $792 │ │ Discount (5%): -$495 │ │ Total: $10,197 │ ├───────────────────────────────────────────┤ │ Payment Information: │ │ Bank: First National Bank │ │ Account: XXXX-XXXX-1234 │ │ Routing: 021000021 │ │ PayPal: pay@company.com │ ├───────────────────────────────────────────┤ │ Terms & Notes: │ │ Payment due within 30 days. │ │ Late payment subject to 1.5%/mo fee. │ └───────────────────────────────────────────┘ ``` ### Invoice Data Model ```python """Invoice data model with validation.""" from dataclasses import dataclass, field from datetime import datetime, timedelta from decimal import Decimal from typing import Optional, list import uuid @dataclass class LineItem: """A single line item on an invoice.""" description: str quantity: Decimal unit_price: Decimal sku: Optional[str] = None @property def amount(self) -> Decimal: return self.quantity * self.unit_price @dataclass class InvoiceData: """Complete invoice data structure.""" # Invoice identifiers invoice_number: str po_number: Optional[str] = None # Dates issue_date: str = field(default_factory=lambda: datetime.now().strftime("%Y-%m-%d")) due_date: Optional[str] = None payment_terms: str = "Net 30" # Seller (Your company) seller_name: str = "" seller_address: str = "" seller_city: str = "" seller_state: str = "" seller_zip: str = "" seller_phone: str = "" seller_email: str = "" seller_logo_path: Optional[str] = None tax_id: Optional[str] = None # Buyer (Client) client_name: str = "" client_address: str = "" client_city: str = "" client_state: str = "" client_zip: str = "" client_email: Optional[str] = None # Line items line_items: list[LineItem] = field(default_factory=list) # Financial tax_rate: Decimal = Decimal("0") discount_rate: Decimal = Decimal("0") discount_description: str = "Discount" currency_symbol: str = "$" # Payment bank_name: Optional[str] = None bank_account: Optional[str] = None bank_routing: Optional[str] = None payment_instructions: Optional[str] = None # Notes notes: Optional[str] = None terms: Optional[str] = None def __post_init__(self): if not self.due_date: due = datetime.now() + timedelta(days=30) self.due_date = due.strftime("%Y-%m-%d") if not self.invoice_number: self.invoice_number = f"INV-{datetime.now().strftime('%Y%m')}-{uuid.uuid4().hex[:6].upper()}" @property def subtotal(self) -> Decimal: return sum(item.amount for item in self.line_items) @property def tax_amount(self) -> Decimal: return self.subtotal * self.tax_rate @property def discount_amount(self) -> Decimal: return self.subtotal * self.discount_rate @property def total(self) -> Decimal: return self.subtotal + self.tax_amount - self.discount_amount ``` --- ## 2. HTML/CSS Print Templates for Invoices ### Invoice Print Template ```html <!-- templates/invoice.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Invoice {{ invoice.invoice_number }}</title> <style> /* Page setup */ @page { size: A4; margin: 1.5cm 2cm 2cm 2cm; @bottom-center { content: "Invoice {{ invoice.invoice_number }} — Page " counter(page); font-size: 8pt; color: #999; font-family: 'Helvetica', 'Arial', sans-serif; } } body { font-family: 'Helvetica', 'Arial', sans-serif; font-size: 9.5pt; color: #333; line-height: 1.5; margin: 0; padding: 0; } /* Header section */ .invoice-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 2cm; border-bottom: 3px solid #1a1a2e; padding-bottom: 0.5cm; } .invoice-header .seller-info { flex: 1; } .invoice-header .seller-info h1 { font-size: 11pt; color: #1a1a2e; margin: 0 0 4px 0; font-weight: bold; } .invoice-header .seller-info p { margin: 1px 0; font-size: 9pt; color: #666; } .invoice-header .invoice-title { text-align: right; } .invoice-header .invoice-title h2 { font-size: 24pt; color: #1a1a2e; margin: 0; letter-spacing: 3px; text-transform: uppercase; } .invoice-header .invoice-title .invoice-number { font-size: 12pt; color: #e94560; font-weight: bold; margin-top: 4px; } .invoice-header .invoice-title .invoice-number span { color: #333; font-weight: normal; } /* Billing section */ .billing-section { display: flex; justify-content: space-between; margin-bottom: 1.5cm; } .bill-to, .invoice-details { width: 45%; } .bill-to h3, .invoice-details h3 { font-size: 9pt; color: #999; text-transform: uppercase; letter-spacing: 1px; margin: 0 0 6px 0; border-bottom: 1px solid #ddd; padding-bottom: 4px; } .bill-to p, .invoice-details p { margin: 2px 0; font-size: 9pt; } .invoice-details table { width: 100%; border-collapse: collapse; } .invoice-details td { padding: 2px 0; font-size: 9pt; } .invoice-details td:first-child { color: #999; width: 40%; } .invoice-details td:last-child { text-align: right; font-weight: bold; } /* Line items table */ .items-table { width: 100%; border-collapse: collapse; margin-bottom: 1cm; } .items-table thead th { background: #1a1a2e; color: white; padding: 8px 10px; font-size: 8.5pt; text-transform: uppercase; letter-spacing: 0.5px; text-align: left; } .items-table thead th:last-child { text-align: right; } .items-table thead th:nth-child(3), .items-table thead th:nth-child(4) { text-align: right; } .items-table tbody td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 9pt; } .items-table tbody td:last-child { text-align: right; font-weight: bold; } .items-table tbody td:nth-child(3), .items-table tbody td:nth-child(4) { text-align: right; } .items-table tbody tr:nth-child(even) { background: #f8f9fa; } .items-table tbody tr:last-child td { border-bottom: 2px solid #1a1a2e; } /* Totals section */ .totals-section { display: flex; justify-content: flex-end; margin-bottom: 1.5cm; } .totals-table { width: 40%; border-collapse: collapse; } .totals-table td { padding: 4px 10px; font-size: 9pt; } .totals-table td:first-child { text-align: right; color: #666; width: 50%; } .totals-table td:last-child { text-align: right; font-weight: bold; width: 50%; } .totals-table .total-row td { border-top: 2px solid #1a1a2e; font-size: 11pt; font-weight: bold; padding-top: 8px; color: #1a1a2e; } .totals-table .discount-row td { color: #e94560; } /* Payment section */ .payment-section { background: #f8f9fa; border: 1px solid #dee2e6; padding: 12px 16px; margin-bottom: 1cm; page-break-inside: avoid; } .payment-section h3 { font-size: 9pt; color: #1a1a2e; text-transform: uppercase; letter-spacing: 1px; margin: 0 0 8px 0; } .payment-section p { margin: 2px 0; font-size: 8.5pt; } /* Notes section */ .notes-section { font-size: 8.5pt; color: #666; margin-top: 1cm; border-top: 1px solid #ddd; padding-top: 0.5cm; } .notes-section h3 { font-size: 8pt; text-transform: uppercase; letter-spacing: 1px; color: #999; margin: 0 0 4px 0; } /* Logo */ .logo { max-height: 1.5cm; max-width: 4cm; } /* QR Code placement */ .qr-code { position: absolute; top: 1cm; right: 2cm; width: 2cm; height: 2cm; } </style> </head> <body> <div class="invoice-header"> <div class="seller-info"> {% if invoice.seller_logo_path %} <img src="{{ invoice.seller_logo_path }}" class="logo" alt="Logo"> {% endif %} <h1>{{ invoice.seller_name }}</h1> <p>{{ invoice.seller_address }}</p> <p>{{ invoice.seller_city }}, {{ invoice.seller_state }} {{ invoice.seller_zip }}</p> {% if invoice.seller_phone %}<p>Phone: {{ invoice.seller_phone }}</p>{% endif %} {% if invoice.seller_email %}<p>Email: {{ invoice.seller_email }}</p>{% endif %} {% if invoice.tax_id %}<p>Tax ID: {{ invoice.tax_id }}</p>{% endif %} </div> <div class="invoice-title"> <h2>Invoice</h2> <div class="invoice-number">#<span>{{ invoice.invoice_number }}</span></div> </div> </div> <div class="billing-section"> <div class="bill-to"> <h3>Bill To</h3> <p><strong>{{ invoice.client_name }}</strong></p> <p>{{ invoice.client_address }}</p> <p>{{ invoice.client_city }}, {{ invoice.client_state }} {{ invoice.client_zip }}</p> {% if invoice.client_email %}<p>{{ invoice.client_email }}</p>{% endif %} </div> <div class="invoice-details"> <h3>Invoice Details</h3> <table> <tr><td>Invoice Date</td><td>{{ invoice.issue_date }}</td></tr> <tr><td>Due Date</td><td>{{ invoice.due_date }}</td></tr> <tr><td>Payment Terms</td><td>{{ invoice.payment_terms }}</td></tr>
عرض على GitHub
ملف SKILL.md هذا كبير جدا، لذلك يعرض SkillsMP القسم الاول فقط هنا. عرض على GitHub