Module: Assistant::SalesManagement::Serializers

Included in:
BriefTools
Defined in:
app/services/assistant/sales_management/serializers.rb

Overview

Shared row-shape serializers for SalesManagement tool payloads.
Tools used to share these via private class methods on the monolithic
SalesManagementToolBuilder; extracting them keeps each sub-builder
focused on a single domain (briefs, employees, pipeline) without
losing the consistent on-the-wire shapes the model expects.

Class Method Summary collapse

Class Method Details

.serialize_activity(activity, include_opportunity: false) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'app/services/assistant/sales_management/serializers.rb', line 13

def serialize_activity(activity, include_opportunity: false)
  {
    id: activity.id,
    type: activity.activity_type&.task_type || 'Note',
    status: activity.result_code || 'Open',
    party: activity.party&.full_name,
    assigned_to: activity.assigned_resource&.full_name,
    target: activity.target_datetime&.iso8601,
    completed_at: activity.completion_datetime&.iso8601,
    opportunity_id: include_opportunity ? activity.opportunity_id : nil,
    notes_excerpt: activity.notes.to_s.truncate(500).presence
  }.compact
end

.serialize_call_record(call_record) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'app/services/assistant/sales_management/serializers.rb', line 49

def serialize_call_record(call_record)
  {
    id: call_record.id,
    date: call_record.created_at&.iso8601,
    direction: call_record.try(:call_direction),
    duration_seconds: call_record.try(:duration_secs),
    outcome: call_record.try(:call_outcome),
    summary: call_record.try(:ai_summary).to_s.truncate(300).presence,
    transcript_preview: call_record.try(:transcript).to_s.truncate(400).presence
  }.compact
end

.serialize_opportunity_summary(opp) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'app/services/assistant/sales_management/serializers.rb', line 61

def serialize_opportunity_summary(opp)
  {
    id: opp.id,
    reference_number: opp.reference_number,
    name: opp.name,
    state: opp.state,
    value: opp.value&.to_f,
    close_date: opp.close_date&.iso8601,
    crm_url: "#{CRM_URL}/opportunities/#{opp.id}"
  }.compact
end

.serialize_order(order) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'app/services/assistant/sales_management/serializers.rb', line 39

def serialize_order(order)
  {
    id: order.id,
    reference_number: order.reference_number,
    state: order.state,
    created_at: order.created_at&.iso8601,
    crm_url: "#{CRM_URL}/orders/#{order.id}"
  }.compact
end

.serialize_quote(quote, include_ship_to: false) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
# File 'app/services/assistant/sales_management/serializers.rb', line 27

def serialize_quote(quote, include_ship_to: false)
  {
    id: quote.id,
    reference_number: quote.reference_number,
    state: quote.state,
    total: quote.try(:total_amount)&.to_f,
    created_at: quote.created_at&.iso8601,
    ship_to_present: include_ship_to ? quote.try(:shipping_address_id).present? : nil,
    crm_url: "#{CRM_URL}/quotes/#{quote.id}"
  }.compact
end