| Server IP : 139.59.63.204 / Your IP : 216.73.217.62 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ubuntu-s-1vcpu-1gb-blr1-01 6.8.0-110-generic #110-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 19 15:09:20 UTC 2026 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/crmapp/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use App\Models\{Deal, Pipeline, Stage, Lead};
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DealController extends Controller
{
public function index()
{
$deals = Deal::latest()->paginate(10);
return view('deals.index', compact('deals'));
}
public function create()
{
$leads = Lead::all(); // for dropdown
return view('deals.create', compact('leads'));
}
public function store(Request $request)
{
$data = $request->validate([
'lead_id' => 'nullable|exists:leads,id',
'title' => 'required|string|max:255',
'value' => 'required|numeric|min:0',
'stage' => 'required|string|in:prospecting,proposal,negotiation,won,lost',
'expected_close_date' => 'nullable|date',
]);
Deal::create($data);
return redirect()->route('deals.index')->with('success', 'Deal created');
}
public function show(Deal $deal)
{
return view('deals.show', compact('deal'));
}
public function edit(Deal $deal)
{
$leads = Lead::all();
return view('deals.edit', compact('deal','leads'));
}
public function update(Request $request, Deal $deal)
{
$data = $request->validate([
'lead_id' => 'nullable|exists:leads,id',
'title' => 'required|string|max:255',
'value' => 'required|numeric|min:0',
'stage' => 'required|string|in:prospecting,proposal,negotiation,won,lost',
'expected_close_date' => 'nullable|date',
]);
$deal->update($data);
return redirect()->route('deals.index')->with('success', 'Deal updated');
}
public function destroy(Deal $deal)
{
$deal->delete();
return redirect()->route('deals.index')->with('success', 'Deal deleted');
}
/** Kanban Implementation by Dileep Awasthi */
public function kanban(Request $request, Pipeline $pipeline = null)
{
$pipeline = $pipeline ?: Pipeline::firstOrFail();
$stages = $pipeline->stages()->with(['deals' => function($q){
$q->where('status','open')->with('owner:id,name');
}])->get();
return view('deals.kanban', compact('pipeline','stages'));
}
public function move(Request $request, Deal $deal)
{
$this->authorize('update', $deal);
$validated = $request->validate([
'to_stage_id' => ['required','exists:stages,id'],
'new_position' => ['nullable','integer','min:0']
]);
DB::transaction(function() use ($deal, $validated){
$deal->stage_id = $validated['to_stage_id'];
$deal->position = $validated['new_position'] ?? 0;
$deal->save();
});
return response()->json(['ok' => true]);
}
public function reorderWithinStage(Request $request, Stage $stage)
{
$this->authorize('viewAny', Deal::class);
$validated = $request->validate([
'ordered_ids' => ['required','array'],
'ordered_ids.*' => ['integer','exists:deals,id']
]);
DB::transaction(function() use ($stage, $validated){
foreach ($validated['ordered_ids'] as $pos => $id) {
Deal::where('id',$id)->where('stage_id',$stage->id)->update(['position' => $pos]);
}
});
return response()->json(['ok' => true]);
}
}