internal static FiscalArticle Substract(FiscalReceipt FR, FiscalArticle A, FiscalArticle B) { var Result = A.Clone(FR); Result.Quantity.Value = A.Quantity.Value - B.Quantity.Value; Result.PriceWithoutDiscount.Value = A.Price; Result.DiscountForPriceCurrent.Value = 0; Result.AmountWithoutDiscount.Value = A.Amount - B.Amount; Result.DiscountForAmount.Value = 0; Result.Bonuses.Value = A.Bonuses.Value - B.Bonuses.Value; return Result; }
public FiscalArticle Clone(FiscalReceipt fiscal) { BinaryFormatter BF = new BinaryFormatter(); MemoryStream MS = new MemoryStream(); BF.Serialize(MS, this); MS.Seek(0, SeekOrigin.Begin); FiscalArticle Result = (FiscalArticle)BF.Deserialize(MS); MS.Close(); //Result.Limits = this.Limits; Result.Fiscal = fiscal; return Result; }
/// <summary>Заменяет параметры чека this, использующиеся для вычислений, на параметры чека FiscalForCombine</summary> internal bool Combine(FiscalReceipt FiscalForCombine) { try { if (FiscalForCombine != null) { FiscalReceipt Fiscal = FiscalForCombine.Clone(FiscalForCombine.RSPackage); // клонируем фискальный чек, т.к. мы будем менять в нём платежи if (Fiscal.Flags.Received) Flags = new DVFiscalReceiptFlags(Fiscal.Flags.Value); if (Fiscal.AmountWithoutDiscount.Received) AmountWithoutDiscount = new DVInt64(Fiscal.AmountWithoutDiscount.Value); if (Fiscal.DiscountForAmount.Received) DiscountForAmount = new DVInt64(Fiscal.DiscountForAmount.Value); Payments.Combine(Fiscal.Payments); Fiscal.Payments = Payments.Clone(Fiscal); // записываем новые платежи (это нужно для поиска позиций в чеке) // теперь объединяем артикулы: пробегаем по всем артикулам переданного чека int index = 0; foreach (FiscalArticle fa in Fiscal.Articles) { FiscalArticle Analog = null; try { if (fa.GoodsCode.Length != 0 && fa.PaymentType.Value != PaymentTypes.Unknown) // если переданы код и тип оплаты - ищем товар Analog = FindArticle(fa); // ищем позицию-аналог } catch (ArticlePaymentTypeException) { // игнорируем ошибку, которая может возникнуть при определении PaymentType }; if (Analog == null && index < Articles.Count) // если код или тип оплаты не переданы - получаем аналог по индексу Analog = Articles[index]; if (Analog != null) Analog.Combine(fa); // если что-то нашли, то объединяем позиции index++; } } } catch (Exception e) // может произойти при получении типа оплаты позиции фискального чека { ErrorMessage.Add("Ошибка совмещения фискальных чеков: " + e.Message); } return ErrorMessage.IsEmpty; }
public FiscalArticle(FiscalReceipt Fiscal) { this.Fiscal = Fiscal; }
/// <summary>Result = A-B</summary> public static FiscalReceipt Substract(RSPackageInfo RSP, FiscalReceipt A, FiscalReceipt B) { var Result = A.Clone(RSP); Result.AmountWithoutDiscount.Value = A.Amount - B.Amount; Result.DiscountForAmount.Value = 0; Result.Payments = FiscalPayments.Substract(Result, A.Payments, B.Payments); for (int i = 0; i < A.Articles.Count; i++) for (int j = 0; j < B.Articles.Count; j++) if (A.Articles[i].IsAnalog(B.Articles[j])) Result.Articles[i] = FiscalArticle.Substract(Result, A.Articles[i], B.Articles[j]); // это пройдёт, т.к. Result - клон A return Result; //throw new Exception("FiscalReceipt Substract is not implemented now"); /* FiscalReceipt Result = Param2.Clone(), Param = Param1.Clone(); /*Result.Amount = Result.AmountDiscount; Result.Discount = 0; Param.Amount = Param.AmountDiscount; Param.Discount = 0;*/ /*Result.AmountWithoutDiscount -= Param.AmountWithoutDiscount; //Result.Discount = Param1.Discount; Result.Payments.ChangeAmount(Result.Payments.Amount - Param.Payments.Amount); foreach (FiscalArticle Article1 in Param.Articles) foreach (FiscalArticle Article2 in Result.Articles) if (Article1.GoodsCode == Article2.GoodsCode) { Article2.Quantity -= Article1.Quantity; Article2.AmountWithoutDiscount -= Article1.AmountWithoutDiscount; Article2.DiscountForAmount = Article1.DiscountForAmount; //Article2.Bonuses -= Article1.Bonuses; // Rounded потому что из-за Казахстана Article2.Bonuses = Article2.BonusesRounded - Article1.BonusesRounded; } return Result;*/ }