Solavel Solavel Docs

Sales receipts

docs/solavel-finance/sales-receipts.md

Who can use this: Owner, Manager, Accountant. URL / Route: /finance/ar/sales-receipts (finance.ar.sales-receipts.index). Detail: finance.ar.sales-receipts.show, edit, update, create, store, destroy. Action endpoints: finance.ar.sales-receipts.post, void, pdf. Bulk: finance.ar.sales-receipts.bulk.index, bulk.template, bulk.parse, bulk.preview, bulk.store. Plan / feature gate: feature:tracker.sales_receipts (default: enabled). Permissions: sales.receipts.view, sales.receipts.create, sales.receipts.edit_draft, sales.receipts.delete, sales.receipts.post, sales.receipts.void.

Purpose

A Sales receipt is an immediate cash sale: the customer pays at the time of sale, so there is no period of credit and no entry on the AR ledger. Use a sales receipt for walk-in sales, point-of-sale collections, retail counter sales, or any sale where money is exchanged on the spot.

Compared with an invoice: an invoice creates an AR balance that you collect later via a separate customer payment. A sales receipt collapses both steps into one document — the cash is debited and the revenue credited in the same posting; nothing ages in AR.

Step by step

Browse sales receipts

  1. Open /finance/ar/sales-receipts. Each row shows the receipt number, date, customer (if attached), total, deposit account, and status (Draft / Posted / Voided).
  2. Filter by status, date range, customer, or search by number.

Create a sales receipt

Route: finance.ar.sales-receipts.create / store. Permission: sales.receipts.create.

  1. Click New sales receipt.
  2. (Optional) Pick a Customer. Sales receipts work for walk-in sales with no customer attached — for reporting clarity, you can leave it blank.
  3. The Receipt number comes from the active sequence — see Settings. You can override it.
  4. Set the Date.
  5. Pick the Deposit account (the bank or cash account that receives the money).
  6. Add line items: Product/Service, Description, Quantity, Unit price, Tax.
  7. Add one or more Payment splits — for example, JOD 30 cash + JOD 70 card. Each split records a deposit account, an amount, and an optional method (Cash / Card / Bank / Cheque).
  8. Click Save as draft to keep editing, or Save and post to post immediately.

Bulk create / import sales receipts

Route: finance.ar.sales-receipts.bulk.index (page), bulk.template, bulk.parse, bulk.preview, bulk.store. Permission: sales.receipts.create.

To enter many receipts at once, use Bulk Sales Receipts — open it from the caret next to New sales receipt, or go to /finance/ar/sales-receipts/bulk. Bulk is an input shortcut only: every receipt it creates is an ordinary draft sales receipt, saved through the same rules, numbering, and tax logic as one typed on the normal form.

Two ways to enter data:

  • Manual entry — fill in one card per receipt (date, customer, deposit account, item, revenue account, quantity, rate, tax). The customer field is optional — bulk sales receipts are commonly used for walk-in counter sales where no customer is captured.
  • File import — download a per-document CSV or XLSX template, fill it in, and upload it. One row becomes one single-line receipt. The XLSX template has drop-downs on the deposit account, customer (optional), currency, revenue account, and tax-code columns.

After entering or uploading, Validate previews every receipt — totals and any blocking errors are shown before anything saves. Fix the highlighted rows, then save. The batch saves in one transaction: if any receipt fails, nothing is saved. Bulk-created receipts are always Draft — post them from the list as usual.

Edit a draft

Route: finance.ar.sales-receipts.edit / update. Permission: sales.receipts.edit_draft.

Drafts can be edited freely. Once posted, the receipt is read-only — to change it, Void it and create a new one. Sales receipts cannot be unposted-to-draft like invoices can, because the cash impact is final.

Post a sales receipt

Route: finance.ar.sales-receipts.post (POST). Permission: sales.receipts.post.

Posting writes journal entries:

  • Debit the deposit account(s) (the cash / bank account on each payment split).
  • Credit the Revenue account on each line.
  • Credit the VAT Output account for any taxable lines.
  • For inventory items: Debit COGS, Credit Inventory at the costing layer's cost.

The journal carries source = 'SR', reference = receipt.number, and the Sales receipt is marked Posted with posted_at set. Linked payment rows flip to status = posted and gain journal_entry_id.

Posting is blocked when:

  • the receipt date falls inside a locked period (see Fiscal years and lock dates);
  • the receipt has zero lines or zero total;
  • the deposit account is missing or inactive.

