commission = $commission; } public function index() { $check = checkSidebarAccess('product-commission'); if (!$check) { abort(404); } $products = Product::query() ->select(DB::raw('products.id, coalesce(fund.fund_name, re.property_name, sdi.product_name, p2p.scheme, fre.property_name_and_location,id.company_name,aif.fund_name,caga.project_name,hyf.security_name,lbf.company,sdi.product_name,vd.company_name) as product_name'), DB::raw('DATE_FORMAT(products.created_at, "%d-%b-%Y") as date'), 'categories.category_name', DB::raw('coalesce(sdi.minimum_investment,re.total_price, p2p.minimum_investment, fre.minimum_investment,id.minimum_investment,aif.minimum_investment,caga.minimum_investment,hyf.minimum_investment,lbf.minimum_investment,sdi.minimum_investment,vd.minimum_investment,fund.minimum_investment) as minimum_investment'), 'products.commission_type', 'products.rate', 'products.commission', 'products.description', DB::raw('coalesce(fre.companies_id,aif.companies_id,caga.companies_id,vd.companies_id) as companies_id'), 'upfront_rate', 'trail_rate') ->leftJoin('securitized_debt_instruments as sdi', 'products.id', 'sdi.products_id') ->leftJoin('fractional_real_estates as fre', 'products.id', 'fre.products_id') ->leftJoin('peer_to_peer_lendings as p2p', 'products.id', 'p2p.products_id') ->leftJoin('invoice_discountings as id', 'products.id', 'id.products_id') ->leftJoin('alternative_investment_funds as aif', 'products.id', 'aif.products_id') ->leftJoin('clean_and_green_assets as caga', 'products.id', 'caga.products_id') ->leftJoin('high_yield_finances as hyf', 'products.id', 'hyf.products_id') ->leftJoin('lease_based_financings as lbf', 'products.id', 'lbf.products_id') ->leftJoin('venture_debts as vd', 'products.id', 'vd.products_id') ->leftJoin('funds as fund', 'products.id', 'fund.products_id') ->leftJoin('real_estates as re', 'products.id', 're.products_id') // ->join('fractional_real_estates as fr', 'companies.id', 'fr.companies_id') // ->leftJoin('alternative_investment_funds as aifp', 'companies.id', 'aifp.companies_id') // ->leftJoin('clean_and_green_assets as cagap', 'companies.id', 'cagap.companies_id') // ->leftJoin('venture_debts as vdp', 'companies.id', 'vdp.companies_id') ->join('categories', 'products.categories_id', 'categories.id') // ->orderBy('products.created_at') ->latest('products.created_at') ->get(); return view('Admin.Pages.manage_commission.manage_commission', compact('products')); } public function add() { return view('Admin.Pages.manage_commission.add_commission'); } public function viewProduct($id, $product = 'product') { return view('Admin.Pages.manage_commission.view_commission', [ 'product' => Product::with('category')->find($id), 'product_name' => $product, ]); } public function editCommission($id, $product = 'product') { // dd($product); // dd(Product::find($id)); // $product = Product::find($id) return view('Admin.Pages.manage_commission.edit_commission', [ 'product' => Product::find($id), 'product_name' => $product, ]); } public function editProduct(Request $request) { // dd($request->all()); // dd($request->end_of_trail.' 00:00:00.0'); $validator = Validator::make($request->post(), [ 'commission_type' => 'required', // 'profit_sharing' => 'required', // 'upfront_rate' => 'required', // 'trail_rate' => 'required', 'gst' => 'required', 'tds' => 'required', // 'end_of_trail' => 'required', ], [ 'required' => 'The :attribute field must be required', 'unique' => 'The :attribute field must be unique' ]); $validationMessage = $this->validationError($validator); if ($validationMessage) { return response()->json(['status' => 400, 'message' => $validationMessage]); } Product::where('id', $request->products_id)->update([ 'commission_type' => $request->commission_type, 'profit_sharing' => $request->profit_sharing, 'upfront_rate' => $request->upfront_rate, 'return_type' => $request->return_type, 'trail_rate' => $request->trail_rate, 'gst' => $request->gst, 'tds' => $request->tds, 'end_of_trail' => $request->end_of_trail, ]); $returnType = [ 'Monthly' => '1 month', 'Quarterly' => '3 months', 'Half-Yearly' => '6 months', 'Yearly' => '12 months', ]; if ($request->commission_type == 'Trail Commission' || $request->commission_type == 'Hybrid Structure') { $start = Carbon::today(); ProductTrailCommission::where(['products_id' => $request->products_id, 'commission_earned' => 'No'])->delete(); $getDates = ProductTrailCommission::where('products_id', $request->products_id)->pluck('commission_date'); foreach (CarbonPeriod::create($start, $returnType[$request->return_type], $request->end_of_trail . ' 00:00:00.0') as $month) { $month->lastOfMonth(); if ($getDates->contains($month->format('Y-m-d h:i:s'))) { continue; } ProductTrailCommission::create([ 'products_id' => $request->products_id, 'commission_date' => $month->format('Y-m-d h:i:s') ]); } } return response()->json(['status' => 200, 'message' => 'Product Commission Updated!']); } public function validationError($validator) { if ($validator->fails()) { $errors = $validator->errors(); $messages = ''; foreach ($errors->all() as $message) { $messages .= $message . '
'; } return $messages; } } public function userCommission() { $check = checkSidebarAccess('user-commission'); if (!$check) { abort(404); } return view('Admin.Pages.manage_commission.user_commission'); } public function viewUserProduct($id) { return view('Admin.Pages.manage_commission.view_user_commission', [ 'product' => MonthlyUpdateMasterCommission::find($id) ]); } public function editUserCommission($id) { return view('Admin.Pages.manage_commission.edit_user_commission', [ 'product' => MonthlyUpdateMasterCommission::find($id) ]); } public function updateUserCommission(Request $request) { $validator = Validator::make($request->post(), [ 'total_investment_or_commitment_amount' => 'required', 'applicable_rate' => 'required', 'gst' => 'required', 'tds' => 'required', ], [ 'required' => 'The :attribute field must be required', 'unique' => 'The :attribute field must be unique' ]); $validationMessage = $this->validationError($validator); if ($validationMessage) { return response()->json(['status' => 400, 'message' => $validationMessage]); } $grossCommissionedEarned = ($request->total_investment_or_commitment_amount * $request->applicable_rate) / 100; $gst = ($grossCommissionedEarned * $request->gst) / 100; $tds = ($grossCommissionedEarned * $request->tds) / 100; MonthlyUpdateMasterCommission::where('id', $request->monthly_update_commissions_id)->update([ 'total_investment_or_commitment_amount' => $request->total_investment_or_commitment_amount, 'applicable_rate' => $request->applicable_rate, 'gst' => $request->gst, 'tds' => $request->tds, 'net_commission_received' => $grossCommissionedEarned + $gst - $tds, 'gross_commissioned_earned_inr' => $grossCommissionedEarned, ]); return response()->json(['status' => 200, 'message' => 'User Commission Updated!']); } public function dataTable(Request $request) { if ($request->ajax()) { $data = MonthlyUpdateMasterCommission::query() ->with('monthlyUpdate.products.fractional_real_estate') ->latest() ->select('*'); if ($request->from) { $data->where('created_at', '>=', $request->from . ' 00:00:00'); }; if ($request->to) { $data->where('created_at', '<=', $request->to . ' 23:59:59'); }; return DataTables::of($data)->addIndexColumn() ->editColumn('created_at', function ($row) { $formattedDate = $row->created_at->format('d/m/Y'); return '
' . $formattedDate . '
'; }) ->editColumn('investor_name', function ($row) { return '
' . $row->monthlyUpdate->investor_name . '
'; }) ->editColumn('product_sold', function ($row) { return '
' . 'ABC' . '
'; }) ->editColumn('month', function ($row) { return '
' . $row->created_at->format('M') . '
'; }) ->editColumn('total_investment', function ($row) { return '
' . $row->total_investment_or_commitment_amount . '
'; }) ->editColumn('applicable_rate', function ($row) { return '
' . $row->applicable_rate . '%
'; }) ->editColumn('commission_type', function ($row) { return '
' . $row->type_of_commission . '
'; }) ->addColumn('action', function ($row) { $view = route("get-user-commission", $row->id); $edit = route("edit-user-commission", $row->id); $btn = "
"; return $btn; }) ->rawColumns(['investor_name', 'product_sold', 'month', 'total_investment', 'applicable_rate', 'commission_type', 'created_at', 'action']) ->make(true); } } public function trailCommission() { $check = checkSidebarAccess('trail-commission'); if(!$check) { abort(404); } return view('Admin.Pages.manage_commission.trail_commission', [ 'trailCommission' => $this->commission->getTrailCommissions() ]); } public function generateTrailCommission(Request $request) { $monthlyUpdate = $this->commission->getMonthlyUpdate($request->id); $commissionUpdated = $this->commission->updateProductTrailCommission($request->id, $request->trail_id); $product = $this->commission->getProduct($request->id); foreach ($monthlyUpdate as $commission) { $investmentValue = $this->commission->getInvestmentValue($commission); $commissionCalculation = $this->commission->commissionCalculation($product, $investmentValue); $this->commission->storeMonthlyCommission($product, $commission, $investmentValue, $commissionCalculation); } return $commissionUpdated ? $this->response('Commission Generated!', 200) : $this->response('Commission Could Not Be Generated!', 400); } }