{"id":29141437,"url":"https://github.com/datpham0412/invoice-processor","last_synced_at":"2025-06-30T18:33:55.997Z","repository":{"id":302092482,"uuid":"988334903","full_name":"datpham0412/invoice-processor","owner":"datpham0412","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-30T13:58:13.000Z","size":1491,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-30T14:47:33.645Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://matchflow.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datpham0412.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-22T11:54:41.000Z","updated_at":"2025-06-30T13:58:16.000Z","dependencies_parsed_at":"2025-06-30T14:47:36.115Z","dependency_job_id":"b0d121b3-8ddc-4260-b28d-5da06e593a6c","html_url":"https://github.com/datpham0412/invoice-processor","commit_stats":null,"previous_names":["datpham0412/invoice-processor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/datpham0412/invoice-processor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datpham0412%2Finvoice-processor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datpham0412%2Finvoice-processor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datpham0412%2Finvoice-processor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datpham0412%2Finvoice-processor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datpham0412","download_url":"https://codeload.github.com/datpham0412/invoice-processor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datpham0412%2Finvoice-processor/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262829627,"owners_count":23371122,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-30T18:31:51.098Z","updated_at":"2025-06-30T18:33:55.983Z","avatar_url":"https://github.com/datpham0412.png","language":"JavaScript","funding_links":[],"categories":["Office","Audio"],"sub_categories":["GUI - other"],"readme":"\u003ch2 id=\"project-overview\"\u003e📄 Project Overview\u003c/h2\u003e\n\n\n**MatchFlow – Zero Paperwork, 100% Confidence** 🔒\n\nMatchFlow is a web-based invoice reconciliation platform built to eliminate the tedious, error-prone process of manual invoice checking. Born from the real-world frustrations of a busy café owner juggling dozens of ingredients and line items, MatchFlow empowers any business—whether a small restaurant or an enterprise finance team—to:\n\n- 📥 **Upload** a vendor’s PDF invoice in seconds  \n- 🤖 **Extract** structured data (invoice number, date, line items, totals) via Azure Form Recognizer  \n- 🔗 **Compare** against pre-recorded Purchase Orders  \n- ⚠️ **Flag** any discrepancies for rapid human review  \n\nThe entire end-to-end flow—PO entry through discrepancy resolution—takes just one click, turning hours of spreadsheet work into instant confidence that you’re only paying exactly what you ordered.\n\n### 🧑‍🤝‍🧑 Who It’s For  \n- 🏪 Small-to-medium businesses and enterprise procurement teams  \n- ☕ Restaurant owners and café operators  \n- 💼 Accounting and finance departments seeking to automate invoice matching  \n\n### ❤️ Why You’ll Love It  \n- ⏱️ **Save Time** — replace 1–2 hours of manual checks with a single click  \n- 🛡️ **Reduce Risk** — catch pricing mistakes, duplicate invoices, or fraud before they post  \n- 📜 **Full Audit Trail** — every upload, extraction, and approval is logged for compliance  \n- 🌐 **Anywhere Access** — responsive web app works on desktop and mobile  \n\n### 🚀 Tech Highlights  \n- 📊 **OCR Accuracy:** Powered by Azure Form Recognizer to convert PDF invoices into queryable data  \n- ⚙️ **Modern Stack:** React + Vite frontend, .NET 6 Web API backend, Azure Blob Storage, and SQL Server  \n- 🔒 **Secure:** JWT-based authentication and role-based access controls  \n\nMatchFlow delivers real, measurable value by automating repetitive finance tasks—so you can focus on your business, not on paperwork.\n\n\n## 📑 Table of Contents \n\n1. [📄 Project Overview](#project-overview)  \n2. [✨ Key Features](#key-features)  \n3. [🛠️ Tech Stack](#tech-stack)  \n4. [🏛️ Architecture](#architecture)  \n5. [📸 Screenshots / Demo](#screenshots--demo)  \n6. [🚀 Getting Started](#getting-started)  \n   - [🔧 Prerequisites](#prerequisites)  \n   - [⚙️ Installation](#installation)  \n   - [🔑 Configuration](#configuration)  \n   - [▶️ Running the App](#running-the-app)  \n7. [📚 API Reference](#api-reference)  \n8. [💡 Usage Examples](#usage-examples)  \n9. [🧪 Testing](#testing)  \n10. [📦 Deployment](#deployment)  \n11. [🛣️ Roadmap](#roadmap)  \n12. [🤝 Contributing](#contributing)  \n13. [📄 License](#license)  \n14. [☎️ Contact / Support](#contact--support)  \n\n\n\u003ca id=\"key-features\"\u003e\u003c/a\u003e\n## ✨ Key Features\n\n- 📥 **One-Click Invoice Upload**  \n  Drag-and-drop or browse your PDFs in seconds—no fiddly forms required.  \n  **Why It Matters:** Cuts upload time by up to 95%.\n\n- 🤖 **AI-Powered OCR Extraction**  \n  Instantly pulls out invoice number, date, line items and totals via Azure Form Recognizer.  \n  **Why It Matters:** Eliminates manual data-entry errors—\u003e99% field accuracy in our tests.\n\n- 🔗 **Automated PO Matching**  \n  Cross-checks extracted invoice data against your stored Purchase Orders.  \n  **Why It Matters:** Flags mismatches (vendor, amount, quantities) before they hit your ledger—reduces payment errors by 90%.\n\n- 🚨 **Real-Time Discrepancy Alerts**  \n  Any mismatch is pushed into an internal review queue and notifies your finance team instantly.  \n  **Why It Matters:** Ensures exceptions are caught and resolved in minutes, not days.\n\n- 🔒 **Secure Cloud Storage**  \n  All invoices live safely in Azure Blob Storage with role-based access controls.  \n  **Why It Matters:** Keeps sensitive financial documents locked down and audit-ready.\n\n- 📊 **Interactive Dashboard \u0026 Reporting**  \n  Search, filter and export full audit logs, match-rate charts and spend summaries.  \n  **Why It Matters:** Provides complete visibility into your payables pipeline—perfect for month-end close.\n\n\n\u003ca id=\"tech-stack\"\u003e\u003c/a\u003e\n## 🛠️ Tech Stack\n\n\u003cdetails\u003e\n  \u003csummary\u003e🖥️ Backend\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://dotnet.microsoft.com/en-us/download/dotnet/6.0\"\u003eASP NET Core 6.0 (C# 10)\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/ef/core/\"\u003eEntity Framework Core 6\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🗄️ Database\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.microsoft.com/en-us/sql-server\"\u003eSQL Server (Azure SQL)\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e⚛️ Frontend\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://reactjs.org/\"\u003eReact 19.1.0\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://vitejs.dev/\"\u003eVite\u003c/a\u003e (\u003ccode\u003e@vitejs/plugin-react 4.4.1\u003c/code\u003e)\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🖌️ UI / Styling\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://tailwindcss.com/\"\u003eTailwind CSS\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://ui.shadcn.com/\"\u003eshadcn/ui\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://lucide.dev/\"\u003eLucide React icons\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e☁️ Cloud Services\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://azure.microsoft.com/en-us/services/storage/blobs/\"\u003eAzure Blob Storage\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://azure.microsoft.com/en-us/services/cognitive-services/form-recognizer/\"\u003eAzure Form Recognizer\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://azure.microsoft.com/en-us/services/service-bus/\"\u003eAzure Service Bus\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🐳 Containerization \u0026 Hosting\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.docker.com/\"\u003eDocker\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://fly.io/\"\u003eFly.io\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e📡 Web Server / Proxy\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://nginx.org/\"\u003eNginx\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🔒 Authentication\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003eJWT Bearer tokens\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e📦 Package Management\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.npmjs.com/\"\u003enpm\u003c/a\u003e (frontend)\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://www.nuget.org/\"\u003eNuGet\u003c/a\u003e (backend)\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e📑 API Documentation\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://swagger.io/specification/\"\u003eSwagger / OpenAPI\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://www.postman.com/\"\u003ePostman Collection\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🛠️ Local Dev \u0026 Scripts\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003eDocker Compose for local end-to-end testing\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🧪 Testing\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://xunit.net/\"\u003exUnit\u003c/a\u003e (backend)\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e🔄 CI/CD\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://github.com/features/actions\"\u003eGitHub Actions\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003eFly.io automatic deploy\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e📈 Monitoring\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://azure.microsoft.com/en-us/services/monitor/\"\u003eAzure Application Insights\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cbr /\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n      \u003ca href=\"https://dotnet.microsoft.com/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/.NET-6.0-512BD4?style=flat\u0026logo=.net\u0026logoColor=white\" alt=\".NET\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://reactjs.org/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/React-19.1.0-61DAFB?style=flat\u0026logo=react\u0026logoColor=black\" alt=\"React\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://vitejs.dev/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Vite-4.4.1-646CFF?style=flat\u0026logo=vite\u0026logoColor=white\" alt=\"Vite\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://tailwindcss.com/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=flat\u0026logo=tailwind-css\u0026logoColor=white\" alt=\"Tailwind CSS\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://azure.microsoft.com/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Azure-0089D6?style=flat\u0026logo=microsoft-azure\u0026logoColor=white\" alt=\"Azure\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://www.docker.com/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Docker-20.10.0-2496ED?style=flat\u0026logo=docker\u0026logoColor=white\" alt=\"Docker\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://fly.io/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Fly.io-222222?style=flat\u0026logo=fly-io\u0026logoColor=white\" alt=\"Fly.io\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://nginx.org/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Nginx-009639?style=flat\u0026logo=nginx\u0026logoColor=white\" alt=\"Nginx\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://www.microsoft.com/en-us/sql-server\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/SQL_Server-CC2927?style=flat\u0026logo=microsoft-sql-server\u0026logoColor=white\" alt=\"SQL Server\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://www.npmjs.com/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/npm-latest-CB3837?style=flat\u0026logo=npm\u0026logoColor=white\" alt=\"npm\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://github.com/features/actions\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/GitHub_Actions-2088FF?style=flat\u0026logo=github-actions\u0026logoColor=white\" alt=\"GitHub Actions\" /\u003e\n      \u003c/a\u003e\n      \u003ca href=\"https://swagger.io/\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Swagger-OpenAPI-85EA2D?style=flat\u0026logo=swagger\u0026logoColor=white\" alt=\"Swagger\" /\u003e\n      \u003c/a\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\n\n\n\u003ca id=\"architecture\"\u003e\u003c/a\u003e\n## 🏛️ Architecture\n\n[![Architecture Diagram](/frontend/public/architecture.svg)](/frontend/public/architecture.svg)\n\n[View on Eraser![](https://app.eraser.io/workspace/1wX2yEL4ckFloMZ5chjD/preview?elements=22osCHEEW3uJF1qCVzKzKQ\u0026type=embed)](https://app.eraser.io/workspace/1wX2yEL4ckFloMZ5chjD?elements=22osCHEEW3uJF1qCVzKzKQ) \n\nMatchFlow is built on Clean Architecture principles, with clear separation of concerns across six horizontal layers. Requests flow from left to right (and back), while dependencies always point inward toward the core Domain layer. Below is a breakdown of each layer, the major components within it, and the primary data flows.\n\n### 🖥️ 1. Client Layer  \n- **Browser (React SPA)**  \n  - Contains ten page components:  \n    AuthPage, LandingPage, CreatePOPage, PurchaseOrdersPage, PurchaseOrderDetailsPage, DashboardPage, InvoicePage, AutoMatchPage, UploadInvoicePage, and UploadResultPage.  \n  - Sends and receives JWT-protected HTTPS calls to the Nginx proxy.\n\n### 🌐 2. Presentation Layer  \n- **Nginx Reverse Proxy** (Fly.io container “React+Nginx”)  \n  - Terminates TLS, serves the React bundle, and forwards API requests.  \n- **API Gateway** (.NET 6 Web API, Fly.io container “Backend”)  \n  - Hosts all controllers and orchestrates application logic.  \n- **Redirector** (Fly.io container)  \n  - Routes requests from `matchflow.app` → `www.matchflow.app`.\n\n### 🛡️ 3. Controller Layer  \n_All running inside the API Gateway container:_  \n- **AuthController** (handles login, JWT issuance \u0026 validation)  \n- **PurchaseOrderListController**  \n- **InvoiceListController**  \n- **InvoiceMatchController**  \n- **InvoiceUploadController**\n\n### 🧩 4. Application Layer  \n- **Services** (use-case implementations):  \n  - `CreatePurchaseOrderService`  \n  - `MatchingService`  \n  - `UploadInvoiceService`  \n  - `JWT Issuance \u0026 Validation` (via UserService)  \n- **Ports / Interfaces** (abstractions for infrastructure):  \n  - `IInvoiceRepository`, `IPurchaseOrderRepository`  \n  - `IFormRecognizer`, `IBlobStorage`  \n  - `IExceptionRecordRepository`, `IServiceBusClient`, `IUserService`  \n  - Dependencies are injected here, following the Dependency Inversion Principle.\n\n### 🛠️ 5. Infrastructure Layer  \n_Concrete implementations of all ports:_  \n- **EF Core Repositories**: `InvoiceRepository`, `PurchaseOrderRepository`, `ExceptionRecordRepository`, backed by `AppDbContext`  \n- **Azure Clients**: `BlobStorageService`, `FormRecognizerClient`, `ServiceBusClient`  \n- **UserService** (JWT key management \u0026 refresh logic)\n\n### 📦 6. Domain Layer  \n_Pure business entities with no external dependencies:_  \n- `Invoice`, `PurchaseOrder`, `InvoiceLineItem`, `PurchaseOrderLineItem`, `ExceptionRecord`, `User`  \n\n### ☁️ Cloud Services  \n- **Azure Blob Storage** (PDF persistence)  \n- **Azure Form Recognizer** (OCR)  \n- **Azure SQL Database** (POs, invoices, audit logs)  \n- **Azure Service Bus** (discrepancy messaging)  \n- **Application Insights** (telemetry \u0026 logging)\n\n### 🐳 Local Development  \n- **Docker Compose** spins up all containers (React+Nginx, API, SQL emulator, Blob emulator, etc.) for end-to-end testing without Azure.\n\n---\n\n### 🔄 Primary Data Flows\n\n1. **User Upload**  \n   Browser → Nginx (HTTPS + JWT) → API Gateway  \n2. **Invoice Processing**  \n   `UploadInvoiceController` → UploadInvoiceService  \n   → BlobStorageService → Azure Blob (POST PDF)  \n   → FormRecognizerClient → Azure Form Recognizer (extract JSON)  \n3. **Matching Logic**  \n   `UploadInvoiceService` → MatchingService → EF Repositories → Azure SQL  \n4. **Discrepancy Handling**  \n   On mismatch, UploadInvoiceService → ServiceBusClient → Azure Service Bus  \n   Front-end polls/subscribes for results  \n5. **Telemetry**  \n   All API calls and repository operations log to Application Insights  \n\n---\n\nBy following Clean Architecture, MatchFlow achieves high testability, clear module boundaries, and the ability to swap out or mock any external dependency (databases, cloud services, UI) without impacting the business core.\n\n## 📸 Screenshots\n### 🔒 Authentication\n\n![Authentication Flow](/frontend/public/authentication.gif)  \n*Figure 1: User logs in by entering username \u0026 password, then is taken to the main dashboard.*\n\nA simple, secure login step that grants access to the rest of the MatchFlow app.\n\n\n### 📊 Dashboard Overview\n\n![Dashboard](/frontend/public/dashboard.png)  \n*Figure 2: Central dashboard where you can:*\n1. Create a new Purchase Order  \n2. Upload invoices  \n3. Run Auto-Match and see results  \n4. Quickly view all invoices and POs in one place\n\nA single screen to kick off every step of your MatchFlow workflow.  \n\n### 🛒 Create \u0026 View Purchase Order\n\n![Create Purchase Order Flow](/frontend/public/purchase_order.gif)  \n*Figure 3: Fill out the PO form, submit it, and immediately land on the detailed Purchase Order page.*  \n\nA quick, end-to-end demo of creating a PO and reviewing its details in one seamless flow.  \n\n### 🧾 Sample Invoice\n\n![Sample Invoice](/frontend/public/sample_invoice.png)  \n*Figure 4: Cropped PDF showing invoice number, date, line items and totals used in our demo (all data is fictitious).*\n\n### 📥 Upload Invoice \u0026 Ready to Match\n\n![Upload Invoice Flow](/frontend/public/upload_invoice.gif)  \n*Figure 5: Upload your invoice PDF and instantly see its extracted details labeled “Ready to Match.”*\n\nNow you’re all set to run the auto-match and reconcile against your purchase orders.  \n\n### ✅ Auto-Match Results\n\n![Auto-Match Flow](/frontend/public/invoice_matching.gif)  \n*Figure 6: The Auto-Match engine processes your invoice and then confirms a 100% match—every line item and the total perfectly aligned with your Purchase Order.*  \n\nInstant peace of mind knowing your invoice is exactly what you ordered.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatpham0412%2Finvoice-processor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatpham0412%2Finvoice-processor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatpham0412%2Finvoice-processor/lists"}