🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
431 lines
11 KiB
Markdown
431 lines
11 KiB
Markdown
# Failed Layers Summary - All Errors
|
|
|
|
## Overview
|
|
|
|
**Total Layers Tested:** 10
|
|
**Failed Layers:** 7
|
|
**Success Rate:** 30%
|
|
|
|
---
|
|
|
|
## 1. Access Points (access_points.shp)
|
|
|
|
**Status:** ❌ FAILED (0/10 records)
|
|
|
|
**Error Type:** API 500 Error - Field Name Mismatch
|
|
|
|
**Error Message:**
|
|
```
|
|
PHP Warning: Undefined array key "isLocked"
|
|
```
|
|
|
|
**Problem:**
|
|
- Sending field: `isLocked`
|
|
- API expects: `locked`
|
|
|
|
**Current Code (Line 407):**
|
|
```python
|
|
ap_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": f"AP-{idx}",
|
|
"latitude": str(lat),
|
|
"longitude": str(lon),
|
|
"typeId": type_id,
|
|
"isLocked": 0 # ❌ WRONG FIELD NAME
|
|
}
|
|
```
|
|
|
|
**Required Fix:**
|
|
```python
|
|
ap_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": f"AP-{idx}",
|
|
"latitude": str(lat),
|
|
"longitude": str(lon),
|
|
"typeId": type_id,
|
|
"locked": 0 # ✅ CORRECT FIELD NAME
|
|
}
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:407`
|
|
|
|
---
|
|
|
|
## 2. Network Elements (network_elements.shp)
|
|
|
|
**Status:** ❌ FAILED (0/10 records)
|
|
|
|
**Error Type:** API 500 Error - Silent Failure (no debug output)
|
|
|
|
**Error Message:**
|
|
```
|
|
(No error message displayed - silent failure)
|
|
```
|
|
|
|
**Problem:**
|
|
- Code was recently updated with typeId mapping
|
|
- No debug output to see what data is being sent
|
|
- Likely missing a required field or incorrect field format
|
|
|
|
**Current Code (Lines 800-813):**
|
|
```python
|
|
def _create_network_element(self, ne_data: Dict) -> bool:
|
|
"""Create a network element via Verofy API"""
|
|
headers = {
|
|
"Authorization": f"Bearer {self.access_token}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
response = requests.post(
|
|
f"{API_URL}/map-network-element/create",
|
|
headers=headers,
|
|
json=ne_data
|
|
)
|
|
|
|
return response.status_code == 201
|
|
```
|
|
|
|
**Required Fix:**
|
|
- Add debug output (like sites/access_points have)
|
|
- Add error logging to see API response
|
|
```python
|
|
def _create_network_element(self, ne_data: Dict) -> bool:
|
|
"""Create a network element via Verofy API"""
|
|
headers = {
|
|
"Authorization": f"Bearer {self.access_token}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
print(f"DEBUG: Sending network element data: {json.dumps(ne_data, indent=2)}")
|
|
|
|
response = requests.post(
|
|
f"{API_URL}/map-network-element/create",
|
|
headers=headers,
|
|
json=ne_data
|
|
)
|
|
|
|
if response.status_code != 201:
|
|
print(f"❌ Network Element API Error {response.status_code}: {response.text[:200]}")
|
|
return False
|
|
|
|
return True
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:800-813`
|
|
|
|
**API Endpoint:** `POST /v1/map-network-element/create`
|
|
|
|
---
|
|
|
|
## 3. Splicing (splicing.shp)
|
|
|
|
**Status:** ❌ FAILED (0/10 records)
|
|
|
|
**Error Type:** API 500 Error - Silent Failure (no debug output)
|
|
|
|
**Error Message:**
|
|
```
|
|
(No error message displayed - silent failure)
|
|
```
|
|
|
|
**Problem:**
|
|
- Code was recently updated with typeId mapping
|
|
- No debug output to see what data is being sent
|
|
- Likely missing a required field or incorrect field format
|
|
|
|
**Current Code (Lines 850-862):**
|
|
```python
|
|
def _create_splicing(self, splicing_data: Dict) -> bool:
|
|
"""Create a splicing point via Verofy API"""
|
|
headers = {
|
|
"Authorization": f"Bearer {self.access_token}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
# Assuming splicing uses similar endpoint to network elements or sites
|
|
response = requests.post(
|
|
f"{API_URL}/map-splicing/create",
|
|
headers=headers,
|
|
json=splicing_data
|
|
)
|
|
|
|
return response.status_code == 201
|
|
```
|
|
|
|
**Required Fix:**
|
|
- Add debug output
|
|
- Add error logging
|
|
```python
|
|
def _create_splicing(self, splicing_data: Dict) -> bool:
|
|
"""Create a splicing point via Verofy API"""
|
|
headers = {
|
|
"Authorization": f"Bearer {self.access_token}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
print(f"DEBUG: Sending splicing data: {json.dumps(splicing_data, indent=2)}")
|
|
|
|
response = requests.post(
|
|
f"{API_URL}/map-splice/create", # Note: endpoint is map-splice, not map-splicing
|
|
headers=headers,
|
|
json=splicing_data
|
|
)
|
|
|
|
if response.status_code != 201:
|
|
print(f"❌ Splicing API Error {response.status_code}: {response.text[:200]}")
|
|
return False
|
|
|
|
return True
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:850-862`
|
|
|
|
**API Endpoint:** `POST /v1/map-splice/create` (not map-splicing!)
|
|
|
|
**Note:** The endpoint might be incorrect - it should be `map-splice`, not `map-splicing`
|
|
|
|
---
|
|
|
|
## 4. Cabinet Boundaries (cabinet_boundaries.shp)
|
|
|
|
**Status:** ❌ FAILED (0/3 records)
|
|
|
|
**Error Type:** API 500 Error - Missing Required Field
|
|
|
|
**Error Message:**
|
|
```
|
|
Database Exception: SQLSTATE[HY000]: General error: 1364 Field 'metric' doesn't have a default value
|
|
```
|
|
|
|
**Problem:**
|
|
- Missing required field: `metric`
|
|
- The `mapobject` table requires this field
|
|
|
|
**Current Code (Lines 549-563):**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Cabinet-Boundary-{idx}')),
|
|
"mapinfoobjecttypeId": 3, # 3 = Polygon
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "0.40"
|
|
# ❌ MISSING: "metric" field
|
|
}
|
|
```
|
|
|
|
**Required Fix:**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Cabinet-Boundary-{idx}')),
|
|
"mapinfoobjecttypeId": 3, # 3 = Polygon
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "0.40",
|
|
"metric": 0 # ✅ ADD THIS REQUIRED FIELD
|
|
}
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:549-563`
|
|
|
|
---
|
|
|
|
## 5. Cables (cables.shp)
|
|
|
|
**Status:** ❌ FAILED (0/3 records)
|
|
|
|
**Error Type:** API 500 Error - Missing Required Field
|
|
|
|
**Error Message:**
|
|
```
|
|
Database Exception: SQLSTATE[HY000]: General error: 1364 Field 'metric' doesn't have a default value
|
|
```
|
|
|
|
**Problem:**
|
|
- Missing required field: `metric`
|
|
- Same issue as cabinet_boundaries
|
|
|
|
**Current Code (Lines 591-598):**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Cable-{idx}')),
|
|
"mapinfoobjecttypeId": 2, # 2 = Line/Polyline
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "1.00"
|
|
# ❌ MISSING: "metric" field
|
|
}
|
|
```
|
|
|
|
**Required Fix:**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Cable-{idx}')),
|
|
"mapinfoobjecttypeId": 2, # 2 = Line/Polyline
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "1.00",
|
|
"metric": 0 # ✅ ADD THIS REQUIRED FIELD
|
|
}
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:591-598`
|
|
|
|
---
|
|
|
|
## 6. Parcels (parcels.shp)
|
|
|
|
**Status:** ❌ FAILED (0/3 records)
|
|
|
|
**Error Type:** API 500 Error - Missing Required Field
|
|
|
|
**Error Message:**
|
|
```
|
|
Database Exception: SQLSTATE[HY000]: General error: 1364 Field 'metric' doesn't have a default value
|
|
```
|
|
|
|
**Problem:**
|
|
- Missing required field: `metric`
|
|
- Same issue as cabinet_boundaries and cables
|
|
|
|
**Current Code (Lines 634-641):**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Parcel-{idx}')),
|
|
"mapinfoobjecttypeId": 3, # 3 = Polygon
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "0.40"
|
|
# ❌ MISSING: "metric" field
|
|
}
|
|
|
|
# Add optional fields (Group 1/2 map to objectgroup/objectgroup2)
|
|
if 'Group 1' in row and row['Group 1']:
|
|
info_data['objectgroup'] = str(row['Group 1'])
|
|
|
|
if 'Group 2' in row and row['Group 2']:
|
|
info_data['objectgroup2'] = str(row['Group 2'])
|
|
```
|
|
|
|
**Required Fix:**
|
|
```python
|
|
info_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(row.get('Name', f'Parcel-{idx}')),
|
|
"mapinfoobjecttypeId": 3, # 3 = Polygon
|
|
"data": data,
|
|
"color": "#ffffff",
|
|
"alpha": "0.40",
|
|
"metric": 0 # ✅ ADD THIS REQUIRED FIELD
|
|
}
|
|
|
|
# Add optional fields (Group 1/2 map to objectgroup/objectgroup2)
|
|
if 'Group 1' in row and row['Group 1']:
|
|
info_data['objectgroup'] = str(row['Group 1'])
|
|
|
|
if 'Group 2' in row and row['Group 2']:
|
|
info_data['objectgroup2'] = str(row['Group 2'])
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:634-641`
|
|
|
|
---
|
|
|
|
## 7. Permits (permits.shp)
|
|
|
|
**Status:** ❌ FAILED (0/10 records)
|
|
|
|
**Error Type:** API 422 Validation Error - Missing Required Fields
|
|
|
|
**Error Message:**
|
|
```json
|
|
[
|
|
{"field":"mappermitstatusId","message":"Permit Status cannot be blank."},
|
|
{"field":"mappermitentitytypeId","message":"Permit Entity Type cannot be blank."},
|
|
{"field":"mappermitulrtypeId","message":"Permit ULR Type cannot be blank."}
|
|
]
|
|
```
|
|
|
|
**Problem:**
|
|
- Missing 3 required fields:
|
|
1. `mappermitstatusId` - Status of the permit
|
|
2. `mappermitentitytypeId` - Entity type (e.g., company, individual)
|
|
3. `mappermitulrtypeId` - ULR (Utility Location Request?) type
|
|
|
|
**Current Code (Lines 699-703):**
|
|
```python
|
|
permit_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(name),
|
|
"poly": poly,
|
|
# ❌ MISSING: mappermitstatusId
|
|
# ❌ MISSING: mappermitentitytypeId
|
|
# ❌ MISSING: mappermitulrtypeId
|
|
}
|
|
```
|
|
|
|
**Required Fix:**
|
|
```python
|
|
permit_data = {
|
|
"mapProjectId": int(map_id),
|
|
"name": str(name),
|
|
"poly": poly,
|
|
"mappermitstatusId": 1, # ✅ ADD: Default status
|
|
"mappermitentitytypeId": 1, # ✅ ADD: Default entity type
|
|
"mappermitulrtypeId": 1 # ✅ ADD: Default ULR type
|
|
}
|
|
```
|
|
|
|
**File Location:** `/home/ahall/Sandbox/dragnddrop/backend/verofy_uploader.py:699-703`
|
|
|
|
**Note:** Need to fetch the reference data to determine correct default values:
|
|
- MapPermitStatus references
|
|
- MapPermitEntityType references
|
|
- MapPermitULRType references
|
|
|
|
---
|
|
|
|
## Summary Table
|
|
|
|
| # | Layer | Records Failed | Error Type | Primary Issue | Fix Complexity |
|
|
|---|-------|----------------|------------|---------------|----------------|
|
|
| 1 | access_points | 10 | Field Name | Wrong field name: `isLocked` → `locked` | ⭐ Easy |
|
|
| 2 | network_elements | 10 | Unknown | Silent 500 error - needs debugging | ⭐⭐ Medium |
|
|
| 3 | splicing | 10 | Unknown | Silent 500 error - needs debugging | ⭐⭐ Medium |
|
|
| 4 | cabinet_boundaries | 3 | Missing Field | Add `metric: 0` | ⭐ Easy |
|
|
| 5 | cables | 3 | Missing Field | Add `metric: 0` | ⭐ Easy |
|
|
| 6 | parcels | 3 | Missing Field | Add `metric: 0` | ⭐ Easy |
|
|
| 7 | permits | 10 | Missing Fields | Add 3 required fields with defaults | ⭐⭐ Medium |
|
|
|
|
**Total Failed Records:** 49 out of 59 records (83% failure rate for failed layers)
|
|
|
|
---
|
|
|
|
## Priority Order for Fixes
|
|
|
|
### Priority 1 - Quick Wins (Should fix immediately)
|
|
1. **Access Points** - One-line fix (change field name)
|
|
2. **Cabinet Boundaries** - One-line fix (add metric field)
|
|
3. **Cables** - One-line fix (add metric field)
|
|
4. **Parcels** - One-line fix (add metric field)
|
|
|
|
### Priority 2 - Requires Research
|
|
5. **Permits** - Need to research correct reference IDs
|
|
6. **Network Elements** - Add debug output, test, fix based on error
|
|
7. **Splicing** - Add debug output, test, fix based on error (also check endpoint name)
|
|
|
|
---
|
|
|
|
## Action Plan
|
|
|
|
1. Fix Priority 1 items (4 layers) - should take 5 minutes
|
|
2. Re-run test to verify Priority 1 fixes work
|
|
3. Research permit references and add defaults
|
|
4. Add debug output to network_elements and splicing
|
|
5. Re-run test with debug to see exact errors
|
|
6. Fix remaining issues based on error output
|