Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

تحديات برمجيةالتحدي الثاني - الحل بلغة بايثون

فكرة المشروع

في هذا التمرين سنفترض أننا نقوم بتخزين بيانات لمؤسسة صغيرة.
البيانات التي نريد تخزينها هي التالية:

  • الموظفين الذين يعملون في المؤسسة (الإسم, الهاتف, الجنس, دوام العمل, أيام العمل).
  • الزبائن الذين يشترون من المؤسسة (الإسم, الهاتف, الجنس, البريد الإلكتروني).
  • المنتجات التي تبيعها المؤسسة (إسم المنتج و سعره).
  • الفواتير الخاصة ببيع المنتجات (تاريخ البيع, هل تم الدفع أم لا, بيانات المشتري, المنتجات التي تم شراءها).

ملاحظة: رقم التعرفة لكل من الأشخاص, المنتجات, الفواتير يجب أن يتم إعطاؤه لهم بشكل تلقائي.


الشكل العام لأقسام المشروع


شرح أقسام المشروع

Person يمثل المعلومات المشتركة بين الموظف و الزبون.
Client يمثل المعلومات الإضافية الخاصة بالزبون و غير موجودة عند الموظف.
Employee يمثل المعلومات الإضافية الخاصة الموظف و غير موجودة عند الزبون.
Product يمثل أي منتج تبيعه الشركة.
Order يمثل فواتير بيع المنتجات و لاحظ أن كل فاتورة سيتم فيها بيع مجموعة من المنتجات و كل فاتورة سيتم إصدارها لشخص محدد.
add_product(): مهمتها إضافة منتج جديد.
add_person(): مهمتها إضافة شخص جديد سواء موظف أو زبون.
add_order(): مهمتها إضافة فاتورة جديدة.
remove_product(): مهمتها حذف منتج من خلال id المنتج الذي نمرره لها عند استدعائها.
remove_person(): مهمتها حذف شخص من خلال id الشخص الذي نمرره لها عند استدعائها.
remove_order(): مهمتها حذف فاتورة من خلال id الفاتورة الذي نمرره لها عند استدعائها.
print_person_info(): مهمتها عرض كل معلومات الشخص من خلال id الشخص الذي نمرره لها عند استدعائها.
print_product_details(): مهمتها عرض كل معلومات المنتج من خلال id المنتج الذي نمرره لها عند استدعائها.
print_order_details(): مهمتها عرض كل معلومات الفاتورة من خلال id الفاتورة الذي نمرره لها عند استدعائها.
print_person_orders(): مهمتها عرض كل فواتير الشخص من خلال id الشخص الذي نمرره لها عند استدعائها.
print_extra_info(): مهمتها عرض كل المعلومات المتوفرة حول الشخص سواء كان موظف أو زبون.

قم بتحويل الرسم إلى كود. ثم قم بإنشاء مجموعة موظفين, زبائن, منتجات و فواتير. و قم بتجربة جميع الدوال في البرنامج.


معلومة

لإعطاء رقم id موحد لكل كائن يتم إنشاؤه, يمكنك تعريف متغير في الكلاس و الأفضل جعله مخفياً ( من خلال وضع الرمز __ قبل إسمه ) حتى لا يمكن رؤيته مع باقي متغيرات الكلاس من الكائنات التي ننشئها منه. بعدها تقوم فقط بجعل قيمته تزيد 1 كلما قمت بإنشاء كائن من هذا الكلاس و من ثم تضع قيمته في المتغير id.

ملاحظة: سنقوم بإنشاء متغير إسمه __id_incrementer في الكلاسات Person, Product و Order من أجل هذا الهدف فقط.


الحل بلغة بايثون

