sigd/app/Services/Tool/ProdusenCalculateService.php

103 lines
4.3 KiB
PHP

<?php
namespace App\Services\Tool;
use App\Enums\ActivityType;
use App\Models\ActivityApprovalKonsolidasi;
use App\Models\ActivityForm;
use App\Models\ActivityFormDetail;
use App\Models\ActivityProdusenCalculate;
use App\Models\Agency;
use App\Models\AgencyActivity;
use App\Services\SigdCrudService;
use Illuminate\Support\Facades\DB;
class ProdusenCalculateService extends SigdCrudService
{
public function __construct(ActivityProdusenCalculate $model)
{
parent::__construct($model);
}
public function calculateAndSave($inventoryYear)
{
DB::beginTransaction();
try {
$activityYears = activityYearRange($inventoryYear);
$produsen = ActivityApprovalKonsolidasi::where('inventory_year', $inventoryYear)
->where('status', 1)->pluck('agency_id')->toArray();
$activityForms = ActivityForm::where('inventory_year', $inventoryYear)
->whereNotNull('agency_id')->whereIn('agency_id', $produsen)->rowActive()->get();
$formIds = $activityForms->pluck('id')->toArray();
$distinctActivity = ActivityForm::where('inventory_year', $inventoryYear)
->whereNotNull('agency_id')->whereIn('agency_id', $produsen)->rowActive()
->select('sector', 'form_code', 'inventory_year')->distinct()->get();
foreach ($distinctActivity as $activityForm) {
ActivityForm::rowActive()
->where('sector', $activityForm->sector)->where('form_code', $activityForm->form_code)
->where('inventory_year', $activityForm->inventory_year)
->whereNull('agency_id')->each(function ($form) {
$formDetail = ActivityFormDetail::where('form_id', $form->id)->get();
foreach ($formDetail as $item) {
$this->delete($item);
};
$this->delete($form);
});
$dataForm = [
'sector' => $activityForm->sector,
'form_code' => $activityForm->form_code,
'inventory_year' => $activityForm->inventory_year,
'verification_status' => 'unverified',
'validation_status' => 'unvalidated',
'lock_status' => 'open',
];
$mainActivityForm = $this->create($dataForm, ActivityForm::class);
logUserActivity(ActivityType::PRODUSEN_CALCULATE, $mainActivityForm->id);
$activityFormDetails = ActivityFormDetail::whereIn('form_id', $formIds)
->whereHas('form', function ($query) use ($activityForm) {
$query->where('sector', $activityForm->sector)
->where('form_code', $activityForm->form_code)
->where('inventory_year', $activityForm->inventory_year);
})
->rowActive()->groupBy('activity_year', 'activity_code', 'activity_unit_code')
->selectRaw('activity_year, activity_code, activity_unit_code, SUM(activity_value) AS activity_value')
->whereIn('activity_year', $activityYears)
->get();
foreach ($activityFormDetails as $detail) {
$dataFormDetail = [
'form_id' => $mainActivityForm->id,
'activity_year' => $detail->activity_year,
'activity_code' => $detail->activity_code,
'activity_unit_code' => $detail->activity_unit_code,
'activity_value' => $detail->activity_value,
];
$this->createOrUpdate([
'form_id' => $mainActivityForm->id,
'activity_year' => $detail->activity_year,
'activity_code' => $detail->activity_code,
'activity_unit_code' => $detail->activity_unit_code,
'row_status' => 1,
], $dataFormDetail, ActivityFormDetail::class);
}
}
DB::commit();
return true;
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}
}