add: full multi-tenancy control

This commit is contained in:
Cauê Faleiros
2026-02-02 15:31:15 -03:00
commit c6ec92802b
1711 changed files with 258106 additions and 0 deletions

View File

@@ -0,0 +1,495 @@
<?php
namespace Webkul\Installer\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\File;
use Webkul\Core\Providers\CoreServiceProvider;
use Webkul\Installer\Database\Seeders\DatabaseSeeder as KrayinDatabaseSeeder;
use Webkul\Installer\Events\ComposerEvents;
use function Laravel\Prompts\password;
use function Laravel\Prompts\select;
use function Laravel\Prompts\text;
class Installer extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'krayin-crm:install
{ --skip-env-check : Skip env check. }
{ --skip-admin-creation : Skip admin creation. }';
/**
* The console command description.
*
* @var string
*/
protected $description = 'krayin installer.';
/**
* Locales list.
*
* @var array
*/
protected $locales = [
'ar' => 'Arabic',
'en' => 'English',
'tr' => 'Turkish',
'es' => 'Spanish',
'fa' => 'Persian',
'pt_BR' => 'Portuguese',
];
/**
* Currencies list.
*
* @var array
*/
protected $currencies = [
'AED' => 'United Arab Emirates Dirham',
'ARS' => 'Argentine Peso',
'AUD' => 'Australian Dollar',
'BDT' => 'Bangladeshi Taka',
'BRL' => 'Brazilian Real',
'CAD' => 'Canadian Dollar',
'CHF' => 'Swiss Franc',
'CLP' => 'Chilean Peso',
'CNY' => 'Chinese Yuan',
'COP' => 'Colombian Peso',
'CZK' => 'Czech Koruna',
'DKK' => 'Danish Krone',
'DZD' => 'Algerian Dinar',
'EGP' => 'Egyptian Pound',
'EUR' => 'Euro',
'FJD' => 'Fijian Dollar',
'GBP' => 'British Pound Sterling',
'HKD' => 'Hong Kong Dollar',
'HUF' => 'Hungarian Forint',
'IDR' => 'Indonesian Rupiah',
'ILS' => 'Israeli New Shekel',
'INR' => 'Indian Rupee',
'JOD' => 'Jordanian Dinar',
'JPY' => 'Japanese Yen',
'KRW' => 'South Korean Won',
'KWD' => 'Kuwaiti Dinar',
'KZT' => 'Kazakhstani Tenge',
'LBP' => 'Lebanese Pound',
'LKR' => 'Sri Lankan Rupee',
'LYD' => 'Libyan Dinar',
'MAD' => 'Moroccan Dirham',
'MUR' => 'Mauritian Rupee',
'MXN' => 'Mexican Peso',
'MYR' => 'Malaysian Ringgit',
'NGN' => 'Nigerian Naira',
'NOK' => 'Norwegian Krone',
'NPR' => 'Nepalese Rupee',
'NZD' => 'New Zealand Dollar',
'OMR' => 'Omani Rial',
'PAB' => 'Panamanian Balboa',
'PEN' => 'Peruvian Nuevo Sol',
'PHP' => 'Philippine Peso',
'PKR' => 'Pakistani Rupee',
'PLN' => 'Polish Zloty',
'PYG' => 'Paraguayan Guarani',
'QAR' => 'Qatari Rial',
'RON' => 'Romanian Leu',
'RUB' => 'Russian Ruble',
'SAR' => 'Saudi Riyal',
'SEK' => 'Swedish Krona',
'SGD' => 'Singapore Dollar',
'THB' => 'Thai Baht',
'TND' => 'Tunisian Dinar',
'TRY' => 'Turkish Lira',
'TWD' => 'New Taiwan Dollar',
'UAH' => 'Ukrainian Hryvnia',
'USD' => 'United States Dollar',
'UZS' => 'Uzbekistani Som',
'VEF' => 'Venezuelan Bolívar',
'VND' => 'Vietnamese Dong',
'XAF' => 'CFA Franc BEAC',
'XOF' => 'CFA Franc BCEAO',
'ZAR' => 'South African Rand',
'ZMW' => 'Zambian Kwacha',
];
/**
* Install and configure krayin.
*/
public function handle()
{
$applicationDetails = ! $this->option('skip-env-check')
? $this->checkForEnvFile()
: [];
$this->loadEnvConfigAtRuntime();
$this->warn('Step: Generating key...');
$this->call('key:generate');
$this->warn('Step: Migrating all tables...');
$this->call('migrate:fresh');
$this->warn('Step: Seeding basic data for Krayin kickstart...');
$this->info(app(KrayinDatabaseSeeder::class)->run([
'locale' => $applicationDetails['locale'] ?? 'en',
'currency' => $applicationDetails['currency'] ?? 'USD',
]));
$this->warn('Step: Publishing assets and configurations...');
$result = $this->call('vendor:publish', ['--provider' => CoreServiceProvider::class, '--force' => true]);
$this->info($result);
$this->warn('Step: Linking storage directory...');
$this->call('storage:link');
$this->warn('Step: Clearing cached bootstrap files...');
$this->call('optimize:clear');
if (! $this->option('skip-admin-creation')) {
$this->warn('Step: Create admin credentials...');
$this->createAdminCredentials();
}
ComposerEvents::postCreateProject();
}
/**
* Checking .env file and if not found then create .env file
*
* @return ?array
*/
protected function checkForEnvFile()
{
if (! file_exists(base_path('.env'))) {
$this->info('Creating the environment configuration file.');
File::copy('.env.example', '.env');
} else {
$this->info('Great! your environment configuration file already exists.');
}
return $this->createEnvFile();
}
/**
* Create a new .env file. Afterwards, request environment configuration details and set them
* in the .env file to facilitate the migration to our database.
*
* @return ?array
*/
protected function createEnvFile()
{
try {
$applicationDetails = $this->askForApplicationDetails();
$this->askForDatabaseDetails();
return $applicationDetails;
} catch (\Exception $e) {
$this->error('Error in creating .env file, please create it manually and then run `php artisan migrate` again.');
}
}
/**
* Ask for application details.
*
* @return void
*/
protected function askForApplicationDetails()
{
$this->updateEnvVariable(
'APP_NAME',
'Please enter the application name',
env('APP_NAME', 'Krayin CRM')
);
$this->updateEnvVariable(
'APP_URL',
'Please enter the application URL',
env('APP_URL', 'http://localhost:8000')
);
$this->envUpdate(
'APP_TIMEZONE',
date_default_timezone_get()
);
$this->info('Your Default Timezone is '.date_default_timezone_get());
$locale = $this->updateEnvChoice(
'APP_LOCALE',
'Please select the default application locale',
$this->locales
);
$currency = $this->updateEnvChoice(
'APP_CURRENCY',
'Please select the default currency',
$this->currencies
);
return [
'locale' => $locale,
'currency' => $currency,
];
}
/**
* Add the database credentials to the .env file.
*/
protected function askForDatabaseDetails()
{
$databaseDetails = [
'DB_CONNECTION' => select(
'Please select the database connection',
['mysql', 'pgsql', 'sqlsrv']
),
'DB_HOST' => text(
label: 'Please enter the database host',
default: env('DB_HOST', '127.0.0.1'),
required: true
),
'DB_PORT' => text(
label: 'Please enter the database port',
default: env('DB_PORT', '3306'),
required: true
),
'DB_DATABASE' => text(
label: 'Please enter the database name',
default: env('DB_DATABASE', ''),
required: true
),
'DB_PREFIX' => text(
label: 'Please enter the database prefix',
default: env('DB_PREFIX', ''),
hint: 'or press enter to continue',
validate: function ($value) {
$input = strlen($value);
if ($input
&& ($input < 1
|| $input > 6)
) {
return 'The database prefix must be between 1 and 6 characters.';
}
if (preg_match('/[^a-zA-Z0-9_]/', $value)) {
return 'The database prefix may only contain letters, numbers, and underscores.';
}
return null;
}
),
'DB_USERNAME' => text(
label: 'Please enter your database username',
default: env('DB_USERNAME', ''),
required: true
),
'DB_PASSWORD' => password(
label: 'Please enter your database password',
required: true
),
];
if (
! $databaseDetails['DB_DATABASE']
|| ! $databaseDetails['DB_USERNAME']
|| ! $databaseDetails['DB_PASSWORD']
) {
return $this->error('Please enter the database credentials.');
}
foreach ($databaseDetails as $key => $value) {
if ($value) {
$this->envUpdate($key, $value);
}
}
}
/**
* Create a admin credentials.
*
* @return mixed
*/
protected function createAdminCredentials()
{
$adminName = text(
label: 'Enter the name of the admin user',
default: 'Example',
required: true
);
$adminEmail = text(
label: 'Enter the email address of the admin user',
default: 'admin@example.com',
validate: fn (string $value) => match (true) {
! filter_var($value, FILTER_VALIDATE_EMAIL) => 'The email address you entered is not valid please try again.',
default => null
}
);
$adminPassword = text(
label: 'Configure the password for the admin user',
default: 'admin123',
required: true
);
$password = password_hash($adminPassword, PASSWORD_BCRYPT, ['cost' => 10]);
try {
DB::table('users')->updateOrInsert(
['id' => 1],
[
'name' => $adminName,
'email' => $adminEmail,
'password' => $password,
'role_id' => 1,
'status' => 1,
]
);
$filePath = storage_path('installed');
File::put($filePath, 'Krayin is successfully installed');
$this->info('-----------------------------');
$this->info('Congratulations!');
$this->info('The installation has been finished and you can now use Krayin.');
$this->info('Go to '.env('APP_URL').'/admin/dashboard'.' and authenticate with:');
$this->info('Email: '.$adminEmail);
$this->info('Password: '.$adminPassword);
$this->info('Cheers!');
Event::dispatch('krayin.installed');
} catch (\Exception $e) {
return $this->error($e->getMessage());
}
}
/**
* Loaded Env variables for config files.
*/
protected function loadEnvConfigAtRuntime(): void
{
$this->warn('Loading configs...');
/**
* Setting application environment.
*/
app()['env'] = $this->getEnvAtRuntime('APP_ENV');
/**
* Setting application configuration.
*/
config([
'app.env' => $this->getEnvAtRuntime('APP_ENV'),
'app.name' => $this->getEnvAtRuntime('APP_NAME'),
'app.url' => $this->getEnvAtRuntime('APP_URL'),
'app.timezone' => $this->getEnvAtRuntime('APP_TIMEZONE'),
'app.locale' => $this->getEnvAtRuntime('APP_LOCALE'),
'app.currency' => $this->getEnvAtRuntime('APP_CURRENCY'),
]);
/**
* Setting database configurations.
*/
$databaseConnection = $this->getEnvAtRuntime('DB_CONNECTION');
config([
"database.connections.{$databaseConnection}.host" => $this->getEnvAtRuntime('DB_HOST'),
"database.connections.{$databaseConnection}.port" => $this->getEnvAtRuntime('DB_PORT'),
"database.connections.{$databaseConnection}.database" => $this->getEnvAtRuntime('DB_DATABASE'),
"database.connections.{$databaseConnection}.username" => $this->getEnvAtRuntime('DB_USERNAME'),
"database.connections.{$databaseConnection}.password" => $this->getEnvAtRuntime('DB_PASSWORD'),
"database.connections.{$databaseConnection}.prefix" => $this->getEnvAtRuntime('DB_PREFIX'),
]);
DB::purge($databaseConnection);
$this->info('Configuration loaded...');
}
/**
* Method for asking the details of .env files
*/
protected function updateEnvVariable(string $key, string $question, string $defaultValue): void
{
$input = text(
label: $question,
default: $defaultValue,
required: true
);
$this->envUpdate($key, $input ?: $defaultValue);
}
/**
* Method for asking choice based on the list of options.
*
* @return string
*/
protected function updateEnvChoice(string $key, string $question, array $choices)
{
$choice = select(
label: $question,
options: $choices,
default: env($key)
);
$this->envUpdate($key, $choice);
return $choice;
}
/**
* Update the .env values.
*/
protected function envUpdate(string $key, string $value): void
{
$data = file_get_contents(base_path('.env'));
// Check if $value contains spaces, and if so, add double quotes
if (preg_match('/\s/', $value)) {
$value = '"'.$value.'"';
}
$data = preg_replace("/$key=(.*)/", "$key=$value", $data);
file_put_contents(base_path('.env'), $data);
}
/**
* Check key in `.env` file because it will help to find values at runtime.
*/
protected static function getEnvAtRuntime(string $key): string|bool
{
if ($data = file(base_path('.env'))) {
foreach ($data as $line) {
$line = preg_replace('/\s+/', '', $line);
$rowValues = explode('=', $line);
if (strlen($line) !== 0) {
if (strpos($key, $rowValues[0]) !== false) {
return $rowValues[1];
}
}
}
}
return false;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,117 @@
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$now = Carbon::now();
DB::table('attributes')
->insert([
[
'code' => 'name',
'name' => trans('installer::app.seeders.attributes.warehouses.name'),
'type' => 'text',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'description',
'name' => trans('installer::app.seeders.attributes.warehouses.description'),
'type' => 'textarea',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_name',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'),
'type' => 'text',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '3',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_emails',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'),
'type' => 'email',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '4',
'is_required' => '1',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_numbers',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'),
'type' => 'phone',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => 'numeric',
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_address',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'),
'type' => 'address',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '6',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('attributes', function (Blueprint $table) {
//
});
}
};

View File

