package com.jwipc.finance.logic;

import com.jwipc.finance.dto.*;
import com.jwipc.finance.entity.InvoicedApply;
import com.jwipc.finance.model.po.CreatePcaDetailPO;
import com.jwipc.finance.model.po.InvoicedApplyItemPO;
import com.jwipc.finance.model.query.InvoicedApplyQuery;
import com.jwipc.finance.model.query.PaymentApplyItemQuery;
import com.jwipc.page.PageView;
import com.jwipc.sys.dto.BusinessAttachmentDTO;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author shenyang.ou
 * @date 2024/3/5 11:17
 * @desc
 */
public interface InvoicedApplyLogic {
    InvoicedApplyDTO getById(Long id);

    InvoicedApplyDTO getByInvoiceApplyNo(String invoiceApplyNo);

    /**
     * 暂时存表头
     *
     * @param params 请求参数
     */
    void updateHead(InvoicedApplySaveParamDTO params);

    /**
     * 暂时数据
     *
     * @param params 请求参数
     */
    void dataSave(InvoicedApplySaveParamDTO params,List<InvoicedApplyItemPO> inquiryPOS);

    /**
     * 红冲保存
     *
     * @param params 请求参数
     */
    void redReversalSave(InvoicedApplySaveParamDTO params);
    /**
     * 编辑数据
     *
     * @param params 请求参数
     */
    void dataEdit(InvoicedApplySaveParamDTO params,List<InvoicedApplyItemPO> inquiryPOS);

    PageView selectDataByQuery(InvoicedApplyQuery query);

    List<InvoicedApplyDTO> listAll(InvoicedApplyQuery query);

    /**
     * 开票申请单删除
     *
     * @param ids 开票申请ID
     * @param logicDelete 是否逻辑删除
     */
    void dataDel(String ids,Boolean logicDelete);

    /**
     * 开票申请提交采购确认
     *
     * @param ids 开票申请ID
     */
    void submitConfirm(String ids);

    /**
     * 采购或财务确认开票申请
     *
     * @param params 开票申请数据
     */
    void purchaseConfirm(InvoicedApplySaveParamDTO params);
    List<String> confirmCheck(InvoicedApplySaveParamDTO params);

    /**
     * 影像化
     * @param iaId 开票申请ID
     */
    void toImg(Long iaId);
    String toAllImg(Long iaId);

    List<BusinessAttachmentDTO> getImgList(Long id);

    /**
     * 删除影像化
     * @param iaId 开票申请ID
     */
    void deleteImg(Long iaId);
    void deleteAllImg(Long iaId);

    void saleContractConfirm(InvoicedApplySaveParamDTO params);

    /**
     * 采购撤销待财务确认状态的开票申请
     *
     * @param iaId 开票申请ID
     * @param revokeReason 撤销原因
     */
    void revokeFinConfirm(Long iaId, String revokeReason);


    /**
     * 采购修改新的付款到期日。
     * @param iaId
     * @param newPaymentExpireDate
     */
    void updateNewDate(Long iaId, String newPaymentExpireDate);

    /**
     * 财务取消确认
     * @param ids 开票申请IDs
     */
    void financeConfirmCancel(String ids);
    void updatePurchaseOrderFin(String ids);
    void payableSend(String ids);

    /**
     * 数据导出
     *
     * @param request 请求体
     * @param response 返回体
     * @param id 开票申请单ID
     */
    void dataExport(HttpServletRequest request, HttpServletResponse response, Long id);

    InvoicedApplyPrintDTO selectPrintDataById(Long id);

    /**
     * 查询预制发票号
     * @param id
     * @return
     */
    String findInvoiceVoucher(Long id);

    /**
     * 查询货到付款信息
     * @param query
     * @return
     */
    List<CreatePcaDetailPO> readCodPaymentInvoiceData(PaymentApplyItemQuery query);

    void writeOff(Long id, String writeOff);

    InvoicedApply findInvoicedApplyByStatementNo(String statementNo);
    InvoicedApply findInvoicedExtApplyByStatementNo(String statementNo);

    void updatePostStatus(Long iaId, Integer postStatus);
    void updateContractSupplementStatus(Long iaId, Integer contractSupplementStatus);

    Boolean statementInvoicingCheck(String statementNo);

    /**
     * 红冲标记
     * @param params
     */
    void redReversal(InvoicedRedReversalParamDTO params);

    /**
     * 红冲财务确认
     * @param param
     */
    void redReversalFinanceConfirm(RedReversalConfirmParamDTO param);

    /**
     * 2025-11-20特殊供应商开票申请审核方法
     * 采购或财务确认开票申请
     *
     * @param params 开票申请数据
     */
    void purchaseConfirmOld(InvoicedApplySaveParamDTO params);

    /**
     * 采购撤销待财务确认状态的开票申请2025-07之前逻辑
     *
     * @param iaId 开票申请ID
     * @param revokeReason 撤销原因
     */
    void revokeFinConfirmOld(Long iaId, String revokeReason);
}
