Files
freeu-project/app/Http/Controllers/Admin/ManageCommissionController.php
Ritikesh yadav c661166e1d first commit
2024-03-28 14:52:40 +05:30

277 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use App\Models\MonthlyUpdateAlternativeInvestmentFund;
use App\Models\MonthlyUpdateFractionalRealEstate;
use App\Models\MonthlyUpdateIndianFinancialAssets;
use App\Models\MonthlyUpdateMaster;
use App\Models\MonthlyUpdateMasterCommission;
use App\Models\ProductTrailCommission;
use App\Services\Admin\CommissionService;
use App\Traits\HttpResponse;
use Illuminate\Support\Facades\Validator;
use Yajra\DataTables\Contracts\DataTable;
use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Carbon;
use Carbon\CarbonPeriod;
class ManageCommissionController extends Controller
{
use HttpResponse;
protected $commission;
public function __construct(CommissionService $commission)
{
$this->commission = $commission;
}
public function index()
{
$products = Product::query()
->select(DB::raw('products.id, coalesce(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, 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) 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')
// ->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 . '</br>';
}
return $messages;
}
}
public function userCommission()
{
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 '<div class="badge badge-light fw-bold">' . $formattedDate . '</div>';
})
->editColumn('investor_name', function ($row) {
return '<div class="text-center">' . $row->monthlyUpdate->investor_name . ' </div>';
})
->editColumn('product_sold', function ($row) {
return '<div class="text-center">' . 'ABC' . '</div>';
})
->editColumn('month', function ($row) {
return '<div class="text-center">' . $row->created_at->format('M') . ' </div>';
})
->editColumn('total_investment', function ($row) {
return '<div class="text-center">' . $row->total_investment_or_commitment_amount . ' </div>';
})
->editColumn('applicable_rate', function ($row) {
return '<div class="text-center">' . $row->applicable_rate . '% </div>';
})
->editColumn('commission_type', function ($row) {
return '<div class="text-center">' . $row->type_of_commission . ' </div>';
})
->addColumn('action', function ($row) {
$view = route("get-user-commission", $row->id);
$edit = route("edit-user-commission", $row->id);
$btn = "<div class='text-end d-flex align-items-center justify-content-around'>
<a href=$view>
<i class='fa-regular fa-eye'></i>
</a>
<a href=$edit style='float:right'>
<i class='fa-solid fa-pen-to-square'></i>
</a>
</div>
";
return $btn;
})
->rawColumns(['investor_name', 'product_sold', 'month', 'total_investment', 'applicable_rate', 'commission_type', 'created_at', 'action'])
->make(true);
}
}
public function trailCommission()
{
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);
}
}