kvs_membership.erl 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. -module(kvs_membership).
  2. -author('Vladimir Baranov <baranoff.vladimir@gmail.com>').
  3. -include_lib("kvs/include/membership.hrl").
  4. -include_lib("kvs/include/payments.hrl").
  5. -include_lib("kvs/include/products.hrl").
  6. -include_lib("kvs/include/accounts.hrl").
  7. -include_lib("kvs/include/feed_state.hrl").
  8. -compile(export_all).
  9. add_package(#membership{}=Package)->
  10. Id = generate_id(),
  11. save_package(Package#membership{id = Id}).
  12. list_packages(Options) ->
  13. Predicate = fun(MP = #membership{}) -> check_conditions(Options, MP, true) end,
  14. select(membership, Predicate).
  15. list_packages()-> kvs:all(membership).
  16. available_for_sale(PackageId, State) ->
  17. case kvs:get(membership,PackageId) of
  18. {ok, Package} -> case save_package(Package#membership{available_for_sale = State}) of
  19. {ok, _} -> ok;
  20. Error -> Error end;
  21. {error, Reason}-> {error, Reason} end.
  22. generate_id()->
  23. Id = kvs:next_id("membership"),
  24. integer_to_list(Id).
  25. add_sample_data()->
  26. SamplePackages = [
  27. #membership{no = 1, amount = 7, currency = 0, quota = 7, fee = 7},
  28. #membership{no = 2, amount = 12, currency = 5, quota = 15, fee = 7},
  29. #membership{no = 3, amount = 12, currency = 0, quota = 15, fee = 12},
  30. #membership{no = 4, amount = 25, currency = 10, quota = 30, fee = 15},
  31. #membership{no = 5, amount = 30, currency = 0, quota = 60, fee = 30},
  32. #membership{no = 6, amount = 50, currency = 20, quota = 60, fee = 30},
  33. #membership{no = 7, amount = 50, currency = 0, quota = 90, fee = 50},
  34. #membership{no = 8, amount = 100, currency = 40, quota = 120, fee = 60}],
  35. WithPaymentTypes = [
  36. Package#membership{id = Package#membership.no} ||
  37. Payment <- [facebook, credit_card, wire_transfer, paypal, mobile],
  38. Package <- SamplePackages],
  39. Enabled = [P#membership{available_for_sale = true} || P <- WithPaymentTypes],
  40. kvs:put(Enabled).
  41. select(RecordType, Predicate) ->
  42. All = kvs:all(RecordType),
  43. lists:filter(Predicate, All).
  44. save_package(Package) ->
  45. case kvs:put([Package]) of
  46. ok -> {ok, Package#membership.id};
  47. {error, Reason}-> {error, Reason} end.
  48. timestamp()->
  49. {Y, Mn, D} = erlang:date(),
  50. {H, M, S} = erlang:time(),
  51. lists:flatten(io_lib:format("~b~2..0b~2..0b_~2..0b~2..0b~2..0b", [Y, Mn, D, H, M, S])).
  52. check_conditions(_, _, false) -> false;
  53. check_conditions([{available_for_sale, AS}|T], MP = #membership{available_for_sale = AS1}, _) -> check_conditions(T, MP, AS == AS1);
  54. check_conditions([{payment_type, PT}|T], MP = #membership{}, _) -> check_conditions(T, MP, true);
  55. check_conditions([], _, true) -> true.
  56. delete_package(PackageId) -> kvs:delete(membership, PackageId).
  57. %% MQ API
  58. handle_notice(["kvs_membership","system", "add_package"] = Route,
  59. Message, #state{owner = Owner, type =Type} = State) ->
  60. error_logger:info_msg("queue_action(~p): add_package: Owner=~p, Route=~p, Message=~p", [self(), {Type, Owner}, Route, Message]),
  61. {MP} = Message,
  62. case add_package(MP) of
  63. {ok, _} -> ok;
  64. {error, Reason} -> error_logger:info_msg("Unable to add membership package: ~p, Reason ~p", [MP, Reason])
  65. end,
  66. {noreply, State};
  67. handle_notice(Route, Message, State) -> error_logger:info_msg("Unknown MEMBERSHIP notice").
  68. coalesce(undefined, B) -> B;
  69. coalesce(A, _) -> A.