added product import and billing integration
This commit is contained in:
@@ -437,12 +437,12 @@ class SyncRepositoryImpl implements SyncRepository {
|
||||
'registered_by_terminal': _store.terminal.code,
|
||||
};
|
||||
|
||||
/// The JSON body sent per order.
|
||||
/// The JSON body sent per order. Matches the back office's `/orders`
|
||||
/// schema field for field — nothing added beyond it.
|
||||
Map<String, Object?> _orderToPayload(SaleTransaction t) => {
|
||||
'id': t.id,
|
||||
'invoice_number': t.invoiceNumber,
|
||||
'created_at': t.createdAt.toIso8601String(),
|
||||
'terminal_id': t.terminalId,
|
||||
'cashier': t.cashierName,
|
||||
'customer': t.customer == null
|
||||
? null
|
||||
@@ -453,15 +453,6 @@ class SyncRepositoryImpl implements SyncRepository {
|
||||
},
|
||||
'subtotal': t.cart.subtotal,
|
||||
'discount': t.cart.billDiscountTotal + t.cart.lineDiscountTotal,
|
||||
'promos': [
|
||||
for (final applied in t.cart.appliedPromos)
|
||||
{
|
||||
'id': applied.promo.id,
|
||||
'name': applied.promo.name,
|
||||
'type': applied.promo.type.name,
|
||||
'amount': applied.amount,
|
||||
},
|
||||
],
|
||||
'tax': t.cart.taxAmount,
|
||||
// GST per slab, as printed on the invoice. Sent as well as the total
|
||||
// because a compliant tax return is filed per slab, and recomputing the
|
||||
|
||||
@@ -30,6 +30,35 @@ class TransactionRepositoryImpl implements TransactionRepository {
|
||||
await _store.refreshUnsyncedCount();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> voidSale({
|
||||
required SaleTransaction transaction,
|
||||
required Map<String, double> stockMovements,
|
||||
}) async {
|
||||
// The customer attached to the cart is the pre-sale snapshot — commitSale
|
||||
// never mutates it, only the separate `updatedCustomer` it computed — so
|
||||
// restoring exactly this row undoes the loyalty movement precisely,
|
||||
// rather than trying to reconstruct it from a delta.
|
||||
final preSaleCustomer = transaction.cart.customer;
|
||||
|
||||
await _store.orders.voidSale(
|
||||
orderId: transaction.id,
|
||||
stockMovements: stockMovements,
|
||||
customerRow: preSaleCustomer == null
|
||||
? null
|
||||
: CatalogueDao.customerToRow(preSaleCustomer),
|
||||
);
|
||||
|
||||
// Disk is reverted; bring the read caches back in line with it. Negating
|
||||
// the same map reuses cacheStockMovement's "subtract" semantics to add
|
||||
// the stock back instead.
|
||||
_store.cacheStockMovement(
|
||||
stockMovements.map((id, qty) => MapEntry(id, -qty)),
|
||||
);
|
||||
if (preSaleCustomer != null) _store.cacheCustomer(preSaleCustomer);
|
||||
await _store.refreshUnsyncedCount();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<SaleTransaction>> history({int limit = 50}) =>
|
||||
_store.orders.recent(limit: limit);
|
||||
|
||||
Reference in New Issue
Block a user