- 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 ```
372 lines
11 KiB
QBasic
372 lines
11 KiB
QBasic
' ============================================================================
|
||
' Privacy Template: Data Portability/Export Request
|
||
' LGPD Art. 18 V / GDPR Art. 20 - Right to Data Portability
|
||
' ============================================================================
|
||
' This dialog enables users to export their data in portable formats
|
||
' Supports JSON, CSV, and XML export for interoperability
|
||
|
||
TALK "📦 **Data Portability Request**"
|
||
TALK "You have the right to receive your personal data in a structured, commonly used, and machine-readable format."
|
||
TALK ""
|
||
|
||
' Verify user identity
|
||
TALK "First, I need to verify your identity."
|
||
HEAR email AS EMAIL WITH "Please enter your registered email address:"
|
||
|
||
user = FIND "users" WHERE email = email
|
||
IF user IS NULL THEN
|
||
TALK "❌ No account found with that email address."
|
||
TALK "Please check and try again, or contact support."
|
||
EXIT
|
||
END IF
|
||
|
||
' Send verification code
|
||
code = GENERATE CODE 6
|
||
SET SESSION "export_verification_code", code
|
||
SET SESSION "export_email", email
|
||
|
||
SEND MAIL email, "Data Export Request - Verification Code", "
|
||
Your verification code is: " + code + "
|
||
|
||
This code expires in 15 minutes.
|
||
|
||
If you did not request this data export, please ignore this email.
|
||
|
||
Pragmatismo Privacy Team
|
||
"
|
||
|
||
HEAR entered_code AS TEXT WITH "📧 Enter the verification code sent to your email:"
|
||
|
||
IF entered_code <> code THEN
|
||
TALK "❌ Invalid verification code. Please start over."
|
||
EXIT
|
||
END IF
|
||
|
||
TALK "✅ Identity verified!"
|
||
TALK ""
|
||
|
||
' Ask for export format
|
||
TALK "**Choose your export format:**"
|
||
TALK ""
|
||
TALK "1️⃣ **JSON** - Best for importing into other systems"
|
||
TALK "2️⃣ **CSV** - Best for spreadsheets (Excel, Google Sheets)"
|
||
TALK "3️⃣ **XML** - Universal interchange format"
|
||
TALK "4️⃣ **All formats** - Get all three formats in a ZIP file"
|
||
|
||
HEAR format_choice WITH "Enter your choice (1-4):"
|
||
|
||
SELECT CASE format_choice
|
||
CASE "1", "json", "JSON"
|
||
export_format = "json"
|
||
format_name = "JSON"
|
||
CASE "2", "csv", "CSV"
|
||
export_format = "csv"
|
||
format_name = "CSV"
|
||
CASE "3", "xml", "XML"
|
||
export_format = "xml"
|
||
format_name = "XML"
|
||
CASE "4", "all", "ALL"
|
||
export_format = "all"
|
||
format_name = "All Formats (ZIP)"
|
||
CASE ELSE
|
||
export_format = "json"
|
||
format_name = "JSON"
|
||
TALK "Defaulting to JSON format."
|
||
END SELECT
|
||
|
||
TALK ""
|
||
TALK "**Select data categories to export:**"
|
||
TALK ""
|
||
TALK "1️⃣ Everything (complete data export)"
|
||
TALK "2️⃣ Profile information only"
|
||
TALK "3️⃣ Conversations and messages"
|
||
TALK "4️⃣ Files and documents"
|
||
TALK "5️⃣ Activity history"
|
||
TALK "6️⃣ Custom selection"
|
||
|
||
HEAR data_choice WITH "Enter your choice (1-6):"
|
||
|
||
' Define what data to export based on choice
|
||
SELECT CASE data_choice
|
||
CASE "1"
|
||
include_profile = TRUE
|
||
include_conversations = TRUE
|
||
include_files = TRUE
|
||
include_activity = TRUE
|
||
include_consents = TRUE
|
||
data_scope = "complete"
|
||
|
||
CASE "2"
|
||
include_profile = TRUE
|
||
include_conversations = FALSE
|
||
include_files = FALSE
|
||
include_activity = FALSE
|
||
include_consents = TRUE
|
||
data_scope = "profile"
|
||
|
||
CASE "3"
|
||
include_profile = FALSE
|
||
include_conversations = TRUE
|
||
include_files = FALSE
|
||
include_activity = FALSE
|
||
include_consents = FALSE
|
||
data_scope = "conversations"
|
||
|
||
CASE "4"
|
||
include_profile = FALSE
|
||
include_conversations = FALSE
|
||
include_files = TRUE
|
||
include_activity = FALSE
|
||
include_consents = FALSE
|
||
data_scope = "files"
|
||
|
||
CASE "5"
|
||
include_profile = FALSE
|
||
include_conversations = FALSE
|
||
include_files = FALSE
|
||
include_activity = TRUE
|
||
include_consents = FALSE
|
||
data_scope = "activity"
|
||
|
||
CASE "6"
|
||
TALK "Select categories (yes/no for each):"
|
||
HEAR include_profile AS BOOLEAN WITH "Include profile information?"
|
||
HEAR include_conversations AS BOOLEAN WITH "Include conversations?"
|
||
HEAR include_files AS BOOLEAN WITH "Include files metadata?"
|
||
HEAR include_activity AS BOOLEAN WITH "Include activity logs?"
|
||
HEAR include_consents AS BOOLEAN WITH "Include consent records?"
|
||
data_scope = "custom"
|
||
|
||
CASE ELSE
|
||
include_profile = TRUE
|
||
include_conversations = TRUE
|
||
include_files = TRUE
|
||
include_activity = TRUE
|
||
include_consents = TRUE
|
||
data_scope = "complete"
|
||
END SELECT
|
||
|
||
TALK ""
|
||
TALK "🔄 Preparing your data export... This may take a few minutes."
|
||
TALK ""
|
||
|
||
' Gather the data
|
||
export_data = {}
|
||
request_id = "EXP-" + FORMAT(NOW(), "YYYYMMDD-HHmmss") + "-" + user.id
|
||
|
||
' Export metadata
|
||
export_data.metadata = {
|
||
"export_id": request_id,
|
||
"export_date": NOW(),
|
||
"format": format_name,
|
||
"data_scope": data_scope,
|
||
"legal_basis": "LGPD Art. 18 V / GDPR Art. 20",
|
||
"data_controller": "Your Organization Name",
|
||
"contact": "privacy@company.com"
|
||
}
|
||
|
||
' Gather profile data
|
||
IF include_profile THEN
|
||
profile = FIND "users" WHERE id = user.id
|
||
export_data.profile = {
|
||
"name": profile.name,
|
||
"email": profile.email,
|
||
"phone": profile.phone,
|
||
"address": profile.address,
|
||
"created_at": profile.created_at,
|
||
"last_login": profile.last_login,
|
||
"timezone": profile.timezone,
|
||
"language": profile.language,
|
||
"preferences": profile.preferences
|
||
}
|
||
TALK "✓ Profile data collected"
|
||
END IF
|
||
|
||
' Gather conversations
|
||
IF include_conversations THEN
|
||
messages = FIND "messages" WHERE user_id = user.id ORDER BY created_at
|
||
sessions = FIND "sessions" WHERE user_id = user.id
|
||
|
||
export_data.conversations = {
|
||
"total_sessions": COUNT(sessions),
|
||
"total_messages": COUNT(messages),
|
||
"sessions": sessions,
|
||
"messages": messages
|
||
}
|
||
TALK "✓ Conversation data collected (" + COUNT(messages) + " messages)"
|
||
END IF
|
||
|
||
' Gather files metadata
|
||
IF include_files THEN
|
||
files = FIND "user_files" WHERE user_id = user.id
|
||
|
||
file_list = []
|
||
FOR EACH file IN files
|
||
file_info = {
|
||
"filename": file.name,
|
||
"size": file.size,
|
||
"type": file.mime_type,
|
||
"uploaded_at": file.created_at,
|
||
"last_accessed": file.last_accessed,
|
||
"path": file.path
|
||
}
|
||
APPEND file_list, file_info
|
||
NEXT
|
||
|
||
export_data.files = {
|
||
"total_files": COUNT(files),
|
||
"total_size": SUM(files, "size"),
|
||
"file_list": file_list
|
||
}
|
||
TALK "✓ Files metadata collected (" + COUNT(files) + " files)"
|
||
END IF
|
||
|
||
' Gather activity logs
|
||
IF include_activity THEN
|
||
activity = FIND "activity_logs" WHERE user_id = user.id ORDER BY timestamp DESC LIMIT 10000
|
||
|
||
export_data.activity = {
|
||
"total_events": COUNT(activity),
|
||
"events": activity
|
||
}
|
||
TALK "✓ Activity logs collected (" + COUNT(activity) + " events)"
|
||
END IF
|
||
|
||
' Gather consent records
|
||
IF include_consents THEN
|
||
consents = FIND "user_consents" WHERE user_id = user.id
|
||
|
||
export_data.consents = {
|
||
"consent_records": consents,
|
||
"current_preferences": {
|
||
"marketing_emails": user.marketing_consent,
|
||
"analytics": user.analytics_consent,
|
||
"third_party_sharing": user.sharing_consent
|
||
}
|
||
}
|
||
TALK "✓ Consent records collected"
|
||
END IF
|
||
|
||
TALK ""
|
||
TALK "📁 Generating export files..."
|
||
|
||
' Generate export files based on format
|
||
timestamp = FORMAT(NOW(), "YYYYMMDD_HHmmss")
|
||
base_filename = "data_export_" + timestamp
|
||
|
||
SELECT CASE export_format
|
||
CASE "json"
|
||
filename = base_filename + ".json"
|
||
WRITE filename, JSON(export_data)
|
||
|
||
CASE "csv"
|
||
' Generate multiple CSV files for different data types
|
||
IF include_profile THEN
|
||
WRITE base_filename + "_profile.csv", CSV(export_data.profile)
|
||
END IF
|
||
IF include_conversations THEN
|
||
WRITE base_filename + "_messages.csv", CSV(export_data.conversations.messages)
|
||
END IF
|
||
IF include_files THEN
|
||
WRITE base_filename + "_files.csv", CSV(export_data.files.file_list)
|
||
END IF
|
||
IF include_activity THEN
|
||
WRITE base_filename + "_activity.csv", CSV(export_data.activity.events)
|
||
END IF
|
||
' Create ZIP of all CSVs
|
||
filename = base_filename + "_csv.zip"
|
||
COMPRESS filename, base_filename + "_*.csv"
|
||
|
||
CASE "xml"
|
||
filename = base_filename + ".xml"
|
||
WRITE filename, XML(export_data)
|
||
|
||
CASE "all"
|
||
' Generate all formats
|
||
WRITE base_filename + ".json", JSON(export_data)
|
||
WRITE base_filename + ".xml", XML(export_data)
|
||
|
||
IF include_profile THEN
|
||
WRITE base_filename + "_profile.csv", CSV(export_data.profile)
|
||
END IF
|
||
IF include_conversations THEN
|
||
WRITE base_filename + "_messages.csv", CSV(export_data.conversations.messages)
|
||
END IF
|
||
IF include_files THEN
|
||
WRITE base_filename + "_files.csv", CSV(export_data.files.file_list)
|
||
END IF
|
||
|
||
filename = base_filename + "_complete.zip"
|
||
COMPRESS filename, base_filename + ".*"
|
||
END SELECT
|
||
|
||
' Upload to secure storage
|
||
secure_path = "/secure/exports/" + user.id + "/"
|
||
UPLOAD filename TO secure_path
|
||
|
||
' Generate download link (expires in 7 days)
|
||
download_link = GENERATE SECURE LINK secure_path + filename EXPIRES 7 DAYS
|
||
|
||
' Log the export request for compliance
|
||
INSERT INTO "privacy_requests" VALUES {
|
||
"id": request_id,
|
||
"user_id": user.id,
|
||
"request_type": "data_portability",
|
||
"data_scope": data_scope,
|
||
"format": format_name,
|
||
"requested_at": NOW(),
|
||
"completed_at": NOW(),
|
||
"status": "completed",
|
||
"legal_basis": "LGPD Art. 18 V / GDPR Art. 20"
|
||
}
|
||
|
||
' Send email with download link
|
||
SEND MAIL email, "Your Data Export is Ready - " + request_id, "
|
||
Dear " + user.name + ",
|
||
|
||
Your data export request has been completed.
|
||
|
||
**Export Details:**
|
||
- Request ID: " + request_id + "
|
||
- Format: " + format_name + "
|
||
- Data Included: " + data_scope + "
|
||
- Generated: " + FORMAT(NOW(), "DD/MM/YYYY HH:mm") + "
|
||
|
||
**Download Your Data:**
|
||
" + download_link + "
|
||
|
||
⚠️ This link expires in 7 days for security purposes.
|
||
|
||
**What's Included:**
|
||
" + IF(include_profile, "✓ Profile information\n", "") + IF(include_conversations, "✓ Conversation history\n", "") + IF(include_files, "✓ Files metadata\n", "") + IF(include_activity, "✓ Activity logs\n", "") + IF(include_consents, "✓ Consent records\n", "") + "
|
||
|
||
**Your Rights Under LGPD/GDPR:**
|
||
- Import this data to another service provider
|
||
- Request data deletion after export
|
||
- Request additional data categories
|
||
- File a complaint with data protection authorities
|
||
|
||
If you have questions, contact privacy@company.com
|
||
|
||
Pragmatismo Privacy Team
|
||
"
|
||
|
||
TALK ""
|
||
TALK "✅ **Export Complete!**"
|
||
TALK ""
|
||
TALK "📧 A download link has been sent to: " + email
|
||
TALK ""
|
||
TALK "**Export Details:**"
|
||
TALK "• Request ID: " + request_id
|
||
TALK "• Format: " + format_name
|
||
TALK "• Link expires in: 7 days"
|
||
TALK ""
|
||
TALK "You can use this data to:"
|
||
TALK "• Import into another service"
|
||
TALK "• Keep a personal backup"
|
||
TALK "• Review what data we hold"
|
||
TALK ""
|
||
TALK "🔒 Need anything else?"
|
||
TALK "• Say **'delete my data'** to request deletion"
|
||
TALK "• Say **'privacy settings'** to manage consents"
|
||
TALK "• Say **'help'** for other options"
|