rairo commited on
Commit
b7ff048
·
1 Parent(s): e9c54d9

Update utility.py

Browse files
Files changed (1) hide show
  1. utility.py +22 -12
utility.py CHANGED
@@ -336,7 +336,7 @@ def create_or_update_inventory_or_service_offering(user_phone: str, transaction_
336
 
337
  def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, str]:
338
  """Process sales of goods or services, validate stock/units, and record sale."""
339
- inventory_ref = db.collection("users").document(user_phone).collection("inventory_and_services") # Unified collection
340
  sales_ref = db.collection("users").document(user_phone).collection("sales")
341
  feedback_messages = []
342
  all_successful = True
@@ -351,8 +351,8 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
351
  service_name = sale_details.get('service_name')
352
 
353
  doc_id_for_stock_check = None
354
- quantity_key_for_sale = None # Key like 'quantity' or 'hours' from the *sale details*
355
- quantity_key_for_stock = None # Key like 'quantity' or 'units_available' from the *inventory/service offering*
356
  quantity_sold = 0
357
 
358
  if item_name:
@@ -362,8 +362,14 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
362
  display_name = f"'{item_name}' (good)"
363
  elif service_name:
364
  doc_id_for_stock_check = service_name
365
- quantity_key_for_sale = 'hours' if 'hours' in sale_details else 'units' # 'units' for general services
366
- quantity_key_for_stock = 'units_available' # Reflects available units in service offering
 
 
 
 
 
 
367
  display_name = f"'{service_name}' (service)"
368
  else:
369
  feedback_messages.append("Sale skipped: Missing item name or service name.")
@@ -373,11 +379,11 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
373
  try:
374
  quantity_sold = int(sale_details.get(quantity_key_for_sale, 0))
375
  if quantity_sold <= 0:
376
- feedback_messages.append(f"Sale skipped for {display_name}: Invalid quantity/hours ({quantity_sold}).")
377
  all_successful = False
378
  continue
379
  except (ValueError, TypeError):
380
- feedback_messages.append(f"Sale skipped for {display_name}: Invalid quantity/hours format.")
381
  all_successful = False
382
  continue
383
 
@@ -391,7 +397,7 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
391
  if service_name:
392
  perform_stock_check = False
393
  logger.info(f"Ad-hoc service sale for '{service_name}'. Skipping stock check.")
394
- else: # For physical item, must exist in inventory
395
  feedback_messages.append(f"Sale failed for {display_name}: Not found in inventory/service offerings.")
396
  all_successful = False
397
  continue
@@ -418,7 +424,7 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
418
  **sale_details,
419
  'timestamp': datetime.now().isoformat(),
420
  'status': 'completed',
421
- 'transaction_id': sale_doc_ref.id # Store the generated ID
422
  }
423
  sale_batch.set(sale_doc_ref, sale_record)
424
 
@@ -426,8 +432,13 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
426
 
427
  return sale_batch
428
 
429
-
430
- sales_to_process = [t for t in transaction_data if t.get('transaction_type') == 'sale' and t.get('intent') == 'create']
 
 
 
 
 
431
 
432
  if not sales_to_process:
433
  return False, "No valid sale transactions found."
@@ -444,7 +455,6 @@ def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, st
444
  else:
445
  logger.info(f"No sales to record for user {user_phone}.")
446
 
447
-
448
  return all_successful, "\n".join(feedback_messages)
449
 
450
  except Exception as e:
 
336
 
337
  def create_sale(user_phone: str, transaction_data: List[Dict]) -> tuple[bool, str]:
338
  """Process sales of goods or services, validate stock/units, and record sale."""
339
+ inventory_ref = db.collection("users").document(user_phone).collection("inventory_and_services")
340
  sales_ref = db.collection("users").document(user_phone).collection("sales")
341
  feedback_messages = []
342
  all_successful = True
 
351
  service_name = sale_details.get('service_name')
352
 
353
  doc_id_for_stock_check = None
354
+ quantity_key_for_sale = None
355
+ quantity_key_for_stock = None
356
  quantity_sold = 0
357
 
358
  if item_name:
 
362
  display_name = f"'{item_name}' (good)"
363
  elif service_name:
364
  doc_id_for_stock_check = service_name
365
+ # Check for both 'hours' and 'units' in sale details
366
+ if 'hours' in sale_details:
367
+ quantity_key_for_sale = 'hours'
368
+ elif 'units' in sale_details:
369
+ quantity_key_for_sale = 'units'
370
+ else:
371
+ quantity_key_for_sale = 'quantity' # fallback
372
+ quantity_key_for_stock = 'units_available'
373
  display_name = f"'{service_name}' (service)"
374
  else:
375
  feedback_messages.append("Sale skipped: Missing item name or service name.")
 
379
  try:
380
  quantity_sold = int(sale_details.get(quantity_key_for_sale, 0))
381
  if quantity_sold <= 0:
382
+ feedback_messages.append(f"Sale skipped for {display_name}: Invalid quantity/hours/units ({quantity_sold}).")
383
  all_successful = False
384
  continue
385
  except (ValueError, TypeError):
386
+ feedback_messages.append(f"Sale skipped for {display_name}: Invalid quantity/hours/units format.")
387
  all_successful = False
388
  continue
389
 
 
397
  if service_name:
398
  perform_stock_check = False
399
  logger.info(f"Ad-hoc service sale for '{service_name}'. Skipping stock check.")
400
+ else:
401
  feedback_messages.append(f"Sale failed for {display_name}: Not found in inventory/service offerings.")
402
  all_successful = False
403
  continue
 
424
  **sale_details,
425
  'timestamp': datetime.now().isoformat(),
426
  'status': 'completed',
427
+ 'transaction_id': sale_doc_ref.id
428
  }
429
  sale_batch.set(sale_doc_ref, sale_record)
430
 
 
432
 
433
  return sale_batch
434
 
435
+ # Extract sale details from transaction data - key fix here
436
+ sales_to_process = []
437
+ for t in transaction_data:
438
+ if t.get('transaction_type') == 'sale' and t.get('intent') == 'create':
439
+ # Get the details dict, or use the transaction dict itself if no details key
440
+ sale_details = t.get('details', t)
441
+ sales_to_process.append(sale_details)
442
 
443
  if not sales_to_process:
444
  return False, "No valid sale transactions found."
 
455
  else:
456
  logger.info(f"No sales to record for user {user_phone}.")
457
 
 
458
  return all_successful, "\n".join(feedback_messages)
459
 
460
  except Exception as e: