Update utility.py
Browse files- 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")
|
| 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
|
| 355 |
-
quantity_key_for_stock = None
|
| 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 |
-
|
| 366 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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:
|
| 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
|
| 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 = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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:
|