Menu
Coddy logo textTech

Exibindo o Recibo Final

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy. Lição 37 de 65.

challenge icon

Desafio

Fácil

Crie um programa que conclua o projeto do calculador de carrinho de compras gerando um recibo final abrangente que exiba todos os detalhes da transação em um formato profissional. Com base no sistema de descontos da lição anterior, seu programa deve:

  1. Usar o Map de catálogo de produtos existente e a funcionalidade do carrinho de compras da configuração anterior
  2. Ler várias entradas de string que representem os itens que os clientes desejam adicionar ao carrinho (a entrada terminará quando você receber "cart_done")
  3. Para cada item, verificar se ele existe no catálogo de produtos usando containsKey() e adicionar os itens válidos ao carrinho
  4. Calcular o subtotal somando todos os preços dos itens no carrinho
  5. Ler uma entrada de string que represente o valor limite do desconto
  6. Ler uma entrada de string que represente a porcentagem de desconto a ser aplicada
  7. Aplicar o desconto somente se o subtotal atingir ou exceder o valor limite
  8. Calcular o valor do desconto e o total final após aplicar o desconto
  9. Ler uma entrada de string que represente o nome do cliente
  10. Ler uma entrada de string que represente o ID da transação
  11. Gerar e exibir um recibo completo com todos os detalhes da transação no formato exato mostrado abaixo

Por exemplo, se a loja tiver os produtos "Apple" por 1.50, "Banana" por 0.80, "Orange" por 2.00, "Milk" por 3.25, os clientes quiserem adicionar "Apple", "Orange", "Milk", "Apple", o limite do desconto for 5.00, a porcentagem de desconto for 10, o nome do cliente for "John Smith" e o ID da transação for "TXN001", seu programa deverá produzir:

Shopping Cart Operations:
Adding 'Apple': Item added to cart successfully
Adding 'Orange': Item added to cart successfully
Adding 'Milk': Item added to cart successfully
Adding 'Apple': Item added to cart successfully
Cart Contents: [Apple, Orange, Milk, Apple]
Cost Calculation:
Apple: $1.50
Orange: $2.00
Milk: $3.25
Apple: $1.50
Subtotal: $8.25
Discount Analysis:
Threshold: $5.00
Discount Rate: 10%
Subtotal ($8.25) meets threshold requirement
Discount Applied: $0.83
Final Total: $7.42
========================================
           FINAL RECEIPT
========================================
Transaction ID: TXN001
Customer: John Smith
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Apple                           $1.50
Orange                          $2.00
Milk                            $3.25
Apple                           $1.50
----------------------------------------
Subtotal:                       $8.25
Discount (10%):                -$0.83
----------------------------------------
TOTAL:                          $7.42
----------------------------------------
Payment Method: Cash
Items Count: 4
Unique Products: 3
Thank you for shopping with us!
========================================

Se a loja tiver os produtos "Laptop" por 999.99, "Mouse" por 25.50, "Keyboard" por 75.00, os clientes quiserem adicionar "Mouse", "Keyboard", o limite do desconto for 150.00, a porcentagem de desconto for 15, o nome do cliente for "Sarah Johnson" e o ID da transação for "TXN002", seu programa deverá produzir:

Shopping Cart Operations:
Adding 'Mouse': Item added to cart successfully
Adding 'Keyboard': Item added to cart successfully
Cart Contents: [Mouse, Keyboard]
Cost Calculation:
Mouse: $25.50
Keyboard: $75.00
Subtotal: $100.50
Discount Analysis:
Threshold: $150.00
Discount Rate: 15%
Subtotal ($100.50) does not meet threshold requirement
Discount Applied: $0.00
Final Total: $100.50
========================================
           FINAL RECEIPT
========================================
Transaction ID: TXN002
Customer: Sarah Johnson
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Mouse                          $25.50
Keyboard                       $75.00
----------------------------------------
Subtotal:                     $100.50
Discount (15%):                $0.00
----------------------------------------
TOTAL:                        $100.50
----------------------------------------
Payment Method: Cash
Items Count: 2
Unique Products: 2
Thank you for shopping with us!
========================================

Se a loja tiver os produtos "Novel" por 12.99, "Magazine" por 4.50, "Textbook" por 89.00, os clientes quiserem adicionar "Novel", "Textbook", "Magazine", "Novel", o limite do desconto for 75.00, a porcentagem de desconto for 20, o nome do cliente for "Mike Davis" e o ID da transação for "TXN003", seu programa deverá produzir:

