দোকানে অনলাইন পিকআপ কিনুন: বোনজোর মিল - পার্ট 2 - একটি শপিং কার্ট তৈরি করা

1. ভূমিকা

53003251caaf2be5.png8826bd8cb0c0f1c7.png

শেষ আপডেট: 2020-10-30

ব্যবসার বার্তাগুলিতে একটি শপিং কার্ট তৈরি করা!

এটি একটি সিরিজের দ্বিতীয় কোডল্যাব যা একটি বাই অনলাইন পিকআপ ইন স্টোর ব্যবহারকারীর যাত্রা তৈরি করার লক্ষ্যে। অনেক ই-কমার্স যাত্রায়, একটি শপিং কার্ট ব্যবহারকারীদের অর্থপ্রদানকারী গ্রাহকে রূপান্তরিত করার সাফল্যের চাবিকাঠি। শপিং কার্ট হল আপনার গ্রাহকদের আরও ভালভাবে বোঝার একটি উপায় এবং তারা আগ্রহী হতে পারে এমন অন্যান্য আইটেমগুলির বিষয়ে পরামর্শ দেওয়ার একটি উপায়৷ এই কোডল্যাবে, আমরা শপিং কার্টের অভিজ্ঞতা তৈরি এবং Google অ্যাপ ইঞ্জিনে অ্যাপ্লিকেশন স্থাপন করার উপর ফোকাস করব৷ .

কি একটি ভাল শপিং কার্ট তোলে?

শপিং কার্ট একটি সফল অনলাইন শপিং অভিজ্ঞতার চাবিকাঠি। দেখা যাচ্ছে, বিজনেস মেসেজ শুধুমাত্র একজন সম্ভাব্য গ্রাহকের সাথে একটি পণ্যের প্রশ্নোত্তর সুবিধার জন্যই ভালো নয়, তবে এটি কথোপকথনের মধ্যে একটি অর্থপ্রদান সম্পূর্ণ করার মাধ্যমে সম্পূর্ণ কেনাকাটার অভিজ্ঞতাকে সহজতর করতে পারে।

9d17537b980d0e62.png

একটি ভাল শপিং কার্ট ছাড়াও, একটি ভাল কেনাকাটার অভিজ্ঞতা ব্যবহারকারীদের বিভাগ অনুসারে আইটেমগুলি ব্রাউজ করতে দেয় এবং ব্যবসাকে ক্রেতার আগ্রহী হতে পারে এমন অন্যান্য পণ্যের সুপারিশ করতে দেয়৷ শপিং কার্টে আরও আইটেম যুক্ত করার পরে, ব্যবহারকারী তাদের সম্পূর্ণ কার্ট পর্যালোচনা করতে পারে এবং হতে পারে চেক আউট করার আগে আইটেমগুলি সরাতে বা আরও আইটেম যোগ করতে সক্ষম।

আপনি কি নির্মাণ করবেন

কোডল্যাব সিরিজের এই বিভাগে, আপনি কল্পিত কোম্পানি, বনজোর মিলের জন্য অংশ 1 -এ তৈরি করা ডিজিটাল এজেন্টকে প্রসারিত করতে যাচ্ছেন, যাতে ব্যবহারকারীরা আইটেমগুলির একটি ক্যাটালগ ব্রাউজ করতে এবং একটি শপিং কার্টে আইটেম যোগ করতে পারে।

এই কোডল্যাবে, আপনার অ্যাপ হবে

  • ব্যবসায়িক বার্তাগুলির মধ্যে প্রশ্নের একটি ক্যাটালগ দেখান৷
  • ব্যবহারকারীদের আগ্রহী হতে পারে এমন আইটেমগুলি সুপারিশ করুন৷
  • শপিং কার্টের বিষয়বস্তু পর্যালোচনা করুন এবং মোট মূল্যের সারাংশ তৈরি করুন

ab2fb6a4ed33a129.png

আপনি কি শিখবেন

  • গুগল ক্লাউড প্ল্যাটফর্মে অ্যাপ ইঞ্জিনে কীভাবে একটি ওয়েব অ্যাপ্লিকেশন স্থাপন করবেন
  • একটি শপিং কার্টের অবস্থা সংরক্ষণ করতে একটি ক্রমাগত স্টোরেজ মেকানিজম কীভাবে ব্যবহার করবেন

এই কোডল্যাব এই কোডল্যাব সিরিজের পার্ট 1 থেকে ডিজিটাল এজেন্ট প্রসারিত করার উপর দৃষ্টি নিবদ্ধ করে।

আপনি কি প্রয়োজন হবে

2. সেট আপ করা হচ্ছে

এই কোডল্যাব ধরে নেয় আপনি আপনার প্রথম এজেন্ট তৈরি করেছেন এবং কোডল্যাবের অংশ 1 সম্পূর্ণ করেছেন। যেমন, আমরা বিজনেস মেসেজ এবং বিজনেস কমিউনিকেশন এপিআই সক্ষম করার, পরিষেবা অ্যাকাউন্ট কী তৈরি করা, একটি অ্যাপ্লিকেশন স্থাপন করা, বা বিজনেস কমিউনিকেশন কনসোলে আপনার ওয়েবহুক সেট আপ করার মৌলিক বিষয়গুলি নিয়ে যাব না৷ এটি বলার সাথে সাথে, আমরা একটি নমুনা অ্যাপ্লিকেশন ক্লোন করব তা নিশ্চিত করতে যে আপনার অ্যাপ্লিকেশনটি আমরা যা তৈরি করছি তার সাথে সামঞ্জস্যপূর্ণ, এবং আমরা Google ক্লাউড প্ল্যাটফর্মে ডেটাস্টোরের জন্য এপিআই সক্ষম করব যাতে কেনাকাটা সম্পর্কিত ডেটা বজায় রাখতে সক্ষম হয়। কার্ট

GitHub থেকে অ্যাপ্লিকেশন ক্লোনিং

একটি টার্মিনালে, নিম্নলিখিত কমান্ডের সাহায্যে আপনার প্রকল্পের কার্যকারী ডিরেক্টরিতে জ্যাঙ্গো ইকো বট নমুনা ক্লোন করুন:

$ git clone https://github.com/google-business-communications/bm-bonjour-meal-django-starter-code

