- Add startup wizard module for first-run configuration - Add white-label branding system with .product file support - Add bot manager for lifecycle, MinIO buckets, and templates - Add version tracking registry for component updates - Create comparison doc: BASIC vs n8n/Zapier/Make/Copilot - Add WhatsApp-style sample dialogs to template documentation - Add data traceability SVG diagram ```
329 lines
11 KiB
QBasic
329 lines
11 KiB
QBasic
' Document Processor Bot - Demonstrates file operations keywords
|
|
' This template shows how to use READ, WRITE, COPY, MOVE, LIST, COMPRESS, EXTRACT, etc.
|
|
|
|
' ============================================================================
|
|
' WEBHOOK: External systems can trigger document processing via HTTP POST
|
|
' Endpoint: /api/office/webhook/process-documents
|
|
' ============================================================================
|
|
WEBHOOK "process-documents"
|
|
|
|
TALK "Document Processor initialized..."
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 1: Reading and writing files
|
|
' ============================================================================
|
|
|
|
' Read a configuration file
|
|
config_content = READ "config/settings.json"
|
|
TALK "Loaded configuration file"
|
|
|
|
' Read a text report
|
|
daily_report = READ "reports/daily-summary.txt"
|
|
|
|
' Write processed data to a new file
|
|
processed_data = "Processed at: " + NOW() + "\n"
|
|
processed_data = processed_data + "Original content length: " + LEN(daily_report) + " characters\n"
|
|
processed_data = processed_data + "Status: Complete\n"
|
|
|
|
WRITE "reports/processed/" + FORMAT(TODAY(), "yyyy-MM-dd") + "-log.txt", processed_data
|
|
TALK "Processing log created"
|
|
|
|
' Write JSON data
|
|
summary_json = #{
|
|
"date": TODAY(),
|
|
"files_processed": 5,
|
|
"total_size_kb": 1250,
|
|
"status": "success"
|
|
}
|
|
WRITE "reports/summary.json", summary_json
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 2: Listing directory contents
|
|
' ============================================================================
|
|
|
|
' List all files in the inbox folder
|
|
inbox_files = LIST "inbox/"
|
|
TALK "Found " + UBOUND(inbox_files) + " files in inbox"
|
|
|
|
' Process each file in the inbox
|
|
FOR EACH file IN inbox_files
|
|
TALK "Processing: " + file
|
|
NEXT file
|
|
|
|
' List reports folder
|
|
report_files = LIST "reports/"
|
|
TALK "Total reports in archive: " + UBOUND(report_files)
|
|
|
|
' List with subdirectory
|
|
template_files = LIST "templates/documents/"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 3: Copying files
|
|
' ============================================================================
|
|
|
|
' Copy a template for a new customer
|
|
customer_name = "acme-corp"
|
|
COPY "templates/invoice-template.docx", "customers/" + customer_name + "/invoice-draft.docx"
|
|
TALK "Invoice template copied for " + customer_name
|
|
|
|
' Copy to backup location
|
|
COPY "data/important-data.xlsx", "backups/" + FORMAT(TODAY(), "yyyy-MM-dd") + "-data-backup.xlsx"
|
|
TALK "Backup created"
|
|
|
|
' Copy multiple files using a loop
|
|
template_types = ["contract", "nda", "proposal"]
|
|
FOR EACH template_type IN template_types
|
|
COPY "templates/" + template_type + ".docx", "customers/" + customer_name + "/" + template_type + ".docx"
|
|
NEXT template_type
|
|
TALK "All templates copied for customer"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 4: Moving and renaming files
|
|
' ============================================================================
|
|
|
|
' Move processed files from inbox to processed folder
|
|
FOR EACH file IN inbox_files
|
|
' Extract just the filename from the path
|
|
filename = file
|
|
MOVE "inbox/" + filename, "processed/" + FORMAT(TODAY(), "yyyy-MM-dd") + "-" + filename
|
|
NEXT file
|
|
TALK "Inbox files moved to processed folder"
|
|
|
|
' Rename a file (move within same directory)
|
|
MOVE "drafts/report-v1.docx", "drafts/report-final.docx"
|
|
TALK "Report renamed to final version"
|
|
|
|
' Archive old files
|
|
old_reports = LIST "reports/2023/"
|
|
FOR EACH old_report IN old_reports
|
|
MOVE "reports/2023/" + old_report, "archive/2023/" + old_report
|
|
NEXT old_report
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 5: Deleting files
|
|
' ============================================================================
|
|
|
|
' Delete temporary files
|
|
temp_files = LIST "temp/"
|
|
FOR EACH temp_file IN temp_files
|
|
DELETE_FILE "temp/" + temp_file
|
|
NEXT temp_file
|
|
TALK "Temporary files cleaned up"
|
|
|
|
' Delete a specific file
|
|
DELETE_FILE "cache/old-cache.dat"
|
|
|
|
' Delete processed inbox files older than 30 days
|
|
' (In real usage, you'd check file dates)
|
|
DELETE_FILE "processed/old-file.txt"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 6: Creating ZIP archives
|
|
' ============================================================================
|
|
|
|
' Compress monthly reports into a single archive
|
|
monthly_reports = [
|
|
"reports/week1.pdf",
|
|
"reports/week2.pdf",
|
|
"reports/week3.pdf",
|
|
"reports/week4.pdf",
|
|
"reports/summary.xlsx"
|
|
]
|
|
|
|
archive_name = "archives/monthly-" + FORMAT(TODAY(), "yyyy-MM") + ".zip"
|
|
COMPRESS monthly_reports, archive_name
|
|
TALK "Monthly reports compressed to: " + archive_name
|
|
|
|
' Compress customer documents
|
|
customer_docs = LIST "customers/" + customer_name + "/"
|
|
customer_archive = "archives/customers/" + customer_name + "-documents.zip"
|
|
COMPRESS customer_docs, customer_archive
|
|
TALK "Customer documents archived"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 7: Extracting archives
|
|
' ============================================================================
|
|
|
|
' Extract uploaded archive
|
|
uploaded_archive = "uploads/new-documents.zip"
|
|
extracted_files = EXTRACT uploaded_archive, "inbox/extracted/"
|
|
TALK "Extracted " + UBOUND(extracted_files) + " files from archive"
|
|
|
|
' Process extracted files
|
|
FOR EACH extracted_file IN extracted_files
|
|
TALK "Extracted: " + extracted_file
|
|
NEXT extracted_file
|
|
|
|
' Extract to specific destination
|
|
EXTRACT "imports/data-import.zip", "data/imported/"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 8: Upload and download operations
|
|
' ============================================================================
|
|
|
|
' Download a file from external URL
|
|
external_url = "https://example.com/reports/external-report.pdf"
|
|
local_path = "downloads/external-report-" + FORMAT(TODAY(), "yyyy-MM-dd") + ".pdf"
|
|
downloaded_path = DOWNLOAD external_url, local_path
|
|
TALK "Downloaded external report to: " + downloaded_path
|
|
|
|
' Download multiple files
|
|
download_urls = [
|
|
"https://api.example.com/exports/data1.csv",
|
|
"https://api.example.com/exports/data2.csv",
|
|
"https://api.example.com/exports/data3.csv"
|
|
]
|
|
|
|
counter = 1
|
|
FOR EACH url IN download_urls
|
|
DOWNLOAD url, "imports/data-" + counter + ".csv"
|
|
counter = counter + 1
|
|
NEXT url
|
|
TALK "Downloaded " + UBOUND(download_urls) + " data files"
|
|
|
|
' Upload a file to storage
|
|
HEAR attachment AS FILE
|
|
IF attachment != "" THEN
|
|
upload_destination = "uploads/" + attachment.filename
|
|
upload_url = UPLOAD attachment, upload_destination
|
|
TALK "File uploaded to: " + upload_url
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 9: PDF Generation
|
|
' ============================================================================
|
|
|
|
' Generate an invoice PDF from template
|
|
invoice_data = #{
|
|
"invoice_number": "INV-2024-001",
|
|
"customer_name": "Acme Corporation",
|
|
"customer_address": "123 Business Ave, Suite 100",
|
|
"date": FORMAT(TODAY(), "MMMM dd, yyyy"),
|
|
"due_date": FORMAT(DATEADD(TODAY(), "day", 30), "MMMM dd, yyyy"),
|
|
"items": [
|
|
#{ "description": "Consulting Services", "quantity": 10, "rate": 150, "amount": 1500 },
|
|
#{ "description": "Software License", "quantity": 1, "rate": 500, "amount": 500 },
|
|
#{ "description": "Support Package", "quantity": 1, "rate": 200, "amount": 200 }
|
|
],
|
|
"subtotal": 2200,
|
|
"tax": 176,
|
|
"total": 2376
|
|
}
|
|
|
|
invoice_pdf = GENERATE_PDF "templates/invoice.html", invoice_data, "invoices/INV-2024-001.pdf"
|
|
TALK "Invoice PDF generated: " + invoice_pdf.url
|
|
|
|
' Generate a report PDF
|
|
report_data = #{
|
|
"title": "Monthly Performance Report",
|
|
"period": FORMAT(TODAY(), "MMMM yyyy"),
|
|
"author": "Office Bot",
|
|
"generated_at": NOW(),
|
|
"metrics": #{
|
|
"total_sales": 125000,
|
|
"new_customers": 45,
|
|
"satisfaction_score": 4.7
|
|
}
|
|
}
|
|
|
|
report_pdf = GENERATE_PDF "templates/report.html", report_data, "reports/monthly-" + FORMAT(TODAY(), "yyyy-MM") + ".pdf"
|
|
TALK "Report PDF generated: " + report_pdf.url
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 10: Merging PDF files
|
|
' ============================================================================
|
|
|
|
' Merge multiple PDFs into a single document
|
|
pdfs_to_merge = [
|
|
"documents/cover-page.pdf",
|
|
"documents/table-of-contents.pdf",
|
|
"documents/chapter1.pdf",
|
|
"documents/chapter2.pdf",
|
|
"documents/chapter3.pdf",
|
|
"documents/appendix.pdf"
|
|
]
|
|
|
|
merged_pdf = MERGE_PDF pdfs_to_merge, "publications/complete-manual.pdf"
|
|
TALK "PDFs merged into: " + merged_pdf.url
|
|
|
|
' Merge customer documents for a single package
|
|
customer_pdfs = [
|
|
"customers/" + customer_name + "/contract.pdf",
|
|
"customers/" + customer_name + "/terms.pdf",
|
|
"customers/" + customer_name + "/invoice.pdf"
|
|
]
|
|
|
|
customer_package = MERGE_PDF customer_pdfs, "customers/" + customer_name + "/welcome-package.pdf"
|
|
TALK "Customer welcome package created"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 11: Document workflow automation
|
|
' ============================================================================
|
|
|
|
TALK "Starting document workflow..."
|
|
|
|
' Step 1: Check inbox for new documents
|
|
new_docs = LIST "inbox/"
|
|
doc_count = UBOUND(new_docs)
|
|
|
|
IF doc_count > 0 THEN
|
|
TALK "Processing " + doc_count + " new documents"
|
|
|
|
' Step 2: Copy originals to backup
|
|
FOR EACH doc IN new_docs
|
|
COPY "inbox/" + doc, "backups/inbox/" + FORMAT(TODAY(), "yyyy-MM-dd") + "-" + doc
|
|
NEXT doc
|
|
|
|
' Step 3: Move to processing folder
|
|
FOR EACH doc IN new_docs
|
|
MOVE "inbox/" + doc, "processing/" + doc
|
|
NEXT doc
|
|
|
|
' Step 4: Process documents (simplified)
|
|
processing_docs = LIST "processing/"
|
|
processed_list = []
|
|
|
|
FOR EACH doc IN processing_docs
|
|
' Read and process
|
|
content = READ "processing/" + doc
|
|
|
|
' Write processed version
|
|
WRITE "completed/" + doc, content
|
|
|
|
' Track processed file
|
|
processed_list = processed_list + [doc]
|
|
|
|
' Clean up processing folder
|
|
DELETE_FILE "processing/" + doc
|
|
NEXT doc
|
|
|
|
' Step 5: Archive completed documents
|
|
IF UBOUND(processed_list) > 0 THEN
|
|
COMPRESS processed_list, "archives/batch-" + FORMAT(NOW(), "yyyy-MM-dd-HHmm") + ".zip"
|
|
END IF
|
|
|
|
TALK "Workflow complete: " + UBOUND(processed_list) + " documents processed"
|
|
ELSE
|
|
TALK "No new documents to process"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' Return webhook response with summary
|
|
' ============================================================================
|
|
|
|
result = #{
|
|
"status": "success",
|
|
"timestamp": NOW(),
|
|
"documents_processed": doc_count,
|
|
"operations": #{
|
|
"files_read": 5,
|
|
"files_written": 8,
|
|
"files_copied": 6,
|
|
"files_moved": doc_count,
|
|
"archives_created": 2,
|
|
"pdfs_generated": 2,
|
|
"pdfs_merged": 2
|
|
}
|
|
}
|
|
|
|
TALK "Document processing complete!"
|