Person.py
# و الذي سيحتوي على جميع الخصائص التي سيمكلها أي شخص Person هنا قمنا بتعريف الكلاس
class Person:
    # بتعريفه هنا و هكذا ليكون موحد بالنسبة لجميع الكائنات التي ننشئها من هذا الكلاس idIncrementer المتغير
    __id_incrementer = 0

    # هنا قمنا بتعريف الخصائص الأساسية التي يجب أن يملكها الشخص و التي يمكننا تحديد قيمها عند إنشاء كائن من هذا الكلاس
    # الخاسة بالكائن id تزيد 1 في كل مرة و من ثم يتم وضعها في الخاصية idIncrementer لاحظ أننا قمنا بجعل قيمة
    # القيم الأخرى التي يتم تمريرها للكائن سيتم تخزينها كما هي
    def __init__(self, name, phone, gender):
        Person.__id_incrementer += 1
        self.id = Person.__id_incrementer
        self.name = name
        self.phone = phone
        self.gender = gender

Client.py
from Person import Person


# الذي وضعنا فيه المعلومات الأساسية التي يجب أن يملكها أي زبون Client هنا قمنا بتعريف الكلاس
# email لأن الزبون عبارة عن شخص عادي و لكنه يملك الخاصية الإضافية Person هذا الكلاس يرث من الكلاس
class Client(Person):

    # هنا قمنا بتعريف كونستركتور للكلاس حتى نستطيع إسناد قيم للخصائص بشكل مباشر بواسطته
    # super() عن طريق الدالة Person سيتم إسناد قيم لها من خلال كونستركتور الكلاس name, phone, gender الخصائص
    # id سيتولى أمر توليد قيمة للمتغير Person أيضاَ, لا تنسى أن كونستركتور الكلاس
    def __init__(self, name, phone, gender, email):
        super().__init__(name, phone, gender)
        self.email = email

Employee.py
from Person import Person


# الذي وضعنا فيه المعلومات الأساسية التي يجب أن يملكها أي موظف Employee هنا قمنا بتعريف الكلاس
# workingTime و salary لأن الموظف عبارة عن شخص عادي و لكنه يملك خصائص إضافية هي Person هذا الكلاس يرث من الكلاس
class Employee(Person):

    # هنا قمنا بتعريف كونستركتور للكلاس حتى نستطيع إسناد قيم للخصائص بشكل مباشر بواسطته
    # super() عن طريق الدالة Person سيتم إسناد قيم لها من خلال كونستركتور الكلاس name, phone, gender الخصائص
    # id سيتولى أمر توليد قيمة للمتغير Person أيضاَ, لا تنسى أن كونستركتور الكلاس
    def __init__(self, name, phone, gender, salary, working_time):
        super().__init__(name, phone, gender)
        self.salary = salary
        self.working_time = working_time

Product.py
# الذي وضعنا فيه المعلومات الأساسية التي يجب أن يملكها أي منتج Product هنا قمنا بتعريف الكلاس
class Product:

    # بتعريفه هنا و هكذا ليكون موحد بالنسبة لجميع الكائنات التي ننشئها من هذا الكلاس idIncrementer المتغير
    __id_incrementer = 0

    # هنا قمنا بتعريف الخصائص الأساسية التي يجب أن يملكها المنتج و التي يمكننا تحديد قيمها عند إنشاء كائن من هذا الكلاس
    # الخاسة بالكائن id تزيد 1 في كل مرة و من ثم يتم وضعها في الخاصية idIncrementer لاحظ أننا قمنا بجعل قيمة
    # القيم الأخرى التي يتم تمريرها للكائن سيتم تخزينها كما هي
    def __init__(self, name, price):
        Product.__id_incrementer += 1
        self.id = Product.__id_incrementer
        self.name = name
        self.price = price

Order.py
# و الذي سيحتوي على جميع الخصائص التي ستملكها أي فاتورة Order هنا قمنا بتعريف الكلاس
class Order:

    # بتعريفه هنا و هكذا ليكون موحد بالنسبة لجميع الكائنات التي ننشئها من هذا الكلاس idIncrementer المتغير
    __id_incrementer = 0

    # هنا قمنا بتعريف الخصائص الأساسية التي يجب أن يملكها الفاتورة و التي يمكننا تحديد قيمها عند إنشاء كائن من هذا الكلاس
    # الخاسة بالكائن id تزيد 1 في كل مرة و من ثم يتم وضعها في الخاصية idIncrementer لاحظ أننا قمنا بجعل قيمة
    # القيم الأخرى التي يتم تمريرها للكائن سيتم تخزينها كما هي
    def __init__(self, date, is_paid, person, products):
        Order.__id_incrementer += 1
        self.id = Order.__id_incrementer
        self.date = date
        self.is_paid = is_paid
        self.person = person
        self.products = products

