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 complete o projeto da calculadora 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 do catálogo de produtos existente e a funcionalidade do carrinho de compras da configuração anterior
  2. Ler múltiplas entradas de string representando 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 itens válidos ao carrinho
  4. Calcular o subtotal somando todos os preços dos itens no carrinho
  5. Ler uma entrada de string representando o valor do limite para desconto (threshold)
  6. Ler uma entrada de string representando a porcentagem de desconto a ser aplicada
  7. Aplicar o desconto apenas se o subtotal atingir ou exceder o valor do limite
  8. Calcular o valor do desconto e o total final após a aplicação do desconto
  9. Ler uma entrada de string representando o nome do cliente
  10. Ler uma entrada de string representando 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 tem os produtos "Apple" a 1.50, "Banana" a 0.80, "Orange" a 2.00, "Milk" a 3.25, os clientes querem adicionar "Apple", "Orange", "Milk", "Apple", o limite de desconto é 5.00, a porcentagem de desconto é 10, o nome do cliente é "John Smith" e o ID da transação é "TXN001", seu programa deve imprimir:

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 tem os produtos "Laptop" a 999.99, "Mouse" a 25.50, "Keyboard" a 75.00, os clientes querem adicionar "Mouse", "Keyboard", o limite de desconto é 150.00, a porcentagem de desconto é 15, o nome do cliente é "Sarah Johnson" e o ID da transação é "TXN002", seu programa deve imprimir:

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 tem os produtos "Novel" a 12.99, "Magazine" a 4.50, "Textbook" a 89.00, os clientes querem adicionar "Novel", "Textbook", "Magazine", "Novel", o limite de desconto é 75.00, a porcentagem de desconto é 20, o nome do cliente é "Mike Davis" e o ID da transação é "TXN003", seu programa deve imprimir:

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 informações do cliente, compras detalhadas, cálculos de preços e estatísticas resumidas. O recibo deve incluir valores fixos para data (2024-01-15), hora (14:30:25) e método de pagamento (Cash). Formate todos os valores monetários para mostrar exatamente 2 casas decimais. Calcule a contagem de itens usando o comprimento do carrinho e os produtos exclusivos convertendo o carrinho em um Set. O formato de entrada será: nomes dos itens para adicionar ao carrinho terminando com "cart_done", seguidos pelo valor do limite de desconto, porcentagem de desconto, nome do cliente e 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