/**
  * Update settings
  *
  * @param  int                   $id
  * @param SettingsRequestManager $settingRequest
  * @return
  * @internal param TempRequest|SettingsRequestManager $request
  */
 public function update($id, SettingsRequestManager $settingRequest)
 {
     $currentUser = auth()->user();
     if ($currentUser->isNotAdmin()) {
         return redirect()->back()->withResponse(['type' => 'warning', 'code' => ['message', ['message' => 'You do not have the correct privileges to view this page.']]]);
     }
     $input = $settingRequest->requestHandler->all();
     $newPublishingType = $input['publishing_type'][0]['publishing'];
     $oldIdentifier = $this->organization->reporting_org[0]['reporting_organization_identifier'];
     $settings = $this->settingsManager->getSettings($this->organization->id);
     $publishingType = $settings->publishing_type;
     $activities = $this->activityManager->getActivities($this->organization->id);
     if ($publishingType != $newPublishingType) {
         $publishedFiles = $this->activityManager->getActivityPublishedFiles(Session::get('org_id'));
         if (count($publishedFiles)) {
             $this->generateNewFiles($newPublishingType, $activities);
         }
     }
     $reportingOrgIdentifier = $input['reporting_organization_info'][0]['reporting_organization_identifier'];
     foreach ($activities as $activity) {
         $status = $activity['published_to_registry'];
         $otherIdentifier = (array) $activity->other_identifier;
         if ($status == 1 && !in_array(["reference" => $oldIdentifier, "type" => "B1", 'owner_org' => []], $otherIdentifier) && $oldIdentifier !== $reportingOrgIdentifier) {
             $otherIdentifier[] = ['reference' => $oldIdentifier, 'type' => 'B1', 'owner_org' => []];
             $this->otherIdentifierManager->update(['other_identifier' => $otherIdentifier], $activity);
         }
     }
     $result = $this->settingsManager->updateSettings($input, $this->organization, $this->settings);
     if (!$result) {
         $response = ['type' => 'danger', 'code' => ['update_failed', ['name' => 'Settings']]];
         return redirect()->back()->withResponse($response);
     }
     $response = ['type' => 'success', 'code' => ['updated', ['name' => 'Settings']]];
     return redirect()->to(config('app.admin_dashboard'))->withResponse($response);
 }
 /**
  * Download of activity xml files
  * @param $activityId
  * @return \Illuminate\Http\Response
  */
 public function downloadActivityXml($activityId)
 {
     $activityData = $this->activityManager->getActivityData($activityId);
     $activityElement = $this->activityManager->getActivityElement();
     $xmlService = $activityElement->getActivityXmlService();
     $xml = $xmlService->generateTemporaryActivityXml($this->activityManager->getActivityData($activityId), $this->activityManager->getTransactionData($activityId), $this->activityManager->getResultData($activityId), $this->settingsManager->getSettings($activityData['organization_id']), $activityElement, $this->organizationManager->getOrganizationElement(), $this->organizationManager->getOrganization($activityData->organization_id));
     return response()->make($xml, 200, ['Content-type' => 'text/xml', 'Content-Disposition' => sprintf('attachment; filename=activityXmlFile.xml')]);
 }
 /**
  * Stores the activity by uploading csv
  * @param Request                  $request
  * @param UploadActivityRequest    $uploadActivityRequest
  * @param CsvImportValidator       $csvImportValidator
  * @param IatiIdentifierRepository $iatiIdentifierRepository
  * @return $this
  */
 public function store(Request $request, UploadActivityRequest $uploadActivityRequest, CsvImportValidator $csvImportValidator, IatiIdentifierRepository $iatiIdentifierRepository)
 {
     $organization = $this->organizationManager->getOrganization($this->organizationId);
     $this->authorize('add_activity', $organization);
     $settings = $this->settingsManager->getSettings($this->organizationId);
     $defaultFieldValues = $settings->default_field_values;
     $defaultFieldGroups = $settings->default_field_groups;
     if (!isset($organization->reporting_org[0])) {
         $response = ['type' => 'warning', 'code' => ['settings', ['name' => 'activity']]];
         return redirect('/settings')->withResponse($response);
     }
     $identifiers = [];
     $activityIdentifiers = $iatiIdentifierRepository->getIdentifiersForOrganization();
     foreach ($activityIdentifiers as $identifier) {
         $identifiers[] = $identifier->identifier['activity_identifier'];
     }
     $file = $request->file('activity');
     $uploadedActivityArray = $this->uploadActivityManager->getVersion()->getExcel()->load($file)->toArray();
     $geopolitical = $defaultFieldGroups[0]['Geopolitical Information'];
     foreach ($uploadedActivityArray as $activity) {
         $recipientRegionExist = array_key_exists('recipient_region', $geopolitical);
         if (!$recipientRegionExist && !is_null($activity['recipient_region'])) {
             return redirect()->back()->withResponse(['type' => 'danger', 'code' => ['recipient_region_unselected_in_settings', ['name' => 'Activity']]]);
         }
     }
     if ($this->uploadActivityManager->isEmptyCsv($file)) {
         return redirect()->back()->withResponse(['type' => 'danger', 'code' => ['empty_template', ['name' => 'Activity']]]);
     }
     $validator = $csvImportValidator->validator->isValidActivityCsv($file, $identifiers);
     if (!$validator) {
         $response = ['type' => 'danger', 'code' => ['csv_template_error', ['name' => '']]];
         return redirect()->back()->withResponse($response);
     } elseif ($validator->fails()) {
         $failedRows = $validator->failures();
         $uploadedActivities = $this->uploadActivityManager->getVersion()->getExcel()->load($file)->toArray();
         $validActivities = array_keys(array_diff_key($uploadedActivities, $failedRows));
         $validActivityIndices = [];
         foreach ($validActivities as $validActivity) {
             $validActivityIndices[] = $validActivity + 1;
         }
         $filename = 'temporary-' . $this->organizationId . 'activity';
         $this->temporarilyStoreCsvFor($validActivities, $filename);
         $validCsvFilePath = storage_path() . '/exports/' . $filename . '.csv';
         if (!$this->saveValidatedActivities($validCsvFilePath, $defaultFieldValues)) {
             return redirect()->back()->withResponse(['type' => 'warning', 'code' => ['save_failed', ['name' => 'Activity']]]);
         }
         return $this->invalidActivities($validator, $validActivityIndices, $failedRows);
     }
     $check = $this->uploadActivityManager->save($file, $organization, $defaultFieldValues);
     if (is_a($check, 'Illuminate\\View\\View')) {
         return $check;
     }
     $response = $check ? ['type' => 'success', 'code' => ['updated', ['name' => 'Activities']]] : ['type' => 'danger', 'code' => ['update_failed', ['name' => 'Activities']]];
     return redirect()->to(sprintf('/activity'))->withResponse($response);
 }
 /**
  * it validates organization schema according to version standard
  * @param      $id
  * @param null $version
  * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  */
 public function validateOrganization($id, $version = null)
 {
     $organization = $this->organizationManager->getOrganization($id);
     $settings = $this->settingsManager->getSettings($id);
     $organizationData = $this->organizationManager->getOrganizationData($id);
     $orgElem = $this->organizationManager->getOrganizationElement();
     if ($version == null) {
         $version = config('app.default_version_name');
     }
     return $this->validateCompletedOrganization($organization, $settings, $organizationData, $orgElem, $version);
 }
 /** Returns status of the published data of organization.
  * @param $organization_id
  * @return string
  */
 public function getPublishedOrganizationStatus($organization_id)
 {
     $organization_data = $this->organizationManager->getPublishedOrganizationData($organization_id);
     $settings = $this->settingsManager->getSettings($organization_id);
     $autoPublishing = getVal($settings->toArray(), ['registry_info', 0, 'publish_files'], 'no');
     $status = 'unlinked';
     if ($organization_data) {
         if ($autoPublishing == "no") {
             $status = $organization_data->published_to_register == 1 ? "Linked" : "Unlinked";
         } else {
             $status = $organization_data->published_to_register == 1 ? "Linked" : "unlinked";
         }
     }
     return $status;
 }
 /**
  * @param DatabaseManager $databaseManager
  * @param SettingsManager $settingsManager
  * @param UpgradeManager  $upgradeManager
  */
 function __construct(DatabaseManager $databaseManager, SettingsManager $settingsManager, UpgradeManager $upgradeManager)
 {
     $this->middleware('auth');
     $this->orgId = session('org_id');
     $db_organization = $databaseManager->table('organizations')->select('name')->where('id', '=', $this->orgId)->first();
     $this->orgName = $db_organization->name;
     $settings = $settingsManager->getSettings($this->orgId);
     $this->currentVersion = $settings ? $settings->version : null;
     $db_versions = $databaseManager->table('versions')->get();
     $versions = [];
     foreach ($db_versions as $ver) {
         $versions[] = $ver->version;
     }
     $this->versions = $versions;
     $versionKey = array_search($this->currentVersion, $versions);
     $this->version = end($versions) === $this->currentVersion ? null : $versions[$versionKey + 1];
     $this->upgradeManager = $upgradeManager;
 }
 /**
  * masquerade as an specific organization by superadmin
  * @param                 $orgId
  * @param                 $userId
  * @return \Illuminate\Http\RedirectResponse
  */
 public function masqueradeOrganization($orgId, $userId)
 {
     $database = app(DatabaseManager::class);
     $settings = $this->settingsManager->getSettings($orgId);
     Session::put('org_id', $orgId);
     $current_version = isset($settings) ? $settings->version : config('app.default_version');
     Session::put('current_version', $current_version);
     $versions_db = $database->table('versions')->get();
     $versions = [];
     foreach ($versions_db as $ver) {
         $versions[] = $ver->version;
     }
     $versionKey = array_search($current_version, $versions);
     $next_version = end($versions) == $current_version ? null : $versions[$versionKey + 1];
     Session::put('next_version', $next_version);
     Session::put('version', 'V' . str_replace('.', '', $current_version));
     Auth::loginUsingId($userId);
     return redirect()->to(config('app.admin_dashboard'));
 }