Company.py
from Client import Client
from Employee import Employee


# يمثل كل ما تحتويه المكتبة من كتب و مؤلفين و الدوال التي يمكن استخدامها للتعامل معهم Company هنا قمنا بتعريف الكلاس
class Company:
    # سنضع فيها كل معلومات الفواتير orders سنضع فيها كل معلومات الكتب. المصفوفة orders سنضع فيها كل معلومات الأشخاص. المصفوفة persons المصفوفة
    persons = []
    products = []
    orders = []

    # product بداخل المصفوفة Product يمكن استخدامها لإضافة كائن من الكلاس add_product() الدالة
    def add_product(self, product):
        self.products.append(product)

    # persons بداخل المصفوفة Person يمكن استخدامها لإضافة كائن من الكلاس add_person() الدالة
    def add_person(self, person):
        self.persons.append(person)

    # orders بداخل المصفوفة Order يمكن استخدامها لإضافة كائن من الكلاس add_order() الدالة
    def add_order(self, order):
        self.orders.append(order)

    # الخاص به id بالإعتماد على رقم الـ products موضوع بداخل المصفوفة Product يمكن استخدامها لإلغاء كائن من الكلاس remove_product() الدالة
    def remove_product(self, id):
        # product و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن products بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for product in self.products:
            # الذي مررناه للدالة سيتم حذفه و من ثم الخروج من الدالة id يملك نفس رقم الـ product في حال كان الكائن
            if product.id == id:
                self.products.remove(product)
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ products في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Product with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ persons موضوع بداخل المصفوفة Person يمكن استخدامها لإلغاء كائن من الكلاس remove_person() الدالة
    def remove_person(self, id):
        # person و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن persons بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for person in self.persons:
            # الذي مررناه للدالة سيتم حذفه و من ثم الخروج من الدالة id يملك نفس رقم الـ person في حال كان الكائن
            if person.id == id:
                self.persons.remove(person)
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ persons في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Person with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ orders موضوع بداخل المصفوفة Order يمكن استخدامها لإلغاء كائن من الكلاس remove_order() الدالة
    def remove_order(self, id):
        # order و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن orders بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for order in self.orders:
            # الذي مررناه للدالة سيتم حذفه و من ثم الخروج من الدالة id يملك نفس رقم الـ order في حال كان الكائن
            if order.id == id:
                self.orders.remove(order)
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ orders في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Order with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ persons يمكن استخدامها لطباعة كل المعلومات المتوفرة حول شخص موضوع بداخل المصفوفة print_person_info() الدالة
    def print_person_info(self, id):
        # person و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن persons بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for person in self.persons:
            # الذي مررناه للدالة سيتم طباعة كل معلوماته و من ثم الخروج من الدالة id يملك نفس رقم الـ person في حال كان الكائن
            if person.id == id:
                print("Person with id", id, "info.")
                print("Name:", person.name)
                print("Phone:", person.phone)
                print("Gender", person.gender)

                # التي يملكها email سيتم طباعة الخاصية Client تم إنشاؤه من الكلاس person إذا كان الكائن
                if isinstance(person, Client):
                    print("Email:", person.email)

                # التي يملكها workingTime و salary سيتم طباعة الخاصيتين Employee تم إنشاؤه من الكلاس person إذا كان الكائن
                elif isinstance(person, Employee):
                    print("Salary:", person.salary)
                    print("Working time", person.working_time)

                # بعدها سيتم طباعة خط و الخروج من الدالة
                print("----------------------")
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ persons في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Person with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ products يمكن استخدامها لطباعة كل المعلومات المتوفرة حول منتج موضوع بداخل المصفوفة print_product_details() الدالة
    def print_product_details(self, id):
        # product و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن products بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for product in self.products:
            # الذي مررناه للدالة سيتم طباعة كل معلوماته و من ثم الخروج من الدالة id يملك نفس رقم الـ product في حال كان الكائن
            if product.id == id:
                print("Product with id", id, "info.")
                print("Name:", product.name)
                print("Price:", str(product.price) + "$")
                print("----------------------")
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ products في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Product with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ orders يمكن استخدامها لطباعة كل المعلومات المتوفرة حول فاتورة موضوعة بداخل المصفوفة print_order_details() الدالة
    def print_order_details(self, id):
        # سنستخدمه لحساب ناتج جمع جميع أسعار المنتجات التي نجدها في الفاتورة total_sum المتغير
        total_sum = 0
        # order و كل كائن نمر عليه ( و الذي يمثل كتاب ) سنضعه بشكل مؤقته بداخل الكائن orders هنا سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for order in self.orders:
            # الذي مررناه للدالة سيتم طباعة كل معلوماته id يملك نفس رقم الـ order في حال كان الكائن
            if order.id == id:
                print("Order with id", id, "details.")
                print("Date:", order.date)
                print("Is paid:", "yes" if order.is_paid else "no")
                print("Ordered by:", order.person.name)
                print("Products")
                # order الموضوعة في الكائن products هنا سنمر على جميع الكائنات المخزنة بداخل المصفوفة
                # product كل كائن نمر عليه ( و الذي يمثل منتج ) سنضعه بشكل مؤقته بداخل الكائن
                # total_sum سعر كل منتج يتم إيجاده في هذه المصفوفة سيتم إضافته على قيمة المتغير
                for product in order.products:
                    total_sum += product.price
                    print("- " + product.name + ": " + str(product.price) + "$")
                
                #  و الذي يمثل ثمن كل المشتريات الموضوعة في الفاتورة و من ثم الخروج من الدالة total_sum هنا سيتم عرض ناتج الجمع الذي تم تخزينه في المتغير
                print("Total Price: " + str(total_sum) + "$")
                print("----------------------")
                return
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية id يملك نفس رقم الـ orders في حال لم يتم إيجاد أي كائن في المصفوفة
        print("Order with id", id, "is not found!")
        print("----------------------")

    # الخاص به id بالإعتماد على رقم الـ persons يمكن استخدامها لطباعة كل معلومات الفواتير التابعة لشخص موضوع بداخل المصفوفة print_person_orders() الدالة 
    def print_person_orders(self, id):
        # الذي تم تمريره للدالة id يملك رقم الـ persons بهدف التأكد ما إن كان يوجد شخص في المصفوفة isPersonExist سنستخدم المتغير
        # تابعو لهذا الشخص لأن ذلك سيكون غير منطقي orders لأنه إن لم يكن هناك شخص أصلاً فلن نقوم بالبحث عن فواتير في المصفوفة
        is_person_exist = False
        # person و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن persons هنا سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for person in self.persons:
            # الذي مررناه للدالة سيتم تغيير قيمة id يملك نفس رقم الـ person في حال كان الكائن
            # persons و إيقاف الحلقة لأننا تأكدنا أن هذا الشخص موجود في المصفوفة True إلى is_person_exist
            if person.id == id:
                is_person_exist = True
                break
        # persons فهذا يعني أنه لم يتم إيجاد أي كائن في المصفوفة False تساوي is_person_exist في حال بقيت قيمة
        # الذي تم تمريره للدالة سيتم طباعة الجملة التالية و الخروج من الدالة id يملك نفس رقم الـ
        if not is_person_exist:
            print("Person with id", id, "is not found!")
            print("----------------------")
            return
        print("All orders made by person with id " + str(id) + ":")
        # order و كل كائن نمر عليه سنضعه بشكل مؤقته بداخل الكائن orders بواسطة هذه الحلقة سنمر على جميع الكائنات المخزنة بداخل المصفوفة
        for order in self.orders:
            # ( الذي مررناه للدالة سيتم طباعة معلوماته ( أي معلومات الفاتورة id يملك نفس رقم الـ order الموضوع في الكائن person في حال كان الكائن
            if order.person.id == id:
                print("> Order: #" + str(order.id))
                print("  Date:", order.date)
                print("  Is paid:", "yes" if order.is_paid else "no")
                print("  Ordered by:", order.person.name)
                print("  Products")
                # سنستخدمه لحساب ناتج جمع جميع أسعار المنتجات التي نجدها في كل فاتورة total_sum المتغير
                total_sum = 0
                # order الموضوعة في الكائن products هنا سنمر على جميع الكائنات المخزنة بداخل المصفوفة
                # product كل كائن نمر عليه ( و الذي يمثل منتج ) سنضعه بشكل مؤقته بداخل الكائن
                # totalSum سعر كل منتج يتم إيجاده في هذه المصفوفة سيتم إضافته على قيمة المتغير
                for product in order.products:
                    total_sum += product.price
                    print("  - " + product.name + ": " + str(product.price) + "$")
                # و الذي يمثل ثمن كل المشتريات الموضوعة في الفاتورة total_sum هنا سيتم عرض ناتج الجمع الذي تم تخزينه في المتغير
                print("  Total Price: " + str(total_sum) + "$")
        print("----------------------")

