model = $model; } public function save($code, $inventoryYear) { try { $dataBatch = []; $ws = $this->getWs($code); $years = activityYearRange($inventoryYear, false); if ($ws && class_basename($ws->model) == 'Waste4AMethane') { foreach ($years as $year) { $dataBatch = array_merge($dataBatch, $this->calcAndSave($inventoryYear, $year, $ws)); } } else { throw new \Exception("Forbidden"); } return $dataBatch; } catch (\Exception $e) { throw $e; } } public function calcAndSave($inventoryYear, $activityYear, $ws) { # deklarasi variabel $items = ['sisa_makanan', 'kertas', 'nappies', 'taman', 'kayu', 'tekstil']; $activities = []; # inisialisasi data aktivitas foreach ($items as $item) { $activities[$item . '_amount'] = 0; $activities[$item . '_dry_matter'] = 0; } try { $dataForms = []; $wsCode = $ws->ws_code; # ambil data aktivitas $ws4a_pre = Waste4APre::whereIn('activity', ['amount', 'dry_matter']) ->where('inventory_year', $inventoryYear)->where('activity_year', $activityYear) ->rowActive()->get(); foreach ($ws4a_pre as $row) { foreach ($items as $item) { $activities[$item . '_' . $row->activity] = $row->$item; } } # ambil ddocm_accumulated tahun sebelumnya $no = 1; foreach ($items as $item) { $ws4a_methane = []; if (abs($activityYear - $inventoryYear) == 15) { $ws4a_methane = Waste4AMethane::where('activity_year', $activityYear - 1) ->where('activity_code', $item)->rowActive()->orderBy('updated_at', 'DESC')->first(); } else { $ws4a_methane = Waste4AMethane::where('inventory_year', $inventoryYear) ->where('activity_year', $activityYear - 1) ->where('activity_code', $item)->rowActive()->orderBy('updated_at', 'DESC')->first(); } $ddocm_accumulated_prev = $ws4a_methane->ddocm_accumulated ?? 0; $ef_doc = ReferenceEf::getValue($item, 'DOC'); $ef_docf = ReferenceEf::getValue($item, 'DOCf'); $ef_exp1 = ReferenceEf::getValue($item, 'exp1'); $ef_exp2 = ReferenceEf::getValue($item, 'exp2'); $ef_f = ReferenceEf::getValue($item, 'F'); $ef_mcf = ReferenceEf::getValue('timbulan_sampah', 'total_weighted_mcf'); $amount = $activities[$item . '_amount'] ?? 0; $dry_matter = $activities[$item . '_dry_matter'] ? $activities[$item . '_dry_matter'] / 100 : 0; $ddocm_deposited = $amount * $dry_matter * $ef_doc * $ef_docf * $ef_mcf; $ddocm_unreacted = $ddocm_deposited * $ef_exp2; $ddocm_decomposed_1 = $ddocm_deposited * (1 - $ef_exp2); $ddocm_accumulated = $ddocm_unreacted + ($ddocm_accumulated_prev * $ef_exp1); $ddocm_decomposed_2 = $ddocm_accumulated_prev * (1 - $ef_exp1) + $ddocm_decomposed_1; $ch4 = $ddocm_decomposed_2 * $ef_f * 16 / 12; $dataForm = [ 'inventory_year' => $inventoryYear, 'activity_year' => $activityYear, // 'category' => $wsCode, 'activity_code' => $item, 'amount' => $amount, 'dry_matter' => $dry_matter, 'ef_doc' => $ef_doc, 'ef_docf' => $ef_docf, 'ef_exp1' => $ef_exp1, 'ef_exp2' => $ef_exp2, 'ef_f' => $ef_f, 'ef_mcf' => $ef_mcf, 'ddocm_deposited' => $ddocm_deposited, 'ddocm_unreacted' => $ddocm_unreacted, 'ddocm_decomposed_1' => $ddocm_decomposed_1, 'ddocm_accumulated' => $ddocm_accumulated, 'ddocm_accumulated_prev' => $ddocm_accumulated_prev, 'ddocm_decomposed_2' => $ddocm_decomposed_2, 'ch4' => $ch4, 'row_num' => $no++, ]; $this->createOrUpdate([ 'inventory_year' => $inventoryYear, 'activity_year' => $activityYear, // 'category' => $wsCode, 'activity_code' => $item, 'row_status' => 1, ], $dataForm); $dataForms[] = $dataForm; } return $dataForms; } catch (\Exception $e) { throw $e; } } }