From 26dbde5bd31735275ed58cf0583af170e2a8bd8e Mon Sep 17 00:00:00 2001 From: Bryce Date: Sat, 7 Feb 2026 14:53:08 -0800 Subject: [PATCH] Add invoice-template-creator skill for automated template generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New repository-based skill at .claude/skills/invoice-template-creator/: - SKILL.md: Complete guide for creating invoice parsing templates - references/examples.md: Common patterns and template examples - Covers vendor identification, regex patterns, field extraction - Includes testing strategies and common pitfalls Updated AGENTS.md with reference to the new skill. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../skills/invoice-template-creator/SKILL.md | 201 ++++++++++++++++++ .../references/examples.md | 188 ++++++++++++++++ dev-resources/13595522.pdf | Bin 0 -> 32817 bytes 3 files changed, 389 insertions(+) create mode 100644 .claude/skills/invoice-template-creator/SKILL.md create mode 100644 .claude/skills/invoice-template-creator/references/examples.md create mode 100644 dev-resources/13595522.pdf diff --git a/.claude/skills/invoice-template-creator/SKILL.md b/.claude/skills/invoice-template-creator/SKILL.md new file mode 100644 index 00000000..2afd24a0 --- /dev/null +++ b/.claude/skills/invoice-template-creator/SKILL.md @@ -0,0 +1,201 @@ +--- +name: invoice-template-creator +description: This skill creates PDF invoice parsing templates for the Integreat system. It should be used when adding support for a new vendor invoice format that needs to be automatically parsed. +license: Complete terms in LICENSE.txt +--- + +# Invoice Template Creator + +This skill automates the creation of invoice parsing templates for the Integreat system. It generates both the template definition and a corresponding test file based on a sample PDF invoice. + +## When to Use This Skill + +Use this skill when you need to add support for a new vendor invoice format that cannot be parsed by existing templates. This typically happens when: + +- A new vendor sends invoices in a unique format +- An existing vendor changes their invoice layout +- You encounter an invoice that fails to parse with current templates + +## Prerequisites + +Before using this skill, ensure you have: + +1. A sample PDF invoice file placed in `dev-resources/` directory +2. Identified the vendor name +3. Identified unique text patterns in the invoice (phone numbers, addresses, etc.) that can distinguish this vendor +4. Know the expected values for key fields (invoice number, date, customer name, total) + +## Usage Workflow + +### Step 1: Analyze the PDF + +First, extract and analyze the PDF text to understand its structure: + +```bash +pdftotext -layout "dev-resources/FILENAME.pdf" - +``` + +Look for: +- **Vendor identifiers**: Phone numbers, addresses, or unique text that identifies this vendor +- **Field patterns**: How invoice number, date, customer name, and total appear in the text +- **Layout quirks**: Multi-line fields, special formatting, or unusual spacing + +### Step 2: Define Expected Values + +Document the expected values for each field: + +| Field | Expected Value | Notes | +|-------|---------------|-------| +| Vendor Name | "Vendor Name" | Company name as it should appear | +| Invoice Number | "12345" | The invoice identifier | +| Date | "01/15/26" | Format found in PDF | +| Customer Name | "Customer Name" | As it appears on invoice | +| Customer Address | "123 Main St" | Street address if available | +| Total | "100.00" | Amount | + +### Step 3: Create the Template and Test + +The skill will: + +1. **Create a test file** at `test/clj/auto_ap/parse/templates_test.clj` (or add to existing) + - Test parses the PDF file + - Verifies all expected values are extracted correctly + - Follows existing test patterns + +2. **Add template to** `src/clj/auto_ap/parse/templates.clj` + - Adds entry to `pdf-templates` vector + - Includes: + - `:vendor` - Vendor name + - `:keywords` - Regex patterns to identify this vendor (must match all) + - `:extract` - Regex patterns for each field + - `:parser` - Optional date/number parsers + +### Step 4: Iterative Refinement + +Run the test to see if it passes: + +```bash +lein test auto-ap.parse.templates-test +``` + +If it fails, examine the debug output and refine the regex patterns. Common issues: + +- **Template doesn't match**: Keywords don't actually appear in the PDF text +- **Field is nil**: Regex capture group doesn't match the actual text format +- **Wrong value captured**: Regex is too greedy or matches wrong text + +## Template Structure Reference + +### Basic Template Format + +```clojure +{:vendor "Vendor Name" + :keywords [#"unique-pattern-1" #"unique-pattern-2"] + :extract {:invoice-number #"Invoice\s+#\s+(\d+)" + :date #"Date:\s+(\d{2}/\d{2}/\d{2})" + :customer-identifier #"Bill To:\s+([A-Za-z\s]+)" + :total #"Total:\s+\$([\d,]+\.\d{2})"} + :parser {:date [:clj-time "MM/dd/yy"] + :total [:trim-commas nil]}} +``` + +### Field Extraction Patterns + +**Invoice Number:** +- Look for: `"Invoice #12345"` or `"INV: 12345"` +- Pattern: `#"Invoice\s*#?\s*(\d+)"` or `#"INV:\s*(\d+)"` + +**Date:** +- Common formats: `"01/15/26"`, `"Jan 15, 2026"`, `"2026-01-15"` +- Pattern: `#"(\d{2}/\d{2}/\d{2})"` for MM/dd/yy +- Parser: `:date [:clj-time "MM/dd/yy"]` + +**Customer Identifier:** +- Look for: `"Bill To: Customer Name"` or `"Sold To: Customer Name"` +- Pattern: `#"Bill To:\s+([A-Za-z\s]+?)(?=\s{2,}|\n)"` +- Use non-greedy `+?` and lookahead `(?=...)` to stop at boundaries + +**Total:** +- Look for: `"Total: $100.00"` or `"Amount Due: 100.00"` +- Pattern: `#"Total:\s+\$?([\d,]+\.\d{2})"` +- Parser: `:total [:trim-commas nil]` removes commas + +### Advanced Patterns + +**Multi-line customer address:** +When customer info spans multiple lines (name + address): + +```clojure +:customer-identifier #"(?s)I\s+([A-Z][A-Z\s]+?)\s{2,}.*?L\s+([0-9][A-Z0-9\s]+?)(?=\s{2,}|\n)" +:account-number #"(?s)L\s+([0-9][A-Z0-9\s]+?)(?=\s{2,}|\n)" +``` + +The `(?s)` flag makes `.` match newlines. Use non-greedy `+?` and lookaheads `(?=...)` to capture clean values. + +**Multiple date formats:** + +```clojure +:parser {:date [:clj-time ["MM/dd/yy" "yyyy-MM-dd"]]} +``` + +**Credit memos (negative amounts):** + +```clojure +:parser {:total [:trim-commas-and-negate nil]} +``` + +## Testing Best Practices + +1. **Start with a failing test** - Define expected values before implementing +2. **Test actual PDF parsing** - Use `parse-file` or `parse` with real PDF text +3. **Verify each field individually** - Separate assertions for clarity +4. **Handle date comparisons carefully** - Compare year/month/day separately if needed +5. **Use `str/trim`** - Account for extra whitespace in extracted values + +## Example Test Structure + +```clojure +(deftest parse-vendor-invoice-12345 + (testing "Should parse Vendor invoice with expected values" + (let [results (sut/parse-file (io/file "dev-resources/INVOICE.pdf") + "INVOICE.pdf") + result (first results)] + (is (some? results) "Should return results") + (is (some? result) "Template should match") + (when result + (is (= "Vendor Name" (:vendor-code result))) + (is (= "12345" (:invoice-number result))) + (is (= "Customer Name" (:customer-identifier result))) + (is (= "100.00" (:total result))))))) +``` + +## Common Pitfalls + +1. **Keywords must all match** - Every pattern in `:keywords` must be found in the PDF +2. **Capture groups required** - Regexes need `()` to extract values +3. **PDF text != visual text** - Layout may differ from what you see visually +4. **Greedy quantifiers** - Use `+?` instead of `+` to avoid over-matching +5. **Case sensitivity** - Regex is case-sensitive unless you use `(?i)` flag + +## Post-Creation Checklist + +After creating the template: + +- [ ] Test passes: `lein test auto-ap.parse.templates-test` +- [ ] Format is correct: `lein cljfmt check` +- [ ] Code compiles: `lein check` +- [ ] Template is in correct position in `pdf-templates` vector +- [ ] Keywords uniquely identify this vendor (won't match other templates) +- [ ] Test file follows naming conventions + +## Integration with Workflow + +This skill is typically used as part of a larger workflow: + +1. User provides PDF and requirements +2. This skill creates template and test +3. User reviews and refines if needed +4. Test is run to verify extraction +5. Code is committed + +The skill ensures consistency with existing patterns and reduces manual boilerplate when adding new vendor support. diff --git a/.claude/skills/invoice-template-creator/references/examples.md b/.claude/skills/invoice-template-creator/references/examples.md new file mode 100644 index 00000000..954b60ed --- /dev/null +++ b/.claude/skills/invoice-template-creator/references/examples.md @@ -0,0 +1,188 @@ +# Invoice Template Examples + +## Simple Single Invoice + +```clojure +{:vendor "Gstar Seafood" + :keywords [#"G Star Seafood"] + :extract {:total #"Total\s{2,}([\d\-,]+\.\d{2,2}+)" + :customer-identifier #"(.*?)(?:\s+)Invoice #" + :date #"Invoice Date\s{2,}([0-9]+/[0-9]+/[0-9]+)" + :invoice-number #"Invoice #\s+(\d+)"} + :parser {:date [:clj-time "MM/dd/yyyy"] + :total [:trim-commas nil]}} +``` + +## Multi-Invoice Statement + +```clojure +{:vendor "Southbay Fresh Produce" + :keywords [#"(SOUTH BAY FRESH PRODUCE|SOUTH BAY PRODUCE)"] + :extract {:date #"^([0-9]+/[0-9]+/[0-9]+)" + :customer-identifier #"To:[^\n]*\n\s+([A-Za-z' ]+)\s{2}" + :invoice-number #"INV #\/(\d+)" + :total #"\$([0-9.]+)\."} + :parser {:date [:clj-time "MM/dd/yyyy"]} + :multi #"\n" + :multi-match? #"^[0-9]+/[0-9]+/[0-9]+\s+INV "} +``` + +## Customer with Address (Multi-line) + +```clojure +{:vendor "Bonanza Produce" + :keywords [#"530-544-4136"] + :extract {:invoice-number #"NO\s+(\d{8,})\s+\d{2}/\d{2}/\d{2}" + :date #"NO\s+\d{8,}\s+(\d{2}/\d{2}/\d{2})" + :customer-identifier #"(?s)I\s+([A-Z][A-Z\s]+?)\s{2,}.*?L\s+([0-9][A-Z0-9\s]+?)(?=\s{2,}|\n)" + :account-number #"(?s)L\s+([0-9][A-Z0-9\s]+?)(?=\s{2,}|\n)" + :total #"SHIPPED\s+[\d\.]+\s+TOTAL\s+([\d\.]+)"} + :parser {:date [:clj-time "MM/dd/yy"] + :total [:trim-commas nil]}} +``` + +## Credit Memo (Negative Amounts) + +```clojure +{:vendor "General Produce Company" + :keywords [#"916-552-6495"] + :extract {:date #"DATE.*\n.*\n.*?([0-9]+/[0-9]+/[0-9]+)" + :invoice-number #"CREDIT NO.*\n.*\n.*?(\d{5,}?)\s+" + :account-number #"CUST NO.*\n.*\n\s+(\d+)" + :total #"TOTAL:\s+\|\s*(.*)"} + :parser {:date [:clj-time "MM/dd/yy"] + :total [:trim-commas-and-negate nil]}} +``` + +## Complex Date Parsing + +```clojure +{:vendor "Ben E. Keith" + :keywords [#"BEN E. KEITH"] + :extract {:date #"Customer No Mo Day Yr.*?\n.*?\d{5,}\s{2,}(\d+\s+\d+\s+\d+)" + :customer-identifier #"Customer No Mo Day Yr.*?\n.*?(\d{5,})" + :invoice-number #"Invoice No.*?\n.*?(\d{8,})" + :total #"Total Invoice.*?\n.*?([\-]?[0-9]+\.[0-9]{2,})"} + :parser {:date [:month-day-year nil] + :total [:trim-commas-and-negate nil]}} +``` + +## Multiple Date Formats + +```clojure +{:vendor "RNDC" + :keywords [#"P.O.Box 743564"] + :extract {:date #"(?:INVOICE|CREDIT) DATE\n(?:.*?)(\S+)\n" + :account-number #"Store Number:\s+(\d+)" + :invoice-number #"(?:INVOICE|CREDIT) DATE\n(?:.*?)\s{2,}(\d+?)\s+\S+\n" + :total #"Net Amount(?:.*\n){4}(?:.*?)([\-]?[0-9\.]+)\n"} + :parser {:date [:clj-time ["MM/dd/yy" "dd-MMM-yy"]] + :total [:trim-commas-and-negate nil]}} +``` + +## Common Regex Patterns + +### Phone Numbers +```clojure +#"\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}" +``` + +### Dollar Amounts +```clojure +#"\$?([0-9,]+\.[0-9]{2})" +``` + +### Dates (MM/dd/yy) +```clojure +#"([0-9]{2}/[0-9]{2}/[0-9]{2})" +``` + +### Dates (MM/dd/yyyy) +```clojure +#"([0-9]{2}/[0-9]{2}/[0-9]{4})" +``` + +### Multi-line Text (dotall mode) +```clojure +#"(?s)start.*?end" +``` + +### Non-greedy Match +```clojure +#"(pattern.+?)" +``` + +### Lookahead Boundary +```clojure +#"value(?=\s{2,}|\n)" +``` + +## Field Extraction Strategies + +### 1. Simple Line-based +Use `[^\n]*` to match until end of line: +```clojure +#"Invoice:\s+([^\n]+)" +``` + +### 2. Whitespace Boundary +Use `(?=\s{2,}|\n)` to stop at multiple spaces or newline: +```clojure +#"Customer:\s+(.+?)(?=\s{2,}|\n)" +``` + +### 3. Specific Marker +Match until a specific pattern is found: +```clojure +#"(?s)Start(.*?)End" +``` + +### 4. Multi-part Extraction +Use multiple capture groups for related fields: +```clojure +#"Date:\s+(\d{2})/(\d{2})/(\d{2})" +``` + +## Parser Options + +### Date Parsers +- `[:clj-time "MM/dd/yyyy"]` - Standard US date +- `[:clj-time "MM/dd/yy"]` - 2-digit year +- `[:clj-time "MMM dd, yyyy"]` - Named month +- `[:clj-time ["MM/dd/yy" "yyyy-MM-dd"]]` - Multiple formats +- `[:month-day-year nil]` - Space-separated (1 15 26) + +### Number Parsers +- `[:trim-commas nil]` - Remove commas from numbers +- `[:trim-commas-and-negate nil]` - Handle negative/credit amounts +- `[:trim-commas-and-remove-dollars nil]` - Remove $ and commas +- `nil` - No parsing, return raw string + +## Testing Patterns + +### Basic Test Structure +```clojure +(deftest parse-vendor-invoice + (testing "Should parse vendor invoice" + (let [results (sut/parse-file (io/file "dev-resources/INVOICE.pdf") + "INVOICE.pdf") + result (first results)] + (is (some? result)) + (is (= "Vendor" (:vendor-code result))) + (is (= "12345" (:invoice-number result)))))) +``` + +### Date Testing +```clojure +(let [d (:date result)] + (is (= 2026 (time/year d))) + (is (= 1 (time/month d))) + (is (= 15 (time/day d)))) +``` + +### Multi-field Verification +```clojure +(is (= "Expected Name" (:customer-identifier result))) +(is (= "Expected Street" (str/trim (:account-number result)))) +(is (= "Expected City, ST 12345" (str/trim (:location result)))) +``` diff --git a/dev-resources/13595522.pdf b/dev-resources/13595522.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f4845a009c21fccf62531abbcfc3cabf1dc12a4 GIT binary patch literal 32817 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 literal 0 HcmV?d00001