নমুনার রিসোর্স ফোল্ডারে পরিষেবা অ্যাকাউন্টের জন্য তৈরি করা আপনার JSON শংসাপত্রের ফাইলটি অনুলিপি করুন এবং শংসাপত্রগুলির নাম পরিবর্তন করুন "bm-agent-service-account-credentials.json"।

bm-bonjour-meal-django-starter-code/bonjourmeal-codelab/step-2/resources/bm-agent-service-account-credentials.json

Google Datastore API সক্ষম করুন

এই কোডল্যাবের অংশ 1-এ, আপনি ব্যবসা বার্তা API, ব্যবসায়িক যোগাযোগ API, এবং ক্লাউড বিল্ড API সক্ষম করেছেন৷

এই কোডল্যাবের জন্য, যেহেতু আমরা Google ডেটাস্টোরের সাথে কাজ করব, তাই আমাদের এই API সক্ষম করতে হবে:

  1. Google ক্লাউড কনসোলে Google Datastore API খুলুন।
  2. আপনি সঠিক GCP প্রকল্পের সাথে কাজ করছেন তা নিশ্চিত করুন।
  3. সক্ষম করুন ক্লিক করুন।

নমুনা অ্যাপ্লিকেশন স্থাপন করা হচ্ছে

একটি টার্মিনালে, নমুনার ধাপ-2 ডিরেক্টরিতে নেভিগেট করুন।

নমুনা স্থাপন করতে একটি টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান:

$ gcloud config set project PROJECT_ID*
$ gcloud app deploy
  • PROJECT_ID হল প্রজেক্টের আইডি যেটি আপনি API-এর সাথে নিবন্ধন করতে ব্যবহার করেছিলেন।

শেষ কমান্ডের আউটপুটে স্থাপন করা অ্যাপ্লিকেশনটির URL নোট করুন:

