anchor.diff:  	PT = price_type(Value),
   	patch_replace2(T, Price#price{type = PT});
   patch_replace2([{"recurringChargePeriod", Value} | T], Price) when is_record(Price, price), is_list(Value) ->
  -	RCP = rc_period(Value),
  +	RCP = price_period(Value),
   	patch_replace2(T, Price#price{period = RCP});
   patch_replace2([{"unitOfMeasure", Value} | T], Price) when is_record(Price, price), is_list(Value) ->
   	{U, S} = prod_price_ufm_et(Value),
  
positive.code: 		undefined ->
  			{"recurringChargePeriod", ""};
  		RCPeriod ->
  			{"recurringChargePeriod", rc_period(RCPeriod)}
  	end.
  
  -spec prod_price_alter_name(Alteration) -> Result
  
negative.code: patch_replace4(_, _) ->
  	{error, unprocessable}.
  
  -spec offer(Product) -> Product
  	when
  		Product :: #product{} | {struct, [tuple()]}.
  %% @doc CODEC for Product Offering.
  %% @private
  offer(#product{} = P) ->
  	offer(record_info(fields, product), P, []);
  offer({struct, ObjectMembers}) ->
  	offer(ObjectMembers, #product{}).
  %% @hidden
  offer([{"id", _ID} | T], Acc) ->
  	offer(T, Acc);
  offer([{"href", _URI} | T], Acc) ->
  	offer(T, Acc);
  offer([{"name", Name} | T], Acc) ->
  	offer(T, Acc#product{name = Name});
  offer([{"description", Description} | T], Acc) ->
  	offer(T, Acc#product{description = Description});
  offer([{"validFor", {struct, L}} | T], Acc) ->
  	Acc1 = case lists:keyfind("startDateTime", 1, L) of
  		{_, Start} ->
  			Acc#product{start_date = ocs_rest:iso8601(Start)};
  		undefined ->
  			Acc
  	end,
  	Acc2 = case lists:keyfind("endDateTime", 1, L) of
  		{_, End} ->
  			Acc1#product{end_date = ocs_rest:iso8601(End)};
  		undefined ->
  			Acc
  	end,
  	offer(T, Acc2);
  offer([{"is_bundle", Bundle} | T], Acc) ->
  	offer(T, Acc#product{is_bundle = Bundle});
  offer([{"lifecycleStatus", Status} | T], Acc) ->
  	offer(T, Acc#product{status = offer_status(Status)});
  offer([{"price", Price} | T], Acc) ->
  	offer(T, Acc#product{price = price(Price)});
  offer([{"characteristic", Chars} | T], Acc) ->
  	offer(T, Acc#product{characteristics = characterics(Chars)});
  offer([{"lastUpdate", Last} | T], Acc) ->
  	offer(T, Acc#product{last_modified = ocs_rest:iso8601(Last)}).
  %% @hidden
  offer([name | T], #product{name = Name} = P, Acc) ->
  	offer(T, P, [{"name", Name} | Acc]);
  offer([description | T], #product{description = Description} = P,
  		Acc) when is_list(Description) ->
  	offer(T, P, [{"description", Description} | Acc]);
  offer([start_date | T], #product{start_date = Start,
  		end_date = undefined} = P, Acc) when is_integer(Start) ->
  	ValidFor = {struct, [{"startDateTime", ocs_rest:iso8601(Start)}]},
  	offer(T, P, [{"validFor", ValidFor} | Acc]);
  offer([start_date | T], #product{start_date = undefined,
  		end_date = End} = P, Acc) when is_integer(End) ->
  	ValidFor = {struct, [{"endDateTime", ocs_rest:iso8601(End)}]},
  	offer(T, P, [{"validFor", ValidFor} | Acc]);
  offer([start_date | T], #product{start_date = Start,
  		end_date = End} = P, Acc) when is_integer(Start), is_integer(End) ->
  	ValidFor = {struct, [{"startDateTime", ocs_rest:iso8601(Start)},
  			{"endDateTime", ocs_rest:iso8601(End)}]},
  	offer(T, P, [{"validFor", ValidFor} | Acc]);
  offer([end_date | T], P, Acc) ->
  	offer(T, P, Acc);
  offer([is_bundle | T], #product{is_bundle = IsBundle} = P, Acc)
  		when is_boolean(IsBundle) ->
  	offer(T, P, [{"isBunde", IsBundle} | Acc]);
  offer([status | T], #product{status = Status} = P, Acc)
  		when Status /= undefined ->
  	StatusString = offer_status(Status),
  	offer(T, P, [{"lifecycleStatus", StatusString} | Acc]);
  offer([price | T], #product{price = Price} = P, Acc)
  		when is_integer(Price) ->
  	offer(T, P, [{"price", price(Price)} | Acc]);
  offer([characteristics | T],
  		#product{characteristics = Chars} = P, Acc) when is_list(Chars) ->
  	offer(T, P, [{"characteristic", characterics(Chars)} | Acc]);
  offer([last_modified | T], #product{last_modified = Last} = P, Acc)
  		when is_integer(Last) ->
  	offer(T, P, [{"lastUpdate", ocs_rest:iso8601(Last)} | Acc]);
  offer([], _P, Acc) ->
  	{struct, lists:reverse(Acc)}.
  
  -spec price(Price) -> Price
  	when
  		Price :: #product{} | {struct, ObjectMembers} | ObjectMembers,
  		ObjectMembers :: [tuple()].
  %% @doc CODEC for Product Offering Price.
  %% @private
  price(#price{} = P) ->
  	price(record_info(fields, price), P, []);
  price({struct, ObjectMembers}) ->
  	price(ObjectMembers, #price{}).
  %% @hidden
  price([name| T], #price{name = Name} = P, Acc) when Name /= undefined ->
  	price(T, P, [{"name", Name} | Acc]);
  price([description | T], #price{description = Description} = P, Acc)
  		when is_list(Description) ->
  	price(T, P, [{"description", Description} | Acc]);
  price([start_date | T], #price{start_date = Start,
  		end_date = undefined} = P, Acc) when is_integer(Start) ->
  	ValidFor = {struct, [{"startDateTime", ocs_rest:iso8601(Start)}]},
  	price(T, P, [{"validFor", ValidFor} | Acc]);
  price([start_date | T], #price{start_date = undefined,
  		end_date = End} = P, Acc) when is_integer(End) ->
  	ValidFor = {struct, [{"endDateTime", ocs_rest:iso8601(End)}]},
  	price(T, P, [{"validFor", ValidFor} | Acc]);
  price([start_date | T], #price{start_date = Start,
  		end_date = End} = P, Acc) when is_integer(Start), is_integer(End) ->
  	ValidFor = {struct, [{"startDateTime", ocs_rest:iso8601(Start)},
  			{"endDateTime", ocs_rest:iso8601(End)}]},
  	price(T, P, [{"validFor", ValidFor} | Acc]);
  price([end_date | T], P, Acc) ->
  	price(T, P, Acc);
  price([type | T], #price{type = one_time, units = cents} = P, Acc) ->
  	price(T, P, [{"priceType", price_type(one_time)} | Acc]);
  price([type | T], #price{type = recurring, period = Period,
  		units = cents} = P, Acc) when Period /= undefined ->
  	Recurring = [{"priceType", price_type(recurring)},
  			{"recurringChargePeriod", price_period(Period)}],
  	price(T, P, Recurring ++ Acc);
  price([type | T], #price{type = usage, units = octets,
  		size = Size} = P, Acc) when is_integer(Size) ->
  	UsageType = [{"priceType", price_type(usage)},
  			{"unitOfMeasure", integer_to_list(Size) ++ "b"}],
  	price(T, P, UsageType ++ Acc);
  price([type | T], #price{type = usage, units = seconds,
  		size = Size} = P, Acc) when is_integer(Size) ->
  	UsageType = [{"priceType", price_type(usage)},
  			{"unitOfMeasure", integer_to_list(Size) ++ "s"}],
  	price(T, P, UsageType ++ Acc);
  price([period | T], P, Acc) ->
  	price(T, P, Acc);
  price([units | T], P, Acc) ->
  	price(T, P, Acc);
  price([size | T], P, Acc) ->
  	price(T, P, Acc);
  price([amount | T], #price{amount = Amount, currency = Currency} = P, Acc)
  		when is_integer(Amount), is_list(Currency) ->
  	Price = {struct, [{"taxIncludedAmount", integer_to_list(Amount)},
  			{"currencyCode", Currency}]},
  	price(T, P, [{"price", Price} | Acc]);
  price([amount | T], #price{amount = Amount} = P, Acc)
  		when is_integer(Amount) ->
  	Price = {struct, [{"taxIncludedAmount", integer_to_list(Amount)}]},
  	price(T, P, [{"price", Price} | Acc]);
  price([currency | T], P, Acc) ->
  	price(T, P, Acc);
  price([alteration | T], #price{alteration = Alteration} = P, Acc)
  		when is_record(Alteration, alteration) ->
  	price(T, P, [{"alteration", alteration(Alteration)} | Acc]);
  price([], _P, Acc) ->
  	{struct, lists:reverse(Acc)}.
  
  %% @hidden
  query_start(Query, Filters, RangeStart, RangeEnd) ->
  