Files
chatwoot/app/models/concerns/assignment_handler.rb
Shivam Mishra 3a4249da11 feat: Add support for multi-language support for Captain (#11068)
This PR implements the following features

- FAQs from conversations will be generated in account language
- Contact notes will be generated in account language
- Copilot chat will respond in user language, unless the agent asks the
question in a different language

## Changes
### Copilot Chat

- Update the prompt to include an instruction for the language, the bot
will reply in asked language, but will default to account language
- Update the `ChatService` class to include pass the language to
`SystemPromptsService`

### FAQ and Contact note generation

- Update contact note generator and conversation generator to include
account locale
- Pass the account locale to `SystemPromptsService`


<details><summary>Screenshots</summary>

#### FAQs being generated in system langauge

![CleanShot 2025-03-12 at 13 32
30@2x](https://github.com/user-attachments/assets/84685bd8-3785-4432-aff3-419f60d96dd3)


#### Copilot responding in system language

![CleanShot 2025-03-12 at 13 47
03@2x](https://github.com/user-attachments/assets/38383293-4228-47bd-b74a-773e9a194f90)


</details>

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Pranav <pranav@chatwoot.com>
2025-03-19 18:25:33 -07:00

56 lines
1.5 KiB
Ruby

module AssignmentHandler
extend ActiveSupport::Concern
include Events::Types
included do
before_save :ensure_assignee_is_from_team
after_commit :notify_assignment_change, :process_assignment_changes
end
private
def ensure_assignee_is_from_team
return unless team_id_changed?
validate_current_assignee_team
self.assignee ||= find_assignee_from_team
end
def validate_current_assignee_team
self.assignee_id = nil if team&.members&.exclude?(assignee)
end
def find_assignee_from_team
return if team&.allow_auto_assign.blank?
team_members_with_capacity = inbox.member_ids_with_assignment_capacity & team.members.ids
::AutoAssignment::AgentAssignmentService.new(conversation: self, allowed_agent_ids: team_members_with_capacity).find_assignee
end
def notify_assignment_change
{
ASSIGNEE_CHANGED => -> { saved_change_to_assignee_id? },
TEAM_CHANGED => -> { saved_change_to_team_id? }
}.each do |event, condition|
condition.call && dispatcher_dispatch(event, previous_changes)
end
end
def process_assignment_changes
process_assignment_activities
end
def process_assignment_activities
user_name = Current.user.name if Current.user.present?
if saved_change_to_team_id?
create_team_change_activity(user_name)
elsif saved_change_to_assignee_id?
create_assignee_change_activity(user_name)
end
end
def self_assign?(assignee_id)
assignee_id.present? && Current.user&.id == assignee_id
end
end