@@ -4,12 +4,15 @@ defmodule Store.Inventory do
44 """
55 use Store.Context
66
7- alias StoreWeb .Accounts.User
8- alias StoreWeb .Inventory.Product
7+ alias Store .Accounts.User
8+ alias Store .Inventory.Product
99 alias Store.Inventory.Order
10+ alias Store.Inventory.OrderHistory
1011 alias Store.Inventory.OrdersProducts
1112 alias Store.Inventory
1213
14+ # PRODUCTS
15+
1316 @ doc """
1417 Returns the list of products.
1518
@@ -74,7 +77,7 @@ defmodule Store.Inventory do
7477 {:error, %Ecto.Changeset{}}
7578
7679 """
77- def update_product ( % Product { } = product , attrs , after_save \\ & { :ok , & 1 } ) do
80+ def update_product ( % Product { } = product , attrs \\ % { } , after_save \\ & { :ok , & 1 } ) do
7881 product
7982 |> Product . changeset ( attrs )
8083 |> Repo . update ( )
@@ -98,6 +101,10 @@ defmodule Store.Inventory do
98101 |> Repo . update ( )
99102 end
100103
104+ def change_product ( % Product { } = product , attrs \\ % { } ) do
105+ Product . changeset ( product , attrs )
106+ end
107+
101108 @ doc """
102109 Deletes a product.
103110
@@ -121,21 +128,6 @@ defmodule Store.Inventory do
121128 |> broadcast ( :deleted )
122129 end
123130
124- @ doc """
125- Returns an `%Ecto.Changeset{}` for tracking product changes.
126-
127- ## Examples
128-
129- iex> change_product(product)
130- %Ecto.Changeset{data: %Product{}}
131-
132- """
133- def change_product ( % Product { } = product , attrs \\ % { } ) do
134- Product . changeset ( product , attrs )
135- end
136-
137- alias Store.Inventory.Order
138-
139131 def list_orders ( params \\ % { } )
140132
141133 @ doc """
@@ -180,12 +172,6 @@ defmodule Store.Inventory do
180172
181173 defp status_filter ( q , status ) , do: where ( q , [ o ] , o . status in ^ status )
182174
183- def update_status ( order , attrs ) do
184- order
185- |> Order . changeset ( attrs )
186- |> Repo . update ( )
187- end
188-
189175 @ doc """
190176 Returns the list of orders_products.
191177 iex> list_orders_products()
@@ -217,7 +203,11 @@ defmodule Store.Inventory do
217203 ** (Ecto.NoResultsError)
218204
219205 """
220- def get_order! ( id ) , do: Repo . get! ( Order , id )
206+ def get_order! ( id , opts ) when is_list ( opts ) do
207+ Order
208+ |> apply_filters ( opts )
209+ |> Repo . get! ( id )
210+ end
221211
222212 @ doc """
223213 Creates a order.
@@ -291,6 +281,10 @@ defmodule Store.Inventory do
291281 |> Repo . update ( )
292282 end
293283
284+ def change_order ( % Order { } = order , attrs \\ % { } ) do
285+ Order . changeset ( order , attrs )
286+ end
287+
294288 @ doc """
295289 Deletes a order.
296290
@@ -307,19 +301,6 @@ defmodule Store.Inventory do
307301 Repo . delete ( order )
308302 end
309303
310- @ doc """
311- Returns an `%Ecto.Changeset{}` for tracking order changes.
312-
313- ## Examples
314-
315- iex> change_order(order)
316- %Ecto.Changeset{data: %Order{}}
317-
318- """
319- def change_order ( % Order { } = order , attrs \\ % { } ) do
320- Order . changeset ( order , attrs )
321- end
322-
323304 @ doc """
324305 Returns a function that can be used to broadcast the given event.
325306
@@ -341,21 +322,20 @@ defmodule Store.Inventory do
341322 iex> purchase(user, product)
342323 {:error, %Ecto.Changeset{}}
343324 """
344- alias Store.Accounts.User
345325
346326 def purchase ( % User { } = user , % Product { } = product , product_params ) do
347327 order = get_order_draft_by_id ( user . id , preloads: [ ] )
348328
349329 case order do
350330 % Order { } ->
351- handle_existing_order ( order , product , product_params )
331+ handle_existing_order ( order , product , product_params , user . partnership )
352332
353333 nil ->
354334 handle_new_order ( user , product , product_params )
355335 end
356336 end
357337
358- defp handle_existing_order ( order , product , product_params ) do
338+ defp handle_existing_order ( order , product , product_params , partnership ) do
359339 quantity = String . to_integer ( product_params [ "quantity" ] )
360340
361341 order_products =
@@ -374,30 +354,46 @@ defmodule Store.Inventory do
374354 order_product . size == String . to_existing_atom ( product_params [ "size" ] )
375355 end )
376356
357+ price =
358+ case partnership do
359+ true -> product . price_partnership
360+ false -> product . price
361+ end
362+
377363 if size_found do
378- update_order_products ( order_products , product_params , quantity )
364+ update_order_products ( order_products , price , product_params , quantity )
379365 else
380- add_product_to_order ( order , product , product_params )
366+ add_product_to_order ( order , product , price , product_params )
381367 end
382368
383369 { :ok , product }
384370 end
385371 end
386372
387- defp update_order_products ( order_products , product_params , quantity ) do
373+ defp update_order_products ( order_products , price , product_params , quantity ) do
388374 Enum . each ( order_products , fn order_product ->
389375 if order_product . size == String . to_existing_atom ( product_params [ "size" ] ) do
390- update_order_product ( order_product , % { quantity: order_product . quantity + quantity } )
376+ update_order_product ( order_product , % {
377+ quantity: order_product . quantity + quantity ,
378+ price: order_product . price + price * quantity
379+ } )
391380 end
392381 end )
393382 end
394383
395- defp handle_new_order ( user , product , product_params ) do
384+ defp handle_new_order ( % User { } = user , % Product { } = product , product_params ) do
396385 { :ok , order } = create_order ( % { user_id: user . id } )
397- add_product_to_order ( order , product , product_params )
386+
387+ price =
388+ case user . partnership do
389+ true -> product . price_partnership
390+ false -> product . price
391+ end
392+
393+ add_product_to_order ( order , product , price , product_params )
398394 end
399395
400- def add_product_to_order ( % Order { } = order , % Product { } = product , product_params ) do
396+ def add_product_to_order ( % Order { } = order , % Product { } = product , price , product_params ) do
401397 quantity = String . to_integer ( product_params [ "quantity" ] )
402398 size = product_params [ "size" ]
403399
@@ -408,7 +404,8 @@ defmodule Store.Inventory do
408404 order_id: order . id ,
409405 product_id: product . id ,
410406 quantity: quantity ,
411- size: size
407+ size: size ,
408+ price: price * quantity
412409 } )
413410 end
414411 end
@@ -452,17 +449,6 @@ defmodule Store.Inventory do
452449 { :ok , "Product added to cart" }
453450 end
454451
455- @ doc """
456-
457-
458- """
459-
460- def checkout_order ( order ) do
461- order
462- |> Order . changeset ( % { status: :ordered } )
463- |> Repo . update ( )
464- end
465-
466452 @ doc """
467453 Function which verifies that the user has 1 or more of each product in his cart.
468454 ## Examples
@@ -490,12 +476,6 @@ defmodule Store.Inventory do
490476 end
491477 end
492478
493- def capitalize_status ( status ) do
494- status
495- |> Atom . to_string ( )
496- |> String . capitalize ( )
497- end
498-
499479 def total_price ( order ) do
500480 Enum . reduce ( order . products , 0 , fn product , acc -> acc + product . price end )
501481 end
@@ -508,21 +488,9 @@ defmodule Store.Inventory do
508488 total_price ( order ) - total_price_with_partnership ( order )
509489 end
510490
511- def total_price_cart ( id ) do
512- order =
513- Order
514- |> where ( user_id: ^ id )
515- |> where ( status: :draft )
516- |> Repo . one ( )
517-
518- order_products =
519- OrdersProducts
520- |> where ( order_id: ^ order . id )
521- |> preload ( [ :product ] )
522- |> Repo . all ( )
523-
491+ def total_price_cart ( order_products ) do
524492 Enum . reduce ( order_products , 0 , fn order_product , acc ->
525- acc + order_product . quantity * order_product . product . price
493+ acc + order_product . price
526494 end )
527495 end
528496
@@ -552,12 +520,10 @@ defmodule Store.Inventory do
552520 |> Repo . update ( )
553521 end
554522
555- def discount_cart ( id ) do
556- total_price_cart ( id ) - total_price_partnership_cart ( id )
523+ def discount_cart ( id , order_products ) do
524+ total_price_cart ( order_products ) - total_price_partnership_cart ( id )
557525 end
558526
559- alias Store.Inventory.OrderHistory
560-
561527 def create_orders_history ( order ) do
562528 % OrderHistory { }
563529 |> OrderHistory . changeset ( order )
@@ -612,6 +578,10 @@ defmodule Store.Inventory do
612578 |> Repo . preload ( :order )
613579 end
614580
581+ def delete_order_product ( % OrdersProducts { } = order_product ) do
582+ Repo . delete ( order_product )
583+ end
584+
615585 defp broadcast ( { :error , _reason } = error , _event ) , do: error
616586
617587 defp broadcast ( { :ok , % Product { } = product } , event )
0 commit comments