This commit is contained in:
Aiden_
2025-10-31 21:24:08 +08:00
parent cc9f3e21c9
commit 5b32208194
12 changed files with 2047 additions and 23 deletions

View File

@@ -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