static string _outMoney(Pullenti.Ner.Money.MoneyReferent m) { string res = m.ToString(); res = res.Replace('.', ' ').Replace("RUR", "руб.").Replace("RUB", "руб."); return(res); }
public override string GetImageId(Pullenti.Ner.Referent obj = null) { Pullenti.Ner.Money.MoneyReferent m = obj as Pullenti.Ner.Money.MoneyReferent; if (m != null) { if (m.AltValue != null || m.AltRest != null) { return(Image2Id); } } return(ImageId); }
public static Pullenti.Ner.MetaToken CheckNds(Pullenti.Ner.Token t, double nds = (double)18F, bool ndsMustbeMoney = false) { if (t == null || nds <= 0) { return(null); } Pullenti.Ner.Money.MoneyReferent m = t.GetReferent() as Pullenti.Ner.Money.MoneyReferent; if (m == null) { return(null); } bool hasNds = false; bool hasNdsPerc = false; bool hasAll = false; bool incl = false; Pullenti.Ner.Token tt; Pullenti.Ner.Money.MoneyReferent m1 = null; Pullenti.Ner.Token ndsT0 = null; Pullenti.Ner.Token ndsT1 = null; for (tt = t.Next; tt != null; tt = tt.Next) { if (tt.IsValue("НДС", null)) { hasNds = true; ndsT0 = (ndsT1 = tt); continue; } if (tt is Pullenti.Ner.ReferentToken) { m1 = tt.GetReferent() as Pullenti.Ner.Money.MoneyReferent; break; } if (tt is Pullenti.Ner.NumberToken) { Pullenti.Ner.Core.NumberExToken ne = Pullenti.Ner.Core.NumberHelper.TryParseNumberWithPostfix(tt); if (ne != null && ne.ExTyp == Pullenti.Ner.Core.NumberExType.Percent) { if (Math.Abs(ne.RealValue - nds) > 0.0001) { bool ok = false; if (hasNds) { ok = true; } if (ok) { return new Pullenti.Ner.MetaToken(tt, ne.EndToken) { Tag = string.Format("Размер НДС должен быть {0}%, а не {1}%", nds, ne.RealValue) } } ; } tt = (ndsT1 = ne.EndToken); hasNdsPerc = true; continue; } } if (tt.IsValue("ВСЕГО", null)) { hasAll = true; continue; } if (tt.IsValue("ТОМ", null) || tt.IsValue("ЧИСЛО", null) || tt.IsValue("ВКЛЮЧАЯ", null)) { incl = true; continue; } if ((tt.IsValue("КРОМЕ", null) || tt.IsValue("ТОГО", null) || tt.IsValue("РАЗМЕР", null)) || tt.IsValue("СУММА", null) || tt.IsValue("СТАВКА", null)) { continue; } if (((tt.IsValue("Т", null) && tt.Next != null && tt.Next.IsChar('.')) && tt.Next.Next != null && tt.Next.Next.IsValue("Ч", null)) && tt.Next.Next.Next != null && tt.Next.Next.Next.IsChar('.')) { incl = true; tt = tt.Next.Next.Next; continue; } if (!tt.Chars.IsLetter || tt.Morph.Class.IsPreposition) { continue; } break; } if (!hasNds) { return(null); } if (m1 == null) { if (ndsMustbeMoney) { return new Pullenti.Ner.MetaToken(ndsT0, ndsT1) { Tag = "Размер НДС должен быть в денежном выражении" } } ; return(null); } if (hasAll) { return(null); } double mustBe = m.RealValue; mustBe = mustBe * ((nds / 100)); if (incl) { mustBe /= ((1 + ((nds / 100)))); } double dd = mustBe * 100; dd -= ((long)dd); dd /= 100; mustBe -= dd; if (dd >= 0.005) { mustBe += 0.01; } double real = m1.RealValue; double delta = mustBe - real; if (delta < 0) { delta = -delta; } if (delta > 0.011) { if ((delta < 1) && m1.Rest == 0 && m.Rest == 0) { } else { Pullenti.Ner.Money.MoneyReferent mr = new Pullenti.Ner.Money.MoneyReferent() { Currency = m1.Currency, RealValue = mustBe }; return(new Pullenti.Ner.MetaToken(t, tt) { Tag = string.Format("Размер НДС должен быть {0}, а не {1}", _outMoney(mr), _outMoney(m1)) }); } } if (incl) { return(null); } Pullenti.Ner.Money.MoneyReferent m2 = null; hasAll = false; for (tt = tt.Next; tt != null; tt = tt.Next) { if (tt is Pullenti.Ner.ReferentToken) { m2 = tt.GetReferent() as Pullenti.Ner.Money.MoneyReferent; break; } if (!tt.Chars.IsLetter || tt.Morph.Class.IsPreposition) { continue; } if (tt.IsValue("ВСЕГО", null)) { hasAll = true; continue; } if (tt.IsValue("НДС", null) || tt.IsValue("ВМЕСТЕ", null)) { continue; } break; } if (m2 != null && hasAll) { mustBe = m.RealValue + m1.RealValue; delta = mustBe - m2.RealValue; if (delta < 0) { delta = -delta; } if (delta > 0.01) { Pullenti.Ner.Money.MoneyReferent mr = new Pullenti.Ner.Money.MoneyReferent() { Currency = m1.Currency, RealValue = mustBe }; string err = string.Format("Всего с НДС должно быть {0}, а не {1}", _outMoney(mr), _outMoney(m2)); return(new Pullenti.Ner.MetaToken(t, tt) { Tag = err }); } } return(null); } } }
Pullenti.Ner.Token _addReferents(Pullenti.Ner.Core.AnalyzerData ad, Pullenti.Ner.Token t, int cur, int max) { if (!(t is Pullenti.Ner.ReferentToken)) { return(t); } Pullenti.Ner.Referent r = t.GetReferent(); if (r == null) { return(t); } if (r is Pullenti.Ner.Denomination.DenominationReferent) { Pullenti.Ner.Denomination.DenominationReferent dr = r as Pullenti.Ner.Denomination.DenominationReferent; KeywordReferent kref0 = new KeywordReferent() { Typ = KeywordType.Referent }; foreach (Pullenti.Ner.Slot s in dr.Slots) { if (s.TypeName == Pullenti.Ner.Denomination.DenominationReferent.ATTR_VALUE) { kref0.AddSlot(KeywordReferent.ATTR_NORMAL, s.Value, false, 0); } } kref0.AddSlot(KeywordReferent.ATTR_REF, dr, false, 0); Pullenti.Ner.ReferentToken rt0 = new Pullenti.Ner.ReferentToken(ad.RegisterReferent(kref0), t, t); t.Kit.EmbedToken(rt0); return(rt0); } if ((r is Pullenti.Ner.Phone.PhoneReferent) || (r is Pullenti.Ner.Uri.UriReferent) || (r is Pullenti.Ner.Bank.BankDataReferent)) { return(t); } if (r is Pullenti.Ner.Money.MoneyReferent) { Pullenti.Ner.Money.MoneyReferent mr = r as Pullenti.Ner.Money.MoneyReferent; KeywordReferent kref0 = new KeywordReferent() { Typ = KeywordType.Object }; kref0.AddSlot(KeywordReferent.ATTR_NORMAL, mr.Currency, false, 0); Pullenti.Ner.ReferentToken rt0 = new Pullenti.Ner.ReferentToken(ad.RegisterReferent(kref0), t, t); t.Kit.EmbedToken(rt0); return(rt0); } if (r.TypeName == "DATE" || r.TypeName == "DATERANGE" || r.TypeName == "BOOKLINKREF") { return(t); } for (Pullenti.Ner.Token tt = (t as Pullenti.Ner.MetaToken).BeginToken; tt != null && tt.EndChar <= t.EndChar; tt = tt.Next) { if (tt is Pullenti.Ner.ReferentToken) { this._addReferents(ad, tt, cur, max); } } KeywordReferent kref = new KeywordReferent() { Typ = KeywordType.Referent }; string norm = null; if (r.TypeName == "GEO") { norm = r.GetStringValue("ALPHA2"); } if (norm == null) { norm = r.ToString(true, null, 0); } if (norm != null) { kref.AddSlot(KeywordReferent.ATTR_NORMAL, norm.ToUpper(), false, 0); } kref.AddSlot(KeywordReferent.ATTR_REF, t.GetReferent(), false, 0); _setRank(kref, cur, max); Pullenti.Ner.ReferentToken rt1 = new Pullenti.Ner.ReferentToken(ad.RegisterReferent(kref), t, t); t.Kit.EmbedToken(rt1); return(rt1); }