/
home
/
sjslayjy
/
public_html
/
ccbfsoution
/
app
/
Http
/
Controllers
/
Admin
/
Upload File
HOME
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; class SilageMakingController extends Controller { // public function index(Request $request) // { // $user = Auth::user(); // $role = $user->role; // $siteId = $user->site_name; // // 1️⃣ Load all sites (for admin dropdown) // $sites = DB::table('master_sites')->pluck('site_name', 'id'); // // 2️⃣ Determine selected site // $selectedSiteId = $request->input('site_id'); // if ($role != 1) { // $selectedSiteId = $siteId; // } // // 3️⃣ Grab distinct blocks for dropdown filter // $blocksQuery = DB::table('silage_making'); // if (!empty($selectedSiteId)) { // $blocksQuery->where('site_id', $selectedSiteId); // } // $blocks = $blocksQuery->select('block_name')->distinct()->orderBy('block_name')->pluck('block_name'); // // 4️⃣ Base query // $q = DB::table('silage_making as s')->select('s.*'); // if (!empty($selectedSiteId)) { // $q->where('s.site_id', $selectedSiteId); // } // // 5️⃣ Block filter // if ($request->filled('block_name')) { // $q->where('s.block_name', $request->block_name); // } // // 6️⃣ Free-text search // if ($request->filled('search')) { // $term = '%' . $request->search . '%'; // $q->where(function ($sub) use ($term) { // $sub->where('s.plot_name', 'like', $term) // ->orWhere('s.silage_making_method', 'like', $term); // }); // } // // 7️⃣ Pagination // $silagemakings = $q->orderBy('s.harvest_date', 'desc') // ->paginate(10) // ->appends($request->only(['block_name', 'search', 'site_id'])); // // 8️⃣ Load machines and tractors // $allMachines = DB::table('master_machine')->pluck('machine_name', 'id')->toArray(); // $allTractors = DB::table('master_tractors')->pluck('tractor_name', 'id')->toArray(); // // 9️⃣ Process display fields // foreach ($silagemakings as $silagemaking) { // // Machine names // $machineIds = explode(',', $silagemaking->machine_id ?? ''); // $machineNames = array_filter(array_map(function ($id) use ($allMachines) { // return $allMachines[trim($id)] ?? null; // }, $machineIds)); // $silagemaking->machine_names_display = $machineNames ? implode(', ', $machineNames) : '-'; // // Tractor names // $tractorIds = explode(',', $silagemaking->tractor_id ?? ''); // $tractorNames = array_filter(array_map(function ($id) use ($allTractors) { // return $allTractors[trim($id)] ?? null; // }, $tractorIds)); // $silagemaking->tractor_names_display = $tractorNames ? implode(', ', $tractorNames) : '-'; // // Maintenance JSON // $silagemaking->parsed_major_maintenance = []; // if (!empty($silagemaking->major_maintenance)) { // try { // $decoded = json_decode($silagemaking->major_maintenance, true); // if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { // $silagemaking->parsed_major_maintenance = $decoded; // } // } catch (\Exception $e) { // error_log('Error decoding major_maintenance JSON: ' . $e->getMessage()); // } // } // } // // 🔟 Return view // return view('silagemaking.index', compact( // 'blocks', // 'silagemakings', // 'sites', // 'selectedSiteId', // 'role' // )); // } // public function index(Request $request) // { // $user = Auth::user(); // $role = $user->role; // $siteId = $user->site_name; // // ✅ 1. Load all sites (for admin dropdown) // $sites = DB::table('master_sites')->pluck('site_name', 'id'); // // ✅ 2. Determine selected site // $selectedSiteId = $request->input('site_id'); // if ($role != 1) { // $selectedSiteId = $siteId; // } // // ✅ 3. Grab distinct blocks for dropdown filter from silage_making table // $blocksQuery = DB::table('silage_making') // ->select('block_name')->distinct()->orderBy('block_name'); // if (!empty($selectedSiteId)) { // $blocksQuery->where('site_id', $selectedSiteId); // } // $blocks = $blocksQuery->pluck('block_name'); // // ✅ 4. Get Total Available Yield per seed_name from harvesting_update // // (matching by seed_name, not seed_id) for Silage Making // $totalAvailableYields = DB::table('harvesting_update') // ->select('seed_name', DB::raw('SUM(yield_mt) as total_available_yield')) // ->where('harvest_purpose', 'Silage Making') // ->groupBy('seed_name') // ->pluck('total_available_yield', 'seed_name'); // // ✅ 5. Main query - Get data from silage_making table // $q = DB::table('silage_making as s') // ->select( // 's.*', // 'users.name as user_name' // ) // ->leftJoin('users', 's.user_id', '=', 'users.id'); // if (!empty($selectedSiteId)) { // $q->where('s.site_id', $selectedSiteId); // } // // ✅ 6. Filters // if ($request->filled('block_name')) { // $q->where('s.block_name', $request->block_name); // } // if ($request->filled('search')) { // $term = '%' . $request->search . '%'; // $q->where(function ($sub) use ($term) { // $sub->where('s.plot_name', 'like', $term) // ->orWhere('s.block_name', 'like', $term) // ->orWhere('s.seed_name', 'like', $term) // ->orWhere('s.silage_making_method', 'like', $term) // ->orWhere('users.name', 'like', $term); // }); // } // // ✅ 7. Paginate // $silagemakings = $q->orderBy('s.harvest_date', 'desc') // ->paginate(10) // ->appends($request->only(['block_name', 'search', 'site_id'])); // // ✅ 8. Load machines and tractors // $allMachines = DB::table('master_machine')->pluck('machine_name', 'id'); // $allTractors = DB::table('master_tractors')->pluck('tractor_name', 'id'); // // ✅ 9. Process display fields and calculate yield metrics // foreach ($silagemakings as $silagemaking) { // // ✅ Calculate yield metrics based on seed_name matching // $seedName = $silagemaking->seed_name; // // Total Available Yield from harvesting_update table (matching by seed_name) // $silagemaking->total_available_yield = $totalAvailableYields[$seedName] ?? 0; // // Required Yield MT (from silage_making table yield_mt) // $silagemaking->required_yield_mt = $silagemaking->yield_mt ?? 0; // // Adjusted Yield MT (Required Yield MT से 80% कम, मतलब 20% बचे) // $silagemaking->adjusted_yield_mt = $silagemaking->required_yield_mt * 0.2; // // Remaining Yield MT (Total Available - Adjusted Yield) // $silagemaking->remaining_yield_mt = $silagemaking->total_available_yield - $silagemaking->adjusted_yield_mt; // // ✅ Handle machine names // if (!empty($silagemaking->machine_id)) { // $machineIds = explode(',', $silagemaking->machine_id); // $silagemaking->machine_names_display = collect($machineIds)->map(function($id) use ($allMachines) { // return $allMachines[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->machine_names_display = '-'; // } // // ✅ Handle tractor names // if (!empty($silagemaking->tractor_id)) { // $tractorIds = explode(',', $silagemaking->tractor_id); // $silagemaking->tractor_names_display = collect($tractorIds)->map(function($id) use ($allTractors) { // return $allTractors[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->tractor_names_display = '-'; // } // // ✅ Handle major maintenance JSON // $silagemaking->parsed_major_maintenance = []; // if ($silagemaking->major_maintenance) { // $decoded = json_decode($silagemaking->major_maintenance, true); // if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { // $silagemaking->parsed_major_maintenance = $decoded; // } // } // // Map harvest_date from silage_making table // $silagemaking->harvest_date = $silagemaking->harvest_date; // } // // ✅ Handle AJAX requests // if ($request->ajax()) { // return view('silagemaking.partials.table', compact('silagemakings'))->render(); // } // // ✅ Return view // return view('silagemaking.index', compact( // 'blocks', // 'silagemakings', // 'sites', // 'selectedSiteId', // 'role' // )); // } // public function index(Request $request) // { // $user = Auth::user(); // $role = $user->role; // $siteId = $user->site_name; // // ✅ 1. Load all sites (for admin dropdown) // $sites = DB::table('master_sites')->pluck('site_name', 'id'); // // ✅ 2. Determine selected site // $selectedSiteId = $request->input('site_id'); // if ($role != 1) { // $selectedSiteId = $siteId; // } // // ✅ 3. Grab distinct blocks for dropdown filter from silage_making table // $blocksQuery = DB::table('silage_making') // ->select('block_name')->distinct()->orderBy('block_name'); // if (!empty($selectedSiteId)) { // $blocksQuery->where('site_id', $selectedSiteId); // } // $blocks = $blocksQuery->pluck('block_name'); // // ✅ 4. MODIFIED: Get Total Available Yield per seed_name from harvest_store_manage // // (product_id = 1 for harvested products, matching by seed_name and site) // $totalAvailableYieldsQuery = DB::table('harvest_store_manage') // ->select('seed_name', DB::raw('SUM(yield_mt) as total_available_yield')) // ->where('product_id', 1) // Only harvested products // ->groupBy('seed_name'); // if (!empty($selectedSiteId)) { // $totalAvailableYieldsQuery->where('site_id', $selectedSiteId); // } // $totalAvailableYields = $totalAvailableYieldsQuery->pluck('total_available_yield', 'seed_name'); // // ✅ 5. Main query - Get data from silage_making table // $q = DB::table('silage_making as s') // ->select( // 's.*', // 'users.name as user_name' // ) // ->leftJoin('users', 's.user_id', '=', 'users.id'); // if (!empty($selectedSiteId)) { // $q->where('s.site_id', $selectedSiteId); // } // // ✅ 6. Filters // if ($request->filled('block_name')) { // $q->where('s.block_name', $request->block_name); // } // if ($request->filled('search')) { // $term = '%' . $request->search . '%'; // $q->where(function ($sub) use ($term) { // $sub->where('s.plot_name', 'like', $term) // ->orWhere('s.block_name', 'like', $term) // ->orWhere('s.seed_name', 'like', $term) // ->orWhere('s.silage_making_method', 'like', $term) // ->orWhere('users.name', 'like', $term); // }); // } // // ✅ 7. Paginate // $silagemakings = $q->orderBy('s.harvest_date', 'desc') // ->paginate(10) // ->appends($request->only(['block_name', 'search', 'site_id'])); // // ✅ 8. Load machines and tractors // $allMachines = DB::table('master_machine')->pluck('machine_name', 'id'); // $allTractors = DB::table('master_tractors')->pluck('tractor_name', 'id'); // // ✅ 9. Process display fields and calculate yield metrics // foreach ($silagemakings as $silagemaking) { // // ✅ MODIFIED: Calculate yield metrics based on seed_name matching from harvest_store_manage // $seedName = $silagemaking->seed_name; // // Total Available Yield from harvest_store_manage table (product_id = 1, matching by seed_name) // $silagemaking->total_available_yield = $totalAvailableYields[$seedName] ?? 0; // // Required Yield MT (from silage_making table yield_mt) // $silagemaking->required_yield_mt = $silagemaking->yield_mt ?? 0; // // Adjusted Yield MT (Required Yield MT से 80% कम, मतलब 20% बचे) // $silagemaking->adjusted_yield_mt = $silagemaking->required_yield_mt * 0.2; // // Remaining Yield MT (Total Available - Required Yield, not Adjusted) // $silagemaking->remaining_yield_mt = $silagemaking->total_available_yield - $silagemaking->required_yield_mt; // // ✅ Handle machine names // if (!empty($silagemaking->machine_id)) { // $machineIds = explode(',', $silagemaking->machine_id); // $silagemaking->machine_names_display = collect($machineIds)->map(function($id) use ($allMachines) { // return $allMachines[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->machine_names_display = '-'; // } // // ✅ Handle tractor names // if (!empty($silagemaking->tractor_id)) { // $tractorIds = explode(',', $silagemaking->tractor_id); // $silagemaking->tractor_names_display = collect($tractorIds)->map(function($id) use ($allTractors) { // return $allTractors[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->tractor_names_display = '-'; // } // // ✅ Handle major maintenance JSON // $silagemaking->parsed_major_maintenance = []; // if ($silagemaking->major_maintenance) { // $decoded = json_decode($silagemaking->major_maintenance, true); // if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { // $silagemaking->parsed_major_maintenance = $decoded; // } // } // // Map harvest_date from silage_making table // $silagemaking->harvest_date = $silagemaking->harvest_date; // } // // ✅ Handle AJAX requests // if ($request->ajax()) { // return view('silagemaking.partials.table', compact('silagemakings'))->render(); // } // // ✅ Return view // return view('silagemaking.index', compact( // 'blocks', // 'silagemakings', // 'sites', // 'selectedSiteId', // 'role' // )); // } // public function index(Request $request) // { // $user = Auth::user(); // $role = $user->role; // $siteId = $user->site_name; // // ✅ 1. Load all sites (for admin dropdown) // $sites = DB::table('master_sites')->pluck('site_name', 'id'); // // ✅ 2. Determine selected site // $selectedSiteId = $request->input('site_id'); // if ($role != 1) { // $selectedSiteId = $siteId; // } // // ✅ 3. Grab distinct blocks for dropdown filter from silage_making table // $blocksQuery = DB::table('silage_making') // ->select('block_name')->distinct()->orderBy('block_name'); // if (!empty($selectedSiteId)) { // $blocksQuery->where('site_id', $selectedSiteId); // } // $blocks = $blocksQuery->pluck('block_name'); // // ✅ 4. Get Total Available Yield per seed_name from harvest_store_manage // // (product_id = 1 for harvested products, matching by seed_name and site) // $totalAvailableYieldsQuery = DB::table('harvest_store_manage') // ->select('seed_name', DB::raw('SUM(yield_mt) as total_available_yield')) // ->where('product_id', 1) // Only harvested products // ->groupBy('seed_name'); // if (!empty($selectedSiteId)) { // $totalAvailableYieldsQuery->where('site_id', $selectedSiteId); // } // $totalAvailableYields = $totalAvailableYieldsQuery->pluck('total_available_yield', 'seed_name'); // // ✅ 5. Main query - Get data from silage_making table // $q = DB::table('silage_making as s') // ->select( // 's.*', // 'users.name as user_name' // ) // ->leftJoin('users', 's.user_id', '=', 'users.id'); // if (!empty($selectedSiteId)) { // $q->where('s.site_id', $selectedSiteId); // } // // ✅ 6. Filters // if ($request->filled('block_name')) { // $q->where('s.block_name', $request->block_name); // } // if ($request->filled('search')) { // $term = '%' . $request->search . '%'; // $q->where(function ($sub) use ($term) { // $sub->where('s.plot_name', 'like', $term) // ->orWhere('s.block_name', 'like', $term) // ->orWhere('s.seed_name', 'like', $term) // ->orWhere('s.silage_making_method', 'like', $term) // ->orWhere('users.name', 'like', $term); // }); // } // // ✅ 7. Paginate // $silagemakings = $q->orderBy('s.harvest_date', 'desc') // ->paginate(10) // ->appends($request->only(['block_name', 'search', 'site_id'])); // // ✅ 8. Load machines and tractors // $allMachines = DB::table('master_machine')->pluck('machine_name', 'id'); // $allTractors = DB::table('master_tractors')->pluck('tractor_name', 'id'); // // ✅ 9. Process display fields and calculate yield metrics // foreach ($silagemakings as $silagemaking) { // // Calculate yield metrics based on seed_name matching from harvest_store_manage // $seedName = $silagemaking->seed_name; // // Total Available Yield from harvest_store_manage table (product_id = 1, matching by seed_name) // $silagemaking->total_available_yield = $totalAvailableYields[$seedName] ?? 0; // // Required Yield MT (from silage_making table yield_mt) // $silagemaking->required_yield_mt = $silagemaking->yield_mt ?? 0; // // Adjusted Yield MT (Required Yield MT से 80% कम, मतलब 20% बचे) // $silagemaking->adjusted_yield_mt = $silagemaking->required_yield_mt * 0.2; // // Remaining Yield MT (Total Available - Required Yield, not Adjusted) // $silagemaking->remaining_yield_mt = $silagemaking->total_available_yield - $silagemaking->required_yield_mt; // // Handle machine names // if (!empty($silagemaking->machine_id)) { // $machineIds = explode(',', $silagemaking->machine_id); // $silagemaking->machine_names_display = collect($machineIds)->map(function($id) use ($allMachines) { // return $allMachines[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->machine_names_display = '-'; // } // // Handle tractor names // if (!empty($silagemaking->tractor_id)) { // $tractorIds = explode(',', $silagemaking->tractor_id); // $silagemaking->tractor_names_display = collect($tractorIds)->map(function($id) use ($allTractors) { // return $allTractors[trim($id)] ?? null; // })->filter()->implode(', ') ?: '-'; // } else { // $silagemaking->tractor_names_display = '-'; // } // // Handle major maintenance JSON // $silagemaking->parsed_major_maintenance = []; // if ($silagemaking->major_maintenance) { // $decoded = json_decode($silagemaking->major_maintenance, true); // if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { // $silagemaking->parsed_major_maintenance = $decoded; // } // } // // Map harvest_date from silage_making table // $silagemaking->harvest_date = $silagemaking->harvest_date; // } // // ✅ Handle AJAX requests // if ($request->ajax()) { // return view('silagemaking.partials.table', compact('silagemakings'))->render(); // } // // ✅ Return view // return view('silagemaking.index', compact( // 'blocks', // 'silagemakings', // 'sites', // 'selectedSiteId', // 'role' // )); // } public function index(Request $request) { $user = Auth::user(); $role = $user->role; $siteId = $user->site_name; // ✅ 1. Load all sites (for admin dropdown) $sites = DB::table('master_sites')->pluck('site_name', 'id'); // ✅ 2. Determine selected site $selectedSiteId = $request->input('site_id'); if ($role != 1) { $selectedSiteId = $siteId; } // ✅ 3. Grab distinct blocks for dropdown filter from silage_making table $blocksQuery = DB::table('silage_making') ->select('block_name')->distinct()->orderBy('block_name'); if (!empty($selectedSiteId)) { $blocksQuery->where('site_id', $selectedSiteId); } $blocks = $blocksQuery->pluck('block_name'); // ✅ 4. Update total_yield_mt for all silage_making records using same logic as hay_making $this->updateSilageTotalYieldMt($selectedSiteId); // ✅ 5. Get Current Remaining Yield per seed_name from harvest_store_manage // (product_id = 1 for harvested products, matching by seed_name and site) $currentRemainingYieldsQuery = DB::table('harvest_store_manage') ->select('seed_name', DB::raw('SUM(yield_mt) as current_remaining_yield')) ->where('product_id', 1) // Only harvested products ->groupBy('seed_name'); if (!empty($selectedSiteId)) { $currentRemainingYieldsQuery->where('site_id', $selectedSiteId); } $currentRemainingYields = $currentRemainingYieldsQuery->pluck('current_remaining_yield', 'seed_name'); // ✅ 6. Main query - Get data from silage_making table $q = DB::table('silage_making as s') ->select( 's.*', 'users.name as user_name' ) ->leftJoin('users', 's.user_id', '=', 'users.id'); if (!empty($selectedSiteId)) { $q->where('s.site_id', $selectedSiteId); } // ✅ 7. Filters if ($request->filled('block_name')) { $q->where('s.block_name', $request->block_name); } // ✅ SESSION FILTER - FIXED if ($request->filled('session')) { $session = $request->session; switch ($session) { case 'kharif': $q->whereMonth('s.harvest_date', '>=', 6) ->whereMonth('s.harvest_date', '<=', 10); break; case 'rabi': $q->where(function($query) { $query->whereMonth('s.harvest_date', '>=', 11) ->orWhereMonth('s.harvest_date', '<=', 3); }); break; case 'zaid': $q->whereMonth('s.harvest_date', '>=', 4) ->whereMonth('s.harvest_date', '<=', 6); break; } } if ($request->filled('search')) { $term = '%' . $request->search . '%'; $q->where(function ($sub) use ($term) { $sub->where('s.plot_name', 'like', $term) ->orWhere('s.block_name', 'like', $term) ->orWhere('s.seed_name', 'like', $term) ->orWhere('s.silage_making_method', 'like', $term) ->orWhere('users.name', 'like', $term); }); } // ✅ 8. Paginate $silagemakings = $q->orderBy('s.harvest_date', 'desc') ->paginate(10) ->appends($request->only(['block_name', 'search', 'site_id', 'session'])); // ✅ 9. Load machines and tractors $allMachines = DB::table('master_machine')->pluck('machine_name', 'id'); $allTractors = DB::table('master_tractors')->pluck('tractor_name', 'id'); // ✅ 10. Process display fields and calculate yield metrics foreach ($silagemakings as $silagemaking) { // Calculate yield metrics based on seed_name matching $seedName = $silagemaking->seed_name; // ✅ NEW LOGIC: Total Available Yield from silage_making table total_yield_mt $silagemaking->total_available_yield = $silagemaking->total_yield_mt ?? 0; // Required Yield MT (from silage_making table yield_mt) $silagemaking->required_yield_mt = $silagemaking->yield_mt ?? 0; // Adjusted Yield MT (Required Yield MT से 20% कम, मतलब 80% बचे for silage) $silagemaking->adjusted_yield_mt = $silagemaking->required_yield_mt * 0.8; // ✅ NEW LOGIC: Remaining Yield MT from current harvest_store_manage yield_mt $silagemaking->remaining_yield_mt = $currentRemainingYields[$seedName] ?? 0; // Handle machine names if (!empty($silagemaking->machine_id)) { $machineIds = explode(',', $silagemaking->machine_id); $silagemaking->machine_names_display = collect($machineIds)->map(function($id) use ($allMachines) { return $allMachines[trim($id)] ?? null; })->filter()->implode(', ') ?: '-'; } else { $silagemaking->machine_names_display = '-'; } // Handle tractor names if (!empty($silagemaking->tractor_id)) { $tractorIds = explode(',', $silagemaking->tractor_id); $silagemaking->tractor_names_display = collect($tractorIds)->map(function($id) use ($allTractors) { return $allTractors[trim($id)] ?? null; })->filter()->implode(', ') ?: '-'; } else { $silagemaking->tractor_names_display = '-'; } // Handle major maintenance JSON $silagemaking->parsed_major_maintenance = []; if ($silagemaking->major_maintenance) { $decoded = json_decode($silagemaking->major_maintenance, true); if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { $silagemaking->parsed_major_maintenance = $decoded; } } // Map harvest_date from silage_making table $silagemaking->harvest_date = $silagemaking->harvest_date; } // ✅ Handle AJAX requests if ($request->ajax()) { return view('silagemaking.partials.table', compact('silagemakings'))->render(); } // ✅ Return view return view('silagemaking.index', compact( 'blocks', 'silagemakings', 'sites', 'selectedSiteId', 'role' )); } /** * Update total_yield_mt in silage_making table * Logic: total_yield_mt should show available yield at the time of each activity */ private function updateSilageTotalYieldMt($selectedSiteId = null) { // Get all silage_making records ordered by date to calculate sequential remaining yields $silageQuery = DB::table('silage_making') ->select('*') ->orderBy('harvest_date', 'asc') ->orderBy('id', 'asc'); if (!empty($selectedSiteId)) { $silageQuery->where('site_id', $selectedSiteId); } $silageRecords = $silageQuery->get(); // Group by seed_name and site_id to process each combination separately $groupedRecords = $silageRecords->groupBy(function($item) { return $item->seed_name . '_' . $item->site_id; }); foreach ($groupedRecords as $key => $records) { $firstRecord = $records->first(); $seedName = $firstRecord->seed_name; $siteId = $firstRecord->site_id; // Get original harvest yield (before any activities) $originalYield = DB::table('harvest_store_manage') ->where('seed_name', $seedName) ->where('site_id', $siteId) ->where('product_id', 1) // Only harvested products ->sum('yield_mt'); // Get total used in all activities to calculate original yield $totalUsedInActivities = DB::table('silage_making') ->where('seed_name', $seedName) ->where('site_id', $siteId) ->sum('yield_mt'); // Calculate original yield (current available + total used) $originalTotalYield = $originalYield + $totalUsedInActivities; // Process each record sequentially to calculate available yield at time of activity $cumulativeUsed = 0; foreach ($records as $record) { // Available yield at the time of this activity = original - cumulative used before this activity $availableAtTimeOfActivity = $originalTotalYield - $cumulativeUsed; // Update this record with the available yield at time of activity DB::table('silage_making') ->where('id', $record->id) ->update(['total_yield_mt' => $availableAtTimeOfActivity]); // Add current activity's usage to cumulative $cumulativeUsed += $record->yield_mt; } } } }