Deployed service [default] to [https://PROJECT_ID.appspot.com]

আপনি এইমাত্র যে কোডটি স্থাপন করেছেন তাতে বিজনেস মেসেজ থেকে বার্তা পাওয়ার জন্য একটি ওয়েবহুক সহ একটি ওয়েব অ্যাপ্লিকেশন রয়েছে৷ কোডল্যাবের অংশ 1 থেকে আমরা যা করেছি তা এতে রয়েছে। যদি আপনি ইতিমধ্যে এটি না করে থাকেন, তাহলে অনুগ্রহ করে আপনার ওয়েবহুক কনফিগার করুন

অ্যাপ্লিকেশনটি কিছু সাধারণ অনুসন্ধানের জবাব দেবে যেমন একজন ব্যবহারকারী বনজোর মিলের ব্যবসার সময় সম্পর্কে জিজ্ঞাসা করছেন। বিজনেস কমিউনিকেশনস কনসোলের মধ্যে থাকা এজেন্ট তথ্য থেকে আপনি পুনরুদ্ধার করতে পারেন এমন পরীক্ষার URLগুলির মাধ্যমে আপনার মোবাইল ডিভাইসে এটি পরীক্ষা করা উচিত। পরীক্ষার URLগুলি আপনার মোবাইল ডিভাইসে ব্যবসা বার্তার অভিজ্ঞতা চালু করবে এবং আপনি সেখানে আপনার এজেন্টের সাথে ইন্টারঅ্যাক্ট শুরু করতে পারেন।

3. পণ্য ক্যাটালগ

একটি ইনভেন্টরি সিস্টেম

বেশিরভাগ ক্ষেত্রে, আপনি একটি অভ্যন্তরীণ API এর মাধ্যমে একটি ব্র্যান্ডের ইনভেন্টরির সাথে সরাসরি সংহত করতে পারেন। অন্যান্য ক্ষেত্রে, আপনি একটি ওয়েব পৃষ্ঠা স্ক্র্যাপ করতে পারেন বা আপনার নিজস্ব ইনভেন্টরি ট্র্যাকিং সিস্টেম তৈরি করতে পারেন। আমাদের ফোকাস একটি ইনভেন্টরি সিস্টেম তৈরি করা হয় না; আমরা একটি সাধারণ স্ট্যাটিক ফাইল ব্যবহার করব যাতে আমাদের এজেন্টের জন্য ছবি এবং পণ্যের তথ্য থাকে। এই বিভাগে, আমরা এই স্ট্যাটিক ফাইল থেকে তথ্য টেনে আনব, সেই তথ্যটি কথোপকথনে তুলে ধরব এবং ব্যবহারকারীকে শপিং কার্টে যোগ করার জন্য উপলব্ধ আইটেমগুলি ব্রাউজ করার অনুমতি দিব।

স্ট্যাটিক ইনভেন্টরি ফাইল এই মত দেখায়:

bonjourmeal-codelab/step-2/resources/inventory.json

{

    "food": [
        {
            "id":0,
            "name": "Ham and cheese sandwich",
            "price": "6.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/ham-and-cheese.png",
            "remaining": 8
        },
        {
            "id":1,
            "name": "Chicken veggie wrap",
            "price": "9.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/chicken-veggie-wrap.png",
            "remaining": 2
        },
        {
            "id":2,
            "name": "Assorted cheese plate",
            "price": "7.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/assorted-cheese-plate.png",
            "remaining": 6
        },
        {
            "id":3,
            "name": "Apple walnut salad",
            "price": "12.99",
            "image_url": "https://storage.googleapis.com/bonjour-rail.appspot.com/apple-walnut-salad.png",
            "remaining": 1
        }
    ]
}

এই ফাইলটি পড়ার জন্য পাইথন অ্যাপ্লিকেশনটি পান!

আমাদের জায় থেকে পড়া

ইনভেন্টরি হল "inventory.json" নামক একটি স্ট্যাটিক ফাইল যা ./resources ডিরেক্টরিতে পাওয়া যায়। আমাদের JSON ফাইলের বিষয়বস্তু পড়ার জন্য views.py-এ কিছু পাইথন লজিক যোগ করতে হবে এবং তারপরে এটি কথোপকথনে উপস্থাপন করতে হবে। আসুন একটি ফাংশন তৈরি করি যা JSON ফাইল থেকে ডেটা পড়ে এবং উপলব্ধ পণ্যগুলির তালিকা প্রদান করে।

এই ফাংশনের সংজ্ঞা views.py-এ যে কোনও জায়গায় স্থাপন করা যেতে পারে।

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_inventory_data():
        f = open(INVENTORY_FILE)
        inventory = json.load(f)
        return inventory
...

এটি আমাদেরকে ইনভেন্টরি থেকে ডেটা পড়ার জন্য যা দরকার তা দেওয়া উচিত। এখন আমাদের কথোপকথনে এই পণ্যের তথ্যকে পৃষ্ঠ করার একটি উপায় প্রয়োজন।

পণ্য ক্যাটালগ পৃষ্ঠ

এই কোডল্যাবে সরলতার জন্য, আমাদের কাছে একটি সাধারণ পণ্যের ক্যাটালগ রয়েছে যা একটি একক রিচ কার্ড ক্যারাউজেলের মাধ্যমে বিজনেস মেসেজ কথোপকথনে সমস্ত ইনভেন্টরি আইটেমকে সারফেস করে।

পণ্যের ক্যাটালগ দেখতে, আমরা একটি প্রস্তাবিত উত্তর তৈরি করতে যাচ্ছি যাতে লেখা আছে "শো মেনু" এবং পোস্টব্যাকডেটা " show-product-catalog "। ব্যবহারকারীরা প্রস্তাবিত উত্তরে ট্যাপ করলে এবং আপনার ওয়েব অ্যাপ্লিকেশন পোস্টব্যাক ডেটা গ্রহণ করলে, আমরা রিচ কার্ড ক্যারোজেল পাঠাব। আসুন views.py-এর শীর্ষে এই প্রস্তাবিত উত্তরের জন্য একটি নতুন ধ্রুবক যোগ করি।

bonjourmeal-codelab/step-2/bopis/views.py

...
CMD_SHOW_PRODUCT_CATALOG = 'show-product-catalog'
...

এখান থেকে, আমরা বার্তাটি পার্স করি এবং এটিকে একটি নতুন ফাংশনে রুট করি যা পণ্যের ক্যাটালগ ধারণকারী একটি সমৃদ্ধ কার্ড ক্যারাউজেল পাঠায়। প্রস্তাবিত উত্তরটি ট্যাপ করা হলে একটি ফাংশন " send_product_catalog " কল করার জন্য প্রথমে route_message ফাংশনটি প্রসারিত করুন এবং তারপরে আমরা ফাংশনটি সংজ্ঞায়িত করব।

নিম্নোক্ত স্নিপেটে, route_message ফাংশনে if স্টেটমেন্টে একটি অতিরিক্ত শর্ত যোগ করুন normalized_message আমাদের পূর্বে সংজ্ঞায়িত ধ্রুবকের সমান কিনা, CMD_SHOW_PRODUCT_CATALOG

bonjourmeal-codelab/step-2/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATALOG:
        send_product_catalog(conversation_id)
    else:
        echo_message(message, conversation_id)
...

এবং আসুন প্রবাহটি সম্পূর্ণ করা নিশ্চিত করি এবং send_product_catalog সংজ্ঞায়িত করি। send_product_catalog কল get_menu_carousel, যা আমরা আগে পড়া ইনভেন্টরি ফাইল থেকে সমৃদ্ধ কার্ডের ক্যারোজেল তৈরি করে।

ফাংশনের সংজ্ঞা views.py-এ যে কোনও জায়গায় স্থাপন করা যেতে পারে। নোট করুন যে নিম্নলিখিত স্নিপেট দুটি নতুন ধ্রুবক ব্যবহার করে যা ফাইলের শীর্ষে যোগ করা উচিত।

bonjourmeal-codelab/step-2/bopis/views.py

...

CMD_ADD_ITEM = 'add-item'
CMD_SHOW_CART = 'show-cart'

...

def get_menu_carousel():
    """Creates a sample carousel rich card.

    Returns:
       A :obj: A BusinessMessagesCarouselCard object with three cards.
    """

    inventory = get_inventory_data()

    card_content = []

    for item in inventory['food']:
        card_content.append(BusinessMessagesCardContent(
            title=item['name'],
            description=item['price'],
            suggestions=[
                BusinessMessagesSuggestion(
                    reply=BusinessMessagesSuggestedReply(
                        text='Add item',
                        postbackData='{'+f'"action":"{CMD_ADD_ITEM}","item_name":"{item["id"]}"'+'}'))

                ],
            media=BusinessMessagesMedia(
                height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                contentInfo=BusinessMessagesContentInfo(
                    fileUrl=item['image_url'],
                    forceRefresh=False))))

    return BusinessMessagesCarouselCard(
        cardContents=card_content,
        cardWidth=BusinessMessagesCarouselCard.CardWidthValueValuesEnum.MEDIUM)

def send_product_catalog(conversation_id):
    """Sends the product catalog to the conversation_id.

    Args:
        conversation_id (str): The unique id for this user and agent.
    """
    rich_card = BusinessMessagesRichCard(carouselCard=get_menu_carousel())

    fallback_text = ''

    # Construct a fallback text for devices that do not support carousels
    for card_content in rich_card.carouselCard.cardContents:
        fallback_text += (card_content.title + '\n\n' + card_content.description
                          + '\n\n' + card_content.media.contentInfo.fileUrl
                          + '\n---------------------------------------------\n\n')

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        fallback=fallback_text,
        suggestions=[
        BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See my cart',
                postbackData=CMD_SHOW_CART)
            ),
        BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See the menu',
                postbackData=CMD_SHOW_PRODUCT_CATALOG)
            ),
        ]
        )

    send_message(message_obj, conversation_id)
...

আপনি যদি ক্যারোজেল আইটেম তৈরির পরীক্ষা করেন, তাহলে আমরা BusinessMessagesSuggestion ক্লাসের একটি উদাহরণও তৈরি করি। প্রতিটি পরামর্শ ক্যারোজেলে একটি পণ্যের জন্য একটি ব্যবহারকারী নির্বাচন প্রতিনিধিত্ব করে। যখন একজন ব্যবহারকারী প্রস্তাবিত উত্তরে ট্যাপ করেন, তখন বিজনেস মেসেজ পোস্টব্যাকডেটা পাঠাবে যাতে JSON আইটেমটির বর্ণনা থাকে এবং ব্যবহারকারী আপনার ওয়েবহুকে যে পদক্ষেপ নিতে চান (কার্ট থেকে যোগ বা সরাতে)। নিম্নলিখিত বিভাগে, আমরা কার্টে আইটেম যোগ করতে সক্ষম হতে এই মত দেখতে বার্তা বিশ্লেষণ করব।

