@ -154,6 +154,13 @@ class OrderFlowMixin:
selected_vehicle = context . get ( " selected_vehicle " )
selected_vehicle = context . get ( " selected_vehicle " )
return dict ( selected_vehicle ) if isinstance ( selected_vehicle , dict ) else None
return dict ( selected_vehicle ) if isinstance ( selected_vehicle , dict ) else None
def _get_pending_single_vehicle_confirmation ( self , user_id : int | None ) - > dict | None :
context = self . _get_user_context ( user_id )
if not context :
return None
pending_vehicle = context . get ( " pending_single_vehicle_confirmation " )
return dict ( pending_vehicle ) if isinstance ( pending_vehicle , dict ) else None
def _remember_stock_results ( self , user_id : int | None , stock_results : list [ dict ] | None ) - > None :
def _remember_stock_results ( self , user_id : int | None , stock_results : list [ dict ] | None ) - > None :
context = self . _get_user_context ( user_id )
context = self . _get_user_context ( user_id )
if not context :
if not context :
@ -178,6 +185,7 @@ class OrderFlowMixin:
context [ " last_stock_results " ] = sanitized
context [ " last_stock_results " ] = sanitized
if sanitized :
if sanitized :
context [ " selected_vehicle " ] = None
context [ " selected_vehicle " ] = None
context [ " pending_single_vehicle_confirmation " ] = None
self . _save_user_context ( user_id = user_id , context = context )
self . _save_user_context ( user_id = user_id , context = context )
def _store_selected_vehicle ( self , user_id : int | None , vehicle : dict | None ) - > None :
def _store_selected_vehicle ( self , user_id : int | None , vehicle : dict | None ) - > None :
@ -187,6 +195,25 @@ class OrderFlowMixin:
if not context :
if not context :
return
return
context [ " selected_vehicle " ] = dict ( vehicle ) if isinstance ( vehicle , dict ) else None
context [ " selected_vehicle " ] = dict ( vehicle ) if isinstance ( vehicle , dict ) else None
context [ " pending_single_vehicle_confirmation " ] = None
self . _save_user_context ( user_id = user_id , context = context )
def _store_pending_single_vehicle_confirmation ( self , user_id : int | None , vehicle : dict | None ) - > None :
if user_id is None :
return
context = self . _get_user_context ( user_id )
if not context :
return
context [ " pending_single_vehicle_confirmation " ] = dict ( vehicle ) if isinstance ( vehicle , dict ) else None
self . _save_user_context ( user_id = user_id , context = context )
def _clear_pending_single_vehicle_confirmation ( self , user_id : int | None ) - > None :
if user_id is None :
return
context = self . _get_user_context ( user_id )
if not isinstance ( context , dict ) :
return
context [ " pending_single_vehicle_confirmation " ] = None
self . _save_user_context ( user_id = user_id , context = context )
self . _save_user_context ( user_id = user_id , context = context )
def _vehicle_to_payload ( self , vehicle : dict ) - > dict :
def _vehicle_to_payload ( self , vehicle : dict ) - > dict :
@ -199,6 +226,8 @@ class OrderFlowMixin:
def _try_prefill_order_vehicle_from_context ( self , user_id : int | None , payload : dict ) - > None :
def _try_prefill_order_vehicle_from_context ( self , user_id : int | None , payload : dict ) - > None :
if user_id is None or payload . get ( " vehicle_id " ) :
if user_id is None or payload . get ( " vehicle_id " ) :
return
return
if self . _get_pending_single_vehicle_confirmation ( user_id = user_id ) :
return
selected_vehicle = self . _get_selected_vehicle ( user_id = user_id )
selected_vehicle = self . _get_selected_vehicle ( user_id = user_id )
if selected_vehicle :
if selected_vehicle :
payload . update ( self . _vehicle_to_payload ( selected_vehicle ) )
payload . update ( self . _vehicle_to_payload ( selected_vehicle ) )
@ -282,6 +311,7 @@ class OrderFlowMixin:
return
return
context [ " last_stock_results " ] = [ ]
context [ " last_stock_results " ] = [ ]
context [ " selected_vehicle " ] = None
context [ " selected_vehicle " ] = None
context [ " pending_single_vehicle_confirmation " ] = None
self . _save_user_context ( user_id = user_id , context = context )
self . _save_user_context ( user_id = user_id , context = context )
def _match_vehicle_from_message_index ( self , message : str , stock_results : list [ dict ] ) - > dict | None :
def _match_vehicle_from_message_index ( self , message : str , stock_results : list [ dict ] ) - > dict | None :
@ -365,6 +395,25 @@ class OrderFlowMixin:
lines . append ( " Pode responder com o numero da lista ou com o modelo do veiculo. " )
lines . append ( " Pode responder com o numero da lista ou com o modelo do veiculo. " )
return " \n " . join ( lines )
return " \n " . join ( lines )
def _render_single_vehicle_confirmation_prompt ( self , vehicle : dict ) - > str :
return (
" Encontrei 1 opcao para o seu pedido: \n "
f " - 1. { vehicle . get ( ' modelo ' , ' N/A ' ) } ( { vehicle . get ( ' categoria ' , ' N/A ' ) } ) - "
f " R$ { float ( vehicle . get ( ' preco ' , 0 ) ) : .2f } \n "
" Posso seguir com essa opcao? Responda com 1, sim ou com o modelo do veiculo. "
)
def _message_confirms_single_vehicle ( self , message : str , vehicle : dict ) - > bool :
normalized_message = self . _normalize_text ( message ) . strip ( )
if self . _is_affirmative_message ( message ) :
return True
if normalized_message == " 1 " :
return True
normalized_model = self . _normalize_text ( str ( vehicle . get ( " modelo " ) or " " ) ) . strip ( )
if normalized_model and normalized_model in normalized_message :
return True
return False
async def _try_list_stock_for_order_selection (
async def _try_list_stock_for_order_selection (
self ,
self ,
message : str ,
message : str ,
@ -391,7 +440,11 @@ class OrderFlowMixin:
except HTTPException as exc :
except HTTPException as exc :
return self . _http_exception_detail ( exc )
return self . _http_exception_detail ( exc )
self . _remember_stock_results ( user_id = user_id , stock_results = tool_result if isinstance ( tool_result , list ) else [ ] )
stock_results = tool_result if isinstance ( tool_result , list ) else [ ]
self . _remember_stock_results ( user_id = user_id , stock_results = stock_results )
if len ( stock_results ) == 1 :
self . _store_pending_single_vehicle_confirmation ( user_id = user_id , vehicle = stock_results [ 0 ] )
return self . _render_single_vehicle_confirmation_prompt ( stock_results [ 0 ] )
return self . _fallback_format_tool_result ( " consultar_estoque " , tool_result )
return self . _fallback_format_tool_result ( " consultar_estoque " , tool_result )
def _render_missing_cancel_order_fields_prompt ( self , missing_fields : list [ str ] ) - > str :
def _render_missing_cancel_order_fields_prompt ( self , missing_fields : list [ str ] ) - > str :
@ -497,6 +550,22 @@ class OrderFlowMixin:
draft [ " payload " ] . pop ( " modelo_veiculo " , None )
draft [ " payload " ] . pop ( " modelo_veiculo " , None )
draft [ " payload " ] . pop ( " valor_veiculo " , None )
draft [ " payload " ] . pop ( " valor_veiculo " , None )
pending_single_vehicle = self . _get_pending_single_vehicle_confirmation ( user_id = user_id )
if pending_single_vehicle and not draft [ " payload " ] . get ( " vehicle_id " ) :
if self . _message_confirms_single_vehicle ( message = message , vehicle = pending_single_vehicle ) :
self . _store_selected_vehicle ( user_id = user_id , vehicle = pending_single_vehicle )
draft [ " payload " ] . update ( self . _vehicle_to_payload ( pending_single_vehicle ) )
pending_single_vehicle = None
elif self . _is_negative_message ( message ) :
self . _clear_pending_single_vehicle_confirmation ( user_id = user_id )
draft [ " expires_at " ] = datetime . utcnow ( ) + timedelta ( minutes = PENDING_ORDER_DRAFT_TTL_MINUTES )
self . state . set_entry ( " pending_order_drafts " , user_id , draft )
return " Sem problema. Me diga outro modelo ou ajuste o valor para eu buscar novas opcoes. "
elif not self . _has_explicit_order_request ( message ) :
draft [ " expires_at " ] = datetime . utcnow ( ) + timedelta ( minutes = PENDING_ORDER_DRAFT_TTL_MINUTES )
self . state . set_entry ( " pending_order_drafts " , user_id , draft )
return self . _render_single_vehicle_confirmation_prompt ( pending_single_vehicle )
resolved_vehicle = self . _try_resolve_order_vehicle (
resolved_vehicle = self . _try_resolve_order_vehicle (
message = message ,
message = message ,
user_id = user_id ,
user_id = user_id ,