botserver/templates/sales/crm.gbai/crm.gbdialog/opportunity-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

345 lines
11 KiB
QBasic

PARAM action AS STRING
PARAM opp_data AS OBJECT
user_id = GET "session.user_id"
opportunity_id = GET "session.opportunity_id"
account_id = GET "session.account_id"
current_time = FORMAT NOW() AS "YYYY-MM-DD HH:mm:ss"
IF action = "create" THEN
opp_name = GET "opp_data.name"
opp_value = GET "opp_data.value"
close_date = GET "opp_data.close_date"
IF account_id = "" THEN
TALK "Which account is this opportunity for?"
account_name = HEAR
account = FIND "accounts", "name LIKE '%" + account_name + "%'"
IF account != NULL THEN
account_id = account.id
ELSE
TALK "Account not found. Please create the account first."
EXIT
END IF
END IF
IF opp_name = "" THEN
TALK "What should we call this opportunity?"
opp_name = HEAR
END IF
IF opp_value = "" THEN
TALK "What is the estimated value of this deal?"
opp_value = HEAR
END IF
IF close_date = "" THEN
TALK "When do you expect to close this deal? (YYYY-MM-DD)"
close_date = HEAR
END IF
opportunity = CREATE OBJECT
SET opportunity.id = FORMAT GUID()
SET opportunity.name = opp_name
SET opportunity.account_id = account_id
SET opportunity.amount = opp_value
SET opportunity.close_date = close_date
SET opportunity.stage = "qualification"
SET opportunity.probability = 10
SET opportunity.owner_id = user_id
SET opportunity.created_at = current_time
SAVE_FROM_UNSTRUCTURED "opportunities", FORMAT opportunity AS JSON
SET "session.opportunity_id" = opportunity.id
REMEMBER "opportunity_" + opportunity.id = opportunity
TALK "Opportunity created: " + opp_name + " valued at $" + opp_value
CREATE_TASK "Qualify opportunity: " + opp_name, "high", user_id
activity = CREATE OBJECT
SET activity.type = "opportunity_created"
SET activity.opportunity_id = opportunity.id
SET activity.description = "Created opportunity: " + opp_name
SET activity.created_at = current_time
SAVE_FROM_UNSTRUCTURED "activities", FORMAT activity AS JSON
END IF
IF action = "update_stage" THEN
IF opportunity_id = "" THEN
TALK "Which opportunity do you want to update?"
opp_name = HEAR
opportunity = FIND "opportunities", "name LIKE '%" + opp_name + "%'"
IF opportunity != NULL THEN
opportunity_id = opportunity.id
ELSE
TALK "Opportunity not found."
EXIT
END IF
END IF
opportunity = FIND "opportunities", "id = '" + opportunity_id + "'"
IF opportunity = NULL THEN
TALK "Opportunity not found."
EXIT
END IF
TALK "Current stage: " + opportunity.stage
TALK "Select new stage:"
TALK "1. Qualification (10%)"
TALK "2. Needs Analysis (20%)"
TALK "3. Value Proposition (50%)"
TALK "4. Decision Makers (60%)"
TALK "5. Proposal (75%)"
TALK "6. Negotiation (90%)"
TALK "7. Closed Won (100%)"
TALK "8. Closed Lost (0%)"
stage_choice = HEAR
new_stage = ""
new_probability = 0
IF stage_choice = "1" THEN
new_stage = "qualification"
new_probability = 10
ELSE IF stage_choice = "2" THEN
new_stage = "needs_analysis"
new_probability = 20
ELSE IF stage_choice = "3" THEN
new_stage = "value_proposition"
new_probability = 50
ELSE IF stage_choice = "4" THEN
new_stage = "decision_makers"
new_probability = 60
ELSE IF stage_choice = "5" THEN
new_stage = "proposal"
new_probability = 75
ELSE IF stage_choice = "6" THEN
new_stage = "negotiation"
new_probability = 90
ELSE IF stage_choice = "7" THEN
new_stage = "closed_won"
new_probability = 100
opportunity.won = true
opportunity.closed_at = current_time
ELSE IF stage_choice = "8" THEN
new_stage = "closed_lost"
new_probability = 0
opportunity.won = false
opportunity.closed_at = current_time
END IF
old_stage = opportunity.stage
opportunity.stage = new_stage
opportunity.probability = new_probability
opportunity.updated_at = current_time
SAVE_FROM_UNSTRUCTURED "opportunities", FORMAT opportunity AS JSON
REMEMBER "opportunity_stage_" + opportunity_id = new_stage
activity = CREATE OBJECT
SET activity.type = "stage_change"
SET activity.opportunity_id = opportunity_id
SET activity.description = "Stage changed from " + old_stage + " to " + new_stage
SET activity.created_at = current_time
SAVE_FROM_UNSTRUCTURED "activities", FORMAT activity AS JSON
TALK "Stage updated to " + new_stage + " (" + new_probability + "%)"
IF new_stage = "closed_won" THEN
TALK "Congratulations! Deal closed for $" + opportunity.amount
notification = "Deal Won: " + opportunity.name + " - $" + opportunity.amount
SEND MAIL "management@company.com", "Deal Won", notification
CREATE_TASK "Onboard new customer: " + opportunity.name, "high", user_id
ELSE IF new_stage = "closed_lost" THEN
TALK "What was the reason for losing this deal?"
loss_reason = HEAR
opportunity.loss_reason = loss_reason
SAVE_FROM_UNSTRUCTURED "opportunities", FORMAT opportunity AS JSON
CREATE_TASK "Analyze lost deal: " + opportunity.name, "low", user_id
END IF
END IF
IF action = "add_product" THEN
IF opportunity_id = "" THEN
TALK "No opportunity selected."
EXIT
END IF
TALK "Enter product name or code:"
product_search = HEAR
product = FIND "products", "name LIKE '%" + product_search + "%' OR code = '" + product_search + "'"
IF product = NULL THEN
TALK "Product not found."
EXIT
END IF
TALK "How many units?"
quantity = HEAR
TALK "Any discount percentage? (0 for none)"
discount = HEAR
line_item = CREATE OBJECT
SET line_item.id = FORMAT GUID()
SET line_item.opportunity_id = opportunity_id
SET line_item.product_id = product.id
SET line_item.product_name = product.name
SET line_item.quantity = quantity
SET line_item.unit_price = product.unit_price
SET line_item.discount = discount
SET line_item.total = quantity * product.unit_price * (1 - discount / 100)
SET line_item.created_at = current_time
SAVE_FROM_UNSTRUCTURED "opportunity_products", FORMAT line_item AS JSON
opportunity = FIND "opportunities", "id = '" + opportunity_id + "'"
opportunity.amount = opportunity.amount + line_item.total
SAVE_FROM_UNSTRUCTURED "opportunities", FORMAT opportunity AS JSON
TALK "Added " + quantity + " x " + product.name + " = $" + line_item.total
END IF
IF action = "generate_quote" THEN
IF opportunity_id = "" THEN
TALK "No opportunity selected."
EXIT
END IF
opportunity = FIND "opportunities", "id = '" + opportunity_id + "'"
products = FIND "opportunity_products", "opportunity_id = '" + opportunity_id + "'"
IF products = NULL THEN
TALK "No products added to this opportunity."
EXIT
END IF
account = FIND "accounts", "id = '" + opportunity.account_id + "'"
contact = FIND "contacts", "account_id = '" + opportunity.account_id + "' AND primary_contact = true"
quote = CREATE OBJECT
SET quote.id = FORMAT GUID()
SET quote.quote_number = "Q-" + FORMAT NOW() AS "YYYYMMDD" + "-" + FORMAT RANDOM(1000, 9999)
SET quote.opportunity_id = opportunity_id
SET quote.account_id = account.id
SET quote.contact_id = contact.id
SET quote.status = "draft"
SET quote.valid_until = FORMAT ADD_DAYS(NOW(), 30) AS "YYYY-MM-DD"
SET quote.subtotal = opportunity.amount
SET quote.tax_rate = 10
SET quote.tax_amount = opportunity.amount * 0.1
SET quote.total = opportunity.amount * 1.1
SET quote.created_at = current_time
SAVE_FROM_UNSTRUCTURED "quotes", FORMAT quote AS JSON
REMEMBER "quote_" + quote.id = quote
quote_content = "QUOTATION\n"
quote_content = quote_content + "Quote #: " + quote.quote_number + "\n"
quote_content = quote_content + "Date: " + current_time + "\n"
quote_content = quote_content + "Valid Until: " + quote.valid_until + "\n\n"
quote_content = quote_content + "To: " + account.name + "\n"
quote_content = quote_content + "Contact: " + contact.name + "\n\n"
quote_content = quote_content + "ITEMS:\n"
FOR EACH item IN products DO
quote_content = quote_content + item.product_name + " x " + item.quantity + " @ $" + item.unit_price + " = $" + item.total + "\n"
END FOR
quote_content = quote_content + "\nSubtotal: $" + quote.subtotal + "\n"
quote_content = quote_content + "Tax (10%): $" + quote.tax_amount + "\n"
quote_content = quote_content + "TOTAL: $" + quote.total + "\n"
CREATE_DRAFT quote_content, "Quote " + quote.quote_number + " for " + account.name
TALK "Quote " + quote.quote_number + " generated for $" + quote.total
IF contact.email != "" THEN
TALK "Send quote to " + contact.name + " at " + contact.email + "? (yes/no)"
send_quote = HEAR
IF send_quote = "yes" OR send_quote = "YES" OR send_quote = "Yes" THEN
subject = "Quote " + quote.quote_number + " from Our Company"
SEND MAIL contact.email, subject, quote_content
quote.status = "sent"
quote.sent_at = current_time
SAVE_FROM_UNSTRUCTURED "quotes", FORMAT quote AS JSON
TALK "Quote sent to " + contact.email
CREATE_TASK "Follow up on quote " + quote.quote_number, "medium", user_id
END IF
END IF
END IF
IF action = "forecast" THEN
opportunities = FIND "opportunities", "stage != 'closed_won' AND stage != 'closed_lost'"
total_pipeline = 0
weighted_pipeline = 0
q1_forecast = 0
q2_forecast = 0
q3_forecast = 0
q4_forecast = 0
FOR EACH opp IN opportunities DO
total_pipeline = total_pipeline + opp.amount
weighted_value = opp.amount * opp.probability / 100
weighted_pipeline = weighted_pipeline + weighted_value
close_month = FORMAT opp.close_date AS "MM"
IF close_month <= "03" THEN
q1_forecast = q1_forecast + weighted_value
ELSE IF close_month <= "06" THEN
q2_forecast = q2_forecast + weighted_value
ELSE IF close_month <= "09" THEN
q3_forecast = q3_forecast + weighted_value
ELSE
q4_forecast = q4_forecast + weighted_value
END IF
END FOR
TALK "SALES FORECAST"
TALK "=============="
TALK "Total Pipeline: $" + total_pipeline
TALK "Weighted Pipeline: $" + weighted_pipeline
TALK ""
TALK "Quarterly Forecast:"
TALK "Q1: $" + q1_forecast
TALK "Q2: $" + q2_forecast
TALK "Q3: $" + q3_forecast
TALK "Q4: $" + q4_forecast
forecast_report = CREATE OBJECT
SET forecast_report.total_pipeline = total_pipeline
SET forecast_report.weighted_pipeline = weighted_pipeline
SET forecast_report.q1 = q1_forecast
SET forecast_report.q2 = q2_forecast
SET forecast_report.q3 = q3_forecast
SET forecast_report.q4 = q4_forecast
SET forecast_report.generated_at = current_time
REMEMBER "forecast_" + FORMAT NOW() AS "YYYYMMDD" = forecast_report
END IF