📘 Module 8: Complete POS Functionality

← Back to Course Outline

1. Save Sale Records to Database

Module 7 හිදී සෑදූ UI එකෙන් cart එකේ දත්ත server එකට යවා database එකේ save කරමු. මේ සඳහා සම්පූර්ණ cart එකම form එකක් ලෙස යැවිය යුතුය.

පළමුව, routes/web.php file එකේ sale එක save කිරීමට POST route එකක් සාදමු.


// In routes/web.php
// ...
Route::post('/sales', [SaleController::class, 'store'])->name('sales.store')->middleware('auth');
            

දැන්, sales/create.blade.php file එකේ, UI එක <form> tag එකක් තුලට දමන්න. JavaScript මගින් cart එකට item එකක් එකතු කරන විට, එම දත්ත form එක සමග යැවීමට hidden input fields ද නිර්මාණය කළ යුතුය.

Controller Logic: SaleController.php එකට store method එක එකතු කරමු.


// In SaleController.php
use Illuminate\Support\Facades\DB; // Import DB Facade
use App\Models\Sale; // Import Sale model

// ... create() method ...

public function store(Request $request)
{
    // Validate the request
    $request->validate([
        'products' => 'required|array',
        'products.*.id' => 'required|exists:products,id',
        'products.*.quantity' => 'required|integer|min:1',
    ]);

    // This is where we will process the sale
    // We will use a database transaction to ensure data integrity

    return redirect()->route('sales.create')->with('success', 'Sale completed successfully!');
}
            

ඉහත code එක මගින් form එකෙන් එන products array එක validate කරයි.

2. Update Stock After Each Sale using a Database Transaction

Sale එකක් සිදු වූ විට, විකිණුනු භාණ්ඩ ප්‍රමාණය product stock එකෙන් අඩු කළ යුතුය. මෙම ක්‍රියාවලිය අතරතුර යම් දෝෂයක් ඇති වුවහොත්, දත්ත අතර නොගැලපීම් ඇතිවිය හැක. මෙය වැළැක්වීමට Database Transaction එකක් භාවිතා කරමු.

store method එක තුල, sale එක process කරන logic එක DB::transaction() block එකක් තුල ලියමු.

Controller Logic: SaleController.php (Updated store method)


public function store(Request $request)
{
    $request->validate([ /* ... validation rules ... */ ]);
    
    try {
        DB::transaction(function () use ($request) {
            foreach ($request->products as $productData) {
                $product = Product::findOrFail($productData['id']);

                // 1. Check if stock is sufficient
                if ($product->quantity < $productData['quantity']) {
                    // This will throw an exception and automatically roll back the transaction
                    throw new \Exception('Not enough stock for product: ' . $product->name);
                }

                // 2. Create Sale Record
                Sale::create([
                    'product_id' => $product->id,
                    'quantity' => $productData['quantity'],
                    'total_price' => $product->price * $productData['quantity'],
                ]);

                // 3. Update Product Stock
                $product->quantity -= $productData['quantity'];
                $product->save();
            }
        });
    } catch (\Exception $e) {
        // If transaction fails, redirect back with an error
        return back()->withErrors(['error' => $e->getMessage()]);
    }

    return redirect()->route('sales.create')->with('success', 'Sale completed successfully!');
}
            

3. Generate Bill/Invoice Page

සාර්ථක sale එකකින් පසු, පාරිභෝගිකයාට ලබා දීමට bill එකක් හෝ invoice එකක් සහිත page එකකට redirect කිරීම වඩාත් සුදුසුය.

මේ සඳහා, එක transaction එකකට අදාළ සියලුම sale items එකට කාණ්ඩ කිරීමට invoices table එකක් වැනි ව්‍යුහයක් භාවිතා කළ හැක. නමුත්, මෙම පාඩම සරලව තබා ගැනීමට, අපි සාර්ථක වූ බවට පණිවිඩයක් සමග නැවත New Sale page එකට redirect කරමු.

සැබෑ ලෝකයේදී, ඔබ නව Invoice model/migration එකක් සාදා, store method එකේදී නව invoice record එකක් සාදා, සියලුම sale records ඒ invoice ID එකට සම්බන්ධ කර, අවසානයේ එම invoice එකේ "show" page එකට redirect කරනු ඇත.

4. Sinhala Explanation: Transactions in Laravel

Database Transaction යනු කුමක්ද?

Transaction එකක් යනු "සියල්ලම සාර්ථකව සිදු විය යුතුය, නැතහොත් කිසිවක් සිදු නොවිය යුතුය" යන නීතිය මත ක්‍රියාත්මක වන database මෙහෙයුම් සමූහයකි.

බැංකු උදාහරණය:

ඔබේ ගිණුමෙන් (A) ඔබේ මිතුරෙකුගේ ගිණුමට (B) රු. 1000ක් මාරු කරනවා යැයි සිතන්න. මෙහිදී database එකේ පියවර දෙකක් සිදුවේ:

  1. ඔබේ ගිණුමෙන් (A) රු. 1000ක් අඩු කිරීම.
  2. මිතුරාගේ ගිණුමට (B) රු. 1000ක් එකතු කිරීම.

හිතන්න, 1 වෙනි පියවර සිදු වූ පසු, computer system එකේ දෝෂයක් නිසා 2 වෙනි පියවර සිදු වුනේ නැහැ. එවිට ඔබේ මුදල් අඩු වී ඇත, නමුත් මිතුරාට ලැබී නැත. මුදල් අතුරුදහන් වෙලා!

Transaction එකකින් වෙන්නේ මෙහෙමයි: Transaction එකක් මෙම පියවර දෙකම එකට බඳිනවා. එය database එකට කියනවා, "මේ පියවර දෙකම සාර්ථකව අවසන් වුනොත් විතරක් වෙනස්කම් ස්ථිර කරන්න (COMMIT). අතරමගදී එක පියවරක් හරි අසාර්ථක වුනොත්, කරපු හැම වෙනස්කමක්ම අහෝසි කරලා, මුලින් තිබුණු තත්වයටම ගේන්න (ROLLBACK)."

අපේ POS system එකේදී, sale record එකක් හදලා, stock එක update කරන්න බැරි වුනොත්, transaction එක නිසා sale record එක හැදීමත් ඉබේම අහෝසි වෙනවා. එමගින් අපගේ දත්ත 100% නිවැරදිව හා ස්ථාවරව පවත්වා ගැනීමට හැකි වේ.