Add Ladill POS v1 — register, Pay checkout, and commerce links.
Deploy Ladill Mini / deploy (push) Successful in 23s

Staff-facing counter register at pos.ladill.com with catalog cart, cash and
MoMo/card checkout via Ladill Pay, CRM timeline/import, invoice prefill, and
Merchant catalog import.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-23 22:52:24 +00:00
co-authored by Cursor
commit e5d2b84388
378 changed files with 41419 additions and 0 deletions
@@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers\Pos;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Pos\Concerns\ScopesToAccount;
use App\Models\PosSale;
use App\Services\CrossApp\CrossAppLinkService;
use App\Services\Pos\PosSaleService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use RuntimeException;
class SaleController extends Controller
{
use ScopesToAccount;
public function __construct(
private PosSaleService $sales,
private CrossAppLinkService $links,
) {}
public function index(Request $request): View
{
$sales = PosSale::owned($this->ownerRef($request))
->with('lines')
->latest()
->paginate(25)
->withQueryString();
return view('pos.sales.index', compact('sales'));
}
public function show(Request $request, PosSale $sale): View
{
$this->authorizeOwner($request, $sale);
$sale->load('lines', 'location');
$invoiceUrl = $sale->isPaid()
? $this->links->invoiceFromSale($sale)
: null;
return view('pos.sales.show', compact('sale', 'invoiceUrl'));
}
public function callback(Request $request, PosSale $sale): RedirectResponse
{
$reference = trim((string) $request->query('reference', $sale->payment_reference ?? ''));
if ($reference === '') {
return redirect()->route('pos.sales.show', $sale)->with('error', 'Missing payment reference.');
}
try {
$sale = $this->sales->completePayCheckout($reference);
} catch (RuntimeException $e) {
return redirect()->route('pos.sales.show', $sale)->with('error', $e->getMessage());
}
return redirect()
->route('pos.sales.show', $sale)
->with('success', 'Payment received.');
}
}