এখন যেহেতু আমরা এই পরিবর্তনগুলি করেছি, আসুন ওয়েব অ্যাপ্লিকেশনটিকে Google App ইঞ্জিনে স্থাপন করি এবং অভিজ্ঞতাটি চেষ্টা করি!

$ gcloud app deploy

আপনার মোবাইল ডিভাইসে কথোপকথনের পৃষ্ঠ লোড হয়ে গেলে, "শো-প্রোডাক্ট-ক্যাটালগ" বার্তাটি পাঠান এবং আপনি এমন পণ্যগুলির একটি ক্যারাউজেল দেখতে পাবেন যা দেখতে এইরকম।

4639da46bcc5230c.png

আপনি যদি আইটেম যোগ করুন-এ ট্যাপ করেন, তবে এজেন্ট প্রস্তাবিত উত্তর থেকে পোস্টব্যাক ডেটার প্রতিধ্বনি ছাড়া আসলে কিছুই ঘটবে না। পরবর্তী বিভাগে, আমরা পণ্যের ক্যাটালগ ব্যবহার করব এবং শপিং কার্ট তৈরি করতে এটি ব্যবহার করব যেখানে আইটেমটি যোগ করা হবে।

আপনি এইমাত্র তৈরি করা পণ্য ক্যাটালগ বিভিন্ন উপায়ে প্রসারিত করা যেতে পারে। আপনার কাছে বিভিন্ন পানীয় মেনু বিকল্প বা নিরামিষ বিকল্প থাকতে পারে। ক্যারাউজেল বা সাজেশন চিপ ব্যবহার করা হল ব্যবহারকারীদের মেনু বিকল্পের মাধ্যমে ড্রিল ডাউন করার একটি দুর্দান্ত উপায় যাতে তারা খুঁজছেন এমন পণ্যের সেটে পৌঁছাতে পারেন। এই কোডল্যাবের এক্সটেনশন হিসাবে, পণ্যের ক্যাটালগ সিস্টেমটি প্রসারিত করার চেষ্টা করুন যাতে একজন ব্যবহারকারী মেনুতে খাবার থেকে আলাদাভাবে পানীয় দেখতে পারেন, এমনকি নিরামিষ বিকল্পগুলিও নির্দিষ্ট করতে সক্ষম হন।

4. শপিং কার্ট

কোডল্যাবের এই বিভাগে, আমরা পূর্ববর্তী বিভাগের থেকে শপিং কার্টের কার্যকারিতা বিল্ডিং তৈরি করব যা আমাদের উপলব্ধ পণ্যগুলি ব্রাউজ করতে দেয়।

অনেক কিছুর মধ্যে, মূল শপিং কার্টের অভিজ্ঞতা ব্যবহারকারীদের কার্টে আইটেম যোগ করতে, কার্ট থেকে আইটেমগুলি সরাতে, কার্টে প্রতিটি আইটেমের সংখ্যার উপর নজর রাখতে এবং কার্টের আইটেমগুলি পর্যালোচনা করতে দেয়৷

শপিং কার্টের অবস্থার উপর নজর রাখার অর্থ হল আমাদের ওয়েব অ্যাপ্লিকেশনে ডেটা বজায় রাখতে হবে। পরীক্ষা-নিরীক্ষা এবং স্থাপনার সরলতার জন্য, আমরা ডেটা বজায় রাখতে Google ক্লাউড প্ল্যাটফর্মে Google ডেটাস্টোর ব্যবহার করব। কথোপকথন আইডি একজন ব্যবহারকারী এবং ব্যবসার মধ্যে স্থির থাকে, তাই আমরা ব্যবহারকারীদের শপিং কার্ট আইটেমগুলির সাথে যুক্ত করতে এটি ব্যবহার করতে পারি।

চলুন শুরু করা যাক Google Datastore-এর সাথে সংযোগ স্থাপন করে এবং কথোপকথন আইডিটি যখন আমরা এটি দেখতে পাই তখন তা ধরে রাখি।

ডেটাস্টোরের সাথে সংযোগ করা হচ্ছে

যখনই শপিং কার্টের বিরুদ্ধে কোনো ইন্টারঅ্যাকশন চালানো হবে, উদাহরণস্বরূপ, যখন কোনো ব্যবহারকারী কোনো আইটেম যোগ করছেন বা মুছে দিচ্ছেন তখন আমরা Google Datastore-এর সাথে সংযোগ স্থাপন করব। আপনি অফিসিয়াল ডকুমেন্টেশনে Google ডেটাস্টোরের সাথে ইন্টারঅ্যাক্ট করতে এই ক্লায়েন্ট লাইব্রেরিটি ব্যবহার করার বিষয়ে আরও জানতে পারেন।

নিম্নলিখিত স্নিপেট শপিং কার্ট আপডেট করার জন্য একটি ফাংশন সংজ্ঞায়িত করে। ফাংশনটি নিম্নলিখিত ইনপুট নেয়: conversation_id এবং messagemessage JSON রয়েছে যা ব্যবহারকারী যে পদক্ষেপ নিতে চায় তার বর্ণনা দেয়, যা ইতিমধ্যেই পণ্যের ক্যাটালগ প্রদর্শন করে আপনার ক্যারোজেলে তৈরি করা হয়েছে। ফাংশনটি একটি Google Datastore ক্লায়েন্ট তৈরি করে এবং অবিলম্বে একটি ShoppingCart সত্তা নিয়ে আসে, যেখানে মূলটি হল কথোপকথন আইডি৷

আপনার views.py ফাইলে নিম্নলিখিত ফাংশনটি অনুলিপি করুন। আমরা আসন্ন বিভাগে এটি প্রসারিত করা চালিয়ে যাব।

bonjourmeal-codelab/step-2/bopis/views.py

from google.oauth2 import service_account
from google.cloud import datastore

def update_shopping_cart(conversation_id, message):
        credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_LOCATION)

        client = datastore.Client(credentials=credentials)
        key = client.key('ShoppingCart', conversation_id)
        entity = datastore.Entity(key=key)
        result = client.get(key)
        
        # TODO: Add logic to add and remove items from cart
        
        entity.update(result)
        client.put(entity)

