feat(pos): hook accounting auto-entries into sale/cancel flow (non-blocking)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,7 @@ from services.inventory_engine import (
|
|||||||
record_operation,
|
record_operation,
|
||||||
get_stock,
|
get_stock,
|
||||||
)
|
)
|
||||||
|
from services.accounting_engine import record_sale_entry, record_cancellation_entry
|
||||||
|
|
||||||
|
|
||||||
def _to_dec(val):
|
def _to_dec(val):
|
||||||
@@ -369,6 +370,20 @@ def process_sale(conn, sale_data):
|
|||||||
|
|
||||||
cur.close()
|
cur.close()
|
||||||
|
|
||||||
|
# Auto-generate accounting entry (non-blocking)
|
||||||
|
try:
|
||||||
|
record_sale_entry(conn, {
|
||||||
|
'id': sale_id,
|
||||||
|
'sale_type': sale_type,
|
||||||
|
'total': totals['total'],
|
||||||
|
'tax_total': totals['tax_total'],
|
||||||
|
'subtotal': totals['subtotal'] - totals['discount_total'],
|
||||||
|
'cost_total': sum(item.get('unit_cost', 0) * item['quantity'] for item in enriched_items),
|
||||||
|
'payment_method': payment_method,
|
||||||
|
})
|
||||||
|
except Exception:
|
||||||
|
pass # Accounting errors never block sales
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': sale_id,
|
'id': sale_id,
|
||||||
'branch_id': branch_id,
|
'branch_id': branch_id,
|
||||||
@@ -464,6 +479,19 @@ def cancel_sale(conn, sale_id, reason):
|
|||||||
WHERE id = %s
|
WHERE id = %s
|
||||||
""", (f"CANCELADA: {reason}", sale_id))
|
""", (f"CANCELADA: {reason}", sale_id))
|
||||||
|
|
||||||
|
# Reverse accounting entry (non-blocking)
|
||||||
|
try:
|
||||||
|
# Fetch tax_total for the reversal entry
|
||||||
|
cur.execute("SELECT tax_total FROM sales WHERE id = %s", (sale_id,))
|
||||||
|
_tax_row = cur.fetchone()
|
||||||
|
record_cancellation_entry(conn, {
|
||||||
|
'id': sale_id,
|
||||||
|
'total': float(s_total),
|
||||||
|
'tax_total': float(_tax_row[0]) if _tax_row else 0.0,
|
||||||
|
})
|
||||||
|
except Exception:
|
||||||
|
pass # Accounting errors never block cancellations
|
||||||
|
|
||||||
# Reverse customer credit balance if credit sale
|
# Reverse customer credit balance if credit sale
|
||||||
if s_type == 'credit' and s_cust_id:
|
if s_type == 'credit' and s_cust_id:
|
||||||
cur.execute("""
|
cur.execute("""
|
||||||
|
|||||||
Reference in New Issue
Block a user