def complete_command(user_state, command_code, chat_message, router):
        view_render_extras = {} #need to add this data to update a view instead of redrawing

        user_view, view_params = router.get_view(user_state, command_code, chat_message.chat_id)

        temp_view_params_text = view_params['text']
        key_code = 0
        sms_code = UserState.get_command_value(chat_message.chat_id, user_state, command_code)
        error = ""
        phone_number = UserState.get_command_value(chat_message.chat_id, user_state, UserState.STATE_UNAUTH_C_GET_PHONE)
        phone_number_formatted = phone_number[0] + '-' + phone_number[1:4] + '-' + phone_number[4:7] + '-' + phone_number[7:]

        if (chat_message.message_type == ChatMessage.UPDATE_TYPE_CALLBACK):
            key_code = int(chat_message.data)
            sms_code, view_render_extras = VerifyPhoneController.update_sms_code_by_callback(chat_message, view_params, sms_code)

        #processing voice message
        elif chat_message.has_voice:
            sms_code, view_render_extras = VerifyPhoneController.update_sms_code_by_audio(chat_message, view_params, sms_code)

        UserState.set_command_value(chat_message.chat_id, user_state, command_code, sms_code)
        sms_code_formatted = ' '.join('{:-<6s}'.format(sms_code))               
        view_params['text'] = view_params['text'].format(phone_number=phone_number_formatted, sms_code=sms_code_formatted, error=error)
        return_value = None        

        #Handling result
        if ((chat_message.message_type == ChatMessage.UPDATE_TYPE_CALLBACK) and (key_code == ViewParams.KEYBOARD_KEY_OK)
            or (chat_message.voice)):
            try:
                AbstractView.show_toast(chat_message.chat_id, MessageText.STATE_AUTH_LOADING, view_render_extras)
                user_obj = AlfaApi.send_sms_code(phone_number, sms_code)  
                
                User.add(chat_id, "access_token", user_obj['access_token'])
                User.add(chat_id, "refresh_token", user_obj['refresh_token'])

                UserState.set_state(chat_message.chat_id, UserState.STATE_NOCARD, UserState.STATE_NOCARD_C_INIT)
                view_params['text'] = MessageText.MESSAGE_CORRECT_CODE
                view_params.update({'force_remove_inline': True})
                return_value = {'run_next': True}

            except AlfaApiError:
                error = ErrorText.ERROR_WRONG_SMS_CODE
                sms_code = ""
                UserState.set_command_value(chat_message.chat_id, user_state, command_code, sms_code)                
                sms_code_formatted = ' '.join('{:-<6s}'.format(sms_code)) 
                view_params['text'] = temp_view_params_text.format(phone_number=phone_number_formatted, sms_code=sms_code_formatted, error=error)

        user_view.render(**view_params)
        return return_value
    def run_command(user_state, command_code, chat_message, router):

        to_card_number = ""
        card_cvv = ""
        transfer_sum = ""
        error = ""
        command_value = {"to_card_number": to_card_number, "card_cvv": card_cvv, "transfer_sum":transfer_sum}

        UserState.set_state(chat_message.chat_id, user_state, command_code)
        UserState.set_command_value(chat_message.chat_id, user_state, command_code, json.dumps(command_value)) 

        render_context = json.loads(UserState.get_command_context(chat_message.chat_id, user_state, UserState.STATE_AUTH_C_TRANSFER_SELECT_CARD))        
        view_render_extras = {'message_id': render_context['result']['message_id'], 'is_update': True}

        user_view, view_params = router.get_view(user_state, command_code, chat_message.chat_id)

        to_card_number = ' '.join('{:-<16s}'.format(to_card_number))
        to_card_number = string.join([to_card_number[i: i+7]+'  ' for i in range(0, 32, 8)])

        user_card = UserCard.unpack(UserState.get_command_value(chat_message.chat_id, user_state, UserState.STATE_AUTH_C_TRANSFER_SELECT_CARD))

        from_card_number = user_card.number
        
        view_params['text'] = view_params['text'].format(from_card_number = from_card_number, 
                                                         to_card_number = to_card_number,
                                                         card_cvv = ' '.join('{:-<3s}'.format(card_cvv)),
                                                         transfer_sum = ' '.join('{:-<5s}'.format(transfer_sum)),
                                                         error = error
                                                         )


        view_params.update(view_render_extras)
        user_view.render(**view_params)
    def complete_command(user_state, command_code, chat_message, router):
        view_render_extras = {} #need to add this data to update a view instead of redrawing
        error = ""
        card_add_success = False #TODO: design the correct handling of the alfa API

        if (chat_message.message_type == ChatMessage.UPDATE_TYPE_CALLBACK):
            key_code = int(chat_message.data)

            user_card = UserCard.unpack(UserState.get_command_value(chat_message.chat_id, user_state, UserState.STATE_AUTH_C_TRANSFER_SELECT_CARD))
            from_card_number = user_card.number

            view_render_extras = {'message_id': chat_message.message_id, 'is_update': True}
            command_value = json.loads(UserState.get_command_value(chat_message.chat_id, user_state, command_code))

            AuthTransferController.update_form_by_callback(chat_message, command_value)            
            UserState.set_command_value(chat_message.chat_id, user_state, command_code, json.dumps(command_value))

            if key_code == ViewParams.KEYBOARD_KEY_OK:
                card_add_success, error = AuthTransferController.check_result(chat_message, view_render_extras, command_value, user_card)

            user_view, view_params = router.get_view(user_state, command_code, chat_message.chat_id)

            to_card_number = ' '.join('{:-<16s}'.format(command_value['to_card_number']))
            to_card_number = string.join([to_card_number[i: i+7]+'  ' for i in range(0, 32, 8)])
        
            view_params['text'] = view_params['text'].format(from_card_number=from_card_number, 
                                                             to_card_number = to_card_number,
                                                             card_cvv = ' '.join('{:-<3s}'.format(command_value['card_cvv'])),
                                                             transfer_sum = command_value['transfer_sum'],
                                                             error = error
                                                                )



            if card_add_success:
                UserState.set_state(chat_message.chat_id, UserState.STATE_AUTH, UserState.STATE_AUTH_C_INIT)
                view_params['text'] = MessageText.MESSAGE_CORRECT_TRANSFER
                view_params.update({'force_remove_inline': True})
            
            view_params.update(view_render_extras)
            user_view.render(**view_params)            
        else:
            AbstractView.show_toast(chat_message.chat_id, ErrorText.ERROR_INPUT_UNSUPPORTED, view_render_extras)
    def run_command(user_state, command_code, chat_message, router):
        UserState.set_command_value(chat_message.chat_id, user_state, command_code, "") 
        UserState.set_state(chat_message.chat_id, user_state, command_code)

        phone_number = UserState.get_command_value(chat_message.chat_id, user_state, UserState.STATE_UNAUTH_C_GET_PHONE)
        phone_number = phone_number[0] + "-" + phone_number[1:4] + "-" + phone_number[4:7] + "-" + phone_number[7:]
        sms_code = ""
        sms_code = " ".join("{:-<6s}".format(sms_code))
        error = ""

        user_view, view_params = router.get_view(user_state, command_code, chat_message.chat_id)

        view_params['text'] = view_params['text'].format(phone_number=phone_number, sms_code=sms_code, error=error)             
        user_view.render(**view_params)
    def complete_command(user_state, command_code, chat_message, router):
        view_render_extras = {} #need to add this data to update a view instead of redrawing
        card_add_success = False
        error = ""

        if (chat_message.message_type == ChatMessage.UPDATE_TYPE_CALLBACK):

            view_render_extras = {"message_id": chat_message.message_id, "is_update": True}
            command_value = json.loads(UserState.get_command_value(chat_message.chat_id, user_state, command_code))
            key_code = int(chat_message.data)

            NoCardAddCardController.update_form_by_callback(chat_message, command_value)
            UserState.set_command_value(chat_message.chat_id, user_state, command_code, json.dumps(command_value))

            if key_code == ViewParams.KEYBOARD_KEY_OK:
                card_add_success, error = NoCardAddCardController.check_result(chat_message, view_render_extras, command_value)

            user_view, view_params = router.get_view(user_state, command_code, chat_message.chat_id)

            card_number = ' '.join('{:-<16s}'.format(command_value['card_number']))
            card_number = string.join([card_number[i: i+7]+'  ' for i in range(0, 32, 8)])
        
            view_params['text'] = view_params['text'].format(card_number = card_number,
                                                                card_year = ' '.join('{:-<2s}'.format(command_value['card_year'])),
                                                                card_month = ' '.join('{:-<2s}'.format(command_value['card_month'])),
                                                                card_cvv = ' '.join('{:-<3s}'.format(command_value['card_cvv'])),
                                                                error = error
                                                                )
            return_value = None

            if card_add_success:
                UserState.set_state(chat_message.chat_id, UserState.STATE_AUTH, UserState.STATE_AUTH_C_INIT)
                view_params['text'] = MessageText.MESSAGE_CORRECT_CARD_ADD
                view_params.update({'force_remove_inline': True})
                return_value = {'run_next': True}
            
            view_params.update(view_render_extras)
            user_view.render(**view_params)            
            return return_value
        else:           
            AbstractView.show_toast(chat_message.chat_id, ErrorText.ERROR_INPUT_UNSUPPORTED)