package com.kaidi.oa.web;
import com.kaidi.oa.common.ApiException;
import com.kaidi.oa.common.ApiResp;
import com.kaidi.oa.common.Money;
import com.kaidi.oa.common.NotFoundException;
import com.kaidi.oa.domain.CrmPettyCash;
import com.kaidi.oa.repository.CrmPettyCashRepository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.Instant;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
/**
* 办事处备用金/借款管理(市场部·费用与预算控制·备用金闭环)。
*
* 直接闭合审计缺口:「无备用金/借款/核销闭环实体与端点:无法做员工预借款、
* 备用金台账、借支后凭报销冲销核销的资金周转管理」。
*
* 业务动作:
* POST /{id}/submit 草稿 → 待审批
* POST /{id}/approve 待审批 → 已批准(approve=true)或 已驳回(approve=false)
* POST /{id}/disburse 已批准 → 已借出(拨款)
* POST /{id}/verify 已借出 → 核销申请 → 核销完成(传实际金额,自动算余额)
* GET /summary 台账汇总(待审批数、在途借款总额、已借未核销总额)
*/
@RestController
@RequestMapping("/api/oa/crm-petty-cash")
public class CrmPettyCashController {
private final CrmPettyCashRepository repo;
public CrmPettyCashController(CrmPettyCashRepository repo) {
this.repo = repo;
}
@GetMapping
public ApiResp> list(
@RequestParam(required = false) String status,
@RequestParam(required = false) String orgUnit,
@RequestParam(required = false) String type,
@RequestParam(required = false) String applicant) {
if (status != null && !status.isBlank()) return ApiResp.ok(repo.findByStatus(status));
if (orgUnit != null && !orgUnit.isBlank()) return ApiResp.ok(repo.findByOrgUnit(orgUnit));
if (type != null && !type.isBlank()) return ApiResp.ok(repo.findByType(type));
if (applicant != null && !applicant.isBlank()) return ApiResp.ok(repo.findByApplicant(applicant));
return ApiResp.ok(repo.findAll());
}
@GetMapping("/{id}")
public ApiResp get(@PathVariable Long id) {
return ApiResp.ok(repo.findById(id)
.orElseThrow(() -> new NotFoundException("备用金记录不存在: " + id)));
}
/** GET /summary -> 台账汇总(待审批数、在途借款总额、已借未核销总额)。 */
@GetMapping("/summary")
public ApiResp