কার্টে একটি আইটেম যোগ করতে এই ফাংশনটি প্রসারিত করা যাক।

কার্টে আইটেম যোগ করা হচ্ছে

যখন ব্যবহারকারী পণ্য ক্যারোজেল থেকে প্রস্তাবিত অ্যাকশন যোগ করুন আইটেম ট্যাপ করে, তখন পোস্টব্যাকডেটাতে JSON থাকে যা ব্যবহারকারী যে পদক্ষেপ নিতে চায় তার বর্ণনা দেয়। JSON অভিধানে দুটি কী আছে, "ক্রিয়া" এবং "item_name" এবং এই JSON অভিধানটি আপনার ওয়েবহুকে পাঠানো হয়েছে৷ "item_name" ক্ষেত্রটি হল অনন্য শনাক্তকারী যা inventory.json-এর আইটেমের সাথে যুক্ত।

একবার আমাদের কার্ট কমান্ড এবং বার্তা থেকে কার্ট আইটেম পার্স করা হলে, আমরা আইটেম যোগ করার জন্য শর্তসাপেক্ষ বিবৃতি লিখতে পারি। ডেটাস্টোর কখনই কথোপকথন আইডিটি দেখেনি বা শপিং কার্টটি প্রথমবারের মতো এই আইটেমটি গ্রহণ করছে কিনা তা এখানে চিন্তা করার জন্য কিছু প্রান্তের ক্ষেত্রে রয়েছে৷ নীচে উপরে সংজ্ঞায়িত update_shopping_cart কার্যকারিতার একটি এক্সটেনশন। এই পরিবর্তনটি শপিং কার্টে একটি আইটেম যোগ করে যা Google Datastore দ্বারা অব্যাহত রয়েছে।

নিচের স্নিপেটটি আপনার views.py এ যোগ করা আগের ফাংশনের একটি এক্সটেনশন। পার্থক্য যোগ করতে নির্দ্বিধায়, অথবা স্নিপেট অনুলিপি করুন এবং update_shopping_cart ফাংশনের বিদ্যমান সংস্করণটি প্রতিস্থাপন করুন।

bonjourmeal-codelab/step-2bopis/views.py

def update_shopping_cart(conversation_id, message):
    credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)
    inventory = get_inventory_data()

    cart_request = json.loads(message)
    cart_cmd = cart_request["action"]
    cart_item = cart_request["item_name"]

    item_name = inventory['food'][int(cart_item)]['name']

    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    if result is None:
        if cart_cmd == CMD_ADD_ITEM:
            entity.update({
                item_name: 1
            })

    else:
        if cart_cmd == CMD_ADD_ITEM:
            if result.get(item_name) is None:
                result[item_name] = 1
            else:
                result[item_name] = result[item_name] + 1

        entity.update(result)
    client.put(entity)

এই ফাংশনটি পরে প্রসারিত করা হবে সেই দৃশ্যকে সমর্থন করার জন্য যেখানে cart_cmdCMD_DEL_ITEM এ সংজ্ঞায়িত 'ডেল-আইটেম' স্ট্রিং রয়েছে।

একে একে বাঁধা

আপনি route_message ফাংশনে প্লাম্বিং যোগ করেছেন তা নিশ্চিত করুন যাতে আপনি যদি কার্টে একটি আইটেম যোগ করার জন্য একটি বার্তা পান যেটিকে update_shopping_cart ফাংশন বলা হয়। কোডল্যাব জুড়ে আমরা যে কনভেনশন ব্যবহার করি তা ব্যবহার করে আইটেম যোগ করার জন্য আপনাকে একটি ধ্রুবক সংজ্ঞায়িত করতে হবে।

bonjourmeal-codelab/step-2bopis/views.py

...

CMD_DEL_ITEM = 'del-item'

...

def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
       update_shopping_cart(conversation_id, message)
    else:
        echo_message(message, conversation_id)

...

আপাতত, আমাদের কাছে শপিং কার্টে আইটেম যোগ করার ক্ষমতা আছে। আপনি যদি Google App Engine-এ আপনার পরিবর্তনগুলি স্থাপন করেন, তাহলে আপনি GCP কনসোলে পাওয়া Google Datastore ড্যাশবোর্ডে প্রতিফলিত শপিং কার্টের পরিবর্তনগুলি দেখতে সক্ষম হবেন৷ Google Datastore কনসোলের নীচের স্ক্রিনশটটি দেখুন, সেখানে একটি একক সত্তা রয়েছে যা কথোপকথন আইডির নামানুসারে নামকরণ করা হয়েছে এবং তারপরে ইনভেনটরি আইটেমগুলির সাথে কিছু সম্পর্ক এবং শপিং কার্টে থাকা আইটেমগুলির পরিমাণ।

619dc18a8136ea69.png

পরবর্তী বিভাগে, আমরা শপিং কার্টে আইটেম তালিকাভুক্ত করার একটি উপায় তৈরি করব। শপিং কার্ট পর্যালোচনা পদ্ধতি আমাদের কার্টের সমস্ত আইটেম, সেই আইটেমগুলির পরিমাণ এবং কার্ট থেকে একটি আইটেম সরানোর বিকল্প দেখাতে হবে।

কার্ট আইটেম পর্যালোচনা

শপিং কার্টে থাকা আইটেমগুলিকে তালিকাভুক্ত করাই একমাত্র উপায় যা আমরা শপিং কার্টের অবস্থা বুঝতে পারি এবং আমরা কোন আইটেমগুলি সরাতে পারি তা জানতে পারি৷

আসুন প্রথমে একটি বন্ধুত্বপূর্ণ বার্তা পাঠাই যেমন "এখানে আপনার শপিং কার্ট:" এর পরে অন্য একটি বার্তা যা "একটি সরান" বা "একটি যোগ করুন" এর সাথে সম্পর্কিত প্রস্তাবিত উত্তর সহ একটি সমৃদ্ধ কার্ড ক্যারোজেল রয়েছে৷ রিচ কার্ড ক্যারোজেল অতিরিক্তভাবে কার্টে সংরক্ষিত আইটেমের পরিমাণ তালিকাভুক্ত করা উচিত।

