/// <summary> /// 区域校验时是否忽略34两位行政区划编码 /// </summary> /// <param name="kind"></param> /// <returns></returns> protected override bool AreaValidSkip34(VATKind kind) { if (kind == VATKind.Electronic) {//电子发票行政区划可能会具体到市级,吉林、安徽、山东、湖北 都发现具体到市级行政编号的情况,所以电子发票支持只查前2位行政区划 return(true); } return(base.AreaValidSkip34(kind)); }
/// <summary> /// 生成增值税发票代码 /// </summary> /// <param name="areaNumber"></param> /// <param name="year"></param> /// <param name="batch"></param> /// <param name="kind"></param> /// <returns></returns> protected override string GenerateVATCode(string areaNumber, string year, ushort batch, VATKind kind) { var query = _kindDic.Where(kv => kv.Value == kind); if (!query.Any()) { throw new NotSupportedException(ErrorMessage.GenerateWrongKind); } var rdKind = query.OrderBy(g => Guid.NewGuid()).First().Key; return(string.Format("0{0}{1}{2}{3}", areaNumber, year, (batch % 1000).ToString().PadLeft(3, '0'), rdKind)); }
/// <summary> /// 按输入生成发票代码 /// </summary> /// <param name="areaNumber"></param> /// <param name="year"></param> /// <param name="batch"></param> /// <param name="kind"></param> /// <returns></returns> protected abstract string GenerateVATCode(string areaNumber, string year, ushort batch, VATKind kind);
/// <summary> /// 按输入生成发票代码 /// </summary> /// <param name="areaNumber">行政区划代码</param> /// <param name="year">发票年份</param> /// <param name="batch">批次</param> /// <param name="kind">发票类型</param> /// <returns></returns> public virtual string GenerateVATCode(int areaNumber, ushort year, ushort batch, VATKind kind) { if (areaNumber < 10 || areaNumber > 9999) { throw new ArgumentException("argument error"); } return(this.GenerateVATCode(areaNumber.ToString().PadRight(4, '0'), (year % 100).ToString().PadLeft(2, '0'), batch, kind)); }
/// <summary> /// 生成增值税发票代码 /// </summary> /// <param name="areaNumber"></param> /// <param name="year"></param> /// <param name="batch"></param> /// <param name="kind"></param> /// <returns></returns> protected override string GenerateVATCode(string areaNumber, string year, ushort batch, VATKind kind) { var query = _kindDic.Where(kv => kv.Value == kind); if (!query.Any()) { throw new NotSupportedException(ErrorMessage.GenerateWrongKind); } var rdKind = query.First().Key; return(string.Format("{0}{1}{2}{3}{4}0", areaNumber, year, (batch % 10).ToString(), rdKind, _duplicateDic[kind])); }
/// <summary> /// 区域校验时是否忽略34两位行政区划编码 /// </summary> protected virtual bool AreaValidSkip34(VATKind kind) { return(false); }
/// <summary> /// 生成增值税发票代码(注意不支持生成区块链发票) /// </summary> /// <param name="areaNumber"></param> /// <param name="year"></param> /// <param name="batch"></param> /// <param name="kind"></param> /// <param name="electKind">如果发票种类为电子发票时,要生成的电子发票细分类型</param> /// <returns></returns> protected override string GenerateVATCode(string areaNumber, string year, ushort batch, VATKind kind, ElectronicVATKind?electKind) { if (electKind.HasValue && kind != VATKind.Electronic) { throw new ArgumentException($"{nameof(kind)} must be 'Electronic' while {nameof(electKind)} exist"); } var query = _kindDic.Where(kv => kv.Value == kind); if (!query.Any()) { throw new NotSupportedException(ErrorMessage.GenerateWrongKind); } var rdKind = query.OrderBy(g => Guid.NewGuid()).First().Key; if (electKind.HasValue) { rdKind = Convert.ToInt32(electKind).ToString(); } return(string.Format("0{0}{1}{2}{3}", areaNumber, year, (batch % 1000).ToString().PadLeft(3, '0'), rdKind)); }