2022-07-13 15:06:46 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
# Provides methods for Product
|
|
|
|
class ProductService
|
2022-09-13 15:01:55 +02:00
|
|
|
class << self
|
2022-09-14 15:15:47 +02:00
|
|
|
PRODUCTS_PER_PAGE = 12
|
2022-09-09 13:48:20 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
def list(filters)
|
|
|
|
products = Product.includes(:product_images)
|
|
|
|
if filters[:is_active].present?
|
|
|
|
state = filters[:disabled] == 'false' ? [nil, false] : true
|
|
|
|
products = products.where(is_active: state)
|
|
|
|
end
|
2022-09-14 15:15:47 +02:00
|
|
|
products = products.page(filters[:page]).per(PRODUCTS_PER_PAGE) if filters[:page].present?
|
2022-09-13 15:01:55 +02:00
|
|
|
products
|
2022-08-16 18:53:11 +02:00
|
|
|
end
|
2022-08-04 14:02:19 +02:00
|
|
|
|
2022-09-14 15:15:47 +02:00
|
|
|
def pages(filters)
|
|
|
|
products = Product.all
|
|
|
|
if filters[:is_active].present?
|
|
|
|
state = filters[:disabled] == 'false' ? [nil, false] : true
|
|
|
|
products = Product.where(is_active: state)
|
|
|
|
end
|
|
|
|
products.page(1).per(PRODUCTS_PER_PAGE).total_pages
|
2022-09-09 17:14:22 +02:00
|
|
|
end
|
2022-09-09 13:48:20 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
# amount params multiplied by hundred
|
2022-09-14 15:19:12 +02:00
|
|
|
def amount_multiplied_by_hundred(amount)
|
2022-09-13 15:01:55 +02:00
|
|
|
if amount.present?
|
|
|
|
v = amount.to_f
|
2022-08-04 14:02:19 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
return nil if v.zero?
|
2022-08-04 14:02:19 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
return v * 100
|
|
|
|
end
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
# @param product Product
|
|
|
|
# @param stock_movements [{stock_type: string, reason: string, quantity: number|string, order_item_id: number|nil}]
|
|
|
|
def update_stock(product, stock_movements = nil)
|
|
|
|
remaining_stock = { internal: product.stock['internal'], external: product.stock['external'] }
|
|
|
|
product.product_stock_movements_attributes = stock_movements&.map do |movement|
|
|
|
|
quantity = ProductStockMovement::OUTGOING_REASONS.include?(movement[:reason]) ? -movement[:quantity].to_i : movement[:quantity].to_i
|
|
|
|
remaining_stock[movement[:stock_type].to_sym] += quantity
|
|
|
|
{
|
|
|
|
stock_type: movement[:stock_type], reason: movement[:reason], quantity: quantity,
|
|
|
|
remaining_stock: remaining_stock[movement[:stock_type].to_sym], date: DateTime.current, order_item_id: movement[:order_item_id]
|
|
|
|
}
|
|
|
|
end || {}
|
|
|
|
product.stock = remaining_stock
|
|
|
|
product
|
2022-08-04 14:02:19 +02:00
|
|
|
end
|
2022-08-25 08:52:17 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
def create(product_params, stock_movement_params = [])
|
|
|
|
product = Product.new(product_params)
|
2022-09-16 11:45:58 +02:00
|
|
|
product.amount = amount_multiplied_by_hundred(product_params[:amount])
|
2022-09-13 15:01:55 +02:00
|
|
|
update(product, product_params, stock_movement_params)
|
2022-08-04 14:02:19 +02:00
|
|
|
end
|
2022-08-25 08:52:17 +02:00
|
|
|
|
2022-09-13 15:01:55 +02:00
|
|
|
def update(product, product_params, stock_movement_params = [])
|
|
|
|
product_params[:amount] = amount_multiplied_by_hundred(product_params[:amount])
|
|
|
|
product.attributes = product_params
|
|
|
|
update_stock(product, stock_movement_params)
|
|
|
|
product
|
|
|
|
end
|
2022-08-25 08:52:17 +02:00
|
|
|
end
|
2022-07-13 15:06:46 +02:00
|
|
|
end
|