@@ -0,0 +1,40 @@
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$now = Carbon::now();
DB::table('attributes')
->insert([
[
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.organizations.sales-owner'),
'type' => 'lookup',
'entity_type' => 'organizations',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
/**
* Reverse the migrations.
*/
public function down(): void {}
};

View File

@@ -0,0 +1,40 @@
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$now = Carbon::now();
DB::table('attributes')
->insert([
[
'code' => 'job_title',
'name' => trans('installer::app.seeders.attributes.persons.job-title'),
'type' => 'text',
'entity_type' => 'persons',
'lookup_type' => null,
'validation' => null,
'sort_order' => '4',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
/**
* Reverse the migrations.
*/
public function down(): void {}
};

View File

@@ -0,0 +1,40 @@
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$now = Carbon::now();
DB::table('attributes')
->insert([
[
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.persons.sales-owner'),
'type' => 'lookup',
'entity_type' => 'persons',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
/**
* Reverse the migrations.
*/
public function down(): void {}
};

View File

@@ -0,0 +1,57 @@
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$now = Carbon::now();
DB::table('attributes')
->insert([
[
'code' => 'lead_pipeline_id',
'name' => trans('installer::app.seeders.attributes.leads.pipeline'),
'type' => 'lookup',
'entity_type' => 'leads',
'lookup_type' => 'lead_pipelines',
'validation' => null,
'sort_order' => '9',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_pipeline_stage_id',
'name' => trans('installer::app.seeders.attributes.leads.stage'),
'type' => 'lookup',
'entity_type' => 'leads',
'lookup_type' => 'lead_pipeline_stages',
'validation' => null,
'sort_order' => '10',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
//
}
};

View File

@@ -0,0 +1,645 @@
<?php
namespace Webkul\Installer\Database\Seeders\Attribute;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class AttributeSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('attributes')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('attributes')->insert([
/**
* Leads Attributes
*/
[
'code' => 'title',
'name' => trans('installer::app.seeders.attributes.leads.title', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'leads',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'description',
'name' => trans('installer::app.seeders.attributes.leads.description', [], $defaultLocale),
'type' => 'textarea',
'entity_type' => 'leads',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_value',
'name' => trans('installer::app.seeders.attributes.leads.lead-value', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'leads',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '3',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_source_id',
'name' => trans('installer::app.seeders.attributes.leads.source', [], $defaultLocale),
'type' => 'select',
'entity_type' => 'leads',
'lookup_type' => 'lead_sources',
'validation' => null,
'sort_order' => '4',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_type_id',
'name' => trans('installer::app.seeders.attributes.leads.type', [], $defaultLocale),
'type' => 'select',
'entity_type' => 'leads',
'lookup_type' => 'lead_types',
'validation' => null,
'sort_order' => '5',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.leads.sales-owner', [], $defaultLocale),
'type' => 'select',
'entity_type' => 'leads',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '7',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'expected_close_date',
'name' => trans('installer::app.seeders.attributes.leads.expected-close-date', [], $defaultLocale),
'type' => 'date',
'entity_type' => 'leads',
'lookup_type' => null,
'validation' => null,
'sort_order' => '8',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_pipeline_id',
'name' => trans('installer::app.seeders.attributes.leads.pipeline', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'leads',
'lookup_type' => 'lead_pipelines',
'validation' => null,
'sort_order' => '9',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'lead_pipeline_stage_id',
'name' => trans('installer::app.seeders.attributes.leads.stage', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'leads',
'lookup_type' => 'lead_pipeline_stages',
'validation' => null,
'sort_order' => '10',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
/**
* Persons Attributes
*/
[
'code' => 'name',
'name' => trans('installer::app.seeders.attributes.persons.name', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'persons',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'emails',
'name' => trans('installer::app.seeders.attributes.persons.emails', [], $defaultLocale),
'type' => 'email',
'entity_type' => 'persons',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '1',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_numbers',
'name' => trans('installer::app.seeders.attributes.persons.contact-numbers', [], $defaultLocale),
'type' => 'phone',
'entity_type' => 'persons',
'lookup_type' => null,
'validation' => 'numeric',
'sort_order' => '3',
'is_required' => '0',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'job_title',
'name' => trans('installer::app.seeders.attributes.persons.job-title', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'persons',
'lookup_type' => null,
'validation' => null,
'sort_order' => '4',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.persons.sales-owner', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'persons',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'organization_id',
'name' => trans('installer::app.seeders.attributes.persons.organization', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'persons',
'lookup_type' => 'organizations',
'validation' => null,
'sort_order' => '6',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
/**
* Organizations Attributes
*/
[
'code' => 'name',
'name' => trans('installer::app.seeders.attributes.organizations.name', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'organizations',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'address',
'name' => trans('installer::app.seeders.attributes.organizations.address', [], $defaultLocale),
'type' => 'address',
'entity_type' => 'organizations',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.organizations.sales-owner', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'organizations',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '3',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
/**
* Products Attributes
*/
[
'code' => 'name',
'name' => trans('installer::app.seeders.attributes.products.name', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'products',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'description',
'name' => trans('installer::app.seeders.attributes.products.description', [], $defaultLocale),
'type' => 'textarea',
'entity_type' => 'products',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'sku',
'name' => trans('installer::app.seeders.attributes.products.sku', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'products',
'lookup_type' => null,
'validation' => null,
'sort_order' => '3',
'is_required' => '1',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'quantity',
'name' => trans('installer::app.seeders.attributes.products.quantity', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'products',
'lookup_type' => null,
'validation' => 'numeric',
'sort_order' => '4',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'price',
'name' => trans('installer::app.seeders.attributes.products.price', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'products',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '5',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
/**
* Quotes Attributes
*/
[
'code' => 'user_id',
'name' => trans('installer::app.seeders.attributes.quotes.sales-owner', [], $defaultLocale),
'type' => 'select',
'entity_type' => 'quotes',
'lookup_type' => 'users',
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'subject',
'name' => trans('installer::app.seeders.attributes.quotes.subject', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'description',
'name' => trans('installer::app.seeders.attributes.quotes.description', [], $defaultLocale),
'type' => 'textarea',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => null,
'sort_order' => '3',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'billing_address',
'name' => trans('installer::app.seeders.attributes.quotes.billing-address', [], $defaultLocale),
'type' => 'address',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => null,
'sort_order' => '4',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'shipping_address',
'name' => trans('installer::app.seeders.attributes.quotes.shipping-address', [], $defaultLocale),
'type' => 'address',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => null,
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'discount_percent',
'name' => trans('installer::app.seeders.attributes.quotes.discount-percent', [], $defaultLocale),
'type' => 'text',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '6',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'discount_amount',
'name' => trans('installer::app.seeders.attributes.quotes.discount-amount', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '7',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'tax_amount',
'name' => trans('installer::app.seeders.attributes.quotes.tax-amount', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '8',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'adjustment_amount',
'name' => trans('installer::app.seeders.attributes.quotes.adjustment-amount', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '9',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'sub_total',
'name' => trans('installer::app.seeders.attributes.quotes.sub-total', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '10',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'grand_total',
'name' => trans('installer::app.seeders.attributes.quotes.grand-total', [], $defaultLocale),
'type' => 'price',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => 'decimal',
'sort_order' => '11',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'expired_at',
'name' => trans('installer::app.seeders.attributes.quotes.expired-at', [], $defaultLocale),
'type' => 'date',
'entity_type' => 'quotes',
'lookup_type' => null,
'validation' => null,
'sort_order' => '12',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'person_id',
'name' => trans('installer::app.seeders.attributes.quotes.person', [], $defaultLocale),
'type' => 'lookup',
'entity_type' => 'quotes',
'lookup_type' => 'persons',
'validation' => null,
'sort_order' => '13',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
/**
* Warehouses Attributes
*/
[
'code' => 'name',
'name' => trans('installer::app.seeders.attributes.warehouses.name'),
'type' => 'text',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '1',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'description',
'name' => trans('installer::app.seeders.attributes.warehouses.description'),
'type' => 'textarea',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '2',
'is_required' => '0',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_name',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'),
'type' => 'text',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '3',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_emails',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'),
'type' => 'email',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '4',
'is_required' => '1',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_numbers',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'),
'type' => 'phone',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => 'numeric',
'sort_order' => '5',
'is_required' => '0',
'is_unique' => '1',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
], [
'code' => 'contact_address',
'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'),
'type' => 'address',
'entity_type' => 'warehouses',
'lookup_type' => null,
'validation' => null,
'sort_order' => '6',
'is_required' => '1',
'is_unique' => '0',
'quick_add' => '1',
'is_user_defined' => '0',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Webkul\Installer\Database\Seeders\Attribute;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(AttributeSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Webkul\Installer\Database\Seeders\Core;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CountriesSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('countries')->delete();
$countries = json_decode(file_get_contents(__DIR__.'/../../../Data/countries.json'), true);
DB::table('countries')->insert($countries);
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Webkul\Installer\Database\Seeders\Core;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(CountriesSeeder::class, false, ['parameters' => $parameters]);
$this->call(StatesSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Webkul\Installer\Database\Seeders\Core;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class StatesSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('country_states')->delete();
$states = json_decode(file_get_contents(__DIR__.'/../../../Data/states.json'), true);
DB::table('country_states')->insert($states);
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Webkul\Installer\Database\Seeders;
use Illuminate\Database\Seeder;
use Webkul\Installer\Database\Seeders\Attribute\DatabaseSeeder as AttributeSeeder;
use Webkul\Installer\Database\Seeders\Core\DatabaseSeeder as CoreSeeder;
use Webkul\Installer\Database\Seeders\EmailTemplate\DatabaseSeeder as EmailTemplateSeeder;
use Webkul\Installer\Database\Seeders\Lead\DatabaseSeeder as LeadSeeder;
use Webkul\Installer\Database\Seeders\User\DatabaseSeeder as UserSeeder;
use Webkul\Installer\Database\Seeders\Workflow\DatabaseSeeder as WorkflowSeeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(AttributeSeeder::class, false, ['parameters' => $parameters]);
$this->call(CoreSeeder::class, false, ['parameters' => $parameters]);
$this->call(EmailTemplateSeeder::class, false, ['parameters' => $parameters]);
$this->call(LeadSeeder::class, false, ['parameters' => $parameters]);
$this->call(UserSeeder::class, false, ['parameters' => $parameters]);
$this->call(WorkflowSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Webkul\Installer\Database\Seeders\EmailTemplate;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(EmailTemplateSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace Webkul\Installer\Database\Seeders\EmailTemplate;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class EmailTemplateSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('email_templates')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('email_templates')->insert([
[
'id' => 1,
'name' => trans('installer::app.seeders.email.activity-created', [], $defaultLocale),
'subject' => trans('installer::app.seeders.email.activity-created', [], $defaultLocale).': {%activities.title%}',
'created_at' => $now,
'updated_at' => $now,
'content' => '<p style="font-size: 16px; color: #5e5e5e;">'.trans('installer::app.seeders.email.new-activity', [], $defaultLocale).':</p>
<p><strong style="font-size: 16px;">Details</strong></p>
<table style="height: 97px; width: 952px;">
<tbody>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.title', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.title%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.type', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.type%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.date', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.schedule_from%} to&nbsp;{%activities.schedule_to%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px; vertical-align: text-top;">'.trans('installer::app.seeders.email.participants', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.participants%}</td>
</tr>
</tbody>
</table>',
], [
'id' => 2,
'name' => trans('installer::app.seeders.email.activity-modified', [], $defaultLocale),
'subject' => trans('installer::app.seeders.email.activity-modified', [], $defaultLocale).': {%activities.title%}',
'created_at' => $now,
'updated_at' => $now,
'content' => '<p style="font-size: 16px; color: #5e5e5e;">'.trans('installer::app.seeders.email.new-activity-modified', [], $defaultLocale).':</p>
<p><strong style="font-size: 16px;">Details</strong></p>
<table style="height: 97px; width: 952px;">
<tbody>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.title', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.title%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.type', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.type%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px;">'.trans('installer::app.seeders.email.date', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.schedule_from%} to&nbsp;{%activities.schedule_to%}</td>
</tr>
<tr>
<td style="width: 116.953px; color: #546e7a; font-size: 16px; vertical-align: text-top;">'.trans('installer::app.seeders.email.participants', [], $defaultLocale).'</td>
<td style="width: 770.047px; font-size: 16px;">{%activities.participants%}</td>
</tr>
</tbody>
</table>',
],
]);
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Webkul\Installer\Database\Seeders\Lead;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(PipelineSeeder::class, false, ['parameters' => $parameters]);
$this->call(TypeSeeder::class, false, ['parameters' => $parameters]);
$this->call(SourceSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace Webkul\Installer\Database\Seeders\Lead;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class PipelineSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('lead_pipelines')->delete();
DB::table('lead_pipeline_stages')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('lead_pipelines')->insert([
[
'id' => 1,
'name' => trans('installer::app.seeders.lead.pipeline.default', [], $defaultLocale),
'is_default' => 1,
'created_at' => $now,
'updated_at' => $now,
],
]);
DB::table('lead_pipeline_stages')->insert($data = [
[
'id' => 1,
'code' => 'new',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.new', [], $defaultLocale),
'probability' => 100,
'sort_order' => 1,
'lead_pipeline_id' => 1,
], [
'id' => 2,
'code' => 'follow-up',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.follow-up', [], $defaultLocale),
'probability' => 100,
'sort_order' => 2,
'lead_pipeline_id' => 1,
], [
'id' => 3,
'code' => 'prospect',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.prospect', [], $defaultLocale),
'probability' => 100,
'sort_order' => 3,
'lead_pipeline_id' => 1,
], [
'id' => 4,
'code' => 'negotiation',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.negotiation', [], $defaultLocale),
'probability' => 100,
'sort_order' => 4,
'lead_pipeline_id' => 1,
], [
'id' => 5,
'code' => 'won',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.won', [], $defaultLocale),
'probability' => 100,
'sort_order' => 5,
'lead_pipeline_id' => 1,
], [
'id' => 6,
'code' => 'lost',
'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.lost', [], $defaultLocale),
'probability' => 0,
'sort_order' => 6,
'lead_pipeline_id' => 1,
],
]);
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Webkul\Installer\Database\Seeders\Lead;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class SourceSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('lead_sources')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('lead_sources')->insert([
[
'id' => 1,
'name' => trans('installer::app.seeders.lead.source.email', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 2,
'name' => trans('installer::app.seeders.lead.source.web', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 3,
'name' => trans('installer::app.seeders.lead.source.web-form', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 4,
'name' => trans('installer::app.seeders.lead.source.phone', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 5,
'name' => trans('installer::app.seeders.lead.source.direct', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
],
]);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace Webkul\Installer\Database\Seeders\Lead;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class TypeSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('lead_types')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('lead_types')->insert([
[
'id' => 1,
'name' => trans('installer::app.seeders.lead.type.new-business', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 2,
'name' => trans('installer::app.seeders.lead.type.existing-business', [], $defaultLocale),
'created_at' => $now,
'updated_at' => $now,
],
]);
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Webkul\Installer\Database\Seeders\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(RoleSeeder::class, false, ['parameters' => $parameters]);
$this->call(UserSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Webkul\Installer\Database\Seeders\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class RoleSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('users')->delete();
DB::table('roles')->delete();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('roles')->insert([
'id' => 1,
'name' => trans('installer::app.seeders.user.role.administrator', [], $defaultLocale),
'description' => trans('installer::app.seeders.user.role.administrator-role', [], $defaultLocale),
'permission_type' => 'all',
]);
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace Webkul\Installer\Database\Seeders\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class UserSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('users')->delete();
DB::table('users')->insert([
'id' => 1,
'name' => 'Example Admin',
'email' => 'admin@example.com',
'password' => bcrypt('admin123'),
// 'api_token' => Str::random(80),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'status' => 1,
'role_id' => 1,
'view_permission' => 'global',
]);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Webkul\Installer\Database\Seeders\Workflow;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
$this->call(WorkflowSeeder::class, false, ['parameters' => $parameters]);
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace Webkul\Installer\Database\Seeders\Workflow;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class WorkflowSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @param array $parameters
* @return void
*/
public function run($parameters = [])
{
DB::table('workflows')->delete();
$now = Carbon::now();
$defaultLocale = $parameters['locale'] ?? config('app.locale');
DB::table('workflows')->insert([
[
'id' => 1,
'name' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-creation', [], $defaultLocale),
'description' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-creation', [], $defaultLocale),
'entity_type' => 'activities',
'event' => 'activity.create.after',
'condition_type' => 'and',
'conditions' => '[{"value": ["call", "meeting", "lunch"], "operator": "{}", "attribute": "type", "attribute_type": "multiselect"}]',
'actions' => '[{"id": "send_email_to_participants", "value": "1"}]',
'created_at' => $now,
'updated_at' => $now,
], [
'id' => 2,
'name' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-updation', [], $defaultLocale),
'description' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-updation', [], $defaultLocale),
'entity_type' => 'activities',
'event' => 'activity.update.after',
'condition_type' => 'and',
'conditions' => '[{"value": ["call", "meeting", "lunch"], "operator": "{}", "attribute": "type", "attribute_type": "multiselect"}]',
'actions' => '[{"id": "send_email_to_participants", "value": "2"}]',
'created_at' => $now,
'updated_at' => $now,
],
]);
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Webkul\Installer\Events;
use Symfony\Component\Console\Output\ConsoleOutput;
class ComposerEvents
{
/**
* Post create project.
*
* @return void
*/
public static function postCreateProject()
{
$output = new ConsoleOutput;
$output->writeln(file_get_contents(__DIR__.'/../Templates/on-boarding.php'));
}
}

View File

@@ -0,0 +1,107 @@
<?php
namespace Webkul\Installer\Helpers;
use Exception;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Webkul\Installer\Database\Seeders\DatabaseSeeder as KrayinDatabaseSeeder;
class DatabaseManager
{
/**
* Check Database Connection.
*/
public function isInstalled()
{
if (! file_exists(base_path('.env'))) {
return false;
}
try {
DB::connection()->getPDO();
$isConnected = (bool) DB::connection()->getDatabaseName();
if (! $isConnected) {
return false;
}
$hasUserTable = Schema::hasTable('users');
if (! $hasUserTable) {
return false;
}
$userCount = DB::table('users')->count();
if (! $userCount) {
return false;
}
return true;
} catch (Exception $e) {
return false;
}
}
/**
* Drop all the tables and migrate in the database
*
* @return void|string
*/
public function migration()
{
try {
Artisan::call('migrate:fresh');
return response()->json([
'success' => true,
'message' => 'Tables is migrated successfully.',
]);
} catch (Exception $e) {
return response()->json([
'error' => $e->getMessage(),
], 500);
}
}
/**
* Seed the database.
*
* @return void|string
*/
public function seeder($data)
{
try {
app(KrayinDatabaseSeeder::class)->run([
'default_locale' => $data['parameter']['default_locales'],
'default_currency' => $data['parameter']['default_currency'],
]);
$this->storageLink();
} catch (Exception $e) {
return $e->getMessage();
}
}
/**
* Storage Link.
*/
private function storageLink()
{
Artisan::call('storage:link');
}
/**
* Generate New Application Key
*/
public function generateKey()
{
try {
Artisan::call('key:generate');
} catch (Exception $e) {
}
}
}

View File

@@ -0,0 +1,94 @@
<?php
namespace Webkul\Installer\Helpers;
use Exception;
class EnvironmentManager
{
/**
* Create a helper instance.
*
* @return void
*/
public function __construct(protected DatabaseManager $databaseManager) {}
/**
* Generate ENV File and Installation.
*
* @param [object] $request
*/
public function generateEnv($request)
{
$envExamplePath = base_path('.env.example');
$envPath = base_path('.env');
if (! file_exists($envPath)) {
if (file_exists($envExamplePath)) {
copy($envExamplePath, $envPath);
} else {
touch($envPath);
}
}
try {
$response = $this->setEnvConfiguration($request->all());
$this->databaseManager->generateKey();
return $response;
} catch (Exception $e) {
return $e;
}
}
/**
* Set the ENV file configuration.
*
* @return string
*/
public function setEnvConfiguration(array $request)
{
$envDBParams = [];
/**
* Update params with form-data.
*/
if (isset($request['db_hostname'])) {
$envDBParams['DB_HOST'] = $request['db_hostname'];
$envDBParams['DB_DATABASE'] = $request['db_name'];
$envDBParams['DB_PREFIX'] = $request['db_prefix'] ?? '';
$envDBParams['DB_USERNAME'] = $request['db_username'];
$envDBParams['DB_PASSWORD'] = $request['db_password'];
$envDBParams['DB_CONNECTION'] = $request['db_connection'];
$envDBParams['DB_PORT'] = (int) $request['db_port'];
}
if (isset($request['app_name'])) {
$envDBParams['APP_NAME'] = $request['app_name'] ?? null;
$envDBParams['APP_URL'] = $request['app_url'];
$envDBParams['APP_LOCALE'] = $request['app_locale'];
$envDBParams['APP_TIMEZONE'] = $request['app_timezone'];
$envDBParams['APP_CURRENCY'] = $request['app_currency'];
}
$data = file_get_contents(base_path('.env'));
foreach ($envDBParams as $key => $value) {
if (preg_match('/\s/', $value)) {
$value = '"'.$value.'"';
}
$data = preg_replace("/$key=(.*)/", "$key=$value", $data);
}
try {
file_put_contents(base_path('.env'), $data);
} catch (Exception $e) {
return false;
}
return true;
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace Webkul\Installer\Helpers;
class ServerRequirements
{
/**
* Minimum PHP Version Supported (Override is in installer.php config file).
*
* @var string
*/
private $minPhpVersion = '8.1.0';
/**
* Check for the server requirements.
*/
public function validate(): array
{
// Server Requirements
$requirements = [
'php' => [
'calendar',
'ctype',
'curl',
'dom',
'fileinfo',
'filter',
'gd',
'hash',
'intl',
'json',
'mbstring',
'openssl',
'pcre',
'pdo',
'session',
'tokenizer',
'xml',
],
];
$results = [];
foreach ($requirements as $type => $requirement) {
foreach ($requirement as $item) {
$results['requirements'][$type][$item] = true;
if (! extension_loaded($item)) {
$results['requirements'][$type][$item] = false;
$results['errors'] = true;
}
}
}
return $results;
}
/**
* Check PHP version requirement.
*
* @return array
*/
public function checkPHPversion(?string $minPhpVersion = null)
{
$minVersionPhp = $minPhpVersion ?? $this->minPhpVersion;
$currentPhpVersion = $this->getPhpVersionInfo();
$supported = version_compare($currentPhpVersion['version'], $minVersionPhp) >= 0;
return [
'full' => $currentPhpVersion['full'],
'current' => $currentPhpVersion['version'],
'minimum' => $minVersionPhp,
'supported' => $supported,
];
}
/**
* Get current Php version information.
*
* @return array
*/
private static function getPhpVersionInfo()
{
$currentVersionFull = PHP_VERSION;
preg_match("#^\d+(\.\d+)*#", $currentVersionFull, $filtered);
return [
'full' => $currentVersionFull,
'version' => $filtered[0] ?? $currentVersionFull,
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace Webkul\Installer\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;
}

View File

@@ -0,0 +1,108 @@
<?php
namespace Webkul\Installer\Http\Controllers;
use Illuminate\Http\Response as IlluminateResponse;
use Illuminate\Support\Facades\Cache;
class ImageCacheController
{
/**
* Cache template
*
* @var string
*/
protected $template;
/**
* Logo
*
* @var string
*/
const KRAYIN_LOGO = 'https://updates.krayincrm.com/krayin.png';
/**
* Get HTTP response of template applied image file
*
* @param string $filename
* @return Illuminate\Http\Response
*/
public function getImage($filename)
{
try {
$content = Cache::remember('krayin-logo', 10080, function () {
return $this->getImageFromUrl(self::KRAYIN_LOGO);
});
} catch (\Exception $e) {
$content = '';
}
return $this->buildResponse($content);
}
/**
* Init from given URL
*
* @param string $url
* @return \Intervention\Image\Image
*/
public function getImageFromUrl($url)
{
$domain = config('app.url');
$options = [
'http' => [
'method' => 'GET',
'protocol_version' => 1.1, // force use HTTP 1.1 for service mesh environment with envoy
'header' => "Accept-language: en\r\n".
"Domain: $domain\r\n".
"User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36\r\n",
],
];
$context = stream_context_create($options);
if ($data = @file_get_contents($url, false, $context)) {
return $data;
}
throw new \Exception(
'Unable to init from given url ('.$url.').'
);
}
/**
* Builds HTTP response from given image data
*
* @param string $content
* @return Illuminate\Http\Response
*/
protected function buildResponse($content)
{
/**
* Define mime type
*/
$mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content);
/**
* Respond with 304 not modified if browser has the image cached
*/
$eTag = md5($content);
$notModified = isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $eTag;
$content = $notModified ? null : $content;
$statusCode = $notModified ? 304 : 200;
/**
* Return http response
*/
return new IlluminateResponse($content, $statusCode, [
'Content-Type' => $mime,
'Cache-Control' => 'max-age=10080, public',
'Content-Length' => strlen($content),
'Etag' => $eTag,
]);
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace Webkul\Installer\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\File;
use Webkul\Installer\Helpers\DatabaseManager;
use Webkul\Installer\Helpers\EnvironmentManager;
use Webkul\Installer\Helpers\ServerRequirements;
class InstallerController extends Controller
{
/**
* Const Variable For Min PHP Version
*
* @var string
*/
const MIN_PHP_VERSION = '8.1.0';
/**
* Const Variable for Static Customer Id
*
* @var int
*/
const USER_ID = 1;
/**
* Create a new controller instance
*
* @return void
*/
public function __construct(
protected ServerRequirements $serverRequirements,
protected EnvironmentManager $environmentManager,
protected DatabaseManager $databaseManager
) {}
/**
* Installer View Root Page
*/
public function index()
{
$phpVersion = $this->serverRequirements->checkPHPversion(self::MIN_PHP_VERSION);
$requirements = $this->serverRequirements->validate();
if (request()->has('locale')) {
return redirect()->route('installer.index');
}
return view('installer::installer.index', compact('requirements', 'phpVersion'));
}
/**
* ENV File Setup
*/
public function envFileSetup(Request $request): JsonResponse
{
$message = $this->environmentManager->generateEnv($request);
return new JsonResponse(['data' => $message]);
}
/**
* Run Migration
*/
public function runMigration(): mixed
{
return $this->databaseManager->migration();
}
/**
* Run Seeder.
*
* @return void|string
*/
public function runSeeder()
{
$allParameters = request()->allParameters;
$parameter = [
'parameter' => [
'default_locales' => $allParameters['app_locale'] ?? null,
'default_currency' => $allParameters['app_currency'] ?? null,
],
];
$response = $this->environmentManager->setEnvConfiguration($allParameters);
if ($response) {
$seeder = $this->databaseManager->seeder($parameter);
return $seeder;
}
}
/**
* Admin Configuration Setup.
*/
public function adminConfigSetup(): bool
{
$password = password_hash(request()->input('password'), PASSWORD_BCRYPT, ['cost' => 10]);
try {
DB::table('users')->updateOrInsert(
[
'id' => self::USER_ID,
], [
'name' => request()->input('admin'),
'email' => request()->input('email'),
'password' => $password,
'role_id' => 1,
'status' => 1,
]
);
$this->smtpConfigSetup();
return true;
} catch (\Throwable $th) {
report($th);
return false;
}
}
/**
* SMTP connection setup for Mail
*/
private function smtpConfigSetup()
{
$filePath = storage_path('installed');
File::put($filePath, 'Your Krayin App is Successfully Installed');
Event::dispatch('krayin.installed');
return $filePath;
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace Webkul\Installer\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use Webkul\Installer\Helpers\DatabaseManager;
class CanInstall
{
/**
* Handles Requests if application is already installed then redirect to dashboard else to installer.
*/
public function handle(Request $request, Closure $next): mixed
{
if (Str::contains($request->getPathInfo(), '/install')) {
if ($this->isAlreadyInstalled() && ! $request->ajax()) {
return redirect()->route('admin.dashboard.index');
}
} else {
if (! $this->isAlreadyInstalled()) {
return redirect()->route('installer.index');
}
}
return $next($request);
}
/**
* Check if application is already installed.
*/
public function isAlreadyInstalled(): bool
{
if (file_exists(storage_path('installed'))) {
return true;
}
if (app(DatabaseManager::class)->isInstalled()) {
touch(storage_path('installed'));
Event::dispatch('krayin.installed');
return true;
}
return false;
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace Webkul\Installer\Http\Middleware;
use Closure;
class Locale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($localeCode = $request->query('locale')) {
app()->setLocale($localeCode);
session()->put('installer_locale', $localeCode);
} else {
app()->setLocale(session()->get('installer_locale') ?? config('app.locale'));
}
return $next($request);
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Webkul\Installer\Listeners;
use GuzzleHttp\Client;
use Webkul\User\Repositories\UserRepository;
class Installer
{
/**
* Api endpoint
*
* @var string
*/
protected const API_ENDPOINT = 'https://updates.krayincrm.com/api/updates';
/**
* Create a new listener instance.
*
* @return void
*/
public function __construct(protected UserRepository $userRepository) {}
/**
* After Krayin is successfully installed
*
* @return void
*/
public function installed()
{
$user = $this->userRepository->first();
$httpClient = new Client;
try {
$httpClient->request('POST', self::API_ENDPOINT, [
'headers' => [
'Accept' => 'application/json',
],
'json' => [
'domain' => config('app.url'),
'email' => $user?->email,
'name' => $user?->name,
'country_code' => config('app.default_country') ?? 'IN',
],
]);
} catch (\Exception $e) {
/**
* Skip the error
*/
}
}
}

View File

@@ -0,0 +1,62 @@
<?php
namespace Webkul\Installer\Providers;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use Webkul\Installer\Console\Commands\Installer as InstallerCommand;
use Webkul\Installer\Http\Middleware\CanInstall;
use Webkul\Installer\Http\Middleware\Locale;
class InstallerServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*/
protected bool $defer = false;
/**
* Bootstrap the application events.
*/
public function boot(Router $router): void
{
$router->middlewareGroup('install', [CanInstall::class]);
$this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');
$this->loadRoutesFrom(__DIR__.'/../Routes/web.php');
$this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');
$this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');
$this->loadViewsFrom(__DIR__.'/../Resources/views', 'installer');
$router->aliasMiddleware('installer_locale', Locale::class);
Event::listen('krayin.installed', 'Webkul\Installer\Listeners\Installer@installed');
$this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');
/**
* Route to access template applied image file
*/
$this->app['router']->get('cache/{filename}', [
'uses' => 'Webkul\Installer\Http\Controllers\ImageCacheController@getImage',
'as' => 'image_cache',
])->where(['filename' => '[ \w\\.\\/\\-\\@\(\)\=]+']);
}
/**
* Register the service provider.
*/
public function register(): void
{
if (! $this->app->runningInConsole()) {
return;
}
$this->commands([InstallerCommand::class]);
}
}

View File

@@ -0,0 +1,182 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
/* -------------------------------- new css -------------------------------- */
@font-face {
font-family: "icomoon";
src: url("../fonts/icomoon.eot?w2trdd");
src: url("../fonts/icomoon.eot?w2trdd#iefix") format("embedded-opentype"),
url("../fonts/icomoon.ttf?w2trdd") format("truetype"),
url("../fonts/icomoon.woff?w2trdd") format("woff"),
url("../fonts/icomoon.svg?w2trdd#icomoon") format("svg");
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"],
[class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: "icomoon" !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* -------------------------------- new css end -------------------------------- */
@layer components {
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 6px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
/* Firefox */
* {
scrollbar-width: thin;
scrollbar-color: #888 #f1f1f1;
}
::selection {
background-color: rgba(0, 68, 242, 0.2);
}
body {
@apply bg-gray-100 text-sm text-gray-800;
}
button:disabled {
@apply cursor-not-allowed opacity-50;
}
button:disabled:hover {
@apply cursor-not-allowed opacity-50;
}
.direction-ltr {
direction: ltr;
}
.direction-rtl {
direction: rtl;
}
.draggable-ghost {
opacity: 0.5;
background: #e0e7ff;
}
html.dark [class^="icon-"],
html.dark [class*=" icon-"] {
color: #d1d5db;
}
/* -------------------------------- new css -------------------------------- */
.icon-tick:before {
content: "\e931";
}
.icon-cross-large:before {
content: "\e91c";
}
.icon-left-arrow:before {
content: "\e91d";
}
.icon-right-arrow:before {
content: "\e91e";
}
.icon-up-arrow:before {
content: "\e91f";
}
.icon-down-arrow:before {
content: "\e920";
}
/* -------------------------------- new css end -------------------------------- */
p {
@apply text-[14px] !leading-[17px];
}
input,
textarea,
select {
@apply outline-none;
}
.primary-button {
@apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all;
}
.secondary-button {
@apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover: bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80;
}
.transparent-button {
@apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950;
}
.journal-scroll::-webkit-scrollbar {
width: 14px;
cursor: pointer;
display: none;
}
.journal-scroll::-webkit-scrollbar-track {
background-color: #fff;
cursor: pointer;
border-radius: 12px;
border: 1px solid #e9e9e9;
}
.journal-scroll::-webkit-scrollbar-thumb {
cursor: pointer;
background-color: #e9e9e9;
border-radius: 12px;
border: 3px solid transparent;
background-clip: content-box;
}
.custom-select {
-webkit-appearance: none;
-moz-appearance: none;
background: transparent;
background-image: url("data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>");
background-repeat: no-repeat;
background-position-x: calc(100% - 10px);
background-position-y: 50%;
}
.dark .custom-select {
background-image: url("data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>");
}
[dir="rtl"] .custom-select {
background-position-x: calc(100% - (100% - 10px));
}
}
/* -------------------------------- new css end -------------------------------- */

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-opacity="0.25"
stroke-width="4"
>
</circle>
<path
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
stroke-opacity="0.75"
>
</path>
</svg>

After

Width:  |  Height:  |  Size: 454 B

View File

@@ -0,0 +1,89 @@
/**
* This will track all the images and fonts for publishing.
*/
import.meta.glob(["../images/**", "../fonts/**"]);
/**
* Main vue bundler.
*/
import { createApp } from "vue/dist/vue.esm-bundler";
/**
* We are defining all the global rules here and configuring
* all the `vee-validate` settings.
*/
import { configure, defineRule } from "vee-validate";
import { localize } from "@vee-validate/i18n";
import en from "@vee-validate/i18n/dist/locale/en.json";
import { all } from '@vee-validate/rules';
/**
* Registration of all global validators.
*/
Object.entries(all).forEach(([name, rule]) => defineRule(name, rule));
defineRule("", () => true);
configure({
/**
* Built-in error messages and custom error messages are available. Multiple
* locales can be added in the same way.
*/
generateMessage: localize({
en: {
...en,
messages: {
...en.messages,
phone: "This {field} must be a valid phone number",
},
},
}),
validateOnBlur: true,
validateOnInput: true,
validateOnChange: true,
});
/**
* Main root application registry.
*/
window.app = createApp({
data() {
return {};
},
methods: {
onSubmit() {},
onInvalidSubmit() {},
},
});
/**
* Global plugins registration.
*/
import Axios from "./plugins/axios";
[
Axios,
].forEach((plugin) => app.use(plugin));
/**
* Global components registration;
*/
import { Field, Form, ErrorMessage } from "vee-validate";
app.component("VForm", Form);
app.component("VField", Field);
app.component("VErrorMessage", ErrorMessage);
/**
* Load event, the purpose of using the event is to mount the application
* after all of our `Vue` components which is present in blade file have
* been registered in the app. No matter what `app.mount()` should be
* called in the last.
*/
window.addEventListener("load", function (event) {
app.mount("#app");
});

View File

@@ -0,0 +1,9 @@
import axios from "axios";
window.axios = axios;
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
export default {
install(app) {
app.config.globalProperties.$axios = axios;
},
};

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'الوصف',
'expected-close-date' => 'تاريخ الإغلاق المتوقع',
'lead-value' => 'قيمة العميل المحتمل',
'sales-owner' => 'مالك المبيعات',
'source' => 'المصدر',
'title' => 'العنوان',
'type' => 'النوع',
'pipeline' => 'قناة المبيعات',
'stage' => 'المرحلة',
],
'persons' => [
'contact-numbers' => 'أرقام الاتصال',
'emails' => 'البريد الإلكتروني',
'job-title' => 'المسمى الوظيفي',
'name' => 'الاسم',
'organization' => 'المنظمة',
'sales-owner' => 'مالك المبيعات',
],
'organizations' => [
'address' => 'العنوان',
'name' => 'الاسم',
'sales-owner' => 'مالك المبيعات',
],
'products' => [
'description' => 'الوصف',
'name' => 'الاسم',
'price' => 'السعر',
'quantity' => 'الكمية',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'مبلغ التعديل',
'billing-address' => 'عنوان الفواتير',
'description' => 'الوصف',
'discount-amount' => 'مبلغ الخصم',
'discount-percent' => 'نسبة الخصم',
'expired-at' => 'منتهي في',
'grand-total' => 'الإجمالي',
'person' => 'شخص',
'sales-owner' => 'مالك المبيعات',
'shipping-address' => 'عنوان الشحن',
'sub-total' => 'الإجمالي الفرعي',
'subject' => 'الموضوع',
'tax-amount' => 'مبلغ الضريبة',
],
'warehouses' => [
'contact-address' => 'عنوان الاتصال',
'contact-emails' => 'البريد الإلكتروني للتواصل',
'contact-name' => 'اسم الاتصال',
'contact-numbers' => 'أرقام الاتصال',
'description' => 'الوصف',
'name' => 'الاسم',
],
],
'email' => [
'activity-created' => 'تم إنشاء النشاط',
'activity-modified' => 'تم تعديل النشاط',
'date' => 'التاريخ',
'new-activity' => 'لديك نشاط جديد، يرجى العثور على التفاصيل أدناه',
'new-activity-modified' => 'تم تعديل النشاط الجديد، يرجى العثور على التفاصيل أدناه',
'participants' => 'المشاركون',
'title' => 'العنوان',
'type' => 'النوع',
],
'lead' => [
'pipeline' => [
'default' => 'قناة المبيعات الافتراضية',
'pipeline-stages' => [
'follow-up' => 'متابعة',
'lost' => 'مفقود',
'negotiation' => 'مفاوضات',
'new' => 'جديد',
'prospect' => 'عميل محتمل',
'won' => 'مُنتصر',
],
],
'source' => [
'direct' => 'مباشر',
'email' => 'البريد الإلكتروني',
'phone' => 'الهاتف',
'web' => 'ويب',
'web-form' => 'نموذج ويب',
],
'type' => [
'existing-business' => 'عمل موجود',
'new-business' => 'عمل جديد',
],
],
'user' => [
'role' => [
'administrator-role' => 'دور المسؤول',
'administrator' => 'مسؤول',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'رسائل بريد إلكتروني للمشاركين بعد تحديث النشاط',
'email-to-participants-after-activity-creation' => 'رسائل بريد إلكتروني للمشاركين بعد إنشاء النشاط',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'مدير',
'krayin' => 'Krayin',
'confirm-password' => 'تأكيد كلمة المرور',
'email' => 'البريد الإلكتروني',
'email-address' => 'admin@example.com',
'password' => 'كلمة المرور',
'title' => 'إنشاء المسؤول',
],
'environment-configuration' => [
'algerian-dinar' => 'الدينار الجزائري (DZD)',
'allowed-currencies' => 'العملات المسموح بها',
'allowed-locales' => 'اللغات المسموح بها',
'application-name' => 'اسم التطبيق',
'argentine-peso' => 'البيزو الأرجنتيني (ARS)',
'australian-dollar' => 'الدولار الأسترالي (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'التاكا البنغلاديشي (BDT)',
'brazilian-real' => 'الريال البرازيلي (BRL)',
'british-pound-sterling' => 'الجنيه الإسترليني البريطاني (GBP)',
'canadian-dollar' => 'الدولار الكندي (CAD)',
'cfa-franc-bceao' => 'فرنك CFA BCEAO (XOF)',
'cfa-franc-beac' => 'فرنك CFA BEAC (XAF)',
'chilean-peso' => 'البيزو التشيلي (CLP)',
'chinese-yuan' => 'اليوان الصيني (CNY)',
'colombian-peso' => 'البيزو الكولومبي (COP)',
'czech-koruna' => 'الكرونة التشيكية (CZK)',
'danish-krone' => 'الكرونة الدنماركية (DKK)',
'database-connection' => 'اتصال قاعدة البيانات',
'database-hostname' => 'اسم مضيف قاعدة البيانات',
'database-name' => 'اسم قاعدة البيانات',
'database-password' => 'كلمة مرور قاعدة البيانات',
'database-port' => 'منفذ قاعدة البيانات',
'database-prefix' => 'بادئة قاعدة البيانات',
'database-username' => 'اسم مستخدم قاعدة البيانات',
'default-currency' => 'العملة الافتراضية',
'default-locale' => 'اللغة الافتراضية',
'default-timezone' => 'المنطقة الزمنية الافتراضية',
'default-url' => 'الرابط الافتراضي',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'الجنيه المصري (EGP)',
'euro' => 'اليورو (EUR)',
'fijian-dollar' => 'الدولار الفيجي (FJD)',
'hong-kong-dollar' => 'الدولار الهونغ كونغي (HKD)',
'hungarian-forint' => 'الفورنت الهنغاري (HUF)',
'indian-rupee' => 'الروبية الهندية (INR)',
'indonesian-rupiah' => 'الروبية الإندونيسية (IDR)',
'israeli-new-shekel' => 'الشيكل الإسرائيلي الجديد (ILS)',
'japanese-yen' => 'الين الياباني (JPY)',
'jordanian-dinar' => 'الدينار الأردني (JOD)',
'kazakhstani-tenge' => 'التينغ الكازاخستاني (KZT)',
'kuwaiti-dinar' => 'الدينار الكويتي (KWD)',
'lebanese-pound' => 'الجنيه اللبناني (LBP)',
'libyan-dinar' => 'الدينار الليبي (LYD)',
'malaysian-ringgit' => 'الرينغيت الماليزي (MYR)',
'mauritian-rupee' => 'الروبية الموريشية (MUR)',
'mexican-peso' => 'البيزو المكسيكي (MXN)',
'moroccan-dirham' => 'الدرهم المغربي (MAD)',
'mysql' => 'MySQL',
'nepalese-rupee' => 'الروبية النيبالية (NPR)',
'new-taiwan-dollar' => 'الدولار التايواني الجديد (TWD)',
'new-zealand-dollar' => 'الدولار النيوزيلندي (NZD)',
'nigerian-naira' => 'النايرا النيجيري (NGN)',
'norwegian-krone' => 'الكرونة النرويجية (NOK)',
'omani-rial' => 'الريال العماني (OMR)',
'pakistani-rupee' => 'الروبية الباكستانية (PKR)',
'panamanian-balboa' => 'البالبوا البنمي (PAB)',
'paraguayan-guarani' => 'الغواراني الباراغواي (PYG)',
'peruvian-nuevo-sol' => 'السول البيروفي الجديد (PEN)',
'pgsql' => 'PgSQL',
'philippine-peso' => 'البيزو الفلبيني (PHP)',
'polish-zloty' => 'الزلوتي البولندي (PLN)',
'qatari-rial' => 'الريال القطري (QAR)',
'romanian-leu' => 'الليو الروماني (RON)',
'russian-ruble' => 'الروبل الروسي (RUB)',
'saudi-riyal' => 'الريال السعودي (SAR)',
'select-timezone' => 'اختر المنطقة الزمنية',
'singapore-dollar' => 'الدولار السنغافوري (SGD)',
'south-african-rand' => 'الراند الجنوب أفريقي (ZAR)',
'south-korean-won' => 'الوون الكوري الجنوبي (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'الروبية السريلانكية (LKR)',
'swedish-krona' => 'الكرونا السويدية (SEK)',
'swiss-franc' => 'الفرنك السويسري (CHF)',
'thai-baht' => 'الباهت التايلاندي (THB)',
'title' => 'إعدادات المتجر',
'tunisian-dinar' => 'الدينار التونسي (TND)',
'turkish-lira' => 'الليرة التركية (TRY)',
'ukrainian-hryvnia' => 'الهريفنيا الأوكرانية (UAH)',
'united-arab-emirates-dirham' => 'الدرهم الإماراتي (AED)',
'united-states-dollar' => 'الدولار الأمريكي (USD)',
'uzbekistani-som' => 'السوم الأوزبكستاني (UZS)',
'venezuelan-bolívar' => 'البوليفار الفنزويلي (VEF)',
'vietnamese-dong' => 'الدونج الفيتنامي (VND)',
'warning-message' => 'احذر! إعدادات لغة النظام الافتراضية والعملات الافتراضية دائمة ولا يمكن تغييرها بمجرد تعيينها.',
'zambian-kwacha' => 'الكواشا الزامبي (ZMW)',
],
'installation-processing' => [
'krayin' => 'تثبيت Krayin',
'krayin-info' => 'إنشاء جداول قاعدة البيانات، وقد يستغرق ذلك بضع دقائق',
'title' => 'التثبيت',
],
'installation-completed' => [
'admin-panel' => 'لوحة المشرف',
'krayin-forums' => 'منتديات Krayin',
'customer-panel' => 'لوحة العميل',
'explore-krayin-extensions' => 'استكشاف امتدادات Krayin',
'title' => 'اكتمال التثبيت',
'title-info' => 'تم تثبيت Krayin بنجاح على نظامك.',
],
'ready-for-installation' => [
'create-databsae-table' => 'إنشاء جدول قاعدة البيانات',
'install' => 'التثبيت',
'install-info' => 'Krayin للتثبيت',
'install-info-button' => 'انقر على الزر أدناه ل',
'populate-database-table' => 'ملء جداول قاعدة البيانات',
'start-installation' => 'بدء التثبيت',
'title' => 'جاهز للتثبيت',
],
'start' => [
'locale' => 'اللغة',
'main' => 'بداية',
'select-locale' => 'اختر اللغة',
'title' => 'تثبيت Krayin الخاص بك',
'welcome-title' => 'مرحبًا بك في Krayin',
],
'server-requirements' => [
'calendar' => 'التقويم',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'dom',
'fileinfo' => 'معلومات الملف',
'filter' => 'المرشح',
'gd' => 'GD',
'hash' => 'التجزئة',
'intl' => 'intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 أو أعلى',
'session' => 'الجلسة',
'title' => 'متطلبات الخادم',
'tokenizer' => 'tokenizer',
'xml' => 'XML',
],
'back' => 'رجوع',
'krayin' => 'Krayin',
'krayin-info' => 'مشروع مجتمعي من قبل',
'krayin-logo' => 'شعار Krayin',
'continue' => 'متابعة',
'installation-description' => 'عادة ما تتضمن عملية تثبيت Krayin عدة خطوات. إليك نظرة عامة عامة على عملية التثبيت krayin',
'installation-info' => 'نحن سعداء برؤيتك هنا!',
'installation-title' => 'مرحبًا بك في التثبيت',
'installation-wizard' => 'لغة معالج التثبيت',
'title' => 'مثبت Krayin',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'Description',
'expected-close-date' => 'Expected Close Date',
'lead-value' => 'Lead Value',
'sales-owner' => 'Sales Owner',
'source' => 'Source',
'title' => 'Title',
'type' => 'Type',
'pipeline' => 'Pipeline',
'stage' => 'Stage',
],
'persons' => [
'contact-numbers' => 'Contact Numbers',
'emails' => 'Emails',
'job-title' => 'Job Title',
'name' => 'Name',
'organization' => 'Organization',
'sales-owner' => 'Sales Owner',
],
'organizations' => [
'address' => 'Address',
'name' => 'Name',
'sales-owner' => 'Sales Owner',
],
'products' => [
'description' => 'Description',
'name' => 'Name',
'price' => 'Price',
'quantity' => 'Quantity',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'Adjustment Amount',
'billing-address' => 'Billing Address',
'description' => 'Description',
'discount-amount' => 'Discount Amount',
'discount-percent' => 'Discount Percent',
'expired-at' => 'Expired At',
'grand-total' => 'Grand Total',
'person' => 'Person',
'sales-owner' => 'Sales Owner',
'shipping-address' => 'Shipping Address',
'sub-total' => 'Sub Total',
'subject' => 'Subject',
'tax-amount' => 'Tax Amount',
],
'warehouses' => [
'contact-address' => 'Contact Address',
'contact-emails' => 'Contact Emails',
'contact-name' => 'Contact Name',
'contact-numbers' => 'Contact Numbers',
'description' => 'Description',
'name' => 'Name',
],
],
'email' => [
'activity-created' => 'Activity created',
'activity-modified' => 'Activity modified',
'date' => 'Date',
'new-activity' => 'You have a new activity, please find the details bellow',
'new-activity-modified' => 'You have a new activity modified, please find the details bellow',
'participants' => 'Participants',
'title' => 'Title',
'type' => 'Type',
],
'lead' => [
'pipeline' => [
'default' => 'Default Pipeline',
'pipeline-stages' => [
'follow-up' => 'Follow Up',
'lost' => 'Lost',
'negotiation' => 'Negotiation',
'new' => 'New',
'prospect' => 'Prospect',
'won' => 'Won',
],
],
'source' => [
'direct' => 'Direct',
'email' => 'Email',
'phone' => 'Phone',
'web' => 'Web',
'web-form' => 'Web Form',
],
'type' => [
'existing-business' => 'Existing Business',
'new-business' => 'New Business',
],
],
'user' => [
'role' => [
'administrator-role' => 'Administrator Role',
'administrator' => 'Administrator',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'Emails to participants after activity updation',
'email-to-participants-after-activity-creation' => 'Emails to participants after activity creation',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'Admin',
'krayin' => 'Krayin',
'confirm-password' => 'Confirm Password',
'email' => 'Email',
'email-address' => 'admin@example.com',
'password' => 'Password',
'title' => 'Create Administrator',
],
'environment-configuration' => [
'algerian-dinar' => 'Algerian Dinar (DZD)',
'allowed-currencies' => 'Allowed Currencies',
'allowed-locales' => 'Allowed Locales',
'application-name' => 'Application Name',
'argentine-peso' => 'Argentine Peso (ARS)',
'australian-dollar' => 'Australian Dollar (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'Bangladeshi Taka (BDT)',
'brazilian-real' => 'Brazilian Real (BRL)',
'british-pound-sterling' => 'British Pound Sterling (GBP)',
'canadian-dollar' => 'Canadian Dollar (CAD)',
'cfa-franc-bceao' => 'CFA Franc BCEAO (XOF)',
'cfa-franc-beac' => 'CFA Franc BEAC (XAF)',
'chilean-peso' => 'Chilean Peso (CLP)',
'chinese-yuan' => 'Chinese Yuan (CNY)',
'colombian-peso' => 'Colombian Peso (COP)',
'czech-koruna' => 'Czech Koruna (CZK)',
'danish-krone' => 'Danish Krone (DKK)',
'database-connection' => 'Database Connection',
'database-hostname' => 'Database Hostname',
'database-name' => 'Database Name',
'database-password' => 'Database Password',
'database-port' => 'Database Port',
'database-prefix' => 'Database Prefix',
'database-username' => 'Database Username',
'default-currency' => 'Default Currency',
'default-locale' => 'Default Locale',
'default-timezone' => 'Default Timezone',
'default-url' => 'Default URL',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'Egyptian Pound (EGP)',
'euro' => 'Euro (EUR)',
'fijian-dollar' => 'Fijian Dollar (FJD)',
'hong-kong-dollar' => 'Hong Kong Dollar (HKD)',
'hungarian-forint' => 'Hungarian Forint (HUF)',
'indian-rupee' => 'Indian Rupee (INR)',
'indonesian-rupiah' => 'Indonesian Rupiah (IDR)',
'israeli-new-shekel' => 'Israeli New Shekel (ILS)',
'japanese-yen' => 'Japanese Yen (JPY)',
'jordanian-dinar' => 'Jordanian Dinar (JOD)',
'kazakhstani-tenge' => 'Kazakhstani Tenge (KZT)',
'kuwaiti-dinar' => 'Kuwaiti Dinar (KWD)',
'lebanese-pound' => 'Lebanese Pound (LBP)',
'libyan-dinar' => 'Libyan Dinar (LYD)',
'malaysian-ringgit' => 'Malaysian Ringgit (MYR)',
'mauritian-rupee' => 'Mauritian Rupee (MUR)',
'mexican-peso' => 'Mexican Peso (MXN)',
'moroccan-dirham' => 'Moroccan Dirham (MAD)',
'mysql' => 'Mysql',
'nepalese-rupee' => 'Nepalese Rupee (NPR)',
'new-taiwan-dollar' => 'New Taiwan Dollar (TWD)',
'new-zealand-dollar' => 'New Zealand Dollar (NZD)',
'nigerian-naira' => 'Nigerian Naira (NGN)',
'norwegian-krone' => 'Norwegian Krone (NOK)',
'omani-rial' => 'Omani Rial (OMR)',
'pakistani-rupee' => 'Pakistani Rupee (PKR)',
'panamanian-balboa' => 'Panamanian Balboa (PAB)',
'paraguayan-guarani' => 'Paraguayan Guarani (PYG)',
'peruvian-nuevo-sol' => 'Peruvian Nuevo Sol (PEN)',
'pgsql' => 'pgSQL',
'philippine-peso' => 'Philippine Peso (PHP)',
'polish-zloty' => 'Polish Zloty (PLN)',
'qatari-rial' => 'Qatari Rial (QAR)',
'romanian-leu' => 'Romanian Leu (RON)',
'russian-ruble' => 'Russian Ruble (RUB)',
'saudi-riyal' => 'Saudi Riyal (SAR)',
'select-timezone' => 'Select Timezone',
'singapore-dollar' => 'Singapore Dollar (SGD)',
'south-african-rand' => 'South African Rand (ZAR)',
'south-korean-won' => 'South Korean Won (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'Sri Lankan Rupee (LKR)',
'swedish-krona' => 'Swedish Krona (SEK)',
'swiss-franc' => 'Swiss Franc (CHF)',
'thai-baht' => 'Thai Baht (THB)',
'title' => 'Store Configuration',
'tunisian-dinar' => 'Tunisian Dinar (TND)',
'turkish-lira' => 'Turkish Lira (TRY)',
'ukrainian-hryvnia' => 'Ukrainian Hryvnia (UAH)',
'united-arab-emirates-dirham' => 'United Arab Emirates Dirham (AED)',
'united-states-dollar' => 'United States Dollar (USD)',
'uzbekistani-som' => 'Uzbekistani Som (UZS)',
'venezuelan-bolívar' => 'Venezuelan Bolívar (VEF)',
'vietnamese-dong' => 'Vietnamese Dong (VND)',
'warning-message' => 'Beware! The settings for your default system language and default currency are permanent and cannot be changed once set.',
'zambian-kwacha' => 'Zambian Kwacha (ZMW)',
],
'installation-processing' => [
'krayin' => 'Installation Krayin',
'krayin-info' => 'Creating the database tables, this can take a few moments',
'title' => 'Installation',
],
'installation-completed' => [
'admin-panel' => 'Admin Panel',
'krayin-forums' => 'Krayin Forum',
'customer-panel' => 'Customer Panel',
'explore-krayin-extensions' => 'Explore Krayin Extension',
'title' => 'Installation Completed',
'title-info' => 'Krayin is Successfully installed on your system.',
],
'ready-for-installation' => [
'create-databsae-table' => 'Create the database table',
'install' => 'Installation',
'install-info' => 'Krayin For Installation',
'install-info-button' => 'Click the button below to',
'populate-database-table' => 'Populate the database tables',
'start-installation' => 'Start Installation',
'title' => 'Ready for Installation',
],
'start' => [
'locale' => 'Locale',
'main' => 'Start',
'select-locale' => 'Select Locale',
'title' => 'Your Krayin install',
'welcome-title' => 'Welcome to Krayin',
],
'server-requirements' => [
'calendar' => 'Calendar',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'dom',
'fileinfo' => 'fileInfo',
'filter' => 'Filter',
'gd' => 'GD',
'hash' => 'Hash',
'intl' => 'intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 or higher',
'session' => 'session',
'title' => 'System Requirements',
'tokenizer' => 'tokenizer',
'xml' => 'XML',
],
'back' => 'Back',
'krayin' => 'Krayin',
'krayin-info' => 'a Community Project by',
'krayin-logo' => 'Krayin Logo',
'continue' => 'Continue',
'installation-description' => 'Krayin installation typically involves several steps. Here\'s a general outline of the installation process for Krayin',
'installation-info' => 'We are happy to see you here!',
'installation-title' => 'Welcome to Installation',
'installation-wizard' => 'Installation Wizard language',
'title' => 'Krayin Installer',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'Descripción',
'expected-close-date' => 'Fecha de Cierre Esperada',
'lead-value' => 'Valor del Prospecto',
'sales-owner' => 'Propietario de Ventas',
'source' => 'Fuente',
'title' => 'Título',
'type' => 'Tipo',
'pipeline' => 'Pipeline',
'stage' => 'Etapa',
],
'persons' => [
'contact-numbers' => 'Números de Contacto',
'emails' => 'Correos Electrónicos',
'job-title' => 'Cargo',
'name' => 'Nombre',
'organization' => 'Organización',
'sales-owner' => 'Propietario de Ventas',
],
'organizations' => [
'address' => 'Dirección',
'name' => 'Nombre',
'sales-owner' => 'Propietario de Ventas',
],
'products' => [
'description' => 'Descripción',
'name' => 'Nombre',
'price' => 'Precio',
'quantity' => 'Cantidad',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'Cantidad de Ajuste',
'billing-address' => 'Dirección de Facturación',
'description' => 'Descripción',
'discount-amount' => 'Cantidad de Descuento',
'discount-percent' => 'Porcentaje de Descuento',
'expired-at' => 'Expira el',
'grand-total' => 'Total General',
'person' => 'Persona',
'sales-owner' => 'Propietario de Ventas',
'shipping-address' => 'Dirección de Envío',
'sub-total' => 'Subtotal',
'subject' => 'Asunto',
'tax-amount' => 'Cantidad de Impuestos',
],
'warehouses' => [
'contact-address' => 'Dirección de Contacto',
'contact-emails' => 'Correos Electrónicos de Contacto',
'contact-name' => 'Nombre de Contacto',
'contact-numbers' => 'Números de Contacto',
'description' => 'Descripción',
'name' => 'Nombre',
],
],
'email' => [
'activity-created' => 'Actividad Creada',
'activity-modified' => 'Actividad Modificada',
'date' => 'Fecha',
'new-activity' => 'Tienes una nueva actividad, encuentra los detalles a continuación',
'new-activity-modified' => 'Tienes una actividad modificada, encuentra los detalles a continuación',
'participants' => 'Participantes',
'title' => 'Título',
'type' => 'Tipo',
],
'lead' => [
'pipeline' => [
'default' => 'Pipeline Predeterminado',
'pipeline-stages' => [
'follow-up' => 'Seguimiento',
'lost' => 'Perdido',
'negotiation' => 'Negociación',
'new' => 'Nuevo',
'prospect' => 'Prospecto',
'won' => 'Ganado',
],
],
'source' => [
'direct' => 'Directo',
'email' => 'Correo Electrónico',
'phone' => 'Teléfono',
'web' => 'Web',
'web-form' => 'Formulario Web',
],
'type' => [
'existing-business' => 'Negocio Existente',
'new-business' => 'Nuevo Negocio',
],
],
'user' => [
'role' => [
'administrator-role' => 'Rol de Administrador',
'administrator' => 'Administrador',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'Correos electrónicos a los participantes tras la actualización de actividades',
'email-to-participants-after-activity-creation' => 'Correos electrónicos a los participantes tras la creación de actividades',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'Admin',
'krayin' => 'Krayin',
'confirm-password' => 'Confirmar Contraseña',
'email' => 'Correo Electrónico',
'email-address' => 'admin@example.com',
'password' => 'Contraseña',
'title' => 'Crear Administrador',
],
'environment-configuration' => [
'algerian-dinar' => 'Dinar Argelino (DZD)',
'allowed-currencies' => 'Monedas Permitidas',
'allowed-locales' => 'Idiomas Permitidos',
'application-name' => 'Nombre de la Aplicación',
'argentine-peso' => 'Peso Argentino (ARS)',
'australian-dollar' => 'Dólar Australiano (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'Taka Bangladesí (BDT)',
'brazilian-real' => 'Real Brasileño (BRL)',
'british-pound-sterling' => 'Libra Esterlina (GBP)',
'canadian-dollar' => 'Dólar Canadiense (CAD)',
'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',
'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',
'chilean-peso' => 'Peso Chileno (CLP)',
'chinese-yuan' => 'Yuan Chino (CNY)',
'colombian-peso' => 'Peso Colombiano (COP)',
'czech-koruna' => 'Corona Checa (CZK)',
'danish-krone' => 'Corona Danesa (DKK)',
'database-connection' => 'Conexión de Base de Datos',
'database-hostname' => 'Nombre del Host de la Base de Datos',
'database-name' => 'Nombre de la Base de Datos',
'database-password' => 'Contraseña de la Base de Datos',
'database-port' => 'Puerto de la Base de Datos',
'database-prefix' => 'Prefijo de la Base de Datos',
'database-username' => 'Usuario de la Base de Datos',
'default-currency' => 'Moneda Predeterminada',
'default-locale' => 'Idioma Predeterminado',
'default-timezone' => 'Zona Horaria Predeterminada',
'default-url' => 'URL Predeterminada',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'Libra Egipcia (EGP)',
'euro' => 'Euro (EUR)',
'fijian-dollar' => 'Dólar Fiyiano (FJD)',
'hong-kong-dollar' => 'Dólar de Hong Kong (HKD)',
'hungarian-forint' => 'Forinto Húngaro (HUF)',
'indian-rupee' => 'Rupia India (INR)',
'indonesian-rupiah' => 'Rupia Indonesia (IDR)',
'israeli-new-shekel' => 'Nuevo Shekel Israelí (ILS)',
'japanese-yen' => 'Yen Japonés (JPY)',
'jordanian-dinar' => 'Dinar Jordano (JOD)',
'kazakhstani-tenge' => 'Tenge Kazajo (KZT)',
'kuwaiti-dinar' => 'Dinar Kuwaití (KWD)',
'lebanese-pound' => 'Libra Libanesa (LBP)',
'libyan-dinar' => 'Dinar Libio (LYD)',
'malaysian-ringgit' => 'Ringgit Malayo (MYR)',
'mauritian-rupee' => 'Rupia de Mauricio (MUR)',
'mexican-peso' => 'Peso Mexicano (MXN)',
'moroccan-dirham' => 'Dirham Marroquí (MAD)',
'mysql' => 'Mysql',
'nepalese-rupee' => 'Rupia Nepalesa (NPR)',
'new-taiwan-dollar' => 'Nuevo Dólar Taiwanés (TWD)',
'new-zealand-dollar' => 'Dólar Neozelandés (NZD)',
'nigerian-naira' => 'Naira Nigeriana (NGN)',
'norwegian-krone' => 'Corona Noruega (NOK)',
'omani-rial' => 'Rial Omaní (OMR)',
'pakistani-rupee' => 'Rupia Paquistaní (PKR)',
'panamanian-balboa' => 'Balboa Panameño (PAB)',
'paraguayan-guarani' => 'Guaraní Paraguayo (PYG)',
'peruvian-nuevo-sol' => 'Nuevo Sol Peruano (PEN)',
'pgsql' => 'pgSQL',
'philippine-peso' => 'Peso Filipino (PHP)',
'polish-zloty' => 'Zloty Polaco (PLN)',
'qatari-rial' => 'Rial Catarí (QAR)',
'romanian-leu' => 'Leu Rumano (RON)',
'russian-ruble' => 'Rublo Ruso (RUB)',
'saudi-riyal' => 'Riyal Saudí (SAR)',
'select-timezone' => 'Seleccionar Zona Horaria',
'singapore-dollar' => 'Dólar de Singapur (SGD)',
'south-african-rand' => 'Rand Sudafricano (ZAR)',
'south-korean-won' => 'Won Surcoreano (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'Rupia de Sri Lanka (LKR)',
'swedish-krona' => 'Corona Sueca (SEK)',
'swiss-franc' => 'Franco Suizo (CHF)',
'thai-baht' => 'Baht Tailandés (THB)',
'title' => 'Configuración de la Tienda',
'tunisian-dinar' => 'Dinar Tunecino (TND)',
'turkish-lira' => 'Lira Turca (TRY)',
'ukrainian-hryvnia' => 'Grivna Ucraniana (UAH)',
'united-arab-emirates-dirham' => 'Dírham de los Emiratos Árabes Unidos (AED)',
'united-states-dollar' => 'Dólar Estadounidense (USD)',
'uzbekistani-som' => 'Som Uzbeko (UZS)',
'venezuelan-bolívar' => 'Bolívar Venezolano (VEF)',
'vietnamese-dong' => 'Dong Vietnamita (VND)',
'warning-message' => '¡Atención! Los ajustes de idioma y moneda predeterminados son permanentes y no se pueden cambiar una vez configurados.',
'zambian-kwacha' => 'Kwacha de Zambia (ZMW)',
],
'installation-processing' => [
'krayin' => 'Instalación de Krayin',
'krayin-info' => 'Creando las tablas de la base de datos, esto puede tardar unos momentos',
'title' => 'Instalación',
],
'installation-completed' => [
'admin-panel' => 'Panel de Administración',
'krayin-forums' => 'Foro de Krayin',
'customer-panel' => 'Panel de Clientes',
'explore-krayin-extensions' => 'Explorar Extensiones de Krayin',
'title' => 'Instalación Completada',
'title-info' => 'Krayin se ha instalado correctamente en su sistema.',
],
'ready-for-installation' => [
'create-databsae-table' => 'Crear tabla de base de datos',
'install' => 'Instalación',
'install-info' => 'Krayin Para la Instalación',
'install-info-button' => 'Haga clic en el botón a continuación para',
'populate-database-table' => 'Rellenar las tablas de la base de datos',
'start-installation' => 'Iniciar Instalación',
'title' => 'Listo para la Instalación',
],
'start' => [
'locale' => 'Idioma',
'main' => 'Iniciar',
'select-locale' => 'Seleccionar Idioma',
'title' => 'Instalación de Krayin',
'welcome-title' => 'Bienvenido a Krayin',
],
'server-requirements' => [
'calendar' => 'Calendario',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'dom',
'fileinfo' => 'fileInfo',
'filter' => 'Filtro',
'gd' => 'GD',
'hash' => 'Hash',
'intl' => 'intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 o superior',
'session' => 'sesión',
'title' => 'Requisitos del Sistema',
'tokenizer' => 'tokenizador',
'xml' => 'XML',
],
'back' => 'Atrás',
'krayin' => 'Krayin',
'krayin-info' => 'un Proyecto Comunitario de',
'krayin-logo' => 'Logotipo de Krayin',
'continue' => 'Continuar',
'installation-description' => 'La instalación de Krayin generalmente implica varios pasos. Aquí hay un esquema general del proceso de instalación de Krayin.',
'installation-info' => '¡Estamos encantados de verte aquí!',
'installation-title' => 'Bienvenido a la Instalación',
'asistente-de-instalación' => 'Idioma del Asistente de Instalación',
'title' => 'Instalador de Krayin',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'توضیحات',
'expected-close-date' => 'تاریخ بسته شدن مورد انتظار',
'lead-value' => 'ارزش سرنخ',
'sales-owner' => 'مالک فروش',
'source' => 'منبع',
'title' => 'عنوان',
'type' => 'نوع',
'pipeline' => 'پایپ لاین',
'stage' => 'مرحله',
],
'persons' => [
'contact-numbers' => 'شماره‌های تماس',
'emails' => 'ایمیل‌ها',
'job-title' => 'عنوان شغلی',
'name' => 'نام',
'organization' => 'سازمان',
'sales-owner' => 'مالک فروش',
],
'organizations' => [
'address' => 'آدرس',
'name' => 'نام',
'sales-owner' => 'مالک فروش',
],
'products' => [
'description' => 'توضیحات',
'name' => 'نام',
'price' => 'قیمت',
'quantity' => 'کمیت',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'مقدار تنظیم',
'billing-address' => 'آدرس صورت‌حساب',
'description' => 'توضیحات',
'discount-amount' => 'مقدار تخفیف',
'discount-percent' => 'درصد تخفیف',
'expired-at' => 'منقضی شده در',
'grand-total' => 'مجموع کل',
'person' => 'شخص',
'sales-owner' => 'مالک فروش',
'shipping-address' => 'آدرس ارسال',
'sub-total' => 'جمع جزئی',
'subject' => 'موضوع',
'tax-amount' => 'مقدار مالیات',
],
'warehouses' => [
'contact-address' => 'آدرس تماس',
'contact-emails' => 'ایمیل‌های تماس',
'contact-name' => 'نام تماس',
'contact-numbers' => 'شماره‌های تماس',
'description' => 'توضیحات',
'name' => 'نام',
],
],
'email' => [
'activity-created' => 'فعالیت ایجاد شد',
'activity-modified' => 'فعالیت ویرایش شد',
'date' => 'تاریخ',
'new-activity' => 'شما یک فعالیت جدید دارید، لطفاً جزئیات را در زیر پیدا کنید',
'new-activity-modified' => 'شما یک فعالیت جدید ویرایش شده دارید، لطفاً جزئیات را در زیر پیدا کنید',
'participants' => 'شرکت‌کنندگان',
'title' => 'عنوان',
'type' => 'نوع',
],
'lead' => [
'pipeline' => [
'default' => 'پایپ لاین پیش‌فرض',
'pipeline-stages' => [
'follow-up' => 'پیگیری',
'lost' => 'گم‌شده',
'negotiation' => 'مذاکره',
'new' => 'جدید',
'prospect' => 'مشتری بالقوه',
'won' => 'برد',
],
],
'source' => [
'direct' => 'مستقیم',
'email' => 'ایمیل',
'phone' => 'تلفن',
'web' => 'وب',
'web-form' => 'فرم وب',
],
'type' => [
'existing-business' => 'کسب و کار موجود',
'new-business' => 'کسب و کار جدید',
],
],
'user' => [
'role' => [
'administrator-role' => 'نقش مدیر',
'administrator' => 'مدیر',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'ایمیل‌ها به شرکت‌کنندگان پس از به‌روزرسانی فعالیت',
'email-to-participants-after-activity-creation' => 'ایمیل‌ها به شرکت‌کنندگان پس از ایجاد فعالیت',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'مدیر',
'krayin' => 'کرایین',
'confirm-password' => 'تایید رمز عبور',
'email' => 'ایمیل',
'email-address' => 'admin@example.com',
'password' => 'رمز عبور',
'title' => 'ایجاد مدیر',
],
'environment-configuration' => [
'algerian-dinar' => 'دینار الجزایر (DZD)',
'allowed-currencies' => 'ارزهای مجاز',
'allowed-locales' => 'زبان‌های مجاز',
'application-name' => 'نام برنامه',
'argentine-peso' => 'پزو آرژانتین (ARS)',
'australian-dollar' => 'دلار استرالیا (AUD)',
'krayin' => 'کرایین',
'bangladeshi-taka' => 'تاکا بنگلادش (BDT)',
'brazilian-real' => 'رئال برزیل (BRL)',
'british-pound-sterling' => 'پوند استرلینگ بریتانیا (GBP)',
'canadian-dollar' => 'دلار کانادا (CAD)',
'cfa-franc-bceao' => 'فرانک CFA BCEAO (XOF)',
'cfa-franc-beac' => 'فرانک CFA BEAC (XAF)',
'chilean-peso' => 'پزو شیلی (CLP)',
'chinese-yuan' => 'یوان چین (CNY)',
'colombian-peso' => 'پزو کلمبیا (COP)',
'czech-koruna' => 'کرونا چک (CZK)',
'danish-krone' => 'کرون دانمارک (DKK)',
'database-connection' => 'اتصال پایگاه داده',
'database-hostname' => 'نام میزبان پایگاه داده',
'database-name' => 'نام پایگاه داده',
'database-password' => 'رمز عبور پایگاه داده',
'database-port' => 'پورت پایگاه داده',
'database-prefix' => 'پیشوند پایگاه داده',
'database-username' => 'نام کاربری پایگاه داده',
'default-currency' => 'ارز پیش‌فرض',
'default-locale' => 'زبان پیش‌فرض',
'default-timezone' => 'منطقه زمانی پیش‌فرض',
'default-url' => 'آدرس URL پیش‌فرض',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'پوند مصر (EGP)',
'euro' => 'یورو (EUR)',
'fijian-dollar' => 'دلار فیجی (FJD)',
'hong-kong-dollar' => 'دلار هنگ کنگ (HKD)',
'hungarian-forint' => 'فورینت مجارستان (HUF)',
'indian-rupee' => 'روپیه هند (INR)',
'indonesian-rupiah' => 'روپیه اندونزی (IDR)',
'israeli-new-shekel' => 'شکل جدید اسرائیل (ILS)',
'japanese-yen' => 'ین ژاپن (JPY)',
'jordanian-dinar' => 'دینار اردن (JOD)',
'kazakhstani-tenge' => 'تنگه قزاقستان (KZT)',
'kuwaiti-dinar' => 'دینار کویت (KWD)',
'lebanese-pound' => 'پوند لبنان (LBP)',
'libyan-dinar' => 'دینار لیبی (LYD)',
'malaysian-ringgit' => 'رینگیت مالزی (MYR)',
'mauritian-rupee' => 'روپیه موریس (MUR)',
'mexican-peso' => 'پزو مکزیک (MXN)',
'moroccan-dirham' => 'درهم مراکش (MAD)',
'mysql' => 'Mysql',
'nepalese-rupee' => 'روپیه نپال (NPR)',
'new-taiwan-dollar' => 'دلار جدید تایوان (TWD)',
'new-zealand-dollar' => 'دلار نیوزیلند (NZD)',
'nigerian-naira' => 'نایرا نیجریه (NGN)',
'norwegian-krone' => 'کرون نروژ (NOK)',
'omani-rial' => 'ریال عمان (OMR)',
'pakistani-rupee' => 'روپیه پاکستان (PKR)',
'panamanian-balboa' => 'بالبوآ پاناما (PAB)',
'paraguayan-guarani' => 'گوارانی پاراگوئه (PYG)',
'peruvian-nuevo-sol' => 'سول جدید پرو (PEN)',
'pgsql' => 'pgSQL',
'philippine-peso' => 'پزو فیلیپین (PHP)',
'polish-zloty' => 'زلوتی لهستان (PLN)',
'qatari-rial' => 'ریال قطر (QAR)',
'romanian-leu' => 'لئو رومانی (RON)',
'russian-ruble' => 'روبل روسیه (RUB)',
'saudi-riyal' => 'ریال عربستان (SAR)',
'select-timezone' => 'منطقه زمانی را انتخاب کنید',
'singapore-dollar' => 'دلار سنگاپور (SGD)',
'south-african-rand' => 'راند آفریقای جنوبی (ZAR)',
'south-korean-won' => 'وون کره جنوبی (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'روپیه سریلانکا (LKR)',
'swedish-krona' => 'کرون سوئد (SEK)',
'swiss-franc' => 'فرانک سوئیس (CHF)',
'thai-baht' => 'بات تایلند (THB)',
'title' => 'پیکربندی فروشگاه',
'tunisian-dinar' => 'دینار تونس (TND)',
'turkish-lira' => 'لیر ترکیه (TRY)',
'ukrainian-hryvnia' => 'هریونیا اوکراین (UAH)',
'united-arab-emirates-dirham' => 'درهم امارات متحده عربی (AED)',
'united-states-dollar' => 'دلار ایالات متحده (USD)',
'uzbekistani-som' => 'سوم ازبکستان (UZS)',
'venezuelan-bolívar' => 'بولیوار ونزوئلا (VEF)',
'vietnamese-dong' => 'دونگ ویتنام (VND)',
'warning-message' => 'هشدار! تنظیمات زبان پیش‌فرض سیستم و ارز پیش‌فرض دائمی هستند و پس از تنظیم قابل تغییر نیستند.',
'zambian-kwacha' => 'کواچای زامبیا (ZMW)',
],
'installation-processing' => [
'krayin' => 'نصب کرایین',
'krayin-info' => 'در حال ایجاد جداول پایگاه داده، این ممکن است چند لحظه طول بکشد',
'title' => 'نصب',
],
'installation-completed' => [
'admin-panel' => 'پنل مدیریت',
'krayin-forums' => 'انجمن کرایین',
'customer-panel' => 'پنل مشتری',
'explore-krayin-extensions' => 'کاوش افزونه‌های کرایین',
'title' => 'نصب کامل شد',
'title-info' => 'کرایین با موفقیت بر روی سیستم شما نصب شد.',
],
'ready-for-installation' => [
'create-databsae-table' => 'ایجاد جدول پایگاه داده',
'install' => 'نصب',
'install-info' => 'کرایین برای نصب',
'install-info-button' => 'برای شروع، دکمه زیر را کلیک کنید',
'populate-database-table' => 'پر کردن جداول پایگاه داده',
'start-installation' => 'شروع نصب',
'title' => 'آماده برای نصب',
],
'start' => [
'locale' => 'زبان',
'main' => 'شروع',
'select-locale' => 'انتخاب زبان',
'title' => 'نصب کرایین شما',
'welcome-title' => 'به کرایین خوش آمدید',
],
'server-requirements' => [
'calendar' => 'تقویم',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'dom',
'fileinfo' => 'fileInfo',
'filter' => 'فیلتر',
'gd' => 'GD',
'hash' => 'Hash',
'intl' => 'intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 یا بالاتر',
'session' => 'session',
'title' => 'نیازمندی‌های سیستم',
'tokenizer' => 'tokenizer',
'xml' => 'XML',
],
'back' => 'بازگشت',
'krayin' => 'کرایین',
'krayin-info' => 'یک پروژه اجتماعی توسط',
'krayin-logo' => 'لوگوی کرایین',
'continue' => 'ادامه',
'installation-description' => 'نصب کرایین معمولاً شامل چندین مرحله است. در اینجا یک طرح کلی از فرآیند نصب کرایین آمده است',
'installation-info' => 'خوشحالیم که شما را اینجا می‌بینیم!',
'installation-title' => 'به نصب خوش آمدید',
'installation-wizard' => 'زبان جادوگر نصب',
'title' => 'نصب‌کننده کرایین',
'webkul' => 'وبکول',
],
],
];

View File

@@ -0,0 +1,218 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'Descrição',
'expected-close-date' => 'Data de Fechamento Esperada',
'lead-value' => 'Valor da Oportunidade',
'sales-owner' => 'Responsável pela Venda',
'source' => 'Origem',
'title' => 'Título',
'type' => 'Tipo',
'pipeline' => 'Funil',
'stage' => 'Estágio',
],
'persons' => [
'contact-numbers' => 'Números de Contato',
'emails' => 'E-mails',
'job-title' => 'Cargo',
'name' => 'Nome',
'organization' => 'Empresa',
'sales-owner' => 'Responsável pela Venda',
],
'organizations' => [
'address' => 'Endereço',
'name' => 'Nome',
'sales-owner' => 'Responsável pela Venda',
],
'products' => [
'description' => 'Descrição',
'name' => 'Nome',
'price' => 'Preço',
'quantity' => 'Quantidade',
'sku' => 'Código',
],
'quotes' => [
'adjustment-amount' => 'Valor de Ajuste',
'billing-address' => 'Endereço de Cobrança',
'description' => 'Descrição',
'discount-amount' => 'Valor do Desconto',
'discount-percent' => 'Percentual de Desconto',
'expired-at' => 'Expira em',
'grand-total' => 'Total Geral',
'person' => 'Pessoa',
'sales-owner' => 'Responsável pela Venda',
'shipping-address' => 'Endereço de Entrega',
'sub-total' => 'Subtotal',
'subject' => 'Assunto',
'tax-amount' => 'Valor do Imposto',
],
'warehouses' => [
'contact-address' => 'Endereço de Contato',
'contact-emails' => 'Emails de Contato',
'contact-name' => 'Nome do Contato',
'contact-numbers' => 'Números de Contato',
'description' => 'Descrição',
'name' => 'Nome',
],
],
'email' => [
'activity-created' => 'Atividade Adicionada',
'activity-modified' => 'Atividade modificada',
'date' => 'Data',
'new-activity' => 'Você tem uma nova atividade, veja os detalhes abaixo',
'new-activity-modified' => 'Uma nova atividade foi modificada, veja os detalhes abaixo',
'participants' => 'Participantes',
'title' => 'Título',
'type' => 'Tipo',
],
'lead' => [
'pipeline' => [
'default' => 'Funil Padrão',
'pipeline-stages' => [
'follow-up' => 'Acompanhamento',
'lost' => 'Perdido',
'negotiation' => 'Negociação',
'new' => 'Novo',
'prospect' => 'Qualificado',
'won' => 'Ganho',
],
],
'source' => [
'direct' => 'Direto',
'email' => 'E-mail',
'phone' => 'Telefone',
'web' => 'Web',
'web-form' => 'Formulário Web',
],
'type' => [
'existing-business' => 'Negócio Existente',
'new-business' => 'Novo Negócio',
],
],
'user' => [
'role' => [
'administrator-role' => 'Função de Administrador',
'administrator' => 'Administrador',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'E-mails para participantes após atualização de atividade',
'email-to-participants-after-activity-creation' => 'E-mails para participantes após adicionar atividade',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'Administrador',
'krayin' => 'Krayin',
'confirm-password' => 'Confirmar Senha',
'email' => 'E-mail',
'email-address' => 'admin@example.com',
'password' => 'Senha',
'title' => 'Adicionar Administrador',
],
'environment-configuration' => [
'algerian-dinar' => 'Dinar Argelino (DZD)',
'allowed-currencies' => 'Moedas Permitidas',
'allowed-locales' => 'Idiomas Permitidos',
'application-name' => 'Nome do Aplicativo',
'argentine-peso' => 'Peso Argentino (ARS)',
'australian-dollar' => 'Dólar Australiano (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'Taka de Bangladesh (BDT)',
'brazilian-real' => 'Real Brasileiro (BRL)',
'british-pound-sterling' => 'Libra Esterlina (GBP)',
'canadian-dollar' => 'Dólar Canadense (CAD)',
'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',
'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',
'chilean-peso' => 'Peso Chileno (CLP)',
'chinese-yuan' => 'Yuan Chinês (CNY)',
'colombian-peso' => 'Peso Colombiano (COP)',
'czech-koruna' => 'Coroa Checa (CZK)',
'danish-krone' => 'Coroa Dinamarquesa (DKK)',
'database-connection' => 'Conexão com Banco de Dados',
'database-hostname' => 'Nome do Host do Banco de Dados',
'database-name' => 'Nome do Banco de Dados',
'database-password' => 'Senha do Banco de Dados',
'database-port' => 'Porta do Banco de Dados',
'database-prefix' => 'Prefixo do Banco de Dados',
'database-username' => 'Usuário do Banco de Dados',
'default-currency' => 'Moeda Padrão',
'default-locale' => 'Idioma Padrão',
'default-timezone' => 'Fuso Horário Padrão',
'default-url' => 'URL Padrão',
'default-url-link' => 'https://localhost',
'euro' => 'Euro (EUR)',
'mysql' => 'MySQL',
'pgsql' => 'pgSQL',
'select-timezone' => 'Selecionar Fuso Horário',
'warning-message' => 'Atenção! As configurações de idioma e moeda padrão não podem ser alteradas após definidas.',
'united-states-dollar' => 'Dólar Americano (USD)',
],
'installation-processing' => [
'krayin' => 'Instalação do Krayin',
'krayin-info' => 'Criando as tabelas do banco de dados, isso pode levar alguns momentos',
'title' => 'Instalação',
],
'installation-completed' => [
'admin-panel' => 'Painel de Administração',
'krayin-forums' => 'Fórum Krayin',
'customer-panel' => 'Painel do Cliente',
'explore-krayin-extensions' => 'Explorar Extensões Krayin',
'title' => 'Instalação Concluída',
'title-info' => 'Krayin foi instalado com sucesso no seu sistema.',
],
'ready-for-installation' => [
'create-databsae-table' => 'Adicionar tabela do banco de dados',
'install' => 'Instalação',
'start-installation' => 'Iniciar Instalação',
'title' => 'Pronto para Instalação',
],
'start' => [
'locale' => 'Idioma',
'main' => 'Início',
'select-locale' => 'Selecionar Idioma',
'title' => 'Instalação do Krayin',
'welcome-title' => 'Bem-vindo ao Krayin',
],
'server-requirements' => [
'php-version' => '8.1 ou superior',
'title' => 'Requisitos do Sistema',
],
'back' => 'Voltar',
'krayin' => 'Krayin',
'krayin-info' => 'um projeto comunitário de',
'krayin-logo' => 'Logotipo Krayin',
'continue' => 'Continuar',
'installation-description' => 'A instalação do Krayin geralmente envolve várias etapas. Aqui está uma visão geral do processo de instalação do Krayin',
'installation-info' => 'Estamos felizes em ver você aqui!',
'installation-title' => 'Bem-vindo à Instalação',
'installation-wizard' => 'Assistente de Instalação - Idioma',
'title' => 'Instalador do Krayin',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'Açıklama',
'expected-close-date' => 'Beklenen Kapanış Tarihi',
'lead-value' => 'Potansiyel Değeri',
'sales-owner' => 'Satış Sahibi',
'source' => 'Kaynak',
'title' => 'Başlık',
'type' => 'Tür',
'pipeline' => 'Pipeline',
'stage' => 'Aşama',
],
'persons' => [
'contact-numbers' => 'İletişim Numaraları',
'emails' => 'E-postalar',
'job-title' => 'Görev Unvanı',
'name' => 'Ad',
'organization' => 'Organizasyon',
'sales-owner' => 'Satış Sahibi',
],
'organizations' => [
'address' => 'Adres',
'name' => 'Ad',
'sales-owner' => 'Satış Sahibi',
],
'products' => [
'description' => 'Açıklama',
'name' => 'Ad',
'price' => 'Fiyat',
'quantity' => 'Miktar',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'Düzenleme Tutarı',
'billing-address' => 'Fatura Adresi',
'description' => 'Açıklama',
'discount-amount' => 'İndirim Tutarı',
'discount-percent' => 'İndirim Yüzdesi',
'expired-at' => 'Süresi Doldu',
'grand-total' => 'Genel Toplam',
'person' => 'Kişi',
'sales-owner' => 'Satış Sahibi',
'shipping-address' => 'Teslimat Adresi',
'sub-total' => 'Ara Toplam',
'subject' => 'Konu',
'tax-amount' => 'Vergi Tutarı',
],
'warehouses' => [
'contact-address' => 'İletişim Adresi',
'contact-emails' => 'İletişim E-postaları',
'contact-name' => 'İletişim Adı',
'contact-numbers' => 'İletişim Numaraları',
'description' => 'Açıklama',
'name' => 'Ad',
],
],
'email' => [
'activity-created' => 'Etkinlik oluşturuldu',
'activity-modified' => 'Etkinlik değiştirildi',
'date' => 'Tarih',
'new-activity' => 'Yeni bir etkinliğiniz var, lütfen aşağıdaki detayları bulun',
'new-activity-modified' => 'Yeni bir etkinlik değiştirildi, lütfen aşağıdaki detayları bulun',
'participants' => 'Katılımcılar',
'title' => 'Başlık',
'type' => 'Tür',
],
'lead' => [
'pipeline' => [
'default' => 'Varsayılan Pipeline',
'pipeline-stages' => [
'follow-up' => 'Takip',
'lost' => 'Kaybedildi',
'negotiation' => 'Müzakere',
'new' => 'Yeni',
'prospect' => 'Potansiyel',
'won' => 'Kazanıldı',
],
],
'source' => [
'direct' => 'Doğrudan',
'email' => 'E-posta',
'phone' => 'Telefon',
'web' => 'Web',
'web-form' => 'Web Formu',
],
'type' => [
'existing-business' => 'Mevcut İş',
'new-business' => 'Yeni İş',
],
],
'user' => [
'role' => [
'administrator-role' => 'Yönetici Rolü',
'administrator' => 'Yönetici',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'Etkinlik güncellemesinden sonra katılımcılara e-postalar',
'email-to-participants-after-activity-creation' => 'Etkinlik oluşturulduktan sonra katılımcılara e-postalar',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'Yönetici',
'krayin' => 'Krayin',
'confirm-password' => 'Şifreyi Onayla',
'email' => 'E-posta',
'email-address' => 'admin@ornek.com',
'password' => 'Şifre',
'title' => 'Yönetici Oluştur',
],
'environment-configuration' => [
'algerian-dinar' => 'Cezayir Dinarı (DZD)',
'allowed-currencies' => 'İzin Verilen Para Birimleri',
'allowed-locales' => 'İzin Verilen Lokaller',
'application-name' => 'Uygulama Adı',
'argentine-peso' => 'Arjantin Pezosu (ARS)',
'australian-dollar' => 'Avustralya Doları (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'Bangladeş Takası (BDT)',
'brazilian-real' => 'Brezilya Reali (BRL)',
'british-pound-sterling' => 'İngiliz Sterlini (GBP)',
'canadian-dollar' => 'Kanada Doları (CAD)',
'cfa-franc-bceao' => 'CFA Frank BCEAO (XOF)',
'cfa-franc-beac' => 'CFA Frank BEAC (XAF)',
'chilean-peso' => 'Şili Pesosu (CLP)',
'chinese-yuan' => 'Çin Yuanı (CNY)',
'colombian-peso' => 'Kolombiya Pesosu (COP)',
'czech-koruna' => 'Çek Korunası (CZK)',
'danish-krone' => 'Danimarka Kronu (DKK)',
'database-connection' => 'Veritabanı Bağlantısı',
'database-hostname' => 'Veritabanı Sunucu Adı',
'database-name' => 'Veritabanı Adı',
'database-password' => 'Veritabanı Parolası',
'database-port' => 'Veritabanı Bağlantı Noktası',
'database-prefix' => 'Veritabanı Öneki',
'database-username' => 'Veritabanı Kullanıcı Adı',
'default-currency' => 'Varsayılan Para Birimi',
'default-locale' => 'Varsayılan Lokal',
'default-timezone' => 'Varsayılan Zaman Dilimi',
'default-url' => 'Varsayılan URL',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'Mısır Lirası (EGP)',
'euro' => 'Euro (EUR)',
'fijian-dollar' => 'Fiji Doları (FJD)',
'hong-kong-dollar' => 'Hong Kong Doları (HKD)',
'hungarian-forint' => 'Macar Forinti (HUF)',
'indian-rupee' => 'Hint Rupisi (INR)',
'indonesian-rupiah' => 'Endonezya Rupisi (IDR)',
'israeli-new-shekel' => 'İsrail Yeni Şekeli (ILS)',
'japanese-yen' => 'Japon Yeni (JPY)',
'jordanian-dinar' => 'Ürdün Dinarı (JOD)',
'kazakhstani-tenge' => 'Kazakistan Tengesi (KZT)',
'kuwaiti-dinar' => 'Kuveyt Dinarı (KWD)',
'lebanese-pound' => 'Lübnan Lirası (LBP)',
'libyan-dinar' => 'Libya Dinarı (LYD)',
'malaysian-ringgit' => 'Malezya Ringiti (MYR)',
'mauritian-rupee' => 'Mauritius Rupisi (MUR)',
'mexican-peso' => 'Meksika Pesosu (MXN)',
'moroccan-dirham' => 'Fas Dirhemi (MAD)',
'mysql' => 'MySQL',
'nepalese-rupee' => 'Nepal Rupisi (NPR)',
'new-taiwan-dollar' => 'Yeni Tayvan Doları (TWD)',
'new-zealand-dollar' => 'Yeni Zelanda Doları (NZD)',
'nigerian-naira' => 'Nijerya Nairası (NGN)',
'norwegian-krone' => 'Norveç Kronu (NOK)',
'omani-rial' => 'Umman Riyali (OMR)',
'pakistani-rupee' => 'Pakistan Rupisi (PKR)',
'panamanian-balboa' => 'Panama Balboası (PAB)',
'paraguayan-guarani' => 'Paraguay Guaranisi (PYG)',
'peruvian-nuevo-sol' => 'Peru Nuevo Solu (PEN)',
'pgsql' => 'PgSQL',
'philippine-peso' => 'Filipinler Pesosu (PHP)',
'polish-zloty' => 'Polonya Zlotisi (PLN)',
'qatari-rial' => 'Katar Riyali (QAR)',
'romanian-leu' => 'Romanya Leyi (RON)',
'russian-ruble' => 'Rus Rublesi (RUB)',
'saudi-riyal' => 'Suudi Riyali (SAR)',
'select-timezone' => 'Zaman Dilimi Seç',
'singapore-dollar' => 'Singapur Doları (SGD)',
'south-african-rand' => 'Güney Afrika Randı (ZAR)',
'south-korean-won' => 'Güney Kore Wonu (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'Sri Lanka Rupisi (LKR)',
'swedish-krona' => 'İsveç Kronu (SEK)',
'swiss-franc' => 'İsviçre Frangı (CHF)',
'thai-baht' => 'Tayland Bahtı (THB)',
'title' => 'Mağaza Yapılandırması',
'tunisian-dinar' => 'Tunus Dinarı (TND)',
'turkish-lira' => 'Türk Lirası (TRY)',
'ukrainian-hryvnia' => 'Ukrayna Grivnası (UAH)',
'united-arab-emirates-dirham' => 'Birleşik Arap Emirlikleri Dirhemi (AED)',
'united-states-dollar' => 'Amerikan Doları (USD)',
'uzbekistani-som' => 'Özbekistan Somu (UZS)',
'venezuelan-bolívar' => 'Venezuela Bolivarı (VEF)',
'vietnamese-dong' => 'Vietnam Dongu (VND)',
'warning-message' => 'Dikkat! Varsayılan sistem dili ve varsayılan para birimi ayarları kalıcıdır ve bir kez ayarlandığında değiştirilemez.',
'zambian-kwacha' => 'Zambiya Kvaçası (ZMW)',
],
'installation-processing' => [
'krayin' => 'Krayin Kurulumu',
'krayin-info' => 'Veritabanı tabloları oluşturuluyor, bu birkaç dakika sürebilir',
'title' => 'Kurulum',
],
'installation-completed' => [
'admin-panel' => 'Yönetici Paneli',
'krayin-forums' => 'Krayin Forumu',
'customer-panel' => 'Müşteri Paneli',
'explore-krayin-extensions' => 'Krayin Uzantılarını Keşfedin',
'title' => 'Kurulum Tamamlandı',
'title-info' => 'Krayin sisteminize başarıyla kuruldu.',
],
'ready-for-installation' => [
'create-databsae-table' => 'Veritabanı tablosu oluştur',
'install' => 'Yükleme',
'install-info' => 'Kurulum için Krayin',
'install-info-button' => 'Aşağıdaki düğmeye tıklayın',
'populate-database-table' => 'Veritabanı tablolarını doldur',
'start-installation' => 'Kurulumu Başlat',
'title' => 'Kurulum için Hazır',
],
'start' => [
'locale' => 'Yerel',
'main' => 'Başlangıç',
'select-locale' => 'Yerel Seçin',
'title' => 'Krayin kurulumunuz',
'welcome-title' => 'Krayin\'ya hoş geldiniz',
],
'server-requirements' => [
'calendar' => 'Takvim',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'dom',
'fileinfo' => 'Dosya Bilgisi',
'filter' => 'Filtre',
'gd' => 'GD',
'hash' => 'Hash',
'intl' => 'intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 veya üstü',
'session' => 'oturum',
'title' => 'Sunucu Gereksinimleri',
'tokenizer' => 'tokenizer',
'xml' => 'XML',
],
'back' => 'Geri',
'krayin' => 'Krayin',
'krayin-info' => 'Webkul tarafından geliştirilen bir Topluluk Projesi',
'krayin-logo' => 'Krayin Logosu',
'continue' => 'Devam Et',
'installation-description' => 'Krayin kurulumu genellikle birkaç adım içerir. İşte Krayin\'nun kurulum sürecine genel bir bakış',
'installation-info' => 'Sizi burada görmekten mutluluk duyuyoruz!',
'installation-title' => 'Kurulum\'a Hoş Geldiniz',
'installation-wizard' => 'Kurulum Sihirbazı dili',
'title' => 'Krayin Kurulum Sihirbazı',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,289 @@
<?php
return [
'seeders' => [
'attributes' => [
'leads' => [
'description' => 'Mô tả',
'expected-close-date' => 'Ngày dự kiến đóng',
'lead-value' => 'Giá trị cơ hội',
'sales-owner' => 'Chủ sở hữu bán hàng',
'source' => 'Nguồn',
'title' => 'Tiêu đề',
'type' => 'Loại',
'pipeline' => 'Kênh bán hàng',
'stage' => 'Giai đoạn',
],
'persons' => [
'contact-numbers' => 'Số điện thoại liên hệ',
'emails' => 'Email',
'job-title' => 'Chức vụ',
'name' => 'Tên',
'organization' => 'Tổ chức',
'sales-owner' => 'Chủ sở hữu bán hàng',
],
'organizations' => [
'address' => 'Địa chỉ',
'name' => 'Tên',
'sales-owner' => 'Chủ sở hữu bán hàng',
],
'products' => [
'description' => 'Mô tả',
'name' => 'Tên',
'price' => 'Giá',
'quantity' => 'Số lượng',
'sku' => 'SKU',
],
'quotes' => [
'adjustment-amount' => 'Số tiền điều chỉnh',
'billing-address' => 'Địa chỉ thanh toán',
'description' => 'Mô tả',
'discount-amount' => 'Số tiền giảm giá',
'discount-percent' => 'Phần trăm giảm giá',
'expired-at' => 'Hết hạn vào',
'grand-total' => 'Tổng cộng',
'person' => 'Người',
'sales-owner' => 'Chủ sở hữu bán hàng',
'shipping-address' => 'Địa chỉ giao hàng',
'sub-total' => 'Tổng phụ',
'subject' => 'Chủ đề',
'tax-amount' => 'Số tiền thuế',
],
'warehouses' => [
'contact-address' => 'Địa chỉ liên hệ',
'contact-emails' => 'Email liên hệ',
'contact-name' => 'Tên người liên hệ',
'contact-numbers' => 'Số điện thoại liên hệ',
'description' => 'Mô tả',
'name' => 'Tên',
],
],
'email' => [
'activity-created' => 'Hoạt động đã được tạo',
'activity-modified' => 'Hoạt động đã được chỉnh sửa',
'date' => 'Ngày',
'new-activity' => 'Bạn có một hoạt động mới, vui lòng xem chi tiết bên dưới',
'new-activity-modified' => 'Bạn có một hoạt động mới đã được chỉnh sửa, vui lòng xem chi tiết bên dưới',
'participants' => 'Người tham gia',
'title' => 'Tiêu đề',
'type' => 'Loại',
],
'lead' => [
'pipeline' => [
'default' => 'Kênh bán hàng mặc định',
'pipeline-stages' => [
'follow-up' => 'Theo dõi',
'lost' => 'Mất',
'negotiation' => 'Đàm phán',
'new' => 'Mới',
'prospect' => 'Triển vọng',
'won' => 'Thắng',
],
],
'source' => [
'direct' => 'Trực tiếp',
'email' => 'Email',
'phone' => 'Điện thoại',
'web' => 'Web',
'web-form' => 'Mẫu web',
],
'type' => [
'existing-business' => 'Kinh doanh hiện tại',
'new-business' => 'Kinh doanh mới',
],
],
'user' => [
'role' => [
'administrator-role' => 'Vai trò quản trị viên',
'administrator' => 'Quản trị viên',
],
],
'workflow' => [
'email-to-participants-after-activity-updation' => 'Email đến người tham gia sau khi cập nhật hoạt động',
'email-to-participants-after-activity-creation' => 'Email đến người tham gia sau khi tạo hoạt động',
],
],
'installer' => [
'index' => [
'create-administrator' => [
'admin' => 'Administrador',
'krayin' => 'Krayin',
'confirm-password' => 'Confirmar Senha',
'email' => 'Email',
'email-address' => 'admin@exemplo.com',
'password' => 'Senha',
'title' => 'Criar Administrador',
],
'environment-configuration' => [
'algerian-dinar' => 'Dinar Argelino (DZD)',
'allowed-currencies' => 'Moedas Permitidas',
'allowed-locales' => 'Idiomas Permitidos',
'application-name' => 'Nome da Aplicação',
'argentine-peso' => 'Peso Argentino (ARS)',
'australian-dollar' => 'Dólar Australiano (AUD)',
'krayin' => 'Krayin',
'bangladeshi-taka' => 'Taka de Bangladesh (BDT)',
'brazilian-real' => 'Real Brasileiro (BRL)',
'british-pound-sterling' => 'Libra Esterlina (GBP)',
'canadian-dollar' => 'Dólar Canadense (CAD)',
'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',
'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',
'chilean-peso' => 'Peso Chileno (CLP)',
'chinese-yuan' => 'Yuan Chinês (CNY)',
'colombian-peso' => 'Peso Colombiano (COP)',
'czech-koruna' => 'Coroa Tcheca (CZK)',
'danish-krone' => 'Coroa Dinamarquesa (DKK)',
'database-connection' => 'Conexão com o Banco de Dados',
'database-hostname' => 'Hostname do Banco de Dados',
'database-name' => 'Nome do Banco de Dados',
'database-password' => 'Senha do Banco de Dados',
'database-port' => 'Porta do Banco de Dados',
'database-prefix' => 'Prefixo do Banco de Dados',
'database-username' => 'Usuário do Banco de Dados',
'default-currency' => 'Moeda Padrão',
'default-locale' => 'Idioma Padrão',
'default-timezone' => 'Fuso Horário Padrão',
'default-url' => 'URL Padrão',
'default-url-link' => 'https://localhost',
'egyptian-pound' => 'Libra Egípcia (EGP)',
'euro' => 'Euro (EUR)',
'fijian-dollar' => 'Dólar de Fiji (FJD)',
'hong-kong-dollar' => 'Dólar de Hong Kong (HKD)',
'hungarian-forint' => 'Forint Húngaro (HUF)',
'indian-rupee' => 'Rúpia Indiana (INR)',
'indonesian-rupiah' => 'Rupia Indonésia (IDR)',
'israeli-new-shekel' => 'Novo Shekel Israelense (ILS)',
'japanese-yen' => 'Iene Japonês (JPY)',
'jordanian-dinar' => 'Dinar Jordaniano (JOD)',
'kazakhstani-tenge' => 'Tenge Cazaque (KZT)',
'kuwaiti-dinar' => 'Dinar Kuwaitiano (KWD)',
'lebanese-pound' => 'Libra Libanesa (LBP)',
'libyan-dinar' => 'Dinar Líbio (LYD)',
'malaysian-ringgit' => 'Ringgit Malaio (MYR)',
'mauritian-rupee' => 'Rúpia Mauriciana (MUR)',
'mexican-peso' => 'Peso Mexicano (MXN)',
'moroccan-dirham' => 'Dirham Marroquino (MAD)',
'mysql' => 'Mysql',
'nepalese-rupee' => 'Rúpia Nepalesa (NPR)',
'new-taiwan-dollar' => 'Novo Dólar Taiwanês (TWD)',
'new-zealand-dollar' => 'Dólar Neozelandês (NZD)',
'nigerian-naira' => 'Naira Nigeriana (NGN)',
'norwegian-krone' => 'Coroa Norueguesa (NOK)',
'omani-rial' => 'Rial Omanense (OMR)',
'pakistani-rupee' => 'Rúpia Paquistanesa (PKR)',
'panamanian-balboa' => 'Balboa Panamenho (PAB)',
'paraguayan-guarani' => 'Guarani Paraguaio (PYG)',
'peruvian-nuevo-sol' => 'Novo Sol Peruano (PEN)',
'pgsql' => 'pgSQL',
'philippine-peso' => 'Peso Filipino (PHP)',
'polish-zloty' => 'Zloty Polonês (PLN)',
'qatari-rial' => 'Rial Catariano (QAR)',
'romanian-leu' => 'Leu Romeno (RON)',
'russian-ruble' => 'Rublo Russo (RUB)',
'saudi-riyal' => 'Riyal Saudita (SAR)',
'select-timezone' => 'Selecionar Fuso Horário',
'singapore-dollar' => 'Dólar de Singapura (SGD)',
'south-african-rand' => 'Rand Sul-Africano (ZAR)',
'south-korean-won' => 'Won Sul-Coreano (KRW)',
'sqlsrv' => 'SQLSRV',
'sri-lankan-rupee' => 'Rúpia do Sri Lanka (LKR)',
'swedish-krona' => 'Coroa Sueca (SEK)',
'swiss-franc' => 'Franco Suíço (CHF)',
'thai-baht' => 'Baht Tailandês (THB)',
'title' => 'Configuração da Loja',
'tunisian-dinar' => 'Dinar Tunisiano (TND)',
'turkish-lira' => 'Lira Turca (TRY)',
'ukrainian-hryvnia' => 'Hryvnia Ucraniana (UAH)',
'united-arab-emirates-dirham' => 'Dirham dos Emirados Árabes Unidos (AED)',
'united-states-dollar' => 'Dólar dos Estados Unidos (USD)',
'uzbekistani-som' => 'Som Uzbeque (UZS)',
'venezuelan-bolívar' => 'Bolívar Venezuelano (VEF)',
'vietnamese-dong' => 'Dong Vietnamita (VND)',
'warning-message' => 'Atenção! As configurações de idioma padrão e moeda padrão são permanentes e não podem ser alteradas após definidas.',
'zambian-kwacha' => 'Kwacha Zambiano (ZMW)',
],
'installation-processing' => [
'krayin' => 'Instalação do Krayin',
'krayin-info' => 'Criando as tabelas do banco de dados, isso pode levar alguns momentos',
'title' => 'Instalação',
],
'installation-completed' => [
'admin-panel' => 'Painel de Administração',
'krayin-forums' => 'Fórum do Krayin',
'customer-panel' => 'Painel do Cliente',
'explore-krayin-extensions' => 'Explorar Extensões do Krayin',
'title' => 'Instalação Concluída',
'title-info' => 'O Krayin foi instalado com sucesso no seu sistema.',
],
'ready-for-installation' => [
'create-databsae-table' => 'Criar as tabelas do banco de dados',
'install' => 'Instalar',
'install-info' => 'Krayin para Instalação',
'install-info-button' => 'Clique no botão abaixo para',
'populate-database-table' => 'Preencher as tabelas do banco de dados',
'start-installation' => 'Iniciar Instalação',
'title' => 'Pronto para Instalação',
],
'start' => [
'locale' => 'Localidade',
'main' => 'Início',
'select-locale' => 'Selecionar Localidade',
'title' => 'Instalação do Krayin',
'welcome-title' => 'Bem-vindo ao Krayin',
],
'server-requirements' => [
'calendar' => 'Calendário',
'ctype' => 'cType',
'curl' => 'cURL',
'dom' => 'DOM',
'fileinfo' => 'fileInfo',
'filter' => 'Filtro',
'gd' => 'GD',
'hash' => 'Hash',
'intl' => 'Intl',
'json' => 'JSON',
'mbstring' => 'mbstring',
'openssl' => 'openssl',
'pcre' => 'pcre',
'pdo' => 'pdo',
'php' => 'PHP',
'php-version' => '8.1 ou superior',
'session' => 'Sessão',
'title' => 'Requisitos do Sistema',
'tokenizer' => 'Tokenizador',
'xml' => 'XML',
],
'back' => 'Voltar',
'krayin' => 'Krayin',
'krayin-info' => 'um Projeto Comunitário por',
'krayin-logo' => 'Logotipo Krayin',
'continue' => 'Continuar',
'installation-description' => 'A instalação do Krayin geralmente envolve várias etapas. Aqui está um resumo do processo de instalação do Krayin.',
'installation-info' => 'Estamos felizes em vê-lo aqui!',
'installation-title' => 'Bem-vindo à Instalação',
'installation-wizard' => 'Assistente de Instalação - Idioma',
'title' => 'Instalador do Krayin',
'webkul' => 'Webkul',
],
],
];

View File

@@ -0,0 +1,63 @@
<v-button {{ $attributes }}></v-button>
@pushOnce('scripts')
<script
type="text/x-template"
id="v-button-template"
>
<button
v-if="! loading"
:class="[buttonClass, '']"
>
@{{ title }}
</button>
<button
v-else
:class="[buttonClass, '']"
>
<!-- Spinner -->
<svg
class="absolute h-5 w-5 animate-spin"
xmlns="http://www.w3.org/2000/svg"
fill="none"
aria-hidden="true"
viewBox="0 0 24 24"
>
<circle
class="opacity-25"
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="4"
>
</circle>
<path
class="opacity-75"
fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
>
</path>
</svg>
<span class="realative h-full w-full opacity-0">
@{{ title }}
</span>
</button>
</script>
<script type="module">
app.component('v-button', {
template: '#v-button-template',
props: {
loading: Boolean,
buttonType: String,
title: String,
buttonClass: String,
},
});
</script>
@endPushOnce

View File

@@ -0,0 +1,70 @@
@props([
'type' => 'text',
'name' => '',
])
@switch($type)
@case('hidden')
@case('text')
@case('email')
@case('password')
@case('number')
<v-field
name="{{ $name }}"
v-slot="{ field }"
{{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}
>
<input
type="{{ $type }}"
name="{{ $name }}"
v-bind="field"
:class="[errors['{{ $name }}'] ? 'border border-red-600 hover:border-red-600' : '']"
{{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full appearance-none rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400']) }}
>
</v-field>
@break
@case('select')
<v-field
name="{{ $name }}"
v-slot="{ field }"
{{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}
>
<select
name="{{ $name }}"
v-bind="field"
:class="[errors['{{ $name }}'] ? 'border border-red-500' : '']"
{{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'custom-select w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400']) }}
>
{{ $slot }}
</select>
</v-field>
@break
@case('checkbox')
<v-field
v-slot="{ field }"
name="{{ $name }}"
type="checkbox"
class="hidden"
{{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}
>
<input
type="checkbox"
name="{{ $name }}"
v-bind="field"
class="peer sr-only"
{{ $attributes->except(['rules', 'label', ':label']) }}
/>
</v-field>
<label
class="icon-checkbox-normal peer-checked:icon-checkbox-active cursor-pointer text-2xl peer-checked:text-blue-600"
{{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}
>
</label>
@break
@endswitch

View File

@@ -0,0 +1,13 @@
@props(['controlName' => ''])
@if (! empty($controlName))
<v-error-message
name="{{ $controlName }}"
{{ $attributes }}
v-slot="{ message }"
>
<p {{ $attributes->merge(['class' => 'mt-1 text-red-600 text-xs italic']) }}>
@{{ message }}
</p>
</v-error-message>
@endif

View File

@@ -0,0 +1,3 @@
<div {{ $attributes->merge(['class' => 'mb-2.5']) }}>
{{ $slot }}
</div>

View File

@@ -0,0 +1,3 @@
<label {{ $attributes->merge(['class' => 'block text-4 font-medium leading-6 text-gray-800']) }}>
{{ $slot }}
</label>

View File

@@ -0,0 +1,34 @@
<!--
If a component has the `as` attribute, it indicates that it uses
the ajaxified form or some customized slot form.
-->
@if ($attributes->has('as'))
<v-form {{ $attributes }}>
{{ $slot }}
</v-form>
<!--
Otherwise, a traditional form will be provided with a minimal
set of configurations.
-->
@else
@props(['method' => 'POST'])
@php $method = strtoupper($method); @endphp
<v-form
method="{{ $method === 'GET' ? 'GET' : 'POST' }}"
v-slot="{ meta, errors, setValues }"
{{ $attributes }}
>
@unless(in_array($method, ['HEAD', 'GET', 'OPTIONS']))
@csrf
@endunless
@if (! in_array($method, ['GET', 'POST']))
@method($method)
@endif
{{ $slot }}
</v-form>
@endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
<?php
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\Route;
use Webkul\Installer\Http\Controllers\InstallerController;
Route::middleware(['web', 'installer_locale'])->group(function () {
Route::controller(InstallerController::class)->group(function () {
Route::get('install', 'index')->name('installer.index');
Route::middleware(StartSession::class)->prefix('install/api')->group(function () {
Route::post('env-file-setup', 'envFileSetup')->name('installer.env_file_setup');
Route::withoutMiddleware('web')->group(function () {
Route::post('run-migration', 'runMigration')->name('installer.run_migration');
Route::post('run-seeder', 'runSeeder')->name('installer.run_seeder');
Route::post('admin-config-setup', 'adminConfigSetup')->name('installer.admin_config_setup');
});
});
});
});

View File

@@ -0,0 +1,16 @@
_ __ _
| | / / (_)
| |/ / _ __ __ _ _ _ _ _ __
| \| '__/ _` | | | | | '_ \
| |\ \ | | (_| | |_| | | | | |
\_| \_/_| \__,_|\__, |_|_| |_|
__/ |
|___/
</>
Welcome to the <info>Krayin</info> project! Krayin Community is an <comment>open-source CRM solution</comment>
which is built on top of Laravel and Vue.js.
Made with 💖 by the Krayin Team. Happy helping :)