Void a sales receipt

Route: finance.ar.sales-receipts.void (POST). Permission: sales.receipts.void.

Voids a posted sales receipt. The ReversalEngine unwinds the GL, reverses inventory OUT movements, reverses tax lines, flips the linked payments back to draft, and sets the receipt's status to Void. The original journal entry stays in the entries list with status Voided for the audit trail but is excluded from every report.

Use Void when the sale should not have happened (return at the counter, mis-entry, etc.). You cannot edit a voided receipt — create a new one for the corrected sale.

Print a PDF

Route: finance.ar.sales-receipts.pdf. Permission: sales.receipts.view.

Streams the receipt as a PDF using the active PDF template. Templates are managed in Settings → PDF Templates (requires pdf_templates_enabled).

Delete a draft

Route: finance.ar.sales-receipts.destroy. Permission: sales.receipts.delete.

Allowed only when status is Draft. Posted receipts cannot be deleted — void instead.

How the journal looks

For a JOD 100 sales receipt (zero-rated) paid in cash:

Account Debit Credit
Cash on hand 100.00
Revenue — Sales 100.00

For a JOD 117 sales receipt with 17% VAT, paid by card:

Account Debit Credit
Bank — Card receivable 117.00
Revenue — Sales 100.00
VAT Output 17.00

For a JOD 117 sales receipt sold as a JOD 60-cost stocked item:

Account Debit Credit
Cash on hand 117.00
Revenue — Sales 100.00
VAT Output 17.00
COGS 60.00
Inventory 60.00

AR is never touched. Sales receipts represent paid-on-the-spot transactions; there is no customer payable from the books' perspective.

Common mistakes

  • Deposit account is Undeposited Funds instead of a real bank. Sales receipts need a real Cash / Bank account — Undeposited Funds and payment-receivable accounts are blocked. Pick the actual account the money landed in.
  • "No tax on a walk-in line." Tax codes are line-level. A walk-in customer doesn't auto-fill tax — pick the tax code on each line, or set the default on the customer record (when one is attached).
  • Inventory item with no stock. Selling a stocked item with zero on-hand will post anyway (negative stock is allowed by default) but the Inventory reconciliation page will flag it. Receive stock first, or set the org policy to block negative inventory.
  • "Posted receipt looks wrong — can I edit it?" No — posted sales receipts are read-only. Void and create a fresh one. Unlike invoices, there is no unpost-to-draft.
  • Payment-split totals don't match. The sum of all payment splits must equal the receipt total. The form blocks save if they don't — the toast tells you the gap.

Tips

  • For walk-in counter sales, leave the Customer field blank — it makes reporting cleaner for anonymous footfall.
  • Use payment splits when the same customer pays partly cash and partly card on one transaction — one receipt, two splits.
  • The list page at /finance/ar/sales-receipts shows the Deposit account column so you can spot mis-routed cash.

Behaviour and rules

  • No AR impact. Sales receipts do not affect customer balances — they're not a credit sale. If you want to record a receivable that's paid later, use an invoice + a separate customer payment instead.
  • Multiple payment splits. A single receipt can carry several payment lines (e.g. JOD 50 cash + JOD 50 card). Each split's deposit account is debited; together they must equal the receipt total.
  • Inventory items. When a line uses a stocked item, posting writes the COGS / Inventory pair in addition to the revenue line, using the same inventory costing method (FIFO / weighted average — see Inventory).
  • No unpost. Sales receipts do not have an unpost-to-draft path. The cash has been collected and possibly already moved through bank reconciliation — once posted, the only way back is Void.
  • Period lock. Posting and voiding both require the date's period to be open. See Fiscal years and lock dates.
  • Where the journal shows up. On the Journal entries page, sales-receipt JEs are tagged with the green Sales Receipt chip and link directly to the receipt's show page. They never appear under the generic "receipt" / "Payment" labels.
  • Payments page link. Each payment split on a sales receipt also creates a row on the Payments page with the Sales Receipt label. No double-counting — the GL entry is written only once, by the sales-receipt posting.

Permissions / restrictions

  • View: sales.receipts.view.
  • Create / edit drafts: sales.receipts.create, sales.receipts.edit_draft.
  • Post / Void: sales.receipts.post, sales.receipts.void.
  • Soft delete drafts: sales.receipts.delete.

Related

Source: docs/solavel-finance/sales-receipts.md ← All documentation