Main.py
from Client import Client
from Employee import Employee
from Product import Product
from Order import Order
from Company import Company

# أي كأننا قمنا بإنشاء شخصين Person هنا قمنا بإنشاء كائنين من كلاسات ترث من الكلاس
# و بالتالي فإنه يمثل شخص يعتبر زبون Client عبارة عن كائن من الكلاس person1
# و بالتالي فإنه يمثل شخص يعتبر موظف Employee عبارة عن كائن من الكلاس person2
person1 = Client("Mhamad", "+96170123456", "Male", "mhamad@example.com")
person2 = Employee("Nadine", "+9631249392", "Female", 800, "8:00 AM to 3:00 PM")

# و التي تمثل 6 منتجات Product هنا قمنا بتعريف 6 كائنات من الكلاس
product1 = Product("Keyboard", 15)
product2 = Product("Camera", 45)
product3 = Product("HDD 1TB", 70)
product4 = Product("SSD 1TB", 274.66)
product5 = Product("Mouse", 8)
product6 = Product("Table", 44.55)

# و التي تمثل فواتير Order هنا قمنا بتعريف 3 كائنات من الكلاس
# person1 وضعناهما لنفس الشخص الذي يمثل الكائن order2 و order1 لاحظ أن الفاتورتين
order1 = Order("2020-1-1", True, person1, [product1, product2, product3])
order2 = Order("2020-2-7", True, person1, [product4])
order3 = Order("2020-5-4", False, person2, [product5, product6])

