package com.kym.entity.wechat;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * @author skyline
 * @description 微信区块链电子发票
 * @date 2023-09-16 14:14
 */
@Data
@Accessors(chain = true)
public class FaPiao {

    /**
     * 微信支付分配的子商户号，服务商模式下必传
     * 选填
     */
    private String sub_mchid;

    /**
     * 开票场景
     * 可选取值：
     * WITH_WECHATPAY: 微信支付场景
     * WITHOUT_WECHATPAY: 非微信支付场景
     */
    private String scene;

    /**
     * 发票申请单号，唯一标识一次开票行为。当开票场景为WITHOUT_WECHATPAY时，
     * 为调用【获取抬头填写链接】接口时指定的发票申请单号；当开票场景为WITH_WECHATPAY时，
     * 为与本次开票关联的微信支付订单号，且必须是属于相应商户的订单（服务商模式下该订单必须属于子商户；
     * 直连模式下该订单必须属于直连商户）
     */
    private String fapiao_apply_id;

    /**
     * 购买方信息，即发票抬头。若商户使用微信官方抬头，可从【获取用户填写的抬头】接口获取用户填写的抬头；也可自行收集发票抬头
     */
    private BuyerInformation buyer_information;

    /**
     * 需要开具的发票信息。注意：同一个开票申请单最多申请5张发票
     */
    private List<FaPiaoInfomation> fapiao_information;


    /**
     * 购买方信息，即发票抬头。若商户使用微信官方抬头，可从【获取用户填写的抬头】接口获取用户填写的抬头；也可自行收集发票抬头
     */
    @Data
    @Accessors(chain = true)
    public static class BuyerInformation {
        /**
         * INDIVIDUAL: 个人
         * ORGANIZATION: 单位
         * 必填
         */
        private String type;

        /**
         * 购买方名称(256)
         * 必填
         */
        private String name;

        /**
         * 购买方纳税人识别号，购买方类型为ORGANIZATION时必须存在(32)
         */
        private String taxpayer_id;

        /**
         * 购买方地址(128)
         */
        private String address;

        /**
         * 购买方电话(32)
         */
        private String telephone;

        /**
         * 购买方开户银行(32)
         */
        private String bank_name;

        /**
         * 购买方银行账号(32)
         */
        private String bank_account;

        /**
         * 用户手机号。注意：该字段为密文字段，加解密算法请参见《微信支付V3版规范》
         */
        private String phone;

        /**
         * 用户邮箱地址。注意：该字段为密文字段，加解密算法请参见《微信支付V3版规范》
         */
        private String email;
    }


    @Data
    @Accessors(chain = true)
    public static class FaPiaoInfomation {

        /**
         * 商户发票单号，唯一标识一张要开具的发票。只能是字母、数字、中划线-、下划线_、竖线|、星号*
         * 这些英文半角字符，且该单号在每个商户下必须唯一
         */
        private String fapiao_id;

        /**
         * 总价税合计，所有发票行单行金额合计的累加，展示在发票的价税合计处，单位：分
         * 注意：若是微信支付后开票，所有发票的总价税合计之和不能超过对应的微信支付单总金额；
         * 若是非微信支付开票，所有发票的总价税合计之和不能超过【获取抬头填写链接】接口中指定的总金额
         */
        private int total_amount;

        /**
         * 发票行信息，单张发票的发票行不能超过8行
         */
        private List<IssueItem> items;

        @Data
        @Accessors(chain = true)
        public static class IssueItem {

            /**
             * 【税局侧规定的货物或应税劳务、服务税收分类编码】
             * 税局侧规定的货物或应税劳务、服务税收分类编码。
             * 可自行指定符合税务部门规定的货物或应税劳务、服务编码；
             * 若使用在电子发票商户平台配置的商品类型，需要从接口【获取商户可开具的商品和服务税收分类编码对照表】获得商户已配置的编码；
             * 若该行为折扣行，必须与被折扣行的编码相同。
             */
            private String tax_code;

            /**
             * 数量，展示在发票中间的数量列，单位为10^-8^，100000000表示数量为1。
             * 若是折扣行或者没有数量概念，则默认为100000000
             */
            private int quantity = 100000000;

            /**
             * 单行金额和税费的和，折扣行的金额为负数，非折扣行的金额为正数，单位:分
             */
            private int total_amount;

            /**
             * 指定该发票行是否折扣行，折扣行必须是被折扣行的下一行
             */
            private boolean discount = false;

        }

    }


}
