module Comee module Core class QuotationRequestService def create_request_with_items(params) request = nil QuotationRequest.transaction do request = QuotationRequest.create!(client_id: params[:client_id], status: QuotationRequest.statuses[:draft]) items = params[:items] items.each do |item| item[:price] = 0 item[:quotation_request_id] = request.id item[:discount] = 0 end QuotationRequestItem.insert_all!(items) end request rescue StandardError raise end def submit(id) rfq = QuotationRequest.find(id) raise(StandardError, "RFQ should be in draft state.") if QuotationRequest.statuses[rfq.status] != QuotationRequest.statuses[:draft] raise(StandardError, "RFQ does not have any items.") if rfq.quotation_request_items.count.zero? raise(StandardError, "RFQ contains only canceled items.") if rfq.quotation_request_items.all?(&:canceled?) QuotationRequest.transaction do product_ids = rfq.quotation_request_items.map(&:product_id) prices = MasterPrice.where(product_id: product_ids).each_with_object({}) do |price, res| res[price.product_id] = [price.selling_price, price.valid_from, price.valid_to] end items = rfq.quotation_request_items.each_with_object({}) do |item, res| price = prices[item.product_id] res[item.id] = {price: price[0], valid_from: price[1], valid_to: price[2]} if price end QuotationRequestItem.update!(items.keys, items.values) rfq.status = QuotationRequest.statuses[:submitted] rfq.save! end rfq end def submit_for_confirmation(id) rfq = QuotationRequest.find(id) if QuotationRequest.statuses[rfq.status] != QuotationRequest.statuses[:submitted] raise(StandardError, "RFQ should be in submitted state.") end rfq.status = QuotationRequest.statuses[:awaiting_confirmation] rfq.save! rfq end def confirm(id) rfq = QuotationRequest.find(id) if QuotationRequest.statuses[rfq.status] != QuotationRequest.statuses[:awaiting_confirmation] raise(StandardError, "RFQ should be in awaiting_confirmation state.") end rfq.status = QuotationRequest.statuses[:confirmed] rfq.save! rfq end end end end