mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 00:17:34 -05:00 
			
		
		
		
	
						commit
						75cf7ac7e8
					
				@ -1 +1 @@
 | 
				
			|||||||
5.6.1
 | 
					5.6.2
 | 
				
			||||||
@ -53,8 +53,10 @@ class TranslationsExport extends Command
 | 
				
			|||||||
        'fr_CA',
 | 
					        'fr_CA',
 | 
				
			||||||
        'he',
 | 
					        'he',
 | 
				
			||||||
        'hr',
 | 
					        'hr',
 | 
				
			||||||
 | 
					        'hu',
 | 
				
			||||||
        'it',
 | 
					        'it',
 | 
				
			||||||
        'ja',
 | 
					        'ja',
 | 
				
			||||||
 | 
					        'km_KH',
 | 
				
			||||||
        'lt',
 | 
					        'lt',
 | 
				
			||||||
        'lv_LV',
 | 
					        'lv_LV',
 | 
				
			||||||
        'mk_MK',
 | 
					        'mk_MK',
 | 
				
			||||||
@ -131,10 +133,11 @@ class TranslationsExport extends Command
 | 
				
			|||||||
        Storage::disk('local')->makeDirectory('lang');
 | 
					        Storage::disk('local')->makeDirectory('lang');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach ($this->langs as $lang) {
 | 
					        foreach ($this->langs as $lang) {
 | 
				
			||||||
 | 
					            nlog($lang);
 | 
				
			||||||
            Storage::disk('local')->makeDirectory("lang/{$lang}");
 | 
					            Storage::disk('local')->makeDirectory("lang/{$lang}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $translations = Lang::getLoader()->load($lang, 'texts');
 | 
					            $translations = Lang::getLoader()->load($lang, 'texts');
 | 
				
			||||||
 | 
					nlog($translations);
 | 
				
			||||||
            Storage::disk('local')->put("lang/{$lang}/{$lang}.json", json_encode(Arr::dot($translations), JSON_UNESCAPED_UNICODE));
 | 
					            Storage::disk('local')->put("lang/{$lang}/{$lang}.json", json_encode(Arr::dot($translations), JSON_UNESCAPED_UNICODE));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -87,7 +87,7 @@ class CompanyController extends BaseController
 | 
				
			|||||||
     *      summary="Gets a list of companies",
 | 
					     *      summary="Gets a list of companies",
 | 
				
			||||||
     *      description="Lists companies, search and filters allow fine grained lists to be generated.
 | 
					     *      description="Lists companies, search and filters allow fine grained lists to be generated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Query parameters can be added to performed more fine grained filtering of the companies, these are handled by the CompanyFilters class which defines the methods available",
 | 
					     *   Query parameters can be added to performed more fine grained filtering of the companies, these are handled by the CompanyFilters class which defines the methods available",
 | 
				
			||||||
     *      @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
 | 
					     *      @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
 | 
				
			||||||
     *      @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
 | 
					     *      @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
 | 
				
			||||||
     *      @OA\Parameter(ref="#/components/parameters/include"),
 | 
					     *      @OA\Parameter(ref="#/components/parameters/include"),
 | 
				
			||||||
@ -114,7 +114,10 @@ class CompanyController extends BaseController
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function index()
 | 
					    public function index()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $companies = Company::whereAccountId(auth()->user()->company()->account->id);
 | 
					        /** @var \App\Models\User $user */
 | 
				
			||||||
 | 
					        $user = auth()->user();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $companies = Company::whereAccountId($user->company()->account->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $this->listResponse($companies);
 | 
					        return $this->listResponse($companies);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -159,8 +162,12 @@ class CompanyController extends BaseController
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function create(CreateCompanyRequest $request)
 | 
					    public function create(CreateCompanyRequest $request)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $cf = new \App\Factory\CompanyFactory;
 | 
					        /** @var \App\Models\User $user */
 | 
				
			||||||
        $company = $cf->create(auth()->user()->company()->account->id);
 | 
					        $user = auth()->user();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $company_factory = new \App\Factory\CompanyFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $company = $company_factory->create($user->company()->account->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $this->itemResponse($company);
 | 
					        return $this->itemResponse($company);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -206,15 +213,18 @@ class CompanyController extends BaseController
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->forced_includes = ['company_user'];
 | 
					        $this->forced_includes = ['company_user'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $company = (new CreateCompany($request->all(), auth()->user()->company()->account))->handle();
 | 
					        /** @var \App\Models\User $user */
 | 
				
			||||||
        (new CreateCompanyPaymentTerms($company, auth()->user()))->handle();
 | 
					        $user = auth()->user();
 | 
				
			||||||
        (new CreateCompanyTaskStatuses($company, auth()->user()))->handle();
 | 
					
 | 
				
			||||||
 | 
					        $company = (new CreateCompany($request->all(), $user->company()->account))->handle();
 | 
				
			||||||
 | 
					        (new CreateCompanyPaymentTerms($company, $user))->handle();
 | 
				
			||||||
 | 
					        (new CreateCompanyTaskStatuses($company, $user))->handle();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $company = $this->company_repo->save($request->all(), $company);
 | 
					        $company = $this->company_repo->save($request->all(), $company);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->uploadLogo($request->file('company_logo'), $company, $company);
 | 
					        $this->uploadLogo($request->file('company_logo'), $company, $company);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        auth()->user()->companies()->attach($company->id, [
 | 
					        $user->companies()->attach($company->id, [
 | 
				
			||||||
            'account_id' => $company->account->id,
 | 
					            'account_id' => $company->account->id,
 | 
				
			||||||
            'is_owner' => 1,
 | 
					            'is_owner' => 1,
 | 
				
			||||||
            'is_admin' => 1,
 | 
					            'is_admin' => 1,
 | 
				
			||||||
@ -231,7 +241,7 @@ class CompanyController extends BaseController
 | 
				
			|||||||
        /*
 | 
					        /*
 | 
				
			||||||
         * Required dependencies
 | 
					         * Required dependencies
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        auth()->user()->setCompany($company);
 | 
					        $user->setCompany($company);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /*
 | 
					        /*
 | 
				
			||||||
         * Create token
 | 
					         * Create token
 | 
				
			||||||
@ -412,9 +422,6 @@ class CompanyController extends BaseController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $company = $this->company_repo->save($request->all(), $company);
 | 
					        $company = $this->company_repo->save($request->all(), $company);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** We save the settings in the repository - this is duplicated */
 | 
					 | 
				
			||||||
        // $company->saveSettings($request->input('settings'), $company);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if ($request->has('documents')) {
 | 
					        if ($request->has('documents')) {
 | 
				
			||||||
            $this->saveDocuments($request->input('documents'), $company, false);
 | 
					            $this->saveDocuments($request->input('documents'), $company, false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -61,7 +61,6 @@ class SelfUpdateController extends BaseController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        nlog('copying release file');
 | 
					        nlog('copying release file');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // if (copy($this->getDownloadUrl(), storage_path('app/invoiceninja.zip'))) {
 | 
					 | 
				
			||||||
        if (copy($this->getDownloadUrl(), storage_path("app/{$this->filename}"))) {
 | 
					        if (copy($this->getDownloadUrl(), storage_path("app/{$this->filename}"))) {
 | 
				
			||||||
            nlog('Copied file from URL');
 | 
					            nlog('Copied file from URL');
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@ -70,21 +69,16 @@ class SelfUpdateController extends BaseController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        nlog('Finished copying');
 | 
					        nlog('Finished copying');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // if($this->use_zip) {
 | 
					        $file = Storage::disk('local')->path($this->filename);
 | 
				
			||||||
            $file = Storage::disk('local')->path($this->filename);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            nlog('Extracting tar');
 | 
					        nlog('Extracting tar');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $phar = new \PharData($file);
 | 
					        $phar = new \PharData($file);
 | 
				
			||||||
            $phar->extractTo(base_path(), null, true);
 | 
					        $phar->extractTo(base_path(), null, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            nlog('Finished extracting files');
 | 
					        nlog('Finished extracting files');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            unlink($file);
 | 
					        unlink($file);
 | 
				
			||||||
        // }
 | 
					 | 
				
			||||||
        // else {
 | 
					 | 
				
			||||||
        //     $this->extractUsingZip();
 | 
					 | 
				
			||||||
        // }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        nlog('Deleted release zip file');
 | 
					        nlog('Deleted release zip file');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -110,31 +104,13 @@ class SelfUpdateController extends BaseController
 | 
				
			|||||||
        return response()->json(['message' => 'Update completed'], 200);
 | 
					        return response()->json(['message' => 'Update completed'], 200);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // private function extractUsingZip()
 | 
					 | 
				
			||||||
    // {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //     $file = Storage::disk('local')->path($this->filename);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //     nlog('Extracting zip');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //     $zipFile = new \PhpZip\ZipFile();
 | 
					 | 
				
			||||||
    //     $zipFile->openFile($file);
 | 
					 | 
				
			||||||
    //     $zipFile->deleteFromName(".htaccess");
 | 
					 | 
				
			||||||
    //     $zipFile->rewrite();
 | 
					 | 
				
			||||||
    //     $zipFile->extractTo(base_path());
 | 
					 | 
				
			||||||
    //     $zipFile->close();
 | 
					 | 
				
			||||||
    //     $zipFile = null;
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
    //     unlink($file);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private function clearCacheDir()
 | 
					    private function clearCacheDir()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $directoryIterator = new \RecursiveDirectoryIterator(base_path('bootstrap/cache'), \RecursiveDirectoryIterator::SKIP_DOTS);
 | 
					        $directoryIterator = new \RecursiveDirectoryIterator(base_path('bootstrap/cache'), \RecursiveDirectoryIterator::SKIP_DOTS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) {
 | 
					        foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) {
 | 
				
			||||||
            unlink(base_path('bootstrap/cache/').$file->getFileName());
 | 
					            unlink(base_path('bootstrap/cache/').$file->getFileName());
 | 
				
			||||||
 | 
					            $file = null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $directoryIterator = null;
 | 
					        $directoryIterator = null;
 | 
				
			||||||
@ -155,6 +131,8 @@ class SelfUpdateController extends BaseController
 | 
				
			|||||||
                throw new FilePermissionsFailure("Cannot update system because {$file->getFileName()} is not writable");
 | 
					                throw new FilePermissionsFailure("Cannot update system because {$file->getFileName()} is not writable");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $file = null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $directoryIterator = null;
 | 
					        $directoryIterator = null;
 | 
				
			||||||
@ -169,10 +147,8 @@ class SelfUpdateController extends BaseController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private function getDownloadUrl()
 | 
					    private function getDownloadUrl()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $version = $this->checkVersion();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // if(request()->has('zip'))
 | 
					        $version = $this->checkVersion();
 | 
				
			||||||
        //     return "https://github.com/invoiceninja/invoiceninja/releases/download/v{$version}/invoiceninja.zip";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return "https://github.com/invoiceninja/invoiceninja/releases/download/v{$version}/invoiceninja.tar";
 | 
					        return "https://github.com/invoiceninja/invoiceninja/releases/download/v{$version}/invoiceninja.tar";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -82,7 +82,7 @@ class UpdateCompanyRequest extends Request
 | 
				
			|||||||
            $input['settings'] = (array)$this->filterSaveableSettings($input['settings']);
 | 
					            $input['settings'] = (array)$this->filterSaveableSettings($input['settings']);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(array_key_exists('subdomain', $input) && $this->subdomain == $input['subdomain']) {
 | 
					        if(array_key_exists('subdomain', $input) && $this->company->subdomain == $input['subdomain']) {
 | 
				
			||||||
            unset($input['subdomain']);
 | 
					            unset($input['subdomain']);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -72,7 +72,7 @@ class ImportCompleted extends Mailable
 | 
				
			|||||||
            'client_gateway_token_count' => $this->company->client_gateway_tokens()->count(),
 | 
					            'client_gateway_token_count' => $this->company->client_gateway_tokens()->count(),
 | 
				
			||||||
            'tax_rate_count' => $this->company->tax_rates()->count(),
 | 
					            'tax_rate_count' => $this->company->tax_rates()->count(),
 | 
				
			||||||
            'document_count' => $this->company->documents()->count(),
 | 
					            'document_count' => $this->company->documents()->count(),
 | 
				
			||||||
 | 
					            'url' => Ninja::isHosted() ? config('ninja.react_url') : config('ninja.app_url'),
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $this
 | 
					        return $this
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@
 | 
				
			|||||||
namespace App\Repositories;
 | 
					namespace App\Repositories;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use App\Models\Company;
 | 
					use App\Models\Company;
 | 
				
			||||||
 | 
					use App\Utils\Ninja;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * CompanyRepository.
 | 
					 * CompanyRepository.
 | 
				
			||||||
@ -31,12 +32,18 @@ class CompanyRepository extends BaseRepository
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function save(array $data, Company $company) : ?Company
 | 
					    public function save(array $data, Company $company) : ?Company
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        if (isset($data['custom_fields']) && is_array($data['custom_fields'])) {
 | 
					        if (isset($data['custom_fields']) && is_array($data['custom_fields'])) {
 | 
				
			||||||
            $data['custom_fields'] = $this->parseCustomFields($data['custom_fields']);
 | 
					            $data['custom_fields'] = $this->parseCustomFields($data['custom_fields']);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        $company->fill($data);
 | 
					        $company->fill($data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** Only required to handle v4 migration workloads */
 | 
				
			||||||
 | 
					        if(Ninja::isHosted() && $company->isDirty('is_disabled') && !$company->is_disabled) {
 | 
				
			||||||
 | 
					            Ninja::triggerForwarding($company->company_key, $company->owner()->email);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (array_key_exists('settings', $data)) {
 | 
					        if (array_key_exists('settings', $data)) {
 | 
				
			||||||
            $company->saveSettings($data['settings'], $company);
 | 
					            $company->saveSettings($data['settings'], $company);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -46,6 +53,12 @@ class CompanyRepository extends BaseRepository
 | 
				
			|||||||
        return $company;
 | 
					        return $company;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * parseCustomFields
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param  array $fields
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    private function parseCustomFields($fields) :array
 | 
					    private function parseCustomFields($fields) :array
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        foreach ($fields as &$value) {
 | 
					        foreach ($fields as &$value) {
 | 
				
			||||||
 | 
				
			|||||||
@ -276,9 +276,8 @@ class Design extends BaseDesign
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $header = [];
 | 
					        $header = [];
 | 
				
			||||||
        $header[] = ['element' => 'p', 'content' => ctrans('texts.shipping_address'), 'properties' => ['data-ref' => 'shipping_address-label', 'style' => 'font-weight: bold; text-transform: uppercase']];
 | 
					        $header[] = ['element' => 'p', 'content' => ctrans('texts.shipping_address'), 'properties' => ['data-ref' => 'shipping_address-label', 'style' => 'font-weight: bold; text-transform: uppercase']];
 | 
				
			||||||
        return array_merge($header, $elements);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // return $elements;
 | 
					        return array_merge($header, $elements);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@
 | 
				
			|||||||
namespace App\Utils;
 | 
					namespace App\Utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use Illuminate\Support\Facades\DB;
 | 
					use Illuminate\Support\Facades\DB;
 | 
				
			||||||
 | 
					use Illuminate\Support\Facades\Http;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Class Ninja.
 | 
					 * Class Ninja.
 | 
				
			||||||
@ -152,6 +153,21 @@ class Ninja
 | 
				
			|||||||
        return $translations;
 | 
					        return $translations;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static function triggerForwarding(string $company_key, string $email)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            Http::withHeaders([
 | 
				
			||||||
 | 
					                'X-API-HOSTED-SECRET' => config('ninja.ninja_hosted_secret'),
 | 
				
			||||||
 | 
					            ])->post(config('ninja.license_url').'/api/v1/enable_forwarding', [
 | 
				
			||||||
 | 
					                'account_key' => $company_key,
 | 
				
			||||||
 | 
					                'email' => $email,
 | 
				
			||||||
 | 
					            ]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        catch (\Exception $e) {
 | 
				
			||||||
 | 
					            nlog("attempt forwarding for{$email} - {$company_key}");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function createLicense($request)
 | 
					    public function createLicense($request)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // $affiliate = Affiliate::where('affiliate_key', '=', SELF_HOST_AFFILIATE_KEY)->first();
 | 
					        // $affiliate = Affiliate::where('affiliate_key', '=', SELF_HOST_AFFILIATE_KEY)->first();
 | 
				
			||||||
 | 
				
			|||||||
@ -15,8 +15,8 @@ return [
 | 
				
			|||||||
    'require_https' => env('REQUIRE_HTTPS', true),
 | 
					    'require_https' => env('REQUIRE_HTTPS', true),
 | 
				
			||||||
    'app_url' => rtrim(env('APP_URL', ''), '/'),
 | 
					    'app_url' => rtrim(env('APP_URL', ''), '/'),
 | 
				
			||||||
    'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
 | 
					    'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
 | 
				
			||||||
    'app_version' => '5.6.1',
 | 
					    'app_version' => '5.6.2',
 | 
				
			||||||
    'app_tag' => '5.6.1',
 | 
					    'app_tag' => '5.6.2',
 | 
				
			||||||
    'minimum_client_version' => '5.0.16',
 | 
					    'minimum_client_version' => '5.0.16',
 | 
				
			||||||
    'terms_version' => '1.0.1',
 | 
					    'terms_version' => '1.0.1',
 | 
				
			||||||
    'api_secret' => env('API_SECRET', ''),
 | 
					    'api_secret' => env('API_SECRET', ''),
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Models\Language;
 | 
				
			||||||
 | 
					use Illuminate\Support\Facades\Schema;
 | 
				
			||||||
 | 
					use Illuminate\Database\Schema\Blueprint;
 | 
				
			||||||
 | 
					use Illuminate\Database\Migrations\Migration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return new class extends Migration
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Run the migrations.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function up()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Language::unguard();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (!Language::find(39)) {
 | 
				
			||||||
 | 
					            $hungarian = ['id' => 39, 'name' => 'Hungarian', 'locale' => 'hu'];
 | 
				
			||||||
 | 
					            Language::create($hungarian);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Reverse the migrations.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function down()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -63,6 +63,7 @@ class LanguageSeeder extends Seeder
 | 
				
			|||||||
            ['id' => 36, 'name' => 'Bulgarian', 'locale' => 'bg'],
 | 
					            ['id' => 36, 'name' => 'Bulgarian', 'locale' => 'bg'],
 | 
				
			||||||
            ['id' => 37, 'name' => 'Hebrew', 'locale' => 'he'],
 | 
					            ['id' => 37, 'name' => 'Hebrew', 'locale' => 'he'],
 | 
				
			||||||
            ['id' => 38, 'name' => 'Khmer', 'locale' => 'km_KH'],
 | 
					            ['id' => 38, 'name' => 'Khmer', 'locale' => 'km_KH'],
 | 
				
			||||||
 | 
					            ['id' => 39, 'name' => 'Hungarian', 'locale' => 'hu'],
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach ($languages as $language) {
 | 
					        foreach ($languages as $language) {
 | 
				
			||||||
 | 
				
			|||||||
@ -5105,6 +5105,8 @@ $LANG = array(
 | 
				
			|||||||
    'gallery' => 'Gallery',
 | 
					    'gallery' => 'Gallery',
 | 
				
			||||||
    'project_location' => 'Project Location',
 | 
					    'project_location' => 'Project Location',
 | 
				
			||||||
    'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', 
 | 
					    'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', 
 | 
				
			||||||
 | 
					    'lang_Hungarian' => 'Hungarian',
 | 
				
			||||||
 | 
					    'use_mobile_to_manage_plan' => 'Use your phone subscription settings to manage your plan',
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5087,6 +5087,16 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
 | 
				
			|||||||
    'upload_certificate' => 'Téléverser le certificat',
 | 
					    'upload_certificate' => 'Téléverser le certificat',
 | 
				
			||||||
    'certificate_passphrase' => 'Passphrase du certificat',
 | 
					    'certificate_passphrase' => 'Passphrase du certificat',
 | 
				
			||||||
    'valid_vat_number' => 'Numéro valide de taxe',
 | 
					    'valid_vat_number' => 'Numéro valide de taxe',
 | 
				
			||||||
 | 
					    'react_notification_link' => 'Lien de notifications React',
 | 
				
			||||||
 | 
					    'react_notification_link_help' => 'Les courriels provenant de l\'administration contiennent des liens vers l\'application React',  
 | 
				
			||||||
 | 
					    'show_task_billable' => 'Afficher la facturation de tâche',
 | 
				
			||||||
 | 
					    'credit_item' => 'Credit Item',
 | 
				
			||||||
 | 
					    'drop_file_here' => 'Déposer le fichier ici',
 | 
				
			||||||
 | 
					    'files' => 'Fichiers',
 | 
				
			||||||
 | 
					    'camera' => 'Caméra',
 | 
				
			||||||
 | 
					    'gallery' => 'Galerie',
 | 
				
			||||||
 | 
					    'project_location' => 'Emplacement du projet',
 | 
				
			||||||
 | 
					    'add_gateway_help_message' => 'Ajouter un passerelle de paiement (Stripe, WePay, ou PayPal) pour accepter les paiements en ligne', 
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								lang/hu/auth.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lang/hu/auth.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Authentication Language Lines
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | The following language lines are used during authentication for various
 | 
				
			||||||
 | 
					    | messages that we need to display to the user. You are free to modify
 | 
				
			||||||
 | 
					    | these language lines according to your application's requirements.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'failed'   => 'Ovi podaci ne odgovaraju našima.',
 | 
				
			||||||
 | 
					    'throttle' => 'Previše pokušaja prijave. Molim Vas pokušajte ponovno za :seconds sekundi.',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										19
									
								
								lang/hu/pagination.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								lang/hu/pagination.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Pagination Language Lines
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | The following language lines are used by the paginator library to build
 | 
				
			||||||
 | 
					    | the simple pagination links. You are free to change them to anything
 | 
				
			||||||
 | 
					    | you want to customize your views to better match your application.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'previous' => '« Prethodna',
 | 
				
			||||||
 | 
					    'next'     => 'Sljedeća »',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										22
									
								
								lang/hu/passwords.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								lang/hu/passwords.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Password Reminder Language Lines
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | The following language lines are the default lines which match reasons
 | 
				
			||||||
 | 
					    | that are given by the password broker for a password update attempt
 | 
				
			||||||
 | 
					    | has failed, such as for an invalid token or invalid new password.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'password' => 'Lozinke moraju biti duge barem 6 znakova i moraju odgovarati potvrdi.',
 | 
				
			||||||
 | 
					    'reset'    => 'Lozinka je postavljena!',
 | 
				
			||||||
 | 
					    'sent'     => 'Poveznica za ponovono postavljanje lozinke je poslana!',
 | 
				
			||||||
 | 
					    'token'    => 'Oznaka za ponovno postavljanje lozinke više nije važeća.',
 | 
				
			||||||
 | 
					    'user'     => 'Korisnik nije pronađen.',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										5088
									
								
								lang/hu/texts.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5088
									
								
								lang/hu/texts.php
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										116
									
								
								lang/hu/validation.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								lang/hu/validation.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Validation Language Lines
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | The following language lines contain the default error messages used by
 | 
				
			||||||
 | 
					    | the validator class. Some of these rules have multiple versions such
 | 
				
			||||||
 | 
					    | such as the size rules. Feel free to tweak each of these messages.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'accepted'             => 'Polje :attribute mora biti prihvaćeno.',
 | 
				
			||||||
 | 
					    'active_url'           => 'Polje :attribute nije ispravan URL.',
 | 
				
			||||||
 | 
					    'after'                => 'Polje :attribute mora biti datum nakon :date.',
 | 
				
			||||||
 | 
					    'alpha'                => 'Polje :attribute smije sadržavati samo slova.',
 | 
				
			||||||
 | 
					    'alpha_dash'           => 'Polje :attribute smije sadržavati samo slova, brojeve i crtice.',
 | 
				
			||||||
 | 
					    'alpha_num'            => 'Polje :attribute smije sadržavati samo slova i brojeve.',
 | 
				
			||||||
 | 
					    'array'                => 'Polje :attribute mora biti niz.',
 | 
				
			||||||
 | 
					    'before'               => 'Polje :attribute mora biti datum prije :date.',
 | 
				
			||||||
 | 
					    'between'              => [
 | 
				
			||||||
 | 
					        'numeric' => 'Polje :attribute mora biti između :min - :max.',
 | 
				
			||||||
 | 
					        'file'    => 'Polje :attribute mora biti između :min - :max kilobajta.',
 | 
				
			||||||
 | 
					        'string'  => 'Polje :attribute mora biti između :min - :max znakova.',
 | 
				
			||||||
 | 
					        'array'   => 'Polje :attribute mora imati između :min - :max stavki.',
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    'boolean'              => 'Polje :attribute mora biti false ili true.',
 | 
				
			||||||
 | 
					    'confirmed'            => 'Potvrda polja :attribute se ne podudara.',
 | 
				
			||||||
 | 
					    'date'                 => 'Polje :attribute nije ispravan datum.',
 | 
				
			||||||
 | 
					    'date_format'          => 'Polje :attribute ne podudara s formatom :format.',
 | 
				
			||||||
 | 
					    'different'            => 'Polja :attribute i :other moraju biti različita.',
 | 
				
			||||||
 | 
					    'digits'               => 'Polje :attribute mora sadržavati :digits znamenki.',
 | 
				
			||||||
 | 
					    'digits_between'       => 'Polje :attribute mora imati između :min i :max znamenki.',
 | 
				
			||||||
 | 
					    'dimensions'           => 'The :attribute has invalid image dimensions.',
 | 
				
			||||||
 | 
					    'distinct'             => 'The :attribute field has a duplicate value.',
 | 
				
			||||||
 | 
					    'email'                => 'Polje :attribute mora biti ispravna e-mail adresa.',
 | 
				
			||||||
 | 
					    'exists'               => 'Odabrano polje :attribute nije ispravno.',
 | 
				
			||||||
 | 
					    'filled'               => 'The :attribute field is required.',
 | 
				
			||||||
 | 
					    'image'                => 'Polje :attribute mora biti slika.',
 | 
				
			||||||
 | 
					    'in'                   => 'Odabrano polje :attribute nije ispravno.',
 | 
				
			||||||
 | 
					    'in_array'             => 'The :attribute field does not exist in :other.',
 | 
				
			||||||
 | 
					    'integer'              => 'Polje :attribute mora biti broj.',
 | 
				
			||||||
 | 
					    'ip'                   => 'Polje :attribute mora biti ispravna IP adresa.',
 | 
				
			||||||
 | 
					    'json'                 => 'The :attribute must be a valid JSON string.',
 | 
				
			||||||
 | 
					    'max'                  => [
 | 
				
			||||||
 | 
					        'numeric' => 'Polje :attribute mora biti manje od :max.',
 | 
				
			||||||
 | 
					        'file'    => 'Polje :attribute mora biti manje od :max kilobajta.',
 | 
				
			||||||
 | 
					        'string'  => 'Polje :attribute mora sadržavati manje od :max znakova.',
 | 
				
			||||||
 | 
					        'array'   => 'Polje :attribute ne smije imati više od :max stavki.',
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    'mimes'                => 'Polje :attribute mora biti datoteka tipa: :values.',
 | 
				
			||||||
 | 
					    'min'                  => [
 | 
				
			||||||
 | 
					        'numeric' => 'Polje :attribute mora biti najmanje :min.',
 | 
				
			||||||
 | 
					        'file'    => 'Polje :attribute mora biti najmanje :min kilobajta.',
 | 
				
			||||||
 | 
					        'string'  => 'Polje :attribute mora sadržavati najmanje :min znakova.',
 | 
				
			||||||
 | 
					        'array'   => 'Polje :attribute mora sadržavati najmanje :min stavki.',
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    'not_in'               => 'Odabrano polje :attribute nije ispravno.',
 | 
				
			||||||
 | 
					    'numeric'              => 'Polje :attribute mora biti broj.',
 | 
				
			||||||
 | 
					    'present'              => 'The :attribute field must be present.',
 | 
				
			||||||
 | 
					    'regex'                => 'Polje :attribute se ne podudara s formatom.',
 | 
				
			||||||
 | 
					    'required'             => 'Polje :attribute je obavezno.',
 | 
				
			||||||
 | 
					    'required_if'          => 'Polje :attribute je obavezno kada polje :other sadrži :value.',
 | 
				
			||||||
 | 
					    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
 | 
				
			||||||
 | 
					    'required_with'        => 'Polje :attribute je obavezno kada postoji polje :values.',
 | 
				
			||||||
 | 
					    'required_with_all'    => 'Polje :attribute je obavezno kada postje polja :values.',
 | 
				
			||||||
 | 
					    'required_without'     => 'Polje :attribute je obavezno kada ne postoji polje :values.',
 | 
				
			||||||
 | 
					    'required_without_all' => 'Polje :attribute je obavezno kada nijedno od polja :values ne postoji.',
 | 
				
			||||||
 | 
					    'same'                 => 'Polja :attribute i :other se moraju podudarati.',
 | 
				
			||||||
 | 
					    'size'                 => [
 | 
				
			||||||
 | 
					        'numeric' => 'Polje :attribute mora biti :size.',
 | 
				
			||||||
 | 
					        'file'    => 'Polje :attribute mora biti :size kilobajta.',
 | 
				
			||||||
 | 
					        'string'  => 'Polje :attribute mora biti :size znakova.',
 | 
				
			||||||
 | 
					        'array'   => 'Polje :attribute mora sadržavati :size stavki.',
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    'string'               => 'The :attribute must be a string.',
 | 
				
			||||||
 | 
					    'timezone'             => 'Polje :attribute mora biti ispravna vremenska zona.',
 | 
				
			||||||
 | 
					    'unique'               => 'Polje :attribute već postoji.',
 | 
				
			||||||
 | 
					    'url'                  => 'Polje :attribute nije ispravnog formata.',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Custom Validation Language Lines
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | Here you may specify custom validation messages for attributes using the
 | 
				
			||||||
 | 
					    | convention "attribute.rule" to name the lines. This makes it quick to
 | 
				
			||||||
 | 
					    | specify a specific custom language line for a given attribute rule.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'custom'               => [
 | 
				
			||||||
 | 
					        'attribute-name' => [
 | 
				
			||||||
 | 
					            'rule-name' => 'custom-message',
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    | Custom Validation Attributes
 | 
				
			||||||
 | 
					    |--------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    | The following language lines are used to swap attribute place-holders
 | 
				
			||||||
 | 
					    | with something more reader friendly such as E-Mail Address instead
 | 
				
			||||||
 | 
					    | of "email". This simply helps us make messages a little cleaner.
 | 
				
			||||||
 | 
					    |
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    'attributes'           => [
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -40,7 +40,7 @@ Route::get('tmp_pdf/{hash}', [App\Http\Controllers\ClientPortal\TempRouteControl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Route::get('client/key_login/{contact_key}', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'login'])->name('client.contact_login')->middleware(['domain_db','contact_key_login']);
 | 
					Route::get('client/key_login/{contact_key}', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'login'])->name('client.contact_login')->middleware(['domain_db','contact_key_login']);
 | 
				
			||||||
Route::get('client/magic_link/{magic_link}', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'magicLink'])->name('client.contact_magic_link')->middleware(['domain_db','contact_key_login']);
 | 
					Route::get('client/magic_link/{magic_link}', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'magicLink'])->name('client.contact_magic_link')->middleware(['domain_db','contact_key_login']);
 | 
				
			||||||
Route::get('documents/{document_hash}', [App\Http\Controllers\ClientPortal\DocumentController::class, 'publicDownload'])->name('documents.public_download')->middleware(['domain_db']);
 | 
					Route::get('documents/{document_hash}', [App\Http\Controllers\ClientPortal\DocumentController::class, 'publicDownload'])->name('documents.public_download')->middleware(['domain_db','token_auth']);
 | 
				
			||||||
Route::get('error', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'errorPage'])->name('client.error');
 | 
					Route::get('error', [App\Http\Controllers\ClientPortal\ContactHashLoginController::class, 'errorPage'])->name('client.error');
 | 
				
			||||||
Route::get('client/payment/{contact_key}/{payment_id}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'paymentRouter'])->middleware(['domain_db','contact_key_login']);
 | 
					Route::get('client/payment/{contact_key}/{payment_id}', [App\Http\Controllers\ClientPortal\InvitationController::class, 'paymentRouter'])->middleware(['domain_db','contact_key_login']);
 | 
				
			||||||
Route::get('client/ninja/{contact_key}/{company_key}', [App\Http\Controllers\ClientPortal\NinjaPlanController::class, 'index'])->name('client.ninja_contact_login')->middleware(['domain_db']);
 | 
					Route::get('client/ninja/{contact_key}/{company_key}', [App\Http\Controllers\ClientPortal\NinjaPlanController::class, 'index'])->name('client.ninja_contact_login')->middleware(['domain_db']);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user