Certainly! Here’s a practical approach to implementing a salesReturn feature in your Laravel application, based on your models and requirements.
1. Create a SalesReturn Model
This model will track each return event, linking it to the original sale, customer, and the items being returned.
php artisan make:model SalesReturn -m
php artisan make:model SalesReturnItem -m
SalesReturn migration:
Schema::create('sales_returns', function (Blueprint $table) {
$table->id();
$table->foreignId('sold_inventory_id')->constrained()->onDelete('cascade');
$table->foreignId('customer_id')->constrained()->onDelete('cascade');
$table->date('return_date');
$table->text('reason')->nullable();
$table->timestamps();
});
SalesReturnItem migration:
Schema::create('sales_return_items', function (Blueprint $table) {
$table->id();
$table->foreignId('sales_return_id')->constrained()->onDelete('cascade');
$table->foreignId('sold_inventory_item_id')->constrained()->onDelete('cascade');
$table->integer('quantity');
$table->decimal('refund_amount', 15, 2);
$table->timestamps();
});
2. Define Relationships
SalesReturn.php
class SalesReturn extends Model
{
protected $fillable = ['sold_inventory_id', 'customer_id', 'return_date', 'reason'];
public function soldInventory()
{
return $this->belongsTo(SoldInventory::class);
}
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function items()
{
return $this->hasMany(SalesReturnItem::class);
}
}
SalesReturnItem.php
class SalesReturnItem extends Model
{
protected $fillable = ['sales_return_id', 'sold_inventory_item_id', 'quantity', 'refund_amount'];
public function salesReturn()
{
return $this->belongsTo(SalesReturn::class);
}
public function soldInventoryItem()
{
return $this->belongsTo(SoldInventoryItems::class);
}
}
3. Sales Return Logic (Controller Example)
SalesReturnController.php
public function store(Request $request)
{
$request->validate([
'sold_inventory_id' => 'required|exists:sold_inventories,id',
'items' => 'required|array',
'items.*.sold_inventory_item_id' => 'required|exists:sold_inventory_items,id',
'items.*.quantity' => 'required|integer|min:1',
'items.*.refund_amount' => 'required|numeric|min:0',
'reason' => 'nullable|string',
]);
DB::transaction(function () use ($request) {
$soldInventory = SoldInventory::findOrFail($request->sold_inventory_id);
$salesReturn = SalesReturn::create([
'sold_inventory_id' => $soldInventory->id,
'customer_id' => $soldInventory->customer_id,
'return_date' => now(),
'reason' => $request->reason,
]);
foreach ($request->items as $item) {
$soldItem = SoldInventoryItems::findOrFail($item['sold_inventory_item_id']);
// Update soldInventoryItem quantity
$soldItem->quantity -= $item['quantity'];
$soldItem->save();
// Update inventory in store
$inventoryInStore = $soldItem->inventoryInStore;
$inventoryInStore->quantity += $item['quantity'];
$inventoryInStore->save();
// Create SalesReturnItem
$salesReturn->items()->create([
'sold_inventory_item_id' => $soldItem->id,
'quantity' => $item['quantity'],
'refund_amount' => $item['refund_amount'],
]);
}
// Update SalesInvoice and SalesInvoiceReceipts as needed
$salesInvoice = $soldInventory->salesInvoice;
$salesInvoice->total_amount -= collect($request->items)->sum('refund_amount');
$salesInvoice->balance -= collect($request->items)->sum('refund_amount');
$salesInvoice->save();
// Optionally, create a negative SalesInvoiceReceipt for the refund
SalesInvoiceReceipt::create([
'sales_invoice_id' => $salesInvoice->id,
'customer_id' => $soldInventory->customer_id,
'receipt_no' => 'REFUND-' . now()->timestamp,
'paid_amount' => -collect($request->items)->sum('refund_amount'),
'paid_date' => now(),
'balance' => $salesInvoice->balance,
'status' => 'refund',
'description' => 'Refund for sales return',
]);
});
return response()->json(['message' => 'Sales return processed successfully.']);
}
4. Editing/Correcting a Sales Return
Allow editing the SalesReturn and SalesReturnItem records. When editing, reverse the previous changes (restore quantities, etc.), then apply the new changes as above.
5. Summary of Steps
- Track returns with new tables (
sales_returns,sales_return_items). - Update sold item quantities and restore inventory.
- Adjust invoices and receipts for refunds.
- Allow corrections by reversing and re-applying changes.
This structure keeps your sales, inventory, and financial records accurate and auditable, and allows for easy corrections if mistakes are made.
If you need more detailed code for editing/correcting returns, let me know!