Subject: Enable POST/PUT/PATCH/DELETE for crm.wiicco.com Please enable all HTTP methods for crm.wiicco.com on server s229. SuiteCRM V8 API requires POST/PUT/PATCH/DELETE for /public/legacy/Api/V8/module/* Currently only GET is allowed — blocking CRM from creating records. Fix: Add to Apache vhost for crm.wiicco.com: AllowMethods GET POST PUT PATCH DELETE OPTIONS Account: deb69019n2 | Domain: crm.wiicco.com | Server: s229.webhostingserver.nl
cd ~/Documents/SuiteCRM-Crown
python3 << 'EOF'
import pandas as pd, glob
files = sorted(glob.glob('crown_castle_enriched_*.xlsx'))
df = pd.read_excel(files[-1])
print(f'Loaded {len(df)} records from {files[-1]}')
export = pd.DataFrame({
'Name': (df.get('biz_name') if 'biz_name' in df else df['Address']).fillna(df['Address']),
'Account Type': df['Building Details'],
'Billing Street': df['Address'],
'Billing City': df['City'],
'Billing State': df['State'],
'Billing Postal Code':df['Zip'].astype(str),
'Website': df.get('biz_website', pd.Series([''] * len(df))).fillna(''),
'Phone Office': df.get('biz_phone', pd.Series([''] * len(df))).fillna(''),
'Lead Source': 'ISP Intel Pipeline',
'Rating': df['urgency'].map({'HOT':'Hot','WARM':'Warm','COLD':'Cold'}).fillna('Cold'),
'Description': (
'ISP: ' + df['incumbent_isp'].fillna('') +
' | Contract ends: ' + df['contract_end_date'].fillna('') +
' | Score: ' + df['score'].astype(str) +
' | BW: ' + df['erate_bandwidth'].fillna('') +
' | Annual: $' + df['erate_annual_contract'].fillna(0).apply(lambda x: f'{x:,.0f}') +
' | School pays: $' + df['erate_school_pays'].fillna(0).apply(lambda x: f'{x:,.0f}') +
' | Opp: ' + df['opportunity_type'].fillna('') +
' | CC_ISP: ' + df['crown_is_current_isp'].astype(str) +
' | Consortium: ' + df['is_consortium_contract'].fillna(False).astype(str)
),
})
out = f'suitecrm_import_{pd.Timestamp.now().strftime("%Y%m%d_%H%M")}.csv'
export.to_csv(out, index=False)
print(f'✓ {len(export)} records → {out}')
print('Import: SuiteCRM → Accounts → top-right menu → Import → Upload CSV')
EOF# Step 1: Generate SQL on your Mac
cd ~/Documents/SuiteCRM-Crown
python3 << 'EOF'
import pandas as pd, glob, uuid
files = sorted(glob.glob('crown_castle_enriched_*.xlsx'))
df = pd.read_excel(files[-1])
def esc(v): return str(v or '').replace("'","''")[:250]
lines = ["-- ISP Intel bulk insert","-- mysql -u DB_USER -p DB_NAME < suitecrm_bulk.sql",""]
for _, r in df.iterrows():
aid = str(uuid.uuid4())
desc = esc(f"ISP:{r.get('incumbent_isp','')}|Ends:{r.get('contract_end_date','')}|Score:{r.get('score',0)}|BW:{r.get('erate_bandwidth','')}|${r.get('erate_annual_contract',0) or 0:,.0f}/yr|Pays:${r.get('erate_school_pays',0) or 0:,.0f}|Opp:{r.get('opportunity_type','')}|CC:{r.get('crown_is_current_isp',False)}|Cons:{r.get('is_consortium_contract',False)}")
rating = {'HOT':'Hot','WARM':'Warm','COLD':'Cold'}.get(str(r.get('urgency','')),'Cold')
lines.append(f"INSERT INTO accounts (id,name,account_type,billing_address_street,billing_address_city,billing_address_state,billing_address_postalcode,billing_address_country,lead_source,rating,description,deleted,date_entered,date_modified) VALUES ('{aid}','{esc(r.get(\"biz_name\") or r[\"Address\"])}','{esc(r.get(\"Building Details\",\"\"))}','{esc(r[\"Address\"])}','{esc(r[\"City\"])}','{esc(r[\"State\"])}','{esc(str(r[\"Zip\"]))}','United States','ISP Intel Pipeline','{rating}','{desc}',0,NOW(),NOW());")
lines.append(f"INSERT INTO accounts_cstm (id_c,isp_incumbent_c,contract_end_date_c,erate_funding_c,isp_urgency_score_c,crown_castle_id_c,crown_is_isp_c,opportunity_type_c) VALUES ('{aid}','{esc(r.get(\"incumbent_isp\",\"\"))}','{esc(r.get(\"contract_end_date\",\"\"))}',{r.get('erate_annual_contract',0) or 0},{r.get('score',0) or 0},'{esc(r.get(\"Building Number\",\"\"))}','{r.get(\"crown_is_current_isp\",False)}','{esc(r.get(\"opportunity_type\",\"\"))}');")
open('suitecrm_bulk.sql','w').write('\n'.join(lines))
print(f'✓ {len(df)*2} SQL statements → suitecrm_bulk.sql')
EOF# Step 2: Get DB credentials from server ssh deb69019n2@s229.webhostingserver.nl grep -i "db_name\|db_user\|db_pass" ~/domains/crm.wiicco.com/public_html/.env | head -5 grep -i "'db_name'\|'db_user'\|'db_pass'" ~/domains/crm.wiicco.com/public_html/public/legacy/config.php | head -5 # Step 3: Transfer and run exit # back to Mac scp suitecrm_bulk.sql deb69019n2@s229.webhostingserver.nl:~/ ssh deb69019n2@s229.webhostingserver.nl "mysql -u DB_USER -p DB_NAME < ~/suitecrm_bulk.sql" # Step 4: Verify + rebuild cache ssh deb69019n2@s229.webhostingserver.nl "mysql -u DB_USER -p DB_NAME -e \"SELECT COUNT(*) FROM accounts WHERE lead_source='ISP Intel Pipeline';\"" # Then: SuiteCRM → Admin → Repair → Quick Repair and Rebuild
| Score | Business / Address | Primary ISP | Primary BW | Secondary ISP | Secondary BW | Contract End | Annual $ | School Pays | Urgency | Opportunity | Consortium | CRM |
|---|
is_consortium_contract = True flags these records.cenic.org as approved vendor. CENIC re-bids every 3–5 years. Master contract worth $100M+/yr statewide.