From 53aa0b75254b607595ac2c9a5453c2a39f7f24d0 Mon Sep 17 00:00:00 2001 From: Adam Moussa <166072409+amoussa1229@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:07:17 -0400 Subject: [PATCH] =?UTF-8?q?Initial=20commit=20=E2=80=94=20Stampli=20Bulk?= =?UTF-8?q?=20Editor=20v1.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mac GUI app (tkinter + Playwright) for bulk-editing invoice pay dates on Stampli's Select to Pay dashboard. Features: - Scan MUI DataGrid rows via virtual scroll - Auto-calculate pay dates (due - 5 days, business day adjusted) - Bulk edit pay date cells via calendar input - Filter to error-free invoices, select all, submit for payment - Scan Pending Approval tab to verify edits - PyInstaller .app bundle with custom icon --- .gitignore | 23 +++ app_icon.icns | Bin 0 -> 152048 bytes app_icon.png | Bin 0 -> 14841 bytes edit_pay_dates.py | 157 ++++++++++++++ generate_icon.py | 147 +++++++++++++ scan_pending.py | 72 +++++++ stampli_core.py | 516 ++++++++++++++++++++++++++++++++++++++++++++++ stampli_gui.py | 403 ++++++++++++++++++++++++++++++++++++ stampli_gui.spec | 74 +++++++ 9 files changed, 1392 insertions(+) create mode 100644 .gitignore create mode 100644 app_icon.icns create mode 100644 app_icon.png create mode 100644 edit_pay_dates.py create mode 100644 generate_icon.py create mode 100644 scan_pending.py create mode 100644 stampli_core.py create mode 100644 stampli_gui.py create mode 100644 stampli_gui.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb47b16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +venv/ +__pycache__/ +*.pyc +build/ +dist/ +*.spec.bak +browser_data/ +gui_error.log + +# HTML snapshots from debugging +*_snapshot.html +page_snapshot.html + +# Screenshots +*.png +!app_icon.png + +# macOS +.DS_Store + +# Old manual app bundle and command launcher (replaced by PyInstaller) +Stampli Bulk Editor.app/ +Stampli Bulk Editor.command diff --git a/app_icon.icns b/app_icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..fcbfc93341b174ff72fa4215ff976b75fcdce10e GIT binary patch literal 152048 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 K{dMs7@Bag>uv$L= literal 0 HcmV?d00001 diff --git a/app_icon.png b/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e23a2954fe3c7e4a2b16577d7c517f0996447f83 GIT binary patch literal 14841 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 ").strip().lower() + page = active_page(browser) + try: + if cmd == "snap": + html = page.content() + snap_path = Path(__file__).parent / "page_snapshot.html" + with open(snap_path, "w") as f: + f.write(html) + print(f"Saved page HTML to {snap_path}") + elif cmd == "scan": + rows = page.query_selector_all(ROW_SELECTOR) + print(f"Found {len(rows)} rendered rows (virtual scroll)") + for i, row in enumerate(rows[:10]): + due_cell = row.query_selector(EDIT_COLUMNS["due"]) + pay_cell = row.query_selector(EDIT_COLUMNS["pay"]) + due_text = due_cell.inner_text().strip().split("\n")[0] if due_cell else "?" + pay_text = pay_cell.inner_text().strip().split("\n")[0] if pay_cell else "?" + vendor_cell = row.query_selector(EDIT_COLUMNS["vendor"]) + vendor = vendor_cell.inner_text().strip()[:30] if vendor_cell else "?" + inv_cell = row.query_selector(EDIT_COLUMNS["invoice"]) + inv = inv_cell.inner_text().strip()[:20] if inv_cell else "?" + print(f" Row {i}: inv={inv} vendor={vendor} due={due_text} pay={pay_text}") + elif cmd == "columns": + headers = page.query_selector_all("[role='columnheader']") + for i, h in enumerate(headers): + field = h.get_attribute("data-field") or "" + text = h.inner_text().strip().replace("\n", " ")[:40] + print(f" Col {i}: field={field:30s} label='{text}'") + elif cmd in ("done", "quit", "exit", ""): + break + else: + print("Commands: snap, scan, columns, done") + except Exception as e: + print(f"Error (page may have changed): {e}") + + +def bulk_edit(page, config, dry_run=False): + date_fmt = config["date_format"] + days_before = config["days_before_due"] + + print("\nScanning all rows (scrolling through virtual grid)...") + all_rows = collect_edit_rows(page, on_progress=lambda n: None) + print(f"Found {len(all_rows)} total rows") + + changes = compute_changes(all_rows, date_fmt, days_before) + + if not changes: + print("\nAll rows already have correct pay dates. Nothing to do.") + return + + print(f"\n{'DRY RUN: ' if dry_run else ''}{len(changes)} rows to update:\n") + print(f" {'Invoice':<20s} {'Vendor':<30s} {'Due':<12s} {'Current Pay':<16s} {'New Pay':<12s}") + print(f" {'-'*20} {'-'*30} {'-'*12} {'-'*16} {'-'*12}") + for c in changes: + print(f" {c['invoice']:<20s} {c['vendor']:<30s} {c['due_text']:<12s} " + f"{c['pay_text'] or '(empty)':<16s} {c['new_pay']:<12s}") + + if dry_run: + return + + confirm = input(f"\nProceed with {len(changes)} updates? [y/N]: ").strip().lower() + if confirm != "y": + print("Aborted.") + return + + def on_progress(i, total, inv, ok, info=""): + if i == -1: + prefix = " RETRY" + else: + prefix = f" [{i}/{total}]" + status = "Updated" if ok else "MISSED" + print(f"{prefix} {status} {inv} {info}") + + success, failed = apply_edits(page, changes, on_progress=on_progress) + print(f"\nDone: {success}/{len(changes)} rows updated.") + + if success > 0: + submit = input("\nFilter to error-free rows, select all, and click Pay Invoices? [y/N]: ").strip().lower() + if submit == "y": + filter_select_and_pay(page, on_status=print) + + +def main(): + parser = argparse.ArgumentParser(description="Stampli Bulk Pay Date Editor") + parser.add_argument("--inspect", action="store_true") + parser.add_argument("--dry-run", action="store_true") + parser.add_argument("--filter-only", action="store_true") + parser.add_argument("--url", type=str) + args = parser.parse_args() + + config = load_config() + url = args.url or config["stampli_url"] + + with sync_playwright() as p: + browser = launch_browser(p) + navigate(browser, url) + + import time + time.sleep(3) + page = active_page(browser) + if needs_login(page): + if not wait_for_login(browser, on_status=print): + browser.close() + return + + print("Waiting for page to settle...") + time.sleep(3) + + if args.inspect: + inspect_mode(browser) + elif args.filter_only: + page = active_page(browser) + filter_select_and_pay(page, on_status=print) + else: + page = active_page(browser) + bulk_edit(page, config, dry_run=args.dry_run) + + input("\nPress Enter to close the browser...") + browser.close() + + +if __name__ == "__main__": + main() diff --git a/generate_icon.py b/generate_icon.py new file mode 100644 index 0000000..be1a698 --- /dev/null +++ b/generate_icon.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +"""Generate a macOS .icns app icon for Stampli Bulk Editor.""" + +import os +import subprocess +import tempfile +from pathlib import Path +from PIL import Image, ImageDraw, ImageFont + +SIZE = 1024 + +def draw_icon(size=SIZE): + img = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + draw = ImageDraw.Draw(img) + s = size / 1024 # scale factor + + # Rounded-rect background — deep navy blue + bg_color = (22, 37, 67) + margin = int(80 * s) + radius = int(180 * s) + draw.rounded_rectangle( + [margin, margin, size - margin, size - margin], + radius=radius, + fill=bg_color, + ) + + # Document shape — white, slightly offset right + doc_left = int(280 * s) + doc_top = int(180 * s) + doc_right = int(750 * s) + doc_bottom = int(820 * s) + doc_radius = int(30 * s) + draw.rounded_rectangle( + [doc_left, doc_top, doc_right, doc_bottom], + radius=doc_radius, + fill=(255, 255, 255), + ) + + # Dog-ear fold on top-right corner of document + fold_size = int(90 * s) + fold_points = [ + (doc_right - fold_size, doc_top), + (doc_right, doc_top + fold_size), + (doc_right, doc_top), + ] + draw.polygon(fold_points, fill=bg_color) + fold_triangle = [ + (doc_right - fold_size, doc_top), + (doc_right - fold_size, doc_top + fold_size), + (doc_right, doc_top + fold_size), + ] + draw.polygon(fold_triangle, fill=(200, 210, 225)) + + # Horizontal lines on document (invoice lines) + line_color = (180, 195, 215) + line_h = int(12 * s) + line_left = int(330 * s) + line_right_short = int(580 * s) + line_right_long = int(700 * s) + y_positions = [340, 400, 460, 520, 580] + for i, y in enumerate(y_positions): + y_scaled = int(y * s) + right = line_right_short if i % 2 else line_right_long + draw.rounded_rectangle( + [line_left, y_scaled, right, y_scaled + line_h], + radius=int(6 * s), + fill=line_color, + ) + + # Dollar sign — accent color (Stampli teal/green) + accent = (0, 191, 165) + dollar_x = int(380 * s) + dollar_y = int(660 * s) + dollar_size = int(110 * s) + draw.ellipse( + [dollar_x - dollar_size, dollar_y - dollar_size, + dollar_x + dollar_size, dollar_y + dollar_size], + fill=accent, + ) + try: + font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", int(130 * s)) + except (OSError, IOError): + font = ImageFont.load_default() + draw.text((dollar_x, dollar_y), "$", fill="white", font=font, anchor="mm") + + # Checkmark badge — bottom-right + badge_cx = int(680 * s) + badge_cy = int(750 * s) + badge_r = int(85 * s) + draw.ellipse( + [badge_cx - badge_r, badge_cy - badge_r, + badge_cx + badge_r, badge_cy + badge_r], + fill=(46, 204, 113), + outline=bg_color, + width=int(12 * s), + ) + check_points = [ + (int(640 * s), int(750 * s)), + (int(670 * s), int(785 * s)), + (int(730 * s), int(715 * s)), + ] + draw.line(check_points, fill="white", width=int(18 * s), joint="curve") + + # Small pencil icon — top-left area, representing "edit" + pencil_color = (255, 193, 7) + px, py = int(220 * s), int(280 * s) + pencil_body = [ + (px, py + int(60 * s)), + (px + int(15 * s), py - int(30 * s)), + (px + int(45 * s), py - int(20 * s)), + (px + int(30 * s), py + int(70 * s)), + ] + draw.polygon(pencil_body, fill=pencil_color) + pencil_tip = [ + (px, py + int(60 * s)), + (px + int(30 * s), py + int(70 * s)), + (px + int(10 * s), py + int(90 * s)), + ] + draw.polygon(pencil_tip, fill=(60, 60, 60)) + + return img + + +def make_icns(img, output_path): + """Create .icns from a PIL Image using macOS iconutil.""" + with tempfile.TemporaryDirectory() as tmpdir: + iconset = os.path.join(tmpdir, "icon.iconset") + os.makedirs(iconset) + sizes = [16, 32, 64, 128, 256, 512, 1024] + for sz in sizes: + resized = img.resize((sz, sz), Image.LANCZOS) + resized.save(os.path.join(iconset, f"icon_{sz}x{sz}.png")) + if sz <= 512: + double = img.resize((sz * 2, sz * 2), Image.LANCZOS) + double.save(os.path.join(iconset, f"icon_{sz}x{sz}@2x.png")) + subprocess.run(["iconutil", "-c", "icns", iconset, "-o", output_path], check=True) + + +if __name__ == "__main__": + project = Path(__file__).parent + icon_img = draw_icon() + png_path = project / "app_icon.png" + icon_img.save(str(png_path)) + print(f"Saved PNG: {png_path}") + icns_path = project / "app_icon.icns" + make_icns(icon_img, str(icns_path)) + print(f"Saved ICNS: {icns_path}") diff --git a/scan_pending.py b/scan_pending.py new file mode 100644 index 0000000..7fab874 --- /dev/null +++ b/scan_pending.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +Scan the Stampli "Pending Approval" tab and report rows with incorrect pay dates. + +Usage: + python scan_pending.py + python scan_pending.py --snap +""" + +import argparse +import time +from pathlib import Path +from playwright.sync_api import sync_playwright + +from stampli_core import ( + launch_browser, navigate, active_page, wait_for_login, needs_login, + collect_scan_rows, compute_scan_results, PENDING_APPROVAL_URL, DATE_FMT, +) + + +def main(): + parser = argparse.ArgumentParser(description="Scan Stampli Pending Approval") + parser.add_argument("--snap", action="store_true") + args = parser.parse_args() + + with sync_playwright() as p: + browser = launch_browser(p) + navigate(browser, PENDING_APPROVAL_URL) + + time.sleep(3) + page = active_page(browser) + if needs_login(page): + if not wait_for_login(browser, on_status=print): + browser.close() + return + + page = active_page(browser) + print("Waiting for page to settle...") + time.sleep(3) + + if args.snap: + html = page.content() + snap_path = Path(__file__).parent / "pending_snapshot.html" + with open(snap_path, "w") as f: + f.write(html) + print(f"Saved snapshot to {snap_path}") + + print("\nScanning Pending Approval rows...\n") + all_rows = collect_scan_rows(page) + print(f"Found {len(all_rows)} rows\n") + + results, incorrect = compute_scan_results(all_rows) + + print(f" {'Invoice':<20s} {'Vendor':<35s} {'Due':<12s} {'Pay Date':<12s} {'Expected':<12s} {'Status'}") + print(f" {'-'*20} {'-'*35} {'-'*12} {'-'*12} {'-'*12} {'-'*8}") + for r in results: + print(f" {r['invoicesNumbers']:<20s} {r['vendorName'][:35]:<35s} " + f"{r['dueDate']:<12s} {r['sendPaymentOn']:<12s} {r['expected']:<12s} {r['status']}") + + print(f"\n{len(incorrect)} rows with incorrect pay dates out of {len(all_rows)} total.") + if incorrect: + print(f"\nIncorrect rows:") + for r in incorrect: + print(f" {r['invoicesNumbers']:<20s} {r['vendorName'][:35]:<35s} " + f"pay={r['sendPaymentOn']} (due={r['dueDate']})") + + input("\nPress Enter to close the browser...") + browser.close() + + +if __name__ == "__main__": + main() diff --git a/stampli_core.py b/stampli_core.py new file mode 100644 index 0000000..df738f1 --- /dev/null +++ b/stampli_core.py @@ -0,0 +1,516 @@ +"""Shared logic for Stampli bulk editor — used by both CLI scripts and the GUI.""" + +import json +import time +from datetime import datetime, timedelta +from pathlib import Path +from playwright.sync_api import sync_playwright + +PROJECT_DIR = Path(__file__).parent +_APP_SUPPORT = Path.home() / "Library" / "Application Support" / "Stampli Bulk Editor" +_APP_SUPPORT.mkdir(parents=True, exist_ok=True) +CONFIG_PATH = _APP_SUPPORT / "config.json" +BROWSER_DATA_DIR = _APP_SUPPORT / "browser_data" + +READY_TO_PAY_URL = "https://app.stampli.com/v265n2/dashboard.html#t=ready_to_pay" +PENDING_APPROVAL_URL = "https://app.stampli.com/v265n2/dashboard.html#t=payments_to_approve" + +DATE_FMT = "%m/%d/%Y" +DAYS_BEFORE_DUE = 5 + +ROW_SELECTOR = ".MuiDataGrid-virtualScrollerRenderZone div.MuiDataGrid-row" +SCROLLER_SELECTOR = ".MuiDataGrid-virtualScroller" + +EDIT_COLUMNS = { + "due": "div[data-field='dueDate']", + "pay": "div[data-field='invoiceRequestedDate']", + "vendor": "div[data-field='vendorName']", + "invoice": "div[data-field='invoiceNumber']", +} + +SCAN_COLUMNS = ["invoicesNumbers", "vendorName", "dueDate", "sendPaymentOn", + "paymentMethod", "amountDue", "amount"] + +DEFAULT_CONFIG = { + "stampli_url": READY_TO_PAY_URL, + "date_format": DATE_FMT, + "days_before_due": DAYS_BEFORE_DUE, +} + + +# --------------------------------------------------------------------------- +# Config +# --------------------------------------------------------------------------- + +def load_config(): + if CONFIG_PATH.exists(): + with open(CONFIG_PATH) as f: + saved = json.load(f) + return {**DEFAULT_CONFIG, **saved} + return dict(DEFAULT_CONFIG) + + +# --------------------------------------------------------------------------- +# Date helpers +# --------------------------------------------------------------------------- + +def next_business_day(d: datetime) -> datetime: + weekday = d.weekday() + if weekday == 5: + d += timedelta(days=2) + elif weekday == 6: + d += timedelta(days=1) + return d + + +def calc_pay_date(due_date: datetime, days_before: int = DAYS_BEFORE_DUE) -> datetime: + today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) + if (due_date - today).days <= 5: + return next_business_day(today + timedelta(days=2)) + return next_business_day(due_date - timedelta(days=days_before)) + + +# --------------------------------------------------------------------------- +# Browser helpers +# --------------------------------------------------------------------------- + +def launch_browser(pw): + return pw.chromium.launch_persistent_context( + user_data_dir=str(BROWSER_DATA_DIR), + headless=False, + viewport={"width": 1400, "height": 900}, + ) + + +def active_page(browser): + pages = browser.pages + return pages[-1] if pages else browser.new_page() + + +def navigate(browser, url): + page = browser.pages[0] if browser.pages else browser.new_page() + page.goto(url, wait_until="domcontentloaded") + return page + + +def wait_for_login(browser, timeout_minutes=5, on_status=None): + if on_status: + on_status("Waiting for login...") + deadline = time.time() + timeout_minutes * 60 + while time.time() < deadline: + for pg in browser.pages: + url = pg.url.lower() + if "login" not in url and "auth" not in url and "signin" not in url: + if "stampli.com" in url: + if on_status: + on_status("Login detected.") + return True + time.sleep(2) + if on_status: + on_status("Login timed out.") + return False + + +def needs_login(page): + url = page.url.lower() + return "login" in url or "auth" in url or "signin" in url + + +# --------------------------------------------------------------------------- +# Virtual-scroll grid scanning +# --------------------------------------------------------------------------- + +def collect_edit_rows(page, on_progress=None): + """Scan the Select to Pay grid. Returns list of dicts with row_id, invoice, vendor, due_text, pay_text.""" + scroller = page.query_selector(SCROLLER_SELECTOR) + if not scroller: + return [] + + seen_ids = set() + all_rows = [] + scroll_top = 0 + stale_count = 0 + + while True: + scroller.evaluate("(el, top) => el.scrollTop = top", scroll_top) + time.sleep(0.5) + + rows = page.query_selector_all(ROW_SELECTOR) + new_this_scroll = 0 + + for row in rows: + row_id = row.get_attribute("data-id") + if not row_id or row_id in seen_ids: + continue + seen_ids.add(row_id) + new_this_scroll += 1 + + due_cell = row.query_selector(EDIT_COLUMNS["due"]) + pay_cell = row.query_selector(EDIT_COLUMNS["pay"]) + vendor_cell = row.query_selector(EDIT_COLUMNS["vendor"]) + inv_cell = row.query_selector(EDIT_COLUMNS["invoice"]) + + all_rows.append({ + "row_id": row_id, + "invoice": inv_cell.inner_text().strip() if inv_cell else "", + "vendor": (vendor_cell.inner_text().strip()[:40] if vendor_cell else ""), + "due_text": (due_cell.inner_text().strip().split("\n")[0] if due_cell else ""), + "pay_text": (pay_cell.inner_text().strip().split("\n")[0] if pay_cell else ""), + }) + + if new_this_scroll == 0: + stale_count += 1 + if stale_count >= 3: + break + else: + stale_count = 0 + + if on_progress: + on_progress(len(all_rows)) + + scroll_top += 200 + + return all_rows + + +def collect_scan_rows(page, on_progress=None): + """Scan the Pending Approval grid. Returns list of dicts keyed by SCAN_COLUMNS.""" + scroller = page.query_selector(SCROLLER_SELECTOR) + if not scroller: + return [] + + seen_ids = set() + all_rows = [] + scroll_top = 0 + stale_count = 0 + + while True: + scroller.evaluate("(el, top) => el.scrollTop = top", scroll_top) + time.sleep(0.5) + + rows = page.query_selector_all(ROW_SELECTOR) + new_this_scroll = 0 + + for row in rows: + row_id = row.get_attribute("data-id") + if not row_id or row_id in seen_ids: + continue + seen_ids.add(row_id) + new_this_scroll += 1 + + fields = {} + for col in SCAN_COLUMNS: + cell = row.query_selector(f"div[data-field='{col}']") + fields[col] = cell.inner_text().strip().split("\n")[0] if cell else "" + all_rows.append(fields) + + if new_this_scroll == 0: + stale_count += 1 + if stale_count >= 3: + break + else: + stale_count = 0 + + if on_progress: + on_progress(len(all_rows)) + + scroll_top += 200 + + return all_rows + + +# --------------------------------------------------------------------------- +# Change computation +# --------------------------------------------------------------------------- + +def compute_changes(all_rows, date_fmt=DATE_FMT, days_before=DAYS_BEFORE_DUE): + """Pure function: given collected rows, return list of rows that need updating.""" + changes = [] + for row_data in all_rows: + due_text = row_data["due_text"] + pay_text = row_data["pay_text"] + if not due_text: + continue + try: + due_date = datetime.strptime(due_text, date_fmt) + except ValueError: + continue + new_pay_date = calc_pay_date(due_date, days_before) + new_pay_str = new_pay_date.strftime(date_fmt) + if pay_text == new_pay_str: + continue + changes.append({**row_data, "new_pay": new_pay_str}) + return changes + + +def compute_scan_results(all_rows, date_fmt=DATE_FMT, days_before=DAYS_BEFORE_DUE): + """Pure function: compare actual vs expected pay dates. Returns (results, incorrect).""" + results = [] + incorrect = [] + for r in all_rows: + due_text = r["dueDate"] + pay_text = r["sendPaymentOn"] + try: + due_dt = datetime.strptime(due_text, date_fmt) + expected = calc_pay_date(due_dt, days_before) + expected_str = expected.strftime(date_fmt) + except ValueError: + expected_str = "???" + ok = pay_text == expected_str + entry = {**r, "expected": expected_str, "status": "OK" if ok else "WRONG"} + results.append(entry) + if not ok: + incorrect.append(entry) + return results, incorrect + + +# --------------------------------------------------------------------------- +# Editing +# --------------------------------------------------------------------------- + +def find_row(page, scroller, row_id, start_scroll=0): + row = page.query_selector( + f".MuiDataGrid-virtualScrollerRenderZone div.MuiDataGrid-row[data-id='{row_id}']" + ) + if row: + return row, start_scroll + + scroll_top = 0 + max_scroll = scroller.evaluate("el => el.scrollHeight") + + while scroll_top <= max_scroll: + scroller.evaluate("(el, top) => el.scrollTop = top", scroll_top) + time.sleep(0.3) + row = page.query_selector( + f".MuiDataGrid-virtualScrollerRenderZone div.MuiDataGrid-row[data-id='{row_id}']" + ) + if row: + return row, scroll_top + scroll_top += 200 + + return None, scroll_top + + +def try_edit_cell(page, row, new_date_str): + pay_cell = row.query_selector(EDIT_COLUMNS["pay"]) + if not pay_cell: + return False + + calendar_icon = pay_cell.query_selector("i.fa-calendar, [data-test-id='test-icon-calendar']") + if calendar_icon: + calendar_icon.click() + else: + pay_cell.dblclick() + + time.sleep(0.5) + + date_input = page.query_selector( + ".MuiDataGrid-cell--editing input, " + ".react-datepicker input, " + "input[type='date'], " + "input.date-input, " + ".datepicker input, " + "input[placeholder*='date' i], " + "input[placeholder*='MM' i]" + ) + + if date_input: + date_input.fill("") + date_input.fill(new_date_str) + time.sleep(0.3) + date_input.press("Enter") + else: + page.keyboard.type(new_date_str) + page.keyboard.press("Enter") + + time.sleep(0.5) + + # Dismiss any date picker popup that may still be open + page.keyboard.press("Escape") + time.sleep(0.3) + + # Click away from the cell to deselect it + page.mouse.click(0, 0) + time.sleep(0.3) + + return True + + +def edit_single_row(page, row_id, new_date_str, last_scroll=0, max_attempts=3): + scroller = page.query_selector(SCROLLER_SELECTOR) + for attempt in range(max_attempts): + row, scroll_pos = find_row(page, scroller, row_id, start_scroll=last_scroll) + if not row: + if attempt < max_attempts - 1: + time.sleep(0.5) + continue + return False, scroll_pos + if try_edit_cell(page, row, new_date_str): + return True, scroll_pos + page.keyboard.press("Escape") + time.sleep(0.3) + return False, scroll_pos + + +def apply_edits(page, changes, on_progress=None): + """Edit rows and retry failures. Returns (success_count, failed_list).""" + success = 0 + failed = [] + last_scroll = 0 + + for i, c in enumerate(changes): + try: + ok, last_scroll = edit_single_row(page, c["row_id"], c["new_pay"], last_scroll) + if ok: + success += 1 + if on_progress: + on_progress(i + 1, len(changes), c["invoice"], True) + else: + failed.append(c) + if on_progress: + on_progress(i + 1, len(changes), c["invoice"], False) + except Exception as e: + failed.append(c) + if on_progress: + on_progress(i + 1, len(changes), c["invoice"], False, str(e)) + + if failed: + retry_failed = [] + for c in failed: + try: + ok, _ = edit_single_row(page, c["row_id"], c["new_pay"], last_scroll=0) + if ok: + success += 1 + if on_progress: + on_progress(-1, len(failed), c["invoice"], True, "retry") + else: + retry_failed.append(c) + if on_progress: + on_progress(-1, len(failed), c["invoice"], False, "retry failed") + except Exception as e: + retry_failed.append(c) + if on_progress: + on_progress(-1, len(failed), c["invoice"], False, str(e)) + failed = retry_failed + + return success, failed + + +# --------------------------------------------------------------------------- +# Filter / Select / Pay +# --------------------------------------------------------------------------- + +def filter_select_and_pay(page, on_status=None, on_manual_fallback=None): + """Apply 'No errors' filter, select all, click Pay Invoices, click Google auth.""" + def status(msg): + if on_status: + on_status(msg) + + status("Opening filter drawer...") + filter_toggle = page.query_selector("button[data-test-id='selectToPay-filter-toggle']") + if not filter_toggle: + status("ERROR: Could not find filter toggle button.") + return + filter_toggle.click() + time.sleep(1) + + applied = False + try: + status_input = page.query_selector( + "div[data-test-id='selectToPay-filter-filterStatuses'] input[placeholder='Status']" + ) + if not status_input: + view_all = page.query_selector( + "div[data-test-id='selectToPay-filter-menu'] >> text=View all" + ) + if view_all: + view_all.click() + time.sleep(0.5) + status_input = page.query_selector( + "div[data-test-id='selectToPay-filter-filterStatuses'] input[placeholder='Status']" + ) + + if status_input: + status_input.evaluate("el => el.scrollIntoView({block: 'center', behavior: 'instant'})") + time.sleep(0.3) + status_input.click(force=True) + time.sleep(0.8) + + no_errors = page.query_selector(".MuiAutocomplete-listbox >> text=No errors") + if not no_errors: + no_errors = page.query_selector(".MuiAutocomplete-listbox >> text=No Errors") + if not no_errors: + options = page.query_selector_all(".MuiAutocomplete-option") + for opt in options: + if "no error" in opt.inner_text().strip().lower(): + no_errors = opt + break + + if no_errors: + no_errors.click() + time.sleep(0.5) + applied = True + status("Applied 'No errors' filter.") + except Exception: + pass + + if not applied: + status("Could not auto-apply filter.") + if on_manual_fallback: + on_manual_fallback("Please apply Status -> 'No errors' manually in the browser, then click OK.") + else: + input(" Apply the filter manually, then press Enter: ") + + close_btn = page.query_selector( + "div[data-test-id='selectToPay-filter-menu-header'] button:last-child" + ) + if close_btn: + close_btn.click() + time.sleep(0.5) + + time.sleep(2) + + rows = page.query_selector_all(ROW_SELECTOR) + status(f"{len(rows)} rows visible after filtering.") + + status("Selecting all rows...") + select_all = page.query_selector("input[aria-label='Select all rows']") + if not select_all: + select_all = page.query_selector(".MuiDataGrid-columnHeaderCheckbox .MuiCheckbox-root") + if select_all: + select_all.click() + time.sleep(1) + status("Selected all rows.") + else: + status("ERROR: Could not find Select All checkbox.") + return + + status("Clicking Pay Invoices...") + pay_button = page.query_selector("button[data-test-id='selectToPay-action-payInvoices']") + if not pay_button: + status("ERROR: Could not find Pay Invoices button.") + return + + is_disabled = pay_button.get_attribute("disabled") + if is_disabled is not None: + status("Pay Invoices button disabled — no rows selected.") + if on_manual_fallback: + on_manual_fallback("Please select rows manually, then click OK.") + else: + input(" Select rows manually, then press Enter: ") + pay_button = page.query_selector("button[data-test-id='selectToPay-action-payInvoices']") + + pay_button.click() + time.sleep(2) + status("Clicked Pay Invoices.") + + status("Looking for re-authentication modal...") + google_btn = page.query_selector("button >> text=Google") + if not google_btn: + google_btn = page.query_selector("text=Google") + if google_btn: + google_btn.click() + status("Clicked Google login.") + time.sleep(3) + else: + status("No re-auth modal found.") diff --git a/stampli_gui.py b/stampli_gui.py new file mode 100644 index 0000000..ea0f751 --- /dev/null +++ b/stampli_gui.py @@ -0,0 +1,403 @@ +#!/usr/bin/env python3 +"""Stampli Bulk Editor — tkinter GUI.""" + +VERSION = "1.0.0" + +import os +import sys +import queue +import threading +import time +import traceback +from datetime import datetime + +# Set Tcl/Tk library paths before importing tkinter +_py_base = os.path.dirname(os.path.dirname(os.path.realpath(sys.executable))) +for _var, _subdir in [("TCL_LIBRARY", "tcl8.6"), ("TK_LIBRARY", "tk8.6")]: + _path = os.path.join(_py_base, "lib", _subdir) + if os.path.isdir(_path) and _var not in os.environ: + os.environ[_var] = _path + +import tkinter as tk +from tkinter import ttk, messagebox + +from playwright.sync_api import sync_playwright + +from stampli_core import ( + launch_browser, navigate, active_page, wait_for_login, needs_login, + collect_edit_rows, collect_scan_rows, compute_changes, compute_scan_results, + apply_edits, filter_select_and_pay, load_config, + READY_TO_PAY_URL, PENDING_APPROVAL_URL, DATE_FMT, +) + + +class StampliApp: + def __init__(self, root): + self.root = root + self.root.title(f"Stampli Bulk Editor v{VERSION}") + self.root.geometry("1000x700") + self.root.minsize(800, 500) + + self.msg_queue = queue.Queue() + self.worker_thread = None + self.browser_ctx = None + self.pw_ctx = None + self._confirm_result = False + self._running = False + + self._build_ui() + self.root.after(100, self._poll_queue) + + # Bring window to front on macOS + self.root.lift() + self.root.attributes("-topmost", True) + self.root.after(500, lambda: self.root.attributes("-topmost", False)) + + def _build_ui(self): + # --- Top controls --- + ctrl = ttk.Frame(self.root, padding=10) + ctrl.pack(fill="x") + + ttk.Label(ctrl, text="Operation:").pack(side="left") + self.mode_var = tk.StringVar(value="edit") + ttk.Radiobutton(ctrl, text="Edit Pay Dates", variable=self.mode_var, + value="edit").pack(side="left", padx=(5, 10)) + ttk.Radiobutton(ctrl, text="Scan Pending", variable=self.mode_var, + value="scan").pack(side="left", padx=(0, 20)) + + self.dry_run_var = tk.BooleanVar(value=False) + self.dry_run_cb = ttk.Checkbutton(ctrl, text="Dry Run", variable=self.dry_run_var) + self.dry_run_cb.pack(side="left", padx=(0, 20)) + + self.run_btn = ttk.Button(ctrl, text="Run", command=self.on_run) + self.run_btn.pack(side="left", padx=5) + + self.close_btn = ttk.Button(ctrl, text="Close Browser", command=self.on_close_browser, + state="disabled") + self.close_btn.pack(side="left", padx=5) + + # --- Status bar --- + self.status_var = tk.StringVar(value="Ready") + status_bar = ttk.Label(self.root, textvariable=self.status_var, relief="sunken", + padding=(10, 4)) + status_bar.pack(fill="x", padx=10) + + # --- Paned window for table + log --- + pane = ttk.PanedWindow(self.root, orient="vertical") + pane.pack(fill="both", expand=True, padx=10, pady=(5, 10)) + + # Table frame + table_frame = ttk.Frame(pane) + pane.add(table_frame, weight=3) + + self.tree = ttk.Treeview(table_frame, show="headings", selectmode="none") + tree_scroll_y = ttk.Scrollbar(table_frame, orient="vertical", command=self.tree.yview) + tree_scroll_x = ttk.Scrollbar(table_frame, orient="horizontal", command=self.tree.xview) + self.tree.configure(yscrollcommand=tree_scroll_y.set, xscrollcommand=tree_scroll_x.set) + tree_scroll_y.pack(side="right", fill="y") + tree_scroll_x.pack(side="bottom", fill="x") + self.tree.pack(fill="both", expand=True) + + self.tree.tag_configure("wrong", foreground="#cc0000") + self.tree.tag_configure("ok", foreground="#006600") + + # Log frame + log_frame = ttk.Frame(pane) + pane.add(log_frame, weight=1) + + self.log_text = tk.Text(log_frame, height=8, state="disabled", wrap="word", + font=("Menlo", 11)) + log_scroll = ttk.Scrollbar(log_frame, orient="vertical", command=self.log_text.yview) + self.log_text.configure(yscrollcommand=log_scroll.set) + log_scroll.pack(side="right", fill="y") + self.log_text.pack(fill="both", expand=True) + + # ------------------------------------------------------------------ + # Queue polling + # ------------------------------------------------------------------ + + def _poll_queue(self): + while True: + try: + msg_type, payload = self.msg_queue.get_nowait() + except queue.Empty: + break + + if msg_type == "status": + self.status_var.set(payload) + elif msg_type == "log": + self._append_log(payload) + elif msg_type == "table_edit": + self._populate_edit_table(payload) + elif msg_type == "table_scan": + self._populate_scan_table(payload) + elif msg_type == "confirm": + prompt, event = payload + self._show_confirm(prompt, event) + elif msg_type == "manual_fallback": + prompt, event = payload + self._show_manual_fallback(prompt, event) + elif msg_type == "done": + self._on_done(payload) + + self.root.after(100, self._poll_queue) + + def _append_log(self, text): + ts = datetime.now().strftime("%H:%M:%S") + self.log_text.configure(state="normal") + self.log_text.insert("end", f"[{ts}] {text}\n") + self.log_text.see("end") + self.log_text.configure(state="disabled") + + def _show_confirm(self, prompt, event): + self._confirm_result = messagebox.askyesno("Confirm", prompt) + event.set() + + def _show_manual_fallback(self, prompt, event): + messagebox.showinfo("Manual Step Required", prompt) + event.set() + + def _on_done(self, message): + self._running = False + self.run_btn.configure(state="normal") + self.close_btn.configure(state="normal") + self.mode_var.set(self.mode_var.get()) # re-enable radios + self.status_var.set(message or "Done") + + # ------------------------------------------------------------------ + # Table population + # ------------------------------------------------------------------ + + def _populate_edit_table(self, changes): + self.tree.delete(*self.tree.get_children()) + cols = ("invoice", "vendor", "due", "current_pay", "new_pay") + self.tree["columns"] = cols + self.tree.heading("invoice", text="Invoice") + self.tree.heading("vendor", text="Vendor") + self.tree.heading("due", text="Due Date") + self.tree.heading("current_pay", text="Current Pay") + self.tree.heading("new_pay", text="New Pay") + self.tree.column("invoice", width=140, minwidth=80) + self.tree.column("vendor", width=250, minwidth=120) + self.tree.column("due", width=100, minwidth=80) + self.tree.column("current_pay", width=120, minwidth=80) + self.tree.column("new_pay", width=100, minwidth=80) + + for c in changes: + self.tree.insert("", "end", values=( + c["invoice"], c["vendor"], c["due_text"], + c["pay_text"] or "(empty)", c["new_pay"], + )) + + def _populate_scan_table(self, results): + self.tree.delete(*self.tree.get_children()) + cols = ("invoice", "vendor", "due", "pay_date", "expected", "status") + self.tree["columns"] = cols + self.tree.heading("invoice", text="Invoice") + self.tree.heading("vendor", text="Vendor") + self.tree.heading("due", text="Due Date") + self.tree.heading("pay_date", text="Pay Date") + self.tree.heading("expected", text="Expected") + self.tree.heading("status", text="Status") + self.tree.column("invoice", width=140, minwidth=80) + self.tree.column("vendor", width=220, minwidth=120) + self.tree.column("due", width=90, minwidth=80) + self.tree.column("pay_date", width=90, minwidth=80) + self.tree.column("expected", width=90, minwidth=80) + self.tree.column("status", width=60, minwidth=50) + + for r in results: + tag = "wrong" if r["status"] == "WRONG" else "ok" + self.tree.insert("", "end", values=( + r["invoicesNumbers"], r["vendorName"][:35], r["dueDate"], + r["sendPaymentOn"], r["expected"], r["status"], + ), tags=(tag,)) + + # ------------------------------------------------------------------ + # Worker helpers + # ------------------------------------------------------------------ + + def _post(self, msg_type, payload=None): + self.msg_queue.put((msg_type, payload)) + + def _ask_confirm(self, prompt): + event = threading.Event() + self._post("confirm", (prompt, event)) + event.wait() + return self._confirm_result + + def _manual_fallback(self, prompt): + event = threading.Event() + self._post("manual_fallback", (prompt, event)) + event.wait() + + # ------------------------------------------------------------------ + # Run button + # ------------------------------------------------------------------ + + def on_run(self): + if self._running: + return + self._running = True + self.run_btn.configure(state="disabled") + self.tree.delete(*self.tree.get_children()) + self.log_text.configure(state="normal") + self.log_text.delete("1.0", "end") + self.log_text.configure(state="disabled") + + mode = self.mode_var.get() + dry_run = self.dry_run_var.get() + + self.worker_thread = threading.Thread( + target=self._worker, + args=(mode, dry_run), + daemon=True, + ) + self.worker_thread.start() + + def _worker(self, mode, dry_run): + try: + self._post("status", "Launching browser...") + self._post("log", "Launching browser...") + + self.pw_ctx = sync_playwright().start() + self.browser_ctx = launch_browser(self.pw_ctx) + + url = READY_TO_PAY_URL if mode == "edit" else PENDING_APPROVAL_URL + navigate(self.browser_ctx, url) + + self._post("log", f"Navigating to {url}") + time.sleep(3) + + page = active_page(self.browser_ctx) + if needs_login(page): + self._post("status", "Waiting for login...") + self._post("log", "Please log in to Stampli in the browser window.") + if not wait_for_login(self.browser_ctx, on_status=lambda m: self._post("log", m)): + self._post("done", "Login timed out.") + return + + self._post("log", "Waiting for page to settle...") + time.sleep(3) + page = active_page(self.browser_ctx) + + if mode == "edit": + self._run_edit(page, dry_run) + else: + self._run_scan(page) + + self._post("done", "Complete — browser still open. Click 'Close Browser' when done.") + self.root.after(0, lambda: self.close_btn.configure(state="normal")) + + except Exception as e: + self._post("log", f"ERROR: {e}") + self._post("log", traceback.format_exc()) + self._post("done", f"Error: {e}") + + def _run_edit(self, page, dry_run): + config = load_config() + date_fmt = config["date_format"] + days_before = config["days_before_due"] + + self._post("status", "Scanning rows...") + self._post("log", "Scanning all rows...") + + all_rows = collect_edit_rows( + page, + on_progress=lambda n: self._post("status", f"Scanning rows... ({n} found)"), + ) + self._post("log", f"Found {len(all_rows)} total rows.") + + changes = compute_changes(all_rows, date_fmt, days_before) + if not changes: + self._post("log", "All rows already have correct pay dates.") + return + + self._post("table_edit", changes) + label = "DRY RUN: " if dry_run else "" + self._post("log", f"{label}{len(changes)} rows need updating.") + + if dry_run: + return + + if not self._ask_confirm(f"Proceed with {len(changes)} updates?"): + self._post("log", "Aborted by user.") + return + + self._post("status", "Editing rows...") + + def on_edit_progress(i, total, inv, ok, info=""): + if i == -1: + msg = f"RETRY {'OK' if ok else 'FAIL'}: {inv} {info}" + else: + msg = f"[{i}/{total}] {'Updated' if ok else 'MISSED'}: {inv} {info}" + self._post("log", msg) + if i > 0: + self._post("status", f"Editing... {i}/{total}") + + success, failed = apply_edits(page, changes, on_progress=on_edit_progress) + self._post("log", f"Done: {success}/{len(changes)} updated, {len(failed)} failed.") + + if success > 0: + if self._ask_confirm("Filter to error-free rows, select all, and click Pay Invoices?"): + self._post("status", "Running filter/select/pay...") + filter_select_and_pay( + page, + on_status=lambda m: (self._post("log", m), self._post("status", m)), + on_manual_fallback=self._manual_fallback, + ) + + def _run_scan(self, page): + self._post("status", "Scanning rows...") + self._post("log", "Scanning Pending Approval rows...") + + all_rows = collect_scan_rows( + page, + on_progress=lambda n: self._post("status", f"Scanning rows... ({n} found)"), + ) + self._post("log", f"Found {len(all_rows)} rows.") + + results, incorrect = compute_scan_results(all_rows) + self._post("table_scan", results) + + self._post("log", f"{len(incorrect)} incorrect out of {len(all_rows)} total.") + for r in incorrect: + self._post("log", + f" WRONG: {r['invoicesNumbers']} — " + f"pay={r['sendPaymentOn']} expected={r['expected']}") + + # ------------------------------------------------------------------ + # Browser cleanup + # ------------------------------------------------------------------ + + def on_close_browser(self): + if self.browser_ctx: + try: + self.browser_ctx.close() + except Exception: + pass + self.browser_ctx = None + if self.pw_ctx: + try: + self.pw_ctx.stop() + except Exception: + pass + self.pw_ctx = None + self.close_btn.configure(state="disabled") + self.status_var.set("Browser closed.") + self._append_log("Browser closed.") + + def on_quit(self): + self.on_close_browser() + self.root.destroy() + + +def main(): + root = tk.Tk() + app = StampliApp(root) + root.protocol("WM_DELETE_WINDOW", app.on_quit) + root.mainloop() + + +if __name__ == "__main__": + main() diff --git a/stampli_gui.spec b/stampli_gui.spec new file mode 100644 index 0000000..73b31a3 --- /dev/null +++ b/stampli_gui.spec @@ -0,0 +1,74 @@ +# -*- mode: python ; coding: utf-8 -*- +import os +import sys + +uv_python = os.path.realpath(os.path.join('venv', 'bin', 'python')) +uv_base = os.path.dirname(os.path.dirname(uv_python)) +tcl_dir = os.path.join(uv_base, 'lib', 'tcl8.6') +tk_dir = os.path.join(uv_base, 'lib', 'tk8.6') + +# Find playwright driver +import playwright +pw_dir = os.path.dirname(playwright.__file__) +pw_driver = os.path.join(pw_dir, 'driver') + +a = Analysis( + ['stampli_gui.py'], + pathex=[], + binaries=[], + datas=[ + ('stampli_core.py', '.'), + ('app_icon.icns', '.'), + (tcl_dir, 'tcl8.6'), + (tk_dir, 'tk8.6'), + (pw_driver, 'playwright/driver'), + ], + hiddenimports=['playwright', 'playwright.sync_api', 'greenlet'], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) + +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='Stampli Bulk Editor', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=False, + console=False, + target_arch='arm64', + icon='app_icon.icns', +) + +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=False, + name='Stampli Bulk Editor', +) + +app = BUNDLE( + coll, + name='Stampli Bulk Editor.app', + bundle_identifier='com.seahaven.stampli-bulk-editor', + icon='app_icon.icns', + info_plist={ + 'NSHighResolutionCapable': True, + 'CFBundleShortVersionString': '1.0.0', + 'CFBundleVersion': '1.0.0', + 'LSEnvironment': { + 'TCL_LIBRARY': '../Resources/tcl8.6', + 'TK_LIBRARY': '../Resources/tk8.6', + }, + }, +)