コード例 #1
0
        static string _outMoney(Pullenti.Ner.Money.MoneyReferent m)
        {
            string res = m.ToString();

            res = res.Replace('.', ' ').Replace("RUR", "руб.").Replace("RUB", "руб.");
            return(res);
        }
コード例 #2
0
 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);
 }
コード例 #3
0
        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);
        }
    }
}
コード例 #4
0
        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);
        }