private static void BiddingToCsv(BulkAdGroupProductPartition entity, RowValues values)
        {
            var criterion = entity.AdGroupCriterion as BiddableAdGroupCriterion;

            values[StringTable.IsExcluded] = criterion == null ? "True" : "False";

            if (criterion == null)
            {
                return;
            }

            var fixedBid = criterion.CriterionBid as FixedBid;

            if (fixedBid != null)
            {
                values[StringTable.Bid] = fixedBid.ToAdGroupCriterionFixedBidBulkString();
                return;
            }

            var multiplicativeBid = criterion.CriterionBid as BidMultiplier;

            if (multiplicativeBid != null)
            {
                values[StringTable.BidAdjustment] = multiplicativeBid.Multiplier.ToBulkString();
            }
        }
        private static void CsvToBidding(RowValues values, BulkAdGroupProductPartition entity)
        {
            //string exclude;
            values.TryGetValue(StringTable.IsExcluded, out string exclude);

            exclude = exclude.GetValueOrEmptyString().ToLower();
            bool isExcluded;

            switch (exclude)
            {
            case "yes":
                isExcluded = true;
                break;

            case "true":
                isExcluded = true;
                break;

            case "no":
                isExcluded = false;
                break;

            case "false":
                isExcluded = false;
                break;

            default:
                throw new InvalidOperationException(
                          string.Format("\"{0}\" can only be set to TRUE|FALSE in {1}",
                                        StringTable.IsExcluded, typeof(BulkAdGroupProductPartition).Name));
            }

            if (isExcluded)
            {
                entity.AdGroupCriterion = new NegativeAdGroupCriterion
                {
                    Criterion = new ProductPartition
                    {
                        Condition = new ProductCondition(),
                        Type      = typeof(ProductPartition).Name,
                    },
                    Type = typeof(NegativeAdGroupCriterion).Name,
                };
            }
            else
            {
                var biddableAdGroupCriterion = new BiddableAdGroupCriterion
                {
                    Criterion = new ProductPartition
                    {
                        Condition = new ProductCondition(),
                        Type      = typeof(ProductPartition).Name,
                    },
                    Type = typeof(BiddableAdGroupCriterion).Name,
                };

                values.TryGetValue(StringTable.Bid, out string bidStr);
                values.TryGetValue(StringTable.BidAdjustment, out string bidAdjustmentStr);
                double?bid           = bidStr.ParseOptional <double>();
                double?bidAdjustment = bidAdjustmentStr.ParseOptional <double>();

                if (bid != null)
                {
                    biddableAdGroupCriterion.CriterionBid = new FixedBid
                    {
                        Amount = bid.Value,
                        Type   = typeof(FixedBid).Name,
                    };
                }
                else if (bidAdjustment != null)
                {
                    biddableAdGroupCriterion.CriterionBid = new BidMultiplier
                    {
                        Multiplier = bidAdjustment.Value,
                        Type       = typeof(FixedBid).Name,
                    };
                }
                else
                {
                    biddableAdGroupCriterion.CriterionBid = new FixedBid
                    {
                        Type = typeof(FixedBid).Name,
                    };
                }
                entity.AdGroupCriterion = biddableAdGroupCriterion;
            }
        }