Files
postshop-backend/app/Helpers/helpers.php
2026-02-11 03:15:43 +05:00

404 lines
9.9 KiB
PHP

<?php
use App\Models\Auth\Verification;
use App\Models\Ecommerce\Channel\Channel;
use App\Models\Ecommerce\Product\Inventory\Inventory;
use App\Models\System\Warning;
use App\Repositories\Ecommerce\Product\Barcode\BarcodeRepository;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
if (! function_exists('modules_path')) {
/**
* Single translation for all locales
*/
function modules_path(string $path = ''): string
{
return app_path('Modules/'.$path);
}
}
if (! function_exists('translatable')) {
/**
* Single translation for all locales
*/
function translatable(string $text): array
{
return collect(config('app.locales'))->map(fn ($locale) => $text)->toArray();
}
}
if (! function_exists('removeWhiteSpace')) {
/**
* Remove white sapce from string
*/
function removeWhiteSpace(string $text): string
{
return preg_replace('/\s+/', '', $text);
}
}
if (! function_exists('temp_cache')) {
/**
* Temprory cache via array driver
*/
function temp_cache(string|array|null $key): mixed
{
if (is_string($key)) {
return cache()->get($key);
}
if (is_array($key)) {
return cache()->put(
key: $key[0],
value: $key[1]
);
}
return cache();
}
}
if (! function_exists('sendSMS')) {
/**
* Send a sms
*/
function sendSMS(string|int $phone, string|int $message): mixed
{
if (! app()->isProduction()) {
return [];
}
$response = Http::withToken('WsTEJTBGlQiJ')
->retry(
times: 3,
sleepMilliseconds: 50,
throw: false,
when: function (Exception $exception, PendingRequest $request) {
Log::channel('sms_api_error')
->error('Exception: ', [
'message' => $exception->getMessage(),
'line' => $exception->getLine(),
]);
return true;
})
->post('https://sms.post.gov.tm/api/clients/sms/create', [
'phone' => '993'.$phone,
'content' => $message,
]);
return $response->json();
}
}
if (! function_exists('sendSMSVerification')) {
/**
* Send a sms verification code
*
* @return \App\Models\Verification | null
*/
function sendSMSVerification(string|int $phone_number): ?Verification
{
/* for apple testing */
$phone_code = ($phone_number == '61126667') ? 77777 : rand(10000, 99999);
$verification = Verification::where(['username' => $phone_number])->first();
$verification
? $verification->update(['code' => $phone_code])
: Verification::create(['username' => $phone_number, 'code' => $phone_code]);
sendSMS($phone_number, 'Tassyklaýyş belgi: '.$phone_code);
return $verification;
}
}
if (! function_exists('randomHex')) {
/**
* Generate random hex
*/
function randomHex(): string
{
$chars = 'ABCDEF0123456789';
$color = '#';
for ($i = 0; $i < 6; $i++) {
$color .= $chars[rand(0, strlen($chars) - 1)];
}
return $color;
}
}
if (! function_exists('phoneMaskFormat')) {
/**
* Phone number mask
*/
function phoneMaskFormat(): string
{
return '+(\\9\\93)-99-99-99-99';
}
}
if (! function_exists('unmask_phone')) {
/**
* Unmask phone from TM code +(993)-6x-xx-xx-xx to 6xxxxxxx
*/
function unmask_phone(string|int|float $phone): string
{
return str_replace(['+(993)', '-'], '', $phone);
}
}
if (! function_exists('mask_phone')) {
/**
* Mask phone for TM code from 6xxxxxxx to +(993)-6x-xx-xx-xx
*/
function mask_phone(string|int|float $phone): string
{
// Split the number into an array of every two digits
$chunks = array_chunk(str_split($phone, 2), 1);
// Collapse the array chunks into a string with dashes
return '+(993)-'.implode('-', array_map('implode', $chunks));
}
}
if (! function_exists('tmpostChannel')) {
/**
* Default channel
*
* @return \App\Models\Shop\Channel
*/
function tmpostChannel(): Channel
{
return Channel::tmpostDefault();
}
}
if (! function_exists('tmpostDefaultInventory')) {
/**
* Default inventory id
*/
function tmpostDefaultInventory(): mixed
{
return Inventory::tmpostDefault();
}
}
if (! function_exists('round_up')) {
/**
* Round up the float
*/
function round_up(string|int|float $number, int $precision = 2): float
{
$fig = (int) str_pad('1', $precision, '0');
return ceil($number * $fig) / $fig;
}
}
if (! function_exists('routeName')) {
/**
* Current route name
*/
function routeName(): ?string
{
return Route::currentRouteName();
}
}
if (! function_exists('routeIs')) {
/**
* Check if current route matches with given datas
*/
function routeIs(string|array $name): bool
{
return is_string($name)
? $name === routeName()
: in_array(routeName(), $name);
}
}
/**
* Check if route is product related
*/
function routeIsProductRelated(): bool
{
return routeIs([
'web.categories.products',
'web.brands.products',
'web.collections.products',
'web.entrepreneurs.show',
'web.search.index',
]);
}
if (! function_exists('keyValueExistsInArray')) {
/**
* Check "key-value" exists in array
*
* @param int $key
* @param int $value
*/
function keyValueExistsInArray(array $datas, string|int $key, string|int $value): bool
{
foreach ($datas as $data) {
if (isset($data[$key]) && $data[$key] === $value) {
return true;
}
}
return false;
}
}
if (! function_exists('productTaxForCategory')) {
/**
* Product tax for categories it has been related
* As of now, the highest category tax is taken
*/
function productTaxForCategory(array|Collection $categories): int
{
return DB::table('categories')
->whereIntegerInRaw('id', $categories)
->select(DB::raw('MAX(tax_percentage::integer) as tax'))
->pluck('tax')[0] ?? 1;
}
}
if (! function_exists('validateCommaSeperated')) {
/**
* Validates a comma-separated string of fields.
*
* - Validates the format of each field (alphanumeric or underscore).
* - Optionally checks fields against a model's fillable property.
*
* @param string|null $value The comma-separated string to validate.
* @param string|null $model The model class to check fields against (optional).
* @return string[] An array of validated fields.
*/
function validateCommaSeperated(?string $value, mixed $model = null): array
{
if (is_null($value)) {
return [];
}
$values = explode(',', removeWhiteSpace($value));
$validated = [];
$fields = [];
if (! is_null($model)) {
$fields = (new $model)->getFillable();
}
foreach ($values as $value) {
if (empty($value) || is_numeric($value)) {
continue;
}
if (! validator(data: ['key' => $value], rules: ['key' => ['alpha_dash:ascii']])->fails()) {
if (! empty($fields)) {
if (in_array($value, $fields)) {
$validated[] = $value;
}
continue;
}
$validated[] = $value;
}
}
return $validated;
}
}
if (! function_exists('orderAdminNumber')) {
/**
* Order admin phone number
*/
function orderAdminNumber(): int
{
return 65728952;
}
}
if (! function_exists('barcodeGeneratorRoute')) {
/**
* Barcode generator route
*/
function barcodeGeneratorRoute(): string
{
return BarcodeRepository::imageGeneratorRoute();
}
}
if (! function_exists('calculateProductPriceAmount')) {
/**
* Calculate product price amount
*/
function calculateProductPriceAmount(int|float $price, int $tax): float
{
return round_up(($price / (100 - $tax)) * 100);
}
}
/**
* Create halkbank order
*
* @param string $price
* @return array{status: string, url: string|null}
*/
function createHalkbankOrder($price = 123): array
{
$orderNumber = date('dmyHis');
$paymentResponse = Http::get('https://mpi.gov.tm/payment/rest/register.do', [
'orderNumber' => $orderNumber,
'amount' => $price,
'currency' => 934,
'language' => 'ru',
'userName' => 516122500260,
'password' => 'MrZsO9wfgWOBjf4',
'returnUrl' => route('online-payment-store'),
'pageView' => 'DESKTOP',
'description' => 'Kart tölegi',
])->onError(function ($response) {
Log::error('Payment error', [
'response' => [
'body' => $response->body(),
],
]);
});
if ($paymentResponse->failed()) {
return [
'status' => 'failed',
'url' => '',
];
}
return [
'status' => 'success',
'url' => $paymentResponse['formUrl'],
];
}
/**
* Warn brother
*/
function warn(string $message, string $content = '', string $where = '', string $notes = ''): void
{
Warning::forceCreate([
'name' => $message,
'content' => $content,
'where' => $where,
'notes' => $notes,
]);
}