/** * 体系 A · 站日现结进账 Mock + localStorage * 仅本尊提供 Excel 实站;禁造站。 * - 南海:截止8.11 收支汇总 → 现结 * - 东鹏大道:加氢记录-20260802 汇总进账明细 → 现结 */ import type { CashIntakeChangeLog, StationCashIntakeDay, StationCashIntakeLine, } from './types'; export const CASH_INTAKE_STORAGE_KEY = 'oneos-energy-spot-cash-intake-v4'; const LEGACY_STORAGE_KEYS = [ 'oneos-energy-spot-cash-intake-v3', 'oneos-energy-spot-cash-intake-v2', ]; function seedDays(): StationCashIntakeDay[] { return [ { id: 'day-st-fs-nanhai-2026-08-02', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-02', totalAmount: 2530.42, lines: [ { id: 'line-st-fs-nanhai-2026-08-02-0', customerName: "东展供应链(广州)有限公司", amount: 655.12, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-02-1', customerName: "广东开鸿氢能科技有限公司", amount: 503.88, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-02-2', customerName: "现代氢能科技有限公司", amount: 760.38, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-02-3', customerName: "广东氢动力科技服务有限公司", amount: 296.78, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-02-4', customerName: "羚牛氢能科技(广东)有限公司", amount: 314.26, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-02 18:00', }, { id: 'day-st-fs-nanhai-2026-08-03', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-03', totalAmount: 2193.36, lines: [ { id: 'line-st-fs-nanhai-2026-08-03-0', customerName: "现代氢能科技有限公司", amount: 1259.7, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-03-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 634.22, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-03-2', customerName: "东展供应链(广州)有限公司", amount: 299.44, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-03 18:00', }, { id: 'day-st-fs-nanhai-2026-08-04', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-04', totalAmount: 5216.16, lines: [ { id: 'line-st-fs-nanhai-2026-08-04-0', customerName: "广东沣开科技有限公司", amount: 3000.0, payMethod: 'bank_transfer' }, { id: 'line-st-fs-nanhai-2026-08-04-1', customerName: "现代氢能科技有限公司", amount: 1024.1, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-04-2', customerName: "羚牛氢能科技(广东)有限公司", amount: 473.86, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-04-3', customerName: "广东氢动力科技服务有限公司", amount: 368.6, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-04-4', customerName: "东展供应链(广州)有限公司", amount: 163.78, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-04-5', customerName: "外省过路车", amount: 185.82, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-04 18:00', }, { id: 'day-st-fs-nanhai-2026-08-05', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-05', totalAmount: 3469.78, lines: [ { id: 'line-st-fs-nanhai-2026-08-05-0', customerName: "现代氢能科技有限公司", amount: 1155.58, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-05-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 608.0, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-05-2', customerName: "广东氢动力科技服务有限公司", amount: 530.86, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-05-3', customerName: "广东开鸿氢能科技有限公司", amount: 315.78, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-05-4', customerName: "东展供应链(广州)有限公司", amount: 859.56, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-05 18:00', }, { id: 'day-st-fs-nanhai-2026-08-06', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-06', totalAmount: 1006.24, lines: [ { id: 'line-st-fs-nanhai-2026-08-06-0', customerName: "现代氢能科技有限公司", amount: 478.8, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-06-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 527.44, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-06 18:00', }, { id: 'day-st-fs-nanhai-2026-08-07', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-07', totalAmount: 22094.18, lines: [ { id: 'line-st-fs-nanhai-2026-08-07-0', customerName: "东展供应链(广州)有限公司", amount: 201.02, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-07-1', customerName: "现代氢能科技有限公司", amount: 1410.18, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-07-2', customerName: "羚牛氢能科技(广东)有限公司", amount: 482.98, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-07-3', customerName: "羚牛氢能科技(广东)有限公司", amount: 20000.0, payMethod: 'bank_transfer' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-07 18:00', }, { id: 'day-st-fs-nanhai-2026-08-08', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-08', totalAmount: 2845.06, lines: [ { id: 'line-st-fs-nanhai-2026-08-08-0', customerName: "东展供应链(广州)有限公司", amount: 745.94, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-08-1', customerName: "现代氢能科技有限公司", amount: 1371.8, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-08-2', customerName: "羚牛氢能科技(广东)有限公司", amount: 727.32, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-08 18:00', }, { id: 'day-st-fs-nanhai-2026-08-09', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-09', totalAmount: 2485.58, lines: [ { id: 'line-st-fs-nanhai-2026-08-09-0', customerName: "现代氢能科技有限公司", amount: 775.2, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-09-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 987.62, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-09-2', customerName: "广东氢动力科技服务有限公司", amount: 250.42, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-09-3', customerName: "东展供应链(广州)有限公司", amount: 472.34, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-09 18:00', }, { id: 'day-st-fs-nanhai-2026-08-10', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-10', totalAmount: 22823.78, lines: [ { id: 'line-st-fs-nanhai-2026-08-10-0', customerName: "现代氢能科技有限公司", amount: 1582.7, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-10-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 757.34, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-10-2', customerName: "广东氢动力科技服务有限公司", amount: 186.2, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-10-3', customerName: "东展供应链(广州)有限公司", amount: 297.54, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-10-4', customerName: "广东瀚清能源有限公司", amount: 20000.0, payMethod: 'bank_transfer' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-10 18:00', }, { id: 'day-st-fs-nanhai-2026-08-11', stationId: 'st-fs-nanhai', stationName: "佛山南海羚牛加氢站", bizDate: '2026-08-11', totalAmount: 2301.04, lines: [ { id: 'line-st-fs-nanhai-2026-08-11-0', customerName: "现代氢能科技有限公司", amount: 755.06, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-11-1', customerName: "羚牛氢能科技(广东)有限公司", amount: 596.36, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-11-2', customerName: "广东开鸿氢能科技有限公司", amount: 599.26, payMethod: 'wechat_scan' }, { id: 'line-st-fs-nanhai-2026-08-11-3', customerName: "东展供应链(广州)有限公司", amount: 350.36, payMethod: 'wechat_scan' }, ], updatedBy: "杨凤娥", updatedAt: '2026-08-11 18:00', }, { id: 'day-st-dp-dongpeng-2026-06-26', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-06-26', totalAmount: 10000.0, lines: [ { id: 'line-st-dp-dongpeng-2026-06-26-0', customerName: "广州市梅洛特物流有限公司", amount: 10000.0, payMethod: 'bank_transfer' }, ], updatedBy: "金可鹏", updatedAt: '2026-06-26 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-01', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-01', totalAmount: 1506.75, lines: [ { id: 'line-st-dp-dongpeng-2026-07-01-0', customerName: "广州新运多租赁有限公司", amount: 1506.75, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-01 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-02', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-02', totalAmount: 596.4, lines: [ { id: 'line-st-dp-dongpeng-2026-07-02-0', customerName: "广州中味餐饮服务有限公司", amount: 96.25, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-02-1', customerName: "广州新运多租赁有限公司", amount: 500.15, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-02 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-03', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-03', totalAmount: 918.4, lines: [ { id: 'line-st-dp-dongpeng-2026-07-03-0', customerName: "广州新运多租赁有限公司", amount: 918.4, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-03 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-04', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-04', totalAmount: 349.3, lines: [ { id: 'line-st-dp-dongpeng-2026-07-04-0', customerName: "广州新运多租赁有限公司", amount: 349.3, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-04 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-07', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-07', totalAmount: 20640.15, lines: [ { id: 'line-st-dp-dongpeng-2026-07-07-0', customerName: "广州市梅洛特物流有限公司", amount: 20000.0, payMethod: 'bank_transfer' }, { id: 'line-st-dp-dongpeng-2026-07-07-1', customerName: "广州中味餐饮服务有限公司", amount: 362.25, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-07-2', customerName: "广州新运多租赁有限公司", amount: 277.9, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-07 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-08', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-08', totalAmount: 896.35, lines: [ { id: 'line-st-dp-dongpeng-2026-07-08-0', customerName: "广州新运多租赁有限公司", amount: 896.35, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-08 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-09', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-09', totalAmount: 902.65, lines: [ { id: 'line-st-dp-dongpeng-2026-07-09-0', customerName: "广州中味餐饮服务有限公司", amount: 211.4, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-09-1', customerName: "广州新运多租赁有限公司", amount: 691.25, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-09 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-10', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-10', totalAmount: 1198.05, lines: [ { id: 'line-st-dp-dongpeng-2026-07-10-0', customerName: "广州中味餐饮服务有限公司", amount: 314.65, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-10-1', customerName: "广州新运多租赁有限公司", amount: 883.4, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-10 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-14', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-14', totalAmount: 266.7, lines: [ { id: 'line-st-dp-dongpeng-2026-07-14-0', customerName: "广州中味餐饮服务有限公司", amount: 266.7, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-14 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-15', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-15', totalAmount: 562.8, lines: [ { id: 'line-st-dp-dongpeng-2026-07-15-0', customerName: "广州中味餐饮服务有限公司", amount: 262.5, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-15-1', customerName: "广州新运多租赁有限公司", amount: 300.3, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-15 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-16', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-16', totalAmount: 497.7, lines: [ { id: 'line-st-dp-dongpeng-2026-07-16-0', customerName: "广州中味餐饮服务有限公司", amount: 200.9, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-16-1', customerName: "广州新运多租赁有限公司", amount: 296.8, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-16 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-17', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-17', totalAmount: 911.4, lines: [ { id: 'line-st-dp-dongpeng-2026-07-17-0', customerName: "广州新运多租赁有限公司", amount: 911.4, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-17 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-18', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-18', totalAmount: 870.45, lines: [ { id: 'line-st-dp-dongpeng-2026-07-18-0', customerName: "广州新运多租赁有限公司", amount: 870.45, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-18 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-19', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-19', totalAmount: 468.65, lines: [ { id: 'line-st-dp-dongpeng-2026-07-19-0', customerName: "广州中味餐饮服务有限公司", amount: 181.3, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-19-1', customerName: "广州新运多租赁有限公司", amount: 287.35, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-19 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-20', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-20', totalAmount: 708.75, lines: [ { id: 'line-st-dp-dongpeng-2026-07-20-0', customerName: "广州新运多租赁有限公司", amount: 480.55, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-20-1', customerName: "广州中味餐饮服务有限公司", amount: 228.2, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-20 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-21', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-21', totalAmount: 234.85, lines: [ { id: 'line-st-dp-dongpeng-2026-07-21-0', customerName: "广州新运多租赁有限公司", amount: 234.85, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-21 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-25', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-25', totalAmount: 20686.0, lines: [ { id: 'line-st-dp-dongpeng-2026-07-25-0', customerName: "广州新运多租赁有限公司", amount: 686.0, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-25-1', customerName: "广州福满华冷链物流有限公司", amount: 20000.0, payMethod: 'bank_transfer' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-25 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-27', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-27', totalAmount: 213.85, lines: [ { id: 'line-st-dp-dongpeng-2026-07-27-0', customerName: "广州新运多租赁有限公司", amount: 213.85, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-27 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-28', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-28', totalAmount: 20872.2, lines: [ { id: 'line-st-dp-dongpeng-2026-07-28-0', customerName: "广州中味餐饮服务有限公司", amount: 480.9, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-28-1', customerName: "广州新运多租赁有限公司", amount: 391.3, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-28-2', customerName: "广州市梅洛特物流有限公司", amount: 20000.0, payMethod: 'bank_transfer' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-28 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-29', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-29', totalAmount: 814.8, lines: [ { id: 'line-st-dp-dongpeng-2026-07-29-0', customerName: "广州中味餐饮服务有限公司", amount: 84.0, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-29-1', customerName: "广州新运多租赁有限公司", amount: 730.8, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-29 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-30', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-30', totalAmount: 1450.4, lines: [ { id: 'line-st-dp-dongpeng-2026-07-30-0', customerName: "广州中味餐饮服务有限公司", amount: 393.05, payMethod: 'wechat_scan' }, { id: 'line-st-dp-dongpeng-2026-07-30-1', customerName: "广州新运多租赁有限公司", amount: 1057.35, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-30 18:00', }, { id: 'day-st-dp-dongpeng-2026-07-31', stationId: 'st-dp-dongpeng', stationName: "东鹏大道甲醇制氢一体站", bizDate: '2026-07-31', totalAmount: 587.65, lines: [ { id: 'line-st-dp-dongpeng-2026-07-31-0', customerName: "广州新运多租赁有限公司", amount: 587.65, payMethod: 'wechat_scan' }, ], updatedBy: "金可鹏", updatedAt: '2026-07-31 18:00', }, ]; } function normalizeDay(d: StationCashIntakeDay): StationCashIntakeDay { return { ...d, changeLogs: Array.isArray(d.changeLogs) ? d.changeLogs : [], }; } export function loadCashIntakeDays(): StationCashIntakeDay[] { try { const raw = localStorage.getItem(CASH_INTAKE_STORAGE_KEY); if (raw) { const parsed = JSON.parse(raw) as StationCashIntakeDay[]; if (Array.isArray(parsed) && parsed.length) return parsed.map(normalizeDay); } for (const key of LEGACY_STORAGE_KEYS) { const legacy = localStorage.getItem(key); if (!legacy) continue; const parsed = JSON.parse(legacy) as StationCashIntakeDay[]; if (Array.isArray(parsed) && parsed.length) { const next = parsed.map(normalizeDay); saveCashIntakeDays(next); return next; } } } catch { /* ignore */ } return seedDays().map(normalizeDay); } export function saveCashIntakeDays(days: StationCashIntakeDay[]): void { try { localStorage.setItem(CASH_INTAKE_STORAGE_KEY, JSON.stringify(days)); } catch { /* ignore */ } } export function getCashIntakeForStationRange( days: StationCashIntakeDay[], stationId: string, startDate: string, endDate: string, ): StationCashIntakeDay[] { return days .filter((d) => d.stationId === stationId && d.bizDate >= startDate && d.bizDate <= endDate) .slice() .sort((a, b) => a.bizDate.localeCompare(b.bizDate)); } export function appendChangeLog( day: StationCashIntakeDay, entry: Omit & { id?: string }, ): StationCashIntakeDay { const log = { id: entry.id || `log-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`, at: entry.at, by: entry.by, action: entry.action, summary: entry.summary, }; const prev = Array.isArray(day.changeLogs) ? day.changeLogs : []; return { ...day, changeLogs: [log, ...prev].slice(0, 80) }; } export function upsertCashIntakeDay( days: StationCashIntakeDay[], next: StationCashIntakeDay, ): StationCashIntakeDay[] { const idx = days.findIndex((d) => d.stationId === next.stationId && d.bizDate === next.bizDate); const copy = days.slice(); if (idx >= 0) copy[idx] = { ...next, changeLogs: next.changeLogs || copy[idx].changeLogs || [] }; else copy.push({ ...next, changeLogs: next.changeLogs || [] }); return copy.sort((a, b) => b.bizDate.localeCompare(a.bizDate)); } export function deleteCashIntakeDay( days: StationCashIntakeDay[], stationId: string, bizDate: string, ): StationCashIntakeDay[] { return days.filter((d) => !(d.stationId === stationId && d.bizDate === bizDate)); } export function sumLines(lines: StationCashIntakeLine[]): number { return lines.reduce((s, l) => s + (Number(l.amount) || 0), 0); } export function summarizeCashIntake( days: StationCashIntakeDay[], startDate?: string, endDate?: string, ): { dayCount: number; totalAmount: number; stationCount: number } { const filtered = days.filter((d) => { if (startDate && d.bizDate < startDate) return false; if (endDate && d.bizDate > endDate) return false; return true; }); const stations = new Set(filtered.map((d) => d.stationId)); return { dayCount: filtered.length, totalAmount: filtered.reduce((s, d) => s + d.totalAmount, 0), stationCount: stations.size, }; }