def calculate_total_net_profit(): """ Calculate total profit. """ logging.debug('Listing sales') # get sales stats saleStats = salesModel.get_stats_by_products() logging.debug('Listing purchases') # get purchases stats purchaseStats = purchasesModel.get_stats_by_products() # The profit margin is the weighted avg # from sales, where quantity as weight and # (weighted avg net profit - weighted avg unit cost) # as the number to calculate avg # # For instance, if you have 80% sales wich # specific product, it will be considered more than # the other 20%. logging.debug('Calculating net profit') sum_net_profit = 0.0 for sale in saleStats: # Search purchase by product purchases = [ x for x in purchaseStats if x['product'].key.id() == sale['product'].key.id() ] if len(purchases) == 1: purchase = purchases[0] # Calculate the diference between net (sale value minus tax) # minus product cost sum_net_profit = sum_net_profit + ( sale['weighted_avg_net_profit'] - purchase['weighted_avg_cost']) * sale['sum_quantity'] else: logging.warning("Product %s didn't find!", sale['product'].name) # Return return sum_net_profit
def calculate_total_net_profit(): """ Calculate total profit. """ logging.debug('Listing sales') # get sales stats saleStats = salesModel.get_stats_by_products() logging.debug('Listing purchases') # get purchases stats purchaseStats = purchasesModel.get_stats_by_products() # The profit margin is the weighted avg # from sales, where quantity as weight and # (weighted avg net profit - weighted avg unit cost) # as the number to calculate avg # # For instance, if you have 80% sales wich # specific product, it will be considered more than # the other 20%. logging.debug('Calculating net profit') sum_net_profit = 0.0 for sale in saleStats: # Search purchase by product purchases = [x for x in purchaseStats if x['product'].key.id() == sale['product'].key.id()] if len(purchases) == 1: purchase = purchases[0] # Calculate the diference between net (sale value minus tax) # minus product cost sum_net_profit = sum_net_profit + (sale['weighted_avg_net_profit'] - purchase['weighted_avg_cost'] ) * sale['sum_quantity'] else: logging.warning("Product %s didn't find!", sale['product'].name) # Return return sum_net_profit
def test_purchases_statistics_by_products(self): """ Unit test to get purchases statistics by products. """ # Sales list purchasesList = [] # Mock purchase model and products models purchasesMock = [{ 'id': 1, 'product_id': 1, 'cost': 5, 'quantity': 7 }, { 'id': 2, 'product_id': 2, 'cost': 3, 'quantity': 20 }, { 'id': 3, 'product_id': 1, 'cost': 15, 'quantity': 8 }, { 'id': 4, 'product_id': 3, 'cost': 1, 'quantity': 1 }, { 'id': 5, 'product_id': 2, 'cost': 9, 'quantity': 40 }] # Iterate purchases mock for x in purchasesMock: # Create purchase mock purchase = Mock(spec_set=purchaseModel.PurchaseModel()) purchase.key = Mock(spec_set=ndb.Key('PurchaseModel', x['id'])) # Create product mock purchase.product = Mock( spec_set=ndb.Key('ProductModel', x['product_id'])) purchase.product.id = Mock(return_value=x['product_id']) purchase.product.get = Mock(return_value=purchase.product) # Net total value purchase.cost = x['cost'] purchase.quantity = x['quantity'] # Append to list purchasesList.append(purchase) # Mock list method purchaseModel.list = MagicMock(return_value=purchasesList) # Call report_customers_by_product method result = purchaseModel.get_stats_by_products() # Must have lenght == 3 self.assertEqual(len(result), 3) # Verify quantity self.assertEqual(15, result[0]['sum_quantity']) self.assertEqual(60, result[1]['sum_quantity']) self.assertEqual(1, result[2]['sum_quantity']) # Verify sum cost self.assertEqual(20, result[0]['sum_cost']) self.assertEqual(12, result[1]['sum_cost']) self.assertEqual(1, result[2]['sum_cost']) # Verify sum net profit self.assertEqual(10, result[0]['avg_cost']) self.assertEqual(6, result[1]['avg_cost']) self.assertEqual(1, result[2]['avg_cost']) # Verify sum net profit self.assertEqual(10.33, round(result[0]['weighted_avg_cost'], 2)) self.assertEqual(7, result[1]['weighted_avg_cost']) self.assertEqual(1, result[2]['weighted_avg_cost'])
def test_purchases_statistics_by_products(self): """ Unit test to get purchases statistics by products. """ # Sales list purchasesList = [] # Mock purchase model and products models purchasesMock = [{ 'id': 1, 'product_id': 1, 'cost': 5, 'quantity': 7 }, { 'id': 2, 'product_id': 2, 'cost': 3, 'quantity': 20 }, { 'id': 3, 'product_id': 1, 'cost': 15, 'quantity': 8 }, { 'id': 4, 'product_id': 3, 'cost': 1, 'quantity': 1 }, { 'id': 5, 'product_id': 2, 'cost': 9, 'quantity': 40 }] # Iterate purchases mock for x in purchasesMock: # Create purchase mock purchase = Mock(spec_set=purchaseModel.PurchaseModel()) purchase.key = Mock(spec_set=ndb.Key('PurchaseModel', x['id'])) # Create product mock purchase.product = Mock(spec_set=ndb.Key('ProductModel', x['product_id'])) purchase.product.id = Mock(return_value=x['product_id']) purchase.product.get = Mock(return_value=purchase.product) # Net total value purchase.cost = x['cost'] purchase.quantity = x ['quantity'] # Append to list purchasesList.append(purchase) # Mock list method purchaseModel.list = MagicMock(return_value=purchasesList) # Call report_customers_by_product method result = purchaseModel.get_stats_by_products() # Must have lenght == 3 self.assertEqual(len(result), 3) # Verify quantity self.assertEqual(15, result[0]['sum_quantity']) self.assertEqual(60, result[1]['sum_quantity']) self.assertEqual(1, result[2]['sum_quantity']) # Verify sum cost self.assertEqual(20, result[0]['sum_cost']) self.assertEqual(12, result[1]['sum_cost']) self.assertEqual(1, result[2]['sum_cost']) # Verify sum net profit self.assertEqual(10, result[0]['avg_cost']) self.assertEqual(6, result[1]['avg_cost']) self.assertEqual(1, result[2]['avg_cost']) # Verify sum net profit self.assertEqual(10.33, round(result[0]['weighted_avg_cost'], 2)) self.assertEqual(7, result[1]['weighted_avg_cost']) self.assertEqual(1, result[2]['weighted_avg_cost'])