日本工资明细转换工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.py 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # Excel 转换工具配置文件
  2. import os
  3. import json
  4. # 模板文件路径
  5. TEMPLATE_PATH = "template.xlsx"
  6. # 配置文件路径
  7. CONFIG_DIR = os.path.dirname(os.path.abspath(__file__))
  8. EMPLOYEE_CONFIG_PATH = os.path.join(CONFIG_DIR, "employee_info.json")
  9. COMPANY_CONFIG_PATH = os.path.join(CONFIG_DIR, "company_options.json") # 保留兼容性
  10. BANK_CONFIG_PATH = os.path.join(CONFIG_DIR, "bank_options.json") # 保留兼容性
  11. # 单元格映射关系(源文件位置 -> 目标文件位置)
  12. # 格式:{(源文件sheet索引, 行, 列): (目标文件sheet索引, 行, 列)}
  13. # 注意:源文件行索引为0表示从C3开始的行
  14. CELL_MAPPINGS = {
  15. # 第一个Sheet的映射关系
  16. (0, 0, 3): (0, 2, 5), # C3 -> E2 氏名
  17. (0, 0, 4): (0, 3, 5), # D3 -> E3 労働日数
  18. (0, 0, 2): (0, 3, 3), # B3 -> C3 ID
  19. (0, 0, 5): (0, 6, 4), # E3 -> D6 基本給
  20. (0, 0, 6): (0, 7, 4), # F3 -> D7 職務給
  21. (0, 0, 7): (0, 8, 4), # G3 -> D8 資格手当
  22. (0, 0, 8): (0, 9, 4), # H3 -> D9 住宅手当
  23. (0, 0, 9): (0, 10, 4), # I3 -> D10 能力手当
  24. (0, 0, 10): (0, 11, 4), # J3 -> D11 通勤手当
  25. (0, 0, 11): (0, 12, 4), # K3 -> D12 残業(固定)
  26. (0, 0, 12): (0, 13, 4), # L3 -> D13 週末・祝日出勤手当
  27. (0, 0, 13): (0, 14, 4), # M3 -> D14 時間外EC操作
  28. (0, 0, 15): (0, 17, 4), # O3 -> D17
  29. (0, 0, 16): (0, 18, 4), # P3 -> D18
  30. (0, 0, 17): (0, 19, 4), # Q3 -> D19
  31. (0, 0, 18): (0, 20, 4), # R3 -> D20
  32. (0, 0, 19): (0, 21, 4), # S3 -> D21
  33. (0, 0, 20): (0, 22, 4), # T3 -> D22
  34. (0, 0, 25): (0, 25, 5), # Y3 -> E25
  35. }
  36. # 自定义值的单元格位置
  37. CUSTOM_CELLS = {
  38. "company": (0, 2, 3), # C2 - 所属公司
  39. "bank": (0, 29, 2), # B29 - 转账银行
  40. "other": (0, 2, 6), # F2 - 其他信息
  41. }
  42. # 文件名提取信息
  43. FILENAME_CONFIG = {
  44. "name_cell": (0, 3, 3), # Sheet1 的 C3 - 员工姓名
  45. "year_month_cell": (1, 4, 2), # Sheet2 的 B4 - 年月信息
  46. }
  47. # 第二个Sheet的命名格式
  48. SHEET2_NAME_FORMAT = "{month}月勤怠一覧"
  49. # 输出文件名格式
  50. OUTPUT_FILENAME_FORMAT = "{year}年{month}月份給料明細書-{name}.xlsx"
  51. # 默认选项列表(仅在配置文件不存在时使用)
  52. DEFAULT_COMPANY_OPTIONS = []
  53. # 银行信息默认结构 - 扩展为字典格式,包含更多字段
  54. DEFAULT_BANK_OPTIONS = [
  55. # 银行信息示例:
  56. # {
  57. # "employee_name": "田中太郎", # 员工姓名
  58. # "bank_name": "三井住友銀行", # 银行名称
  59. # "branch_account": "新宿通支店661 普通 8324403", # 支店和账号
  60. # "account_holder": "田中太郎" # 账户持有人
  61. # }
  62. ]
  63. # 员工信息默认结构 - 合并公司和银行信息
  64. DEFAULT_EMPLOYEE_INFO = [
  65. # 员工信息示例:
  66. # {
  67. # "employee_name": "田中太郎", # 员工姓名
  68. # "bank_name": "三井住友銀行", # 银行名称
  69. # "branch_account": "新宿通支店661 普通 8324403", # 支店和账号
  70. # "account_holder": "田中太郎", # 账户持有人
  71. # "company_name": "SPD株式会社" # 所属公司
  72. # }
  73. ]
  74. # 加载员工信息
  75. def load_employee_info():
  76. # 检查是否存在员工信息配置
  77. if os.path.exists(EMPLOYEE_CONFIG_PATH):
  78. try:
  79. with open(EMPLOYEE_CONFIG_PATH, 'r', encoding='utf-8') as f:
  80. employee_info = json.load(f)
  81. except Exception as e:
  82. print(f"加载员工信息出错: {e}")
  83. employee_info = DEFAULT_EMPLOYEE_INFO
  84. else:
  85. # 如果不存在,尝试从旧的配置中导入
  86. employee_info = []
  87. company_options = []
  88. bank_options = []
  89. # 加载旧的公司配置
  90. if os.path.exists(COMPANY_CONFIG_PATH):
  91. try:
  92. with open(COMPANY_CONFIG_PATH, 'r', encoding='utf-8') as f:
  93. company_options = json.load(f)
  94. except Exception as e:
  95. print(f"加载公司配置出错: {e}")
  96. # 加载旧的银行配置
  97. if os.path.exists(BANK_CONFIG_PATH):
  98. try:
  99. with open(BANK_CONFIG_PATH, 'r', encoding='utf-8') as f:
  100. bank_options = json.load(f)
  101. # 兼容旧版本:如果是字符串列表,转换为字典
  102. if bank_options and isinstance(bank_options[0], str):
  103. new_bank_options = []
  104. for bank_name in bank_options:
  105. new_bank_options.append({
  106. "employee_name": "",
  107. "bank_name": bank_name,
  108. "branch_account": "",
  109. "account_holder": ""
  110. })
  111. bank_options = new_bank_options
  112. except Exception as e:
  113. print(f"加载银行配置出错: {e}")
  114. # 合并旧配置
  115. if bank_options and isinstance(bank_options[0], dict):
  116. for bank_option in bank_options:
  117. employee_name = bank_option.get("employee_name", "")
  118. if employee_name: # 如果有员工姓名,则添加为一条记录
  119. employee_info.append({
  120. "employee_name": employee_name,
  121. "bank_name": bank_option.get("bank_name", ""),
  122. "branch_account": bank_option.get("branch_account", ""),
  123. "account_holder": bank_option.get("account_holder", ""),
  124. "company_name": company_options[0] if company_options else ""
  125. })
  126. # 保存新的员工信息
  127. save_options(EMPLOYEE_CONFIG_PATH, employee_info)
  128. return employee_info
  129. # 保存选项
  130. def save_options(config_path, options):
  131. try:
  132. with open(config_path, 'w', encoding='utf-8') as f:
  133. json.dump(options, f, ensure_ascii=False, indent=4)
  134. return True
  135. except Exception as e:
  136. print(f"保存配置出错: {e}")
  137. return False
  138. # 加载选项
  139. EMPLOYEE_INFO = load_employee_info()
  140. COMPANY_OPTIONS = [info.get("company_name") for info in EMPLOYEE_INFO if info.get("company_name")]
  141. COMPANY_OPTIONS = list(set(COMPANY_OPTIONS)) # 去重
  142. BANK_OPTIONS = [info for info in EMPLOYEE_INFO] # 兼容性:旧代码可能仍使用BANK_OPTIONS