def execute_transaction(self, username: str, shopping_cart,
                         payment_method: str, payment_details,
                         address: DeliveryAddress, account_number: int):
     if not self.check_availability_of_products(shopping_cart):
         return MessageResponse(
             False, 1, "Not all the products are available in this amount")
     TransactionManagement.transaction_counter += 1
     transaction = Transaction(self.transaction_counter,
                               shopping_cart['products'], username,
                               payment_method, payment_details, address,
                               account_number,
                               shopping_cart['store_number'])
     cart = ShoppingCart(shopping_cart["store_number"],
                         shopping_cart['products'])
     # until here yet
     transaction.total_price = cart.calculate_price()
     if self.payment_system.charge(username, payment_details[0],
                                   payment_details[1], payment_details[2],
                                   payment_details[3],
                                   payment_details[4]) == 'declined':
         return MessageResponse(False, 1, "payment problem")
     transaction.update_payment_status()
     if self.delivery_system.delivery(transaction.products,
                                      address) == 'undelivered':
         return MessageResponse(False, 1,
                                'delivery problem, payment were cancelled')
     transaction.update_delivery_status()
     self.transactions.append(transaction)
     self.remove_products_from_store(shopping_cart)
     return MessageResponse(
         transaction, 1,
         'succeed transaction' + str(transaction.transaction_id))