আমরা আসলে প্রবেশ করার আগে এবং আমাদের ফাংশনটি লিখার আগে কিছু সচেতন হতে হবে: যদি শপিং কার্টে শুধুমাত্র এক ধরনের আইটেম থাকে তবে আমরা এটিকে ক্যারোজেল হিসাবে রেন্ডার করতে পারি না। রিচ কার্ড ক্যারোসেলে কমপক্ষে দুটি কার্ড থাকতে হবে। অন্যদিকে, কার্টে কোনো আইটেম না থাকলে, আমরা একটি সাধারণ বার্তা দিতে চাই যা বলে কার্টটি খালি।

এটি মাথায় রেখে, আসুন send_shopping_cart নামে একটি ফাংশন সংজ্ঞায়িত করি। এই ফাংশনটি Google ডেটাস্টোরের সাথে সংযোগ করে এবং কথোপকথন আইডির উপর ভিত্তি করে একটি শপিংকার্ট সত্তার অনুরোধ করে৷ একবার আমাদের কাছে এটি হয়ে গেলে, আমরা get_inventory_data ফাংশনকে কল করব এবং শপিং কার্টের অবস্থা রিপোর্ট করতে একটি সমৃদ্ধ কার্ড ক্যারোজেল ব্যবহার করব৷ আমাদের নাম অনুসারে একটি পণ্যের আইডিও পেতে হবে এবং আমরা সেই মান নির্ধারণ করতে Google ডেটাস্টোরে দেখার জন্য একটি ফাংশন ঘোষণা করতে পারি। যেহেতু ক্যারাউজেল তৈরি করা হচ্ছে, আমরা আইটেমগুলি মুছে ফেলার জন্য বা পণ্য আইডি দ্বারা আইটেম যোগ করার জন্য প্রস্তাবিত উত্তরগুলিকে সংযুক্ত করতে পারি৷ নীচের স্নিপেট এই সমস্ত ক্রিয়াকলাপ সম্পাদন করে। views.py-এ যে কোনো জায়গায় কোডটি কপি করুন।

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_id_by_product_name(product_name):
  inventory = get_inventory_data()
  for item in inventory['food']:
    if item['name'] == product_name:
      return int(item['id'])
  return False


def send_shopping_cart(conversation_id):
  credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)

  # Retrieve the inventory data
  inventory = get_inventory_data()

  # Pull the data from Google Datastore
  client = datastore.Client(credentials=credentials)
  key = client.key('ShoppingCart', conversation_id)
  result = client.get(key)

  shopping_cart_suggestions = [
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='See total price', postbackData='show-cart-price')),
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='Empty the cart', postbackData='empty-cart')),
      BusinessMessagesSuggestion(
          reply=BusinessMessagesSuggestedReply(
              text='See the menu', postbackData=CMD_SHOW_PRODUCT_CATALOG)),
  ]

  if result is None or len(result.items()) == 0:
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='There are no items in your shopping cart.',
        suggestions=shopping_cart_suggestions)

    send_message(message_obj, conversation_id)
  elif len(result.items()) == 1:

    for product_name, quantity in result.items():
      product_id = get_id_by_product_name(product_name)

      fallback_text = ('You have one type of item in the shopping cart')

      rich_card = BusinessMessagesRichCard(
          standaloneCard=BusinessMessagesStandaloneCard(
              cardContent=BusinessMessagesCardContent(
                  title=product_name,
                  description=f'{quantity} in cart.',
                  suggestions=[
                      BusinessMessagesSuggestion(
                          reply=BusinessMessagesSuggestedReply(
                              text='Remove one',
                              postbackData='{'+f'"action":"{CMD_DEL_ITEM}","item_name":"{product_id}"'+'}'))
                  ],
                  media=BusinessMessagesMedia(
                      height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                      contentInfo=BusinessMessagesContentInfo(
                          fileUrl=inventory['food'][product_id]
                          ['image_url'],
                          forceRefresh=False)))))

      message_obj = BusinessMessagesMessage(
          messageId=str(uuid.uuid4().int),
          representative=BOT_REPRESENTATIVE,
          richCard=rich_card,
          suggestions=shopping_cart_suggestions,
          fallback=fallback_text)

      send_message(message_obj, conversation_id)
  else:
    cart_carousel_items = []

    # Iterate through the cart and generate a carousel of items
    for product_name, quantity in result.items():
      product_id = get_id_by_product_name(product_name)

      cart_carousel_items.append(
          BusinessMessagesCardContent(
              title=product_name,
              description=f'{quantity} in cart.',
              suggestions=[
                  BusinessMessagesSuggestion(
                      reply=BusinessMessagesSuggestedReply(
                          text='Remove one',
                          postbackData='{'+f'"action":"{CMD_DEL_ITEM}","item_name":"{product_id}"'+'}'))
              ],
              media=BusinessMessagesMedia(
                  height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                  contentInfo=BusinessMessagesContentInfo(
                      fileUrl=inventory['food'][product_id]
                      ['image_url'],
                      forceRefresh=False))))

    rich_card = BusinessMessagesRichCard(
        carouselCard=BusinessMessagesCarouselCard(
            cardContents=cart_carousel_items,
            cardWidth=BusinessMessagesCarouselCard.CardWidthValueValuesEnum
            .MEDIUM))

    fallback_text = ''

    # Construct a fallback text for devices that do not support carousels
    for card_content in rich_card.carouselCard.cardContents:
      fallback_text += (
          card_content.title + '\n\n' + card_content.description + '\n\n' +
          card_content.media.contentInfo.fileUrl +
          '\n---------------------------------------------\n\n')

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        suggestions=shopping_cart_suggestions,
        fallback=fallback_text,
    )

    send_message(message_obj, conversation_id)

...

নিশ্চিত করুন যে আপনি ইতিমধ্যে views.py-এর শীর্ষে CMD_SHOW_CART সংজ্ঞায়িত করেছেন এবং ব্যবহারকারী 'শো-কার্ট' সম্বলিত একটি বার্তা পাঠালে send_shopping_cart এ কল করুন।

bonjourmeal-codelab/step-2/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
        update_shopping_cart(conversation_id, message)
    elif normalized_message == CMD_SHOW_CART:
        send_shopping_cart(conversation_id)
    else:
        echo_message(message, conversation_id)