Shopping Cart Operations:
Adding 'Novel': Item added to cart successfully
Adding 'Textbook': Item added to cart successfully
Adding 'Magazine': Item added to cart successfully
Adding 'Novel': Item added to cart successfully
Cart Contents: [Novel, Textbook, Magazine, Novel]
Cost Calculation:
Novel: $12.99
Textbook: $89.00
Magazine: $4.50
Novel: $12.99
Subtotal: $119.48
Discount Analysis:
Threshold: $75.00
Discount Rate: 20%
Subtotal ($119.48) meets threshold requirement
Discount Applied: $23.90
Final Total: $95.58
========================================
           FINAL RECEIPT
========================================
Transaction ID: TXN003
Customer: Mike Davis
Date: 2024-01-15
Time: 14:30:25
----------------------------------------
ITEMS PURCHASED:
Novel                          $12.99
Textbook                       $89.00
Magazine                        $4.50
Novel                          $12.99
----------------------------------------
Subtotal:                     $119.48
Discount (20%):               -$23.90
----------------------------------------
TOTAL:                         $95.58
----------------------------------------
Payment Method: Cash
Items Count: 4
Unique Products: 3
Thank you for shopping with us!
========================================

Seu programa deve formatar o recibo final com alinhamento e espaçamento adequados. Use interpolação de strings para exibir todos os detalhes da transação, incluindo as informações do cliente, as compras discriminadas, os cálculos de preços e as estatísticas resumidas. O recibo deve incluir valores fixos para a data (2024-01-15), a hora (14:30:25) e o método de pagamento (Cash). Formate todos os valores monetários para mostrar exatamente 2 casas decimais. Calcule a quantidade de itens usando o comprimento do carrinho e os produtos exclusivos convertendo o carrinho em um Set. O formato da entrada será: nomes dos itens a serem adicionados ao carrinho, terminando com "cart_done", seguidos pelo valor limite do desconto, pela porcentagem de desconto, pelo nome do cliente e pelo ID da transação (todos como strings).

Experimente você mesmo

import 'dart:io';

void main() {
  // Product catalog
  Map<String, double> products = {
    'Apple': 1.50,
    'Banana': 0.80,
    'Orange': 2.00,
    'Milk': 3.25,
    'Laptop': 999.99,
    'Mouse': 25.50,
    'Keyboard': 75.00,
    'Novel': 12.99,
    'Magazine': 4.50,
    'Textbook': 89.00
  };
  
  List<String> cart = [];
  int itemsAdded = 0;
  int itemsNotFound = 0;
  
  print('Shopping Cart Operations:');
  
  // Read items until "cart_done"
  while (true) {
    String? item = stdin.readLineSync();
    if (item == 'cart_done') break;
    
    if (products.containsKey(item)) {
      cart.add(item!);
      print("Adding '$item': Item added to cart successfully");
      itemsAdded++;
    } else {
      print("Adding '$item': Item not found in catalog");
      itemsNotFound++;
    }
  }
  
  print('Cart Contents: $cart');
  
  // Calculate subtotal
  print('Cost Calculation:');
  double subtotal = 0.0;
  for (String item in cart) {
    double price = products[item]!;
    print('$item: \$${price.toStringAsFixed(2)}');
    subtotal += price;
  }
  print('Subtotal: \$${subtotal.toStringAsFixed(2)}');
  
  // Read discount threshold and percentage
  String? thresholdInput = stdin.readLineSync();
  String? discountPercentageInput = stdin.readLineSync();
  
  double threshold = double.parse(thresholdInput!);
  int discountPercentage = int.parse(discountPercentageInput!);
  
  // Discount analysis
  print('Discount Analysis:');
  print('Threshold: \$${threshold.toStringAsFixed(2)}');
  print('Discount Rate: $discountPercentage%');
  
  double discountAmount = 0.0;
  double finalTotal = subtotal;
  String discountStatus = 'No discount applied';
  
  if (subtotal >= threshold) {
    print('Subtotal (\$${subtotal.toStringAsFixed(2)}) meets threshold requirement');
    discountAmount = subtotal * (discountPercentage / 100);
    finalTotal = subtotal - discountAmount;
    discountStatus = '$discountPercentage% discount applied';
  } else {
    print('Subtotal (\$${subtotal.toStringAsFixed(2)}) does not meet threshold requirement');
  }
  
  print('Discount Applied: \$${discountAmount.toStringAsFixed(2)}');
  print('Final Total: \$${finalTotal.toStringAsFixed(2)}');
  
  // Cart summary
  Set<String> uniqueProducts = cart.toSet();
  print('Cart Summary:');
  print('Total items in cart: ${cart.length}');
  print('Unique products in cart: ${uniqueProducts.length}');
  print('Items successfully added: $itemsAdded');
  print('Items not found: $itemsNotFound');
  print('Discount Status: $discountStatus');
  print('Cart Status: Ready for checkout');
}

Todas as lições de Lógica & Fluxo

Pratique por conta própria: Compilador de Dart online