# لأننا نريد تخزين الأشخاص و المنتجات و الفواتير بشكل مرتب بداخله Company هنا قمنا بإنشاء كائن من الكلاس
company = Company()

# add_person() بواسطة الدالة company التي يمكلها الكائن persons هنا قمنا بإضافة الشخصين في المصفوفة
company.add_person(person1)
company.add_person(person2)

# add_product() بواسطة الدالة company التي يمكلها الكائن products هنا قمنا بإضافة المنتجات في المصفوفة
company.add_product(product1)
company.add_product(product2)
company.add_product(product3)
company.add_product(product4)
company.add_product(product5)
company.add_product(product6)

# add_order() بواسطة الدالة company التي يمكلها الكائن orders هنا قمنا بإضافة الفواتير في المصفوفة
company.add_order(order1)
company.add_order(order2)
company.add_order(order3)

# print_person_info() الخاص بهم و بواسطة الدالة id هنا قمنا بطباعة معلومات كلا الشخصين بالإعتماد على رقم التعرفة
# تذكر: رقم التعرفة الخاص بكل شخص تم إنشاؤه بشكل تلقائي عند إنشاء كل شخص بداخل الكونستركتور
company.print_person_info(1)
company.print_person_info(2)

# print_product_details() الخاص بهم و بواسطة الدالة id هنا قمنا بطباعة معلومات كل المنتجات بالإعتماد على رقم التعرفة
# تذكر: رقم التعرفة الخاص بكل منتج تم إنشاؤه بشكل تلقائي عند إنشاء كل منتج بداخل الكونستركتور
company.print_product_details(1)
company.print_product_details(2)
company.print_product_details(3)
company.print_product_details(4)
company.print_product_details(5)
company.print_product_details(6)

