package com.benyun.project.third.kingdee.domain;

import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 销售订单
 */
@Data
public class SALSaleOrder {
    /**
     *
     * 需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新字段时Model数据包中必须设置内码，若更新单据体字段还需设置分录内码）
     */
    private String[] NeedUpDateFields;
    /**
     * 需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key）
     */
    private String[] NeedReturnFields;
    /**
     * 是否删除已存在的分录，布尔类型，默认true（非必录）
     */
    private boolean IsDeleteEntry;
    /**
     * 表单所在的子系统内码，字符串类型（非必录）
     */
    private String SubSystemId;
    /**
     * 是否验证所有的基础资料有效性，布尔类，默认false（非必录）
     */
    private boolean IsVerifyBaseDataField;
    /**
     * 是否批量填充分录，默认true（非必录）
     */
    private boolean IsEntryBatchFill;
    /**
     * 是否验证数据合法性标志，布尔类型，默认true（非必录）注（设为false时不对数据合法性进行校验）
     */
    private boolean ValidateFlag;
    /**
     * 是否用编码搜索基础资料，布尔类型，默认true（非必录）
     */
    private boolean NumberSearch;
    /**
     * 是否自动调整JSON字段顺序，布尔类型，默认false（非必录）
     */
    private boolean IsAutoAdjustField;
    /**
     * 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
     */
    private String InterationFlags;
    /**
     * 是否允许忽略交互，布尔类型，默认true（非必录）
     */
    private String IgnoreInterationFlag;
    /**
     * 是否控制精度，为true时对金额、单价和数量字段进行精度验证，默认false（非必录）
     */
    private boolean IsControlPrecision;
    /**
     * 校验Json数据包是否重复传入，一旦重复传入，接口调用失败，默认false（非必录）
     */
    private boolean ValidateRepeatJson;
    /**
     * 表单数据包，JSON类型（必录）
     */
    @Valid
    @NotEmpty(message = "表单数据包，JSON类型（必录）")
    private List<Model> model;
    /**
     * 表单数据包，JSON类型（必录）
     */
    @Data
    public static class Model{
        public Integer FID;
        /**
         * 单据类型
         */
        @Valid
        @NotEmpty(message = "单据类型是必录项")
        public fBillTypeID FBillTypeID;
        /**
         * 单据类型
         */
        @Data
        public static class fBillTypeID{
            @NotNull(message = "单据类型是必录项")
            public String FNUMBER;
        }
        /**
         * 单据编号
         */
        public String FBillNo;
        /**
         * 日期
         */
        @NotNull(message = "单据类型是必录项")
        public String FDate;
        /**
         * 销售组织
         */
        @Valid
        @NotEmpty(message = "销售组织是必录项")
        public fSaleOrgId FSaleOrgId;
        /**
         * 销售组织
         */
        @Data
        public static class fSaleOrgId{
            @NotNull(message = "销售组织是必录项")
            public String FNumber;
        }
        /**
         * 客户
         */
        @Valid
        @NotEmpty(message = "客户是必录项")
        public fCustId FCustId;
        /**
         * 客户
         */
        @Data
        public static class fCustId{
            public String FNumber;
        }
        /**
         * 交货方式
         */
        public fHeadDeliveryWay FHeadDeliveryWay;
        /**
         * 交货方式
         */
        @Data
        public static class fHeadDeliveryWay{
            public String FNumber;
        }
        /**
         * 收货方
         */
        public fReceiveId FReceiveId;
        /**
         * 收货方
         */
        @Data
        public static class fReceiveId{
            public String FNumber;
        }
        /**
         * 交货地点
         */
        public fheadlocid FHEADLOCID;
        /**
         * 交货地点
         */
        @Data
        public static class fheadlocid{
            public String FNumber;
        }
        /**
         * 交货地点
         */
        public fCorrespondOrgId FCorrespondOrgId;
        /**
         * 对应组织
         */
        @Data
        public static class fCorrespondOrgId{
            public String FNumber;
        }
        /**
         * 销售部门
         */
        public fSaleDeptId FSaleDeptId;
        /**
         * 销售部门
         */
        @Data
        public static class fSaleDeptId{
            public String FNumber;
        }
        /**
         * 销售组
         */
        public fSaleGroupId FSaleGroupId;
        /**
         * 销售组
         */
        @Data
        public static class fSaleGroupId{
            public String FNumber;
        }
        /**
         * 销售员
         */
        @NotEmpty(message = "销售员是必录项")
        public fSalerId FSalerId;
        /**
         * 销售员
         */
        @Data
        public static class fSalerId{
            public String FNumber;
        }
        /**
         * 联系电话
         */
        public String FLinkPhone;
        /**
         * 收货人姓名
         */
        public String FLinkMan;
        /**
         * 收货方地址
         */
        public String FReceiveAddress;
        /**
         * 结算方
         */
        public fSettleId FSettleId;
        /**
         * 结算方
         */
        @Data
        public static class fSettleId{
            public String FNumber;
        }
        /**
         * 收货方联系人
         */
        public fReceiveContact FReceiveContact;
        /**
         * 收货方联系人
         */
        @Data
        public static class fReceiveContact{
            public String FNAME;
        }
        /**
         * 付款方
         */
        public fChargeId FChargeId;
        /**
         * 付款方
         */
        @Data
        public static class fChargeId{
            public String FNAME;
        }
        /**
         * 移动销售订单编号
         */
        public String FNetOrderBillNo;
        /**
         * 移动销售订单ID
         */
        public Integer FNetOrderBillId;
        /**
         * 商机内码
         */
        public Integer FOppID;
        /**
         * 销售阶段
         */
        public fSalePhaseID FSalePhaseID;
        /**
         * 销售阶段
         */
        @Data
        public static class fSalePhaseID{
            public String FNAME;
        }
        /**
         * 是否期初单据
         */
        public boolean FISINIT;
        /**
         * 备注
         */
        public String FNote;
        /**
         * 来自移动（弃用）
         */
        public boolean FIsMobile;
        /**
         * 订单来源
         */
        public String FSOFrom;
        /**
         * 销售合同内码
         */
        public Integer FContractId;
        /**
         * 生成受托加工材料清单
         */
        public boolean FIsUseOEMBomPush;
        /**
         * 变更单主键
         */
        public Integer FXPKID_H;
        /**
         * 关闭原因
         */
        public String FCloseReason;
        /**
         * 生成分销采购订单
         */
        public boolean FIsUseDrpSalePOPush;
        /**
         * 生成直运出入库
         */
        public boolean FIsCreateStraightOutIN;
        /**
         * 财务信息
         */
        @Valid
        public fSaleOrderFinance FSaleOrderFinance;
        /**
         * 销售阶段
         */
        @Data
        public static class fSaleOrderFinance{
            public Integer FEntryId;
            /**
             * 结算币别
             */
            @NotEmpty(message = "结算币别是必录项")
            public fSettleCurrId FSettleCurrId;
            /**
             * 结算币别
             */
            @Data
            public static class fSettleCurrId{
                public String FNumber;
            }
            /**
             * 收款条件
             */
            public fRecConditionId FRecConditionId;
            /**
             * 收款条件
             */
            @Data
            public static class fRecConditionId{
                public String FNumber;
            }
            /**
             * 价外税
             */
            public boolean FIsPriceExcludeTax;
            /**
             * 结算方式
             */
            public fSettleModeId FSettleModeId;
            /**
             * 结算方式
             */
            @Data
            public static class fSettleModeId{
                public String FNumber;
            }
            /**
             * 是否含税
             */
            public boolean FIsIncludedTax;
            /**
             * 价目表
             */
            public fPriceListId FPriceListId;
            /**
             * 价目表
             */
            @Data
            public static class fPriceListId{
                public String FNumber;
            }
            /**
             * 折扣表
             */
            public fDiscountListId FDiscountListId;
            /**
             * 折扣表
             */
            @Data
            public static class fDiscountListId{
                public String FNumber;
            }
            /**
             * 汇率类型
             */
            public fExchangeTypeId FExchangeTypeId;
            /**
             * 汇率类型
             */
            @Data
            public static class fExchangeTypeId{
                public String FNumber;
            }
            /**
             * 保证金比例（%）
             */
            public Integer FMarginLevel;
            /**
             * 保证金
             */
            public Integer FMargin;
            /**
             * 寄售生成跨组织调拨
             */
            public boolean FOverOrgTransDirect;
            /**
             * 整单折扣额
             */
            public Integer FAllDisCount;
            /**
             * 收款二维码链接
             */
            public String FRecBarcodeLink;
            /**
             * 变更单主键
             */
            public Integer FXPKID_F;

        }
        /**
         * 订单条款
         */
        public List<fSaleOrderClause> FSaleOrderClause ;
        /**
         * 订单条款
         */
        @Data
        public static class fSaleOrderClause {
            public Integer FEntryId;
            /**
             * 条款编码
             */
            @NotEmpty(message = "结算币别是必录项")
            public fClauseId FClauseId;
            /**
             * 条款编码
             */
            @Data
            public static class fClauseId{
                public String FNumber;
            }
            /**
             * 描述
             */
            public String FClauseDesc;
            /**
             * 变更单主键
             */
            public Integer FXPKID_C;
        }
        /**
         * 订单明细
         */
        @NotEmpty(message = "订单明细是必录项")
        public List<fSaleOrderEntry> FSaleOrderEntry ;

