103 lines
4.3 KiB
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;
|
|
}
|
|
}
|
|
}
|