# print_person_orders() الخاص بهم و بواسطة الدالة id هنا قمنا بطباعة الفواتير التي يملكها كل شخص بالإعتماد على رقم التعرفة
company.print_person_orders(1)
company.print_person_orders(2)

# remove_order() هنا قمنا الفاتورة التي تملك رقم التعرفة 1 بواسطة الدالة
# printOrderDetails() بعدها حاولنا طباعة معلومات الفاتورة التي قمنا بحذفها بواسطة الدالة
# بعدها قمنا بطباعة جمبع الفواتير التي يمكلها الشخص الذي يملك رقم التعرفة 1 و الذي كان يملك الفاتورة التي تم حذفها
# لاحظ أن الفاتورة المحذوفة أيضاَ لم تظر ضمن فواتيره
company.remove_order(1)
company.print_order_details(1)
company.print_person_orders(1)

سنحصل على النتيجة التالية عند التشغيل.

Person with id 1 info.   --> الموضوعة في السطر 49 print_person_info() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Mhamad
Phone: +96170123456
Gender: Male
Email: mhamad@example.com
----------------------
Person with id 2 info.   --> الموضوعة في السطر 50 print_person_info() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Nadine
Phone: +9631249392
Gender: Female
Salary: 800$
Working time: 8:00 AM to 3:00 PM
----------------------
Product with id 1 details.   --> الموضوعة في السطر 54 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Keyboard
Price: 15$
----------------------
Product with id 2 details.   --> الموضوعة في السطر 55 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Camera
Price: 45$
----------------------
Product with id 3 details.   --> الموضوعة في السطر 56 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: HDD 1TB
Price: 70$
----------------------
Product with id 4 details.   --> الموضوعة في السطر 57 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: SSD 1TB
Price: 274.66$
----------------------
Product with id 5 details.   --> الموضوعة في السطر 58 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Mouse
Price: 8$
----------------------
Product with id 6 details.   --> الموضوعة في السطر 59 print_product_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
Name: Table
Price: 44.55$
----------------------
All orders made by person with id 1:   --> الموضوعة في السطر 62 print_person_orders() تم عرض هذا المحتوى بسبب استدعاء الدالة
> Order: #1
  Date: 2020-1-1
  Is paid: yes
  Ordered by: Mhamad
  Products:
  - Keyboard: 15$
  - Camera: 45$
  - HDD 1TB: 70$
  Total Price: 130$
> Order: #2
  Date: 2020-2-7
  Is paid: yes
  Ordered by: Mhamad
  Products:
  - SSD 1TB: 274.66$
  Total Price: 274.66$
----------------------
All orders made by person with id 2:   --> الموضوعة في السطر 63 print_person_orders() تم عرض هذا المحتوى بسبب استدعاء الدالة
> Order: #3
  Date: 2020-5-4
  Is paid: no
  Ordered by: Nadine
  Products:
  - Mouse: 8$
  - Table: 44.55$
  Total Price: 52.55$
----------------------
Order with id 1 is not found!   --> الموضوعة في السطر 70 print_order_details() تم عرض هذا المحتوى بسبب استدعاء الدالة
----------------------
All orders made by person with id 1:   --> الموضوعة في السطر 71 print_person_orders() تم عرض هذا المحتوى بسبب استدعاء الدالة
> Order: #2
  Date: 2020-2-7
  Is paid: yes
  Ordered by: Mhamad
  Products:
  - SSD 1TB: 274.66$
  Total Price: 274.66$
----------------------