...

34801776a97056ac.png

send_shopping_cart ফাংশনে আমরা যে যুক্তিটি চালু করেছি তার উপর ভিত্তি করে, আপনি যখন 'শো-কার্ট'-এ টাইপ করবেন, আমরা হয় কার্টে কিছুই নেই বলে একটি বার্তা পাব, কার্টে একটি আইটেম দেখানো একটি সমৃদ্ধ কার্ড, অথবা একটি ক্যারোজেল কার্ডগুলি একাধিক আইটেম দেখাচ্ছে। উপরন্তু, আমাদের কাছে তিনটি প্রস্তাবিত উত্তর আছে: "মোট মূল্য দেখুন", "কার্ট খালি করুন" এবং "মেনু দেখুন"।

আপনার শপিং কার্ট আপনার যোগ করা আইটেমগুলিকে ট্র্যাক করছে এবং উপরের স্ক্রিনশটগুলিতে দেখানো হিসাবে আপনি কথোপকথনের পৃষ্ঠ থেকে কার্ট পর্যালোচনা করতে পারেন তা পরীক্ষা করতে উপরের কোড পরিবর্তনগুলি স্থাপন করার চেষ্টা করুন৷ আপনি p step-2 ডিরেক্টরি থেকে চালানো এই কমান্ডের সাহায্যে পরিবর্তনগুলি স্থাপন করতে পারেন যেখানে আপনি আপনার পরিবর্তনগুলি যোগ করছেন।

$ gcloud app deploy

কার্ট থেকে একটি আইটেম সরানোর কার্যকারিতা তৈরি করার পরে আমরা পরবর্তী বিভাগে "মোট মূল্য দেখুন" বৈশিষ্ট্যটি তৈরি করব৷ get_cart_price ফাংশনটি "শপিং কার্ট দেখুন" বৈশিষ্ট্যের অনুরূপ আচরণ করবে এই অর্থে যে এটি শপিং কার্টের মোট মূল্য তৈরি করতে inventory.json ফাইলের সাথে ডেটাস্টোরে ডেটা ক্রস-রেফারেন্স করবে। কোডল্যাবের পরবর্তী অংশের জন্য এটি কার্যকর হবে যেখানে আমরা অর্থপ্রদানের সাথে একীভূত করি।

কার্ট থেকে আইটেম সরানো হচ্ছে

অবশেষে, কার্টটি সরানোর জন্য কার্যকারিতা প্রবর্তন করে আমরা শপিং কার্টের আচরণ সম্পূর্ণ করতে পারি। বিদ্যমান update_shopping_cart ফাংশনটি নিম্নলিখিত স্নিপেট দিয়ে প্রতিস্থাপন করুন।

bonjourmeal-codelab/step-2/ bopis/views.py

def update_shopping_cart(conversation_id, message):
    credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_LOCATION)
    inventory = get_inventory_data()

    cart_request = json.loads(message)
    cart_cmd = cart_request["action"]
    cart_item = cart_request["item_name"]

    item_name = inventory['food'][int(cart_item)]['name']


    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    if result is None:
        if cart_cmd == CMD_ADD_ITEM:
            entity.update({
                item_name: 1
            })
        elif cart_cmd == CMD_DEL_ITEM:
            # The user is trying to delete an item from an empty cart. Pass and skip
            pass

    else:
        if cart_cmd == CMD_ADD_ITEM:
            if result.get(item_name) is None:
                result[item_name] = 1
            else:
                result[item_name] = result[item_name] + 1

        elif cart_cmd == CMD_DEL_ITEM:
            if result.get(item_name) is None:
                # The user is trying to remove an item that's no in the shopping cart. Pass and skip
                pass
            elif result[item_name] - 1 > 0:
                result[item_name] = result[item_name] - 1
            else:
                del result[item_name]

        entity.update(result)
    client.put(entity)

একটি নিশ্চিতকরণ বার্তা পাঠানো হচ্ছে

যখন ব্যবহারকারী কার্টে একটি আইটেম যোগ করে, তখন আপনাকে তাদের পদক্ষেপ স্বীকার করে একটি নিশ্চিতকরণ বার্তা পাঠাতে হবে এবং আপনি তাদের অনুরোধটি প্রক্রিয়া করেছেন। এটি শুধুমাত্র প্রত্যাশা সেট করতে সহায়তা করে না, তবে এটি কথোপকথনও চালিয়ে যায়।

আসুন update_shopping_cart ফাংশনটি প্রসারিত করি যাতে এটি কথোপকথন আইডিতে একটি বার্তা পাঠায় যে আইটেমটি যোগ করা হয়েছে বা সরানো হয়েছে এবং তাদের শপিং কার্ট পর্যালোচনা বা মেনুটি আবার দেখার পরামর্শ দেয়।

bonjourmeal-codelab/step-2/bopis/views.py

def update_shopping_cart(conversation_id, message):

     # No changes to the function, except appending the following logic
     ...
   
    if cart_cmd == CMD_ADD_ITEM:
        message = 'Great! You\'ve added an item to the cart.'
    else:
        message = 'You\'ve removed an item from the cart.'

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message,
        suggestions=[
            BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='Review shopping cart',
                postbackData=CMD_SHOW_CART)
            ),
            BusinessMessagesSuggestion(
            reply=BusinessMessagesSuggestedReply(
                text='See menu again',
                postbackData=CMD_SHOW_PRODUCT_CATALOG)
            ),
            ])
    send_message(message_obj, conversation_id)

905a1f3d89893ba0.png

যে এটা করা উচিত! একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত শপিং কার্টের অভিজ্ঞতা যা একজন ব্যবহারকারীকে আইটেম যোগ করতে, আইটেমগুলি সরাতে এবং কার্টে আইটেমগুলি পর্যালোচনা করতে সক্ষম করে৷

এই মুহুর্তে, আপনি যদি ব্যবসা বার্তা কথোপকথনে শপিং কার্টের কার্যকারিতা দেখতে চান, আপনার এজেন্টের সাথে যোগাযোগ করার জন্য অ্যাপ্লিকেশনটি স্থাপন করুন৷ আপনি ধাপ-2 ডিরেক্টরিতে এই কমান্ডটি চালিয়ে তা করতে পারেন।