        @Data
        public static class fSaleOrderEntry {
            public Integer FEntryId;
            /**
             * 退补类型
             */
            public String FReturnType;
            /**
             * 产品类型
             */
            public String FRowType;
            /**
             * 上级物料分组编码
             */
            public fMaterialGroup FMaterialGroup;
            /**
             * 上级物料分组编码
             */
            @Data
            public static class fMaterialGroup{
                public String FNUMBER;
            }
            /**
             * 物料分组编码
             */
            public fMaterialGroupByMat FMaterialGroupByMat;
            /**
             * 物料分组编码
             */
            @Data
            public static class fMaterialGroupByMat{
                public String FNUMBER;
            }
            /**
             * 客户物料编码
             */
            public fMapId FMapId;
            /**
             * 客户物料编码
             */
            @Data
            public static class fMapId{
                public String FNumber;
            }
            /**
             * 物料编码
             */
            @NotEmpty(message = "物料编码是必录项")
            public fMaterialId FMaterialId;
            /**
             * 物料编码
             */
            @Data
            public static class fMaterialId{
                public String FNumber;
            }
            /**
             * 零售条形码
             */
            public String FBarcode;
            /**
             * 辅助属性
             */
            @Data
            public static class FAuxPropId{}
            /**
             * 父项产品
             */
            public List<fParentMatId> FParentMatId;
            /**
             * 父项产品
             */
            @Data
            public static class fParentMatId{
                public String FNUMBER;
            }
            /**
             * 销售单位
             */
            @NotEmpty(message = "销售单位是必录项")
            public fUnitID FUnitID;
            /**
             * 销售单位
             */
            @Data
            public static class fUnitID{
                public String FNumber;
            }
            /**
             * 当前库存
             */
            public Integer FInventoryQty;
            /**
             * 可用库存
             */
            public Integer FCurrentInventory;
            /**
             * 待发数量
             */
            public Integer FAwaitQty;
            /**
             * 可发库存
             */
            public Integer FAvailableQty;
            /**
             * 销售数量
             */
            public Integer FQty;
            /**
             * 计价单位
             */
            @NotEmpty(message = "计价单位是必录项")
            public fPriceUnitId FPriceUnitId;
            /**
             * 计价单位
             */
            @Data
            public static class fPriceUnitId{
                public String FNumber;
            }
            /**
             * 原数量
             */
            public Integer FOldQty;
            /**
             * 采购计价单位
             */
            public List<fPurPriceUnitId> FPurPriceUnitId;
            /**
             * 采购计价单位
             */
            @Data
            public static class fPurPriceUnitId{
                public String FNumber;
            }
            /**
             * 单价
             */
            public Integer FPrice;
            /**
             * 含税单价
             */
            public Integer FTaxPrice;
            /**
             * 是否赠品
             */
            public boolean FIsFree;
            /**
             * 税组合
             */
            public List<fTaxCombination> FTaxCombination;
            /**
             * 税组合
             */
            @Data
            public static class fTaxCombination{
                public String FNumber;
            }
            /**
             * 税率%
             */
            public Integer FEntryTaxRate;
            /**
             * 批号
             */
            public fLot FLot;
            /**
             * 批号
             */
            @Data
            public static class fLot{
                public String FNumber;
            }
            /**
             * 生产日期
             */
            public String FProduceDate;
            /**
             * 保质期
             */
            public Integer FExpPeriod;
            /**
             * 保质期单位
             */
            public String FExpUnit;
            /**
             * 有效期至
             */
            public String FExpiryDate;
            /**
             * 折扣率%
             */
            public Integer FDiscountRate;
            /**
             * 单价折扣
             */
            public Integer FPriceDiscount;
            /**
             * 最新采购入库价
             */
            public Integer FInStockPrice;
            /**
             * 要货日期
             */
            @NotNull(message = "要货日期是必录项")
            public String FDeliveryDate;
            /**
             * 发货门店
             */
            public fBranchId FBranchId;
            /**
             * 发货门店
             */
            @Data
            public static class fBranchId{
                public String FNUMBER;
            }
            /**
             * 库存组织
             */
            public fStockOrgId FStockOrgId;
            /**
             * 库存组织
             */
            @Data
            public static class fStockOrgId{
                public String FNumber;
            }
            /**
             * 结算组织
             */
            @NotNull(message = "结算组织是必录项")
            public fSettleOrgIds FSettleOrgIds;
            /**
             * 结算组织
             */
            @Data
            public static class fSettleOrgIds{
                public String FNumber;
            }
            /**
             * 供应组织
             */
            @NotNull(message = "结算组织是必录项")
            public fSupplyOrgId FSupplyOrgId;
            /**
             * 供应组织
             */
            @Data
            public static class fSupplyOrgId{
                public String FNumber;
            }
            /**
             * BOM版本
             */
            public fBomId FBomId;
            /**
             * BOM版本
             */
            @Data
            public static class fBomId{
                public String FNumber;
            }
            /**
             * 货主类型
             */
            public String FOwnerTypeId;
            /**
             * 货主
             */
            public fOwnerId FOwnerId;
            /**
             * 货主
             */
            @Data
            public static class fOwnerId{
                public String FNumber;
            }
            /**
             * 仓库
             */
            public fSOStockId FSOStockId;
            /**
             * 仓库
             */
            @Data
            public static class fSOStockId{
                public String FNUMBER;
            }
            /**
             * 仓位
             */
            public fSOStockLocalId FSOStockLocalId;
            /**
             * 仓位
             */
            @Data
            public static class fSOStockLocalId{}
            /**
             * 备注
             */
            public String FEntryNote;
            /**
             * 源单类型
             */
            public String FSrcType;
            /**
             * 源单编号
             */
            public String FSrcBillNo;
            /**
             * 预留类型
             */
            @NotNull(message = "预留类型是必录项")
            public String FReserveType;
            /**
             * 需求优先级
             */
            public Integer FPriority;
            /**
             * 计划跟踪号
             */
            public String FMtoNo;
            /**
             * 促销匹配类型
             */
            public String FPromotionMatchType;
            /**
             * 供应商协同平台订单分录ID
             */
            public Integer FNetOrderEntryId;
            /**
             * 计价基本数量
             */
            public Integer FPriceBaseQty;
            /**
             * 库存单位
             */
            @NotEmpty(message = "库存单位是必录项")
            public fStockUnitID FStockUnitID;
            /**
             * 库存单位
             */
            @Data
            public static class fStockUnitID{
                public String FNumber;
            }
            /**
             * 库存数量
             */
            public Integer FStockQty;
            /**
             * 库存基本数量
             */
            public Integer FStockBaseQty;
            /**
             * 服务上下文
             */
            public String FServiceContext;
            /**
             * 采购单位
             */
            public fPurUnitID FPurUnitID;
            /**
             * 采购单位
             */
            @Data
            public static class fPurUnitID{
                public String FNumber;
            }
            /**
             * 采购数量
             */
            public Integer FPurQty;
            /**
             * 采购基本数量
             */
            public Integer FPurBaseQty;
            /**
             * 超发控制单位类型
             */
            public String FOUTLMTUNIT;
            /**
             * 是否零售促销
             */
            public boolean FRetailSaleProm;
            /**
             * 超发控制单位
             */
            public fOutLmtUnitID FOutLmtUnitID;
            /**
             * 超发控制单位
             */
            @Data
            public static class fOutLmtUnitID{
                public String FNumber;
            }
            /**
             * 返利前价格
             */
            public Integer FOldTaxPrice;
            /**
             * 返利前金额
             */
            public Integer FOldAmount;
            /**
             * 返利前价税合计
             */
            public Integer fOldAllAmount;
            /**
             * 已预留
             */
            public boolean FISMRP;
            /**
             * 返利前折扣率
             */
            public Integer FOldDiscountRate;
            /**
             * 返利前折扣额
             */
            public Integer FOldDiscount;
            /**
             * 返利折扣率
             */
            public Integer FRPDiscountRate;
            /**
             * 促销政策ID
             */
            public String FSPMENTRYID;
            /**
             * 促销内容
             */
            public String FSPMANDRPMCONTENT;
            /**
             * 已计划运算
             */
            public boolean FISMRPCAL;
            /**
             * BOM分录内码
             */
            public Integer FBOMEntryId;
            /**
             * 价税合计（折前）
             */
            public Integer FAllAmountExceptDisCount;
            /**
             * 变更单主键
             */
            public Integer FXPKID;
            /**
             * 交货明细
             */
            public List<fOrderEntryPlan> FOrderEntryPlan;
            /**
             * 交货明细
             */
            @Data
            public static class fOrderEntryPlan{
                public Integer FDetailID;
                /**
                 * 交货地点
                 */
                public fDetailLocId FDetailLocId;
                /**
                 * 交货地点
                 */
                @Data
                public static class fDetailLocId{
                    public String FNumber;
                }
                /**
                 * 交货地址
                 */
                public String FDetailLocAddress;
                /**
                 * 要货日期
                 */
                public String FPlanDate;
                /**
                 * 运输提前期
                 */
                public Integer FTransportLeadTime;
                /**
                 * 数量
                 */
                public Integer FPlanQty;
                /**
                 * 变更单主键
                 */
                public Integer FXPKID_D;
            }
            /**
             * 税务明细
             */
            public List<fTaxDetailSubEntity> FTaxDetailSubEntity;
            /**
             * 税务明细
             */
            @Data
            public static class fTaxDetailSubEntity{
                public Integer FDetailID;
                /**
                 * 税率%
                 */
                public Integer FTaxRate;
                /**
                 * 卖方代扣代缴
                 */
                public boolean FSellerWithholding;
                /**
                 * 买方代扣代缴
                 */
                public boolean FBuyerWithholding;
            }
        }
        /**
         * 收款计划
         */
        public List<fSaleOrderPlan> FSaleOrderPlan;
        /**
         * 收款计划
         */
        @Data
        public static class fSaleOrderPlan{
            public Integer FEntryId;
            /**
             * 是否预收
             */
            public boolean FNeedRecAdvance;
            /**
             * 收款类型
             */
            public fReceiveType FReceiveType;
            /**
             * 收款类型
             */
            @Data
            public static class fReceiveType{
                public String FNumber;
            }
            /**
             * 应收比例(%)
             */
            public Integer FRecAdvanceRate;
            /**
             * 应收金额
             */
            public Integer FRecAdvanceAmount;
            /**
             * 到期日
             */
            public String FMustDate;
            /**
             * 关联单号
             */
            public String FRelBillNo;
            /**
             * 实收金额
             */
            public Integer FRecAmount;
            /**
             * 控制环节
             */
            public String FControlSend;
            /**
             * 按实际预收控制发货
             */
            public boolean FIsOutStockByRecamount;
            /**
             * 预收超收金额
             */
            public Integer FOverRecAmount;
            /**
             * 备注
             */
            public String FReMark;
            /**
             * 物料编码
             */
            public fPlanMaterialId FPlanMaterialId;
            /**
             * 物料编码
             */
            @Data
            public static class fPlanMaterialId{
                public String FNUMBER;
            }
            /**
             * 物料行号
             */
            public Integer FMaterialSeq;
            /**
             * 物料行标识
             */
            public String FMaterialRowID;
            /**
             * 订单明细行内码
             */
            public Integer FOrderEntryId;
            /**
             * 含税单价
             */
            public Integer FMaterialTaxPrice;
            /**
             * 计价数量
             */
            public Integer FMaterialPriceUnitQty;
            /**
             * 计价单位
             */
            public fMaterialPriceUnitID FMaterialPriceUnitID;
            /**
             * 计价单位
             */
            @Data
            public static class fMaterialPriceUnitID{
                public String FNumber;
            }
            /**
             * 变更单主键
             */
            public Integer FXPKID_R;
            /**
             * 收款计划子单据体
             */
            public fSaleOrderPlanEntry FSaleOrderPlanEntry;
            /**
             * 收款计划
             */
            public static class fSaleOrderPlanEntry{
                public Integer FDETAILID;
                /**
                 * 预收超收金额
                 */
                public Integer FOverRecAmount_D;
                /**
                 * 结算组织
                 */
                public fPESettleOrgId FPESettleOrgId;
                /**
                 * 结算组织
                 */
                public static class fPESettleOrgId{
                    public Integer FNumber;
                }
                /**
                 * 变更单主键
                 */
                public Integer FXPKID_RE;
            }
        }
        /**
         * 物流跟踪明细
         */
        public List<fSalOrderTrace> FSalOrderTrace;
        /**
         * 物流跟踪明细
         */
        @Data
        public static class fSalOrderTrace{
            public Integer FEntryID;
            /**
             * 物流公司
             */
            public fLogComId FLogComId;
            /**
             * 物流公司
             */
            @Data
            public static class fLogComId{
                public String FCODE;
            }
            /**
             * 物流单号
             */
            public String FCarryBillNo;
            /**
             * 寄件人手机号码
             */
            public String FPhoneNumber;
            /**
             * 起始地点
             */
            public String FFrom;
            /**
             * 终止地点
             */
            public String FTo;
            /**
             * 发货时间
             */
            public String FDelTime;
            /**
             * 物流状态
             */
            public String FTraceStatus;
            /**
             * 签收时间
             */
            public String FReceiptTime;
            /**
             * 类型
             */
            @NotNull(message = "类型是必录项")
            public String FCarryBillNoType;
            /**
             * 物流详细信息
             */
            public fSalOrderTraceDetail FSalOrderTraceDetail;
            /**
             * 物流详细信息
             */
            public static class fSalOrderTraceDetail{
                public Integer FDetailID;
                /**
                 * 时间
                 */
                public String FTraceTime;
                /**
                 * 物流详情
                 */
                public String FTraceDetail;
            }
        }
        /**
         * 收款计划
         */
        public List<fRecMentEntry> FRecMentEntry;
        /**
         * 收款计划
         */
        @Data
        public static class fRecMentEntry{
            public Integer FEntryID;
        }
    }
}
