How to reduce long processing time in laravel - php
I have built an Employee Management System using Laravel 5.7. Calculating salary works fine for 100-150 employees (but taking a long time to process the data) & for more than 150 employees it is showing a time out error.
I want to add the feature to calculate the salary of all employees in one go & also reduce the processing time for the same. Would it be appropriate to use chunk() for that? If yes, how do I implement that?
Note:
The web application is for a BPO so there are so many types of logic to apply while calculating a salary. The code is too lengthy to share here, but if anyone wants to see the code, I can share it.
Front-end form screenshot
Page after calculation
<?php
public function calculate_salary(Request $request){
$this->validate($request,[
'employee_id' => 'required',
'attendance_types' => 'required',
'month' => 'required_without:choose_date',
'choose_date' => 'required_without:month'
]);
$download_salary = false;
$submit_salary = false;
if ($request->has('submit_data'))
{
$submit_salary = true;
}
else
{
$submit_salary = false;
}
if ($request->has('download_data'))
{
$download_salary = true;
}
else
{
$download_salary = false;
}
$dept = $request->input('salary_department');
$role = $request->input('salary_role');
$process = $request->input('salary_process');
$salary_dept = Department::where('id', $dept)->pluck('dept_name')->first();
$salary_role = Role::where('id', $role)->pluck('role_name')->first();
$salary_process = Process::where('id', $process)->pluck('process_name')->first();
if ($submit_salary == true || $download_salary == true)
{
$months = $request->input('month');
$month = $months[0];
$employee_ids = $request->input('employee_id');
$attendance_types = $request->input('attendance_types');
$attendance_type_temp_insert = $attendance_types[0];
$attendance_type = explode(',', $attendance_type_temp_insert);
if (!empty($request->input('choose_date')))
{
$dates = $request->input('choose_date');
$date = $dates[0];
}
else
{
$date = "";
}
}
else
{
$month = $request->input('month');
$employee_ids = $request->input('employee_id');
$attendance_type = $request->input('attendance_types');
$attendance_type_temp_insert = implode(',', $request->input('attendance_types'));
$date = $request->input('choose_date');
}
// Get start & end dates
$data = $this->get_salary_dates($month, $date);
$start_date = $data['start_date'];
$end_date = $data['end_date'];
$salary_start_date = $start_date->toDateString();
$salary_end_date = $end_date->toDateString();
$working_days_by_month = $this->get_working_days_of_given_month($start_date, $end_date);
$working_days = $working_days_by_month['working_days'];
$no_days = $working_days_by_month['no_days'];
Schema::create('temp_salary', function (Blueprint $table) {
$table->increments('id');
$table->integer('employee_id');
$table->string('employee_name');
$table->integer('working_days');
$table->float('emp_working_days');
$table->float('basic');
$table->float('hra');
$table->float('conveyance');
$table->float('spcl_inc');
$table->float('gross_salary');
$table->float('pf');
$table->float('esi');
$table->integer('headphone');
$table->integer('id_card');
$table->float('deductions');
$table->integer('pl_balance');
$table->integer('combo_balance');
$table->float('net_payable');
$table->string('month')->nullable();
$table->string('attendance_types');
$table->string('choose_date')->nullable();
$table->string('department')->nullable();
$table->string('role')->nullable();
$table->string('process')->nullable();
$table->timestamps();
$table->temporary();
});
$csv[] = ['Employee ID', 'Name','Department','Role','Process','Bank','Bank Account Number', 'Basic', 'HRA', 'Conveyance', 'Spcl Inc', 'Gross Salary','PF', 'ESI', 'Deductions', 'Total Working Days', 'Net Payable','Salary Month', 'Salary Start Date','Salary End Date'];
$csv1[] = ['Employee ID', 'Name','Department','Role','Process','Bank','Bank Account Number', 'Basic', 'HRA', 'Conveyance', 'Spcl Inc', 'Gross Salary','PF', 'ESI', 'Deductions', 'P','H','A','WO','WOP','WOH','UAL','Paid Leaves','PL','Combo','ual_deduct','Total Working Days', 'Net Payable','Salary Month', 'Salary Start Date','Salary End Date'];
foreach($employee_ids as $id) {
if($submit_salary == true){
DB::table('attendances')->where('employee_id', '=', $id)->whereBetween('attendance_date', [$start_date, $end_date])->update(['salary_status' => 1]);
}
$employee = Employee::find($id);
$name = $employee->name;
$emp_role = $employee->empRole->role_name;
$emp_department = $employee->empDepartment->dept_name;
$emp_process = $employee->empProcess->process_name;
$bank_account_number = $employee->bank_account_number;
$bank_name = $employee->bank_name;
$salary = Salary::where('employee_id', $id)->first();
$pl_balance = $salary->pl_balance;
$combo_balance = $salary->combo_balance;
$attendances = DB::table('attendances')->where('employee_id', '=', $id)->get();
if ($attendances->count() > 0)
{
foreach($attendances as $attendance)
{
$att_id = $attendance->id;
$att_date = Carbon::parse($attendance->attendance_date);
$dialer_in = strtotime($attendance->dialer_in_time);
$dialer_out = strtotime($attendance->dialer_out_time);
$bio_in = strtotime($attendance->biometric_in_time);
$bio_out = strtotime($attendance->biometric_out_time);
$bio_diff = $bio_out - $bio_in;
$crm_in = strtotime($attendance->crm_in_time);
$crm_out = strtotime($attendance->crm_out_time);
$week_off = $attendance->week_off;
$combo = $attendance->combo;
$holiday = $attendance->holiday;
$ual = $attendance->ual;
$dialer_duration = $attendance->dialer_difference;
$bio_duration = $attendance->biometric_difference;
$crm_duration = $attendance->crm_difference;
$chkatt = $this->get_attendance($attendance_type, $attendance->dialer_in_time, $attendance->dialer_out_time,$attendance->crm_in_time,$attendance->crm_out_time, $dialer_duration, $bio_duration, $crm_duration);
$attendance_status = $this->attendance_status($id, $chkatt, $holiday, $week_off, $ual);
DB::table('attendances')->where('id', $att_id)->update(['attendance_status' => $attendance_status]);
//echo $attendance_status;
}
}
$totalWorkingDays = $this->get_work_days($id,$start_date,$end_date,$combo_balance,$pl_balance, $submit_salary);
$totalWorkingDays = number_format((float)$totalWorkingDays, 2, '.', '');
$salary_data = $this->get_calculated_salary_data($no_days, $totalWorkingDays, $id, $submit_salary);
$basic = $salary_data['basic'];
$hra = $salary_data['hra'];
$conveyance = $salary_data['conveyance'];
$spcl_inc = $salary_data['spcl_inc'];
$gross_salary = $salary_data['gross_salary'];
$pf = $salary_data['pf'];
$esi = $salary_data['esi'];
$hp_charges = $salary_data['hp_charges'];
$idcard_charges = $salary_data['idcard_charges'];
$deductions = $salary_data['deductions'];
$net_payable = $salary_data['net_payable'];
DB::table('temp_salary')->insert(['employee_id' => $id, 'employee_name' => $name, 'working_days' => $working_days, 'emp_working_days' => $totalWorkingDays, 'basic' => $basic, 'hra' => $hra, 'conveyance' => $conveyance, 'spcl_inc' => $spcl_inc, 'gross_salary' => $gross_salary, 'pf' => $pf, 'esi' => $esi, 'headphone' => $hp_charges, 'id_card' => $idcard_charges, 'deductions' => $deductions, 'pl_balance' => $pl_balance, 'combo_balance' => $combo_balance, 'net_payable' => $net_payable, 'month' => $month, 'attendance_types' => $attendance_type_temp_insert, 'choose_date' => $date, 'department' => $salary_dept, 'role' => $salary_role, 'process' => $salary_process]);
$csv[] = [$id, $name, $emp_department, $emp_role, $emp_process, $bank_name, $bank_account_number, $basic, $hra, $conveyance, $spcl_inc, $gross_salary, $pf, $esi, $deductions, $totalWorkingDays, $net_payable, $month, $start_date, $end_date];
$get_days_status = $this->get_days_status($id, $start_date, $end_date);
$pCount = $get_days_status['pCount'];
$HalfDaysCount = $get_days_status['hCount'];
$lateLeaveCount = $get_days_status['late_leave'];
$wopCount = $get_days_status['wopCount'];
$leaves_count = $get_days_status['leaves_count'];
$UalCount = $get_days_status['UalCount'];
$woCount = $get_days_status['woCount'];
$wohCount = $get_days_status['wohCount'];
$ual_deduct = ($UalCount * 1.5) - $UalCount;
$get_paid_leaves_row = $get_days_status['pl_leaves'];
$csv1[] = [$id, $name, $emp_department, $emp_role, $emp_process, $bank_name, $bank_account_number, $basic, $hra, $conveyance, $spcl_inc, $gross_salary, $pf, $esi, $deductions, $pCount,$HalfDaysCount,$leaves_count,$woCount,$wopCount,$wohCount,$UalCount,$get_paid_leaves_row,$pl_balance, $combo_balance,$ual_deduct, $totalWorkingDays, $net_payable, $month, $start_date, $end_date];
}
$datas = DB::table('temp_salary')->get();
if($submit_salary == true){
return Excel::create('Employee_salary_report', function($excel) use ($csv) {
$excel->sheet('Employee_salary_report', function($sheet) use ($csv) {
$sheet->fromArray($csv, null, 'A1', false, false)
->getStyle('A1')
->getAlignment()
->setWrapText(true);
});
})->download('csv');
}
if($download_salary == true){
return Excel::create('salary_report', function($excel) use ($csv1) {
$excel->sheet('salary_report', function($sheet) use ($csv1) {
$sheet->fromArray($csv1, null, 'A1', false, false)
->getStyle('A1')
->getAlignment()
->setWrapText(true);
});
})->download('csv');
}
Schema::drop('temp_salary');
$departments = Department::all();
$processes = Process::all();
$roles = Role::all();
return view('sys_mg.salaries.get-salary')->with(['datas'=>$datas,'departments' => $departments, 'processes' => $processes, 'roles' => $roles, 'salary_dept' => $salary_dept, 'salary_role' => $salary_role, 'salary_process'=>$salary_process, 'salary_month'=>$month,'salary_startDate' => $salary_start_date, 'salary_endDate' => $salary_end_date, 'attendance_check_type' => $attendance_type]);
}
This is a huge process, doing many things at once, some of them deeply nested in each other.
The function is very, very long, which means it probably needs to be abstracted into various methods and classes (better OOP).
You may also be running into the N+1 problem with some of your Laravel queries, although it's hard to say at a glance.
I would recommend using Laravel's Queues, and adding each employee's payroll calculation to the queue: https://laravel.com/docs/5.8/queues
You can then use a worker process to perform each one individually.
All the database updates and transactions means PHP is constantly going to-and-fro from your database. Try to perform as many operations in pure code as possible, and then once completed, write to the DB. (Where possible, this is not a blanket rule).
Initially I would say, consider creating a SalaryCalculator class with methods such as getAttendances() and calculateSalaryFromEmployeeAttendances().
Separately, create a CSV exporter class. Process all your payroll calculations first, store the results in the DB, and then convert to CSV on demand later.
You'll refactor this later once you are able to look at all the different parts, someone else may be able to suggest a better way to break it down, but in some ways there are no right answers... just start with some OOP and abstraction of methods, and it will get better.
Use microtime(true) to get and calculate the time differences between when you start and finish operations, to start to track how long each function runs for... and go looking for the big optimisations first. What is the slowest part? Why?
You could probably ask a dozen Stack Overflow questions to optimise each of those methods, and that's Ok!
Related
Laravel variable cache
I need to cache the results from Steam API parsing. And so the cached result lasts 15 minutes. I have a code: public function load() { if (Auth::guest()) return response()->json(['success' => false, 'msg' => 'You need login!']); $inventory = $this->getInventory(file_get_contents('http://steamcommunity.com/inventory/' . $this->user->steamid64 . '/570/2?l=russian&count=5000', true)); if (!$inventory) { return response()->json(['success' => false, 'msg' => 'Error']); } $items = []; $items_with_prices = json_decode(\Storage::get('prices.txt')); $items_with_prices_by_key = []; foreach ($items_with_prices->items as $item_price_key => $item_price_data) { $items_with_prices_by_key[$item_price_key] = $item_price_data->price; } foreach ($inventory['rgInventory'] as $info) { $item = $inventory['rgDescriptions'][$info['classid'] . '_' . $info['instanceid']]; if ($item['tradable'] == 0) continue; $price = 0;//InventoryController::getItemPrice($item['market_hash_name']); if (array_key_exists($item['market_hash_name'], $items_with_prices_by_key)) { $price = $items_with_prices_by_key[$item['market_hash_name']]; } if (!$price) continue; if ($price < 1) $price = 0.64; $type = $this->getType($item['type']); $items[] = [ 'id' => $info['id'], 'classid' => $item['icon_url'], 'price' => round($price, 2), 'type' => $type ]; } usort($items, function($a, $b){ return ($b['price'] - $a['price']); }); return response()->json(['success' => true, 'items' => $items]); } This code only works when a site user clicks on the "show my items" button and a request is sent to the list of user items in Steam Dota 2. Now if click constantly to get a list of items, Steam can block the server’s IP address for 24 hours. As I understand it, I need to throw the result of a $inventory variable into the cache. I create database table cache with fields id, user_id, items, date. How can I now cache the result from a $inventory variable of 15 minutes?
Here is basic caching in laravel $rememberTimeInSeconds = 3600; $cachedResult = Cache::remember('name_of_your_cache', $rememberTimeInSeconds, function(){ // It can be any logic I just showing a simple query. $users = User::all(); return $users; });
How to call json from multiple nested if condition
I am using CodeIgniter. I am working on the small project which is a Batch list. Now If an admin wants to create the batch list then should enter the start date and end date and start time and end time then it will check in the database that batch is running on the same date and time? If yes then it will display the message if not then it will create a new batch list. If the date is the same the time should be different. Now My logic is, I am comparing the first new_start_date with exist_start_date and exist_end_date if date found in between then it will check the time. It's working till date compare. Even it's checking the time but from there how to exit the process and call the JSON? because from there my JSON not working. I added "echo "time not match";" from there I am not able to call the JSON I am getting the output on my network tab. I am getitng the output enter 1enter 2{"error":true,"msg":"Batch Created"}time not match Would you help me out in this? $id = $this->input->post('venue_id'); $venue_id = implode(',',$id); $activity_list_id = $this->input->post('activity_name'); $new_batch_start_date = date('Y-m-d',strtotime($this->input->post('start_date'))); $new_batch_end_date = date('Y-m-d',strtotime($this->input->post('end_date'))); $new_batch_start_time = $this->input->post('start_time'); $new_batch_end_time = $this->input->post('end_time'); $days = implode(',',$this->input->post('days')); //print_r($days); if($new_batch_start_date >= $new_batch_end_date) { $response['error'] = false; $response['msg'] = "End Date Should be Greater than Start Date"; echo json_encode($response); return false; } //convert in Time Format $new_batch_start_time = strtotime($new_batch_start_time); $new_batch_end_time = strtotime($new_batch_end_time); $venue = $this->input->post('name'); $data = array( 'activity_list_id' => $this->input->post('activity_name'), 'batch_venue_id' => $venue_id, 'batch_name' => $this->input->post('batch_name'), 'start_date' => date('Y-m-d',strtotime($this->input->post('start_date'))), 'end_date' => date('Y-m-d',strtotime($this->input->post('end_date'))), 'start_time' => $this->input->post('start_time'), 'end_time' => $this->input->post('end_time'), 'total_capacity' => $this->input->post('total_capecity'), 'batch_status' => 1, 'created_by' => trim($this->session->userdata['login_data']['user_id']), 'created_date' => date('d-m-Y h:i:s A'), 'batch_days' => $days ); $get_batch_details = $this->Batch_model->fetchBatches(); if(!empty($get_batch_details)) { foreach ($get_batch_details as $rows) { $exist_batch_start_date = $rows->start_date; $exist_batch_end_date = $rows->end_date; $batch_time1 = strtotime($rows->start_time); $batch_time2 = strtotime($rows->end_time); $batch_venue_id = explode(',',$rows->batch_venue_id); $common_venue_id = array_intersect($id,$batch_venue_id); //print_r($common_venue_id); if($common_venue_id) { echo "enter 1"; //if new batch start date between existing batch start date if($exist_batch_start_date <= $new_batch_start_date && $exist_batch_end_date >= $new_batch_start_date ){ echo "enter 2"; if($batch_time1 <= $new_batch_start_time && $batch_time2 > $new_batch_start_time){ $msg = "Other Batch Alredy Running On from Date $batch_start_date to $exist_batch_end_date on Time : $batch_time1 to $batch_time2. Please Change Time Slot or Start And End Date"; $response['error'] = false; $response['msg'] = $msg; echo json_encode($response); exit; } else{ $result = $this->Batch_model->createBatch($data); echo "time not match"; print_r($result); } break; } //if date is different else { $result = $this->Batch_model->createBatch($data); } }else { $result = $this->Batch_model->createBatch($data); } } } //first time creating batch else { $result = $this->Batch_model->createBatch($data); } Mobel function createBatch($data){ if($this->db->insert('batch_list',$data)) { $response['error'] = true; $response['msg'] = "Batch Created"; echo json_encode($response); } else { $response['error'] = true; $response['msg'] = "Failed to Create Batch"; echo json_encode($response); } } function fetchBatches() { $result = $this->db->where(['batch_list.batch_status'=>1,'activity_list.act_status'=>1]) ->from('batch_list') ->join('activity_list','activity_list.activity_id = batch_list.activity_list_id') ->get() ->result(); return $result; } Ajax success: function(response){ var data = JSON.parse(response); if (data.error == true){ swal({ title: "Success", text: data.msg , type: "success" }).then(function(){ location.reload(); } ); } else { swal({ title: "Warning", text: data.msg , type: "warning" }); } } Would you help me out in this issue?
your entire approach is a bit messy because you find yourself in a ton of redundant code fragments and nobody is able to understand what exactly you want - i gv you some hints here including an example based on your code Use Exceptions - it's perfect for your case - if something goes wrong - stop it Try to filter your need to an extent of one single task und try to solve it - and only after that go to the next task Always - remember always - think about one term - if you find repeatedly the same code in your application - you know something is wrong - and you should refactor it - don't be ashamed about redundancies - they do always happen - but if you find them, you must refactor those code snippets Now to your example What are your tasks here ? you can try to ask your database if a batch is already running - you dont need to iterate over the entire table entries Compare both input Dates from Administrator - if start date is in the future of end date, instantely stop the application your intersection isn't really clear to me what you want to achieve here - but i'm really convinced you can ask the database here too (catchword: find_in_set) Based on that information we can start to develop things now ;) (if i don't have everything just complete the list above and try to implement your task) Controller: try { $id = $this->input->post('venue_id'); $venue_id = implode(',',$id); $activity_list_id = $this->input->post('activity_name'); $new_batch_start_date = date('Y-m-d',strtotime($this->input->post('start_date'))); $new_batch_end_date = date('Y-m-d',strtotime($this->input->post('end_date'))); $new_batch_start_time = $this->input->post('start_time'); $new_batch_end_time = $this->input->post('end_time'); $days = implode(',',$this->input->post('days')); $objDateStart = DateTime::createFromFormat('Y-m-d h:i a', $new_batch_start_date.' '.$new_batch_start_time); $objDateEnd = DateTime::createFromFormat('Y-m-d h:i a', $new_batch_end_date.' '.$new_batch_end_time); if ($objDateEnd < $objDateStart) throw new Exception('End Date Should be Greater than Start Date'); if ($this->Batch_model->hasBatchesBetweenDates($objDateStart, $objDateEnd)) throw new Exception('Other Batch already running On from '.$objDateStart->format('d-m-Y H:i').' to '.$objDateEnd->format('d-m-Y H:i').'. Please Change Time Slot for Start and End Date'); $data = array( 'activity_list_id' => $this->input->post('activity_name'), 'batch_venue_id' => $venue_id, 'batch_name' => $this->input->post('batch_name'), 'start_date' => $objDateStart->format('Y-m-d'), 'end_date' => $objDateEnd->format('Y-m-d'), 'start_time' => $objDateStart->format('H:i'), 'end_time' => $objDateEnd->format('H:i'), 'total_capacity' => $this->input->post('total_capecity'), 'batch_status' => 1, 'created_by' => trim($this->session->userdata['login_data']['user_id']), 'created_date' => date('d-m-Y h:i:s A'), 'batch_days' => $days ); $this->Batch_model->createBatch($data); } catch(Exception $e) { $arrError = [ 'error' => false, 'msg' => $e->getMessage() ]; echo json_encode($arrError); } Model: public function hasBatchesBetweenDates(DateTime $objDateStart, DateTime $objDateEnd) { $query = $this->db ->from('batch_list') ->join('activity_list','activity_list.activity_id = batch_list.activity_list_id') ->where('CONCAT(start_date,\' \',start_time) >=', $objDateStart->format('Y-m-d H:i:s')) ->or_group_start() ->where('CONCAT(end_date, \' \', end_time) <=', $objDateEnd->format('Y-m-d H:i:s')) ->where('CONCAT(end_date, \' \', end_time) >=', $objDateStart->format('Y-m-d H:i:s')) ->group_end() ->get(); return ($query->num_rows() > 0); } i hope you understand the concepts here - if you've questions - don't hesitate to ask
about laravel form calculation
I had encountered the calculation in Laravel or maybe PHP stuff, I would like to ask for solution or maybe some others approach to get the things done. These are the codes in the Model public function getRedeemCount($member_id){ $count = DB::table('stamps')->where('user_id', '=', $member_id)->select('stamp_counter')->first(); return $count; } public function getFreeOfferCount($member_id){ $free_offer_count = DB::table('stamps')->where('user_id', '=', $member_id)->select('free_offer_counter')->first(); return $free_offer_count; } These are the codes in the Controller public function redeemFreeOffer(Request $request) { $free_offer_counter = $request->input('minus_free_offer_counter'); $member_id = $request->input('sub_id'); $total_stamp_count = $this->userModel->getRedeemCount($member_id); $free_offer_count = $this->userModel->getFreeOfferCount($member_id); if(!$free_offer_count){ $insert_arr = array( 'user_id' => $member_id, 'free_offer_counter' => $free_offer_counter, 'created_at'=>date("Y-m-d H:i:s") ); $stamps = DB::table('stamps')->insert($insert_arr); if($stamps){ $arr = array('status' => 1,'message'=>'success','value'=>$free_offer_counter); } } else { $total_stamp_count->stamp_counter; $total_free_offer_count = floor($total_stamp_count->stamp_counter/10); $current_offer_count = $free_offer_count->free_offer_counter - $free_offer_counter; $update_arr = array( 'free_offer_counter' => $current_offer_count, 'updated_at' => date("Y-m-d H:i:s") ); $stamps = DB::table('stamps')->where('user_id', $member_id)->update($update_arr); if ($stamps) { $arr = array('status' => 1, 'message' => 'success', 'value' => $current_offer_count); } } echo json_encode($arr); } Since I am using jQuery AJAX, so there's too much code, but I think it should be enough information for now. If it is insufficient, I will provide more in future. The problem is how do I inject $total_free_offer_count into $current_offer_count? I do not have any columns that stored $total_free_offer_count. $total_stamp_count->stamp_counter; $total_free_offer_count = floor($total_stamp_count->stamp_counter/10); $current_offer_count = $free_offer_count->free_offer_counter - $free_offer_counter;
No 'Access-Control-Allow-Origin' header even thou other requests from the same domain are working
I have a strange error, with No 'Access-Control-Allow-Origin' header. I understand that I have to give some permission the origin domain(client) to be able to access the server and that works fine with some other requests I make. But when it comes to one other function to call, it says No 'Access-Control-Allow-Origin' header only. I have my client hosted in heroku and server in godaddy... This is the function when that error shows: public function store(Request $request) { $ffSpending = new FriendsFamilySpending(); $ffSpending->user_id = Auth::user()->id; $ffSpending->team_id = Auth::user()->student->team_id; $ffSpending->management_units = $request->input('management_units'); $ffSpending->sales_units = $request->input('sales_units'); $ffSpending->product_units = $request->input('product_units'); $ffSpending->ip_units = $request->input('ip_units'); $ffSpendingRules = array( 'management_units' => 'required', 'sales_units' => 'required', 'product_units' => 'required', 'ip_units' => 'required' ); $ffSpendingValidator = \Validator::make($ffSpending->getAttributes(), $ffSpendingRules); if ($ffSpendingValidator->passes()) { $team = Team::find($ffSpending->team_id); $currentBalance = $this->teamService->checkBalance($team); //Baseline costs $BASELINE = FriendsFamilySpending::BASELINE; //Get Prices for each unit $IP_ONE_TIME_COST = OperationalExpensePrice::getPrice(OperationalExpense::IP, $request->input('ip_units'), OperationalExpenseSerie::FF);//one-time IP costs $MANAGEMENT = OperationalExpensePrice::getPrice(OperationalExpense::MANAGEMENT, $request->input('management_units'), OperationalExpenseSerie::FF); $SALES = OperationalExpensePrice::getPrice(OperationalExpense::SALES, $request->input('sales_units'), OperationalExpenseSerie::FF); $PRODUCT = OperationalExpensePrice::getPrice(OperationalExpense::PRODUCT, $request->input('product_units'), OperationalExpenseSerie::FF); //Monthly Costs $quartlyCosts = $BASELINE + $MANAGEMENT + $SALES + $PRODUCT; $newBalance = $currentBalance; $workingMoney = $newBalance - $IP_ONE_TIME_COST; $minimumMonth = 12; // the minimum amount of time they must be able to afford (Staging Day = 12 months) //Calculate how many months they (team) can survive $survivingMonths = 0; while ($workingMoney >= $quartlyCosts) { $workingMoney = $workingMoney - $quartlyCosts; //deduct monthly costs from the current working money $survivingMonths = $survivingMonths + 3; // quartly spending if ($survivingMonths > 24) { // team survives the whole staging and deal day break; } } // month to minute - Conversation ratio $monthToMinute = 6.25; // (75min / 12month) = 6.25min a month $totalMinutes = $survivingMonths * $monthToMinute; $minMinutes = 75; //the minimum amount of time they must be able to afford //Check if team makes it till the deal day if ($survivingMonths < $minimumMonth) { return response()->json(['message' => 'With your current spending plan, you will not make it to deal day. Please try again with less spending plan. Currently you run out of money after ' . $totalMinutes . ' minutes. You have to survive at least 75 minutes."', 'success' => false, 'status' => 500, 'data' => null]); } $ffSpendingRes = $this->ffSpendingService->save($ffSpending); if ($ffSpendingRes) { $this->ffSpendingService->score(Auth::user()->student->team->class_id); // update ff spending scoring $this->ffSpendingService->updateTotalScore(Auth::user()->student->team->class_id); //Update balance $team = Team::find($ffSpending->team_id); $this->teamService->updateBalance($team, $workingMoney); if ($survivingMonths >= $minimumMonth && $survivingMonths < 24) { $survivingMonthsAfterStagingDay = $survivingMonths - $minimumMonth; $survivingMonthsAfterStagingDayToMinute = $survivingMonthsAfterStagingDay * $monthToMinute; $outOfMoney = new OutOfMoney(); $outOfMoney->team_id = Auth::user()->student->team_id; $outOfMoney->stage = OutOfMoney::$FF_SPENDING; $outOfMoney->is_running_out_of_money_on_deal_day = 1; $outOfMoney->month = $survivingMonthsAfterStagingDay; $outOfMoney->minutes = $survivingMonthsAfterStagingDayToMinute; $outOfMoney->monthly_cost = $quartlyCosts; $outOfMoney->save(); } else { $outOfMoney = new OutOfMoney(); $outOfMoney->team_id = Auth::user()->student->team_id; $outOfMoney->stage = OutOfMoney::$FF_SPENDING; $outOfMoney->is_running_out_of_money_on_deal_day = 0; $outOfMoney->monthly_cost = $quartlyCosts; $outOfMoney->save(); } return response()->json(['message' => 'Success', 'success' => true, 'status' => 200, 'data' => $ffSpending]); } else { return response()->json(['message' => 'Error', 'success' => false, 'status' => 500, 'data' => null]); } } else { return response()->json(['message' => 'Validation Failed', 'success' => false, 'status' => 400, 'data' => array('class' => $ffSpendingRules)]); } Note: if I change the function and make it simple, like return 'test', it does not show anymore that origin access error. I wonder if there is any problem with function, why does not it show the actuall error, but it show that cors error instead. Any suggestion?
What's happening is an ORIGINS request is coming in and getting declined because it's not in your allowed methods. 'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE', 'ORIGINS'] You'll also want to set your allowedOrigins to something. I always use MDN for reference.
Laravel 5 ORM update request, like date_add
I beg to excuse me for my poor english. So, I have Laravel 5 ORM, and i need to make request that should add date to some rows, like MySQL DATE_ADD. Input is single date interval and array of id's, output is rows of database, that was changed by adding date interval. Ideally, it should be one ORM request. I know that it is possible to use "bad" way and get all rows, update it in a code, and insert to database, but imho it's not good. I hope answer will be link to some help site or some code if it's does not complicate you. Thanks for your attention! public function update($id) { $user_id = Auth::user()->id; $rep_task = RepTask::find($id); $cl_task = \Request::has('json') ? json_decode(\Request::input('json'),true) : \Request::all(); $ids = []; $task_id = $rep_task->task_id; $rep_tasks = RepTask::where('task_id', '=', $task_id) ->select('id') ->get(); $new_date = date_create_from_format(self::DATE_FULLCALENDAR_FORMAT, $cl_task['new_date']); $selected_task_date = date_create_from_format(self::DATE_MYSQL_FORMAT, $rep_task->start_date); $diff = date_diff($selected_task_date, $new_date); if(\Request::has('json')) { $ids = [1,2,3]; //this for easy understanding DB::table('rep_task') ->whereIn('id', $ids) ->update(['start_date' => DB::raw('DATE_ADD(start_date, INTERVAL ' . $diff->d . ' DAY)')]); $out_json = ['updated' => $ids]; return json_encode($out_json, JSON_UNESCAPED_UNICODE); } else { $start_date = 0; $end_date = 0; if (!isset($cl_task['name']) || !isset($cl_task['text'])) return "{'error':'columns are not defined'}"; if (isset($cl_task['start_date']) && isset($cl_task['end_date'])) { $dt = date_create_from_format(self::DATE_FULLCALENDAR_FORMAT, $cl_task['start_date']); $start_date = $dt->format(self::DATE_MYSQL_FORMAT); $dt = date_create_from_format(self::DATE_FULLCALENDAR_FORMAT,$cl_task['end_date']); $end_date = $dt->format(self::DATE_MYSQL_FORMAT); } $rep_task->name = $cl_task['name']; $rep_task->text = $cl_task['text']; $rep_task->start_date = $start_date; $rep_task->end_date = $end_date; $rep_task->users_id = $user_id; $rep_task->save(); } $user_id = Auth::user()->id; $tasks = Task::getAllTasksByUserFullcalendar($user_id); return view( 'task.index', [ 'tasks' => $tasks ] ); }