xx
This commit is contained in:
@@ -64,8 +64,9 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
会计分录列表
|
||||
"""
|
||||
entries = []
|
||||
record_groups = {} # 用于按记录分组,以便后续验证借贷平衡
|
||||
|
||||
for record in data:
|
||||
for record_idx, record in enumerate(data):
|
||||
received_amount = record["ReceivedAmount"]
|
||||
handling_fee = record["HandlingFee"]
|
||||
orders = record["Order"]
|
||||
@@ -75,6 +76,10 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
if received_amount is None or not orders:
|
||||
continue
|
||||
|
||||
# 使用记录索引作为键,避免相同(received_amount, handling_fee)的重复覆盖
|
||||
record_key = record_idx
|
||||
record_groups[record_key] = []
|
||||
|
||||
# 1. ReceivedAmount 借方记录
|
||||
# 科目代码: 1002.02, 科目名称: 银行存款 - 中行USD
|
||||
for order in orders:
|
||||
@@ -94,14 +99,16 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
"借/贷": "借",
|
||||
"科目代码(*)": "1002.02",
|
||||
"科目名称(*)": "银行存款 - 中行USD",
|
||||
"核算项目": account_name,
|
||||
"核算项目": "", # 修改为空
|
||||
"币别": "美元",
|
||||
"汇率": exchange_rate,
|
||||
"原币金额": received_amount,
|
||||
"金额": round(received_amount * exchange_rate, 2),
|
||||
"_check_res": check_res # 添加checkRes标记
|
||||
"金额": round(received_amount * exchange_rate, 3),
|
||||
"_check_res": check_res, # 添加checkRes标记
|
||||
"_record_key": record_key # 记录所属的record_key
|
||||
}
|
||||
entries.append(entry_debit)
|
||||
record_groups[record_key].append(entry_debit)
|
||||
break # 只记录一次借方
|
||||
|
||||
# 2. 手续费借方记录 (如果手续费>0)
|
||||
@@ -127,10 +134,12 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
"币别": "人民币",
|
||||
"汇率": "",
|
||||
"原币金额": "",
|
||||
"金额": round(handling_fee * exchange_rate, 2),
|
||||
"_check_res": check_res # 添加checkRes标记
|
||||
"金额": round(handling_fee * exchange_rate, 3),
|
||||
"_check_res": check_res, # 添加checkRes标记
|
||||
"_record_key": record_key # 记录所属的record_key
|
||||
}
|
||||
entries.append(entry_fee)
|
||||
record_groups[record_key].append(entry_fee)
|
||||
|
||||
# 3. Order列表中每一项的贷方记录
|
||||
# 科目代码: 1122, 科目名称: 应收账款
|
||||
@@ -160,10 +169,46 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
"币别": "美元",
|
||||
"汇率": exchange_rate,
|
||||
"原币金额": amount,
|
||||
"金额": round(amount * exchange_rate, 2),
|
||||
"_check_res": check_res # 添加checkRes标记
|
||||
"金额": round(amount * exchange_rate, 3),
|
||||
"_check_res": check_res, # 添加checkRes标记
|
||||
"_record_key": record_key # 记录所属的record_key
|
||||
}
|
||||
entries.append(entry_order)
|
||||
record_groups[record_key].append(entry_order)
|
||||
|
||||
# 验证借贷平衡并标记不平衡的记录
|
||||
for record_key, record_entries in record_groups.items():
|
||||
debit_sum = 0
|
||||
credit_sum = 0
|
||||
credit_count = 0 # 记录贷方条目数量,用于动态调整容差
|
||||
|
||||
for entry in record_entries:
|
||||
if entry["借/贷"] == "借":
|
||||
# 根据科目代码计算金额
|
||||
if entry["科目代码(*)"] == "1002.02": # 到账金额
|
||||
debit_sum += entry["原币金额"] * entry["汇率"]
|
||||
else: # 手续费 5603.03
|
||||
# 手续费的原币金额就是handling_fee
|
||||
handling_fee = entry["手续费"]
|
||||
debit_sum += handling_fee * exchange_rate
|
||||
else: # 贷
|
||||
credit_sum += entry["原币金额"] * entry["汇率"]
|
||||
credit_count += 1
|
||||
|
||||
# 检查借贷是否平衡 (使用原币金额计算,然后保留3位小数进行比较)
|
||||
debit_sum_rounded = round(debit_sum, 3)
|
||||
credit_sum_rounded = round(credit_sum, 3)
|
||||
|
||||
# 容差 = 0.0015 + 0.0005 * 贷方条目数
|
||||
# 基础容差0.0015处理浮点数精度和汇率计算误差
|
||||
# 每个贷方条目额外贡献0.0005的容差(四舍五入误差)
|
||||
tolerance = 0.0015 + 0.0005 * credit_count
|
||||
is_balanced = abs(debit_sum_rounded - credit_sum_rounded) <= tolerance
|
||||
|
||||
# 如果不平衡,为所有条目添加标记
|
||||
if not is_balanced:
|
||||
for entry in record_entries:
|
||||
entry["_balance_error"] = True
|
||||
|
||||
return entries
|
||||
|
||||
@@ -197,7 +242,8 @@ def save_to_excel(entries: List[Dict[str, Any]], output_file: str):
|
||||
cell.alignment = Alignment(horizontal="center", vertical="center")
|
||||
|
||||
# 写入数据
|
||||
error_fill = PatternFill(start_color="FAD1D4", end_color="FAD1D4", fill_type="solid")
|
||||
error_fill = PatternFill(start_color="FAD1D4", end_color="FAD1D4", fill_type="solid") # checkRes错误 - 粉色
|
||||
balance_error_fill = PatternFill(start_color="fff799", end_color="fff799", fill_type="solid") # 借贷不平衡 - 黄色
|
||||
|
||||
for row_idx, entry in enumerate(entries, start=2):
|
||||
check_res = entry.get("_check_res", True)
|
||||
@@ -221,7 +267,13 @@ def save_to_excel(entries: List[Dict[str, Any]], output_file: str):
|
||||
# 先设置所有背景颜色(在合并单元格之前)
|
||||
for row_idx, entry in enumerate(entries, start=2):
|
||||
check_res = entry.get("_check_res", True)
|
||||
if not check_res:
|
||||
balance_error = entry.get("_balance_error", False)
|
||||
|
||||
# 优先级:借贷不平衡(黄色) > checkRes错误(粉色)
|
||||
if balance_error:
|
||||
for col_idx in range(1, 15):
|
||||
ws.cell(row=row_idx, column=col_idx).fill = balance_error_fill
|
||||
elif not check_res:
|
||||
for col_idx in range(1, 15):
|
||||
ws.cell(row=row_idx, column=col_idx).fill = error_fill
|
||||
|
||||
@@ -257,7 +309,13 @@ def save_to_excel(entries: List[Dict[str, Any]], output_file: str):
|
||||
# 合并后重新应用背景颜色(确保合并单元格也有背景色)
|
||||
for row_idx, entry in enumerate(entries, start=2):
|
||||
check_res = entry.get("_check_res", True)
|
||||
if not check_res:
|
||||
balance_error = entry.get("_balance_error", False)
|
||||
|
||||
# 优先级:借贷不平衡(黄色) > checkRes错误(粉色)
|
||||
if balance_error:
|
||||
for col_idx in range(1, 15):
|
||||
ws.cell(row=row_idx, column=col_idx).fill = balance_error_fill
|
||||
elif not check_res:
|
||||
for col_idx in range(1, 15):
|
||||
ws.cell(row=row_idx, column=col_idx).fill = error_fill
|
||||
|
||||
|
||||
Reference in New Issue
Block a user