$ gcloud app deploy

5. অর্থপ্রদানের জন্য প্রস্তুতি

সিরিজের পরবর্তী অংশে একটি পেমেন্ট প্রসেসরের সাথে একীভূত করার প্রস্তুতির জন্য, আমাদের শপিং কার্টের মূল্য পেতে একটি উপায় প্রয়োজন। আসুন একটি ফাংশন তৈরি করি যা Google ডেটাস্টোরে শপিং কার্ট ডেটা ক্রস রেফারেন্স করে, ইনভেন্টরি থেকে প্রতিটি আইটেমের মূল্য পুনরুদ্ধার করে এবং কার্টের প্রতিটি আইটেমের পরিমাণ দ্বারা মূল্যকে গুণ করে আমাদের জন্য মূল্য পুনরুদ্ধার করে৷

bonjourmeal-codelab/step-2/bopis/views.py

...
def get_cart_price(conversation_id):
    # Pull the data from Google Datastore
    credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_LOCATION)
    client = datastore.Client(credentials=credentials)
    key = client.key('ShoppingCart', conversation_id)
    entity = datastore.Entity(key=key)
    result = client.get(key)

    # Retrieve the inventory data
    inventory = get_inventory_data()
   
    # Start off with a total of 0 before adding up the total
    total_price = 0

    if len(result.items()) != 0:
      for product_name, quantity in result.items():
        total_price = total_price + float(
            inventory['food'][get_id_by_product_name(product_name)]['price']) * int(quantity)

    return total_price

...

এবং অবশেষে, আমরা সেই ফাংশনটি ব্যবহার করতে পারি এবং ব্যবহারকারীকে একটি বার্তা পাঠাতে পারি।

bonjourmeal-codelab/step-2/bopis/views.py

...

def send_shopping_cart_total_price(conversation_id):
    cart_price = get_cart_price(conversation_id)

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        suggestions=[],
        text=f'Your cart\'s total price is ${cart_price}.')

    send_message(message_obj, conversation_id)
...

এটিকে একসাথে বাঁধতে, আসুন উপরের যুক্তিটিকে ট্রিগার করার জন্য route_message ফাংশন এবং ধ্রুবক আপডেট করি।

bonjourmeal-codelab/step-2/bopis/views.py

...
CMD_GET_CART_PRICE = 'show-cart-price'
...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    elif normalized_message == CMD_SHOW_PRODUCT_CATEGORY:
        send_product_catalog(conversation_id)
    elif CMD_ADD_ITEM in normalized_message or CMD_DEL_ITEM in normalized_message:
        update_shopping_cart(conversation_id, message)
    elif normalized_message == CMD_SHOW_CART:
        send_shopping_cart(conversation_id)
    elif normalized_message == CMD_GET_CART_PRICE:
        send_shopping_cart_total_price(conversation_id)
    else:
        echo_message(message, conversation_id)
...

উপরের যুক্তিটি কী অর্জন করে তা দেখানোর জন্য এখানে কিছু স্ক্রিনশট রয়েছে:

8feacf94ed0ac6c4.png

যখন আমরা কোডল্যাবের পরবর্তী অংশে পেমেন্ট প্রসেসরের সাথে একীভূত হতে প্রস্তুত, আমরা পেমেন্ট প্রসেসরে ডেটা পাস করার জন্য get_cart_price ফাংশনকে কল করব এবং পেমেন্ট প্রবাহ শুরু করব।

আবার, আপনি অ্যাপ্লিকেশনটি স্থাপন করে এবং আপনার এজেন্টের সাথে ইন্টারঅ্যাক্ট করে ব্যবসায়িক বার্তা কথোপকথনে এই শপিং কার্ট কার্যকারিতা চেষ্টা করতে পারেন।

$ gcloud app deploy

6. অভিনন্দন

অভিনন্দন, আপনি ব্যবসায়িক বার্তাগুলির মধ্যে সফলভাবে একটি শপিং কার্ট অভিজ্ঞতা তৈরি করেছেন৷

এই কোডল্যাবে আমরা যা করিনি তা হল পুরো শপিং কার্ট খালি করার বৈশিষ্ট্য। আপনি যদি চান, "কার্ট খালি করুন" বৈশিষ্ট্যটি পূরণ করতে অ্যাপ্লিকেশনটি প্রসারিত করার চেষ্টা করুন৷ সমাধানটি আপনার ক্লোন করা সোর্স কোডের ধাপ-3-এ উপলব্ধ।

ভবিষ্যতের একটি বিভাগে, আমরা আপনার ব্যবহারকারীদের আপনার ব্র্যান্ডের সাথে একটি অর্থপ্রদানের লেনদেন সম্পূর্ণ করতে সক্ষম করার জন্য একটি বহিরাগত অর্থপ্রদান প্রসেসরের সাথে একীভূত করব৷

কি একটি ভাল শপিং কার্ট তোলে?

একটি কথোপকথনে একটি ভাল শপিং কার্টের অভিজ্ঞতা একটি মোবাইল অ্যাপ বা একটি ফিজিক্যাল স্টোরের চেয়ে আলাদা নয়। আইটেম যোগ করতে, আইটেমগুলি সরাতে এবং কার্টের মূল্য গণনা করতে সক্ষম হওয়া মাত্র কয়েকটি বৈশিষ্ট্য যা আমরা এই কোডল্যাবে অন্বেষণ করেছি। একটি বাস্তব বিশ্বের শপিং কার্ট থেকে ভিন্ন কিছু যা আপনি আইটেম যোগ বা আইটেম সরানোর সাথে সাথে যে কোনো মুহূর্তে কার্টের সমস্ত আইটেমের মূল্য দেখতে সক্ষম হচ্ছে৷ এই ধরনের উচ্চ-মূল্যের বৈশিষ্ট্যগুলি আপনার কথোপকথন বাণিজ্য অভিজ্ঞতাকে আলাদা করে তুলবে!

এরপর কি?

আপনি প্রস্তুত হলে, ব্যবসা বার্তাগুলিতে আপনি অর্জন করতে পারেন এমন আরও জটিল মিথস্ক্রিয়া সম্পর্কে জানতে নিম্নলিখিত বিষয়গুলির মধ্যে কয়েকটি দেখুন:

রেফারেন্স ডক্স