botserver/templates/sales/crm.gbai/crm.gbdialog/account-management.bas
Rodrigo Rodriguez (Pragmatismo) 48c1ae0b51 , dt.month, dt.hour, dt.is_weekend, etc.)
- 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 ```
2025-11-30 15:07:29 -03:00

480 lines
17 KiB
QBasic

' =============================================================================
' Account Management Dialog
' Dynamics CRM-style Account Entity Management
' General Bots CRM Template
' =============================================================================
' This dialog provides comprehensive account (company) management similar to
' Microsoft Dynamics CRM including:
' - Account creation and updates
' - Account hierarchy (parent/child relationships)
' - Contact associations
' - Activity timeline
' - Account scoring and health
' =============================================================================
PARAM action AS TEXT
SELECT CASE UCASE(action)
CASE "CREATE"
CALL create_account
CASE "UPDATE"
CALL update_account
CASE "VIEW"
CALL view_account
CASE "LIST"
CALL list_accounts
CASE "SEARCH"
CALL search_accounts
CASE "HIERARCHY"
CALL account_hierarchy
CASE "CONTACTS"
CALL account_contacts
CASE "ACTIVITIES"
CALL account_activities
CASE "HEALTH"
CALL account_health
CASE ELSE
TALK "Account Management"
TALK "Available actions: Create, Update, View, List, Search, Hierarchy, Contacts, Activities, Health"
HEAR selected_action AS TEXT WITH "What would you like to do?"
CALL "account-management.bas", selected_action
END SELECT
' -----------------------------------------------------------------------------
' CREATE ACCOUNT
' -----------------------------------------------------------------------------
SUB create_account
TALK "Create New Account"
HEAR account_name AS TEXT WITH "Company name:"
HEAR account_type AS TEXT WITH "Account type (Customer, Partner, Vendor, Competitor, Other):" DEFAULT "Customer"
HEAR industry AS TEXT WITH "Industry:"
HEAR phone AS TEXT WITH "Main phone:" DEFAULT ""
HEAR website AS TEXT WITH "Website:" DEFAULT ""
HEAR email AS TEXT WITH "Primary email:" DEFAULT ""
TALK "Address Information"
HEAR street AS TEXT WITH "Street address:" DEFAULT ""
HEAR city AS TEXT WITH "City:" DEFAULT ""
HEAR state AS TEXT WITH "State/Province:" DEFAULT ""
HEAR postal_code AS TEXT WITH "Postal code:" DEFAULT ""
HEAR country AS TEXT WITH "Country:" DEFAULT ""
TALK "Business Information"
HEAR employees AS INTEGER WITH "Number of employees:" DEFAULT 0
HEAR revenue AS MONEY WITH "Annual revenue:" DEFAULT 0
HEAR description AS TEXT WITH "Description:" DEFAULT ""
HEAR parent_account AS TEXT WITH "Parent account (leave empty if none):" DEFAULT ""
account_id = "ACC-" + FORMAT(NOW(), "YYYYMMDDHHmmss") + "-" + RANDOM(1000, 9999)
created_by = GET SESSION "user_email"
account = {
"id": account_id,
"name": account_name,
"type": account_type,
"industry": industry,
"phone": phone,
"website": website,
"email": email,
"street": street,
"city": city,
"state": state,
"postal_code": postal_code,
"country": country,
"employees": employees,
"annual_revenue": revenue,
"description": description,
"parent_account_id": parent_account,
"owner_id": created_by,
"created_by": created_by,
"created_at": NOW(),
"modified_at": NOW(),
"status": "Active",
"health_score": 100
}
SAVE "accounts.csv", account
LOG ACTIVITY account_id, "Account", "Created", "Account created: " + account_name, created_by
RECORD METRIC "crm_accounts" WITH action="created", type=account_type
TALK "Account created successfully"
TALK "Account ID: " + account_id
TALK "Name: " + account_name
TALK "Type: " + account_type
HEAR add_contact AS BOOLEAN WITH "Would you like to add a primary contact?"
IF add_contact THEN
SET BOT MEMORY "current_account_id", account_id
CALL "contact-management.bas", "CREATE"
END IF
END SUB
' -----------------------------------------------------------------------------
' UPDATE ACCOUNT
' -----------------------------------------------------------------------------
SUB update_account
HEAR account_id AS TEXT WITH "Enter Account ID or search by name:"
IF LEFT(account_id, 4) <> "ACC-" THEN
accounts = FIND "accounts" WHERE name LIKE "%" + account_id + "%"
IF COUNT(accounts) = 0 THEN
TALK "No accounts found matching: " + account_id
EXIT SUB
ELSEIF COUNT(accounts) = 1 THEN
account = FIRST(accounts)
account_id = account.id
ELSE
TALK "Multiple accounts found:"
FOR EACH acc IN accounts
TALK acc.id + " - " + acc.name
NEXT
HEAR account_id AS TEXT WITH "Enter the Account ID:"
END IF
END IF
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found: " + account_id
EXIT SUB
END IF
TALK "Updating: " + account.name
TALK "Press Enter to keep current value"
HEAR new_name AS TEXT WITH "Company name [" + account.name + "]:" DEFAULT account.name
HEAR new_type AS TEXT WITH "Account type [" + account.type + "]:" DEFAULT account.type
HEAR new_industry AS TEXT WITH "Industry [" + account.industry + "]:" DEFAULT account.industry
HEAR new_phone AS TEXT WITH "Phone [" + account.phone + "]:" DEFAULT account.phone
HEAR new_website AS TEXT WITH "Website [" + account.website + "]:" DEFAULT account.website
HEAR new_email AS TEXT WITH "Email [" + account.email + "]:" DEFAULT account.email
HEAR new_employees AS INTEGER WITH "Employees [" + account.employees + "]:" DEFAULT account.employees
HEAR new_revenue AS MONEY WITH "Annual revenue [" + account.annual_revenue + "]:" DEFAULT account.annual_revenue
HEAR new_status AS TEXT WITH "Status [" + account.status + "] (Active, Inactive, On Hold):" DEFAULT account.status
UPDATE "accounts" SET
name = new_name,
type = new_type,
industry = new_industry,
phone = new_phone,
website = new_website,
email = new_email,
employees = new_employees,
annual_revenue = new_revenue,
status = new_status,
modified_at = NOW(),
modified_by = GET SESSION "user_email"
WHERE id = account_id
LOG ACTIVITY account_id, "Account", "Updated", "Account updated", GET SESSION "user_email"
TALK "Account updated successfully"
END SUB
' -----------------------------------------------------------------------------
' VIEW ACCOUNT (360-degree view)
' -----------------------------------------------------------------------------
SUB view_account
HEAR account_id AS TEXT WITH "Enter Account ID:"
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found"
EXIT SUB
END IF
TALK "Account Details"
TALK "Name: " + account.name
TALK "ID: " + account.id
TALK "Type: " + account.type
TALK "Industry: " + account.industry
TALK "Status: " + account.status
TALK ""
TALK "Contact Information"
TALK "Phone: " + account.phone
TALK "Email: " + account.email
TALK "Website: " + account.website
TALK ""
TALK "Address"
TALK account.street
TALK account.city + ", " + account.state + " " + account.postal_code
TALK account.country
TALK ""
TALK "Business Information"
TALK "Employees: " + FORMAT(account.employees, "#,###")
TALK "Annual Revenue: " + FORMAT(account.annual_revenue, "$#,###")
TALK "Health Score: " + account.health_score + "/100"
TALK ""
TALK "System Information"
TALK "Owner: " + account.owner_id
TALK "Created: " + FORMAT(account.created_at, "YYYY-MM-DD")
TALK "Modified: " + FORMAT(account.modified_at, "YYYY-MM-DD")
contacts = FIND "contacts" WHERE account_id = account_id
opportunities = FIND "opportunities" WHERE account_id = account_id
cases = FIND "cases" WHERE account_id = account_id
TALK ""
TALK "Related Records"
TALK "Contacts: " + COUNT(contacts)
TALK "Opportunities: " + COUNT(opportunities)
TALK "Cases: " + COUNT(cases)
open_opportunities = FILTER(opportunities, "status <> 'Closed Won' AND status <> 'Closed Lost'")
total_pipeline = SUM(open_opportunities, "estimated_value")
TALK "Pipeline Value: " + FORMAT(total_pipeline, "$#,###")
won_opportunities = FILTER(opportunities, "status = 'Closed Won'")
total_revenue = SUM(won_opportunities, "actual_value")
TALK "Lifetime Revenue: " + FORMAT(total_revenue, "$#,###")
END SUB
' -----------------------------------------------------------------------------
' LIST ACCOUNTS
' -----------------------------------------------------------------------------
SUB list_accounts
TALK "List Accounts"
TALK "Filter by:"
TALK "1. All Active"
TALK "2. By Type"
TALK "3. By Industry"
TALK "4. By Owner"
TALK "5. Recently Modified"
HEAR filter_choice AS INTEGER
SELECT CASE filter_choice
CASE 1
accounts = FIND "accounts" WHERE status = "Active" ORDER BY name
CASE 2
HEAR filter_type AS TEXT WITH "Account type (Customer, Partner, Vendor, Competitor):"
accounts = FIND "accounts" WHERE type = filter_type AND status = "Active" ORDER BY name
CASE 3
HEAR filter_industry AS TEXT WITH "Industry:"
accounts = FIND "accounts" WHERE industry = filter_industry AND status = "Active" ORDER BY name
CASE 4
HEAR filter_owner AS TEXT WITH "Owner email:"
accounts = FIND "accounts" WHERE owner_id = filter_owner AND status = "Active" ORDER BY name
CASE 5
accounts = FIND "accounts" WHERE modified_at >= DATEADD(NOW(), -7, "day") ORDER BY modified_at DESC
CASE ELSE
accounts = FIND "accounts" WHERE status = "Active" ORDER BY name LIMIT 20
END SELECT
IF COUNT(accounts) = 0 THEN
TALK "No accounts found"
EXIT SUB
END IF
TALK "Found " + COUNT(accounts) + " accounts:"
TALK ""
FOR EACH acc IN accounts
TALK acc.id + " | " + acc.name + " | " + acc.type + " | " + acc.industry
NEXT
END SUB
' -----------------------------------------------------------------------------
' SEARCH ACCOUNTS
' -----------------------------------------------------------------------------
SUB search_accounts
HEAR search_term AS TEXT WITH "Search accounts (name, email, phone, or website):"
accounts = FIND "accounts" WHERE
name LIKE "%" + search_term + "%" OR
email LIKE "%" + search_term + "%" OR
phone LIKE "%" + search_term + "%" OR
website LIKE "%" + search_term + "%"
IF COUNT(accounts) = 0 THEN
TALK "No accounts found for: " + search_term
EXIT SUB
END IF
TALK "Found " + COUNT(accounts) + " matching accounts:"
FOR EACH acc IN accounts
TALK acc.id + " - " + acc.name + " (" + acc.type + ")"
TALK " Phone: " + acc.phone + " | Email: " + acc.email
NEXT
END SUB
' -----------------------------------------------------------------------------
' ACCOUNT HIERARCHY
' -----------------------------------------------------------------------------
SUB account_hierarchy
HEAR account_id AS TEXT WITH "Enter Account ID to view hierarchy:"
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found"
EXIT SUB
END IF
TALK "Account Hierarchy for: " + account.name
TALK ""
IF account.parent_account_id <> "" THEN
parent = FIND "accounts" WHERE id = account.parent_account_id
IF parent IS NOT NULL THEN
TALK "Parent Account:"
TALK " " + parent.name + " (" + parent.id + ")"
END IF
END IF
TALK ""
TALK "Current Account:"
TALK " " + account.name + " (" + account.id + ")"
children = FIND "accounts" WHERE parent_account_id = account_id
IF COUNT(children) > 0 THEN
TALK ""
TALK "Child Accounts:"
FOR EACH child IN children
TALK " - " + child.name + " (" + child.id + ")"
NEXT
END IF
END SUB
' -----------------------------------------------------------------------------
' ACCOUNT CONTACTS
' -----------------------------------------------------------------------------
SUB account_contacts
HEAR account_id AS TEXT WITH "Enter Account ID:"
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found"
EXIT SUB
END IF
contacts = FIND "contacts" WHERE account_id = account_id ORDER BY is_primary DESC, last_name
TALK "Contacts for: " + account.name
TALK "Total: " + COUNT(contacts)
TALK ""
IF COUNT(contacts) = 0 THEN
TALK "No contacts associated with this account"
HEAR add_new AS BOOLEAN WITH "Would you like to add a contact?"
IF add_new THEN
SET BOT MEMORY "current_account_id", account_id
CALL "contact-management.bas", "CREATE"
END IF
EXIT SUB
END IF
FOR EACH contact IN contacts
primary_marker = ""
IF contact.is_primary THEN
primary_marker = " [PRIMARY]"
END IF
TALK contact.first_name + " " + contact.last_name + primary_marker
TALK " Title: " + contact.job_title
TALK " Email: " + contact.email
TALK " Phone: " + contact.phone
TALK ""
NEXT
END SUB
' -----------------------------------------------------------------------------
' ACCOUNT ACTIVITIES
' -----------------------------------------------------------------------------
SUB account_activities
HEAR account_id AS TEXT WITH "Enter Account ID:"
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found"
EXIT SUB
END IF
activities = FIND "activities" WHERE related_to = account_id ORDER BY activity_date DESC LIMIT 20
TALK "Recent Activities for: " + account.name
TALK ""
IF COUNT(activities) = 0 THEN
TALK "No activities recorded"
EXIT SUB
END IF
FOR EACH activity IN activities
TALK FORMAT(activity.activity_date, "YYYY-MM-DD HH:mm") + " | " + activity.activity_type
TALK " " + activity.subject
TALK " By: " + activity.created_by
TALK ""
NEXT
END SUB
' -----------------------------------------------------------------------------
' ACCOUNT HEALTH SCORE
' -----------------------------------------------------------------------------
SUB account_health
HEAR account_id AS TEXT WITH "Enter Account ID:"
account = FIND "accounts" WHERE id = account_id
IF account IS NULL THEN
TALK "Account not found"
EXIT SUB
END IF
contacts = FIND "contacts" WHERE account_id = account_id
opportunities = FIND "opportunities" WHERE account_id = account_id
activities = FIND "activities" WHERE related_to = account_id AND activity_date >= DATEADD(NOW(), -90, "day")
cases = FIND "cases" WHERE account_id = account_id AND status = "Open"
health_score = 100
health_factors = []
IF COUNT(contacts) = 0 THEN
health_score = health_score - 20
PUSH health_factors, "No contacts (-20)"
END IF
recent_activities = FILTER(activities, "activity_date >= " + DATEADD(NOW(), -30, "day"))
IF COUNT(recent_activities) = 0 THEN
health_score = health_score - 15
PUSH health_factors, "No recent activity (-15)"
END IF
IF COUNT(cases) > 3 THEN
health_score = health_score - 10
PUSH health_factors, "Multiple open cases (-10)"
END IF
open_opps = FILTER(opportunities, "status <> 'Closed Won' AND status <> 'Closed Lost'")
IF COUNT(open_opps) > 0 THEN
health_score = health_score + 10
PUSH health_factors, "Active opportunities (+10)"
END IF
won_opps = FILTER(opportunities, "status = 'Closed Won' AND close_date >= " + DATEADD(NOW(), -365, "day"))
IF COUNT(won_opps) > 0 THEN
health_score = health_score + 15
PUSH health_factors, "Recent closed deals (+15)"
END IF
IF health_score > 100 THEN health_score = 100
IF health_score < 0 THEN health_score = 0
UPDATE "accounts" SET health_score = health_score, modified_at = NOW() WHERE id = account_id
TALK "Account Health Assessment"
TALK "Account: " + account.name
TALK ""
TALK "Health Score: " + health_score + "/100"
TALK ""
TALK "Factors:"
FOR EACH factor IN health_factors
TALK " - " + factor
NEXT
TALK ""
TALK "Statistics:"
TALK " Contacts: " + COUNT(contacts)
TALK " Activities (90 days): " + COUNT(activities)
TALK " Open Cases: " + COUNT(cases)
TALK " Open Opportunities: " + COUNT(open_opps)
END SUB