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:
2026-03-31 04:14:15 +00:00
parent 4e6bac8661
commit c56709d45e

View File

@@ -18,6 +18,7 @@ from services.inventory_engine import (
record_operation,
get_stock,
)
from services.accounting_engine import record_sale_entry, record_cancellation_entry
def _to_dec(val):
@@ -369,6 +370,20 @@ def process_sale(conn, sale_data):
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 {
'id': sale_id,
'branch_id': branch_id,
@@ -464,6 +479,19 @@ def cancel_sale(conn, sale_id, reason):
WHERE id = %s
""", (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
if s_type == 'credit' and s_cust_id:
cur.execute("""