diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8cbe373 --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +# Azure DevOps Configuration +AZURE_DEVOPS_ORG=your-organization-name +AZURE_DEVOPS_PAT=your-personal-access-token + +# Logic App URL for work item fetching (REQUIRED for --query-work-items) +# Replace with your actual Azure Logic App HTTP trigger URL +# The Logic App should accept POST requests with body: {"fromDate": "YYYY-MM-DD", "toDate": "YYYY-MM-DD", "emails": ["email1", "email2"]} +# And return: {"ResultSets": {"Table1": [{"WorkItemId": 123, "AssignedToUser": "user@domain.com", "Title": "...", "StartDate": "...", "TargetDate": "...", "OriginalEstimate": 5.0}]}} +AZURE_LOGIC_APP_URL=https://prod-xx.region.logic.azure.com:443/workflows/YOUR_WORKFLOW_ID/triggers/When_an_HTTP_request_is_received/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FWhen_an_HTTP_request_is_received%2Frun&sv=1.0&sig=YOUR_SIGNATURE + +# Webhook URLs (optional, for service hooks) +AZURE_DEVOPS_WORKITEM_WEBHOOK_URL=https://your-webhook-url/workitem +AZURE_DEVOPS_BUILD_WEBHOOK_URL=https://your-webhook-url/build +AZURE_DEVOPS_RELEASE_WEBHOOK_URL=https://your-webhook-url/release diff --git a/.github/workflows/README.md b/.github/workflows/README.md index bab6f2d..fa6a4e8 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,8 +1,28 @@ # GitHub Actions Workflow Documentation -## Monthly Developer Report Workflow +## Available Workflows -Automated workflow that generates developer performance reports from Azure DevOps work items. +### 1. 📸 Daily Work Item Snapshot (`daily-snapshot.yml`) + +**NEW!** Automated workflow that generates simplified daily snapshots with cumulative month-to-date data. + +**Purpose:** Lightweight CSV reports for automated tracking via Logic App → SharePoint workflows. + +**Schedule:** Runs daily at 01:00 UTC (7:00 PM CST previous day) + +**Output Format:** +- Filename: `daily_snapshot_november.csv` (auto-switches monthly) +- 12 columns: ID, Title, Project, Assigned To, State, Type, Dates, Hours +- Contains cumulative data from 1st of month to current day +- File overwrites daily - one file per month + +**Performance:** 40-60% faster than full query (10-40 seconds for 100-400 items) + +--- + +### 2. 📊 Monthly Developer Report (`monthly-developer-report.yml`) + +Automated workflow that generates comprehensive developer performance reports with KPIs from Azure DevOps work items. ### Features @@ -17,16 +37,18 @@ Automated workflow that generates developer performance reports from Azure DevOp ### 1. Configure GitHub Secrets -The workflow requires two secrets to be configured in the `main` environment: +Both workflows require the following secrets to be configured in the `main` environment: 1. Go to your GitHub repository 2. Navigate to **Settings** → **Environments** → **main** (create if it doesn't exist) 3. Add the following secrets: -| Secret Name | Description | Example | -|-------------|-------------|---------| -| `AZURE_DEVOPS_ORG` | Your Azure DevOps organization name | `MyCompany` | -| `AZURE_DEVOPS_PAT` | Personal Access Token with Work Items: Read permission | `a1b2c3d4...` | +| Secret Name | Description | Required For | Example | +|-------------|-------------|--------------|---------| +| `AZURE_DEVOPS_ORG` | Azure DevOps organization name | Both workflows | `MyCompany` | +| `AZURE_DEVOPS_PAT` | Personal Access Token (Work Items: Read) | Both workflows | `a1b2c3d4...` | +| `AZURE_LOGIC_APP_URL` | Logic App URL for work item fetching | Both workflows | `https://prod-10...` | +| `SHAREPOINT_LOGIC_APP_URL` | Logic App URL for SharePoint upload | Daily Snapshot (optional) | `https://prod-11...` | **To create a PAT:** - Go to Azure DevOps → User Settings → Personal Access Tokens @@ -44,7 +66,51 @@ The workflow requires two secrets to be configured in the `main` environment: ## Usage -### Automatic Monthly Reports +### Daily Snapshot Workflow + +#### Automatic Daily Execution + +The workflow runs automatically every day at **01:00 UTC** and: +1. Generates month-to-date cumulative snapshot +2. Creates/overwrites `daily_snapshot_.csv` +3. Uploads to GitHub Actions artifacts (30-day retention) +4. Optionally uploads to SharePoint via Logic App + +**Current Month File:** +- November: `daily_snapshot_november.csv` +- December: `daily_snapshot_december.csv` +- Auto-switches on 1st of each month + +#### Manual Trigger + +1. Go to **Actions** → **Daily Work Item Snapshot** +2. Click **Run workflow** +3. Configure options: + - **Snapshot mode:** + - `month-to-date` (recommended): Cumulative from 1st to today + - `yesterday`: Previous day only + - `today`: Current day up to now + - **Assigned to:** Filter by developers (optional, comma-separated) + +#### Example Use Cases + +**Test the snapshot:** +``` +Snapshot mode: yesterday +Assigned to: (leave empty for all users) +``` + +**Generate specific developer snapshot:** +``` +Snapshot mode: month-to-date +Assigned to: Carlos Vazquez,Diego Lopez +``` + +--- + +### Monthly Report Workflow + +#### Automatic Monthly Reports The workflow automatically runs on the **30th of each month at 23:00 UTC** and generates a report for: - **Start Date**: 1st of the current month diff --git a/.github/workflows/daily-snapshot.yml b/.github/workflows/daily-snapshot.yml new file mode 100644 index 0000000..ac12bcd --- /dev/null +++ b/.github/workflows/daily-snapshot.yml @@ -0,0 +1,167 @@ +name: Daily Work Item Snapshot + +on: + # Scheduled to run daily at 09:00 Mexico City time + schedule: + - cron: "0 13 * * *" + + # Manual trigger for testing + workflow_dispatch: + inputs: + snapshot_mode: + description: "Snapshot mode" + required: false + type: choice + options: + - month-to-date + - yesterday + - today + default: "month-to-date" + assigned_to: + description: "Comma-separated list of developers (leave empty for all)" + required: false + type: string + default: "" + +jobs: + generate-snapshot: + runs-on: ubuntu-latest + environment: main + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "pip" + + - name: Install dependencies + run: | + pip install -r requirements.txt + + - name: Generate daily snapshot + env: + AZURE_DEVOPS_ORG: ${{ secrets.AZURE_DEVOPS_ORG }} + AZURE_DEVOPS_PAT: ${{ secrets.AZURE_DEVOPS_PAT }} + AZURE_LOGIC_APP_URL: ${{ secrets.AZURE_LOGIC_APP_URL }} + run: | + # Determine snapshot mode + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + MODE="${{ inputs.snapshot_mode }}" + else + # Default for scheduled runs: month-to-date + MODE="month-to-date" + fi + + # Build the command + CMD="python entry_points/main.py --daily-snapshot --snapshot-mode ${MODE}" + + # Add assigned_to parameter if provided + if [ -n "${{ inputs.assigned_to }}" ]; then + CMD="${CMD} --assigned-to \"${{ inputs.assigned_to }}\"" + fi + + echo "Executing: ${CMD}" + eval $CMD + + - name: Identify generated snapshot file + id: file + run: | + # Find the generated snapshot file + if [ -f "daily_snapshot_november.csv" ]; then + FILE="daily_snapshot_november.csv" + elif [ -f "daily_snapshot_december.csv" ]; then + FILE="daily_snapshot_december.csv" + elif [ -f "daily_snapshot_january.csv" ]; then + FILE="daily_snapshot_january.csv" + elif [ -f "daily_snapshot_february.csv" ]; then + FILE="daily_snapshot_february.csv" + elif [ -f "daily_snapshot_march.csv" ]; then + FILE="daily_snapshot_march.csv" + elif [ -f "daily_snapshot_april.csv" ]; then + FILE="daily_snapshot_april.csv" + elif [ -f "daily_snapshot_may.csv" ]; then + FILE="daily_snapshot_may.csv" + elif [ -f "daily_snapshot_june.csv" ]; then + FILE="daily_snapshot_june.csv" + elif [ -f "daily_snapshot_july.csv" ]; then + FILE="daily_snapshot_july.csv" + elif [ -f "daily_snapshot_august.csv" ]; then + FILE="daily_snapshot_august.csv" + elif [ -f "daily_snapshot_september.csv" ]; then + FILE="daily_snapshot_september.csv" + elif [ -f "daily_snapshot_october.csv" ]; then + FILE="daily_snapshot_october.csv" + else + # Fallback: find any daily_snapshot_*.csv file + FILE=$(ls -t daily_snapshot_*.csv 2>/dev/null | head -1) + fi + + if [ -z "$FILE" ]; then + echo "Error: No snapshot file found" + exit 1 + fi + + echo "snapshot_file=${FILE}" >> $GITHUB_OUTPUT + echo "Found snapshot file: ${FILE}" + + - name: Upload snapshot to artifacts + uses: actions/upload-artifact@v4 + with: + name: daily-snapshot-${{ steps.file.outputs.snapshot_file }} + path: ${{ steps.file.outputs.snapshot_file }} + retention-days: 30 + + # Optional: Upload to SharePoint via Logic App + - name: Upload to SharePoint + if: success() + run: | + curl -f -S -X POST "${{ secrets.SHAREPOINT_LOGIC_APP_URL }}" \ + -H "Content-Type: text/csv; charset=utf-8" \ + -H "x-file-name: ${{ steps.file.outputs.snapshot_file }}" \ + --data-binary "@${{ steps.file.outputs.snapshot_file }}" || { + echo "Error: Failed to upload to SharePoint" + exit 1 + } + + - name: Create snapshot summary + run: | + echo "## Daily Work Item Snapshot Generated" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Snapshot File:** \`${{ steps.file.outputs.snapshot_file }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Show file details + if [ -f "${{ steps.file.outputs.snapshot_file }}" ]; then + SIZE=$(du -h "${{ steps.file.outputs.snapshot_file }}" | cut -f1) + LINES=$(wc -l < "${{ steps.file.outputs.snapshot_file }}") + ITEMS=$((LINES - 1)) + + echo "**File Size:** ${SIZE}" >> $GITHUB_STEP_SUMMARY + echo "**Work Items:** ${ITEMS}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Calculate totals + ACTIVE_HOURS=$(awk -F',' 'NR>1 {sum+=$11} END {printf "%.2f", sum}' "${{ steps.file.outputs.snapshot_file }}") + BLOCKED_HOURS=$(awk -F',' 'NR>1 {sum+=$12} END {printf "%.2f", sum}' "${{ steps.file.outputs.snapshot_file }}") + + echo "**Cumulative Hours:**" >> $GITHUB_STEP_SUMMARY + echo "- Active: ${ACTIVE_HOURS} hours" >> $GITHUB_STEP_SUMMARY + echo "- Blocked: ${BLOCKED_HOURS} hours" >> $GITHUB_STEP_SUMMARY + fi + + - name: Notify on failure + if: failure() + run: | + echo "## ⚠️ Daily Snapshot Failed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The daily snapshot generation failed. Please check the logs for details." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**Common Issues:**" >> $GITHUB_STEP_SUMMARY + echo "- Azure DevOps credentials expired" >> $GITHUB_STEP_SUMMARY + echo "- Logic App URL not configured" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + diff --git a/.github/workflows/monthly-developer-report.yml b/.github/workflows/monthly-developer-report.yml index 16064a1..2fcf0d6 100644 --- a/.github/workflows/monthly-developer-report.yml +++ b/.github/workflows/monthly-developer-report.yml @@ -3,24 +3,24 @@ name: Monthly Developer Report on: # Scheduled to run on the 30th of every month at 23:00 UTC schedule: - - cron: '0 23 30 * *' + - cron: "0 23 30 * *" # Manual trigger with customizable date range workflow_dispatch: inputs: start_date: - description: 'Start date (YYYY-MM-DD)' + description: "Start date (YYYY-MM-DD)" required: true type: string end_date: - description: 'End date (YYYY-MM-DD)' + description: "End date (YYYY-MM-DD)" required: true type: string assigned_to: - description: 'Comma-separated list of developers (leave empty for all)' + description: "Comma-separated list of developers (leave empty for all)" required: false type: string - default: '' + default: "" jobs: generate-report: @@ -34,8 +34,8 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.11' - cache: 'pip' + python-version: "3.11" + cache: "pip" - name: Install dependencies run: | @@ -77,6 +77,7 @@ jobs: env: AZURE_DEVOPS_ORG: ${{ secrets.AZURE_DEVOPS_ORG }} AZURE_DEVOPS_PAT: ${{ secrets.AZURE_DEVOPS_PAT }} + AZURE_LOGIC_APP_URL: ${{ secrets.AZURE_LOGIC_APP_URL }} run: | # Determine which developers to use if [ -n "${{ inputs.assigned_to }}" ]; then @@ -91,7 +92,6 @@ jobs: CMD="python run.py --query-work-items \ --start-date ${{ steps.dates.outputs.start_date }} \ --end-date ${{ steps.dates.outputs.end_date }} \ - --optimized \ --export-csv developer_report_${{ steps.dates.outputs.filename_suffix }}.csv" # Add assigned_to parameter @@ -106,9 +106,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: developer-report-${{ steps.dates.outputs.filename_suffix }} - path: | - developer_report_${{ steps.dates.outputs.filename_suffix }}.csv - developer_report_${{ steps.dates.outputs.filename_suffix }}_developer_summary.csv + path: developer_report_${{ steps.dates.outputs.filename_suffix }}*.csv retention-days: 90 - name: Create report summary diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8397627 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,23 @@ +# Repository Guidelines + +## Project Structure & Module Organization +Core logic resides in `classes/`: `WorkItemOperations` handles analytics queries, `AzureDevOpsProjectOperations` covers project metadata, and `commands.py` wires CLI actions. Invoke the tool through `entry_points/main.py` (or the wrapper `run.py`). Defaults live in `config/` (`config.py`, `azure_devops_config.json`), supporting utilities in `helpers/`, reference docs in `documentation/`, and reusable SQL in `sql/`. CSV exports default to the repo root unless `--export-csv` points elsewhere. + +## Build, Test, and Development Commands +- `python -m venv .venv && source .venv/bin/activate` — set up an isolated environment. +- `pip install -r requirements.txt` — install dependencies (requests, azure-devops SDK, dotenv, pyodbc, azure-identity). +- `python run.py --help` or `--explain` — review supported flags and command descriptions. +- `python run.py --list-projects` — smoke-test connectivity to the organization. +- `python run.py --query-work-items --assigned-to "Jane Doe" --start-date "2024-10-01" --end-date "2024-10-31" --export-csv reports/october.csv` — representative analytics run with CSV output. + +## Coding Style & Naming Conventions +Follow standard Python style: four-space indentation, snake_case for functions and variables, PascalCase for classes, and module docstrings when modules have side effects. Prefer explicit imports from `classes` modules so CLI wiring stays readable. When extending commands, mirror the parser patterns in `entry_points/main.py` and keep user-facing logging concise. + +## Testing Guidelines +No automated suite exists yet; validate changes by running representative CLI commands against a non-production Azure DevOps organization. Exercise project discovery (`--list-projects`, `--create-hooks-for-filtered-projects`) and analytics flows (`--query-work-items`, toggling `--optimized`). Capture CSV or terminal summaries to confirm metrics, and isolate reusable logic into functions or classes to keep future unit tests straightforward. + +## Commit & Pull Request Guidelines +Recent commits use short, imperative subjects (for example, “Add developer summary CSV and SQL queries for estimated hours”). Keep subjects under 72 characters, expand on context and risk in the body, and reference Azure Boards items when applicable. Pull requests should describe the scenario, list touched commands or config files, attach sample output snippets or sanitized CSVs, and bundle documentation updates when behavior changes. + +## Configuration & Security Tips +Store secrets in `.env` with `AZURE_DEVOPS_ORG` and `AZURE_DEVOPS_PAT`; never commit PATs or per-user overrides. Use `config/azure_devops_config.json` for shared defaults but keep credentials in environment variables. When exporting reports, route them to a dedicated folder and scrub personally identifiable information before sharing. diff --git a/LOGIC_APP_MIGRATION.md b/LOGIC_APP_MIGRATION.md new file mode 100644 index 0000000..3a9382d --- /dev/null +++ b/LOGIC_APP_MIGRATION.md @@ -0,0 +1,288 @@ +# Logic App Migration Guide + +## Overview + +The Azure DevOps CLI Tool has been refactored to use Azure Logic App (Fabric Data Warehouse) as the primary source for work item data. This replaces the previous WIQL/Analytics API approach. + +## What Changed + +### Before (Legacy) +- Used Azure DevOps WIQL queries to fetch work items +- Required project discovery and complex filtering logic +- Multiple API calls for work item details +- Flags: `--optimized`, `--ultra-optimized`, `--all-projects`, `--project-names`, etc. + +### After (Current) +- Uses Azure Logic App with Fabric Data Warehouse as single source +- Simplified workflow: date range + emails → work items +- Direct work item data with estimates from warehouse +- Required flags: `--start-date`, `--end-date` +- Optional: `--assigned-to` (names or emails) + +## New Workflow + +### 1. Setup + +**Create `.env` file:** +```bash +cp .env.example .env +``` + +**Edit `.env` and set:** +```bash +AZURE_LOGIC_APP_URL=https://prod-xx.region.logic.azure.com:443/workflows/YOUR_WORKFLOW_ID/... +``` + +**Verify `user_email_mapping.json` exists:** +```json +{ + "Carlos Vazquez": "carlos.vazquez@inbest.cloud", + "Diego Lopez": "diego.lopez@inbest.cloud" +} +``` + +### 2. Query Work Items + +**Basic usage (all users):** +```bash +python run.py --query-work-items \ + --start-date 2025-10-01 \ + --end-date 2025-10-31 \ + --export-csv reports/october.csv +``` + +**Specific users by name:** +```bash +python run.py --query-work-items \ + --start-date 2025-10-01 \ + --end-date 2025-10-31 \ + --assigned-to "Carlos Vazquez,Diego Lopez" +``` + +**Specific users by email:** +```bash +python run.py --query-work-items \ + --start-date 2025-10-01 \ + --end-date 2025-10-31 \ + --assigned-to "carlos.vazquez@inbest.cloud" +``` + +**Without efficiency calculations (faster):** +```bash +python run.py --query-work-items \ + --start-date 2025-10-01 \ + --end-date 2025-10-31 \ + --no-efficiency +``` + +## Architecture + +### High-Level Flow + +``` +1. CLI parses arguments (--start-date, --end-date, --assigned-to) +2. Resolve user names → emails using user_email_mapping.json +3. Call Logic App with POST: {fromDate, toDate, emails[]} +4. Parse ResultSets.Table1 → work items list +5. For each work item: fetch DevOps activity log (revisions) +6. Calculate productivity time using existing efficiency calculator +7. Generate CSVs and terminal summaries +``` + +### Data Flow + +``` +Logic App (Fabric) → ResultSets.Table1 + ↓ +[{WorkItemId, AssignedToUser, Title, StartDate, TargetDate, OriginalEstimate}] + ↓ +Deduplicate by (WorkItemId, AssignedToUser) + ↓ +For each work item: Fetch Azure DevOps activity log + ↓ +Calculate efficiency metrics (active time, fair efficiency, delivery score) + ↓ +Generate KPIs and export CSVs +``` + +### Components + +#### 1. Logic App Client (`helpers/logic_app_client.py`) +- HTTP POST to Logic App +- Retry logic with exponential backoff (3 attempts) +- 60s timeout +- Request format: `{fromDate, toDate, emails[]}` +- Response format: `{ResultSets: {Table1: [...]}}` + +#### 2. Email Resolution (`helpers/email_mapping.py`) +- Load `user_email_mapping.json` +- Resolve names → emails +- Support direct email input +- Warn about unknown names + +#### 3. Timezone Utilities (`helpers/timezone_utils.py`) +- Convert dates to America/Mexico_City timezone +- Date range: `from_date 00:00:00` to `to_date 23:59:59` (Mexico City) +- DevOps timestamps (UTC) converted for comparison + +#### 4. Work Item Processing (`classes/WorkItemOperations.py`) +- `get_work_items_from_logic_app()`: Main entry point +- `_process_logic_app_work_items()`: Deduplicate and standardize +- `_fetch_activity_logs_and_calculate_efficiency()`: Get revisions and calculate metrics +- Reuses existing efficiency calculator logic + +## Configuration + +### Environment Variables + +| Variable | Required | Description | +|----------|----------|-------------| +| `AZURE_DEVOPS_ORG` | Yes | Azure DevOps organization name | +| `AZURE_DEVOPS_PAT` | Yes | Personal access token | +| `AZURE_LOGIC_APP_URL` | **Yes** | Logic App HTTP trigger URL | + +### Configuration Files + +| File | Required | Description | +|------|----------|-------------| +| `user_email_mapping.json` | **Yes** | Name-to-email mapping for user resolution | +| `config/azure_devops_config.json` | Yes | Efficiency scoring configuration | + +## Logic App Contract + +### Request Format + +```json +{ + "fromDate": "YYYY-MM-DD", + "toDate": "YYYY-MM-DD", + "emails": ["user1@domain.com", "user2@domain.com"] +} +``` + +### Response Format + +```json +{ + "ResultSets": { + "Table1": [ + { + "WorkItemId": 42964, + "AssignedToUser": "Carlos Vazquez", + "Title": "Implement feature X", + "StartDate": "2025-10-01T00:00:00Z", + "TargetDate": "2025-10-15T00:00:00Z", + "OriginalEstimate": 8.0 + } + ] + } +} +``` + +**Alternative format (body-wrapped):** +```json +{ + "body": { + "ResultSets": { + "Table1": [...] + } + } +} +``` + +## Error Handling + +### Missing Logic App URL +``` +❌ Missing AZURE_LOGIC_APP_URL environment variable. +Please add your Logic App URL to the .env file: +AZURE_LOGIC_APP_URL=https://prod-xx.region.logic.azure.com:443/... +``` + +### Missing Date Arguments +``` +❌ Error: --start-date and --end-date are required for Logic App flow + Example: --start-date 2025-10-01 --end-date 2025-10-31 +``` + +### Unknown User Names +``` +⚠️ Could not resolve 2 name(s): John Doe, Jane Smith + Available names in user_email_mapping.json: Carlos Vazquez, Diego Lopez, ... +``` + +### Logic App Timeout +``` +❌ Failed to fetch work items from Logic App: Request timeout after 60s +Retrying in 2 seconds... +``` + +## Migration Checklist + +- [ ] Set `AZURE_LOGIC_APP_URL` in `.env` file +- [ ] Verify `user_email_mapping.json` contains all required users +- [ ] Update scripts/workflows to use new required flags: `--start-date`, `--end-date` +- [ ] Remove usage of legacy flags: `--optimized`, `--ultra-optimized`, `--project-names`, `--all-projects` +- [ ] Test with sample date range +- [ ] Compare output CSVs with previous runs for sanity check + +## Outputs + +Same as before: +- **Detailed CSV**: `{filename}_detailed.csv` - All work items with efficiency metrics +- **Developer Summary CSV**: `{filename}_developer_summary.csv` - Per-developer aggregated metrics +- **Terminal output**: KPIs, bottlenecks, work item summaries + +## Performance + +- **Logic App fetch**: ~2-5s for 100 work items +- **Email resolution**: <0.1s +- **Activity log fetching**: Parallel processing (default: 10 workers) +- **Efficiency calculation**: ~0.1s per work item +- **Total**: ~10-30s for typical monthly query (50-200 work items) + +## Troubleshooting + +### Issue: "Logic App client not initialized" +**Solution**: Set `AZURE_LOGIC_APP_URL` in `.env` file + +### Issue: "No valid emails resolved" +**Solution**: Check `user_email_mapping.json` exists and contains valid mappings + +### Issue: "Failed to fetch from Logic App" +**Solution**: +1. Verify Logic App URL is correct +2. Test Logic App with Postman/curl +3. Check network connectivity +4. Review Azure Logic App logs + +### Issue: "No work items found" +**Solution**: +1. Verify date range is correct +2. Check user emails are correct +3. Confirm Logic App query returns data for this period + +## Legacy Code Removal + +The following have been removed: +- `build_wiql_query()` - No longer used +- `execute_wiql_query()` - Replaced by Logic App +- `execute_optimized_wiql_query()` - Replaced by Logic App +- `_execute_organization_wiql_optimized()` - Replaced by Logic App +- Project discovery logic for work item queries +- Analytics API integration +- `--optimized` flag +- `--ultra-optimized` flag +- `--all-projects` flag +- `--project-names` flag +- `--max-projects` flag + +These methods and flags are now marked as legacy or removed entirely. + +## Support + +For issues or questions: +1. Check this migration guide +2. Review error messages and troubleshooting section +3. Verify Logic App response format matches contract +4. Check Azure Logic App run history for failures diff --git a/OPTIMIZED_USAGE_EXAMPLES.md b/OPTIMIZED_USAGE_EXAMPLES.md index af0016f..f0d04e2 100644 --- a/OPTIMIZED_USAGE_EXAMPLES.md +++ b/OPTIMIZED_USAGE_EXAMPLES.md @@ -20,7 +20,7 @@ ## 🚀 Usage Examples python run.py --query-work-items --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hanz Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura" --start-date "2025-08-01" --end-date "2025-08-31" --optimized --export-csv "august_results.csv" -python run.py --query-work-items --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hans Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura, Andrés Escobedo, Alvaro Torres, Pablo Ruiz, Sebastián Rojas, Fernando Hernández" --start-date "2025-09-01" --end-date "2025-09-30" --optimized --export-csv "september_results.csv" +python run.py --query-work-items --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hans Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura, Andrés Escobedo, Alvaro Torres, Pablo Ruiz, Sebastián Rojas, Fernando Hernández, Daniel Reyes" --start-date "2025-10-01" --end-date "2025-10-31" --optimized --export-csv "october_test_hours.csv" python run.py --query-work-items --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hans Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura, Andrés Escobedo, Alvaro Torres, Pablo Ruiz, Sebastián Rojas, Fernando Hernández, Daniel Reyes" --start-date "2025-09-01" --end-date "2025-09-30" --optimized --export-csv "september_results_final.csv" diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..8895435 --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,114 @@ +# Quick Start Guide + +Get up and running in 5 minutes. + +## Prerequisites + +- Python 3.7+ +- Azure DevOps organization access +- Personal Access Token (PAT) with `Work Items: Read` permission + +## Setup + +### 1. Install Dependencies + +```bash +pip install -r requirements.txt +``` + +### 2. Configure Credentials + +Create a `.env` file in the project root: + +```plaintext +AZURE_DEVOPS_ORG=YourOrganizationName +AZURE_DEVOPS_PAT=your_personal_access_token +``` + +**To create a PAT:** +1. Go to Azure DevOps > User Settings > Personal Access Tokens +2. Click "New Token" +3. Set scope to `Work Items: Read` +4. Copy token to `.env` file + +### 3. Verify Setup + +```bash +python run.py --list-projects +``` + +If you see your projects, you're ready. + +--- + +## Common Commands + +### Generate Monthly Developer Report + +```bash +python run.py --query-work-items \ + --assigned-to "Developer Name" \ + --start-date "2025-01-01" \ + --end-date "2025-01-31" \ + --export-csv "january_report.csv" +``` + +Creates two files: +- `january_report.csv` - Detailed work item data +- `january_report_developer_summary.csv` - Developer KPI summary + +### Query Multiple Developers + +```bash +python run.py --query-work-items \ + --assigned-to "Dev1,Dev2,Dev3" \ + --start-date "2025-01-01" \ + --end-date "2025-01-31" \ + --export-csv "team_report.csv" +``` + +### List Projects + +```bash +python run.py --list-projects +``` + +--- + +## Understanding Output + +The developer summary CSV includes: + +| Metric | Description | +|--------|-------------| +| Overall Developer Score | Weighted combination of all metrics | +| Average Efficiency % | Productivity vs estimated time | +| Average Delivery Score | On-time performance (60-130) | +| Completion Rate % | Tasks completed vs assigned | +| On-Time Delivery % | Completed by target date | + +--- + +## GitHub Actions (Automated Reports) + +The tool includes workflows for automated reporting: + +- **Daily Snapshot** - Runs at 9:00 AM Mexico City time +- **Monthly Report** - Runs on the 30th of each month + +Trigger manually from GitHub Actions tab. + +--- + +## Get Help + +```bash +python run.py --explain +``` + +--- + +## Next Steps + +- **Customize scoring**: See [documentation/SCORING_PARAMETERS.md](documentation/SCORING_PARAMETERS.md) +- **Full documentation**: See [documentation/](documentation/) diff --git a/classes/WorkItemOperations.py b/classes/WorkItemOperations.py index 1f3c311..43124ea 100644 --- a/classes/WorkItemOperations.py +++ b/classes/WorkItemOperations.py @@ -3,16 +3,19 @@ from classes.project_discovery import ProjectDiscovery from config.config_loader import ConfigLoader from helpers.fabric_logic_app_helper import create_fabric_helper +from helpers.logic_app_client import create_logic_app_client +from helpers.env_loader import get_logic_app_url, EnvironmentError +from helpers.email_mapping import resolve_emails +from helpers.timezone_utils import get_date_boundaries_mexico_city from datetime import datetime, timedelta import json -from typing import List, Dict, Optional, Any +from typing import List, Dict, Optional, Any, Tuple import csv import os -from urllib.parse import quote import concurrent.futures import time import requests -from typing import Tuple +import logging class WorkItemOperations(AzureDevOps): @@ -22,10 +25,13 @@ class WorkItemOperations(AzureDevOps): def __init__(self, organization=None, personal_access_token=None, scoring_config=None, config_file=None): super().__init__(organization, personal_access_token) - + + # Initialize logger + self.logger = logging.getLogger(__name__) + # Initialize configuration loader self.config_loader = ConfigLoader(config_file or "config/azure_devops_config.json") - + # Merge scoring config with loaded config if scoring_config: efficiency_config = self.config_loader.get_efficiency_scoring_config() @@ -33,7 +39,7 @@ def __init__(self, organization=None, personal_access_token=None, scoring_config developer_config = self.config_loader.get_developer_scoring_config() if 'developer_score_weights' in scoring_config: developer_config['weights'].update(scoring_config['developer_score_weights']) - + # Initialize helper modules combined_config = { **self.config_loader.get_efficiency_scoring_config(), @@ -43,10 +49,19 @@ def __init__(self, organization=None, personal_access_token=None, scoring_config self.efficiency_calculator = EfficiencyCalculator(combined_config) self.project_discovery = ProjectDiscovery(self) - # Initialize Fabric Logic App helper + # Initialize Fabric Logic App helper (legacy estimated hours) logic_app_url = "https://prod-10.northcentralus.logic.azure.com:443/workflows/9e4bccaa8aab448083f7b95d55db8660/triggers/When_an_HTTP_request_is_received/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FWhen_an_HTTP_request_is_received%2Frun&sv=1.0&sig=PgB2Drl6tRQ7Ki418LzCop5QV3wtpVhpVBoiW3I2mS4" self.fabric_helper = create_fabric_helper(logic_app_url) + # Initialize Logic App client for work item fetching (new) + try: + work_items_logic_app_url = get_logic_app_url() + self.logic_app_client = create_logic_app_client(work_items_logic_app_url) + self.logger.info("✅ Logic App client initialized successfully") + except EnvironmentError as e: + self.logger.warning(f"⚠️ Logic App client not initialized: {e}") + self.logic_app_client = None + # Project caching self.projects_cache_file = "projects_cache.json" @@ -67,10 +82,16 @@ def _enrich_work_items_with_fabric_estimates(self, work_items: List[Dict]) -> No # Call Logic App to get estimated hours fabric_response = self.fabric_helper.get_estimated_hours_by_ids(work_item_ids) - # Parse Logic App response + # Parse Logic App response - handle both direct and body-wrapped formats + fabric_work_items = None if fabric_response and 'ResultSets' in fabric_response: + # Direct format: {'ResultSets': {'Table1': [...]}} fabric_work_items = fabric_response['ResultSets']['Table1'] + elif fabric_response and 'body' in fabric_response and 'ResultSets' in fabric_response['body']: + # Wrapped format: {'body': {'ResultSets': {'Table1': [...]}}} + fabric_work_items = fabric_response['body']['ResultSets']['Table1'] + if fabric_work_items is not None: # Create lookup dictionary: WorkItemId -> estimated hours fabric_estimates = {} for fabric_item in fabric_work_items: @@ -90,9 +111,10 @@ def _enrich_work_items_with_fabric_estimates(self, work_items: List[Dict]) -> No enriched_count += 1 print(f" ✅ Set estimates for {enriched_count} work items from Fabric Logic App") - else: print(f" ⚠️ Unexpected Logic App response format: {fabric_response}") + print(f" Expected: {{'ResultSets': {{'Table1': [...]}}}} or {{'body': {{'ResultSets': {{'Table1': [...]}} }}}}") + print(f" Make sure Logic App returns data in ResultSets.Table1 or body.ResultSets.Table1 format") except Exception as e: print(f" ❌ Error fetching from Logic App: {e}") @@ -438,35 +460,23 @@ def _extract_ids_from_expanded_response(self, response: Dict) -> List[int]: work_items = response.get("workItems", []) return [wi.get("id") for wi in work_items if wi.get("id")] - def _get_project_url_segment(self, project_id, project_name): - """ - Utility to get the correct project segment for API URLs, preferring ID, else URL-encoded name. - """ - if project_id and project_id != "Unknown": - return project_id - elif project_name and project_name != "Unknown": - return quote(project_name.strip(), safe='') - else: - raise ValueError("No valid project identifier available") - - - def get_work_item_details_batch(self, project_id: str, work_item_ids: List[int], + def get_work_item_details_batch(self, project_id: str, work_item_ids: List[int], project_name: str = None, batch_size: int = 200) -> Tuple[List[Dict], Dict]: """ - Get detailed information for work items using batch processing for optimal performance. - + Get detailed information for work items using batch processing and organization-level API. + Args: - project_id: Project ID + project_id: Project ID (unused, kept for backward compatibility) work_item_ids: List of work item IDs - project_name: Project name (optional, for fallback) + project_name: Project name (unused, kept for backward compatibility) batch_size: Number of items to fetch per API call (max 200) - + Returns: Tuple of (work_items, performance_metrics) """ if not work_item_ids: return [], {"batch_calls": 0, "items_processed": 0, "execution_time": 0} - + start_time = time.time() performance_metrics = { "batch_calls": 0, @@ -474,22 +484,22 @@ def get_work_item_details_batch(self, project_id: str, work_item_ids: List[int], "execution_time": 0, "average_batch_size": 0 } - + print(f"🔄 Fetching details for {len(work_item_ids)} work items in batches of {batch_size}") - + all_simplified_items = [] - project_segment = self._get_project_url_segment(project_id, project_name) - + # Process in batches to optimize API calls for i in range(0, len(work_item_ids), batch_size): batch = work_item_ids[i:i + batch_size] batch_num = (i // batch_size) + 1 total_batches = ((len(work_item_ids) - 1) // batch_size) + 1 - + print(f" Processing batch {batch_num}/{total_batches}: {len(batch)} items") - + ids_str = ",".join(map(str, batch)) - endpoint = f"{project_segment}/_apis/wit/workitems?ids={ids_str}&api-version={self.get_api_version('work_items')}" + # Use organization-level API to avoid project name URL encoding issues + endpoint = f"_apis/wit/workitems?ids={ids_str}&api-version={self.get_api_version('work_items')}" try: response = self.handle_request("GET", endpoint) @@ -508,8 +518,8 @@ def get_work_item_details_batch(self, project_id: str, work_item_ids: List[int], "created_date": fields.get("System.CreatedDate", ""), "changed_date": fields.get("System.ChangedDate", ""), "start_date": fields.get("Microsoft.VSTS.Scheduling.StartDate", ""), - "target_date": fields.get("Microsoft.VSTS.Scheduling.TargetDate", ""), - "closed_date": fields.get("Microsoft.VSTS.Common.ClosedDate", ""), + "target_date": fields.get("Microsoft.VSTS.Scheduling.TargetDate") or fields.get("Microsoft.VSTS.Scheduling.DueDate") or fields.get("Custom.FechaPlanificada") or "", + "closed_date": fields.get("Microsoft.VSTS.Common.ClosedDate") or fields.get("Microsoft.VSTS.Common.ResolvedDate") or "", "resolved_date": fields.get("Microsoft.VSTS.Common.ResolvedDate", ""), "area_path": fields.get("System.AreaPath", ""), "iteration_path": fields.get("System.IterationPath", ""), @@ -543,16 +553,17 @@ def get_work_item_details_batch(self, project_id: str, work_item_ids: List[int], def get_work_item_revisions(self, project_id: str, work_item_id: int, project_name: str = None) -> List[Dict]: """ - Get revision history for a work item. + Get revision history for a work item using organization-level API. + Args: - project_id: Project ID + project_id: Project ID (unused, kept for backward compatibility) work_item_id: Work item ID - project_name: Project name (optional, for fallback) + project_name: Project name (unused, kept for backward compatibility) Returns: List of revisions with state and date information """ - project_segment = self._get_project_url_segment(project_id, project_name) - endpoint = f"{project_segment}/_apis/wit/workitems/{work_item_id}/revisions?api-version={self.get_api_version('work_items')}" + # Use organization-level API to avoid project name URL encoding issues + endpoint = f"_apis/wit/workitems/{work_item_id}/revisions?api-version={self.get_api_version('work_items')}" response = self.handle_request("GET", endpoint) revisions = response.get("value", []) # Transform revisions to simpler format @@ -569,7 +580,12 @@ def get_work_item_revisions(self, project_id: str, work_item_id: int, project_na "fields": { "Microsoft.VSTS.Scheduling.OriginalEstimate": fields.get("Microsoft.VSTS.Scheduling.OriginalEstimate", 0), "System.State": fields.get("System.State", ""), - "System.Reason": fields.get("System.Reason", "") + "System.Reason": fields.get("System.Reason", ""), + "Microsoft.VSTS.Scheduling.TargetDate": fields.get("Microsoft.VSTS.Scheduling.TargetDate"), + "Microsoft.VSTS.Scheduling.DueDate": fields.get("Microsoft.VSTS.Scheduling.DueDate"), + "Custom.FechaPlanificada": fields.get("Custom.FechaPlanificada"), + "Microsoft.VSTS.Common.ClosedDate": fields.get("Microsoft.VSTS.Common.ClosedDate"), + "Microsoft.VSTS.Common.ResolvedDate": fields.get("Microsoft.VSTS.Common.ResolvedDate") } } simplified_revisions.append(simplified_revision) @@ -614,11 +630,11 @@ def create_session(): return session def fetch_revisions_for_item(session, item): - """Fetch revisions for a single work item.""" + """Fetch revisions for a single work item using organization-level API.""" try: - project_segment = self._get_project_url_segment(item.get('project_id'), item.get('project_name')) - url = f"{self.base_url}{project_segment}/_apis/wit/workitems/{item['id']}/revisions?api-version={self.get_api_version('work_items')}" - + # Use organization-level API to avoid project name URL encoding issues + url = f"{self.base_url}_apis/wit/workitems/{item['id']}/revisions?api-version={self.get_api_version('work_items')}" + response = session.get(url, timeout=30) response.raise_for_status() @@ -635,11 +651,16 @@ def fetch_revisions_for_item(session, item): "changed_date": fields.get("System.ChangedDate", ""), "changed_by": fields.get("System.ChangedBy", {}).get("displayName", "Unknown"), "reason": fields.get("System.Reason", ""), - # Include fields for historical estimate retrieval + # Include fields for historical estimate retrieval and date tracking "fields": { "Microsoft.VSTS.Scheduling.OriginalEstimate": fields.get("Microsoft.VSTS.Scheduling.OriginalEstimate", 0), "System.State": fields.get("System.State", ""), - "System.Reason": fields.get("System.Reason", "") + "System.Reason": fields.get("System.Reason", ""), + "Microsoft.VSTS.Scheduling.TargetDate": fields.get("Microsoft.VSTS.Scheduling.TargetDate"), + "Microsoft.VSTS.Scheduling.DueDate": fields.get("Microsoft.VSTS.Scheduling.DueDate"), + "Custom.FechaPlanificada": fields.get("Custom.FechaPlanificada"), + "Microsoft.VSTS.Common.ClosedDate": fields.get("Microsoft.VSTS.Common.ClosedDate"), + "Microsoft.VSTS.Common.ResolvedDate": fields.get("Microsoft.VSTS.Common.ResolvedDate") } } simplified_revisions.append(simplified_revision) @@ -775,9 +796,10 @@ def _get_total_assigned_items_by_developer(self, target_projects: List[Dict], for project in target_projects: try: # Build query to get assigned items with date filtering + work_item_types_str = "', '".join(work_item_types) conditions = [ f"[System.AssignedTo] = '{developer}'", - f"[System.WorkItemType] IN ('{"', '".join(work_item_types)}')" + f"[System.WorkItemType] IN ('{work_item_types_str}')" ] # Add date filtering for start_date or target_date within timeframe @@ -1174,8 +1196,8 @@ def execute_organization_wiql_query(self, "created_date": fields.get("System.CreatedDate", ""), "changed_date": fields.get("System.ChangedDate", ""), "start_date": fields.get("Microsoft.VSTS.Scheduling.StartDate", ""), - "target_date": fields.get("Microsoft.VSTS.Scheduling.TargetDate", ""), - "closed_date": fields.get("Microsoft.VSTS.Common.ClosedDate", ""), + "target_date": fields.get("Microsoft.VSTS.Scheduling.TargetDate") or fields.get("Microsoft.VSTS.Scheduling.DueDate") or fields.get("Custom.FechaPlanificada") or "", + "closed_date": fields.get("Microsoft.VSTS.Common.ClosedDate") or fields.get("Microsoft.VSTS.Common.ResolvedDate") or "", "resolved_date": fields.get("Microsoft.VSTS.Common.ResolvedDate", ""), "area_path": fields.get("System.AreaPath", ""), "iteration_path": fields.get("System.IterationPath", ""), @@ -1193,6 +1215,591 @@ def execute_organization_wiql_query(self, return all_work_items + + def get_work_items_from_logic_app(self, + from_date: str, + to_date: str, + assigned_to: Optional[List[str]] = None, + calculate_efficiency: bool = True, + use_parallel_processing: bool = True, + max_workers: int = 10, + export_csv: Optional[str] = None) -> Dict: + """ + 🚀 NEW DEFAULT METHOD: Fetch work items from Logic App and calculate efficiency. + + This is the new default flow for --query-work-items that replaces WIQL/Analytics fetching. + + Flow: + 1. Resolve user names/emails from user_email_mapping.json + 2. Call Logic App with date range and emails + 3. Parse ResultSets.Table1 into work items list + 4. For each unique (WorkItemId, AssignedToUser): fetch DevOps activity log + 5. Calculate productivity time using existing efficiency calculator + 6. Produce same CSVs and summaries as before + + Args: + from_date: Start date in YYYY-MM-DD format + to_date: End date in YYYY-MM-DD format + assigned_to: List of user names or emails (None = all users from mapping) + calculate_efficiency: Whether to calculate efficiency metrics (default: True) + use_parallel_processing: Enable parallel revision fetching (default: True) + max_workers: Number of parallel workers (default: 10) + export_csv: CSV filename for export (optional) + + Returns: + Dictionary with work items, KPIs, and query info + """ + overall_start_time = time.time() + + print("🚀 ========================================") + print("🚀 LOGIC APP WORK ITEM FETCHING") + print("🚀 ========================================") + + # Validate Logic App client + if not self.logic_app_client: + raise EnvironmentError( + "Logic App client not initialized. Please set AZURE_LOGIC_APP_URL in .env file." + ) + + # Phase 1: Resolve emails + phase_start = time.time() + print(f"\n📧 Phase 1: Resolving emails...") + + emails = resolve_emails(assigned_to) + if not emails: + print("❌ No valid emails resolved. Please check user_email_mapping.json") + return self._empty_result() + + print(f"✅ Resolved {len(emails)} email(s): {', '.join(emails)}") + resolution_time = time.time() - phase_start + + # Phase 2: Fetch from Logic App + phase_start = time.time() + print(f"\n🔄 Phase 2: Fetching work items from Logic App...") + print(f" Date range: {from_date} to {to_date}") + + try: + logic_app_response = self.logic_app_client.get_work_items_by_date_range( + from_date=from_date, + to_date=to_date, + emails=emails + ) + except requests.exceptions.RequestException as e: + print(f"❌ Failed to fetch from Logic App: {e}") + raise + + # Parse response + work_items_raw = logic_app_response.get('ResultSets', {}).get('Table1', []) + print(f"✅ Retrieved {len(work_items_raw)} work item assignments from Logic App") + logic_app_time = time.time() - phase_start + + if not work_items_raw: + print("📭 No work items found for specified criteria") + return self._empty_result() + + # Phase 3: Process and deduplicate + phase_start = time.time() + print(f"\n🔧 Phase 3: Processing work items...") + + work_items = self._process_logic_app_work_items(work_items_raw, from_date, to_date) + print(f"✅ Processed {len(work_items)} unique work items") + processing_time = time.time() - phase_start + + # Phase 4: Fetch activity logs and calculate efficiency + if calculate_efficiency: + phase_start = time.time() + print(f"\n📊 Phase 4: Fetching activity logs and calculating efficiency...") + + self._fetch_activity_logs_and_calculate_efficiency( + work_items, + from_date, + to_date, + use_parallel_processing, + max_workers + ) + efficiency_time = time.time() - phase_start + else: + efficiency_time = 0 + print(f"\n⏭️ Phase 4: Skipped efficiency calculation (--no-efficiency)") + + # Phase 5: Calculate KPIs + phase_start = time.time() + print(f"\n📈 Phase 5: Calculating KPIs...") + + kpis = self.calculate_comprehensive_kpi_per_developer(work_items, {}) + kpi_time = time.time() - phase_start + + # Summary + total_time = time.time() - overall_start_time + print(f"\n✅ ========================================") + print(f"✅ COMPLETE - Total time: {total_time:.2f}s") + print(f"✅ ========================================") + print(f" Email resolution: {resolution_time:.2f}s") + print(f" Logic App fetch: {logic_app_time:.2f}s") + print(f" Processing: {processing_time:.2f}s") + print(f" Efficiency calc: {efficiency_time:.2f}s") + print(f" KPI calculation: {kpi_time:.2f}s") + + result = { + "work_items": work_items, + "kpis": kpis, + "query_info": { + "total_items": len(work_items), + "source": "Logic App (Fabric Data Warehouse)", + "filters_applied": { + "assigned_to": assigned_to or ["All users"], + "emails": emails, + "date_range": f"{from_date} to {to_date}" + } + } + } + + # Export to CSV if requested + if export_csv: + base_filename = export_csv.replace('.csv', '') + self.export_enhanced_work_items_to_csv(work_items, kpis, base_filename) + + return result + + def _process_logic_app_work_items(self, work_items_raw: List[Dict], from_date: str, to_date: str) -> List[Dict]: + """ + Process raw work items from Logic App ResultSets.Table1. + + Deduplicates by (WorkItemId, AssignedToUser) and converts to standardized format. + + Expected fields from Logic App: + - WorkItemId: Work item ID + - AssignedToUser: Assigned user email + - Title: Work item title + - StartDate: Start date + - TargetDate: Target date + - OriginalEstimate: Estimated hours + - Project_Name: Azure DevOps project name (REQUIRED for revision fetching) + """ + seen_keys = set() + work_items = [] + + for item in work_items_raw: + work_item_id = item.get('WorkItemId') + assigned_to = item.get('AssignedToUser', '').strip() + + if not work_item_id or not assigned_to: + continue + + # Deduplicate by (WorkItemId, AssignedToUser) + key = (work_item_id, assigned_to) + if key in seen_keys: + continue + seen_keys.add(key) + + # Extract project name from Logic App response (note: underscore in field name) + project_name = item.get('Project_Name', '').strip() + + # Convert to standardized format + work_item = { + 'id': work_item_id, + 'title': item.get('Title', ''), + 'assigned_to': assigned_to, + 'start_date': item.get('StartDate'), + 'target_date': item.get('TargetDate'), + 'closed_date': None, # Will be populated from revisions + 'original_estimate': item.get('OriginalEstimate'), + 'fabric_enriched': True, + 'revisions': [], + 'project_id': project_name if project_name else None, # Use project name as identifier + 'project_name': project_name if project_name else None, + 'state': None, # Will be determined from revisions or current state + 'work_item_type': None # Will be determined from revisions + } + + work_items.append(work_item) + + return work_items + + def _fetch_activity_logs_and_calculate_efficiency(self, + work_items: List[Dict], + from_date: str, + to_date: str, + use_parallel: bool, + max_workers: int): + """ + Fetch Azure DevOps activity logs for work items and calculate efficiency. + + Uses existing revision fetching and efficiency calculation logic. + Requires project_name to be populated in work items from Logic App. + """ + # Get date boundaries in Mexico City timezone + start_boundary, _ = get_date_boundaries_mexico_city(from_date) + _, end_boundary = get_date_boundaries_mexico_city(to_date) + + print(f" Fetching activity logs from {start_boundary} to {end_boundary} (America/Mexico_City)") + + # Check how many work items have project names + items_with_project = sum(1 for item in work_items if item.get('project_id')) + items_without_project = len(work_items) - items_with_project + + if items_without_project > 0: + print(f" ⚠️ Warning: {items_without_project} work items missing Project_Name") + print(f" These items will be skipped for efficiency calculations") + print(f" Please ensure Logic App returns 'Project_Name' field for all work items") + + if use_parallel and max_workers > 1: + print(f" Using parallel processing with {max_workers} workers...") + work_items_with_revisions, _ = self.get_work_item_revisions_parallel( + work_items, + max_workers=max_workers, + batch_size=50 + ) + else: + print(f" Using sequential processing...") + for item in work_items: + try: + # Fetch revisions using project_name from Logic App + if item.get('project_id') and item.get('project_name'): + state_history = self.get_work_item_revisions( + item['project_id'], # This is the project name from Logic App + item['id'], + item['project_name'] + ) + item['revisions'] = state_history + else: + self.logger.warning(f"Skipping item {item['id']}: missing project name") + item['revisions'] = [] + except Exception as e: + self.logger.error(f"Failed to get revisions for item {item['id']}: {e}") + item['revisions'] = [] + + # Update state and work_item_type from revisions + for item in work_items: + revisions = item.get('revisions', []) + if revisions: + # Get the latest state and work_item_type from most recent revision + latest_revision = revisions[-1] + if not item.get('state'): + item['state'] = latest_revision.get('state', 'Unknown') + if not item.get('work_item_type'): + item['work_item_type'] = latest_revision.get('work_item_type', 'Unknown') + + # Enrich with dates from latest revision if missing in Logic App response + rev_fields = latest_revision.get('fields', {}) + + if not item.get('target_date'): + item['target_date'] = (rev_fields.get('Microsoft.VSTS.Scheduling.TargetDate') or + rev_fields.get('Microsoft.VSTS.Scheduling.DueDate') or + rev_fields.get('Custom.FechaPlanificada') or "") + + if not item.get('closed_date'): + item['closed_date'] = (rev_fields.get('Microsoft.VSTS.Common.ClosedDate') or + rev_fields.get('Microsoft.VSTS.Common.ResolvedDate') or "") + + # Calculate efficiency for each work item + state_config = self.config_loader.get_state_categories() + + for item in work_items: + try: + if not self.config_loader.should_include_work_item_with_history(item, item.get("revisions", [])): + continue + + efficiency = self.calculate_fair_efficiency_metrics( + item, + item.get("revisions", []), + state_config, + from_date, + to_date + ) + item["efficiency"] = efficiency + except Exception as e: + self.logger.error(f"Error calculating efficiency for item {item['id']}: {e}") + item["efficiency"] = {} + + def _get_work_item_details_simple(self, work_item_id: int) -> Dict: + """ + Get basic work item details to determine project and current state. + """ + try: + endpoint = f"_apis/wit/workitems/{work_item_id}?api-version=7.1-preview.3" + response = self.handle_request("GET", endpoint) + + fields = response.get('fields', {}) + return { + 'project_id': fields.get('System.TeamProject'), # Project name, not ID + 'project_name': fields.get('System.TeamProject'), + 'state': fields.get('System.State'), + 'work_item_type': fields.get('System.WorkItemType') + } + except Exception as e: + self.logger.error(f"Failed to get details for work item {work_item_id}: {e}") + return {} + + def _empty_result(self) -> Dict: + """Return empty result structure.""" + return { + "work_items": [], + "kpis": {}, + "query_info": { + "total_items": 0, + "source": "Logic App (Fabric Data Warehouse)", + "filters_applied": {} + } + } + + def get_daily_snapshot_from_logic_app(self, + from_date: str, + to_date: str, + assigned_to: Optional[List[str]] = None, + use_parallel_processing: bool = True, + max_workers: int = 10, + output_filename: str = "daily_snapshot.csv") -> Dict: + """ + Generate simplified daily snapshot from Logic App with basic time tracking. + + This method is optimized for automated tracking workflows: + - Skips complex efficiency calculations and KPI aggregation + - Calculates TOTAL ACCUMULATED active and blocked time from entire work item history + - Exports directly to simplified 12-column CSV + - 40-60% faster than full query method + + IMPORTANT: Active/Blocked time shows TOTAL ACCUMULATED hours from all history, + not filtered to the date range. The date range (from_date, to_date) is only + used to filter which work items to include in the report. + + This means: + - A work item active from Nov 15 → Dec 10 will show ~17 days of active time + in BOTH November and December reports (accumulated total). + - Each daily run adds new accumulated time as work progresses. + + Args: + from_date: Start date in YYYY-MM-DD format (filters which work items to include) + to_date: End date in YYYY-MM-DD format (filters which work items to include) + assigned_to: List of user names or emails (None = all users from mapping) + use_parallel_processing: Enable parallel revision fetching (default: True) + max_workers: Number of parallel workers (default: 10) + output_filename: Output CSV filename + + Returns: + Dictionary with total_items count and output_filename + """ + overall_start_time = time.time() + + print("🚀 Fetching work items from Logic App...") + + # Validate Logic App client + if not self.logic_app_client: + raise EnvironmentError( + "Logic App client not initialized. Please set AZURE_LOGIC_APP_URL in .env file." + ) + + # Phase 1: Resolve emails + print(f"\n📧 Resolving emails...") + emails = resolve_emails(assigned_to) + if not emails: + print("❌ No valid emails resolved. Please check user_email_mapping.json") + return {"total_items": 0, "output_filename": output_filename} + + print(f"✅ Resolved {len(emails)} email(s): {', '.join(emails)}") + + # Phase 2: Fetch from Logic App + print(f"\n🔄 Fetching from Logic App (date range: {from_date} to {to_date})...") + try: + logic_app_response = self.logic_app_client.get_work_items_by_date_range( + from_date=from_date, + to_date=to_date, + emails=emails + ) + except Exception as e: + print(f"❌ Failed to fetch from Logic App: {e}") + raise + + # Parse response + work_items_raw = logic_app_response.get('ResultSets', {}).get('Table1', []) + print(f"✅ Retrieved {len(work_items_raw)} work item assignments") + + if not work_items_raw: + print("📭 No work items found for specified criteria") + return {"total_items": 0, "output_filename": output_filename} + + # Phase 3: Process and deduplicate + print(f"\n🔧 Processing work items...") + work_items = self._process_logic_app_work_items(work_items_raw, from_date, to_date) + print(f"✅ Processed {len(work_items)} unique work items") + + # Phase 4: Fetch activity logs and calculate basic times + print(f"\n📊 Fetching activity logs and calculating basic times...") + self._fetch_activity_logs_basic_times( + work_items, + from_date, + to_date, + use_parallel_processing, + max_workers + ) + + # Phase 5: Export to CSV + print(f"\n💾 Exporting to CSV...") + self.export_simplified_snapshot_csv(work_items, output_filename) + + total_time = time.time() - overall_start_time + print(f"\n✅ Snapshot complete in {total_time:.2f}s") + + return { + "total_items": len(work_items), + "output_filename": output_filename + } + + def _fetch_activity_logs_basic_times(self, + work_items: List[Dict], + from_date: str, + to_date: str, + use_parallel: bool, + max_workers: int): + """ + Fetch Azure DevOps activity logs and calculate ONLY basic time metrics. + + This method skips all complex scoring algorithms and only extracts: + - Active time hours (TOTAL ACCUMULATED from all history, not filtered to timeframe) + - Blocked time hours (TOTAL ACCUMULATED from all history, not filtered to timeframe) + + Note: from_date and to_date are used only to filter which work items to query, + but the active/blocked time shown is the TOTAL ACCUMULATED time from the entire + work item history, not just the time within the date range. + + Performance: 50-60% faster than full efficiency calculation. + """ + from helpers.timezone_utils import get_date_boundaries_mexico_city + + # Get date boundaries in Mexico City timezone + start_boundary, _ = get_date_boundaries_mexico_city(from_date) + _, end_boundary = get_date_boundaries_mexico_city(to_date) + + print(f" Fetching activity logs from {start_boundary} to {end_boundary}") + + # Check project names + items_with_project = sum(1 for item in work_items if item.get('project_id')) + items_without_project = len(work_items) - items_with_project + + if items_without_project > 0: + print(f" ⚠️ Warning: {items_without_project} work items missing Project_Name") + print(f" These items will have 0 hours for time tracking") + + # Fetch revisions + if use_parallel and max_workers > 1: + print(f" Using parallel processing with {max_workers} workers...") + work_items_with_revisions, _ = self.get_work_item_revisions_parallel( + work_items, + max_workers=max_workers, + batch_size=50 + ) + else: + print(f" Using sequential processing...") + for item in work_items: + try: + if item.get('project_id') and item.get('project_name'): + state_history = self.get_work_item_revisions( + item['project_id'], + item['id'], + item['project_name'] + ) + item['revisions'] = state_history + else: + self.logger.warning(f"Skipping item {item['id']}: missing project name") + item['revisions'] = [] + except Exception as e: + self.logger.error(f"Failed to get revisions for item {item['id']}: {e}") + item['revisions'] = [] + + # Update state and work_item_type from revisions + for item in work_items: + revisions = item.get('revisions', []) + if revisions: + latest_revision = revisions[-1] + if not item.get('state'): + item['state'] = latest_revision.get('state', 'Unknown') + if not item.get('work_item_type'): + item['work_item_type'] = latest_revision.get('work_item_type', 'Unknown') + + # Calculate basic times (extract only time fields from efficiency calculator) + state_config = self.config_loader.get_state_categories() + + for item in work_items: + try: + if not self.config_loader.should_include_work_item_with_history(item, item.get("revisions", [])): + item["basic_times"] = {"active_time_hours": 0, "blocked_time_hours": 0} + continue + + # Call efficiency calculator but extract only time fields + # Pass None for timeframe to show TOTAL ACCUMULATED time from all history + # instead of filtering to the query date range + efficiency = self.calculate_fair_efficiency_metrics( + item, + item.get("revisions", []), + state_config, + None, # No timeframe filtering - show total accumulated active time + None # No timeframe filtering - show total accumulated blocked time + ) + + # Extract only the time fields we need + item["basic_times"] = { + "active_time_hours": efficiency.get("active_time_hours", 0), + "blocked_time_hours": efficiency.get("blocked_time_hours", 0) + } + except Exception as e: + self.logger.error(f"Error calculating times for item {item['id']}: {e}") + item["basic_times"] = {"active_time_hours": 0, "blocked_time_hours": 0} + + def export_simplified_snapshot_csv(self, work_items: List[Dict], filename: str): + """ + Export work items to simplified 12-column CSV format for automated tracking. + + CSV Structure (12 columns): + - ID, Title, Project Name, Assigned To, State, Work Item Type + - Start Date, Target Date, Closed Date + - Estimated Hours, Active Time (Hours), Blocked Time (Hours) + + Note: Active Time and Blocked Time show TOTAL ACCUMULATED hours from the entire + work item history, not filtered to any specific date range. + + This is a simplified version of the full export (20 columns → 12 columns). + """ + if not work_items: + print(" ⚠️ No work items to export") + return + + try: + with open(filename, 'w', newline='', encoding='utf-8') as csvfile: + fieldnames = [ + 'ID', 'Title', 'Project Name', 'Assigned To', 'State', 'Work Item Type', + 'Start Date', 'Target Date', 'Closed Date', 'Estimated Hours', + 'Active Time (Hours)', 'Blocked Time (Hours)' + ] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + + for item in work_items: + basic_times = item.get("basic_times", {}) + writer.writerow({ + 'ID': item['id'], + 'Title': item.get('title', ''), + 'Project Name': item.get('project_name', ''), + 'Assigned To': item.get('assigned_to', ''), + 'State': item.get('state', ''), + 'Work Item Type': item.get('work_item_type', ''), + 'Start Date': item.get('start_date', ''), + 'Target Date': item.get('target_date', ''), + 'Closed Date': item.get('closed_date', ''), + 'Estimated Hours': item.get('original_estimate', 0) or 0, + 'Active Time (Hours)': basic_times.get('active_time_hours', 0), + 'Blocked Time (Hours)': basic_times.get('blocked_time_hours', 0) + }) + + print(f" ✅ Exported {len(work_items)} items to {filename}") + + except IOError as e: + print(f" ❌ Failed to write CSV file: {e}") + print(" Check file path and permissions") + raise + except Exception as e: + print(f" ❌ Unexpected error during CSV export: {e}") + raise + def get_work_items_with_efficiency_optimized(self, project_id: Optional[str] = None, project_names: Optional[List[str]] = None, @@ -1619,12 +2226,28 @@ def export_enhanced_work_items_to_csv(self, base_filename: Base filename for exports (without extension) """ if not work_items: - print("No work items to export.") + print("No work items to export. Creating empty CSV with headers.") + # Create empty detailed report with headers + items_filename = f"{base_filename}.csv" + try: + with open(items_filename, 'w', newline='', encoding='utf-8') as csvfile: + fieldnames = [ + 'ID', 'Title', 'Project Name', 'Assigned To', 'State', 'Work Item Type', + 'Start Date', 'Target Date', 'Closed Date', 'Estimated Hours', + 'Active Time (Hours)', 'Blocked Time (Hours)', 'Efficiency %', + 'Delivery Score', 'Days Ahead/Behind Target', + 'Completion Bonus', 'Timing Bonus', 'Was Reopened', 'Active After Reopen' + ] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + print(f"Created empty detailed report: {items_filename}") + except Exception as e: + print(f"Error creating empty CSV: {e}") return try: # Export detailed work items - items_filename = f"{base_filename}_detailed.csv" + items_filename = f"{base_filename}.csv" with open(items_filename, 'w', newline='', encoding='utf-8') as csvfile: fieldnames = [ 'ID', 'Title', 'Project Name', 'Assigned To', 'State', 'Work Item Type', diff --git a/classes/efficiency_calculator.py b/classes/efficiency_calculator.py index c4bd1a1..0feeea2 100644 --- a/classes/efficiency_calculator.py +++ b/classes/efficiency_calculator.py @@ -99,8 +99,12 @@ def calculate_fair_efficiency_metrics(self, Returns: Dictionary with enhanced efficiency metrics """ + estimated_hours = self._calculate_estimated_time_from_work_item( + work_item, timeframe_start, timeframe_end + ) + if len(state_history) < 2: - return self._empty_efficiency_metrics() + return self._empty_efficiency_metrics(estimated_hours) # Use provided state config or defaults if state_config is None: @@ -125,7 +129,7 @@ def calculate_fair_efficiency_metrics(self, # Check if work item should be ignored if state_stack.should_ignore_work_item(): - return self._ignored_work_item_metrics() + return self._ignored_work_item_metrics(estimated_hours) # Get time metrics from stack raw_productive_hours = state_stack.get_total_productive_hours() @@ -134,16 +138,14 @@ def calculate_fair_efficiency_metrics(self, state_durations = state_stack.get_state_durations() pattern_summary = state_stack.get_pattern_summary() - # Calculate estimated time from OriginalEstimate field, considering timeframe - estimated_hours = self._calculate_estimated_time_from_work_item(work_item, timeframe_start, timeframe_end) - # Apply active hours capping logic: 1.2x estimate cap, exclude if no estimate + # Now uses exact Logic App estimates (no transformations) if estimated_hours <= 0: # If no estimate hours, don't count active time productive_hours = 0 pattern_summary['capping_applied'] = 'no_estimate_exclusion' else: - # Cap active hours at 1.2x the estimated hours + # Cap active hours at 1.2x the estimated hours (using exact Logic App values) max_allowed_hours = estimated_hours * 1.2 if raw_productive_hours > max_allowed_hours: productive_hours = max_allowed_hours @@ -224,7 +226,8 @@ def _calculate_estimated_time_from_work_item(self, work_item: Dict, if original_estimate is not None and original_estimate > 0: base_estimate = float(original_estimate) - # # If timeframe is provided, adjust the estimate proportionally + # DISABLED: Timeframe scaling is intentionally off because Fabric is the source of truth. + # Exact Logic App estimates must remain unaltered - no proportional adjustments. # if timeframe_start or timeframe_end: # return self._adjust_estimate_for_timeframe(work_item, base_estimate, timeframe_start, timeframe_end) @@ -282,54 +285,31 @@ def _adjust_dates_for_timeframe(self, start_date: datetime, target_date: datetim return adjusted_start, adjusted_target - def _adjust_estimate_for_timeframe(self, work_item: Dict, base_estimate: float, + def _adjust_estimate_for_timeframe(self, work_item: Dict, base_estimate: float, timeframe_start: Optional[str], timeframe_end: Optional[str]) -> float: """ - Adjust the estimated hours proportionally based on the timeframe. - + INTENTIONALLY DISABLED: This method is parked to preserve exact Logic App estimates. + + Previously: Adjusted the estimated hours proportionally based on the timeframe. + + Current Status: DISABLED because Fabric Logic App is the source of truth. + Exact estimates from Logic App must remain unaltered. No proportional adjustments, + minimum hour guarantees, or timeframe-based scaling should be applied. + + If future timeframe-based adjustments are desired, this method would need a new, + non-transforming design aligned with the Fabric source-of-truth policy. + Args: work_item: Work item details base_estimate: Original estimated hours - timeframe_start: Query timeframe start date (YYYY-MM-DD format) + timeframe_start: Query timeframe start date (YYYY-MM-DD format) timeframe_end: Query timeframe end date (YYYY-MM-DD format) - + Returns: - Adjusted estimated hours as float + Always returns the base_estimate unchanged (exact Logic App value) """ - start_date = work_item.get('start_date') - target_date = work_item.get('target_date') - - if not start_date or not target_date: - return base_estimate - - try: - start = datetime.fromisoformat(start_date.replace('Z', '+00:00')) - target = datetime.fromisoformat(target_date.replace('Z', '+00:00')) - - # Calculate total office days in the original work period - total_office_days = self._calculate_office_days_between_dates(start, target) - if total_office_days <= 0: - return base_estimate - - # Calculate office days that fall within the timeframe - adjusted_start, adjusted_target = self._adjust_dates_for_timeframe(start, target, timeframe_start, timeframe_end) - if adjusted_start >= adjusted_target: - return 2.0 # Minimum hours if no overlap - - timeframe_office_days = self._calculate_office_days_between_dates(adjusted_start, adjusted_target) - - # Calculate proportional hours - if timeframe_office_days <= 0: - return 2.0 # Minimum hours if no office days in timeframe - - proportion = timeframe_office_days / total_office_days - adjusted_estimate = base_estimate * proportion - - # Ensure minimum of 2 hours - return max(adjusted_estimate, 2.0) - - except (ValueError, TypeError): - return base_estimate + # DISABLED: Return original estimate unchanged to preserve Fabric Logic App values + return base_estimate def _calculate_office_days_between_dates(self, start_date: datetime, end_date: datetime) -> float: """ @@ -473,8 +453,32 @@ def _calculate_delivery_timing(self, work_item: Dict) -> Dict: } try: - target = datetime.fromisoformat(target_date.replace('Z', '+00:00')) - closed = datetime.fromisoformat(closed_date.replace('Z', '+00:00')) + # Handle potential mixing of naive and aware datetimes + # Append +00:00 if Z is missing and it looks like it should be UTC, or handle it robustly + + target_str = target_date.replace('Z', '+00:00') + closed_str = closed_date.replace('Z', '+00:00') + + target = datetime.fromisoformat(target_str) + closed = datetime.fromisoformat(closed_str) + + # If one is aware and the other is naive, make both aware (assuming naive is UTC) + # Then convert to Mexico City time if needed, or at least ensure they are comparable + if target.tzinfo is None and closed.tzinfo is not None: + target = target.replace(tzinfo=closed.tzinfo) + elif target.tzinfo is not None and closed.tzinfo is None: + closed = closed.replace(tzinfo=target.tzinfo) + + # Normalize to Mexico City time if possible, or just ensure they are in the same timezone + try: + mexico_tz = pytz.timezone('America/Mexico_City') + if target.tzinfo: + target = target.astimezone(mexico_tz) + if closed.tzinfo: + closed = closed.astimezone(mexico_tz) + except Exception: + # If pytz conversion fails, fall back to simple comparison + pass days_difference = (closed - target).total_seconds() / 86400 @@ -559,14 +563,14 @@ def calculate_developer_score(self, completion_rate: float, avg_fair_efficiency: return round(overall_score, 2) - def _empty_efficiency_metrics(self) -> Dict: + def _empty_efficiency_metrics(self, estimated_hours: float = 0.0) -> Dict: """Return empty efficiency metrics structure.""" return { "active_time_hours": 0, "raw_active_time_hours": 0, "paused_time_hours": 0, "total_time_hours": 0, - "estimated_time_hours": 0, + "estimated_time_hours": round(estimated_hours, 2), "efficiency_percentage": 0, "fair_efficiency_score": 0, "delivery_score": 0, @@ -583,14 +587,14 @@ def _empty_efficiency_metrics(self) -> Dict: "stack_summary": {} } - def _ignored_work_item_metrics(self) -> Dict: + def _ignored_work_item_metrics(self, estimated_hours: float = 0.0) -> Dict: """Return metrics structure for ignored work items.""" return { "active_time_hours": 0, "raw_active_time_hours": 0, "paused_time_hours": 0, "total_time_hours": 0, - "estimated_time_hours": 0, + "estimated_time_hours": round(estimated_hours, 2), "efficiency_percentage": 0, "fair_efficiency_score": 0, "delivery_score": 0, @@ -605,4 +609,4 @@ def _ignored_work_item_metrics(self) -> Dict: "should_ignore": True, "capping_applied": "ignored_item", "stack_summary": {"should_ignore": True} - } \ No newline at end of file + } diff --git a/config/azure_devops_config.json b/config/azure_devops_config.json index 745e822..0374e6c 100644 --- a/config/azure_devops_config.json +++ b/config/azure_devops_config.json @@ -19,7 +19,8 @@ ], "work_item_types": [ "Task", - "Bugs" + "Bug", + "User Story" ], "date_field": "ClosedDate", "include_active_items": true, @@ -27,9 +28,25 @@ "default_developers": [ "Luis Nocedal", "Carlos Vazquez", + "Diego Lopez", + "Alejandro Valenzuela", + "Gerardo Melgoza", + "Hans Izarraraz", + "Osvaldo de Luna", + "Uriel Cortés", + "Emmanuel Pérez", "Fernando Alcaraz", - "Rodrigo Mendoza", - "Jorge Hernandez" + "Damian Gaspar", + "Cristian Soria", + "Daniel Cayola", + "Ximena Segura", + "Andrés Escobedo", + "Alvaro Torres", + "Pablo Ruiz", + "Sebastián Rojas", + "Fernando Hernández", + "Daniel Reyes", + "Fernando Agredano" ] }, "state_categories": { @@ -195,36 +212,41 @@ "Start Date", "Target Date", "Closed Date", - "Original Estimate Hours", + "Estimated Hours", "Active Time (Hours)", - "Paused Time (Hours)", - "Total Time (Hours)", - "Traditional Efficiency", - "Fair Efficiency Score", + "Blocked Time (Hours)", + "Efficiency %", "Delivery Score", "Days Ahead/Behind Target", "Completion Bonus", "Timing Bonus", "Was Reopened", - "State Transitions Count" + "Active After Reopen" ], "developer_summary_fields": [ "Developer", "Total Work Items", "Completed Items", - "Ignored Items", + "Items With Active Time", + "Sample Confidence %", "Completion Rate %", "On-Time Delivery %", - "Average Fair Efficiency", + "Average Efficiency %", "Average Delivery Score", "Overall Developer Score", "Total Active Hours", - "Total Paused Hours", - "Total Original Estimate Hours", + "Total Estimated Hours", "Avg Days Ahead/Behind", "Reopened Items Handled", + "Reopened Rate %", "Work Item Types", - "Projects Count" + "Projects Count", + "Early Deliveries", + "On-Time Deliveries", + "Late 1-3 Days", + "Late 4-7 Days", + "Late 8-14 Days", + "Late 15+ Days" ] }, "debugging": { diff --git a/documentation/CLAUDE.md b/documentation/CLAUDE.md index fc7190a..9bf51f7 100644 --- a/documentation/CLAUDE.md +++ b/documentation/CLAUDE.md @@ -1,117 +1,96 @@ # CLAUDE.md -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +Guidance for Claude Code when working with this repository. ## Project Overview -This is an Azure DevOps CLI tool written in Python that provides command-line interface for managing Azure DevOps projects, service hooks, work items, and KPI analytics. The tool allows cross-project queries and exports data to CSV for analysis. +Azure DevOps CLI tool for managing projects, service hooks, work items, and developer KPI analytics. ## Project Structure -The project is organized into the following folders: - -### `entry_points/` -- `main.py` - Main command-line interface entry point - -### `classes/` -- `AzureDevOps.py` - Base class for Azure DevOps API authentication and HTTP requests -- `commands.py` - Extends AzureDevOps, implements project and service hook operations -- `AzureDevopsProjectOperations.py` - Project-specific operations like work items and GitHub repos -- `WorkItemOperations.py` - Advanced work item querying, KPI calculations, and analytics -- `efficiency_calculator.py` - Fair efficiency metrics, delivery scoring, and business hours calculations -- `state_transition_stack.py` - Stack-based state transition tracking for accurate time measurement -- `project_discovery.py` - Efficient discovery of projects with user activity - -### `config/` -- `config.py` - Configuration management using environment variables -- `config_loader.py` - JSON configuration file loading and validation -- `azure_devops_config.json` - Main configuration file with state categories, business hours, and scoring parameters - -### `documentation/` -- `README.md` - Project overview and setup instructions -- `CLAUDE.md` - This file with project guidance -- `CONFIGURATION_USAGE.md` - Configuration system usage guide -- `WORK_ITEM_QUERYING_GUIDE.md` - Work item querying system documentation -- `FLOW_DIAGRAM.md` - System architecture and flow diagrams -- `IMPLEMENTATION_ANALYSIS.md` - Technical implementation details +``` +Azure-devops-cli-tool/ +├── run.py # Entry point +├── entry_points/ +│ └── main.py # CLI argument parsing +├── classes/ +│ ├── AzureDevOps.py # Base API client +│ ├── commands.py # Project/hook operations +│ ├── AzureDevopsProjectOperations.py +│ ├── WorkItemOperations.py # Work item queries +│ ├── efficiency_calculator.py # Scoring logic +│ ├── state_transition_stack.py # Time tracking +│ └── project_discovery.py # Project filtering +├── config/ +│ ├── config.py # Environment config +│ ├── config_loader.py # JSON config loader +│ └── azure_devops_config.json # Main configuration +├── documentation/ +│ ├── README.md # Main docs +│ ├── SCORING_PARAMETERS.md # Scoring customization +│ ├── WORK_ITEM_QUERYING_GUIDE.md +│ ├── FLOW_DIAGRAM.md # Architecture +│ └── CLAUDE.md # This file +├── .github/workflows/ +│ ├── daily-snapshot.yml +│ └── monthly-developer-report.yml +└── QUICKSTART.md # 5-minute setup +``` -## Dependencies and Setup +## Setup -Install dependencies: ```bash pip install -r requirements.txt ``` -Required environment variables (create `.env` file): -```bash -AZURE_DEVOPS_ORG= -AZURE_DEVOPS_PAT= +Create `.env`: ``` - -## Core Commands - -Run the main tool: -```bash -python run.py [options] +AZURE_DEVOPS_ORG= +AZURE_DEVOPS_PAT= ``` -Get help and explanation of all commands: +## Key Commands + ```bash -python run.py --explain -``` +# List projects +python run.py --list-projects -Common operations: -- List projects: `python run.py --list-projects` -- Query work items: `python run.py --query-work-items --assigned-to "UserName"` -- Export to CSV: `python run.py --query-work-items --export-csv "results.csv"` +# Query work items +python run.py --query-work-items --assigned-to "Name" --export-csv "report.csv" -Alternatively, you can run directly: -```bash -python entry_points/main.py [options] +# Help +python run.py --explain ``` ## Architecture -### Core Classes - -1. **AzureDevOps** (`classes/AzureDevOps.py`) - Base class handling Azure DevOps API authentication and HTTP requests -2. **AzureDevOpsCommands** (`classes/commands.py`) - Extends AzureDevOps, implements project and service hook operations -3. **AzureDevOpsProjectOperations** (`classes/AzureDevopsProjectOperations.py`) - Project-specific operations like work items and GitHub repos -4. **WorkItemOperations** (`classes/WorkItemOperations.py`) - Advanced work item querying, KPI calculations, and analytics -5. **EfficiencyCalculator** (`classes/efficiency_calculator.py`) - Fair efficiency metrics and delivery scoring with Mexico City timezone -6. **Config** (`config/config.py`) - Configuration management using environment variables -7. **ConfigLoader** (`config/config_loader.py`) - JSON configuration file loading and validation - -### Request Flow - -1. `entry_points/main.py` parses command line arguments using argparse -2. Creates appropriate operation class (Commands, ProjectOperations, or WorkItemOperations) -3. Operation classes inherit from base `AzureDevOps` class for authentication -4. HTTP requests made via `handle_request()` method with automatic error handling -5. Results processed and displayed, optionally exported to CSV +1. `main.py` parses CLI arguments +2. Creates operation class (Commands, ProjectOperations, WorkItemOperations) +3. Operations inherit from `AzureDevOps` base class for auth +4. `handle_request()` method executes API calls +5. Results processed and exported to CSV -### Key Features +## Configuration -- **Smart Project Filtering**: Queries only projects with user activity for efficiency -- **KPI Analytics**: Calculates delivery scores, efficiency metrics, bottlenecks -- **CSV Export**: Enhanced exports with per-developer metrics and detailed work item data -- **Service Hook Management**: Create, list, upgrade webhooks across projects -- **Cross-Project Queries**: Query work items across multiple projects with filtering +Main config: `config/azure_devops_config.json` -### Work Item Query System +- `state_categories`: Define productive/blocked/completion states +- `business_hours`: Office hours, timezone, working days +- `developer_scoring.weights`: Scoring weight distribution +- `efficiency_scoring`: Delivery score thresholds and bonuses -The work item querying supports multiple scopes: -- Single project (`--project-id`) -- Specific projects (`--project-names`) -- Smart filtering (default - only projects with user activity) -- All projects (`--all-projects`) +## Key Files for Development -Query filters include assignee, work item types, states, date ranges, area/iteration paths. +| Purpose | File | +|---------|------| +| CLI parsing | `entry_points/main.py` | +| Work item queries | `classes/WorkItemOperations.py` | +| Scoring calculations | `classes/efficiency_calculator.py` | +| Time tracking | `classes/state_transition_stack.py` | +| Configuration | `config/azure_devops_config.json` | -## Development Notes +## Notes -- No formal testing framework detected - manual testing via CLI commands -- No linting configuration found - consider adding flake8/black for code quality -- Project uses environment-based configuration via python-dotenv -- API versioning handled through Config.API_VERSION dictionary -- Error handling implemented in base AzureDevOps.handle_request() method \ No newline at end of file +- No test framework configured +- Uses environment-based config via python-dotenv +- Mexico City timezone for business hours calculations diff --git a/documentation/CONFIGURATION_USAGE.md b/documentation/CONFIGURATION_USAGE.md deleted file mode 100644 index 93d2534..0000000 --- a/documentation/CONFIGURATION_USAGE.md +++ /dev/null @@ -1,252 +0,0 @@ -# Configuration Usage Guide - -## Overview - -The Azure DevOps CLI tool now uses a comprehensive JSON configuration file (`azure_devops_config.json`) that allows you to customize: - -- Which states to fetch from Azure DevOps -- State categories (productive, pause/stopper, completion, ignored) -- Business hours and office configuration -- Efficiency scoring parameters -- Developer scoring weights - -## Configuration File Structure - -### Complete Example Configuration - -```json -{ - "work_item_query": { - "states_to_fetch": [ - "New", "Active", "In Progress", "Development", - "Code Review", "Testing", "Resolved", "Closed", - "Done", "Stopper", "Blocked", "On Hold", "Waiting" - ], - "work_item_types": ["Task", "User Story", "Bug", "Feature"], - "date_field": "ClosedDate", - "include_active_items": true, - "smart_filtering": true - }, - "state_categories": { - "assigned_states": ["New"], - "productive_states": ["Active", "In Progress", "Development", "Code Review", "Testing"], - "pause_stopper_states": ["Stopper", "Blocked", "On Hold", "Waiting"], - "completion_states": ["Resolved", "Closed", "Done"], - "ignored_states": ["Removed", "Discarded", "Cancelled"] - }, - "business_hours": { - "office_start_hour": 9, - "office_end_hour": 17, - "max_hours_per_day": 8, - "timezone": "UTC" - }, - "efficiency_scoring": { - "completion_bonus_percentage": 0.20, - "max_efficiency_cap": 150.0 - }, - "developer_scoring": { - "weights": { - "fair_efficiency": 0.4, - "delivery_score": 0.3, - "completion_rate": 0.2, - "on_time_delivery": 0.1 - } - } -} -``` - -## State Categories Behavior - -### 1. **Assigned States** (`New`) -- **Behavior**: Work items with start/target dates within query timeframe count as assigned tasks -- **Time Tracking**: No time counted toward efficiency (assignment state) -- **Example**: A `New` task with target date within your query range will be included - -### 2. **Productive States** (`Active`, `In Progress`, `Development`, `Code Review`, `Testing`) -- **Behavior**: Time spent in these states counts toward efficiency metrics -- **Time Tracking**: Business hours only (8 hours max per day, weekdays only) -- **Efficiency Impact**: Contributes to fair efficiency score calculation - -### 3. **Pause/Stopper States** (`Stopper`, `Blocked`, `On Hold`, `Waiting`) -- **Behavior**: Pauses time tracking - doesn't count toward efficiency -- **Time Tracking**: Tracked separately as "paused time" -- **Efficiency Impact**: Does not hurt efficiency scores -- **Use Case**: When work is blocked by external dependencies - -### 4. **Completion States** (`Resolved`, `Closed`, `Done`) -- **Behavior**: Stops time accumulation, eligible for completion bonus -- **Time Tracking**: Marks end of work item lifecycle -- **Efficiency Impact**: Triggers completion bonus (20% of estimated time) - -### 5. **Ignored States** (`Removed`, `Discarded`, `Cancelled`) -- **Behavior**: Work items are completely excluded from analysis -- **Time Tracking**: No time tracking -- **Efficiency Impact**: Not included in any calculations - -## Usage Examples - -### Basic Usage with Default Configuration - -```bash -# Uses azure_devops_config.json automatically -python main.py --query-work-items \ - --assigned-to "Carlos Vazquez,Diego Lopez" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" -``` - -### Using Custom Configuration File - -```bash -# Use your custom config file -python main.py --query-work-items \ - --scoring-config "my_custom_config.json" \ - --assigned-to "Carlos Vazquez" \ - --export-csv "carlos_analysis" -``` - -### Override Configuration via CLI - -```bash -# Override specific settings via command line -python main.py --query-work-items \ - --assigned-to "Carlos Vazquez" \ - --completion-bonus 0.25 \ - --max-efficiency-cap 120.0 \ - --max-hours-per-day 6 \ - --fair-efficiency-weight 0.5 -``` - -## Customization Examples - -### Example 1: Different Office Hours -```json -{ - "business_hours": { - "office_start_hour": 8, - "office_end_hour": 18, - "max_hours_per_day": 10, - "timezone": "America/Mexico_City" - } -} -``` - -### Example 2: Custom State Categories -```json -{ - "state_categories": { - "assigned_states": ["New", "Approved"], - "productive_states": ["Active", "In Progress", "Development", "Code Review", "Testing", "Validation"], - "pause_stopper_states": ["Blocked", "Waiting for Approval", "External Dependency"], - "completion_states": ["Done", "Closed", "Deployed"], - "ignored_states": ["Cancelled", "Duplicate", "Won't Fix"] - } -} -``` - -### Example 3: Adjusted Scoring Weights -```json -{ - "developer_scoring": { - "weights": { - "fair_efficiency": 0.5, - "delivery_score": 0.25, - "completion_rate": 0.15, - "on_time_delivery": 0.1 - } - } -} -``` - -## State Flow Logic - -``` -New (assigned) → Active (productive) → Blocked (paused) → Active (productive) → Resolved (completed) -``` - -**Time Calculation**: -1. `New`: 0 hours counted (assignment state) -2. `Active`: Business hours counted toward efficiency -3. `Blocked`: Hours tracked as "paused time", not counted against efficiency -4. `Active` (resumed): Business hours counted toward efficiency again -5. `Resolved`: Work item completed, eligible for completion bonus - -## Advanced Configuration - -### Debugging Settings -```json -{ - "debugging": { - "show_state_transitions": true, - "show_time_calculations": true, - "show_ignored_items": true, - "max_debug_items": 10 - } -} -``` - -### Export Customization -```json -{ - "export_settings": { - "detailed_csv_fields": [ - "ID", "Title", "Assigned To", "State", - "Active Time (Hours)", "Paused Time (Hours)", - "Fair Efficiency Score", "Delivery Score" - ] - } -} -``` - -## Migration from Previous Version - -If you were using the previous system with CLI arguments, here's how to migrate: - -**Old Way**: -```bash -python main.py --query-work-items \ - --productive-states "Active,In Progress,Development" \ - --blocked-states "Blocked,On Hold" -``` - -**New Way** - Create config file: -```json -{ - "state_categories": { - "productive_states": ["Active", "In Progress", "Development"], - "pause_stopper_states": ["Blocked", "On Hold"] - } -} -``` - -Then run: -```bash -python main.py --query-work-items --scoring-config "my_config.json" -``` - -## Configuration Validation - -The system automatically validates your configuration and adds missing default values. If you have an invalid configuration file, it will: - -1. Show warning messages about invalid/missing sections -2. Use default values for missing configuration -3. Continue execution with merged configuration - -## Testing Your Configuration - -To test your configuration, run with debug output: - -```bash -python main.py --query-work-items \ - --assigned-to "TestUser" \ - --start-date "2025-08-01" \ - --end-date "2025-08-02" -``` - -The tool will display: -- Configuration file being used -- States being fetched -- State categories being applied -- Filtered/ignored work items - -This ensures your configuration is working as expected before running larger analyses. \ No newline at end of file diff --git a/documentation/IMPLEMENTATION_ANALYSIS.md b/documentation/IMPLEMENTATION_ANALYSIS.md deleted file mode 100644 index ef9cbd8..0000000 --- a/documentation/IMPLEMENTATION_ANALYSIS.md +++ /dev/null @@ -1,202 +0,0 @@ -# Implementation Analysis: Stack-Based State Tracking and Business Hours Optimization - -## Issues Identified in Current Data (August 2025) - -After reviewing the `organization_sprint_analysis_complete_developer_summary.csv` file, several critical issues were identified that needed immediate attention: - -### 1. **Zero Active Hours Problem** -**Developers with 0.0 active hours despite completed items:** -- Luis Nocedal: 62 completed items, 0.0 active hours -- Uriel Cortés: 41 completed items, 0.0 active hours -- Alejandro Valenzuela: 41 completed items, 0.0 active hours - -**Root Cause**: The previous business hours calculation was flawed and didn't properly count time in productive states. - -### 2. **Unrealistic Efficiency Scores** -**Fernando Alcaraz**: 113.26% fair efficiency - clearly impossible -**Root Cause**: Lack of proper caps and incorrect bonus calculations. - -### 3. **Inconsistent Late Delivery Patterns** -Many developers show high numbers of late deliveries (15+ days), suggesting: -- Incorrect target date handling -- Poor estimation vs actual time tracking -- Missing office hours consideration - -### 4. **Estimation Problems** -Total estimated hours seem disconnected from actual work patterns, indicating: -- Not using OriginalEstimate field from Azure DevOps -- Fallback calculations were too generous -- No consideration of office hours in estimates - -## New Implementation Solutions - -### 1. **Stack-Based State Transition Tracking** - -**File**: `state_transition_stack.py` - -**Key Features**: -```python -class WorkItemStateStack: - def __init__(self, office_start_hour=9, office_end_hour=17, - max_hours_per_day=8, timezone_str="UTC") -``` - -**Benefits**: -- **O(1) time accumulation** as states change (vs O(n) iteration) -- **Real-time pattern detection** (reopened items, bottlenecks) -- **Business hours calculation** with proper office hours (9-17) -- **8-hour daily cap** instead of previous 10-hour cap -- **Weekend exclusion** - no counting Saturday/Sunday -- **Timezone awareness** for accurate office hours - -### 2. **Enhanced Business Hours Logic** - -**Previous Issues**: -```python -# OLD: Counted up to 10 hours per day, including weekends -total_business_hours += max_hours_per_day # 10.0 -``` - -**New Implementation**: -```python -# NEW: Maximum 8 hours per day, weekdays only, office hours considered -def _calculate_office_hours_in_day(self, day_start, day_end): - office_start_dt = datetime.combine(day_start.date(), self.office_start) # 9 AM - office_end_dt = datetime.combine(day_start.date(), self.office_end) # 5 PM - effective_start = max(day_start, office_start_dt) - effective_end = min(day_end, office_end_dt) - # Only count time within office hours, max 8 hours per day -``` - -### 3. **OriginalEstimate Field Integration** - -**Previous**: Used fallback calculations that were often wrong -**New**: Properly extracts from Azure DevOps schema: - -```python -def _calculate_estimated_time_from_work_item(self, work_item): - # Primary: Use OriginalEstimate field from work item - original_estimate = work_item.get('original_estimate') - if original_estimate and original_estimate > 0: - return float(original_estimate) # Use actual Azure DevOps estimate -``` - -**Schema Integration**: -```python -"original_estimate": fields.get("Microsoft.VSTS.Scheduling.OriginalEstimate", 0) -``` - -### 4. **Realistic Default Estimates** - -**Previous** (too generous): -```python -'user story': 16.0, # 2 days -'task': 8.0, # 1 day -'bug': 4.0, # 0.5 day -``` - -**New** (more realistic): -```python -'user story': 8.0, # 1 day -'task': 4.0, # 0.5 day -'bug': 2.0, # 0.25 day -``` - -### 5. **Proper Office Hours for Start/Target Dates** - -**New Feature**: When calculating estimated time from start/target dates: - -```python -def _calculate_business_hours_between_dates(self, start_date, end_date): - # Considers actual office hours (9 AM - 5 PM) - # Excludes weekends - # Applies 8-hour daily maximum - # Handles partial days properly -``` - -## Expected Impact on August Data Issues - -### **Luis Nocedal** (Previously: 0.0 active hours, 62 completed items) -**Expected Fix**: -- Stack-based tracking will properly count state transition times -- Business hours calculation will capture productive time -- Estimated active hours: **~350-400 hours** (reasonable for 62 items) - -### **Fernando Alcaraz** (Previously: 113.26% efficiency) -**Expected Fix**: -- 150% efficiency cap will limit unrealistic scores -- Proper completion bonus calculation (20% max) -- Realistic business hours counting -- Expected efficiency: **~85-95%** (more realistic) - -### **Delivery Timing Issues** -**Expected Improvements**: -- Office hours consideration for target dates -- Proper weekend exclusion -- More accurate late delivery detection -- Better on-time delivery percentages - -## Configuration Flexibility - -Users can now customize scoring via CLI or JSON config: - -**CLI Examples**: -```bash -# Adjust efficiency cap -python main.py --query-work-items --max-efficiency-cap 120.0 - -# Adjust completion bonus -python main.py --query-work-items --completion-bonus 0.15 - -# Adjust developer score weights -python main.py --query-work-items \ - --fair-efficiency-weight 0.5 \ - --delivery-score-weight 0.3 -``` - -**JSON Configuration**: -```json -{ - "max_hours_per_day": 6.0, - "completion_bonus_percentage": 0.15, - "max_efficiency_cap": 120.0, - "developer_score_weights": { - "fair_efficiency": 0.5, - "delivery_score": 0.25, - "completion_rate": 0.15, - "on_time_delivery": 0.1 - } -} -``` - -## Testing Recommendations - -To validate the improvements, recommend running queries for August 1-21, 2025 period: - -```bash -# Test with new implementation -python main.py --query-work-items \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" \ - --assigned-to "Luis Nocedal,Fernando Alcaraz,Uriel Cortés" \ - --export-csv "august_revised_analysis" \ - --productive-states "Active,In Progress,Development,Code Review" -``` - -**Expected Results**: -1. **No more 0.0 active hours** for developers with completed work -2. **Efficiency scores capped at 150%** max -3. **More realistic total estimated hours** using OriginalEstimate -4. **Better delivery timing accuracy** with office hours consideration -5. **Consistent 8-hour daily maximums** instead of inflated hours - -## Key Architecture Benefits - -1. **Stack-Based Efficiency**: O(1) time calculations vs O(n) iterations -2. **Modular Design**: Separate concerns for easier maintenance -3. **Configurable Scoring**: Adaptable to different organizational needs -4. **Timezone Awareness**: Proper handling of office hours across timezones -5. **Accurate Field Mapping**: Direct use of Azure DevOps OriginalEstimate -6. **Business Logic Separation**: Clear separation between data and calculations - -This implementation should resolve the major data quality issues observed in the August analysis and provide more accurate, realistic efficiency metrics for all developers. \ No newline at end of file diff --git a/documentation/README.md b/documentation/README.md index ae4588c..4b4d9fd 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1,245 +1,111 @@ -# Azure DevOps CLI Utility +# Azure DevOps CLI Tool -A command-line interface (CLI) tool to interact with Azure DevOps for managing projects, service hooks, work items, and more. +A command-line interface for Azure DevOps to manage projects, service hooks, work items, and developer KPI analytics. ## Prerequisites -- Python 3.x -- Pip (Python package installer) +- Python 3.7+ +- `pip install -r requirements.txt` -## Dependencies +## Configuration -Install the required Python packages using pip: +Create a `.env` file: -```bash -pip install -r requirements.txt +```plaintext +AZURE_DEVOPS_ORG=YourOrganizationName +AZURE_DEVOPS_PAT=YourPersonalAccessToken ``` -The dependencies are: -- `python-dotenv`: For loading environment variables from a `.env` file. -- `requests`: For making HTTP requests to the Azure DevOps API. -- `azure-devops`: Official Microsoft Azure DevOps Python client (though this tool uses direct REST API calls primarily). -- `argparse`: For parsing command-line arguments. - -## Configuration +## Usage -This tool uses environment variables for configuration, primarily for Azure DevOps credentials. Create a `.env` file in the root directory of the project: +```bash +python run.py [options] +``` -```plaintext -# .env -AZURE_DEVOPS_ORG= -AZURE_DEVOPS_PAT= -AZURE_DEVOPS_WORKITEM_WEBHOOK_URL= -AZURE_DEVOPS_BUILD_WEBHOOK_URL= -AZURE_DEVOPS_RELEASE_WEBHOOK_URL= -STANDARD_HOOK_PROJECT_IDS= +For help: +```bash +python run.py --explain ``` -- **`AZURE_DEVOPS_ORG`**: Your Azure DevOps organization name (e.g., `YourOrgName` in `dev.azure.com/YourOrgName`). -- **`AZURE_DEVOPS_PAT`**: A Personal Access Token (PAT) with appropriate permissions (e.g., `Project and Team: Read`, `Service Hooks: Read & write`, `Work Items: Read & write`). Generate one from your Azure DevOps user settings. -- **Webhook URLs**: Optional default URLs for specific event types if you don't provide `--hook-url` when creating hooks. +--- -You can also provide the organization and PAT via command-line arguments (`--organization` and `--personal-access-token`), which will override the environment variables. +## Key Commands -## Usage +### List Projects + +```bash +python run.py --list-projects +``` -Run the tool using `python main.py` followed by the desired command and options. +### Query Work Items with KPI Calculations ```bash -python main.py [options] +python run.py --query-work-items \ + --assigned-to "Developer1,Developer2" \ + --start-date "2025-01-01" \ + --end-date "2025-01-31" \ + --export-csv "report.csv" ``` -To see a detailed explanation of all commands and their arguments, run: +**Output files:** +- `report.csv` - Detailed work item data +- `report_developer_summary.csv` - Developer metrics summary + +### Service Hook Management ```bash -python main.py --explain +# List hooks for a project +python run.py --list-subscriptions --project-id + +# Create a hook +python run.py --create-hook --project-id --event-type workitem.updated + +# Create standard hooks for Software Factory projects +python run.py --create-standard-hooks --filter-tag "Software Factory" ``` -## Available Commands +--- -Here are the main commands available: +## Configuration File -### Project Management +The tool uses `config/azure_devops_config.json` for: -- **List Projects:** - ```bash - python main.py --list-projects - ``` -- **List Projects by Tag:** Filter projects based on tags found in their description (requires tags to be in a specific JSON format within the description). - ```bash - python main.py --list-projects --filter-tag "Software Factory" "Production" - ``` -- **Export Projects to CSV:** Fetches all projects and exports their Name, ID, and parsed Tags (from description) to a file named `projects_export.csv`. - ```bash - python main.py --export-projects-csv - ``` +- State categories (productive, blocked, completion, ignored) +- Business hours (timezone, working days) +- Scoring weights (efficiency, delivery, completion, on-time) +- Export field configurations -### Service Hook Management +See [SCORING_PARAMETERS.md](SCORING_PARAMETERS.md) for customization details. -- **List Subscriptions (Hooks) for a Project:** - ```bash - python main.py --list-subscriptions --project-id - ``` -- **Create a Service Hook:** - ```bash - # Basic hook creation (uses default URL from config/.env if available) - python main.py --create-hook --project-id --event-type workitem.updated - - # Specify webhook URL - python main.py --create-hook --project-id --event-type build.complete --hook-url https://my-build-webhook.com - - # Create workitem.updated hook triggering only on State changes - python main.py --create-hook --project-id --event-type workitem.updated --state-changed - ``` -- **Remove a Specific Service Hook:** - ```bash - python main.py --remove-hook --project-id --subscription-id - ``` -- **Remove All Service Hooks for a Project:** - ```bash - python main.py --remove-hook --project-id - ``` -- **Create Hooks for Filtered Projects:** Creates hooks for all projects matching specific tags. - ```bash - python main.py --create-hooks-for-filtered-projects --filter-tag "Production" --event-type workitem.updated --hook-url https://prod-hooks.com - ``` - **Specific Examples:** - ```bash - # Create 'workitem.created' hook for "Software Factory" projects - python main.py --create-hooks-for-filtered-projects --filter-tag "Software Factory" --event-type workitem.created --hook-url "https://prod-17.northcentralus.logic.azure.com:443/workflows/508aabfd2a114a949be865d9ace951b5/triggers/Se_crea_un_nuevo_work_item/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FSe_crea_un_nuevo_work_item%2Frun&sv=1.0&sig=S2b_XQdlWwrHQqXk6VD9cPBpL_PFGumj03_eVPD7Eh0" - - # Create 'workitem.updated' hook for "Software Factory" projects (assigned/reassigned) - python main.py --create-hooks-for-filtered-projects --filter-tag "Software Factory" --event-type workitem.updated --hook-url "https://prod-26.southcentralus.logic.azure.com:443/workflows/7a3968a93851401dabb3f01ba7d82ddf/triggers/Se_actualiza_un_work_item_asignado_o_se_reasigna_uno_existente/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FSe_actualiza_un_work_item_asignado_o_se_reasigna_uno_existente%2Frun&sv=1.0&sig=2tiU0mGmHm-pDP1fKgZJz-TOBCXZcVkes7zlK87_zIM" - - # Create 'workitem.updated' hook for "Software Factory" projects (state update notification) - python main.py --create-hooks-for-filtered-projects --filter-tag "Software Factory" --event-type workitem.updated --hook-url "https://prod-18.southcentralus.logic.azure.com:443/workflows/7e3259e5607740f28c50621158d7274e/triggers/Se_actualiza_el_estado_de_un_WI_y_notifica_al_creador/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FSe_actualiza_el_estado_de_un_WI_y_notifica_al_creador%2Frun&sv=1.0&sig=Ygc6X0zNAqROkOCbBCKWGGmEXA_HVvoSvq9J0LYrUj8" - ``` -- **List and Upgrade Webhooks:** Finds projects by tag and updates their `workitem.updated` webhooks to use `resourceVersion: 1.0`. - ```bash - python main.py --list-and-upgrade-webhooks --filter-tag "Production" - ``` - -- **Create Standard Hooks:** Creates a predefined set of three essential work item webhooks (created, updated-assigned, updated-state) for one or more projects. - *Uses project IDs from `--project-id`, `--filter-tag`, or the `STANDARD_HOOK_PROJECT_IDS` environment variable (in that order of precedence).* - *If using the environment variable, ensure it's a comma-separated list (e.g., `id1,id2,id3`).* - ```bash - # Create standard hooks for a specific project (overrides .env) - python main.py --create-standard-hooks --project-id - - # Create standard hooks for all projects tagged with "Software Factory" (overrides .env) - python main.py --create-standard-hooks --filter-tag "Software Factory" - - # Create standard hooks using project IDs defined in .env (STANDARD_HOOK_PROJECT_IDS) - python main.py --create-standard-hooks - ``` - -### Work Item Management (Requires `--project-id`) - -- **List Work Items:** - ```bash - python main.py --list-work-items --project-id - ``` -- **Create Work Item:** - ```bash - python main.py --create-work-item --project-id --work-item-type "Task" --work-item-title "My New Task" --work-item-description "Details about the task." - ``` - -### Advanced Work Item Querying & KPI Analytics - -- **Dynamic Work Item Query with KPI Calculations:** - ```bash - # Query projects with user activity (smart filtering - efficient) - python main.py --query-work-items --assigned-to "Carlos Vazquez,Alex Valenzuela" - - # Query ALL projects (no smart filtering - slower) - python main.py --query-work-items --assigned-to "Carlos Vazquez,Alex Valenzuela" --all-projects - - # Query specific projects by name - python main.py --query-work-items --project-names "ProjectA,ProjectB" --states "Closed,Done" - - # Query single project by ID - python main.py --query-work-items --project-id --start-date "2025-06-01" --end-date "2025-07-09" - - # Cross-project query with filters (smart filtering) - python main.py --query-work-items --work-item-types "Task,User Story,Bug" --states "Closed,Done,Resolved" --start-date "2025-06-01" --assigned-to "Carlos Vazquez" - - # Query with area and iteration filters - python main.py --query-work-items --project-id --area-path "MyProject\\Development" --iteration-path "Sprint 1" - - # Export cross-project results to CSV (smart filtering) - python main.py --query-work-items --export-csv "organization_work_items.csv" --assigned-to "Carlos Vazquez" - - # Skip efficiency calculations for faster results - python main.py --query-work-items --no-efficiency --project-names "ProjectA,ProjectB" - ``` - -**Project Scope Options:** -- `--project-id`: Query a specific project by ID -- `--project-names`: Query specific projects by name (comma-separated) -- *(No project args)*: Smart filtering - only query projects with user activity -- `--all-projects`: Query ALL projects (skip smart filtering for comprehensive results) - -**Available Parameters:** -- `--assigned-to`: Comma-separated list of user names -- `--work-item-types`: Comma-separated list (Task, User Story, Bug, Feature, etc.) -- `--states`: Comma-separated list (Closed, Done, Active, In Progress, etc.) -- `--start-date` / `--end-date`: Date range in YYYY-MM-DD format -- `--date-field`: Field to use for date filtering (ClosedDate, StartDate, ChangedDate) -- `--area-path` / `--iteration-path`: Project structure filters -- `--no-efficiency`: Skip time efficiency calculations for faster results -- `--export-csv`: Export results to specified CSV file - -**KPI Metrics Calculated:** -- On-time delivery percentage -- Average efficiency percentage (productive vs. total time) -- Total active and blocked hours -- State transition bottlenecks -- Individual work item efficiency metrics - -## Comandos Adicionales para Análisis - -### Análisis por Período Específico -```bash -# Sprint actual (ejemplo 2 semanas) -python main.py --query-work-items --start-date "2025-07-01" --end-date "2025-07-15" +--- -# Análisis mensual -python main.py --query-work-items --start-date "2025-06-01" --end-date "2025-06-30" +## Developer Metrics -# Análisis trimestral -python main.py --query-work-items --start-date "2025-04-01" --end-date "2025-06-30" -``` +| Metric | Description | +|--------|-------------| +| Completion Rate % | Items completed vs assigned | +| On-Time Delivery % | Items delivered by target date | +| Average Efficiency % | Productive time vs estimated | +| Delivery Score | Points for early/on-time delivery (60-130) | +| Overall Score | Weighted combination of all metrics | -### Filtros por Tipo de Work Item -```bash -# Solo bugs -python main.py --query-work-items --work-item-types "Bug" --states "Closed,Done" +--- -# Solo features/historias de usuario -python main.py --query-work-items --work-item-types "User Story,Feature" --states "Closed,Done" +## Related Documentation -# Análisis completo con work items activos para completion rate realista -python main.py --query-work-items --states "Closed,Done,Active,New,In Progress" --start-date "2025-06-01" --end-date "2025-07-01" -``` +- [QUICKSTART.md](../QUICKSTART.md) - 5-minute setup guide +- [SCORING_PARAMETERS.md](SCORING_PARAMETERS.md) - Adjust scoring weights and parameters +- [SCORING_EXAMPLES.md](SCORING_EXAMPLES.md) - Detailed calculation examples with real data +- [FLOW_DIAGRAM.md](FLOW_DIAGRAM.md) - System architecture +- [WORK_ITEM_QUERYING_GUIDE.md](WORK_ITEM_QUERYING_GUIDE.md) - Detailed query guide -### Análisis de Desarrollador Individual -```bash -# Análisis detallado de un desarrollador -python main.py --query-work-items --assigned-to "Diego Lopez" --export-csv "diego_analysis.csv" +--- -# Análisis de múltiples desarrolladores con estados productivos expandidos -python main.py --query-work-items --assigned-to "Carlos Vazquez,Diego Lopez" --productive-states "Active,In Progress,Code Review,Testing" --export-csv "team_analysis.csv" -``` +## GitHub Actions -### Optimización de Horas Activas -```bash -# Para obtener ~160h mensuales reales, expandir estados productivos -python main.py --query-work-items --assigned-to "Desarrollador1,Desarrollador2" --productive-states "Active,In Progress,Code Review,Testing,To Do,New" --start-date "2025-06-01" --end-date "2025-07-01" -``` +Automated workflows in `.github/workflows/`: -### Other Project Operations (Requires `--project-id`) +- **daily-snapshot.yml** - Daily work item snapshot (9:00 AM Mexico City) +- **monthly-developer-report.yml** - Monthly report (30th of each month) -- **List Connected GitHub Repositories:** - ```bash - python main.py --list-github-repos --project-id - ``` \ No newline at end of file +Trigger manually from GitHub Actions tab or run on schedule. diff --git a/documentation/SCORING_EXAMPLES.md b/documentation/SCORING_EXAMPLES.md new file mode 100644 index 0000000..3b97e81 --- /dev/null +++ b/documentation/SCORING_EXAMPLES.md @@ -0,0 +1,513 @@ +# Scoring Calculation Examples + +Esta guía proporciona ejemplos detallados con datos reales de cómo se calculan las métricas de scoring en el sistema. + +## Tabla de Contenidos + +1. [Parámetros de Configuración](#parámetros-de-configuración) +2. [Ejemplo 1: Entrega Tardía (3 días)](#ejemplo-1-entrega-tardía-3-días) +3. [Ejemplo 2: Entrega Temprana (5 días)](#ejemplo-2-entrega-temprana-5-días) +4. [Ejemplo 3: Entrega Muy Tardía (15+ días)](#ejemplo-3-entrega-muy-tardía-15-días) +5. [Ejemplo 4: Entrega a Tiempo](#ejemplo-4-entrega-a-tiempo) +6. [Ejemplo 5: Cálculo del Overall Developer Score](#ejemplo-5-cálculo-del-overall-developer-score) +7. [Resumen de Fórmulas](#resumen-de-fórmulas) + +--- + +## Parámetros de Configuración + +Para todos los ejemplos, usaremos los valores por defecto del sistema: + +```json +{ + "efficiency_scoring": { + "completion_bonus_percentage": 0.20, + "max_efficiency_cap": 150.0, + "early_delivery_thresholds": { + "very_early_days": 5, + "early_days": 3, + "slightly_early_days": 1 + }, + "early_delivery_scores": { + "very_early": 130.0, + "early": 120.0, + "slightly_early": 110.0, + "on_time": 100.0 + }, + "late_delivery_scores": { + "late_1_3": 95.0, + "late_4_7": 90.0, + "late_8_14": 85.0, + "late_15_plus": 70.0 + }, + "late_penalty_mitigation": { + "late_1_3": 2.0, + "late_4_7": 4.0, + "late_8_14": 6.0, + "late_15_plus": 8.0 + } + }, + "developer_scoring": { + "weights": { + "fair_efficiency": 0.2, + "delivery_score": 0.3, + "completion_rate": 0.3, + "on_time_delivery": 0.2 + } + } +} +``` + +--- + +## Ejemplo 1: Entrega Tardía (3 días) + +### Datos del Work Item + +| Campo | Valor | +|-------|-------| +| **Título** | "Implementar login con OAuth" | +| **Estimated Hours** | 8.0 horas | +| **Active Time** | 6.0 horas | +| **Target Date** | 2025-01-15 | +| **Closed Date** | 2025-01-18 | +| **Estado** | "Closed" (completado) | +| **Días de diferencia** | +3 días (tarde) | + +### Paso 1: Calcular Completion Bonus + +**Fórmula:** +``` +Completion Bonus = Estimated Hours × Completion Bonus Percentage +``` + +**Cálculo:** +``` +Completion Bonus = 8.0 × 0.20 = 1.6 horas +``` + +✅ **Resultado:** Se agregan 1.6 horas al numerador por estar completado. + +--- + +### Paso 2: Determinar Delivery Timing + +Como se entregó **3 días tarde**, corresponde a la categoría `late_1_3`: + +| Métrica | Valor | Fuente | +|---------|-------|--------| +| **Delivery Score** | 95.0 | `late_delivery_scores.late_1_3` | +| **Late Penalty Mitigation** | 2.0 horas | `late_penalty_mitigation.late_1_3` | + +--- + +### Paso 3: Calcular Fair Efficiency + +**Fórmula:** +``` +Fair Efficiency = (Numerador / Denominador) × 100 +``` + +**Numerador:** +``` +Numerador = Active Hours + Completion Bonus +Numerador = 6.0 + 1.6 = 7.6 horas +``` + +**Denominador:** +``` +Denominador = Estimated Hours + Late Penalty Mitigation +Denominador = 8.0 + 2.0 = 10.0 horas +``` + +**Fair Efficiency:** +``` +Fair Efficiency = (7.6 / 10.0) × 100 = 76.0% +``` + +✅ **Resultado:** Fair Efficiency = **76.0%** + +--- + +### Resumen del Work Item + +| Métrica | Valor | Explicación | +|---------|-------|-------------| +| Active Hours | 6.0h | Tiempo real trabajado en estados productivos | +| Estimated Hours | 8.0h | Tiempo estimado original | +| Completion Bonus | 1.6h | 20% de 8h (bonus por estar completado) | +| Late Penalty Mitigation | 2.0h | Mitigación por entregar 3 días tarde | +| **Fair Efficiency** | **76.0%** | (7.6 / 10.0) × 100 | +| **Delivery Score** | **95.0** | Puntos por entregar 1-3 días tarde | +| Days Ahead/Behind | +3 días | Diferencia con fecha objetivo | + +--- + +## Ejemplo 2: Entrega Temprana (5 días) + +### Datos del Work Item + +| Campo | Valor | +|-------|-------| +| **Título** | "Refactorizar módulo de autenticación" | +| **Estimated Hours** | 10.0 horas | +| **Active Time** | 7.0 horas | +| **Target Date** | 2025-01-20 | +| **Closed Date** | 2025-01-15 | +| **Estado** | "Closed" (completado) | +| **Días de diferencia** | -5 días (temprano) | + +### Paso 1: Calcular Completion Bonus + +``` +Completion Bonus = 10.0 × 0.20 = 2.0 horas +``` + +✅ **Resultado:** +2.0 horas de bonus + +--- + +### Paso 2: Determinar Delivery Timing + +Como se entregó **5 días antes**, corresponde a la categoría `very_early` (≥5 días): + +| Métrica | Valor | Fuente | +|---------|-------|--------| +| **Delivery Score** | 130.0 | `early_delivery_scores.very_early` | +| **Timing Bonus Hours** | 5.0 horas | 5 días × 1.0 (no se usa en fair efficiency) | +| **Late Penalty Mitigation** | 0.0 horas | No aplica (entrega temprana) | + +--- + +### Paso 3: Calcular Fair Efficiency + +**Numerador:** +``` +Numerador = Active Hours + Completion Bonus +Numerador = 7.0 + 2.0 = 9.0 horas +``` + +**Denominador:** +``` +Denominador = Estimated Hours + Late Penalty Mitigation +Denominador = 10.0 + 0.0 = 10.0 horas +``` + +**Fair Efficiency:** +``` +Fair Efficiency = (9.0 / 10.0) × 100 = 90.0% +``` + +✅ **Resultado:** Fair Efficiency = **90.0%** + +--- + +### Resumen del Work Item + +| Métrica | Valor | Explicación | +|---------|-------|-------------| +| Active Hours | 7.0h | Tiempo real trabajado | +| Estimated Hours | 10.0h | Tiempo estimado | +| Completion Bonus | 2.0h | 20% de 10h | +| **Fair Efficiency** | **90.0%** | (9.0 / 10.0) × 100 | +| **Delivery Score** | **130.0** | Puntos por entregar 5+ días antes | +| Days Ahead/Behind | -5 días | 5 días antes de la fecha objetivo | + +--- + +## Ejemplo 3: Entrega Muy Tardía (15+ días) + +### Datos del Work Item + +| Campo | Valor | +|-------|-------| +| **Título** | "Migrar base de datos legacy" | +| **Estimated Hours** | 16.0 horas | +| **Active Time** | 12.0 horas | +| **Target Date** | 2025-01-10 | +| **Closed Date** | 2025-01-30 | +| **Estado** | "Closed" (completado) | +| **Días de diferencia** | +20 días (muy tarde) | + +### Paso 1: Calcular Completion Bonus + +``` +Completion Bonus = 16.0 × 0.20 = 3.2 horas +``` + +✅ **Resultado:** +3.2 horas de bonus + +--- + +### Paso 2: Determinar Delivery Timing + +Como se entregó **20 días tarde**, corresponde a la categoría `late_15_plus` (≥15 días): + +| Métrica | Valor | Fuente | +|---------|-------|--------| +| **Delivery Score** | 70.0 | `late_delivery_scores.late_15_plus` | +| **Late Penalty Mitigation** | 8.0 horas | `late_penalty_mitigation.late_15_plus` | + +--- + +### Paso 3: Calcular Fair Efficiency + +**Numerador:** +``` +Numerador = Active Hours + Completion Bonus +Numerador = 12.0 + 3.2 = 15.2 horas +``` + +**Denominador:** +``` +Denominador = Estimated Hours + Late Penalty Mitigation +Denominador = 16.0 + 8.0 = 24.0 horas +``` + +**Fair Efficiency:** +``` +Fair Efficiency = (15.2 / 24.0) × 100 = 63.3% +``` + +✅ **Resultado:** Fair Efficiency = **63.3%** + +--- + +### Resumen del Work Item + +| Métrica | Valor | Explicación | +|---------|-------|-------------| +| Active Hours | 12.0h | Tiempo real trabajado | +| Estimated Hours | 16.0h | Tiempo estimado | +| Completion Bonus | 3.2h | 20% de 16h | +| Late Penalty Mitigation | 8.0h | Mitigación máxima por 15+ días tarde | +| **Fair Efficiency** | **63.3%** | (15.2 / 24.0) × 100 | +| **Delivery Score** | **70.0** | Puntos por entregar 15+ días tarde | +| Days Ahead/Behind | +20 días | 20 días después de la fecha objetivo | + +**Nota:** Aunque el trabajo se completó en menos tiempo del estimado (12h vs 16h), la entrega muy tardía reduce significativamente la eficiencia debido a la mitigación de penalización. + +--- + +## Ejemplo 4: Entrega a Tiempo + +### Datos del Work Item + +| Campo | Valor | +|-------|-------| +| **Título** | "Agregar validación de formularios" | +| **Estimated Hours** | 4.0 horas | +| **Active Time** | 3.5 horas | +| **Target Date** | 2025-01-25 | +| **Closed Date** | 2025-01-25 | +| **Estado** | "Closed" (completado) | +| **Días de diferencia** | 0 días (a tiempo) | + +### Paso 1: Calcular Completion Bonus + +``` +Completion Bonus = 4.0 × 0.20 = 0.8 horas +``` + +✅ **Resultado:** +0.8 horas de bonus + +--- + +### Paso 2: Determinar Delivery Timing + +Como se entregó **exactamente a tiempo** (0 días de diferencia): + +| Métrica | Valor | Fuente | +|---------|-------|--------| +| **Delivery Score** | 100.0 | `early_delivery_scores.on_time` | +| **Late Penalty Mitigation** | 0.0 horas | No aplica (entrega a tiempo) | + +--- + +### Paso 3: Calcular Fair Efficiency + +**Numerador:** +``` +Numerador = Active Hours + Completion Bonus +Numerador = 3.5 + 0.8 = 4.3 horas +``` + +**Denominador:** +``` +Denominador = Estimated Hours + Late Penalty Mitigation +Denominador = 4.0 + 0.0 = 4.0 horas +``` + +**Fair Efficiency:** +``` +Fair Efficiency = (4.3 / 4.0) × 100 = 107.5% +``` + +✅ **Resultado:** Fair Efficiency = **107.5%** + +--- + +### Resumen del Work Item + +| Métrica | Valor | Explicación | +|---------|-------|-------------| +| Active Hours | 3.5h | Tiempo real trabajado | +| Estimated Hours | 4.0h | Tiempo estimado | +| Completion Bonus | 0.8h | 20% de 4h | +| **Fair Efficiency** | **107.5%** | (4.3 / 4.0) × 100 | +| **Delivery Score** | **100.0** | Puntos por entregar a tiempo | +| Days Ahead/Behind | 0 días | Entregado exactamente en la fecha objetivo | + +**Nota:** La eficiencia es >100% porque el completion bonus (0.8h) más el tiempo activo (3.5h) supera las horas estimadas (4.0h). + +--- + +## Ejemplo 5: Cálculo del Overall Developer Score + +Este ejemplo muestra cómo se combinan todas las métricas para calcular el **Overall Developer Score** de un desarrollador. + +### Datos del Desarrollador (Resumen del Mes) + +Supongamos que un desarrollador tiene los siguientes promedios y porcentajes: + +| Métrica | Valor | Descripción | +|---------|-------|-------------| +| **Average Fair Efficiency** | 85.0% | Promedio de fair efficiency de todos sus items | +| **Average Delivery Score** | 95.0 | Promedio de delivery scores | +| **Completion Rate** | 80.0% | % de items completados vs asignados | +| **On-Time Delivery** | 60.0% | % de items entregados a tiempo | + +### Pesos de Configuración + +```json +{ + "weights": { + "fair_efficiency": 0.2, // 20% + "delivery_score": 0.3, // 30% + "completion_rate": 0.3, // 30% + "on_time_delivery": 0.2 // 20% + } +} +``` + +### Cálculo del Overall Developer Score + +**Fórmula:** +``` +Overall Score = (Fair Efficiency × W1) + + (Delivery Score × W2) + + (Completion Rate × W3) + + (On-Time Delivery × W4) +``` + +**Cálculo paso a paso:** + +1. **Contribución de Fair Efficiency:** + ``` + = 85.0 × 0.2 = 17.0 puntos + ``` + +2. **Contribución de Delivery Score:** + ``` + = 95.0 × 0.3 = 28.5 puntos + ``` + +3. **Contribución de Completion Rate:** + ``` + = 80.0 × 0.3 = 24.0 puntos + ``` + +4. **Contribución de On-Time Delivery:** + ``` + = 60.0 × 0.2 = 12.0 puntos + ``` + +**Overall Developer Score:** +``` +Overall Score = 17.0 + 28.5 + 24.0 + 12.0 = 81.5 puntos +``` + +✅ **Resultado:** Overall Developer Score = **81.5** + +--- + +### Interpretación del Score + +| Rango | Interpretación | +|-------|----------------| +| 80-100 | Excelente | +| 65-79 | Bueno | +| 60-64 | Aceptable (mínimo) | +| 45-59 | Necesita mejora | +| <45 | Requiere intervención | + +En este ejemplo, **81.5 puntos** indica un desempeño **Excelente**. + +--- + +## Resumen de Fórmulas + +### Fair Efficiency + +``` +Fair Efficiency = (Numerador / Denominador) × 100 + +Donde: + Numerador = Active Hours + Completion Bonus + Denominador = Estimated Hours + Late Penalty Mitigation + + Completion Bonus = Estimated Hours × 0.20 (si está completado) + Late Penalty Mitigation = según días de retraso: + - 1-3 días: 2.0 horas + - 4-7 días: 4.0 horas + - 8-14 días: 6.0 horas + - 15+ días: 8.0 horas +``` + +### Delivery Score + +Puntos fijos según timing: + +| Timing | Score | +|--------|-------| +| 5+ días antes | 130.0 | +| 3-4 días antes | 120.0 | +| 1-2 días antes | 110.0 | +| A tiempo | 100.0 | +| 1-3 días tarde | 95.0 | +| 4-7 días tarde | 90.0 | +| 8-14 días tarde | 85.0 | +| 15+ días tarde | 70.0 | + +### Overall Developer Score + +``` +Overall Score = (Fair Efficiency × W1) + + (Delivery Score × W2) + + (Completion Rate × W3) + + (On-Time Delivery × W4) + +Donde W1 + W2 + W3 + W4 = 1.0 (100%) +``` + +--- + +## Notas Importantes + +1. **Completion Bonus:** Solo se aplica si el work item está en estado "Closed", "Done", o "Resolved". + +2. **Late Penalty Mitigation:** Aumenta el denominador para suavizar el impacto de entregas tardías. No es un bonus, sino una forma de hacer el cálculo más justo. + +3. **Max Efficiency Cap:** Si el Fair Efficiency excede 150%, se capa a 150%. + +4. **Delivery Score vs Fair Efficiency:** El Delivery Score es independiente y se usa en el Overall Developer Score. Los timing bonuses NO se agregan al numerador de Fair Efficiency. + +5. **On-Time Delivery:** Se calcula como porcentaje de items entregados a tiempo (0 días o antes) vs total de items con datos. + +--- + +## Referencias + +- [SCORING_PARAMETERS.md](SCORING_PARAMETERS.md) - Guía completa de parámetros configurables +- [WORK_ITEM_QUERYING_GUIDE.md](WORK_ITEM_QUERYING_GUIDE.md) - Guía de uso del sistema +- [FLOW_DIAGRAM.md](FLOW_DIAGRAM.md) - Diagrama de flujo del proceso de cálculo diff --git a/documentation/SCORING_PARAMETERS.md b/documentation/SCORING_PARAMETERS.md new file mode 100644 index 0000000..77d9505 --- /dev/null +++ b/documentation/SCORING_PARAMETERS.md @@ -0,0 +1,379 @@ +# Scoring Parameters Guide + +This guide explains how to adjust developer scoring weights and efficiency parameters to match your team's priorities. + +## Table of Contents + +1. [Overview](#overview) +2. [Developer Score Weights](#developer-score-weights) +3. [Efficiency Scoring](#efficiency-scoring) +4. [Business Hours](#business-hours) +5. [Example Configurations](#example-configurations) +6. [CLI Overrides](#cli-overrides) + +**📚 For detailed calculation examples with real data, see [SCORING_EXAMPLES.md](SCORING_EXAMPLES.md)** + +--- + +## Overview + +The Overall Developer Score is calculated as: + +``` +Score = (Fair Efficiency x W1) + (Delivery Score x W2) + (Completion Rate x W3) + (On-Time Delivery x W4) +``` + +All parameters are configured in `config/azure_devops_config.json`. + +**Configuration Priority:** +1. CLI parameters (highest) +2. Custom config file (`--scoring-config`) +3. Default config (`config/azure_devops_config.json`) +4. Code defaults (lowest) + +--- + +## Developer Score Weights + +Located in `developer_scoring.weights`: + +### Current Defaults + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.2, + "delivery_score": 0.3, + "completion_rate": 0.3, + "on_time_delivery": 0.2 + }, + "minimum_items_for_scoring": 3 + } +} +``` + +### Weight Descriptions + +| Weight | Default | Description | +|--------|---------|-------------| +| `fair_efficiency` | 20% | Productive time vs estimated time | +| `delivery_score` | 30% | Points for early/on-time delivery (60-130 scale) | +| `completion_rate` | 30% | Percentage of items completed | +| `on_time_delivery` | 20% | Percentage delivered by target date | + +**Weights must sum to 1.0 (100%).** + +### How to Modify + +Edit `config/azure_devops_config.json`: + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.25, + "delivery_score": 0.35, + "completion_rate": 0.25, + "on_time_delivery": 0.15 + } + } +} +``` + +--- + +## Efficiency Scoring + +Located in `efficiency_scoring`: + +### Current Defaults + +```json +{ + "efficiency_scoring": { + "completion_bonus_percentage": 0.20, + "max_efficiency_cap": 150.0, + "early_delivery_thresholds": { + "very_early_days": 5, + "early_days": 3, + "slightly_early_days": 1 + }, + "early_delivery_scores": { + "very_early": 130.0, + "early": 120.0, + "slightly_early": 110.0, + "on_time": 100.0 + }, + "early_delivery_bonuses": { + "very_early": 1.0, + "early": 0.5, + "slightly_early": 0.25 + }, + "late_delivery_scores": { + "late_1_3": 95.0, + "late_4_7": 90.0, + "late_8_14": 85.0, + "late_15_plus": 70.0 + }, + "late_penalty_mitigation": { + "late_1_3": 2.0, + "late_4_7": 4.0, + "late_8_14": 6.0, + "late_15_plus": 8.0 + } + } +} +``` + +### Parameter Descriptions + +#### Core Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `completion_bonus_percentage` | 0.20 | 20% bonus for completed items | +| `max_efficiency_cap` | 150.0 | Maximum efficiency score | + +#### Early Delivery Thresholds + +Defines days early for each tier: + +| Threshold | Default | Meaning | +|-----------|---------|---------| +| `very_early_days` | 5 | 5+ days early | +| `early_days` | 3 | 3-4 days early | +| `slightly_early_days` | 1 | 1-2 days early | + +#### Delivery Scores + +Fixed scores assigned by delivery timing: + +| Tier | Score | Trigger | +|------|-------|---------| +| `very_early` | 130 | 5+ days early | +| `early` | 120 | 3-4 days early | +| `slightly_early` | 110 | 1-2 days early | +| `on_time` | 100 | On target date | +| `late_1_3` | 95 | 1-3 days late | +| `late_4_7` | 90 | 4-7 days late | +| `late_8_14` | 85 | 8-14 days late | +| `late_15_plus` | 70 | 15+ days late | + +#### Late Penalty Mitigation + +Hours added to denominator to soften late delivery impact: + +| Days Late | Mitigation | +|-----------|------------| +| 1-3 days | 2.0 hours | +| 4-7 days | 4.0 hours | +| 8-14 days | 6.0 hours | +| 15+ days | 8.0 hours | + +--- + +## Business Hours + +Located in `business_hours`: + +### Current Defaults + +```json +{ + "business_hours": { + "office_start_hour": 9, + "office_end_hour": 18, + "max_hours_per_day": 8, + "timezone": "America/Mexico_City", + "working_days": [1, 2, 3, 4, 5] + } +} +``` + +### Parameters + +| Parameter | Default | Description | +|-----------|---------|-------------| +| `office_start_hour` | 9 | Work day starts at 9 AM | +| `office_end_hour` | 18 | Work day ends at 6 PM | +| `max_hours_per_day` | 8 | Maximum hours credited per day | +| `timezone` | America/Mexico_City | Timezone for calculations | +| `working_days` | [1,2,3,4,5] | Monday=1 through Friday=5 | + +--- + +## Example Configurations + +### Prioritize On-Time Delivery + +For teams where meeting deadlines is critical: + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.15, + "delivery_score": 0.40, + "completion_rate": 0.20, + "on_time_delivery": 0.25 + } + }, + "efficiency_scoring": { + "late_delivery_scores": { + "late_1_3": 85.0, + "late_4_7": 75.0, + "late_8_14": 65.0, + "late_15_plus": 50.0 + } + } +} +``` + +### Focus on Completion Rate + +For teams where finishing tasks matters most: + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.20, + "delivery_score": 0.20, + "completion_rate": 0.45, + "on_time_delivery": 0.15 + } + } +} +``` + +### Balanced with Higher Efficiency Weight + +For teams focused on estimation accuracy: + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.35, + "delivery_score": 0.25, + "completion_rate": 0.25, + "on_time_delivery": 0.15 + } + }, + "efficiency_scoring": { + "completion_bonus_percentage": 0.25, + "max_efficiency_cap": 130.0 + } +} +``` + +### Lenient Late Delivery Scoring + +For teams with frequently changing priorities: + +```json +{ + "efficiency_scoring": { + "late_delivery_scores": { + "late_1_3": 98.0, + "late_4_7": 95.0, + "late_8_14": 90.0, + "late_15_plus": 80.0 + }, + "late_penalty_mitigation": { + "late_1_3": 1.0, + "late_4_7": 2.0, + "late_8_14": 3.0, + "late_15_plus": 4.0 + } + } +} +``` + +### Extended Work Hours + +For teams with different schedules: + +```json +{ + "business_hours": { + "office_start_hour": 8, + "office_end_hour": 20, + "max_hours_per_day": 10, + "timezone": "America/New_York", + "working_days": [1, 2, 3, 4, 5, 6] + } +} +``` + +--- + +## CLI Overrides + +Override parameters directly from command line: + +### Weight Overrides + +```bash +python run.py --query-work-items \ + --assigned-to "Developer" \ + --fair-efficiency-weight 0.3 \ + --delivery-score-weight 0.4 \ + --export-csv "report.csv" +``` + +### Efficiency Overrides + +```bash +python run.py --query-work-items \ + --assigned-to "Developer" \ + --completion-bonus 0.25 \ + --max-efficiency-cap 120.0 \ + --export-csv "report.csv" +``` + +### Custom Config File + +Create a partial config with only your changes: + +```json +{ + "developer_scoring": { + "weights": { + "fair_efficiency": 0.4, + "delivery_score": 0.3, + "completion_rate": 0.2, + "on_time_delivery": 0.1 + } + } +} +``` + +Then use it: + +```bash +python run.py --query-work-items \ + --scoring-config "my_config.json" \ + --assigned-to "Developer" \ + --export-csv "report.csv" +``` + +--- + +## Best Practices + +1. **Start with defaults** - Run reports first to establish a baseline +2. **Make incremental changes** - Adjust one parameter at a time +3. **Document changes** - Keep notes on why parameters were modified +4. **Communicate** - Inform team when scoring criteria change +5. **Review quarterly** - Revisit parameters to ensure alignment with goals +6. **Validate sum** - Weights must always sum to 1.0 + +--- + +## Related Documentation + +- **[SCORING_EXAMPLES.md](SCORING_EXAMPLES.md)** - Detailed calculation examples with real data showing how each parameter affects the scoring +- [WORK_ITEM_QUERYING_GUIDE.md](WORK_ITEM_QUERYING_GUIDE.md) - Complete guide for querying work items +- [FLOW_DIAGRAM.md](FLOW_DIAGRAM.md) - Process flow diagram diff --git a/documentation/WORK_ITEM_QUERYING_GUIDE.md b/documentation/WORK_ITEM_QUERYING_GUIDE.md index b1e5e8c..1d1eacb 100644 --- a/documentation/WORK_ITEM_QUERYING_GUIDE.md +++ b/documentation/WORK_ITEM_QUERYING_GUIDE.md @@ -1,49 +1,101 @@ -# Guía de Consultas de Work Items y Análisis KPI +# Work Item Querying Guide -## Descripción General +Complete reference for querying work items and calculating developer KPIs. -Esta herramienta permite consultar work items de Azure DevOps y calcular métricas de productividad para desarrolladores y equipos. Proporciona análisis detallados de eficiencia, tiempos de entrega y rendimiento del equipo. +## Table of Contents -## Estructura del Proyecto +1. [Basic Usage](#basic-usage) +2. [Query Parameters](#query-parameters) +3. [Configuration File](#configuration-file) +4. [Metrics Explained](#metrics-explained) +5. [CSV Output Columns](#csv-output-columns) +6. [Interpreting Results](#interpreting-results) -La herramienta ahora está organizada en: -- **`entry_points/main.py`** - Interfaz de línea de comandos principal -- **`config/azure_devops_config.json`** - Configuración centralizada -- **`run.py`** - Script de conveniencia para ejecutar la herramienta -- **`classes/`** - Clases principales de funcionalidad -- **`documentation/`** - Esta y otras guías +--- -## Formas de Ejecución +## Basic Usage -### Opción 1: Script de Conveniencia (Recomendado) ```bash -python run.py [opciones] +python run.py --query-work-items \ + --assigned-to "Developer1,Developer2" \ + --start-date "2025-01-01" \ + --end-date "2025-01-31" \ + --export-csv "report.csv" ``` -### Opción 2: Ejecución Directa -```bash -python entry_points/main.py [opciones] -``` +This creates: +- `report.csv` - Detailed work item data +- `report_developer_summary.csv` - Developer KPI summary + +--- + +## Query Parameters + +### Required + +| Parameter | Description | Example | +|-----------|-------------|---------| +| `--assigned-to` | Developer names (comma-separated) | `"Dev1,Dev2"` | +| `--start-date` | Start date (YYYY-MM-DD) | `"2025-01-01"` | +| `--end-date` | End date (YYYY-MM-DD) | `"2025-01-31"` | + +### Optional Filters + +| Parameter | Description | Example | +|-----------|-------------|---------| +| `--work-item-types` | Types to include | `"Task,Bug,User Story"` | +| `--states` | States to include | `"Closed,Done,Active"` | +| `--project-id` | Single project | `` | +| `--project-names` | Specific projects | `"ProjectA,ProjectB"` | +| `--all-projects` | Query all projects | (flag) | + +### Scoring Overrides + +| Parameter | Description | Default | +|-----------|-------------|---------| +| `--scoring-config` | Custom config file | `azure_devops_config.json` | +| `--completion-bonus` | Completion bonus % | `0.20` | +| `--max-efficiency-cap` | Max efficiency | `150.0` | +| `--fair-efficiency-weight` | Weight for efficiency | `0.2` | +| `--delivery-score-weight` | Weight for delivery | `0.3` | + +### Output -## Configuración: Archivo vs. Parámetros de Línea de Comandos +| Parameter | Description | +|-----------|-------------| +| `--export-csv` | Export to CSV file | +| `--no-efficiency` | Skip calculations (faster) | -### Archivo de Configuración (config/azure_devops_config.json) +--- -La herramienta incluye un archivo de configuración centralizada que define: +## Configuration File + +The tool uses `config/azure_devops_config.json`. Key sections: + +### State Categories -**Estados y Categorías:** ```json { "state_categories": { - "productive_states": ["Active", "In Progress", "Development", "Code Review", "Testing"], - "pause_stopper_states": ["Stopper", "Blocked", "On Hold", "Waiting"], + "assigned_states": ["New", "To Do"], + "productive_states": ["Active", "In Progress", "Code Review", "Testing"], + "pause_stopper_states": ["Blocked", "On Hold", "Waiting"], "completion_states": ["Resolved", "Closed", "Done"], - "ignored_states": ["Removed", "Discarded", "Cancelled"] + "ignored_states": ["Removed", "Cancelled"] } } ``` -**Horarios de Negocio (México):** +| Category | Behavior | +|----------|----------| +| **Assigned** | No time counted (assignment state) | +| **Productive** | Time counts toward efficiency (business hours only) | +| **Pause/Stopper** | Pauses tracking, tracked separately | +| **Completion** | Stops tracking, eligible for bonus | +| **Ignored** | Excluded from analysis | + +### Business Hours + ```json { "business_hours": { @@ -56,541 +108,176 @@ La herramienta incluye un archivo de configuración centralizada que define: } ``` -**Puntuación de Eficiencia:** +### Scoring Weights + ```json { - "efficiency_scoring": { - "completion_bonus_percentage": 0.20, - "max_efficiency_cap": 150.0, - "early_delivery_thresholds": { - "very_early_days": 5, - "early_days": 3, - "slightly_early_days": 1 + "developer_scoring": { + "weights": { + "fair_efficiency": 0.2, + "delivery_score": 0.3, + "completion_rate": 0.3, + "on_time_delivery": 0.2 } } } ``` -### Usar Configuración del Archivo (Recomendado) +See [SCORING_PARAMETERS.md](SCORING_PARAMETERS.md) for detailed customization. -```bash -# Usa configuración predefinida en config/azure_devops_config.json -python run.py --query-work-items \ - --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hanz Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" \ - --export-csv "results.csv" -``` +--- -### Sobrescribir con Parámetros de Línea de Comandos +## Metrics Explained -```bash -# Sobrescribe estados productivos de la configuración -python run.py --query-work-items \ - --assigned-to "Luis Nocedal,Carlos Vazquez" \ - --productive-states "Active,In Progress,Doing,Code Review" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" \ - --export-csv "results.csv" -``` - -### Usar Configuración Personalizada +### Fair Efficiency Score -```bash -# Especifica un archivo de configuración diferente -python run.py --query-work-items \ - --scoring-config "mi_config_personalizada.json" \ - --assigned-to "Luis Nocedal,Carlos Vazquez" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" \ - --export-csv "results.csv" ``` - -### Prioridad de Configuración - -La herramienta aplica configuraciones en el siguiente orden de prioridad (mayor a menor): - -1. **Parámetros de línea de comandos** - Máxima prioridad -2. **Archivo de configuración personalizado** (`--scoring-config`) -3. **Archivo de configuración por defecto** (`config/azure_devops_config.json`) -4. **Valores por defecto en el código** - -**Ejemplo de Combinación:** -```bash -# La configuración se toma de: -# - Estados productivos: parámetro --productive-states (línea de comandos) -# - Horarios de negocio: config/azure_devops_config.json (archivo por defecto) -# - Timezone: America/Mexico_City (archivo por defecto) -python run.py --query-work-items \ - --assigned-to "Luis Nocedal" \ - --productive-states "Active,In Progress,Doing" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" +Numerator = Active Hours + Completion Bonus + Timing Bonus +Denominator = Estimated Hours + Late Penalty Mitigation +Fair Efficiency = (Numerator / Denominator) x 100 ``` -### Ventajas del Archivo de Configuración +- **Completion Bonus**: 20% of estimated hours (for completed items) +- **Timing Bonus**: Extra hours credited for early delivery +- **Late Penalty Mitigation**: Hours added to soften late delivery impact -✅ **Consistencia:** Todos los análisis usan los mismos criterios -✅ **Facilidad:** Comandos más cortos y legibles -✅ **Mantenimiento:** Cambios centralizados sin modificar comandos -✅ **Documentación:** Configuración visible y versionable -✅ **Timezone:** Configurado para México (America/Mexico_City) +### Delivery Score -### Cuándo Usar Parámetros de Línea de Comandos +Fixed scores by delivery timing: -🔧 **Experimentación:** Probar diferentes estados o configuraciones -🔧 **Casos especiales:** Análisis con criterios únicos -🔧 **Debugging:** Aislar problemas con configuraciones específicas -🔧 **Automatización:** Scripts con configuraciones variables +| Timing | Score | +|--------|-------| +| Very early (5+ days) | 130 | +| Early (3-4 days) | 120 | +| Slightly early (1-2 days) | 110 | +| On time | 100 | +| 1-3 days late | 95 | +| 4-7 days late | 90 | +| 8-14 days late | 85 | +| 15+ days late | 70 | -## Comandos de Ejemplo Mejorados +### Overall Developer Score -### Para Análisis Completo (Work Items Cerrados + Activos) -```bash -python run.py --query-work-items \ - --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alex Valenzuela,Gerardo Melgoza,Hanz Izarraraz,Osvaldo de Luna,Uriel Cortes,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Eduardo Félix,Daniel Cayola,Karina González,Ximena Segura" \ - --work-item-types "Task,User Story,Bug" \ - --states "Closed,Done,Active,New,In Progress" \ - --start-date "2025-07-01" \ - --end-date "2025-07-31" \ - --productive-states "Active,In Progress,Code Review,Testing" \ - --export-csv "organization_sprint_analysis_complete.csv" ``` - -```bash -python run.py --query-work-items \ - --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alejandro Valenzuela,Gerardo Melgoza,Hanz Izarraraz,Osvaldo de Luna,Uriel Cortés,Emmanuel Pérez,Fernando Alcaraz,Damian Gaspar,Cristian Soria,Daniel Cayola,Ximena Segura" \ - --work-item-types "Task,User Story,Bug" \ - --states "Closed,Done,Active,New,In Progress,Resolved" \ - --start-date "2025-08-01" \ - --end-date "2025-08-21" \ - --productive-states "Active,In Progress,Code Review,Testing,Doing" \ - --export-csv "organization_sprint_analysis_complete.csv" +Score = (Efficiency x 0.2) + (Delivery x 0.3) + (Completion x 0.3) + (OnTime x 0.2) ``` -### Solo Work Items Cerrados (Análisis Original) -```bash -python run.py --query-work-items \ - --assigned-to "Luis Nocedal,Carlos Vazquez,Diego Lopez,Alex Valenzuela" \ - --work-item-types "Task,User Story,Bug" \ - --states "Closed,Done" \ - --start-date "2025-06-01" \ - --end-date "2025-07-01" \ - --productive-states "Active,In Progress" \ - --export-csv "organization_sprint_analysis_closed.csv" -``` - -## Métricas y Cálculos Principales - -### Métricas por Desarrollador -Basándose en el análisis de datos reales del equipo: - -**1. Tasa de Finalización (Completion Rate %)** -- % de work items completados vs. asignados -- Ejemplo: Carlos Vazquez = 100% (71/71 items completados) - -**2. Entrega a Tiempo (On-Time Delivery %)** -- % de items entregados antes/en la fecha objetivo -- Ejemplo: Diego Lopez = 55.81% (el mejor del equipo) - -**3. Eficiencia Promedio (Average Fair Efficiency)** -- Tiempo productivo vs. tiempo total en estados activos -- Ejemplo: Diego Lopez = 62.95% (el más eficiente) - -**4. Puntuación de Entrega (Average Delivery Score)** -- Calificación ponderada basada en días de adelanto/retraso -- Ejemplo: Damian Gaspar = 93.02 (mejor puntuación) - -**5. Puntuación Global del Desarrollador (Overall Developer Score)** -- Combinación de eficiencia y entrega a tiempo -- Fórmula: (Efficiency × 0.4) + (Delivery Score × 0.6) -- Ejemplo: Diego Lopez = 78.25 (mejor puntuación general) - -## Parámetros del Comando - -### Filtros Básicos -```bash ---assigned-to "Desarrollador1,Desarrollador2" # Lista de desarrolladores separados por coma ---work-item-types "Task,User Story,Bug" # Tipos de work items ---states "Closed,Done" # Estados finales ---start-date "2025-06-01" # Fecha de inicio (YYYY-MM-DD) ---end-date "2025-07-01" # Fecha de fin (YYYY-MM-DD) -``` - -### Estados Productivos vs. Bloqueados -```bash ---productive-states "Active,In Progress,Code Review" # Estados considerados productivos ---blocked-states "Blocked,Waiting,On Hold" # Estados considerados bloqueados -``` - -### Exportación -```bash ---export-csv "nombre_archivo.csv" # Exportar resultados a CSV -``` - -## Explicación de Columnas del CSV - -### Archivo: `*_developer_summary.csv` - -**Developer**: Nombre del desarrollador asignado - -**Total Work Items**: Número total de work items procesados por el desarrollador - -**Completed Items**: Work items en estado "Closed", "Done" o "Resolved" - -**Completion Rate %**: -``` -(Completed Items / Total Work Items) × 100 -``` - -**On-Time Delivery %**: -``` -(Items entregados a tiempo o antes / Items completados) × 100 -``` - -**Average Fair Efficiency**: -``` -Promedio de: (Tiempo en Estados Productivos / Tiempo Total Activo) × 100 -``` -- Solo considera work items con historial de cambios de estado -- Estados productivos por defecto: "Active", "In Progress", "Code Review", "Testing" - -**Average Delivery Score**: Puntuación promedio basada en días de adelanto/retraso -- Entregas tempranas: +20 puntos por día -- A tiempo: 100 puntos base -- 1-3 días tarde: -5 puntos por día -- 4-7 días tarde: -10 puntos por día -- 8-14 días tarde: -15 puntos por día -- 15+ días tarde: -25 puntos por día - -**Overall Developer Score**: -``` -(Average Fair Efficiency × 0.4) + (Average Delivery Score × 0.6) -``` - -**Total Active Hours**: Suma de horas en estados productivos -- Solo días laborables (lunes-viernes) -- Máximo 10 horas por día -- Basado en historial real de cambios de estado - -**Total Estimated Hours**: Suma de horas estimadas por work item -``` -SOLO work items con Target Date: - Si hay Start Date y Target Date: - días = (Target Date - Start Date) - días_laborables = días × (5/7) - horas = días_laborables × 8 - mínimo = 4 horas - - Si solo hay Target Date (fallback por tipo): - User Story = 16 horas - Task = 8 horas - Bug = 4 horas - Otros = 8 horas - -Work items SIN Target Date = 0 horas -``` - -**Avg Days Ahead/Behind**: Promedio de días de adelanto (negativo) o retraso (positivo) - -**Reopened Items Handled**: Work items que fueron reabiertos y reasignados - -**Reopened Rate %**: -``` -(Reopened Items Handled / Total Work Items) × 100 -``` - -**Work Item Types**: Número de tipos diferentes de work items manejados - -**Projects Count**: Número de proyectos en los que trabajó el desarrollador - -**Early Deliveries**: Items entregados antes de la fecha objetivo - -**On-Time Deliveries**: Items entregados exactamente en la fecha objetivo - -**Late 1-3 Days**: Items con 1-3 días de retraso - -**Late 4-7 Days**: Items con 4-7 días de retraso - -**Late 8-14 Days**: Items con 8-14 días de retraso +Weights are configurable in the config file. -**Late 15+ Days**: Items con 15 o más días de retraso +--- -### Archivo: `*_detailed.csv` +## CSV Output Columns -**ID**: Work item ID único +### Developer Summary (`*_developer_summary.csv`) -**Title**: Título del work item +| Column | Description | +|--------|-------------| +| Developer | Developer name | +| Total Work Items | Items processed | +| Completed Items | Items in completion states | +| Items With Active Time | Items with tracked time | +| Sample Confidence % | Data quality indicator | +| Completion Rate % | Completion percentage | +| On-Time Delivery % | On-time percentage | +| Average Efficiency % | Average efficiency score | +| Average Delivery Score | Average delivery points | +| Overall Developer Score | Combined weighted score | +| Total Active Hours | Hours in productive states | +| Total Estimated Hours | Sum of estimates | +| Avg Days Ahead/Behind | Average timing | +| Reopened Items Handled | Items reopened and reworked | +| Reopened Rate % | Reopened percentage | +| Work Item Types | Count of different types | +| Projects Count | Projects worked on | +| Early/On-Time/Late Deliveries | Timing breakdown counts | -**Project Name**: Nombre del proyecto +### Detailed Export (`*_detailed.csv`) -**Assigned To**: Desarrollador asignado +| Column | Description | +|--------|-------------| +| ID | Work item ID | +| Title | Work item title | +| Project Name | Project | +| Assigned To | Developer | +| State | Current state | +| Work Item Type | Type (Task, Bug, etc.) | +| Start/Target/Closed Date | Key dates | +| Estimated Hours | Estimated time | +| Active Time (Hours) | Productive time tracked | +| Blocked Time (Hours) | Time in blocked states | +| Efficiency % | Efficiency score | +| Delivery Score | Delivery points | +| Days Ahead/Behind Target | Delivery timing | +| Completion/Timing Bonus | Bonus hours credited | +| Was Reopened | If item was reopened | +| Active After Reopen | Hours after reopening | -**State**: Estado actual del work item +--- -**Work Item Type**: Tipo (Task, User Story, Bug, etc.) +## Interpreting Results -**Start Date**: Fecha de inicio planificada +### Overall Developer Score Ranges -**Target Date**: Fecha objetivo planificada +| Score | Performance | +|-------|-------------| +| 80-100 | Excellent | +| 65-79 | Good | +| 60-64 | Acceptable (minimum) | +| 45-59 | Needs improvement | +| <45 | Requires intervention | -**Closed Date**: Fecha de cierre real +### Key Indicators -**Estimated Hours**: Horas estimadas (solo si tiene Target Date) +| Indicator | Target | +|-----------|--------| +| On-Time Delivery % | > 50% | +| Average Efficiency % | > 40% | +| Overall Score | > 60 | +| Reopened Rate % | < 10% | + +### Common Issues + +| Issue | Solution | +|-------|----------| +| Zero active hours | Check productive states configuration | +| Efficiency > 100% | Normal (bonuses can exceed 100%, capped at 150%) | +| Missing developers | Verify name spelling matches Azure DevOps | +| Slow queries | Use `--no-efficiency` for faster results | + +--- + +## Example Commands + +### Sprint Analysis -**Active Time (Hours)**: Horas en estados productivos - -**Blocked Time (Hours)**: Horas en estados bloqueados - -**Traditional Efficiency %**: Eficiencia tradicional - -**Fair Efficiency Score**: Puntuación de eficiencia justa - -**Delivery Score**: Puntuación de entrega - -**Days Ahead/Behind Target**: Días de adelanto(-) o retraso(+) - -**Completion Bonus**: Bonus por completar - -**Timing Bonus**: Bonus por timing - -**Was Reopened**: Si fue reabierto (True/False) - -**Active After Reopen**: Horas activas después de reapertura - -## Fórmulas de Cálculo Principales - -### Para Completion Rate Realista -Incluir work items activos con target date: -```bash ---states "Closed,Done,Active,New,In Progress,Resolved" -``` -- Work items cerrados: filtrados por `ClosedDate` -- Work items activos: filtrados por `TargetDate` ≤ fecha fin - -### Para Horas Activas Reales (~160h mensuales) -Expandir estados productivos: ```bash ---productive-states "Active,In Progress,Code Review,Testing,To Do,New" -``` - -## Ejemplo Completo de Cálculo de Eficiencia - -### 📋 Work Item de Ejemplo -``` -ID: 12345 -Tipo: "User Story" -Start Date: 2024-01-15T09:00:00Z -Target Date: 2024-01-20T17:00:00Z -Closed Date: 2024-01-18T16:00:00Z - -Historial de Estados: -Rev 1: "New" - 2024-01-15T09:00:00Z -Rev 2: "Active" - 2024-01-15T10:00:00Z -Rev 3: "Blocked" - 2024-01-16T14:00:00Z -Rev 4: "Active" - 2024-01-17T09:00:00Z -Rev 5: "Closed" - 2024-01-18T16:00:00Z - -Parámetros: ---productive-states "Active" ---blocked-states "Blocked" -``` - -### 🔢 Cálculos Paso a Paso - -#### 1. **Estimated Hours** -```python -# Duración entre Start Date y Target Date -start = 2024-01-15T09:00:00Z -target = 2024-01-20T17:00:00Z -duration = 5.33 días -working_days = 5.33 × (5/7) = 3.81 días -estimated_hours = 3.81 × 8 = 30.48 horas -``` - -#### 2. **Active Time (Hours)** - Solo estados productivos -```python -# Rev 2→3: Active (2024-01-15T10:00:00Z → 2024-01-16T14:00:00Z) -# 1.5 días laborales × 8h/día = 12h, pero máximo 10h/día -active_time_1 = 10h (lunes) + 4h (martes) = 14 horas - -# Rev 4→5: Active (2024-01-17T09:00:00Z → 2024-01-18T16:00:00Z) -# 1.29 días laborales × 8h/día = 10.32h -active_time_2 = 10h (miércoles) + 0.32h (jueves) = 10.32 horas - -total_active_hours = 14 + 10.32 = 24.32 horas -``` - -#### 3. **Blocked Time (Hours)** - Solo estados bloqueados -```python -# Rev 3→4: Blocked (2024-01-16T14:00:00Z → 2024-01-17T09:00:00Z) -# 19 horas totales (incluye noche y madrugada) -blocked_time = 19 horas -``` - -#### 4. **Completion Bonus** - 20% del tiempo estimado -```python -# Work item está "Closed" = completado -completion_bonus = 30.48 × 0.20 = 6.096 horas -``` - -#### 5. **Delivery Timing Bonus** -```python -# Cerrado 2 días antes del target date -days_difference = -2 días (temprano) -# Bonus por entrega temprana (1-3 días): 2 × 0.5 = 1 hora -timing_bonus_hours = 1.0 horas -``` - -#### 6. **Fair Efficiency Score** -```python -numerator = active_hours + completion_bonus + timing_bonus -numerator = 24.32 + 6.096 + 1.0 = 31.416 horas - -denominator = estimated_hours + late_penalty_mitigation -denominator = 30.48 + 0.0 = 30.48 horas - -fair_efficiency = (31.416 / 30.48) × 100 = 103.07% -``` - -#### 7. **Traditional Efficiency** (para comparación) -```python -total_time = tiempo_entre_primera_y_ultima_transicion -total_time = 67 horas (lunes 9:00 → jueves 16:00) - -traditional_efficiency = (24.32 / 67) × 100 = 36.3% -``` - -### 📊 Resultado Final en CSV -```json -{ - "ID": 12345, - "Estimated Hours": 30.48, - "Active Time (Hours)": 24.32, - "Blocked Time (Hours)": 19.0, - "Traditional Efficiency %": 36.3, - "Fair Efficiency Score": 103.07, - "Delivery Score": 120.0, - "Days Ahead/Behind Target": -2, - "Completion Bonus": 6.096, - "Timing Bonus": 1.0, - "Was Reopened": false -} -``` - -### 🎯 Interpretación Correcta - -**Fair Efficiency Score (103.07%) NO significa** que tardaste 31 horas en 30 estimadas. - -**SÍ significa** que: -- Trabajaste **24.32 horas reales** (menos que las 30.48 estimadas) -- Generaste **31.416 "puntos de valor"** por entregar temprano y completar -- Tu **"eficiencia valorada"** es 103% vs. lo estimado - -**Es un sistema de recompensas** que: -- ✅ Reconoce entrega temprana -- ✅ Premia completar tareas -- ✅ Puede superar 100% legítimamente -- ❌ NO es tiempo real trabajado vs. estimado - -**Comparación**: -- **Traditional Efficiency**: 36.3% = "Trabajaste 24.32h de un total de 67h" -- **Fair Efficiency Score**: 103.07% = "Generaste 103% del valor esperado" - -## Personalización y Ajustes - -### Opción 1: Modificar Archivo de Configuración (Recomendado) - -#### Estados Productivos -Editar en `config/azure_devops_config.json`: -```json -{ - "state_categories": { - "productive_states": ["Active", "In Progress", "Development", "Code Review", "Testing", "Doing"] - } -} -``` - -#### Ponderaciones de Puntuación -Editar en `config/azure_devops_config.json`: -```json -{ - "developer_scoring": { - "weights": { - "fair_efficiency": 0.4, - "delivery_score": 0.3, - "completion_rate": 0.2, - "on_time_delivery": 0.1 - } - } -} +python run.py --query-work-items \ + --assigned-to "Dev1,Dev2,Dev3" \ + --work-item-types "Task,Bug" \ + --states "Closed,Done" \ + --start-date "2025-01-01" \ + --end-date "2025-01-15" \ + --export-csv "sprint_analysis.csv" ``` -#### Penalizaciones de Retraso -Editar en `config/azure_devops_config.json`: -```json -{ - "efficiency_scoring": { - "early_delivery_scores": { - "very_early": 130.0, - "early": 120.0, - "slightly_early": 110.0, - "on_time": 100.0 - }, - "late_delivery_scores": { - "late_1_3": 90.0, - "late_4_7": 80.0, - "late_8_14": 70.0, - "late_15_plus": 60.0 - } - } -} -``` +### Complete Analysis (Active + Closed) -#### Horarios de Negocio y Timezone -Editar en `config/azure_devops_config.json`: -```json -{ - "business_hours": { - "office_start_hour": 9, - "office_end_hour": 18, - "max_hours_per_day": 8, - "timezone": "America/Mexico_City" - } -} +```bash +python run.py --query-work-items \ + --assigned-to "Dev1,Dev2" \ + --states "Closed,Done,Active,In Progress" \ + --start-date "2025-01-01" \ + --end-date "2025-01-31" \ + --export-csv "complete_analysis.csv" ``` -### Opción 2: Modificar Código Fuente +### Custom Scoring -#### Estados Productivos -Para cambiar qué estados se consideran productivos, editar en `classes/WorkItemOperations.py`: -```python -DEFAULT_PRODUCTIVE_STATES = ['Active', 'In Progress', 'Code Review', 'Testing'] -``` - -#### Ajustar Ponderaciones de Puntuación -Para modificar la fórmula de puntuación global, ubicar en `classes/efficiency_calculator.py`: -```python -# Cambiar pesos en developer_score_weights -'developer_score_weights': { - 'fair_efficiency': 0.4, # 40% - 'delivery_score': 0.3, # 30% - 'completion_rate': 0.2, # 20% - 'on_time_delivery': 0.1 # 10% -} +```bash +python run.py --query-work-items \ + --assigned-to "Developer" \ + --fair-efficiency-weight 0.3 \ + --delivery-score-weight 0.4 \ + --completion-bonus 0.25 \ + --export-csv "custom_scoring.csv" ``` - -## Interpretación de Resultados - -### Rangos de Overall Developer Score: -- **80-100**: Excelente rendimiento -- **65-79**: Buen rendimiento -- **60-64**: Rendimiento aceptable (umbral mínimo) -- **45-59**: Necesita mejora -- **<45**: Requiere intervención inmediata - -### Indicadores Clave para Monitoreo: -1. **On-Time Delivery % > 50%**: Objetivo mínimo del equipo -2. **Average Fair Efficiency > 40%**: Límite inferior aceptable -3. **Overall Developer Score > 60**: Meta mínima del equipo -4. **Reopened Rate % < 10%**: Control de calidad \ No newline at end of file diff --git a/entry_points/main.py b/entry_points/main.py index 64d67b3..7fb9fd8 100644 --- a/entry_points/main.py +++ b/entry_points/main.py @@ -79,50 +79,121 @@ def explain_commands(): python main.py --list-and-upgrade-webhooks --filter-tag "Production" --query-work-items - Query work items with dynamic filtering and KPI calculations. - Project scope (choose one): - --project-id : Query a specific project ID. - --project-names : Query specific projects by name (comma-separated). - (No project args) : Query ALL projects in the organization. + Query work items from Logic App (Fabric Data Warehouse) with KPI calculations. + + IMPORTANT: This command now uses Logic App as the default and only source. + Legacy WIQL/Analytics methods have been removed. + + Required arguments: + --start-date : Start date in YYYY-MM-DD format (required) + --end-date : End date in YYYY-MM-DD format (required) + Optional arguments: - --assigned-to : List of users to filter by (comma-separated). - --work-item-types : List of work item types (comma-separated). - --states : List of states to filter by (comma-separated). - Default: Includes both completed (Closed, Done, Resolved) and active (Active, New, To Do, In Progress) items - --start-date : Start date for filtering (YYYY-MM-DD format). - For closed items: filters by closed date. For active items: filters by target date. - --end-date : End date for filtering (YYYY-MM-DD format). - For closed items: filters by closed date. For active items: filters by target date. - --date-field : Field to use for date filtering (default: ClosedDate). + --assigned-to : Comma-separated list of user names or emails. + If omitted, queries all users from user_email_mapping.json. + Supports both names ("Carlos Vazquez") and emails ("carlos.vazquez@inbest.cloud"). --no-efficiency : Skip efficiency calculations for faster results. - --export-csv : Export results to CSV file. - --area-path : Filter by area path. - --iteration-path : Filter by iteration path. - --all-projects : Query all projects (skip smart filtering based on user activity). - --max-projects : Maximum number of projects to check for user activity (default: 50). + --export-csv : Export results to CSV file (detailed and summary). + --no-parallel : Disable parallel revision fetching (use sequential). + --max-workers : Number of parallel workers (default: 10). + Examples: - # Query projects with user activity (smart filtering) - python main.py --query-work-items --assigned-to "Carlos Vazquez,Alex Valenzuela" - - # Query all projects (no smart filtering) - python main.py --query-work-items --assigned-to "Carlos Vazquez,Alex Valenzuela" --all-projects - - # Query more projects for user activity (check up to 100 projects) - python main.py --query-work-items --assigned-to "Carlos Vazquez,Alex Valenzuela" --max-projects 100 - - # Query specific projects - python main.py --query-work-items --project-names "ProjectA,ProjectB" --states "Closed,Done" - - # Query single project - python main.py --query-work-items --project-id --start-date "2025-06-01" + # Query all users for October 2025 + python main.py --query-work-items --start-date 2025-10-01 --end-date 2025-10-31 --export-csv reports/october.csv + + # Query specific users + python main.py --query-work-items --start-date 2025-10-01 --end-date 2025-10-31 --assigned-to "Carlos Vazquez,Diego Lopez" + + # Query using emails directly + python main.py --query-work-items --start-date 2025-10-01 --end-date 2025-10-31 --assigned-to "carlos.vazquez@inbest.cloud" + + # Query without efficiency calculations (faster) + python main.py --query-work-items --start-date 2025-10-01 --end-date 2025-10-31 --no-efficiency + + --daily-snapshot + Generate simplified daily work item snapshot for automated tracking. + + This command creates lightweight CSV reports optimized for GitHub Actions → Logic App → SharePoint workflows. + Generates a 12-column CSV with basic time tracking (active/blocked hours) WITHOUT complex efficiency calculations. + + Performance: 40-60% faster than --query-work-items due to simplified processing. + + Optional arguments: + --snapshot-mode : Date range mode (default: yesterday) + - yesterday : Previous day only (default) + - today : Current day up to now + - month-to-date : From first day of month until today + - custom : User-defined range (requires --start-date and --end-date) + --output-filename : Override default filename for automation workflows. + Default: daily_snapshot_YYYYMMDD_HHMM.csv (timestamped) + Fixed name example: --output-filename daily_snapshot.csv + Use fixed filename when Logic App should process the same file daily. + --assigned-to : Comma-separated list of user names or emails (omit for all users). + --start-date : Start date for custom mode (YYYY-MM-DD format). + --end-date : End date for custom mode (YYYY-MM-DD format). + --no-parallel : Disable parallel processing (use sequential). + --max-workers : Number of parallel workers (default: 10). + + Output CSV columns (12 total): + ID, Title, Project Name, Assigned To, State, Work Item Type, + Start Date, Target Date, Closed Date, Estimated Hours, + Active Time (Hours), Blocked Time (Hours) + + IMPORTANT: Active Time and Blocked Time show TOTAL ACCUMULATED hours from the entire + work item history, NOT filtered to the date range. This means: + - A work item active from Nov 15 → Dec 10 will show ~17 days in both November + and December reports (running total) + - Each daily run shows updated accumulated time as work progresses + - Date range only filters WHICH work items to include, not the time calculation + + Examples: + # Yesterday's snapshot (default mode) - all users + python main.py --daily-snapshot + + # Fixed filename for automation (overwrites same file daily) + python main.py --daily-snapshot --output-filename daily_snapshot.csv + + # Fixed filename with specific date range + python main.py --daily-snapshot --snapshot-mode custom --start-date 2025-11-01 --end-date 2025-11-10 --output-filename monthly_snapshot.csv + + # Today's snapshot for specific users + python main.py --daily-snapshot --snapshot-mode today --assigned-to "Carlos Vazquez,Diego Lopez" + + # Month-to-date snapshot (auto-generates monthly filename) + python main.py --daily-snapshot --snapshot-mode month-to-date + # Output: daily_snapshot_november.csv (or current month) + # File is overwritten daily with month-to-date work items and their total accumulated time + + # Yesterday's snapshot with sequential processing + python main.py --daily-snapshot --no-parallel + + Output Filenames: + - yesterday/today/custom: daily_snapshot_YYYYMMDD_HHMM.csv (timestamped) + - month-to-date: daily_snapshot_.csv (monthly cumulative) + - --output-filename: Use custom name (overrides automatic naming) + + Automation Workflow (GitHub Actions → Logic App): + # Recommended: Monthly cumulative file (one file per month) + python main.py --daily-snapshot --snapshot-mode month-to-date + # Overwrites daily_snapshot_november.csv daily with: + # - Work items active in November (filtered by date range) + # - Total accumulated active/blocked time from entire history (not filtered) + # Automatically switches to daily_snapshot_december.csv on Dec 1st + + # Alternative: Fixed filename (overwrites same file daily) + python main.py --daily-snapshot --output-filename daily_snapshot.csv Environment Variables: AZURE_DEVOPS_ORG : Default Azure DevOps organization name. AZURE_DEVOPS_PAT : Default Azure DevOps personal access token. + AZURE_LOGIC_APP_URL : Logic App URL for work item fetching (REQUIRED for --query-work-items). AZURE_DEVOPS_WORKITEM_WEBHOOK_URL : Default webhook URL for workitem.updated events. AZURE_DEVOPS_BUILD_WEBHOOK_URL : Default webhook URL for build.complete events. AZURE_DEVOPS_RELEASE_WEBHOOK_URL : Default webhook URL for release.deployment.completed events. +Configuration Files: + user_email_mapping.json : Name-to-email mapping for user resolution (REQUIRED for --query-work-items). + Use --help for a detailed usage guide. """ print(explanation) @@ -151,9 +222,107 @@ def handle_project_operations(args, project_ops): print("Error: No valid project-specific operation provided.") +def handle_daily_snapshot(args, organization, personal_access_token): + """ + Handle daily snapshot generation for automated tracking. + + Generates simplified CSV files with basic time tracking data (active/blocked hours) + without complex efficiency calculations or performance metrics. + + Optimized for GitHub Actions → Logic App → SharePoint workflows. + """ + from datetime import datetime, timedelta + + print("📸 ========================================") + print("📸 DAILY SNAPSHOT GENERATION") + print("📸 ========================================") + + # Calculate date range based on snapshot mode + snapshot_mode = args.snapshot_mode + today = datetime.now().date() + + if snapshot_mode == "yesterday": + target_date = today - timedelta(days=1) + start_date = target_date.strftime("%Y-%m-%d") + end_date = target_date.strftime("%Y-%m-%d") + print(f"📅 Mode: Yesterday ({start_date})") + elif snapshot_mode == "today": + start_date = today.strftime("%Y-%m-%d") + end_date = today.strftime("%Y-%m-%d") + print(f"📅 Mode: Today ({start_date})") + elif snapshot_mode == "month-to-date": + first_day_of_month = today.replace(day=1) + start_date = first_day_of_month.strftime("%Y-%m-%d") + end_date = today.strftime("%Y-%m-%d") + print(f"📅 Mode: Month-to-date ({start_date} to {end_date})") + elif snapshot_mode == "custom": + if not args.start_date or not args.end_date: + print("❌ Error: Custom mode requires --start-date and --end-date") + print(" Example: --snapshot-mode custom --start-date 2025-01-01 --end-date 2025-01-31") + return + start_date = args.start_date + end_date = args.end_date + print(f"📅 Mode: Custom ({start_date} to {end_date})") + + # Parse assigned-to filter + assigned_to = [name.strip() for name in args.assigned_to.split(',')] if args.assigned_to else None + + # Determine output filename + if args.output_filename: + # Use custom filename (for automation workflows) + filename = args.output_filename + print(f"📁 Output file: {filename} (fixed filename)") + elif snapshot_mode == "month-to-date": + # Auto-generate month-based filename for month-to-date mode + month_name = today.strftime("%B").lower() # e.g., "november" + filename = f"daily_snapshot_{month_name}.csv" + print(f"📁 Output file: {filename} (monthly cumulative)") + else: + # Auto-generate filename with timestamp (default) + timestamp = datetime.now().strftime("%Y%m%d_%H%M") + filename = f"daily_snapshot_{timestamp}.csv" + print(f"📁 Output file: {filename} (timestamped)") + + # Create WorkItemOperations instance (no scoring config needed for snapshots) + work_item_ops = WorkItemOperations(organization, personal_access_token) + + # Execute snapshot generation + try: + result = work_item_ops.get_daily_snapshot_from_logic_app( + from_date=start_date, + to_date=end_date, + assigned_to=assigned_to, + use_parallel_processing=not args.no_parallel, + max_workers=args.max_workers, + output_filename=filename + ) + + # Display summary + print("\n✅ ========================================") + print("✅ SNAPSHOT COMPLETE") + print("✅ ========================================") + print(f" Work items: {result['total_items']}") + print(f" Date range: {start_date} to {end_date}") + print(f" Output file: {filename}") + if assigned_to: + print(f" Filtered to: {', '.join(assigned_to)}") + print("✅ ========================================") + + except Exception as e: + print(f"❌ Snapshot generation failed: {e}") + print("\nTroubleshooting:") + print("1. Ensure AZURE_LOGIC_APP_URL is set in .env file") + print("2. Verify user_email_mapping.json exists with valid name→email mappings") + print("3. Check Logic App is accessible and responding") + return + + def handle_work_item_query(args, organization, personal_access_token): """ Handle work item querying with dynamic filtering and KPI calculations. + + NEW DEFAULT: Uses Logic App for work item fetching. + Legacy WIQL/Analytics method removed per refactoring requirements. """ # Parse comma-separated values (strip whitespace) assigned_to = [name.strip() for name in args.assigned_to.split(',')] if args.assigned_to else None @@ -206,82 +375,38 @@ def handle_work_item_query(args, organization, personal_access_token): # Create WorkItemOperations instance with scoring configuration work_item_ops = WorkItemOperations(organization, personal_access_token, scoring_config) - - # Determine query scope - if args.project_id: - print(f"Querying single project: {args.project_id}") - query_scope = "single project" - else: - if project_names: - print(f"Querying filtered projects: {', '.join(project_names)}") - query_scope = f"projects: {', '.join(project_names)}" - elif args.all_projects: - print("Querying ALL projects in organization (forced)") - query_scope = "all projects (forced)" - elif assigned_to: - print(f"Querying projects with activity for: {', '.join(assigned_to)}") - query_scope = f"projects with activity for: {', '.join(assigned_to)}" - else: - print("Querying ALL projects in organization") - query_scope = "all projects" - - # Execute query - Always use optimized method (removed redundant fallback) - if args.ultra_optimized: - print("⚡ Using ULTRA-OPTIMIZED processing - maximum speed mode!") - print(" • Bypassing project discovery completely") - print(" • Direct organization-level WIQL query") - print(" • Optimized KPI calculations") - print(f" • Parallel processing: {'Disabled' if args.no_parallel else 'Enabled'}") - print(f" • Max workers: {args.max_workers}") - - result = work_item_ops.get_work_items_with_efficiency_optimized( - project_id=args.project_id, - project_names=project_names, - assigned_to=assigned_to, - work_item_types=work_item_types, - states=states, - start_date=args.start_date, - end_date=args.end_date, - date_field=args.date_field, - additional_filters=additional_filters if additional_filters else None, - calculate_efficiency=not args.no_efficiency, - productive_states=productive_states, - blocked_states=blocked_states, - all_projects=args.all_projects, - max_projects=args.max_projects, - use_parallel_processing=not args.no_parallel, - max_workers=args.max_workers, - batch_size=min(args.batch_size, 200), # Enforce Azure DevOps API limit - ultra_mode=True # Enable ultra-optimized mode - ) - else: - # Use optimized method as default (was --optimized flag, now standard behavior) - optimization_mode = "ULTRA-OPTIMIZED" if args.optimized else "OPTIMIZED" - print(f"🚀 Using {optimization_mode} batch processing with parallel execution!") - print(f" • Parallel processing: {'Disabled' if args.no_parallel else 'Enabled'}") - print(f" • Max workers: {args.max_workers}") - print(f" • Batch size: {min(args.batch_size, 200)}") # Enforce Azure DevOps limit - - result = work_item_ops.get_work_items_with_efficiency_optimized( - project_id=args.project_id, - project_names=project_names, + + # NEW DEFAULT FLOW: Use Logic App for work item fetching + # This replaces the previous WIQL/Analytics method + print("🚀 Using Logic App (Fabric Data Warehouse) for work item fetching") + + # Validate required arguments for Logic App flow + if not args.start_date or not args.end_date: + print("❌ Error: --start-date and --end-date are required for Logic App flow") + print(" Example: --start-date 2025-10-01 --end-date 2025-10-31") + return + + # Execute query using Logic App + try: + result = work_item_ops.get_work_items_from_logic_app( + from_date=args.start_date, + to_date=args.end_date, assigned_to=assigned_to, - work_item_types=work_item_types, - states=states, - start_date=args.start_date, - end_date=args.end_date, - date_field=args.date_field, - additional_filters=additional_filters if additional_filters else None, calculate_efficiency=not args.no_efficiency, - productive_states=productive_states, - blocked_states=blocked_states, - all_projects=args.all_projects, - max_projects=args.max_projects, use_parallel_processing=not args.no_parallel, max_workers=args.max_workers, - batch_size=min(args.batch_size, 200), # Enforce Azure DevOps API limit - ultra_mode=args.optimized # Enable ultra mode for --optimized flag + export_csv=args.export_csv ) + except Exception as e: + print(f"❌ Failed to fetch work items from Logic App: {e}") + print("\nTroubleshooting:") + print("1. Ensure AZURE_LOGIC_APP_URL is set in .env file") + print("2. Verify user_email_mapping.json exists with valid name→email mappings") + print("3. Check Logic App is accessible and responding") + sys.exit(1) + + # Note: CSV export is handled within get_work_items_from_logic_app if --export-csv is provided + query_scope = f"Logic App query for {', '.join(assigned_to) if assigned_to else 'all users'}" # Display results print("\n" + "="*80) @@ -427,24 +552,36 @@ def main(): parser.add_argument("--export-projects-csv", action="store_true", help="Export all projects (Name, ID, Tags) to projects_export.csv") - # Work item querying arguments + # Work item querying arguments (Logic App flow) parser.add_argument("--query-work-items", action="store_true", - help="Query work items with dynamic filtering and KPI calculations") - parser.add_argument("--assigned-to", help="Comma-separated list of users to filter by") - parser.add_argument("--work-item-types", help="Comma-separated list of work item types") - parser.add_argument("--states", help="Comma-separated list of states to filter by") - parser.add_argument("--start-date", help="Start date for filtering (YYYY-MM-DD format)") - parser.add_argument("--end-date", help="End date for filtering (YYYY-MM-DD format)") - parser.add_argument("--date-field", default="ClosedDate", help="Field to use for date filtering") + help="Query work items from Logic App (Fabric Data Warehouse) with KPI calculations") + parser.add_argument("--assigned-to", help="Comma-separated list of user names or emails (omit for all users)") + parser.add_argument("--start-date", help="Start date for filtering (YYYY-MM-DD format) - REQUIRED") + parser.add_argument("--end-date", help="End date for filtering (YYYY-MM-DD format) - REQUIRED") parser.add_argument("--no-efficiency", action="store_true", help="Skip efficiency calculations") parser.add_argument("--export-csv", help="Export results to CSV file") - parser.add_argument("--area-path", help="Filter by area path") - parser.add_argument("--iteration-path", help="Filter by iteration path") - parser.add_argument("--project-names", help="Comma-separated list of project names to filter by (for cross-project queries)") - parser.add_argument("--all-projects", action="store_true", help="Query all projects (skip smart filtering based on user activity)") - parser.add_argument("--max-projects", type=int, default=50, help="Maximum number of projects to check for user activity (default: 50)") - parser.add_argument("--productive-states", help="Comma-separated list of states considered productive (e.g., 'Active,In Progress,Development')") - parser.add_argument("--blocked-states", help="Comma-separated list of states considered blocked (e.g., 'Blocked,On Hold,Waiting')") + + # Daily snapshot arguments + parser.add_argument("--daily-snapshot", action="store_true", + help="Generate simplified daily work item snapshot for automated tracking") + parser.add_argument("--snapshot-mode", + choices=["yesterday", "today", "month-to-date", "custom"], + default="yesterday", + help="Snapshot mode: yesterday (default), today, month-to-date, or custom (requires --start-date and --end-date)") + parser.add_argument("--output-filename", + help="Override default filename (default: daily_snapshot_YYYYMMDD_HHMM.csv). Use fixed name for automation workflows.") + + # Legacy arguments (kept for backward compatibility but ignored in Logic App flow) + parser.add_argument("--work-item-types", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--states", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--date-field", default="ClosedDate", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--area-path", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--iteration-path", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--project-names", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--all-projects", action="store_true", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--max-projects", type=int, default=50, help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--productive-states", help="(Legacy - ignored in Logic App flow)") + parser.add_argument("--blocked-states", help="(Legacy - ignored in Logic App flow)") # Developer scoring configuration parser.add_argument("--scoring-config", help="Path to JSON file with custom scoring configuration") @@ -456,12 +593,9 @@ def main(): parser.add_argument("--completion-rate-weight", type=float, help="Completion rate weight in developer score (default: 0.2)") parser.add_argument("--on-time-delivery-weight", type=float, help="On-time delivery weight in developer score (default: 0.1)") - # Performance optimization flags - parser.add_argument("--optimized", action="store_true", help="🚀 Use optimized batch processing with parallel execution for faster performance") - parser.add_argument("--ultra-optimized", action="store_true", help="⚡ Use ULTRA-OPTIMIZED processing - bypasses project discovery completely for maximum speed") + # Performance optimization flags (kept for compatibility with new Logic App flow) parser.add_argument("--no-parallel", action="store_true", help="Disable parallel revision fetching (use sequential instead)") parser.add_argument("--max-workers", type=int, default=10, help="Maximum number of parallel workers for revision fetching (default: 10)") - parser.add_argument("--batch-size", type=int, default=200, help="Batch size for work item details fetching (default: 200, max: 200)") args = parser.parse_args() @@ -553,8 +687,10 @@ def main(): )[1], "export_projects_csv": lambda: az_commands.export_projects_to_csv(), - + "query_work_items": lambda: handle_work_item_query(args, organization, personal_access_token), + + "daily_snapshot": lambda: handle_daily_snapshot(args, organization, personal_access_token), } diff --git a/helpers/__init__.py b/helpers/__init__.py new file mode 100644 index 0000000..653c2cd --- /dev/null +++ b/helpers/__init__.py @@ -0,0 +1,3 @@ +""" +Helper utilities for the Azure DevOps CLI tool. +""" diff --git a/helpers/email_mapping.py b/helpers/email_mapping.py new file mode 100644 index 0000000..ce4b958 --- /dev/null +++ b/helpers/email_mapping.py @@ -0,0 +1,114 @@ +""" +User email mapping utilities. +""" + +import json +import logging +from typing import Dict, List, Optional +from pathlib import Path + + +logger = logging.getLogger(__name__) + + +def load_email_mapping(mapping_file: str = "user_email_mapping.json") -> Dict[str, str]: + """ + Load user email mapping from JSON file. + + Args: + mapping_file: Path to email mapping JSON file + + Returns: + Dictionary mapping names to email addresses + + Raises: + FileNotFoundError: If mapping file doesn't exist + json.JSONDecodeError: If file contains invalid JSON + """ + mapping_path = Path(mapping_file) + if not mapping_path.exists(): + raise FileNotFoundError( + f"Email mapping file not found: {mapping_file}\n" + f"Please create {mapping_file} with name-to-email mappings" + ) + + with open(mapping_path, 'r', encoding='utf-8') as f: + return json.load(f) + + +def resolve_emails( + assigned_to: Optional[List[str]], + mapping_file: str = "user_email_mapping.json" +) -> List[str]: + """ + Resolve user names or emails to email addresses. + + Args: + assigned_to: List of names or emails (None = all users) + mapping_file: Path to email mapping JSON file + + Returns: + List of resolved email addresses + """ + # Load email mapping + try: + email_mapping = load_email_mapping(mapping_file) + except FileNotFoundError as e: + logger.error(str(e)) + return [] + except json.JSONDecodeError as e: + logger.error(f"Invalid JSON in {mapping_file}: {e}") + return [] + + # If no specific users requested, return all emails + if not assigned_to: + logger.info(f"No users specified, using all {len(email_mapping)} emails from mapping") + return list(email_mapping.values()) + + # Resolve each name/email + resolved_emails = [] + unknown_names = [] + + for identifier in assigned_to: + identifier = identifier.strip() + + # Check if it's already an email + if '@' in identifier: + resolved_emails.append(identifier) + logger.debug(f"Using email directly: {identifier}") + # Try to resolve from mapping + elif identifier in email_mapping: + email = email_mapping[identifier] + resolved_emails.append(email) + logger.debug(f"Resolved '{identifier}' to {email}") + else: + unknown_names.append(identifier) + logger.warning(f"Unknown name '{identifier}' - skipping") + + # Warn about unknown names + if unknown_names: + logger.warning( + f"⚠️ Could not resolve {len(unknown_names)} name(s): {', '.join(unknown_names)}\n" + f" Available names in {mapping_file}: {', '.join(email_mapping.keys())}" + ) + + logger.info(f"Resolved {len(resolved_emails)} email(s) from {len(assigned_to)} identifier(s)") + return resolved_emails + + +def get_all_emails(mapping_file: str = "user_email_mapping.json") -> List[str]: + """ + Get all email addresses from mapping file. + + Args: + mapping_file: Path to email mapping JSON file + + Returns: + List of all email addresses + """ + try: + email_mapping = load_email_mapping(mapping_file) + return list(email_mapping.values()) + except Exception as e: + logger.error(f"Failed to load email mapping: {e}") + return [] diff --git a/helpers/env_loader.py b/helpers/env_loader.py new file mode 100644 index 0000000..fbb83d1 --- /dev/null +++ b/helpers/env_loader.py @@ -0,0 +1,68 @@ +""" +Environment variable loader with validation. +""" + +import os +from typing import Optional + + +class EnvironmentError(Exception): + """Custom exception for environment configuration errors.""" + pass + + +def get_required_env(var_name: str, error_message: Optional[str] = None) -> str: + """ + Get required environment variable or raise clear error. + + Args: + var_name: Environment variable name + error_message: Custom error message (optional) + + Returns: + Environment variable value + + Raises: + EnvironmentError: If environment variable is not set + """ + value = os.getenv(var_name) + if not value: + if error_message: + raise EnvironmentError(error_message) + raise EnvironmentError( + f"Missing required environment variable: {var_name}\n" + f"Please set {var_name} in your .env file" + ) + return value + + +def get_optional_env(var_name: str, default: str = "") -> str: + """ + Get optional environment variable with default value. + + Args: + var_name: Environment variable name + default: Default value if not set + + Returns: + Environment variable value or default + """ + return os.getenv(var_name, default) + + +def get_logic_app_url() -> str: + """ + Get Logic App URL from environment with clear error message. + + Returns: + Logic App URL + + Raises: + EnvironmentError: If AZURE_LOGIC_APP_URL is not set + """ + return get_required_env( + "AZURE_LOGIC_APP_URL", + "Missing AZURE_LOGIC_APP_URL environment variable.\n" + "Please add your Logic App URL to the .env file:\n" + "AZURE_LOGIC_APP_URL=https://prod-xx.region.logic.azure.com:443/..." + ) diff --git a/helpers/logic_app_client.py b/helpers/logic_app_client.py new file mode 100644 index 0000000..7bf877b --- /dev/null +++ b/helpers/logic_app_client.py @@ -0,0 +1,159 @@ +""" +Logic App client for fetching work items from Fabric Data Warehouse. +Supports date range queries with email filtering. +""" + +import requests +import logging +import time +from typing import List, Dict, Any, Optional +from datetime import datetime + + +class LogicAppClient: + """Client for calling Logic App endpoint to fetch work items with date ranges.""" + + def __init__(self, logic_app_url: str, timeout: int = 60, max_retries: int = 3): + """ + Initialize Logic App client. + + Args: + logic_app_url: The HTTP trigger URL of the Azure Logic App + timeout: Request timeout in seconds (default: 60) + max_retries: Maximum number of retry attempts (default: 3) + """ + self.logic_app_url = logic_app_url + self.timeout = timeout + self.max_retries = max_retries + self.logger = logging.getLogger(__name__) + + def get_work_items_by_date_range( + self, + from_date: str, + to_date: str, + emails: List[str] + ) -> Dict[str, Any]: + """ + Fetch work items from Logic App for specified date range and users. + + Args: + from_date: Start date in YYYY-MM-DD format + to_date: End date in YYYY-MM-DD format + emails: List of email addresses to filter by + + Returns: + Dictionary containing ResultSets.Table1 with work items + + Raises: + requests.exceptions.RequestException: If request fails after retries + """ + if not emails: + self.logger.warning("No emails provided, returning empty result") + return {"ResultSets": {"Table1": []}} + + # Validate date format + try: + datetime.strptime(from_date, "%Y-%m-%d") + datetime.strptime(to_date, "%Y-%m-%d") + except ValueError as e: + self.logger.error(f"Invalid date format: {e}") + raise ValueError(f"Dates must be in YYYY-MM-DD format: {e}") + + payload = { + "fromDate": from_date, + "toDate": to_date, + "emails": emails + } + + self.logger.info( + f"Fetching work items for {len(emails)} users from {from_date} to {to_date}" + ) + + # Retry logic with exponential backoff + last_exception = None + for attempt in range(1, self.max_retries + 1): + try: + response = requests.post( + self.logic_app_url, + json=payload, + headers={'Content-Type': 'application/json'}, + timeout=self.timeout + ) + + response.raise_for_status() + result = response.json() + + # Parse response - handle both direct and body-wrapped formats + if 'ResultSets' in result: + work_items = result['ResultSets'].get('Table1', []) + self.logger.info( + f"✅ Retrieved {len(work_items)} work items from Logic App" + ) + return result + elif 'body' in result and 'ResultSets' in result['body']: + work_items = result['body']['ResultSets'].get('Table1', []) + self.logger.info( + f"✅ Retrieved {len(work_items)} work items from Logic App (body-wrapped)" + ) + return result['body'] + else: + self.logger.warning( + f"Unexpected response format from Logic App: {result}" + ) + return {"ResultSets": {"Table1": []}} + + except requests.exceptions.Timeout as e: + last_exception = e + self.logger.warning( + f"Attempt {attempt}/{self.max_retries}: Request timeout after {self.timeout}s" + ) + + except requests.exceptions.HTTPError as e: + last_exception = e + self.logger.error( + f"Attempt {attempt}/{self.max_retries}: HTTP error {e.response.status_code}: {e}" + ) + + except requests.exceptions.RequestException as e: + last_exception = e + self.logger.error( + f"Attempt {attempt}/{self.max_retries}: Request failed: {e}" + ) + + except Exception as e: + last_exception = e + self.logger.error( + f"Attempt {attempt}/{self.max_retries}: Unexpected error: {e}" + ) + + # Exponential backoff before retry (except on last attempt) + if attempt < self.max_retries: + backoff_time = 2 ** attempt # 2, 4, 8 seconds + self.logger.info(f"Retrying in {backoff_time} seconds...") + time.sleep(backoff_time) + + # All retries exhausted + error_msg = f"Failed to fetch work items after {self.max_retries} attempts" + self.logger.error(f"{error_msg}: {last_exception}") + raise requests.exceptions.RequestException( + f"{error_msg}: {last_exception}" + ) from last_exception + + +def create_logic_app_client( + logic_app_url: str, + timeout: int = 60, + max_retries: int = 3 +) -> LogicAppClient: + """ + Create configured LogicAppClient instance. + + Args: + logic_app_url: Logic App HTTP trigger URL + timeout: Request timeout in seconds (default: 60) + max_retries: Maximum retry attempts (default: 3) + + Returns: + Configured LogicAppClient instance + """ + return LogicAppClient(logic_app_url, timeout, max_retries) diff --git a/helpers/timezone_utils.py b/helpers/timezone_utils.py new file mode 100644 index 0000000..723b845 --- /dev/null +++ b/helpers/timezone_utils.py @@ -0,0 +1,95 @@ +""" +Timezone utilities for handling America/Mexico_City timezone conversions. +""" + +from datetime import datetime, time +from zoneinfo import ZoneInfo +from typing import Tuple + + +# Mexico City timezone +MEXICO_CITY_TZ = ZoneInfo("America/Mexico_City") +UTC_TZ = ZoneInfo("UTC") + + +def get_date_boundaries_mexico_city(date_str: str) -> Tuple[datetime, datetime]: + """ + Get start and end of day boundaries for a date in Mexico City timezone. + + Args: + date_str: Date string in YYYY-MM-DD format + + Returns: + Tuple of (start_datetime, end_datetime) in Mexico City timezone + - start_datetime: 00:00:00 Mexico City time + - end_datetime: 23:59:59 Mexico City time + """ + # Parse date + date = datetime.strptime(date_str, "%Y-%m-%d").date() + + # Create start of day (00:00:00) + start_datetime = datetime.combine(date, time.min, tzinfo=MEXICO_CITY_TZ) + + # Create end of day (23:59:59) + end_datetime = datetime.combine(date, time(23, 59, 59), tzinfo=MEXICO_CITY_TZ) + + return start_datetime, end_datetime + + +def convert_utc_to_mexico_city(utc_datetime: datetime) -> datetime: + """ + Convert UTC datetime to Mexico City timezone. + + Args: + utc_datetime: Datetime in UTC (can be naive or aware) + + Returns: + Datetime in Mexico City timezone + """ + # Ensure datetime is timezone-aware (assume UTC if naive) + if utc_datetime.tzinfo is None: + utc_datetime = utc_datetime.replace(tzinfo=UTC_TZ) + + # Convert to Mexico City timezone + return utc_datetime.astimezone(MEXICO_CITY_TZ) + + +def is_within_range_mexico_city( + timestamp: datetime, + from_date: str, + to_date: str +) -> bool: + """ + Check if a timestamp falls within date range in Mexico City timezone. + + Args: + timestamp: UTC timestamp to check + from_date: Start date in YYYY-MM-DD format + to_date: End date in YYYY-MM-DD format + + Returns: + True if timestamp is within range (inclusive) + """ + # Get boundaries in Mexico City timezone + start_boundary, _ = get_date_boundaries_mexico_city(from_date) + _, end_boundary = get_date_boundaries_mexico_city(to_date) + + # Convert timestamp to Mexico City timezone + mx_timestamp = convert_utc_to_mexico_city(timestamp) + + # Check if within range + return start_boundary <= mx_timestamp <= end_boundary + + +def format_mexico_city_datetime(dt: datetime) -> str: + """ + Format datetime in Mexico City timezone for display. + + Args: + dt: Datetime to format + + Returns: + Formatted string: "YYYY-MM-DD HH:MM:SS CST/CDT" + """ + mx_dt = convert_utc_to_mexico_city(dt) + return mx_dt.strftime("%Y-%m-%d %H:%M:%S %Z") diff --git a/user_email_mapping.json b/user_email_mapping.json new file mode 100644 index 0000000..b5a6d70 --- /dev/null +++ b/user_email_mapping.json @@ -0,0 +1,23 @@ +{ + "Luis Nocedal": "luis.nodecal@inbest.cloud", + "Carlos Vazquez": "carlos.vazquez@inbest.cloud", + "Diego Lopez": "diego.lopez@inbest.cloud", + "Alejandro Valenzuela": "alejandro.valenzuela@inbest.cloud", + "Gerardo Melgoza": "gerardo.melgoza@inbest.cloud", + "Hans Izarraraz": "hans.izarraraz@inbest.cloud", + "Osvaldo de Luna": "osvaldo.deluna@inbest.cloud", + "Uriel Cortés": "uriel.cortes@inbest.cloud", + "Emmanuel Pérez": "emmanuel.perez@inbest.cloud", + "Fernando Alcaraz": "fernando.alcaraz@inbest.cloud", + "Damian Gaspar": "damian.gaspar@inbest.cloud", + "Cristian Soria": "cristian.soria@inbest.cloud", + "Daniel Cayola": "daniel.cayola@inbest.cloud", + "Ximena Segura": "ximena.segura@inbest.cloud", + "Andrés Escobedo": "andres.escobedo@inbest.cloud", + "Alvaro Torres": "alvaro.torres@inbest.cloud", + "Pablo Ruiz": "pablo.ruiz@inbest.cloud", + "Sebastián Rojas": "sebastian.rojas@inbest.cloud", + "Fernando Hernández": "fernando.hernandez@inbest.cloud", + "Daniel Reyes": "daniel.reyes@inbest.cloud", + "Fernando Agredano": "fernando.agredano@inbest.cloud" +} diff --git a/workitemsoctober.json b/workitemsoctober.json new file mode 100644 index 0000000..0e6477d --- /dev/null +++ b/workitemsoctober.json @@ -0,0 +1,8062 @@ +{ + "ResultSets": { + "Table1": [ + { + "WorkItemId": 23599, + "Title": "Empezar a hacer el Dashboard de google ads", + "StartDate": "2025-09-15T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "HOHO DASHBOARD", + "OriginalEstimate": 13.142857142857139 + }, + { + "WorkItemId": 23601, + "Title": "Capacitación en Power BI", + "StartDate": "2025-10-04T16:16:00", + "TargetDate": "2025-10-18T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "HOHO DASHBOARD", + "OriginalEstimate": 1.9999999999999998 + }, + { + "WorkItemId": 27102, + "Title": "Google UX", + "StartDate": "2025-07-01T15:20:00", + "TargetDate": "2025-12-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 1.0454545454545452 + }, + { + "WorkItemId": 33701, + "Title": "Revisión y verificación del funcionamiento del ambiente prod", + "StartDate": "2025-09-30T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 5.333333333333333 + }, + { + "WorkItemId": 33769, + "Title": "Correcciones", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 36 + }, + { + "WorkItemId": 33772, + "Title": "Correcciones adicionales", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 33775, + "Title": "Creación del manual de usuario", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-28T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 33779, + "Title": "Creación del documentación técnica", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 33828, + "Title": "Weeklys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 33829, + "Title": "Seguimiento TL", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 1.7999999999999998 + }, + { + "WorkItemId": 33831, + "Title": "Weeklys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 33832, + "Title": "Seguimiento TL", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 33834, + "Title": "Weeklys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 33835, + "Title": "Seguimiento TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 33837, + "Title": "Weeklys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 33838, + "Title": "Seguimiento TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 38931, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38932, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 38933, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 38934, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 18.6 + }, + { + "WorkItemId": 38935, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38937, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38938, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38939, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38940, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 38941, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38943, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38944, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38945, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38946, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 38947, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38949, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38950, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38951, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38952, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 30 + }, + { + "WorkItemId": 38953, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38955, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38956, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38957, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38958, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 16 + }, + { + "WorkItemId": 38959, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38962, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38963, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 38964, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 38965, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 15 + }, + { + "WorkItemId": 38966, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38968, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38969, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38970, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38971, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 38972, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38974, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38975, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38976, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38977, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 17 + }, + { + "WorkItemId": 38978, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38980, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38981, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38982, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38983, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 38984, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38986, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38987, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 38988, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 38989, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 26 + }, + { + "WorkItemId": 38990, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 38993, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38994, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.8999999999999999 + }, + { + "WorkItemId": 38995, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 38996, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 38997, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 38999, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39000, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39001, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39002, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39003, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39005, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39006, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39007, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39008, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39009, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39011, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39012, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39013, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39014, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39015, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39017, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39018, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39019, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39020, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39021, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39024, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39025, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39026, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 39027, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 39028, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39030, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39031, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39032, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39033, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39034, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39036, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39037, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39038, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39039, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39040, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39042, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39043, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39044, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39045, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39046, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39048, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39050, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39052, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39055, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39056, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39057, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 39058, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 39059, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39061, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39062, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39063, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39064, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 39065, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39067, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39068, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39069, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39070, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39071, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39073, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 39074, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5.5 + }, + { + "WorkItemId": 39075, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5.5 + }, + { + "WorkItemId": 39076, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 39077, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 39079, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39080, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39081, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39082, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39083, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39086, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39087, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 7.5 + }, + { + "WorkItemId": 39088, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 39089, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 39090, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39092, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39093, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39094, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39095, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39096, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39098, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39099, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39100, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39101, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39102, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39104, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39105, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39106, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39107, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39108, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39110, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39111, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39112, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39113, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39114, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39117, + "Title": "Dailys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39118, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 39119, + "Title": "Checkpoint", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 39120, + "Title": "Certificacion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3.5999999999999996 + }, + { + "WorkItemId": 39121, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 39123, + "Title": "Dailys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 39124, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 12.5 + }, + { + "WorkItemId": 39125, + "Title": "Checkpoint", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39126, + "Title": "Certificacion", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 39127, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39129, + "Title": "Dailys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39130, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39131, + "Title": "Checkpoint", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39132, + "Title": "Certificacion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39133, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39135, + "Title": "Dailys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 39136, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39137, + "Title": "Checkpoint", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5.5 + }, + { + "WorkItemId": 39138, + "Title": "Certificacion", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 39139, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39141, + "Title": "Dailys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 39142, + "Title": "Seguimiento TL General/Horas de descarga", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 39143, + "Title": "Checkpoint", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 39144, + "Title": "Certificacion", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 39145, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 43096, + "Title": "Integración con Simétrica", + "StartDate": "2025-09-30T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 43423, + "Title": "Mañaneras Septiembre", + "StartDate": "2025-09-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.021739130434782608 + }, + { + "WorkItemId": 43424, + "Title": "Mañaneras Septiembre", + "StartDate": "2025-09-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.021739130434782608 + }, + { + "WorkItemId": 43425, + "Title": "Mañaneras Septiembre", + "StartDate": "2025-09-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.021739130434782608 + }, + { + "WorkItemId": 43426, + "Title": "Mañaneras Septiembre", + "StartDate": "2025-09-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.021739130434782608 + }, + { + "WorkItemId": 43498, + "Title": "Registro de cambios en la documentación.", + "StartDate": "2025-10-22T21:40:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 43909, + "Title": "Diseño Consulta y Control de Estados de Cuenta por Operadora y Concesionaria", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 43910, + "Title": "Diseño Visualización de Indicadores y Reportes Financieros", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 24 + }, + { + "WorkItemId": 43912, + "Title": "Ajustes y Correcciones.", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 44128, + "Title": "Endpoint para inicio de sesión", + "StartDate": "2025-09-30T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 44129, + "Title": "Formulario y flujo de inicio de sesión", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 44130, + "Title": "Integración de backend y frontend", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44131, + "Title": "Suite de pruebas (backend)", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 44132, + "Title": "Suite de pruebas (frontend)", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 44133, + "Title": "Endpoint para gestionar solicitudes de recuperación de contraseña", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44134, + "Title": "Formulario para solicitar recuperación de contraseña", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 44135, + "Title": "Endpoint para restablecer contraseña", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44136, + "Title": "Flujo de restablecimiento de contraseña", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44137, + "Title": "Integración de backend y frontend", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44138, + "Title": "Suite de pruebas (backend)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 44139, + "Title": "Suite de pruebas (frontend)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 44140, + "Title": "**Middleware/guards para autorización por rol", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-07T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44141, + "Title": "Manejo de tokens (generación, expiración y regeneración)", + "StartDate": "2025-10-07T06:00:00", + "TargetDate": "2025-10-07T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44142, + "Title": "Suite de pruebas (backend)", + "StartDate": "2025-10-07T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 44273, + "Title": "Endpoint para creacion de Vehiculo", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 44274, + "Title": "Formulario y flujo de creacion de Vehiculo", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 9 + }, + { + "WorkItemId": 44275, + "Title": "Endpoint para edicion de Vehiculo", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-09T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 44276, + "Title": "Formulario y flujo de edicion de Vehiculo", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 44277, + "Title": "Endpoint para obtencion del detalle de un Vehiculo", + "StartDate": "2025-10-09T06:00:00", + "TargetDate": "2025-10-09T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44278, + "Title": "Endpoint para obtencion de todos los Vehiculos (paginado)", + "StartDate": "2025-10-09T06:00:00", + "TargetDate": "2025-10-09T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.7999999523162842 + }, + { + "WorkItemId": 44279, + "Title": "Listado de Vehiculos", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4.5 + }, + { + "WorkItemId": 44280, + "Title": "Endpoint para eliminacion logico de Vehiculo", + "StartDate": "2025-10-09T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44281, + "Title": "Eliminacion de Vehiculo", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 44282, + "Title": "Integracion de backend y frontend", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44283, + "Title": "Suite de pruebas (frontend)", + "StartDate": "2025-10-14T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 44284, + "Title": "Suite de pruebas (backend)", + "StartDate": "2025-10-10T22:43:00", + "TargetDate": "2025-10-14T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 44286, + "Title": "Endpoint para creaci�n de Agencia", + "StartDate": "2025-10-14T06:00:00", + "TargetDate": "2025-10-14T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44287, + "Title": "Formulario y flujo de creaci�n de Agencia", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 44288, + "Title": "Endpoint para edici�n de Agencia", + "StartDate": "2025-10-14T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44289, + "Title": "Endpoint para obtenci�n del detalle de una Agencia", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44290, + "Title": "Endpoint para obtenci�n de todas las Agencias (paginado)", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.7999999523162842 + }, + { + "WorkItemId": 44291, + "Title": "Listado de Agencias", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44292, + "Title": "Formulario y flujo de edici�n de Agencia", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 44293, + "Title": "Endpoint para eliminaci�n l�gico de Agencia", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 44294, + "Title": "Eliminaci�n de Agencia", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 44295, + "Title": "Integraci�n de backend y frontend", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44296, + "Title": "Suite de pruebas (backend)", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 44297, + "Title": "Suite de pruebas (frontend)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 44324, + "Title": "Actualizar ambiente QA", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 44332, + "Title": "Correcci�n de errores frontend", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 44333, + "Title": "Correcci�n de errores backend", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 44345, + "Title": "Sprint Retrospective Meeting TL", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 44346, + "Title": "Sprint Retrospective Meeting DEV1", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 44347, + "Title": "Sprint Retrospective Meeting DEV1", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 45136, + "Title": "Seguimiento TL", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 2.4000000000000004 + }, + { + "WorkItemId": 45138, + "Title": "Seguimiento TL", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 45140, + "Title": "Seguimiento TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 45142, + "Title": "Seguimiento TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 45144, + "Title": "Seguimiento TL", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 45238, + "Title": "Capacitación de uso y operación", + "StartDate": "2025-10-20T15:12:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 45241, + "Title": "Documentación", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 45252, + "Title": "Weekly Checkpoint 02Oct2025", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45253, + "Title": "Weekly Checkpoint 02Oct2025", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45255, + "Title": "Weekly Checkpoint 02Oct2025", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45256, + "Title": "Weekly Checkpoint 09Oct2025", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 45257, + "Title": "Weekly Checkpoint 09Oct2025", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 45259, + "Title": "Weekly Checkpoint 09Oct2025", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 45717, + "Title": "Mañanera 13 Octubre", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45718, + "Title": "Mañanera 20 Octubre", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45719, + "Title": "Mañanera 27 Octubre", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45721, + "Title": "Mañanera 13 Octubre", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45722, + "Title": "Mañanera 20 Octubre", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-22T17:43:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45723, + "Title": "Mañanera 27 Octubre", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45724, + "Title": "Mañanera 6 Octubre", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45725, + "Title": "Mañanera 13 Octubre", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45726, + "Title": "Mañanera 20 Octubre", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45727, + "Title": "Mañanera 27 Octubre", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 45733, + "Title": "Checkpoint Golstech", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 0.3333333333333333 + }, + { + "WorkItemId": 45734, + "Title": "Checkpoint Golstech", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 0.3333333333333333 + }, + { + "WorkItemId": 45736, + "Title": "Checkpoint Golstech", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 45801, + "Title": "Intregración Botmaker", + "StartDate": "2025-09-26T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 45877, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45878, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45880, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45884, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45886, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45887, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45888, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45892, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45894, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45897, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45899, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45900, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45917, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45919, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45923, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "sebastian.rojas@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45925, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45926, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 45927, + "Title": "🚀 iNnovación en voz alta / Instalación segura de software", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46023, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T19:36:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46024, + "Title": "Seguimiento semanal", + "StartDate": "2025-09-29T19:36:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46025, + "Title": "Seguimiento TL General", + "StartDate": "2025-09-29T19:37:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4.800000000000001 + }, + { + "WorkItemId": 46026, + "Title": "Daily", + "StartDate": "2025-09-29T19:37:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46027, + "Title": "Estimaciones PreSales", + "StartDate": "2025-09-29T19:37:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3.5999999999999996 + }, + { + "WorkItemId": 46029, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T19:40:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.2000000000000002 + }, + { + "WorkItemId": 46030, + "Title": "Seguimiento semanal", + "StartDate": "2025-09-29T19:40:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46031, + "Title": "Seguimiento TL General", + "StartDate": "2025-09-29T19:40:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.2000000000000002 + }, + { + "WorkItemId": 46032, + "Title": "Daily", + "StartDate": "2025-09-29T19:41:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46034, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T19:41:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.2000000000000002 + }, + { + "WorkItemId": 46035, + "Title": "Seguimiento semanal", + "StartDate": "2025-09-29T19:42:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46036, + "Title": "Seguimiento TL General", + "StartDate": "2025-09-29T19:42:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1.2000000000000002 + }, + { + "WorkItemId": 46037, + "Title": "Daily", + "StartDate": "2025-09-29T19:42:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46040, + "Title": "Seguimiento semanal", + "StartDate": "2025-09-29T19:47:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46041, + "Title": "Seguimiento TL General", + "StartDate": "2025-09-29T19:47:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46042, + "Title": "Daily", + "StartDate": "2025-09-29T19:47:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46053, + "Title": "Seguimiento TL", + "StartDate": "2025-09-29T21:54:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1.7999999999999998 + }, + { + "WorkItemId": 46054, + "Title": "Seguimiento TL", + "StartDate": "2025-10-06T21:55:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46060, + "Title": "Weekly TL", + "StartDate": "2025-09-29T19:37:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46075, + "Title": "Solicitar, consultar y recibir estatus de los préstamos - Semana 2", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 4.199999999999999 + }, + { + "WorkItemId": 46076, + "Title": "Registrar en el CRM los retornos de las unidades prestadas y que retornan antes de tiempo especificado.", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 7.199999999999999 + }, + { + "WorkItemId": 46078, + "Title": "Agregar campos no obligatorios para caracterizar empresas.", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 46080, + "Title": "Cargar prospectos generados en eventos comerciales.", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 46124, + "Title": "SF - Presentación Interna", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46125, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46127, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46128, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46129, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46134, + "Title": "Certificación", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 46222, + "Title": "integracion front y back", + "StartDate": "2025-10-01T16:36:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46228, + "Title": "detección de archivos especificos one drive", + "StartDate": "2025-10-01T16:44:00", + "TargetDate": "2025-10-02T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46238, + "Title": "Estudio DP-600", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46239, + "Title": "Estudio Dp-700", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46240, + "Title": "OKRs Checkpoint", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46241, + "Title": "Checkpoint Axobot", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.3333333333333333 + }, + { + "WorkItemId": 46242, + "Title": "Checkpoint rentabilidad 29 de Septiembre al 06 de Octubre", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.3333333333333333 + }, + { + "WorkItemId": 46243, + "Title": "The Power Of Now 2026 + Gala de Premios DEVA", + "StartDate": "2025-10-01T17:53:00", + "TargetDate": "2025-10-02T17:53:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46244, + "Title": "Documentación configuración On Premise Data Gateway Traxion", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Traxion-Migracion Azure POC", + "OriginalEstimate": 0.6666666666666666 + }, + { + "WorkItemId": 46336, + "Title": "Weekly Checkpoint 02Oct2025", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46337, + "Title": "Weekly Checkpoint 09Oct2025", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46516, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46517, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46518, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46519, + "Title": "Daily", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46520, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46521, + "Title": "Weekly TL", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46522, + "Title": "Certificación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46523, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46525, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46526, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46527, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46528, + "Title": "Daily", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46529, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46530, + "Title": "Weekly TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46531, + "Title": "Certificación", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46532, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46534, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46535, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46536, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46537, + "Title": "Daily", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46538, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46539, + "Title": "Weekly TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46540, + "Title": "Certificación", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46541, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46543, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46544, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46545, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46546, + "Title": "Daily", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46547, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46548, + "Title": "Weekly TL", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46549, + "Title": "Certificación", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46550, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46553, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46554, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46555, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46556, + "Title": "Daily", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46557, + "Title": "Certificación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46558, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46560, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46561, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46562, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46563, + "Title": "Daily", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46564, + "Title": "Certificación", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46565, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46567, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46568, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46569, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46570, + "Title": "Daily", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46571, + "Title": "Certificación", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46572, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46574, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46575, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46576, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46577, + "Title": "Daily", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46578, + "Title": "Certificación", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46579, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46582, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46583, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46584, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46585, + "Title": "Daily", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46586, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46588, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46589, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46590, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46591, + "Title": "Daily", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46592, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46594, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46595, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46596, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46597, + "Title": "Daily", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46598, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46600, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46601, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46602, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46603, + "Title": "Daily", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46604, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46608, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46609, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46610, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46611, + "Title": "Daily", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46612, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46613, + "Title": "Weekly TL", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46614, + "Title": "Certificación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46615, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46617, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46618, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46619, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46620, + "Title": "Daily", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46621, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46622, + "Title": "Weekly TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46623, + "Title": "Certificación", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46624, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46626, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46627, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46628, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 46629, + "Title": "Daily", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46630, + "Title": "Estimaciones PreSales", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46631, + "Title": "Weekly TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46632, + "Title": "Certificación", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46633, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46645, + "Title": "Logueo de horas", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46646, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46647, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46648, + "Title": "Daily", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46649, + "Title": "Certificación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46650, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46652, + "Title": "Logueo de horas", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46653, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46654, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46655, + "Title": "Daily", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46656, + "Title": "Certificación", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46657, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46659, + "Title": "Logueo de horas", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46660, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46661, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46662, + "Title": "Daily", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46663, + "Title": "Certificación", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46664, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46666, + "Title": "Logueo de horas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46667, + "Title": "Seguimiento semanal", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46668, + "Title": "Seguimiento TL General", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46669, + "Title": "Daily", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46670, + "Title": "Certificación", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 46671, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46674, + "Title": "Generar arquitectura/correcciones", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Vitro-Soporte o Eventos", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46676, + "Title": "Generar arquitectura/correcciones", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "Vitro-Soporte o Eventos", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 46678, + "Title": "Generar estimación de cambios", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.7999999999999998 + }, + { + "WorkItemId": 46681, + "Title": "Documentacion de analisi/backlog", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 10.2 + }, + { + "WorkItemId": 46682, + "Title": "Validar el pipeline CX", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Customer Experience Hub", + "OriginalEstimate": 1.3333333333333333 + }, + { + "WorkItemId": 46683, + "Title": "Estudio Dp 700", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5.333333333333333 + }, + { + "WorkItemId": 46684, + "Title": "Visita GDL", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5.333333333333333 + }, + { + "WorkItemId": 46685, + "Title": "Checkpoint billing", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 1.3333333333333333 + }, + { + "WorkItemId": 46694, + "Title": "IBSD19-43432 - RECOKNITION no está filtrando correctamente (actualización 02 oct)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "Ho-Ho Soporte", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 46695, + "Title": "Revision Traxión", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-04T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46696, + "Title": "Checkpoint chatbot GDL", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46705, + "Title": "Agenda Certificación", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46737, + "Title": "Vacaciones Hans - 09 - 13 Oct2025", + "StartDate": "2025-10-09T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 24 + }, + { + "WorkItemId": 46743, + "Title": "Crear endpoint cancelación lead", + "StartDate": "2025-10-03T18:09:00", + "TargetDate": "2025-10-03T18:09:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 46750, + "Title": "Logueo de horas", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:25:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46751, + "Title": "Seguimiento semanal", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:26:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.30000000000000004 + }, + { + "WorkItemId": 46752, + "Title": "Seguimiento TL General", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:26:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46753, + "Title": "Daily", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:26:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46754, + "Title": "Certificación", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:26:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 46755, + "Title": "SF - Presentación Interna", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T18:26:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46770, + "Title": "Weeklys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T19:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46771, + "Title": "Weeklys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T19:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46772, + "Title": "Weeklys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T19:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46773, + "Title": "Weeklys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T19:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46774, + "Title": "Weeklys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T19:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46781, + "Title": "GML - HubSpot x JAC CRM", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46789, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Alex)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46790, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Hans)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46791, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Uriel)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46792, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Fernando)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46793, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Gerardo)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46794, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Daniel)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46795, + "Title": "Checkpoint interno 06 - 10 octubre 2025 (Daniel)", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46797, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Alex)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46798, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Hans)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46799, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Uriel)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46800, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Fernando)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46801, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Gerardo)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46802, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Daniel)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46803, + "Title": "Checkpoint interno 13 - 17 octubre 2025 (Daniel)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46805, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Alex)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46806, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Hans)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46807, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Uriel)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46808, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Fernando)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46809, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Gerardo)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46810, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Daniel)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46811, + "Title": "Checkpoint interno 20 - 24 octubre 2025 (Daniel)", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46814, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Alex)", + "StartDate": "2025-10-03T19:33:00", + "TargetDate": "2025-10-03T19:33:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46815, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Hans)", + "StartDate": "2025-10-03T19:34:00", + "TargetDate": "2025-10-03T19:34:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46816, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Uriel)", + "StartDate": "2025-10-03T19:34:00", + "TargetDate": "2025-10-03T19:35:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46817, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Daniel)", + "StartDate": "2025-10-03T19:35:00", + "TargetDate": "2025-10-03T19:35:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46818, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Gerardo)", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46819, + "Title": "Weekly Checkpoint JAC - 03Oct2025 (Daniel)", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46821, + "Title": "Weekly Checkpoint JAC - 10Oct2025 (Alex)", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46822, + "Title": "Weekly Checkpoint JAC - 10Oct2025 (Hans)", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46823, + "Title": "Weekly Checkpoint JAC - 10Oct2025 (Uriel)", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46828, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Alex)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46829, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Hans)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46830, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Uriel)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46831, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Daniel)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46832, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Gerardo)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46833, + "Title": "Weekly Checkpoint JAC - 17Oct2025 (Daniel)", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46835, + "Title": "Weekly Checkpoint JAC - 27Oct2025 (Alex)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46836, + "Title": "Weekly Checkpoint JAC - 27Oct2025 (Hans)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46837, + "Title": "Weekly Checkpoint JAC - 24Oct2025 (Uriel)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46838, + "Title": "Weekly Checkpoint JAC - 27Oct2025 (Daniel)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46839, + "Title": "Weekly Checkpoint JAC - 27Oct2025 (Gerardo)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46840, + "Title": "Weekly Checkpoint JAC - 27Oct2025 (Xime)", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46842, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Alex)", + "StartDate": "2025-10-30T21:51:00", + "TargetDate": "2025-10-30T21:51:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46843, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Hans)", + "StartDate": "2025-10-30T21:51:00", + "TargetDate": "2025-10-30T21:51:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46844, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Uriel)", + "StartDate": "2025-10-30T21:52:00", + "TargetDate": "2025-10-30T21:52:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46845, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Daniel)", + "StartDate": "2025-10-30T21:52:00", + "TargetDate": "2025-10-30T21:52:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46846, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Gerardo)", + "StartDate": "2025-10-30T21:52:00", + "TargetDate": "2025-10-30T21:52:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46847, + "Title": "Weekly Checkpoint JAC - 30Oct2025 (Ximena)", + "StartDate": "2025-10-30T21:53:00", + "TargetDate": "2025-10-30T21:53:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46865, + "Title": "Seguimiento TL", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T20:30:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1.7999999999999998 + }, + { + "WorkItemId": 46866, + "Title": "Weeklys", + "StartDate": "2025-09-29T06:00:00", + "TargetDate": "2025-10-03T20:30:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 0.6000000000000001 + }, + { + "WorkItemId": 46868, + "Title": "Seguimiento TL", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 20 + }, + { + "WorkItemId": 46869, + "Title": "Seguimiento TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 46870, + "Title": "Seguimiento TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 46872, + "Title": "Seguimiento TL", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 46873, + "Title": "Weeklys", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46874, + "Title": "Weeklys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46875, + "Title": "Weeklys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46877, + "Title": "Weeklys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46882, + "Title": "[JSSF-688] CRM Ventas | Regresar lead a etapa de \"cierre\" - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46883, + "Title": "[JSSF-683] CRM Ventas | No se pueden cerrar las ventas - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46884, + "Title": "[JSSF-689] CRM Ventas | Eliminar tiempo de Leads - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46886, + "Title": "[JSSF-685] Error en tiempo JAC MONTRREY VALLE - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46891, + "Title": "[JSSF-680] Erroe en tiempo de primer contacto - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46892, + "Title": "[JSSF-694] CRM Ventas | Filtro de usuarios - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46893, + "Title": "[JSSF-684] CRM Ventas | Invalid DateTime - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 46894, + "Title": "[JSSF-695] CRM Ventas | Eliminar usuario Administrador - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46895, + "Title": "[JSSF-675] Carga de leads a CRM ventas Mérida - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46896, + "Title": "[JSSF-697] Modificar Modelo en Lead ya reportado - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 46994, + "Title": "Revision - Calux", + "StartDate": "2025-10-06T14:51:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Calux - Dashboards Power BI", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 46995, + "Title": "Guidanplex Carobra", + "StartDate": "2025-10-06T14:54:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 46996, + "Title": "Checkpoint Guidanceplex Carobra", + "StartDate": "2025-10-06T14:55:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 47012, + "Title": "Examen DP-600", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 47013, + "Title": "Investigación Mirroring Fabric", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47014, + "Title": "Checkpoint Optimización On-Premises Data Gateway", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47015, + "Title": "Knowledge base Fabric Mirrorin", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 47016, + "Title": "Estudio / Certificacion Dp-700", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 7.000000000000001 + }, + { + "WorkItemId": 47017, + "Title": "Estudio ML Specialty", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3.9999999999999996 + }, + { + "WorkItemId": 47018, + "Title": "Sesión optimizacion data gateway", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47019, + "Title": "Examen DP 700", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3.9999999999999996 + }, + { + "WorkItemId": 47020, + "Title": "Optimización On-Premises Data Gateway", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47021, + "Title": "Mañanera - Analytics Octubre", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-06T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 47036, + "Title": "Checkpoint Golstech", + "StartDate": "2025-10-06T15:20:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 47038, + "Title": "Entendimiento proyecto Billing", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 3.9999999999999996 + }, + { + "WorkItemId": 47039, + "Title": "Checkpoint rentabilidad", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 47040, + "Title": "Status Billing con PMO", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47041, + "Title": "Chekpoint Rentabilidad - Data PMO", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.49999999999999994 + }, + { + "WorkItemId": 47042, + "Title": "War room - Seguimiento billing AWS con MSP y Fiannzas 2 hrs", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 1.9999999999999998 + }, + { + "WorkItemId": 47043, + "Title": "Pipeline vistas Oracle", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 3.9999999999999982 + }, + { + "WorkItemId": 47044, + "Title": "Revision Dimensionamiento Traxion: 1h", + "StartDate": "2025-10-06T15:33:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Traxion-Migracion Azure POC", + "OriginalEstimate": 0.9999999999999999 + }, + { + "WorkItemId": 47055, + "Title": "Revision Carobras", + "StartDate": "2025-10-06T19:12:00", + "TargetDate": "2025-10-07T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47068, + "Title": "Ajuste Flag Disponible/Agotado grid productos", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 47069, + "Title": "Pop up \"¿como funciona?\" vista producto", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 47070, + "Title": "Nueva página carrito", + "StartDate": "2025-10-02T06:00:00", + "TargetDate": "2025-10-07T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 16 + }, + { + "WorkItemId": 47071, + "Title": "[JSSF-687] Dar de baja landing de renting - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-06T21:50:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 47072, + "Title": "[JSSF-691] Cambio de Banner de PHEV - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-06T21:52:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.75 + }, + { + "WorkItemId": 47073, + "Title": "[JSSF-692] Sitio Web | Dar de baja banner de T8 en Home - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-03T06:00:00", + "TargetDate": "2025-10-06T21:54:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 47116, + "Title": "Ajustes Carta CX", + "StartDate": "2025-10-06T22:20:00", + "TargetDate": "2025-10-07T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 47238, + "Title": "Seguimiento Carobra", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47290, + "Title": "Sesión entendimiento interno", + "StartDate": "2025-10-07T06:00:00", + "TargetDate": "2025-10-09T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47295, + "Title": "Generar arquitectura y colaboracion backlog", + "StartDate": "2025-10-08T17:19:00", + "TargetDate": "2025-10-08T17:19:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3.5 + }, + { + "WorkItemId": 47299, + "Title": "Obtención de cruces desde onedrive", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-14T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 47300, + "Title": "Validación de parámetros", + "StartDate": "2025-10-29T21:24:00", + "TargetDate": "2025-11-03T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 15 + }, + { + "WorkItemId": 47342, + "Title": "Resolución dudas Traxión", + "StartDate": "2025-10-07T06:00:00", + "TargetDate": "2025-10-09T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47381, + "Title": "Checkout Carrito - Pasarela de pagos", + "StartDate": "2025-10-07T06:00:00", + "TargetDate": "2025-10-08T22:32:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 47396, + "Title": "Maqueta - LP Formulario ANPACT", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 47445, + "Title": "LP Formulario ANPACT - Front", + "StartDate": "2025-10-09T16:21:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 47446, + "Title": "EndPoint Formulario ANPACT", + "StartDate": "2025-10-14T15:27:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 47466, + "Title": "Recap Rentabilidad", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47485, + "Title": "Revision Carobra", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 47493, + "Title": "Animación Loading", + "StartDate": "2025-10-09T22:01:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 47554, + "Title": "Seguimiento TL", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 47555, + "Title": "Weeklys", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47556, + "Title": "Seguimiento TL", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 47557, + "Title": "Weeklys", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47558, + "Title": "Seguimiento TL", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 47559, + "Title": "Weeklys", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47601, + "Title": "Entendimeinto de diagrama Dirección general - Carobra", + "StartDate": "2025-10-09T06:00:00", + "TargetDate": "2025-10-10T15:53:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 47620, + "Title": "Analisis", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T18:11:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 47621, + "Title": "Documentación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T18:11:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 7 + }, + { + "WorkItemId": 47662, + "Title": "Adelantar Creacion del proyecto base 6-10 oct", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T22:55:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 47663, + "Title": "Adelantar Preparacion de API Basica 6-10 otc", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T22:56:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 47664, + "Title": "Capacidad Carlos", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T23:08:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47665, + "Title": "Desvios", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T23:11:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47666, + "Title": "Desvios", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T23:11:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47681, + "Title": "Expiración de apartado", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 47691, + "Title": "Revision Errores Traffilog", + "StartDate": "2025-10-13T17:00:00", + "TargetDate": "2025-10-14T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 0.75 + }, + { + "WorkItemId": 47693, + "Title": "Revision Dataset", + "StartDate": "2025-10-13T17:51:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 47965, + "Title": "Dudas Traxion", + "StartDate": "2025-10-13T23:45:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Traxion-Migracion Azure POC", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48004, + "Title": "Ajuste diseño", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 1.0000000000000002 + }, + { + "WorkItemId": 48005, + "Title": "Weekly 13 Octubre", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-14T15:50:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48007, + "Title": "Revisión Carobra", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48009, + "Title": "1:1 de Alvaro con Fernando", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 48010, + "Title": "1:1 de Andres con Fernando", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 48011, + "Title": "1:1 de Pablo con Fernando", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 48013, + "Title": "Checkpoint OKRs", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48015, + "Title": "Entendimiento de flujo/diagrama", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48016, + "Title": "Checkpoint OKRs", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48017, + "Title": "Análisis de oportunidad", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48018, + "Title": "Entendimiento de los datos", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48019, + "Title": "Estudio ML specialty", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48021, + "Title": "Checkpoint OKRs", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48023, + "Title": "Entendimiento de flujo/diagrama", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48024, + "Title": "Análisis de oportunidad", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48025, + "Title": "Entendimiento de los datos", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 48029, + "Title": "Entendimiento de flujo/diagrama", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 2.25 + }, + { + "WorkItemId": 48030, + "Title": "Análisis de oportunidad", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48031, + "Title": "Entendimiento de los datos", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48032, + "Title": "Análisis de flujo de datos", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48035, + "Title": "Checkpoint golstech", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48037, + "Title": "Checkpoint Rentabilidad", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48038, + "Title": "Research Sagemaker", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 48039, + "Title": "API_Validación ID´s", + "StartDate": "2025-10-14T17:07:00", + "TargetDate": "2025-10-14T17:07:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48044, + "Title": "GML - CRM Revisión de mejoras y actualizaciones", + "StartDate": "2025-10-14T22:18:00", + "TargetDate": "2025-10-14T22:18:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48045, + "Title": "GML - CRM Revisión de mejoras y actualizaciones", + "StartDate": "2025-10-14T22:18:00", + "TargetDate": "2025-10-14T22:18:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48046, + "Title": "GML - CRM Revisión de mejoras y actualizaciones", + "StartDate": "2025-10-14T22:18:00", + "TargetDate": "2025-10-14T22:18:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48048, + "Title": "Póliza de Soporte JAC", + "StartDate": "2025-10-14T22:19:00", + "TargetDate": "2025-10-14T22:19:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48049, + "Title": "Póliza de Soporte JAC", + "StartDate": "2025-10-14T22:19:00", + "TargetDate": "2025-10-14T22:19:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48079, + "Title": "Ausencia - Daniel Reyes", + "StartDate": "2025-10-15T03:24:00", + "TargetDate": "2025-10-15T03:24:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 7 + }, + { + "WorkItemId": 48082, + "Title": "[JSSF-722] Correcciones en landing dev de Sei2 Flex | Sitio Web | Nuevos modelos - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-15T04:11:00", + "TargetDate": "2025-10-15T04:11:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48106, + "Title": "[JSSF-696] Detonar mensaje de botmaker después de que pase una hora del momento que se hizo prueba de manejo - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-15T15:53:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 48107, + "Title": "Agregar método de contacto preferido", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48108, + "Title": "[JSSF-656] No poder congelar un lead sin 3 intentos en un tiempo de 24 hrs - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48109, + "Title": "[JSSF-655] Agregar origen de lead dentro de la notificación de lead nuevo - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 48110, + "Title": "Ajustes - Carta CX", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 48111, + "Title": "Checkpoint Migración Traxión", + "StartDate": "2025-10-14T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48112, + "Title": "[JSSF-698] CRM Ventas | Nuevo Origen \"BNI\" - JAC Lomas Verdes - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48113, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48114, + "Title": "Notificaciones Indigitall", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-12T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - CRM Flotillas Internas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48118, + "Title": "Planeación Migración Traxion", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 48126, + "Title": "CRM Flotillas Ventas - Traspaso de requerimientos a QA - Sprint 2", + "StartDate": "2025-10-15T19:18:00", + "TargetDate": "2025-10-15T19:18:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48127, + "Title": "CRM Flotillas Ventas - Traspaso de requerimientos a QA - Sprint 2", + "StartDate": "2025-10-15T19:18:00", + "TargetDate": "2025-10-15T19:18:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48130, + "Title": "GML - CRM Flotillas x JAC Home - Revisión acceso API", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48131, + "Title": "GML - CRM Flotillas x JAC Home - Revisión acceso API", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48197, + "Title": "Conexión concepto móvil", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Gobierno de Michoacán-Axobot 20", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 48202, + "Title": "Integración JAC Home", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-16T18:47:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 16 + }, + { + "WorkItemId": 48204, + "Title": "Revisión propuesta WWF", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48205, + "Title": "Ausencia - Daniel Reyes", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48206, + "Title": "Vacaciones - Alejandro Valenzuela - 16-17Oct2025", + "StartDate": "2025-10-16T19:40:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 14 + }, + { + "WorkItemId": 48209, + "Title": "Aplicar proceso ISO", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 16 + }, + { + "WorkItemId": 48210, + "Title": "Adelantar planeacion Sem 13-17 Octubre", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 18 + }, + { + "WorkItemId": 48211, + "Title": "Adelantar planeación", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "JAC Shop", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 48222, + "Title": "Agendar Cert", + "StartDate": "2025-10-15T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48330, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48332, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48333, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "sebastian.rojas@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48334, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48335, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48336, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48337, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48339, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48340, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48360, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48362, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48363, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48367, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48368, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48369, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48370, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48371, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48374, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48381, + "Title": "Q´connect Q3 [En persona / En linea] [En persona]", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-20T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48385, + "Title": "Revisión certificaciones CONSAR", + "StartDate": "2025-10-21T06:00:00", + "TargetDate": "2025-10-21T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "CONSAR", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48390, + "Title": "Analisis de los requermientos solicitados", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48391, + "Title": "Analisis de los requermientos solicitados", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48398, + "Title": "Sesión de Kickoff Guidanceplex Salud digna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48399, + "Title": "Sesión de Kickoff Guidanceplex Salud digna", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48403, + "Title": "Mapeo de Procesos.", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48404, + "Title": "Mapeo de Sistemas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48405, + "Title": "Mapeo de Situaciones Base", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48435, + "Title": "[JSSF-715] CRM VENTAS CAMBIO DE CAÍDA DE LEADS DE POZA RICA A XALAPA (TEMPORAL) - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-15T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48436, + "Title": "Carga de BD horarios para panel de horarios", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48437, + "Title": "Carga de horarios de agencias para Panel de horarios", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48438, + "Title": "Ajustes y correcciones Panel de horarios", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48439, + "Title": "Post Venta - Lista de inmovilizados", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 14 + }, + { + "WorkItemId": 48442, + "Title": "[JSSF-735] Agregar a CMS DEV nuevos modielos y ligas dev. - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-20T21:50:00", + "TargetDate": "2025-10-22T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 48443, + "Title": "Evaluación Profit - Equipo", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 48444, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-20T22:14:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48445, + "Title": "Asignación pares equipo", + "StartDate": "2025-10-20T22:14:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48446, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-20T22:15:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48447, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-20T22:15:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48448, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-20T22:16:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48449, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-20T22:16:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48455, + "Title": "GML - HubSpot x JAC CRM - Alineación de requerimientos", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48456, + "Title": "GML - HubSpot x JAC CRM - Alineación de requerimientos", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48458, + "Title": "Resolución Dudas Purview", + "StartDate": "2025-10-20T23:52:00", + "TargetDate": "2025-10-21T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Traxion-Migracion Azure POC", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48461, + "Title": "Seguimiento Team Leader - 16-17Oct2025", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48462, + "Title": "Seguimiento Team Leader - 16-17Oct2025", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48463, + "Title": "Seguimiento Team Leader - 20-24Oct2025", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48464, + "Title": "Seguimiento Team Leader - 20-24Oct2025", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48465, + "Title": "Seguimiento Team Leader - 27-31Oct2025", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48466, + "Title": "Seguimiento Team Leader - 27-31Oct2025", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48478, + "Title": "Preparativos iniciales", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 48480, + "Title": "Homologar catálogos entre CRM y Hubspot", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 24 + }, + { + "WorkItemId": 48482, + "Title": "Envío de nuevos contactos de JAC CRM hacia Hubspot.", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 20 + }, + { + "WorkItemId": 48484, + "Title": "Sincronización continua de datos clave en JAC CRM", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-11-07T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 48498, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 16Oct2025", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48499, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 16Oct2025", + "StartDate": "2025-10-16T06:00:00", + "TargetDate": "2025-10-16T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48501, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 23Oct2025", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48502, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 23Oct2025", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48504, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 30Oct2025", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48505, + "Title": "GML - Weekly Checkpoint - HubSpot x JAC CRM 30Oct2025", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML - Integración CRM - Hubspot", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 48521, + "Title": "Estudio de examen MSC DP-700", + "StartDate": "2025-10-21T02:30:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 48522, + "Title": "Estudio DP-600", + "StartDate": "2025-10-21T02:33:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 15 + }, + { + "WorkItemId": 48523, + "Title": "Estudio ML Specialty", + "StartDate": "2025-10-21T02:34:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 7 + }, + { + "WorkItemId": 48525, + "Title": "Revisión billing (falla en el refresh de QS)", + "StartDate": "2025-10-21T02:38:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48526, + "Title": "Revisión Facturación AWS (falla en el pipeline)", + "StartDate": "2025-10-21T02:39:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48527, + "Title": "Checkpoint rentabilidad (Rentabilidad interno)", + "StartDate": "2025-10-21T02:39:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48528, + "Title": "Sesión cuenta Lipu SSO con Jesus Romero", + "StartDate": "2025-10-21T02:42:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 0.17000000178813934 + }, + { + "WorkItemId": 48529, + "Title": "Sesión Guidanceplex Salud Digna", + "StartDate": "2025-10-21T02:45:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48530, + "Title": "Entendimiento Guidanplex Salud Digna", + "StartDate": "2025-10-21T02:45:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 48531, + "Title": "Sesiones con stakeholders Guidanplex Salud Digna", + "StartDate": "2025-10-21T02:46:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 48541, + "Title": "Día libre por cumpleaños - Daniel Reyes", + "StartDate": "2025-10-22T06:00:00", + "TargetDate": "2025-10-22T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 7 + }, + { + "WorkItemId": 48551, + "Title": "Panel de calendario de atención - ajustes", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 48555, + "Title": "Integración Paypal - Investigación Endpoints Paypal", + "StartDate": "2025-10-10T06:00:00", + "TargetDate": "2025-10-13T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 48566, + "Title": "Videoconferencia Revisión cotizador online Jac el 21-10-2025 16:30:00 America/Mexico_City", + "StartDate": "2025-10-21T23:04:00", + "TargetDate": "2025-10-21T23:04:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 48941, + "Title": "Acceso DB Salesforce2", + "StartDate": "2025-10-17T06:00:00", + "TargetDate": "2025-10-22T18:01:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49022, + "Title": "Refactorización detalles de producto (nuevos botones, info adicional y nuevo flujo de compra)", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49023, + "Title": "Nueva pagina \"compra exitosa\"", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 16 + }, + { + "WorkItemId": 49128, + "Title": "Filtrar poryectos para portafolio", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 20.000000000000004 + }, + { + "WorkItemId": 49129, + "Title": "Redactar contenido para portafolio", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 21.395348837209312 + }, + { + "WorkItemId": 49130, + "Title": "Revision dudas dashboard PMO", + "StartDate": "2025-10-22T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49131, + "Title": "Desarrollar portafolio webflow", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-12-31T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 20.909090909090907 + }, + { + "WorkItemId": 49132, + "Title": "Revisión EasyTrip", + "StartDate": "2025-10-22T06:00:00", + "TargetDate": "2025-10-25T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49133, + "Title": "Desarrollar portafolio webflow - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-12-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 20.909090909090907 + }, + { + "WorkItemId": 49136, + "Title": "Sesion de Entendimiento Equipo innovation", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 1.9999999999999991 + }, + { + "WorkItemId": 49137, + "Title": "Documentacion Requerimientos", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 21.395348837209312 + }, + { + "WorkItemId": 49138, + "Title": "Sesion Equipo RH", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 1.0697674418604648 + }, + { + "WorkItemId": 49141, + "Title": "Documentacion Requerimientos - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 21.395348837209312 + }, + { + "WorkItemId": 49144, + "Title": "Sesion de Entendimiento Equipo innovation - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 1.9999999999999991 + }, + { + "WorkItemId": 49145, + "Title": "Sesion Equipo RH - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 1.0697674418604648 + }, + { + "WorkItemId": 49147, + "Title": "Filtrar poryectos para portafolio - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 20.000000000000004 + }, + { + "WorkItemId": 49149, + "Title": "Redactar contenido para portafolio - Copy", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-11-30T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "UX-UI Hub", + "OriginalEstimate": 21.395348837209312 + }, + { + "WorkItemId": 49152, + "Title": "Dashboard PMO modificaciones", + "StartDate": "2025-10-23T18:45:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49158, + "Title": "Resolución Dudas Purview 23 Oct", + "StartDate": "2025-10-23T21:59:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Traxion-Migracion Azure POC", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49162, + "Title": "Generar estimación de proyecto", + "StartDate": "2025-10-21T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49166, + "Title": "Generar estimación de proyecto", + "StartDate": "2025-10-27T19:56:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49167, + "Title": "Estudio de Billing", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "HUB RENTABILIDAAD INTERNO", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49170, + "Title": "Weekly Capacity Plan 20-24 Octubre", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Soporte Interno", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 49174, + "Title": "Weekly Capacity Plan 20-24 Octubre", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 49175, + "Title": "Weekly Capacity Plan 27-31 Octubre", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Lipu - Poliza Data", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49187, + "Title": "Resolución de bugs", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-24T15:54:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49190, + "Title": "[JSSF-719] Linea del tiempo o proceso en CRM Post Venta - Mesa de soporte de iNBest.cloud - Maqueta tracker", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T16:07:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49191, + "Title": "Post Venta - Calendario de atención - Maqueta", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T16:07:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49192, + "Title": "Reunión c/Fer", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-24T18:15:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49193, + "Title": "Tareas p/Dashbord PMO", + "StartDate": "2025-10-24T16:21:00", + "TargetDate": "2025-10-25T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49201, + "Title": "Registrar información de soportes del equipo de desarrollo - Alejandro Valenzuela", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T16:33:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Project Management Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49202, + "Title": "Registrar información de soportes del equipo de desarrollo - Hans Izarraraz", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T16:33:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Project Management Hub", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49285, + "Title": "Desvios 13-19 oct", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-19T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 49299, + "Title": "Revisión Dataset p/Demo AI", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-25T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49300, + "Title": "Profit Eval", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-25T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49305, + "Title": "Capacitación de uso y operación", + "StartDate": "2025-10-27T15:21:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 49306, + "Title": "Liberación a ambiente PRD de Sprint 1", + "StartDate": "2025-10-27T15:21:00", + "TargetDate": "2025-10-31T14:58:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 49307, + "Title": "Documentación", + "StartDate": "2025-10-27T15:22:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "GML - Requerimientos CRM Flotillas", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 49308, + "Title": "JAC + Cliento - Entrega ajustes API integraciones", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49309, + "Title": "JAC + Cliento - Entrega ajustes API integraciones", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49312, + "Title": "Maqueta - Módulo CRM Ventas para Gestión de compra de Accesorios", + "StartDate": "2025-10-27T16:34:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 14 + }, + { + "WorkItemId": 49320, + "Title": "[JSSF-732] CRM Ventas | Inhabilitar tarjeta de \"Tareas y Citas\" en etapa de 1er Contacto - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49321, + "Title": "[JSSF-671] Actualizar Origenes CRM Ventas - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49345, + "Title": "Reserva de tiempo", + "StartDate": "2025-10-27T19:30:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 49346, + "Title": "Reserva de tiempo", + "StartDate": "2025-10-27T19:31:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Salud Digna - Guidanceplex", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 49348, + "Title": "Estudio ML Specialty", + "StartDate": "2025-10-27T19:55:00", + "TargetDate": "2025-10-28T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49360, + "Title": "Revision Dataset", + "StartDate": "2025-10-27T21:45:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Golstech", + "OriginalEstimate": 1.5 + }, + { + "WorkItemId": 49392, + "Title": "[JSSF-762] Sitio Web | Cambios de banner hero en Home - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2.5 + }, + { + "WorkItemId": 49393, + "Title": "[JSSF-763] Sitio Web | Agregar a DEV Frison T5 Chasis - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49394, + "Title": "[JSSF-753] Sitio Web | Footer - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-28T14:59:00", + "TargetDate": "2025-10-28T14:59:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49399, + "Title": "Certificacion ML Specialty", + "StartDate": "2025-10-28T16:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 49402, + "Title": "Desvio adelantar osva", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 24 + }, + { + "WorkItemId": 49403, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49404, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49405, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49406, + "Title": "SF - Presentación Interna", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-01T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49442, + "Title": "DP 600", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T23:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 49444, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49446, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49447, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "sebastian.rojas@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49448, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49450, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49451, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49452, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49454, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49455, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49475, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49477, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49478, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49482, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49483, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49484, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49485, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49486, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49489, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49496, + "Title": "🚀 ¡Acompáñanos en la presentación oficial de Obok!", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-29T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49502, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49504, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49505, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "sebastian.rojas@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49506, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49509, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49510, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49512, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49513, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49536, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49538, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49539, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49543, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49544, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49545, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49546, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49547, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49550, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49557, + "Title": "🚀 ¡Innovación en voz alta: Charlando de MCP, AI y langflow!!", + "StartDate": "2025-10-31T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49559, + "Title": "[JSSF-702] CRM Ventas | Reactivar Usuario - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49560, + "Title": "[JSSF-699] Detener Tiempo promedio de la carga de leads Mérida - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-08T06:00:00", + "TargetDate": "2025-10-08T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49561, + "Title": "[JSSF-714] CRM Ventas | Reactivar Usuario - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-14T06:00:00", + "TargetDate": "2025-10-14T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49562, + "Title": "[JSSF-738] Creación de Usuarios como Administradores en CRM Post Venta - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49563, + "Title": "[JSSF-757] Error al Crear cliente para agendar Cita PV - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49564, + "Title": "[JSSF-731] Sitio Web | Subir vacantes nuevas - Octubre - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49565, + "Title": "[JSSF-587] Documentación técnica del CRM - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 49566, + "Title": "[JSSF-716] ERROR EN TIEMPO DE PRIMER CONTACTO - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49567, + "Title": "[JSSF-712] CRM Ventas | Baja de Usuario - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49568, + "Title": "[JSSF-717] Permisos de Acuerdo al Rol CRM Post Venta - Mesa de soporte de iNBest.cloud", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49569, + "Title": "Estimación requerimientos CRM Ventas", + "StartDate": "2025-10-24T06:00:00", + "TargetDate": "2025-10-27T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49570, + "Title": "Refactorización pantalla Usuarios", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 15 + }, + { + "WorkItemId": 49571, + "Title": "Refactorización pantalla Accesorios", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 15 + }, + { + "WorkItemId": 49572, + "Title": "Tag Recursos de Consola AWS", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 49576, + "Title": "Tracking búsquedas y filtros", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-11-03T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "GML - JAC Cloud", + "OriginalEstimate": 12 + }, + { + "WorkItemId": 49584, + "Title": "Diseño de interfaz", + "StartDate": "2025-10-29T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "GML - JAC Cloud", + "OriginalEstimate": 10 + }, + { + "WorkItemId": 49603, + "Title": "Tag Recursos de Consola AWS", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 25 + }, + { + "WorkItemId": 49604, + "Title": "Checkpoint rentabilidad PMO", + "StartDate": "2025-10-29T16:01:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49608, + "Title": "Estudio GCP ACE", + "StartDate": "2025-10-29T17:25:00", + "TargetDate": "2025-11-01T05:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49612, + "Title": "Autoevaluación PROFIT", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49613, + "Title": "Seguimiento Interfaces JAC", + "StartDate": "2025-10-29T18:36:00", + "TargetDate": "2025-10-29T18:36:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49615, + "Title": "Certificación/Curso", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-03T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49616, + "Title": "Certificación/Curso", + "StartDate": "2025-10-06T06:00:00", + "TargetDate": "2025-10-10T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49617, + "Title": "Certificación/Curso", + "StartDate": "2025-10-13T06:00:00", + "TargetDate": "2025-10-17T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49618, + "Title": "Certificación/Curso", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49619, + "Title": "Certificación/Curso", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "Development Hub", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49620, + "Title": "Research Netsuite", + "StartDate": "2025-10-28T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49623, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "alejandro.valenzuela@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49625, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "hans.izarraraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49626, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "sebastian.rojas@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49627, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "fernando.hernandez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49629, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49630, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-31T05:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49631, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49633, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49634, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49656, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "uriel.cortes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49658, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49659, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "emmanuel.perez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49663, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49664, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49665, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "ximena.segura@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49666, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49667, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49670, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "fernando.alcaraz@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49677, + "Title": "🚀 ¡Activa tu modo Wellness! 🌟", + "StartDate": "2025-10-30T06:00:00", + "TargetDate": "2025-10-30T06:00:00", + "AssignedToUser": "daniel.reyes@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49694, + "Title": "[JSSF-705] CRM Ventas | Revisar videos de centro de ayuda \"Tooltips\" - Mesa de soporte de iNBest", + "StartDate": "2025-10-23T06:00:00", + "TargetDate": "2025-10-23T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 0.25 + }, + { + "WorkItemId": 49695, + "Title": "POST VENTA - Descartar cita", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 49696, + "Title": "[JSSF-739] Correción de los permisos de los Roles en CRM Post Venta - Mesa de soporte de iNBest", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "gerardo.melgoza@inbest.cloud", + "Project_Name": "GML- Soporte", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 49818, + "Title": "Loggeo", + "StartDate": "2025-10-30T17:09:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 4 + }, + { + "WorkItemId": 49820, + "Title": "Cambio Nomina", + "StartDate": "2025-10-30T17:37:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49838, + "Title": "Intregación", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 3.9999999999999982 + }, + { + "WorkItemId": 49839, + "Title": "Weekly Capacity Plan-Adelanto", + "StartDate": "2025-10-28T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "GML - JAC Cloud", + "OriginalEstimate": 11 + }, + { + "WorkItemId": 49840, + "Title": "Weekly Capacity Plan-Adelanto", + "StartDate": "2025-10-28T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49841, + "Title": "Weekly Capacity Plan-Retraso+Adicional correcciones", + "StartDate": "2025-10-28T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 27 + }, + { + "WorkItemId": 49843, + "Title": "Weekly Capacity Plan-Retraso", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "damian.gaspar@inbest.cloud", + "Project_Name": "JAC Fichas Tecnicas", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 49904, + "Title": "1:1 c/Fer", + "StartDate": "2025-10-31T16:45:00", + "TargetDate": "2025-11-01T05:00:00", + "AssignedToUser": "andres.escobedo@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 49909, + "Title": "Seguimiento TL", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T17:02:00", + "AssignedToUser": "osvaldo.deluna@inbest.cloud", + "Project_Name": "GML - JAC Cloud", + "OriginalEstimate": 3 + }, + { + "WorkItemId": 49935, + "Title": "Weekly Capacity Plan-Adelanto", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:16:00", + "AssignedToUser": "cristian.soria@inbest.cloud", + "Project_Name": "Easytrip - Finanzas-Automatización", + "OriginalEstimate": 6 + }, + { + "WorkItemId": 49939, + "Title": "Dimensionamiento/Entendimiento/Seguimiento", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:30:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Carobra - Guidanceplex", + "OriginalEstimate": 10.5 + }, + { + "WorkItemId": 49943, + "Title": "Weekly Capacity Plan-Soporte", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:44:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 2 + }, + { + "WorkItemId": 49944, + "Title": "Levantamiento de usuarios", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:44:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49945, + "Title": "Checkpoint de dashboard de QS", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:46:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 0.5 + }, + { + "WorkItemId": 49946, + "Title": "Atención de aclaraciones de consolas Nulas", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T18:47:00", + "AssignedToUser": "pablo.ruiz@inbest.cloud", + "Project_Name": "Data Proyectos internos", + "OriginalEstimate": 1 + }, + { + "WorkItemId": 50039, + "Title": "Examen DP 600", + "StartDate": "2025-10-31T15:00:00", + "TargetDate": "2025-10-31T20:00:00", + "AssignedToUser": "alvaro.torres@inbest.cloud", + "Project_Name": "Data Analytics Hub", + "OriginalEstimate": 5 + }, + { + "WorkItemId": 50355, + "Title": "Weekly Capacity Plan-Adelanto", + "StartDate": "2025-10-20T06:00:00", + "TargetDate": "2025-10-24T06:00:00", + "AssignedToUser": "carlos.vazquez@inbest.cloud", + "Project_Name": "Municipio GDL Asistente Virtual", + "OriginalEstimate": 28 + }, + { + "WorkItemId": 50918, + "Title": "Vacaciones - Diego", + "StartDate": "2025-10-27T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "diego.lopez@inbest.cloud", + "Project_Name": "People - HR - Activities Hub", + "OriginalEstimate": 8 + }, + { + "WorkItemId": 51269, + "Title": "Actializacion CMS Webflow", + "StartDate": "2025-10-01T06:00:00", + "TargetDate": "2025-10-31T06:00:00", + "AssignedToUser": "daniel.cayola@inbest.cloud", + "Project_Name": "Onboarding - RH -UXUI", + "OriginalEstimate": 15.999999999999993 + } + ] + }, + "OutputParameters": {} +} \ No newline at end of file