# Odoo Lead Manager
A comprehensive Python package for managing Odoo leads with advanced filtering capabilities and smart distribution algorithms.
## Features
- **Robust Odoo API Client**: Secure connection and authentication with Odoo instances
- **Advanced Lead Filtering**: Multiple criteria including date ranges, web source IDs, status, and user assignments
- **Smart Lead Distribution**: Intelligent algorithms for fair lead distribution based on user capacity and expected proportions
- **Comprehensive Analytics**: Lead characteristics, user statistics, and distribution reports
- **Export Capabilities**: DataFrame export for further analysis
- **Well-Tested**: Extensive unit test coverage with mocking support
## Installation
### From Source
```bash
pip install -e .
```
### Development Installation
```bash
pip install -e ".[dev]"
```
## Quick Start
### 1. Command Line Interface (CLI)
The Odoo Lead Manager provides a comprehensive CLI for easy lead management:
```bash
# Install the package
pip install -e .
# Check connection to Odoo
odlm check
# Configure credentials interactively
odlm configure
# Get leads with various filters
odlm leads --status "new" --limit 50
odlm leads --user "Alice Smith" --format csv --output alice_leads.csv
odlm leads --date-from 2024-01-01 --date-to 2024-01-31 --count
# Update lead assignments
odlm update --ids "1,2,3" --user-name "Bob Johnson"
odlm update --from-csv leads.csv --status "in_progress"
# Count leads
odlm count --status "won" --date-filter "this_month"
# Query invoices
odlm invoices --date-from 2024-01-01 --format csv --output invoices.csv
# Join leads with invoice data
odlm join --lead-status "won" --invoice-state "paid"
```
### 2. Python API Setup
```python
from odoo_lead_manager import OdooClient, LeadManager, SmartDistributor
# Configure Odoo connection
client = OdooClient(
host="your-odoo-server.com",
port=8069,
database="your_database",
username="your_username",
password="your_password"
)
# Initialize lead manager
lead_manager = LeadManager(client)
```
### 2. Environment Variables
You can also use environment variables:
```bash
export ODOO_HOST=your-odoo-server.com
export ODOO_PORT=8069
export ODOO_DB=your_database
export ODOO_USERNAME=your_username
export ODOO_PASSWORD=your_password
```
Then just use:
```python
client = OdooClient()
```
## CLI Usage Examples
### Basic Commands
#### Connection and Configuration
```bash
# Test connection to Odoo
odlm check
# Interactive configuration setup
odlm configure
# Check with verbose output
odlm check --verbose
```
#### Lead Management
```bash
# Get all leads in table format
odlm leads --format table
# Get new leads with limit
odlm leads --status "new" --limit 50
# Export leads to CSV
odlm leads --format csv --output leads.csv
# Get leads for specific user
odlm leads --user "Alice Smith"
# Get leads from date range
odlm leads --date-from 2024-01-01 --date-to 2024-01-31
# Count leads by status
odlm count --status "won"
```
#### Lead Updates
```bash
# Assign specific leads to user
odlm update --ids "1,2,3" --user-name "Bob Johnson"
# Update leads from CSV file
odlm update --from-csv leads.csv --user-name "Alice Smith"
# Update status and assign closer
odlm update --ids "100,101,102" --status "in_progress" --closer-name "Senior Manager"
# Update leads from text file
odlm update --from-file lead_ids.txt --status "assigned"
```
#### Advanced Filtering
```bash
# Date-based filtering
odlm leads --date-filter "last_30_days"
odlm leads --date-filter "this_month"
odlm leads --date-filter "older_than_2_months"
# Source-based filtering
odlm leads --web-source-ids "facebook_form,google_ads,website"
# Team and user filtering
odlm leads --team "Sales Team" --user "Alice"
# Campaign filtering
odlm leads --campaign "Summer Sale 2024"
```
#### Analytics and Reporting
```bash
# Group leads by user and status
odlm leads --group-by "user_id,status"
# Pivot table analysis
odlm leads --pivot-rows "user_id" --pivot-cols "status"
# Export for analysis
odlm leads --fields "id,name,email,phone,user_id,status" --format json --output analysis.json
```
#### Invoice Management
```bash
# Query invoices
odlm invoices --date-from 2024-01-01 --limit 100
# Export invoices to CSV
odlm invoices --format csv --output invoices.csv
# Filter by amount
odlm invoices --amount-min 1000 --amount-max 5000
# Filter by state
odlm invoices --state "paid" --date-from 2024-01-01
```
#### Lead-Invoice Analysis
```bash
# Join leads with invoice data
odlm join --lead-status "won" --invoice-state "paid"
# Export conversion analysis
odlm join --lead-date-from 2024-01-01 --format csv --output conversion_analysis.csv
# Filter by user performance
odlm join --lead-user "Alice Smith" --invoice-date-from 2024-01-01
```
### Comprehensive CLI Examples
#### Lead Management Workflows
**Daily Operations:**
```bash
# Morning lead review
odlm leads --status "new" --limit 50 --format table
# Assign new leads to sales team
odlm update --from-csv morning_leads.csv --user-name "Alice Smith"
# Check team performance
odlm leads --user "Alice Smith" --date-filter "this_month" --group-by "status"
```
**Weekly Reporting:**
```bash
# Weekly lead summary
odlm leads --date-filter "last_7_days" --group-by "user_id,status" --format csv --output weekly_report.csv
# Source performance analysis
odlm leads --date-filter "last_7_days" --pivot-rows "web_source_id" --pivot-cols "status"
# Export for analysis
odlm leads --date-filter "last_7_days" --fields "id,name,email,phone,user_id,status,web_source_id" --format json --output weekly_data.json
```
**Campaign Management:**
```bash
# Campaign lead assignment
odlm update --query '{"campaign_id.name": "Summer Sale 2024", "status": "new"}' --user-name "Campaign Team"
# Campaign performance
odlm leads --campaign "Summer Sale 2024" --date-filter "this_month" --group-by "status"
# Export campaign data
odlm leads --campaign "Summer Sale 2024" --format csv --output summer_sale_leads.csv
```
#### Advanced Analytics
**Sales Performance:**
```bash
# Individual salesperson performance
odlm leads --user "Alice Smith" --date-filter "this_month" --pivot-rows "status" --pivot-cols "web_source_id"
# Team comparison
odlm leads --team "Sales Team" --date-filter "this_month" --group-by "user_id,status"
# Conversion analysis
odlm join --lead-status "won" --lead-date-from 2024-01-01 --format csv --output conversions.csv
```
**Revenue Analysis:**
```bash
# Invoice analysis
odlm invoices --date-from 2024-01-01 --state "paid" --format csv --output revenue.csv
# Lead-to-revenue mapping
odlm join --lead-status "won" --invoice-state "paid" --lead-date-from 2024-01-01
# Source ROI
odlm join --lead-source "Facebook" --invoice-state "paid" --format csv --output facebook_roi.csv
```
#### Data Export and Integration
**Automated Reports:**
```bash
# Daily CSV export
odlm leads --date-filter "today" --format csv --output daily_leads_$(date +%Y%m%d).csv
# Monthly JSON export for API integration
odlm leads --date-filter "this_month" --format json --output monthly_data.json
# User-specific exports
odlm leads --user "Alice Smith" --date-filter "this_month" --format csv --output alice_monthly.csv
```
**Batch Processing:**
```bash
# Large dataset processing
odlm leads --date-from 2024-01-01 --date-to 2024-12-31 --format csv --output yearly_data.csv
# Incremental updates
odlm update --from-csv batch_1.csv --user-name "Team A"
odlm update --from-csv batch_2.csv --user-name "Team B"
```
#### Quality Assurance
**Data Validation:**
```bash
# Check for unassigned leads
odlm leads --status "new" --user "" --count
# Validate lead quality
odlm leads --status "new" --fields "id,name,email,phone,web_source_id" --limit 100
# Review old leads
odlm leads --date-filter "older_than_2_months" --status "new" --format table
```
**Error Handling:**
```bash
# Debug mode for troubleshooting
odlm update --ids "1,2,3" --user-name "Alice" --debug
# Quiet mode for automation
odlm update --from-csv large_batch.csv --user-name "Bob" --quiet
# Validation before update
odlm leads --ids "1,2,3" --format table # Check leads exist first
```
## Python API Usage Examples
### Fetching Leads
#### Basic Lead Retrieval
```python
# Get all leads
leads = lead_manager.get_leads()
# Get leads with specific fields
leads = lead_manager.get_leads(fields=["id", "name", "email", "status"])
# Get leads with limit and offset
leads = lead_manager.get_leads(limit=50, offset=100)
```
#### Date Range Filtering
```python
from datetime import date
# Get leads from January 2024
leads = lead_manager.get_leads_by_date_range(
start_date=date(2024, 1, 1),
end_date=date(2024, 1, 31)
)
# Get leads after specific date
leads = lead_manager.get_leads_by_date_range(
start_date=date(2024, 1, 1)
)
```
#### Web Source Filtering
```python
# Single source
leads = lead_manager.get_leads_by_source("Website")
# Multiple sources
leads = lead_manager.get_leads_by_source(["Website", "Email Campaign", "Social Media"])
```
#### Status Filtering
```python
from odoo_lead_manager.filters import LeadStatus
# Single status
leads = lead_manager.get_leads_by_status("new")
# Multiple statuses
leads = lead_manager.get_leads_by_status(["new", "in_progress", "won"])
# Using enum
leads = lead_manager.get_leads_by_status([LeadStatus.NEW, LeadStatus.WON])
```
#### User Assignment Filtering
```python
# By user IDs
leads = lead_manager.get_leads_by_users(user_ids=[1, 2, 3])
# By user names
leads = lead_manager.get_leads_by_users(user_names=["Alice Smith", "Bob Johnson"])
# By closer IDs
leads = lead_manager.get_leads_by_users(closer_ids=[1, 2])
# By open user IDs
leads = lead_manager.get_leads_by_users(open_user_ids=[1, 2])
# Combined filtering
leads = lead_manager.get_leads_by_users(
user_ids=[1, 2],
closer_names=["Alice Smith"],
open_user_names=["Bob Johnson"]
)
```
### Advanced Filtering with LeadFilter
```python
from odoo_lead_manager.filters import LeadFilter
# Complex filtering with chaining
filter_obj = LeadFilter() \
.by_date_range(
start_date=date(2024, 1, 1),
end_date=date(2024, 1, 31),
field_name="create_date"
) \
.by_status(["new", "in_progress"]) \
.by_web_source_ids(["Website", "Email Campaign"]) \
.by_user_assignments(user_ids=[1, 2, 3]) \
.by_customer_name("John", exact=False) \
.by_email("@company.com") \
.by_tags(["VIP", "Hot Lead"]) \
.limit(100) \
.offset(50) \
.order("create_date desc")
leads = lead_manager.get_leads(filter_obj)
```
### Lead Analysis and Summary
```python
# Get comprehensive lead summary
summary = lead_manager.get_lead_summary()
print(f"Total leads: {summary['total_leads']}")
print(f"Statistics: {summary['statistics']}")
print(f"User assignments: {summary['user_assignments']}")
print(f"Source distribution: {summary['source_distribution']}")
print(f"Status distribution: {summary['status_distribution']}")
print(f"Geographic distribution: {summary['geographic_distribution']}")
# Export to DataFrame for analysis
import pandas as pd
df = lead_manager.export_to_dataframe(filter_obj)
print(df.head())
```
### Smart Lead Distribution
#### Basic Setup
```python
# Initialize distributor
distributor = SmartDistributor()
# Add users with their profiles
users = [
UserProfile(
user_id=1,
name="Alice Smith",
current_leads=10,
expected_percentage=40.0,
max_capacity=50
),
UserProfile(
user_id=2,
name="Bob Johnson",
current_leads=15,
expected_percentage=35.0,
max_capacity=40
),
UserProfile(
user_id=3,
name="Carol Williams",
current_leads=5,
expected_percentage=25.0,
max_capacity=30
)
]
for user in users:
distributor.add_user_profile(user)
```
#### Load Users from Odoo
```python
# Load existing users and their current lead counts
distributor.load_user_profiles_from_odoo(lead_manager)
# Load expected proportions from Odoo table
distributor.load_proportions_from_odoo(lead_manager)
```
#### Distribute Leads
```python
from odoo_lead_manager.distribution import Lead
# Prepare leads for distribution
leads = [
Lead(lead_id=101, name="Hot Lead A", source_id="web", priority=3),
Lead(lead_id=102, name="Warm Lead B", source_id="email", priority=2),
Lead(lead_id=103, name="Cold Lead C", source_id="referral", priority=1),
]
# Choose distribution strategy
distributor.set_distribution_strategy(DistributionStrategy.PROPORTIONAL)
# Distribute leads
assignments = distributor.distribute_leads(leads)
# Apply assignments to Odoo
for user_id, lead_ids in assignments.items():
lead_manager.update_lead_assignments(lead_ids, user_id=user_id)
```
#### Distribution Strategies
```python
# Available strategies:
from odoo_lead_manager.distribution import DistributionStrategy
strategies = [
DistributionStrategy.PROPORTIONAL, # Based on expected percentages
DistributionStrategy.ROUND_ROBIN, # Equal rotation
DistributionStrategy.LEAST_LOADED, # To users with fewest leads
DistributionStrategy.WEIGHTED_RANDOM, # Random with percentage weights
DistributionStrategy.CAPACITY_BASED, # Based on remaining capacity
]
# Change strategy
distributor.set_distribution_strategy(DistributionStrategy.LEAST_LOADED)
```
#### Distribution Reports
```python
# Get detailed distribution report
report = distributor.get_distribution_report()
print(f"Total users: {report['total_users']}")
print(f"Active users: {report['active_users']}")
for user_id, details in report['user_details'].items():
print(f"User {details['name']}: {details['current_leads']} leads")
print(f" Expected: {details['expected_leads']}")
print(f" Deviation: {details['deviation']}")
print(f" Utilization: {details['utilization_rate']}%")
```
### Save and Load Proportions
```python
# Save current proportions to Odoo table
distributor.save_proportions_to_odoo(lead_manager, "lead_distribution_proportions")
# Load proportions from Odoo table
distributor.load_proportions_from_odoo(lead_manager, "lead_distribution_proportions")
```
## Configuration File
Create a `.env` file in your project root:
```bash
# Odoo Connection
ODOO_HOST=your-odoo-server.com
ODOO_PORT=8069
ODOO_DB=your_database
ODOO_USERNAME=your_username
ODOO_PASSWORD=your_password
# Optional Settings
ODOO_PROTOCOL=jsonrpc
ODOO_TIMEOUT=120
```
## Testing
### Run All Tests
```bash
python run_tests.py
```
### Run with Coverage
```bash
python run_tests.py --coverage
```
### Run Specific Tests
```bash
python run_tests.py --pattern "test_lead*"
python run_tests.py --specific tests/test_filters.py::TestLeadFilter::test_by_date_range_both_dates
```
### Using pytest directly
```bash
pytest tests/
pytest tests/ -v --cov=src/odoo_lead_manager
```
## CLI Reference
### Available Commands
#### `odlm check`
Test connection to Odoo server and validate credentials.
```bash
odlm check [--verbose]
```
#### `odlm configure`
Interactive setup of Odoo credentials.
```bash
odlm configure [--file .env] [--overwrite]
```
#### `odlm leads`
Get leads with advanced filtering, grouping, and pivot capabilities.
```bash
odlm leads [OPTIONS]
```
**Key Options:**
- `--status`: Filter by lead status (new, in_progress, won, lost, etc.)
- `--date-from/--date-to`: Date range filtering
- `--user`: Filter by assigned user name
- `--team`: Filter by sales team name
- `--source`: Filter by source name
- `--web-source-ids`: Comma-separated web source names
- `--format`: Output format (table, csv, json)
- `--output`: Output file
- `--group-by`: Group by columns
- `--pivot-rows/--pivot-cols`: Pivot table analysis
- `--count`: Count results only
#### `odlm update`
Update lead assignments, status, or other fields.
```bash
odlm update [OPTIONS]
```
**Key Options:**
- `--ids`: Comma-separated list of lead IDs
- `--from-csv/--from-tsv/--from-file`: Read IDs from files
- `--user-name/--user-id`: Assign to user
- `--closer-name/--closer-id`: Set closer
- `--status`: Update lead status
- `--model`: Odoo model to update (default: crm.lead)
#### `odlm count`
Count leads matching filter criteria.
```bash
odlm count [OPTIONS]
```
#### `odlm invoices`
Query invoice data from account.invoice model.
```bash
odlm invoices [OPTIONS]
```
**Key Options:**
- `--date-from/--date-to`: Date range filtering
- `--partner-id`: Filter by customer ID
- `--state`: Filter by invoice state (draft, open, paid, cancel)
- `--amount-min/--amount-max`: Amount range filtering
- `--format`: Output format (table, csv, json)
#### `odlm join`
Join leads with invoice data based on partner relationships.
```bash
odlm join [OPTIONS]
```
**Key Options:**
- `--lead-date-from/--lead-date-to`: Lead date filtering
- `--lead-status`: Filter leads by status
- `--lead-user`: Filter leads by user
- `--invoice-state`: Filter invoices by state
- `--exclude-unmatched`: Exclude leads without invoices
### Date Filter Examples
```bash
# Relative date filters
odlm leads --date-filter "today"
odlm leads --date-filter "yesterday"
odlm leads --date-filter "last_7_days"
odlm leads --date-filter "last_30_days"
odlm leads --date-filter "this_month"
odlm leads --date-filter "older_than_2_months"
# Exact dates
odlm leads --date-from 2024-01-01 --date-to 2024-01-31
```
### File Input Formats
#### CSV/TSV Files
- Must have 'id' column (or first column will be used)
- Supports Odoo export format: `__export__.crm_lead_12345_abcdef123`
#### Text Files
- One ID per line
- Supports comments with `#` prefix
- Supports Odoo export format
### Output Formats
#### Table Format (Default)
Pretty-printed tables with grid formatting
#### CSV Format
Standard CSV output for spreadsheet applications
#### JSON Format
Structured JSON for API integration and data processing
## Python API Reference
### OdooClient
- `connect()`: Establish connection to Odoo
- `authenticate()`: Authenticate with credentials
- `search_read()`: Search and read records
- `search_count()`: Count matching records
- `write()`: Update records
- `create()`: Create new records
- `unlink()`: Delete records
### LeadFilter
- `by_date_range()`: Filter by date range
- `by_web_source_ids()`: Filter by web source IDs
- `by_status()`: Filter by lead status
- `by_user_assignments()`: Filter by user assignments
- `by_customer_name()`: Filter by customer name
- `by_email()`: Filter by email
- `by_phone()`: Filter by phone
- `by_tags()`: Filter by tags
- `build()`: Build final filter configuration
### LeadManager
- `get_leads()`: Get leads with filters
- `get_leads_by_date_range()`: Get leads by date range
- `get_leads_by_source()`: Get leads by source
- `get_leads_by_status()`: Get leads by status
- `get_leads_by_users()`: Get leads by user assignments
- `count_leads()`: Count matching leads
- `get_lead_summary()`: Get comprehensive summary
- `update_lead_assignments()`: Update lead assignments
- `get_user_lead_counts()`: Get user lead counts
- `export_to_dataframe()`: Export to pandas DataFrame
### SmartDistributor
- `add_user_profile()`: Add user profile
- `remove_user_profile()`: Remove user profile
- `update_user_current_leads()`: Update user lead count
- `distribute_leads()`: Distribute leads among users
- `get_distribution_report()`: Get distribution statistics
- `load_user_profiles_from_odoo()`: Load users from Odoo
- `save_proportions_to_odoo()`: Save proportions to Odoo
- `load_proportions_from_odoo()`: Load proportions from Odoo
## Troubleshooting
### CLI Issues
#### Connection Problems
```bash
# Test connection
odlm check
# Check with verbose output
odlm check --verbose
# Reconfigure credentials
odlm configure
```
**Common Issues:**
- Verify Odoo server is accessible
- Check credentials and permissions
- Ensure correct port and protocol
- Check firewall settings
#### Command Not Found
```bash
# Install in development mode
pip install -e .
# Check installation
pip list | grep odoo-lead-manager
```
#### File Input Issues
- **CSV Format**: Ensure file has 'id' column or first column contains IDs
- **Text Files**: One ID per line, supports comments with `#`
- **Odoo Export Format**: Supports `__export__.crm_lead_12345_abcdef123` format
#### Update Command Issues
- **Non-existent Lead IDs**: System validates all IDs against crm.lead model
- **ID Validation**: Comprehensive search across all crm.lead records
- **Model Flexibility**: Use `--model` parameter for different Odoo models
- **User Resolution**: Automatic name-to-ID resolution with error reporting
### Python API Issues
#### Import Issues
- Install package in development mode: `pip install -e .`
- Check Python path includes src directory
#### Test Failures
- Ensure all dependencies are installed: `pip install -r requirements.txt`
- Check for environment variable conflicts
- Verify mock setup in test configuration
### Common Error Messages
#### "Failed to connect to Odoo"
- Check server is running
- Verify host and port
- Test network connectivity
#### "User not found"
- Use exact user names
- Check user exists in Odoo
- Use `odlm users --list` to see available users
#### "No leads found"
- Verify filter criteria
- Check date formats (YYYY-MM-DD)
- Ensure status values are correct
#### "Permission denied"
- Check user permissions in Odoo
- Verify database access rights
- Ensure proper authentication
## Contributing
1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Ensure all tests pass
5. Submit a pull request
## License
MIT License - see LICENSE file for details.
## Support
For issues and questions:
- Check the troubleshooting section
- Review the test examples
- Open an issue on GitHub
Raw data
{
"_id": null,
"home_page": "https://github.com/example/odoo-lead-manager",
"name": "odoo-lead-manager",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Lead Management Team <team@example.com>",
"keywords": "odoo, lead, management, distribution, crm, sales, automation",
"author": "Lead Management Team",
"author_email": "Lead Management Team <team@example.com>",
"download_url": "https://files.pythonhosted.org/packages/fa/3d/b029c1873654ee1412f2c629130c09e9974a13b295bec0787729b22fbfe0/odoo_lead_manager-1.3.2.tar.gz",
"platform": null,
"description": "# Odoo Lead Manager\n\nA comprehensive Python package for managing Odoo leads with advanced filtering capabilities and smart distribution algorithms.\n\n## Features\n\n- **Robust Odoo API Client**: Secure connection and authentication with Odoo instances\n- **Advanced Lead Filtering**: Multiple criteria including date ranges, web source IDs, status, and user assignments\n- **Smart Lead Distribution**: Intelligent algorithms for fair lead distribution based on user capacity and expected proportions\n- **Comprehensive Analytics**: Lead characteristics, user statistics, and distribution reports\n- **Export Capabilities**: DataFrame export for further analysis\n- **Well-Tested**: Extensive unit test coverage with mocking support\n\n## Installation\n\n### From Source\n```bash\npip install -e .\n```\n\n### Development Installation\n```bash\npip install -e \".[dev]\"\n```\n\n## Quick Start\n\n### 1. Command Line Interface (CLI)\n\nThe Odoo Lead Manager provides a comprehensive CLI for easy lead management:\n\n```bash\n# Install the package\npip install -e .\n\n# Check connection to Odoo\nodlm check\n\n# Configure credentials interactively\nodlm configure\n\n# Get leads with various filters\nodlm leads --status \"new\" --limit 50\nodlm leads --user \"Alice Smith\" --format csv --output alice_leads.csv\nodlm leads --date-from 2024-01-01 --date-to 2024-01-31 --count\n\n# Update lead assignments\nodlm update --ids \"1,2,3\" --user-name \"Bob Johnson\"\nodlm update --from-csv leads.csv --status \"in_progress\"\n\n# Count leads\nodlm count --status \"won\" --date-filter \"this_month\"\n\n# Query invoices\nodlm invoices --date-from 2024-01-01 --format csv --output invoices.csv\n\n# Join leads with invoice data\nodlm join --lead-status \"won\" --invoice-state \"paid\"\n```\n\n### 2. Python API Setup\n\n```python\nfrom odoo_lead_manager import OdooClient, LeadManager, SmartDistributor\n\n# Configure Odoo connection\nclient = OdooClient(\n host=\"your-odoo-server.com\",\n port=8069,\n database=\"your_database\",\n username=\"your_username\",\n password=\"your_password\"\n)\n\n# Initialize lead manager\nlead_manager = LeadManager(client)\n```\n\n### 2. Environment Variables\n\nYou can also use environment variables:\n\n```bash\nexport ODOO_HOST=your-odoo-server.com\nexport ODOO_PORT=8069\nexport ODOO_DB=your_database\nexport ODOO_USERNAME=your_username\nexport ODOO_PASSWORD=your_password\n```\n\nThen just use:\n```python\nclient = OdooClient()\n```\n\n## CLI Usage Examples\n\n### Basic Commands\n\n#### Connection and Configuration\n```bash\n# Test connection to Odoo\nodlm check\n\n# Interactive configuration setup\nodlm configure\n\n# Check with verbose output\nodlm check --verbose\n```\n\n#### Lead Management\n```bash\n# Get all leads in table format\nodlm leads --format table\n\n# Get new leads with limit\nodlm leads --status \"new\" --limit 50\n\n# Export leads to CSV\nodlm leads --format csv --output leads.csv\n\n# Get leads for specific user\nodlm leads --user \"Alice Smith\"\n\n# Get leads from date range\nodlm leads --date-from 2024-01-01 --date-to 2024-01-31\n\n# Count leads by status\nodlm count --status \"won\"\n```\n\n#### Lead Updates\n```bash\n# Assign specific leads to user\nodlm update --ids \"1,2,3\" --user-name \"Bob Johnson\"\n\n# Update leads from CSV file\nodlm update --from-csv leads.csv --user-name \"Alice Smith\"\n\n# Update status and assign closer\nodlm update --ids \"100,101,102\" --status \"in_progress\" --closer-name \"Senior Manager\"\n\n# Update leads from text file\nodlm update --from-file lead_ids.txt --status \"assigned\"\n```\n\n#### Advanced Filtering\n```bash\n# Date-based filtering\nodlm leads --date-filter \"last_30_days\"\nodlm leads --date-filter \"this_month\"\nodlm leads --date-filter \"older_than_2_months\"\n\n# Source-based filtering\nodlm leads --web-source-ids \"facebook_form,google_ads,website\"\n\n# Team and user filtering\nodlm leads --team \"Sales Team\" --user \"Alice\"\n\n# Campaign filtering\nodlm leads --campaign \"Summer Sale 2024\"\n```\n\n#### Analytics and Reporting\n```bash\n# Group leads by user and status\nodlm leads --group-by \"user_id,status\"\n\n# Pivot table analysis\nodlm leads --pivot-rows \"user_id\" --pivot-cols \"status\"\n\n# Export for analysis\nodlm leads --fields \"id,name,email,phone,user_id,status\" --format json --output analysis.json\n```\n\n#### Invoice Management\n```bash\n# Query invoices\nodlm invoices --date-from 2024-01-01 --limit 100\n\n# Export invoices to CSV\nodlm invoices --format csv --output invoices.csv\n\n# Filter by amount\nodlm invoices --amount-min 1000 --amount-max 5000\n\n# Filter by state\nodlm invoices --state \"paid\" --date-from 2024-01-01\n```\n\n#### Lead-Invoice Analysis\n```bash\n# Join leads with invoice data\nodlm join --lead-status \"won\" --invoice-state \"paid\"\n\n# Export conversion analysis\nodlm join --lead-date-from 2024-01-01 --format csv --output conversion_analysis.csv\n\n# Filter by user performance\nodlm join --lead-user \"Alice Smith\" --invoice-date-from 2024-01-01\n```\n\n### Comprehensive CLI Examples\n\n#### Lead Management Workflows\n\n**Daily Operations:**\n```bash\n# Morning lead review\nodlm leads --status \"new\" --limit 50 --format table\n\n# Assign new leads to sales team\nodlm update --from-csv morning_leads.csv --user-name \"Alice Smith\"\n\n# Check team performance\nodlm leads --user \"Alice Smith\" --date-filter \"this_month\" --group-by \"status\"\n```\n\n**Weekly Reporting:**\n```bash\n# Weekly lead summary\nodlm leads --date-filter \"last_7_days\" --group-by \"user_id,status\" --format csv --output weekly_report.csv\n\n# Source performance analysis\nodlm leads --date-filter \"last_7_days\" --pivot-rows \"web_source_id\" --pivot-cols \"status\"\n\n# Export for analysis\nodlm leads --date-filter \"last_7_days\" --fields \"id,name,email,phone,user_id,status,web_source_id\" --format json --output weekly_data.json\n```\n\n**Campaign Management:**\n```bash\n# Campaign lead assignment\nodlm update --query '{\"campaign_id.name\": \"Summer Sale 2024\", \"status\": \"new\"}' --user-name \"Campaign Team\"\n\n# Campaign performance\nodlm leads --campaign \"Summer Sale 2024\" --date-filter \"this_month\" --group-by \"status\"\n\n# Export campaign data\nodlm leads --campaign \"Summer Sale 2024\" --format csv --output summer_sale_leads.csv\n```\n\n#### Advanced Analytics\n\n**Sales Performance:**\n```bash\n# Individual salesperson performance\nodlm leads --user \"Alice Smith\" --date-filter \"this_month\" --pivot-rows \"status\" --pivot-cols \"web_source_id\"\n\n# Team comparison\nodlm leads --team \"Sales Team\" --date-filter \"this_month\" --group-by \"user_id,status\"\n\n# Conversion analysis\nodlm join --lead-status \"won\" --lead-date-from 2024-01-01 --format csv --output conversions.csv\n```\n\n**Revenue Analysis:**\n```bash\n# Invoice analysis\nodlm invoices --date-from 2024-01-01 --state \"paid\" --format csv --output revenue.csv\n\n# Lead-to-revenue mapping\nodlm join --lead-status \"won\" --invoice-state \"paid\" --lead-date-from 2024-01-01\n\n# Source ROI\nodlm join --lead-source \"Facebook\" --invoice-state \"paid\" --format csv --output facebook_roi.csv\n```\n\n#### Data Export and Integration\n\n**Automated Reports:**\n```bash\n# Daily CSV export\nodlm leads --date-filter \"today\" --format csv --output daily_leads_$(date +%Y%m%d).csv\n\n# Monthly JSON export for API integration\nodlm leads --date-filter \"this_month\" --format json --output monthly_data.json\n\n# User-specific exports\nodlm leads --user \"Alice Smith\" --date-filter \"this_month\" --format csv --output alice_monthly.csv\n```\n\n**Batch Processing:**\n```bash\n# Large dataset processing\nodlm leads --date-from 2024-01-01 --date-to 2024-12-31 --format csv --output yearly_data.csv\n\n# Incremental updates\nodlm update --from-csv batch_1.csv --user-name \"Team A\"\nodlm update --from-csv batch_2.csv --user-name \"Team B\"\n```\n\n#### Quality Assurance\n\n**Data Validation:**\n```bash\n# Check for unassigned leads\nodlm leads --status \"new\" --user \"\" --count\n\n# Validate lead quality\nodlm leads --status \"new\" --fields \"id,name,email,phone,web_source_id\" --limit 100\n\n# Review old leads\nodlm leads --date-filter \"older_than_2_months\" --status \"new\" --format table\n```\n\n**Error Handling:**\n```bash\n# Debug mode for troubleshooting\nodlm update --ids \"1,2,3\" --user-name \"Alice\" --debug\n\n# Quiet mode for automation\nodlm update --from-csv large_batch.csv --user-name \"Bob\" --quiet\n\n# Validation before update\nodlm leads --ids \"1,2,3\" --format table # Check leads exist first\n```\n\n## Python API Usage Examples\n\n### Fetching Leads\n\n#### Basic Lead Retrieval\n```python\n# Get all leads\nleads = lead_manager.get_leads()\n\n# Get leads with specific fields\nleads = lead_manager.get_leads(fields=[\"id\", \"name\", \"email\", \"status\"])\n\n# Get leads with limit and offset\nleads = lead_manager.get_leads(limit=50, offset=100)\n```\n\n#### Date Range Filtering\n```python\nfrom datetime import date\n\n# Get leads from January 2024\nleads = lead_manager.get_leads_by_date_range(\n start_date=date(2024, 1, 1),\n end_date=date(2024, 1, 31)\n)\n\n# Get leads after specific date\nleads = lead_manager.get_leads_by_date_range(\n start_date=date(2024, 1, 1)\n)\n```\n\n#### Web Source Filtering\n```python\n# Single source\nleads = lead_manager.get_leads_by_source(\"Website\")\n\n# Multiple sources\nleads = lead_manager.get_leads_by_source([\"Website\", \"Email Campaign\", \"Social Media\"])\n```\n\n#### Status Filtering\n```python\nfrom odoo_lead_manager.filters import LeadStatus\n\n# Single status\nleads = lead_manager.get_leads_by_status(\"new\")\n\n# Multiple statuses\nleads = lead_manager.get_leads_by_status([\"new\", \"in_progress\", \"won\"])\n\n# Using enum\nleads = lead_manager.get_leads_by_status([LeadStatus.NEW, LeadStatus.WON])\n```\n\n#### User Assignment Filtering\n```python\n# By user IDs\nleads = lead_manager.get_leads_by_users(user_ids=[1, 2, 3])\n\n# By user names\nleads = lead_manager.get_leads_by_users(user_names=[\"Alice Smith\", \"Bob Johnson\"])\n\n# By closer IDs\nleads = lead_manager.get_leads_by_users(closer_ids=[1, 2])\n\n# By open user IDs\nleads = lead_manager.get_leads_by_users(open_user_ids=[1, 2])\n\n# Combined filtering\nleads = lead_manager.get_leads_by_users(\n user_ids=[1, 2],\n closer_names=[\"Alice Smith\"],\n open_user_names=[\"Bob Johnson\"]\n)\n```\n\n### Advanced Filtering with LeadFilter\n\n```python\nfrom odoo_lead_manager.filters import LeadFilter\n\n# Complex filtering with chaining\nfilter_obj = LeadFilter() \\\n .by_date_range(\n start_date=date(2024, 1, 1),\n end_date=date(2024, 1, 31),\n field_name=\"create_date\"\n ) \\\n .by_status([\"new\", \"in_progress\"]) \\\n .by_web_source_ids([\"Website\", \"Email Campaign\"]) \\\n .by_user_assignments(user_ids=[1, 2, 3]) \\\n .by_customer_name(\"John\", exact=False) \\\n .by_email(\"@company.com\") \\\n .by_tags([\"VIP\", \"Hot Lead\"]) \\\n .limit(100) \\\n .offset(50) \\\n .order(\"create_date desc\")\n\nleads = lead_manager.get_leads(filter_obj)\n```\n\n### Lead Analysis and Summary\n\n```python\n# Get comprehensive lead summary\nsummary = lead_manager.get_lead_summary()\n\nprint(f\"Total leads: {summary['total_leads']}\")\nprint(f\"Statistics: {summary['statistics']}\")\nprint(f\"User assignments: {summary['user_assignments']}\")\nprint(f\"Source distribution: {summary['source_distribution']}\")\nprint(f\"Status distribution: {summary['status_distribution']}\")\nprint(f\"Geographic distribution: {summary['geographic_distribution']}\")\n\n# Export to DataFrame for analysis\nimport pandas as pd\ndf = lead_manager.export_to_dataframe(filter_obj)\nprint(df.head())\n```\n\n### Smart Lead Distribution\n\n#### Basic Setup\n```python\n# Initialize distributor\ndistributor = SmartDistributor()\n\n# Add users with their profiles\nusers = [\n UserProfile(\n user_id=1, \n name=\"Alice Smith\", \n current_leads=10, \n expected_percentage=40.0, \n max_capacity=50\n ),\n UserProfile(\n user_id=2, \n name=\"Bob Johnson\", \n current_leads=15, \n expected_percentage=35.0, \n max_capacity=40\n ),\n UserProfile(\n user_id=3, \n name=\"Carol Williams\", \n current_leads=5, \n expected_percentage=25.0, \n max_capacity=30\n )\n]\n\nfor user in users:\n distributor.add_user_profile(user)\n```\n\n#### Load Users from Odoo\n```python\n# Load existing users and their current lead counts\ndistributor.load_user_profiles_from_odoo(lead_manager)\n\n# Load expected proportions from Odoo table\ndistributor.load_proportions_from_odoo(lead_manager)\n```\n\n#### Distribute Leads\n```python\nfrom odoo_lead_manager.distribution import Lead\n\n# Prepare leads for distribution\nleads = [\n Lead(lead_id=101, name=\"Hot Lead A\", source_id=\"web\", priority=3),\n Lead(lead_id=102, name=\"Warm Lead B\", source_id=\"email\", priority=2),\n Lead(lead_id=103, name=\"Cold Lead C\", source_id=\"referral\", priority=1),\n]\n\n# Choose distribution strategy\ndistributor.set_distribution_strategy(DistributionStrategy.PROPORTIONAL)\n\n# Distribute leads\nassignments = distributor.distribute_leads(leads)\n\n# Apply assignments to Odoo\nfor user_id, lead_ids in assignments.items():\n lead_manager.update_lead_assignments(lead_ids, user_id=user_id)\n```\n\n#### Distribution Strategies\n```python\n# Available strategies:\nfrom odoo_lead_manager.distribution import DistributionStrategy\n\nstrategies = [\n DistributionStrategy.PROPORTIONAL, # Based on expected percentages\n DistributionStrategy.ROUND_ROBIN, # Equal rotation\n DistributionStrategy.LEAST_LOADED, # To users with fewest leads\n DistributionStrategy.WEIGHTED_RANDOM, # Random with percentage weights\n DistributionStrategy.CAPACITY_BASED, # Based on remaining capacity\n]\n\n# Change strategy\ndistributor.set_distribution_strategy(DistributionStrategy.LEAST_LOADED)\n```\n\n#### Distribution Reports\n```python\n# Get detailed distribution report\nreport = distributor.get_distribution_report()\n\nprint(f\"Total users: {report['total_users']}\")\nprint(f\"Active users: {report['active_users']}\")\n\nfor user_id, details in report['user_details'].items():\n print(f\"User {details['name']}: {details['current_leads']} leads\")\n print(f\" Expected: {details['expected_leads']}\")\n print(f\" Deviation: {details['deviation']}\")\n print(f\" Utilization: {details['utilization_rate']}%\")\n```\n\n### Save and Load Proportions\n\n```python\n# Save current proportions to Odoo table\ndistributor.save_proportions_to_odoo(lead_manager, \"lead_distribution_proportions\")\n\n# Load proportions from Odoo table\ndistributor.load_proportions_from_odoo(lead_manager, \"lead_distribution_proportions\")\n```\n\n## Configuration File\n\nCreate a `.env` file in your project root:\n\n```bash\n# Odoo Connection\nODOO_HOST=your-odoo-server.com\nODOO_PORT=8069\nODOO_DB=your_database\nODOO_USERNAME=your_username\nODOO_PASSWORD=your_password\n\n# Optional Settings\nODOO_PROTOCOL=jsonrpc\nODOO_TIMEOUT=120\n```\n\n## Testing\n\n### Run All Tests\n```bash\npython run_tests.py\n```\n\n### Run with Coverage\n```bash\npython run_tests.py --coverage\n```\n\n### Run Specific Tests\n```bash\npython run_tests.py --pattern \"test_lead*\"\npython run_tests.py --specific tests/test_filters.py::TestLeadFilter::test_by_date_range_both_dates\n```\n\n### Using pytest directly\n```bash\npytest tests/\npytest tests/ -v --cov=src/odoo_lead_manager\n```\n\n## CLI Reference\n\n### Available Commands\n\n#### `odlm check`\nTest connection to Odoo server and validate credentials.\n```bash\nodlm check [--verbose]\n```\n\n#### `odlm configure`\nInteractive setup of Odoo credentials.\n```bash\nodlm configure [--file .env] [--overwrite]\n```\n\n#### `odlm leads`\nGet leads with advanced filtering, grouping, and pivot capabilities.\n```bash\nodlm leads [OPTIONS]\n```\n\n**Key Options:**\n- `--status`: Filter by lead status (new, in_progress, won, lost, etc.)\n- `--date-from/--date-to`: Date range filtering\n- `--user`: Filter by assigned user name\n- `--team`: Filter by sales team name\n- `--source`: Filter by source name\n- `--web-source-ids`: Comma-separated web source names\n- `--format`: Output format (table, csv, json)\n- `--output`: Output file\n- `--group-by`: Group by columns\n- `--pivot-rows/--pivot-cols`: Pivot table analysis\n- `--count`: Count results only\n\n#### `odlm update`\nUpdate lead assignments, status, or other fields.\n```bash\nodlm update [OPTIONS]\n```\n\n**Key Options:**\n- `--ids`: Comma-separated list of lead IDs\n- `--from-csv/--from-tsv/--from-file`: Read IDs from files\n- `--user-name/--user-id`: Assign to user\n- `--closer-name/--closer-id`: Set closer\n- `--status`: Update lead status\n- `--model`: Odoo model to update (default: crm.lead)\n\n#### `odlm count`\nCount leads matching filter criteria.\n```bash\nodlm count [OPTIONS]\n```\n\n#### `odlm invoices`\nQuery invoice data from account.invoice model.\n```bash\nodlm invoices [OPTIONS]\n```\n\n**Key Options:**\n- `--date-from/--date-to`: Date range filtering\n- `--partner-id`: Filter by customer ID\n- `--state`: Filter by invoice state (draft, open, paid, cancel)\n- `--amount-min/--amount-max`: Amount range filtering\n- `--format`: Output format (table, csv, json)\n\n#### `odlm join`\nJoin leads with invoice data based on partner relationships.\n```bash\nodlm join [OPTIONS]\n```\n\n**Key Options:**\n- `--lead-date-from/--lead-date-to`: Lead date filtering\n- `--lead-status`: Filter leads by status\n- `--lead-user`: Filter leads by user\n- `--invoice-state`: Filter invoices by state\n- `--exclude-unmatched`: Exclude leads without invoices\n\n### Date Filter Examples\n\n```bash\n# Relative date filters\nodlm leads --date-filter \"today\"\nodlm leads --date-filter \"yesterday\"\nodlm leads --date-filter \"last_7_days\"\nodlm leads --date-filter \"last_30_days\"\nodlm leads --date-filter \"this_month\"\nodlm leads --date-filter \"older_than_2_months\"\n\n# Exact dates\nodlm leads --date-from 2024-01-01 --date-to 2024-01-31\n```\n\n### File Input Formats\n\n#### CSV/TSV Files\n- Must have 'id' column (or first column will be used)\n- Supports Odoo export format: `__export__.crm_lead_12345_abcdef123`\n\n#### Text Files\n- One ID per line\n- Supports comments with `#` prefix\n- Supports Odoo export format\n\n### Output Formats\n\n#### Table Format (Default)\nPretty-printed tables with grid formatting\n\n#### CSV Format\nStandard CSV output for spreadsheet applications\n\n#### JSON Format\nStructured JSON for API integration and data processing\n\n## Python API Reference\n\n### OdooClient\n- `connect()`: Establish connection to Odoo\n- `authenticate()`: Authenticate with credentials\n- `search_read()`: Search and read records\n- `search_count()`: Count matching records\n- `write()`: Update records\n- `create()`: Create new records\n- `unlink()`: Delete records\n\n### LeadFilter\n- `by_date_range()`: Filter by date range\n- `by_web_source_ids()`: Filter by web source IDs\n- `by_status()`: Filter by lead status\n- `by_user_assignments()`: Filter by user assignments\n- `by_customer_name()`: Filter by customer name\n- `by_email()`: Filter by email\n- `by_phone()`: Filter by phone\n- `by_tags()`: Filter by tags\n- `build()`: Build final filter configuration\n\n### LeadManager\n- `get_leads()`: Get leads with filters\n- `get_leads_by_date_range()`: Get leads by date range\n- `get_leads_by_source()`: Get leads by source\n- `get_leads_by_status()`: Get leads by status\n- `get_leads_by_users()`: Get leads by user assignments\n- `count_leads()`: Count matching leads\n- `get_lead_summary()`: Get comprehensive summary\n- `update_lead_assignments()`: Update lead assignments\n- `get_user_lead_counts()`: Get user lead counts\n- `export_to_dataframe()`: Export to pandas DataFrame\n\n### SmartDistributor\n- `add_user_profile()`: Add user profile\n- `remove_user_profile()`: Remove user profile\n- `update_user_current_leads()`: Update user lead count\n- `distribute_leads()`: Distribute leads among users\n- `get_distribution_report()`: Get distribution statistics\n- `load_user_profiles_from_odoo()`: Load users from Odoo\n- `save_proportions_to_odoo()`: Save proportions to Odoo\n- `load_proportions_from_odoo()`: Load proportions from Odoo\n\n## Troubleshooting\n\n### CLI Issues\n\n#### Connection Problems\n```bash\n# Test connection\nodlm check\n\n# Check with verbose output\nodlm check --verbose\n\n# Reconfigure credentials\nodlm configure\n```\n\n**Common Issues:**\n- Verify Odoo server is accessible\n- Check credentials and permissions\n- Ensure correct port and protocol\n- Check firewall settings\n\n#### Command Not Found\n```bash\n# Install in development mode\npip install -e .\n\n# Check installation\npip list | grep odoo-lead-manager\n```\n\n#### File Input Issues\n- **CSV Format**: Ensure file has 'id' column or first column contains IDs\n- **Text Files**: One ID per line, supports comments with `#`\n- **Odoo Export Format**: Supports `__export__.crm_lead_12345_abcdef123` format\n\n#### Update Command Issues\n- **Non-existent Lead IDs**: System validates all IDs against crm.lead model\n- **ID Validation**: Comprehensive search across all crm.lead records\n- **Model Flexibility**: Use `--model` parameter for different Odoo models\n- **User Resolution**: Automatic name-to-ID resolution with error reporting\n\n### Python API Issues\n\n#### Import Issues\n- Install package in development mode: `pip install -e .`\n- Check Python path includes src directory\n\n#### Test Failures\n- Ensure all dependencies are installed: `pip install -r requirements.txt`\n- Check for environment variable conflicts\n- Verify mock setup in test configuration\n\n### Common Error Messages\n\n#### \"Failed to connect to Odoo\"\n- Check server is running\n- Verify host and port\n- Test network connectivity\n\n#### \"User not found\"\n- Use exact user names\n- Check user exists in Odoo\n- Use `odlm users --list` to see available users\n\n#### \"No leads found\"\n- Verify filter criteria\n- Check date formats (YYYY-MM-DD)\n- Ensure status values are correct\n\n#### \"Permission denied\"\n- Check user permissions in Odoo\n- Verify database access rights\n- Ensure proper authentication\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new functionality\n4. Ensure all tests pass\n5. Submit a pull request\n\n## License\n\nMIT License - see LICENSE file for details.\n\n## Support\n\nFor issues and questions:\n- Check the troubleshooting section\n- Review the test examples\n- Open an issue on GitHub\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Comprehensive Python package for managing Odoo leads with smart distribution",
"version": "1.3.2",
"project_urls": {
"Bug Tracker": "https://github.com/example/odoo-lead-manager/issues",
"Documentation": "https://github.com/example/odoo-lead-manager#readme",
"Homepage": "https://github.com/example/odoo-lead-manager",
"Repository": "https://github.com/example/odoo-lead-manager"
},
"split_keywords": [
"odoo",
" lead",
" management",
" distribution",
" crm",
" sales",
" automation"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "506d64e0d7eb0ba77600ca1abbf57d9a9ed3049d334a27c1ffc249f50a41f527",
"md5": "8c224ca0e624b070ff3a9ed0387e6f31",
"sha256": "e147298b3b45f44e826b74e61d705dc14913b32a10b62e549b81be7775cad645"
},
"downloads": -1,
"filename": "odoo_lead_manager-1.3.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8c224ca0e624b070ff3a9ed0387e6f31",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 81820,
"upload_time": "2025-08-11T17:16:06",
"upload_time_iso_8601": "2025-08-11T17:16:06.352128Z",
"url": "https://files.pythonhosted.org/packages/50/6d/64e0d7eb0ba77600ca1abbf57d9a9ed3049d334a27c1ffc249f50a41f527/odoo_lead_manager-1.3.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fa3db029c1873654ee1412f2c629130c09e9974a13b295bec0787729b22fbfe0",
"md5": "5758fe0c7ccf0c34f6cfca8a49a5efdf",
"sha256": "a727d4826116bab51462457c6d6cd181c931cc5f2caccefb7a880f72e61db8de"
},
"downloads": -1,
"filename": "odoo_lead_manager-1.3.2.tar.gz",
"has_sig": false,
"md5_digest": "5758fe0c7ccf0c34f6cfca8a49a5efdf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 555191,
"upload_time": "2025-08-11T17:16:07",
"upload_time_iso_8601": "2025-08-11T17:16:07.657565Z",
"url": "https://files.pythonhosted.org/packages/fa/3d/b029c1873654ee1412f2c629130c09e9974a13b295bec0787729b22fbfe0/odoo_lead_manager-1.3.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-11 17:16:07",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "example",
"github_project": "odoo-lead-manager",
"github_not_found": true,
"lcname": "odoo-lead-manager"
}