anchor.diff:  add_product(Offer, ServiceRefs, Characteristics) ->
   	add_product(Offer, ServiceRefs, undefined, undefined, Characteristics).
   
  --spec add_product(Offer, ServiceRefs, StartDate, EndDate, Characteristics) -> Result
  -	when
  -		Offer :: string(),
  +-spec add_product(OfferId, ServiceRefs, StartDate, EndDate, Characteristics) -> Result
  +	when
  +		OfferId :: string(),
   		ServiceRefs :: [ServiceRef],
   		StartDate :: undefined | pos_integer(),
   		EndDate :: undefined | pos_integer(),
  
positive.code: 					end,
  					ok = lists:foreach(F2, ServiceRefs),
  					NewChars = default_chars(CharValueUse, Characteristics),
  					Product = #product{id = Id, product = Offer, start_date = StartDate,
  							termination_date = EndDate, characteristics = NewChars,
  							service = ServiceRefs, last_modified = LM},
  					ok = mnesia:write(Product),
  					Product;
  				[] ->
  					throw(offer_not_found)
  			end
  
negative.code: 		Result :: {ok, #product{}} | {error, Reason},
  		Reason :: term().
  %% @doc Add a product invenotry subscription instance.
  add_product(OfferId, ServiceRefs, StartDate, EndDate, Characteristics)
  		when (is_integer(StartDate) orelse (StartDate == undefined)),
  		(is_integer(EndDate) orelse (EndDate == undefined)),
  		is_list(Characteristics), is_list(OfferId), is_list(ServiceRefs) ->
  	F = fun() ->
  			case mnesia:read(offer, OfferId, read) of
  				[#offer{char_value_use = CharValueUse} = Offer] ->
  					TS = erlang:system_time(?MILLISECOND),
  					N = erlang:unique_integer([positive]),
  					LM = {TS, N},
  