# -*- coding: utf-8 -*- # !/usr/bin/env python import re from library.validator import Validator, FieldValidationError, UnicodeValidationError from library.validator.fields import StringField, DictField from apps.web.merchant.constant import WechatSubjectType, ContactType class CodeNameValidator(Validator): name = StringField(required=True, unicodeName=u"地址名称", requiredError=UnicodeValidationError(detail=u"缺少地址名称")) code = StringField(required=True, unicodeName=u"地址编号", requiredError=UnicodeValidationError(detail=u"缺少地址编号")) @staticmethod def validate_name(value): if not value: raise UnicodeValidationError(detail=u"无效的地址名称") return value @staticmethod def validate(value): if not value: raise UnicodeValidationError(detail=u"无效的地址编号") return value class LegalValidator(Validator): # 身份图片信息 urlA = StringField(required=True, unicodeName=u"法人身份证照片【人像面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片")) urlB = StringField(required=True, unicodeName=u"法人身份证照片【国徽面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片")) # 证件信息内容 name = StringField(required=True, unicodeName=u"姓名", requiredError=UnicodeValidationError(detail=u"缺少法人姓名")) cardNo = StringField(required=True, unicodeName=u"证件号码", requiredError=UnicodeValidationError(detail=u"缺少法人证件号码")) startTime = StringField(required=True, unicodeName=u"签发日期", requiredError=UnicodeValidationError(detail=u"缺少法人证件签发日期")) endTime = StringField(required=True, unicodeName=u"失效日期", requiredError=UnicodeValidationError(detail=u"缺少法人证件失效日期")) # 省市区的地址回调 province = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【省】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【省】")) city = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【市】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【市】")) area = DictField(validator=CodeNameValidator, required=True, unicodeName="法人身份证地区【区】", requiredError=UnicodeValidationError(detail=u"请选择法人身份证地区【区】")) # 详细地址的输入 街道等等 addr = StringField(required=True, unicodeName="法人身份证【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写法人身份证【详细地址】")) @staticmethod def validate(data): if not data: raise FieldValidationError(u"法人信息为空,请重新填写") return data class ContactValidator(Validator): # 身份图片信息 urlA = StringField(required=True, unicodeName=u"联系人身份证照片【人像面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片")) urlB = StringField(required=True, unicodeName=u"联系人身份证照片【国徽面】", requiredError=UnicodeValidationError(detail=u"缺少身份证照片")) # 证件信息内容 name = StringField(required=True, unicodeName=u"联系人姓名", requiredError=UnicodeValidationError(detail=u"缺少联系人姓名")) cardNo = StringField(required=True, unicodeName=u"联系人证件号码", requiredError=UnicodeValidationError(detail=u"缺少联系人证件号码")) startTime = StringField(required=True, unicodeName=u"联系人签发日期", requiredError=UnicodeValidationError(detail=u"缺少联系人证件签发日期")) endTime = StringField(required=True, unicodeName=u"联系人失效日期", requiredError=UnicodeValidationError(detail=u"缺少联系人证件失效日期")) province = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【省】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【省】")) city = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【市】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【市】")) area = DictField(validator=CodeNameValidator, required=True, unicodeName="联系人身份证地区【区】", requiredError=UnicodeValidationError(detail=u"请选择联系人身份证地区【区】")) # 详细地址的输入 街道等等 addr = StringField(required=True, unicodeName="联系人身份证【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写联系人身份证【详细地址】")) class BusinessLicenceValidator(Validator): busLicenseUrl = StringField(required=True, unicodeName=u"营业执照照片", requiredError=UnicodeValidationError(detail=u"缺少营业执照照片")) busName = StringField(required=True, unicodeName=u"公司名称", requiredError=UnicodeValidationError(detail=u"缺少公司名称")) busCode = StringField(required=True, unicodeName=u"统一社会信用码", requiredError=UnicodeValidationError(detail=u"缺少统一社会信用码")) startTime = StringField(required=True, unicodeName=u"营业执照起始时间", requiredError=UnicodeValidationError(detail=u"缺少营业执照起始时间")) endTime = StringField(required=True, unicodeName=u"营业执照结束事件", requiredError=UnicodeValidationError(detail=u"缺少营业执照结束事件")) province = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【省】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【省】")) city = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【市】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【市】")) area = DictField(validator=CodeNameValidator, required=True, unicodeName="营业执照地区【区】", requiredError=UnicodeValidationError(detail=u"请选择营业执照地区【区】")) addr = StringField(required=True, unicodeName=u"公司地址详细地址", requiredError=UnicodeValidationError(detail=u"缺少公司详细地址")) class SubjectValidator(Validator): businessLicenceInfo = DictField(validator=BusinessLicenceValidator, unicodeName=u"营业执照信息", requiredError=UnicodeValidationError(detail=u"缺少营业执照信息")) def validate(self, data): return data class CertificateValidator(Validator): merchantType = StringField(required=True, unicodeName=u"商户类型", requiredError=UnicodeValidationError(detail=u"缺少商户类型")) contactType = StringField(required=True, unicodeName="联系人类型", requiredError=UnicodeValidationError(detail=u"缺少联系人类型")) businessAuthorizationLetter = StringField(unicodeName="业务办理授权函") legalInfo = DictField(required=True, unicodeName=u"负责人/法人信息", requiredError=UnicodeValidationError(detail=u"缺少法人信息"), validator=LegalValidator) contactInfo = DictField(required=False, unicodeName=u"联系人信息", requiredError=UnicodeValidationError(detail=u"缺少联系人信息"), validator=ContactValidator) subjectInfo = DictField(required=False, unicodeName=u"主体信息【营业执照】", requiredError=UnicodeValidationError(detail=u"缺少营业执照信息"), Validator=SubjectValidator) @staticmethod def validate_merchantType(value): """ 验证商户类型 """ if value not in WechatSubjectType.choices(): raise FieldValidationError(u"错误的商户类型,请重新选择") return value def validate(self, data): if not data.get("contactInfo") and data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO: raise UnicodeValidationError(detail=u"缺少联系人信息") if not data.get("subjectInfo") and data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO: raise UnicodeValidationError(detail=u"缺少营业执照信息") # 处理联系人类型 contactType = data.pop("contactType", str(ContactType.LEGAL.code)) if data["merchantType"] != WechatSubjectType.SUBJECT_TYPE_MICRO: # 商户类型为企业且联系人类型为 经办人的情况下 需要检查授权书 if contactType == ContactType.SUPER: businessAuthorizationLetter = data.pop("businessAuthorizationLetter", None) if not businessAuthorizationLetter: raise UnicodeValidationError(detail=u"缺少业务办理授权函") else: businessAuthorizationLetter = "" else: contactType = str(ContactType.LEGAL.code) businessAuthorizationLetter = "" # 小微商户的情况下 ,联系人即为自身 if data["merchantType"] == WechatSubjectType.SUBJECT_TYPE_MICRO: data["contactInfo"] = data["legalInfo"].copy() data["contactInfo"]["contactType"] = contactType data["contactInfo"]["businessAuthorizationLetter"] = businessAuthorizationLetter return data class SettleValidator(Validator): """ 结算信息的校验 结算信息无论是企业商户还是个人商户都 需要的信息 并且字段一致 """ bankCardImg = StringField(required=True, unicodeName="银行卡照片", requiredError=UnicodeValidationError(detail=u"银行照片缺失,请确认照片信息上传")) bankName = StringField(required=True, unicodeName="银行名称", requiredError=UnicodeValidationError(detail=u"银行名称缺失,请确认银行名称选择正确")) bankCardCode = StringField(required=True, unicodeName="银行卡号", requiredError=UnicodeValidationError(detail=u"银行卡号缺失,请确认卡号填写无误")) bankCardSubCode = StringField(required=True, unicodeName="支行联行号", requiredError=UnicodeValidationError(detail=u"支行联行号缺失,请确认支行选择无误")) bankCardSubName = StringField(required=True, unicodeName="支行名称", requiredError=UnicodeValidationError(detail=u"支行联行号缺失,请确认支行选择无误")) @staticmethod def validate_backCardImg(value): if not value: raise UnicodeValidationError(detail=u"无效的银行卡照片,请重新上传") return value @staticmethod def validate_bankName(value): if not value: raise UnicodeValidationError(detail=u"无效的银行名称,请重新上传") return value @staticmethod def validate_bankCardCode(value): if not value: raise UnicodeValidationError(detail=u"无效的银行卡号,请重新上传") return value @staticmethod def validate_bankCardSubCode(value): if not value: raise UnicodeValidationError(detail=u"无效的开户行支行(10001),请重新上传") return value @staticmethod def validate_bankCardSubName(value): if not value: raise UnicodeValidationError(detail=u"无效的开户行支行(10002),请重新上传") return value class BusinessValidator(Validator): storeAUrl = StringField(required=True, unicodeName=u"门头照片", requiredError=UnicodeValidationError(detail=u"门头照片缺失,请确认照片上传信息")) storeBUrl = StringField(required=True, unicodeName=u"门店照片", requiredError=UnicodeValidationError(detail=u"门店照片缺失,请确认照片上传信息")) storeCUrl = StringField(required=True, unicodeName=u"店内照片", requiredError=UnicodeValidationError(detail=u"店内照片缺失,请确认照片上传信息")) storeShotName = StringField(required=True, unicodeName=u"商户简称", requiredError=UnicodeValidationError(detail=u"商户简称缺失,请填写商户简称")) province = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【省】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【省】")) city = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【市】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【市】")) area = DictField(validator=CodeNameValidator, required=True, unicodeName="营业地区【区】", requiredError=UnicodeValidationError(detail=u"请选择营业地区【区】")) addr = StringField(required=True, unicodeName="营业地区【详细地址】", requiredError=UnicodeValidationError(detail=u"请填写营业地区【详细地址】")) @staticmethod def validate_storeAUrl(value): if not value: raise UnicodeValidationError(detail=u"无效的门头照,请重新上传") return value @staticmethod def validate_storeBUrl(value): if not value: raise UnicodeValidationError(detail=u"无效的门店照,请重新上传") return value @staticmethod def validate_storeCUrl(value): if not value: raise UnicodeValidationError(detail=u"无效的店内照,请重新上传") return value @staticmethod def validate_addr(value): if not value: raise UnicodeValidationError(u"无效的营业地区【详细地址】,请重新填写") return value