统计CRM必填项
This commit is contained in:
parent
6218d597ae
commit
3f10122a79
|
|
@ -0,0 +1,107 @@
|
||||||
|
import pandas as pd
|
||||||
|
from typing import List
|
||||||
|
from openpyxl import Workbook
|
||||||
|
|
||||||
|
df = pd.read_excel('./data_src/pingcap_pipeline.xlsx')
|
||||||
|
|
||||||
|
# unique_values = df['Sales stage'].unique()
|
||||||
|
# print("Unique values using unique():")
|
||||||
|
# print(unique_values)
|
||||||
|
|
||||||
|
crm_mandatory_fields = {
|
||||||
|
"1-prospecting": [
|
||||||
|
"联系人姓名", "部门", "职务", "手机",
|
||||||
|
"预估整体项目节点数或vCPU数", "现用数据库痛点", "主要数据库", "客户业务场景", "数据量"
|
||||||
|
],
|
||||||
|
"2-evaluation": [
|
||||||
|
"客户预算情况", "是否是独立预算", "预算是否完成审批","是否进PcC", "PcC是否已审批", "PcC状态", "测试类型",
|
||||||
|
"测试项(用飞书链接)","参与友商", "poc开始日期", "poc预计结束日期", "MBO评审结果",
|
||||||
|
|
||||||
|
],
|
||||||
|
"3-qualification": [
|
||||||
|
"立项批复", "立项时间", "立项贡献(立项报告的内容)", "招标方式"
|
||||||
|
],
|
||||||
|
"4-bidding/negotiating": [
|
||||||
|
"是否投标", "发标时间", "投标时间", "竞争对手", "对手产配置", "对手投标金额",
|
||||||
|
"标书/谈判文件(最大100M,考虑链接方式)", "中标结果", "丢标原因"
|
||||||
|
],
|
||||||
|
"5-contract review": [],
|
||||||
|
"6A-cancel": [
|
||||||
|
"取消原因", "leader审批结果"
|
||||||
|
],
|
||||||
|
"6B-closed lost": [
|
||||||
|
"输单原因", "leader审批结果"
|
||||||
|
],
|
||||||
|
"6C-closed won": [
|
||||||
|
"生成销售订单并关联商机", "商机字段更新到赢单"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
crm_mandatory_fields_list = list(crm_mandatory_fields.keys())
|
||||||
|
|
||||||
|
stage_mapping = {
|
||||||
|
# "prospecting": "1-prospecting",
|
||||||
|
"Evaluation": "2-evaluation",
|
||||||
|
"Qualification": "3-qualification",
|
||||||
|
"PoC Won/Bidding+Negotiation": "4-bidding/negotiating",
|
||||||
|
# "contract review": "5-contract review",
|
||||||
|
# "cancel": "6A-cancel",
|
||||||
|
# "closed lost": "6B-closed lost",
|
||||||
|
"Closed Won": "6C-closed won"
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_stages_up_to(crm_stage, stages_list):
|
||||||
|
if crm_stage.startswith('6'):
|
||||||
|
# Find the element starting with '5'
|
||||||
|
index_5 = stages_list.index("5-contract review")
|
||||||
|
if index_5 is not None:
|
||||||
|
result_list = stages_list[:index_5 + 1]
|
||||||
|
result_list.append(crm_stage)
|
||||||
|
return result_list
|
||||||
|
else:
|
||||||
|
return stages_list # Return all stages if no '5' is found
|
||||||
|
else:
|
||||||
|
index = stages_list.index(crm_stage)
|
||||||
|
return stages_list[:index + 1]
|
||||||
|
|
||||||
|
|
||||||
|
def check_mandatory_fields(row, crm_stage):
|
||||||
|
mandatory_fields = crm_mandatory_fields[crm_stage]
|
||||||
|
sales_stage = row['Sales stage']
|
||||||
|
print(f"Sales stage: {sales_stage}, CRM stage: {crm_stage}")
|
||||||
|
result = {
|
||||||
|
"fields_filled": [],
|
||||||
|
"fields_not_filled": []
|
||||||
|
}
|
||||||
|
for field in mandatory_fields:
|
||||||
|
if field in row and pd.notna(row[field]) and row[field] != '':
|
||||||
|
print(f"Field: {field}, Value: {row[field]}")
|
||||||
|
data = {
|
||||||
|
"field": field,
|
||||||
|
"value": row[field]
|
||||||
|
}
|
||||||
|
result["fields_filled"].append(data)
|
||||||
|
else:
|
||||||
|
|
||||||
|
result["fields_not_filled"].append(field)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
for index, row in df.iterrows():
|
||||||
|
print("-" * 20,index ,"-" * 20)
|
||||||
|
|
||||||
|
sales_stage = row['Sales stage']
|
||||||
|
crm_stage = stage_mapping.get(sales_stage, "unknown")
|
||||||
|
if crm_stage == "unknown":
|
||||||
|
print(f"Sales stage: {sales_stage}, CRM stage: {crm_stage}")
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
print(f"Sales stage: {sales_stage}, CRM stage: {crm_stage}")
|
||||||
|
|
||||||
|
crm_stages = get_stages_up_to(crm_stage, crm_mandatory_fields_list)
|
||||||
|
df.at[index, "crm_stage"] = crm_stage
|
||||||
|
for stage in crm_stages:
|
||||||
|
result = check_mandatory_fields(row, stage)
|
||||||
|
df.at[index, stage] = ', '.join(result["fields_not_filled"])
|
||||||
|
print("-"*10, stage, "-"*10)
|
||||||
|
print(result)
|
||||||
|
df.to_excel("./data_output/pingcap_pipeline_mandatory.xlsx")
|
||||||
Binary file not shown.
Loading…
Reference in New Issue