fix
This commit is contained in:
Binary file not shown.
30
README.md
30
README.md
@@ -71,8 +71,8 @@ python3 -c "import openpyxl; print(openpyxl.__version__)"
|
||||
- `ReceivedAmount`: 实收金额 (F列)
|
||||
- `HandlingFee`: 手续费 (G列,空值记为0)
|
||||
- `Order`: 订单列表
|
||||
- `OrderNum`: 订单号 (H列)
|
||||
- `Amount`: 金额 (I列)
|
||||
- `OrderNum`: 订单号 (H列,可以为空)
|
||||
- `Amount`: 金额 (I列,必需)
|
||||
- `AccountName`: 账户名称 (O列)
|
||||
- `checkRes`: 验证结果 (实收金额+手续费 = 订单金额之和)
|
||||
|
||||
@@ -125,6 +125,7 @@ python3 generate_accounting_entries.py
|
||||
1. **到账金额 - 借方** (每笔记录1条)
|
||||
- 科目代码: `1002.02`
|
||||
- 科目名称: `银行存款 - 中行USD`
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 币别: 美元
|
||||
- 原币金额: ReceivedAmount
|
||||
- 金额: ReceivedAmount × 汇率
|
||||
@@ -132,6 +133,7 @@ python3 generate_accounting_entries.py
|
||||
2. **手续费 - 借方** (如果手续费>0)
|
||||
- 科目代码: `5603.03`
|
||||
- 科目名称: `财务费用-手续费`
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 币别: 人民币
|
||||
- 金额: HandlingFee × 汇率
|
||||
|
||||
@@ -139,15 +141,21 @@ python3 generate_accounting_entries.py
|
||||
- 科目代码: `1122`
|
||||
- 科目名称: `应收账款`
|
||||
- 应收账款: Order.Amount (显示在"应收账款"列)
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 币别: 美元
|
||||
- 原币金额: Order.Amount
|
||||
- 金额: Order.Amount × 汇率
|
||||
|
||||
### 特殊规则
|
||||
|
||||
- **摘要处理**:
|
||||
- OrderNum有值时: 摘要为 `美金收款-{OrderNum}`
|
||||
- OrderNum为空时: 摘要固定为 `美金收款`
|
||||
- **金额验证**: checkRes为false的记录,所有相关分录行标记为粉红色背景(#FAD1D4)
|
||||
- **单元格合并**: 同一笔到账金额的所有分录,"到账金额"和"手续费"列会合并显示
|
||||
- **空值处理**: 订单金额为空的订单会被跳过,不生成贷方分录
|
||||
- **空值处理**:
|
||||
- 订单金额为空的订单会被跳过,不生成贷方分录
|
||||
- 订单号(OrderNum)可以为空,允许记录
|
||||
|
||||
---
|
||||
|
||||
@@ -262,11 +270,15 @@ DEFAULT_EXCHANGE_RATE = 7.1072 # 修改此默认值
|
||||
|
||||
程序自动将空值记为0。
|
||||
|
||||
### Q3: 订单金额为空怎么办?
|
||||
### Q3: 订单号(OrderNum)为空怎么办?
|
||||
|
||||
订单号为空是允许的,程序会记录该订单。生成的会计分录摘要会显示为 `美金收款`(而不是 `美金收款-{OrderNum}`)。
|
||||
|
||||
### Q4: 订单金额为空怎么办?
|
||||
|
||||
金额为空的订单会被跳过,不生成贷方分录。
|
||||
|
||||
### Q4: 如何修改汇率?
|
||||
### Q5: 如何修改汇率?
|
||||
|
||||
**推荐方法**: 创建 `exchange_rate.txt` 文件,输入汇率值即可。
|
||||
|
||||
@@ -276,7 +288,7 @@ echo "7.25" > exchange_rate.txt
|
||||
|
||||
**备选方法**: 编辑 `generate_accounting_entries.py` 第13行的 `DEFAULT_EXCHANGE_RATE` 值。
|
||||
|
||||
### Q5: Excel列对应关系
|
||||
### Q6: Excel列对应关系
|
||||
|
||||
| 字段 | Excel列 | 说明 |
|
||||
|------|---------|------|
|
||||
@@ -331,6 +343,12 @@ echo "7.25" > exchange_rate.txt
|
||||
|
||||
## 更新记录
|
||||
|
||||
- **v1.3** - 2025-10-17
|
||||
- 支持OrderNum为空的订单记录
|
||||
- 修改数据提取逻辑: 允许OrderNum为空,只跳过Amount为空的订单
|
||||
- 优化摘要生成: OrderNum为空时摘要显示为 `美金收款`
|
||||
- 确保所有数据行都被正确记录和处理
|
||||
|
||||
- **v1.2** - 2025-10-17
|
||||
- 新增汇率文件支持: 可通过 `exchange_rate.txt` 设置汇率
|
||||
- 智能汇率验证: 自动检测异常汇率并回退到默认值
|
||||
|
||||
BIN
data/data.xlsx
BIN
data/data.xlsx
Binary file not shown.
@@ -81,13 +81,16 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
order_num = order["OrderNum"]
|
||||
account_name = order["AccountName"]
|
||||
|
||||
# 当orderNum为空时,摘要固定为"美金收款"
|
||||
summary = "美金收款" if not order_num else f"美金收款-{order_num}"
|
||||
|
||||
entry_debit = {
|
||||
"到账金额": received_amount,
|
||||
"手续费": handling_fee,
|
||||
"订单号": order_num,
|
||||
"应收账款": "",
|
||||
"金蝶名称": account_name,
|
||||
"摘要": f"美金收款-{order_num}",
|
||||
"摘要": summary,
|
||||
"借/贷": "借",
|
||||
"科目代码(*)": "1002.02",
|
||||
"科目名称(*)": "银行存款 - 中行USD",
|
||||
@@ -107,13 +110,16 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
# 获取第一个订单号用于摘要
|
||||
first_order_num = orders[0]["OrderNum"] if orders else ""
|
||||
|
||||
# 当orderNum为空时,摘要固定为"美金收款"
|
||||
summary = "美金收款" if not first_order_num else f"美金收款-{first_order_num}"
|
||||
|
||||
entry_fee = {
|
||||
"到账金额": received_amount,
|
||||
"手续费": handling_fee,
|
||||
"订单号": first_order_num,
|
||||
"应收账款": "",
|
||||
"金蝶名称": "",
|
||||
"摘要": f"美金收款-{first_order_num}",
|
||||
"摘要": summary,
|
||||
"借/贷": "借",
|
||||
"科目代码(*)": "5603.03",
|
||||
"科目名称(*)": "财务费用-手续费",
|
||||
@@ -137,13 +143,16 @@ def create_accounting_entries(data: List[Dict[str, Any]], exchange_rate: float)
|
||||
if amount is None:
|
||||
continue
|
||||
|
||||
# 当orderNum为空时,摘要固定为"美金收款"
|
||||
summary = "美金收款" if not order_num else f"美金收款-{order_num}"
|
||||
|
||||
entry_order = {
|
||||
"到账金额": received_amount,
|
||||
"手续费": handling_fee,
|
||||
"订单号": order_num,
|
||||
"应收账款": amount, # 填入Order的Amount金额
|
||||
"金蝶名称": account_name,
|
||||
"摘要": f"美金收款-{order_num}",
|
||||
"摘要": summary,
|
||||
"借/贷": "贷",
|
||||
"科目代码(*)": "1122",
|
||||
"科目名称(*)": "应收账款",
|
||||
|
||||
@@ -90,8 +90,8 @@ def extract_orders(ws, start_row: int, end_row: int, merged_ranges) -> List[Dict
|
||||
amount = get_merged_cell_value(ws, row, 9, merged_ranges) # I列
|
||||
account_name = get_merged_cell_value(ws, row, 15, merged_ranges) # O列
|
||||
|
||||
# 跳过空订单号的行
|
||||
if order_num is None or str(order_num).strip() == '':
|
||||
# 跳过金额为空的行(金额是必需的),但订单号可以为空
|
||||
if amount is None:
|
||||
continue
|
||||
|
||||
order = {
|
||||
|
||||
33
task.md
33
task.md
@@ -31,8 +31,8 @@
|
||||
- **Order** (订单列表)
|
||||
- 范围: F列合并单元格包含的所有行
|
||||
- 包含字段:
|
||||
- **OrderNum** (订单号): H列
|
||||
- **Amount** (金额): I列
|
||||
- **OrderNum** (订单号): H列 - 可以为空(null)
|
||||
- **Amount** (金额): I列 - 必需(空值的订单会被跳过)
|
||||
- **AccountName** (账户名称): O列(支持公式,读取计算结果)
|
||||
|
||||
##### 1.2.3 数据验证
|
||||
@@ -70,7 +70,8 @@
|
||||
```
|
||||
|
||||
#### 1.4 特殊处理
|
||||
- 跳过订单号为空的行
|
||||
- 允许订单号(OrderNum)为空,但金额(Amount)必需
|
||||
- 跳过金额为空的订单,不生成分录
|
||||
- 处理F列合并和非合并单元格混合的情况
|
||||
- 读取O列公式计算后的值(data_only=True)
|
||||
|
||||
@@ -91,7 +92,7 @@
|
||||
**1) 到账金额 - 借方记录** (每笔记录1条)
|
||||
- 科目代码: `1002.02`
|
||||
- 科目名称: `银行存款 - 中行USD`
|
||||
- 摘要: `美金收款-{OrderNum}`
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 核算项目: Order[0].AccountName
|
||||
- 币别: 美元
|
||||
- 汇率: 7.1072 (可配置)
|
||||
@@ -101,7 +102,7 @@
|
||||
**2) 手续费 - 借方记录** (仅当 HandlingFee > 0)
|
||||
- 科目代码: `5603.03`
|
||||
- 科目名称: `财务费用-手续费`
|
||||
- 摘要: `美金收款-{OrderNum}`
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 核算项目: 空
|
||||
- 币别: 人民币
|
||||
- 汇率: 空
|
||||
@@ -112,7 +113,7 @@
|
||||
- 科目代码: `1122`
|
||||
- 科目名称: `应收账款`
|
||||
- 应收账款: Order.Amount (显示在"应收账款"列)
|
||||
- 摘要: `美金收款-{OrderNum}`
|
||||
- 摘要: `美金收款-{OrderNum}` (如果OrderNum为空,则为 `美金收款`)
|
||||
- 核算项目: Order.AccountName
|
||||
- 币别: 美元
|
||||
- 汇率: 7.1072 (可配置)
|
||||
@@ -121,8 +122,13 @@
|
||||
|
||||
##### 2.2.2 特殊规则
|
||||
|
||||
**摘要生成**
|
||||
- 当OrderNum有值时: 摘要为 `美金收款-{OrderNum}`
|
||||
- 当OrderNum为空时: 摘要固定为 `美金收款`
|
||||
|
||||
**空值处理**
|
||||
- Order.Amount为null的订单跳过,不生成分录
|
||||
- OrderNum可以为空(null),允许记录
|
||||
|
||||
**金额验证**
|
||||
- checkRes为false的记录,所有相关分录行标记为粉红色背景(#FAD1D4)
|
||||
@@ -323,13 +329,24 @@ checkRes = abs(received_plus_fee - order_amount_sum) < 0.01
|
||||
|
||||
## 版本信息
|
||||
|
||||
- **版本**: v1.1
|
||||
- **最后更新**: 2025-01-17
|
||||
- **版本**: v1.3
|
||||
- **最后更新**: 2025-10-17
|
||||
- **作者**: Claude Code
|
||||
- **状态**: 已完成并测试
|
||||
|
||||
### 版本历史
|
||||
|
||||
**v1.3** (2025-10-17)
|
||||
- 支持OrderNum为空的订单记录
|
||||
- 修改数据提取逻辑: 允许OrderNum为空,只跳过Amount为空的订单
|
||||
- 优化摘要生成: OrderNum为空时摘要显示为 `美金收款`
|
||||
- 确保所有数据行都被正确记录和处理
|
||||
|
||||
**v1.2** (2025-10-17)
|
||||
- 新增汇率文件支持: 可通过 `exchange_rate.txt` 设置汇率
|
||||
- 智能汇率验证: 自动检测异常汇率并回退到默认值
|
||||
- 改进错误处理: 汇率文件异常时提供详细提示信息
|
||||
|
||||
**v1.1** (2025-01-17)
|
||||
- 优化会计分录规则: 移除"到账金额-贷方"记录
|
||||
- 每个Order记录都生成对应的贷方分录(无例外)
|
||||
|
||||
Reference in New Issue
Block a user