odoo-lead-manager


Nameodoo-lead-manager JSON
Version 1.3.2 PyPI version JSON
download
home_pagehttps://github.com/example/odoo-lead-manager
SummaryComprehensive Python package for managing Odoo leads with smart distribution
upload_time2025-08-11 17:16:07
maintainerNone
docs_urlNone
authorLead Management Team
requires_python>=3.8
licenseMIT
keywords odoo lead management distribution crm sales automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.54733s