137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace kernel\app_modules\card\services;
 | |
| 
 | |
| use DragonCode\CardNumber\CardNumber;
 | |
| use DragonCode\CardNumber\Factories\BankFactory;
 | |
| use DragonCode\CardNumber\Formatters\BankFormatter;
 | |
| use kernel\app_modules\card\models\Card;
 | |
| use kernel\app_modules\card\models\CardFile;
 | |
| use kernel\FormModel;
 | |
| use kernel\helpers\Debug;
 | |
| use kernel\helpers\ImageGD;
 | |
| use Endroid\QrCode\Color\Color;
 | |
| use Endroid\QrCode\Encoding\Encoding;
 | |
| use Endroid\QrCode\ErrorCorrectionLevel;
 | |
| use Endroid\QrCode\QrCode;
 | |
| use Endroid\QrCode\RoundBlockSizeMode;
 | |
| use Endroid\QrCode\Writer\PngWriter;
 | |
| 
 | |
| class CardFileService
 | |
| {
 | |
| 
 | |
|     public function create(Card $card): false|CardFile
 | |
|     {
 | |
|         $cardFile = self::createCardPNG($card);
 | |
| 
 | |
|         $model = new CardFile();
 | |
|         // Пример заполнения:
 | |
|         $model->file = $cardFile;
 | |
|         $model->status = CardFile::ACTIVE_STATUS;
 | |
|         $model->card_id = $card->id;
 | |
|         // $model->slug = Slug::createSlug($form_model->getItem('title'), Card::class); // Генерация уникального slug
 | |
| 
 | |
|         if ($model->save()) {
 | |
|             return $model;
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public function update(FormModel $form_model, CardFile $cardTemplate): false|CardFile
 | |
|     {
 | |
|         // Пример обновления:
 | |
|         $cardTemplate->file = $form_model->getItem('file');
 | |
|         $cardTemplate->card_id = $form_model->getItem('card_id');
 | |
|         $cardTemplate->status = $form_model->getItem('status');
 | |
| 
 | |
|         if ($cardTemplate->save()) {
 | |
|             return $cardTemplate;
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static function createCardPNG(Card $card): false|string
 | |
|     {
 | |
|         if ($card->cardTemplate) {
 | |
|             $formatter = BankFormatter::create();
 | |
| 
 | |
|             $customer = BankFactory::create()->paymentType($card->payment_type)->bank($card->bank_id, $card->info, $card->program)->client($card->id);
 | |
| 
 | |
|             $cardNumber = CardNumber::generate($customer, $formatter);
 | |
|             //Card
 | |
|             $newFileName = md5(time() . $card->id) . '.png';
 | |
|             $uploadDir = "/resources/cards/";
 | |
|             $uploadDirUri = $uploadDir . mb_substr($newFileName, 0, 2) . '/' . mb_substr($newFileName, 2, 2) . '/';
 | |
|             $oldMask = umask(0);
 | |
|             mkdir(ROOT_DIR . $uploadDirUri, 0775, true);
 | |
|             umask($oldMask);
 | |
|             $uploadFileDir = ROOT_DIR . $uploadDirUri;
 | |
| 
 | |
|             $cardSettings = json_decode($card->cardTemplate->settings ?? "", true);
 | |
| 
 | |
|             $img = ROOT_DIR . "/" . $card->cardTemplate->path; // Ссылка на файл
 | |
|             $font = RESOURCES_DIR . "/Montserrat-SemiBold.ttf"; // Ссылка на шрифт
 | |
| 
 | |
|             $qr = self::createQr($card->id, $cardSettings['qr_size'] ?? 131);
 | |
|             $qrImg = new ImageGD($qr->getDataUri());
 | |
|             $img = new ImageGD($img);
 | |
| 
 | |
|             $pngFilePath = RESOURCES_DIR . "/tmp/" . $card->id . ".png";
 | |
|             $pngFileUrl = "/resources/tmp/" . $card->id . ".png";
 | |
| 
 | |
|             $img->addText(
 | |
|                 font_size: 20,
 | |
|                 degree: 0,
 | |
|                 x: 15,
 | |
|                 y: 190,
 | |
|                 color: $cardSettings['card_number_color'] ?? "#ffffff",
 | |
|                 font: $font,
 | |
|                 text: $cardNumber
 | |
|             );
 | |
|             $img->addText(
 | |
|                 font_size: 12,
 | |
|                 degree: 0,
 | |
|                 x: 15,
 | |
|                 y: 210,
 | |
|                 color: $cardSettings['card_name_color'] ?? "#FEE62F",
 | |
|                 font: $font,
 | |
|                 text: $card->username
 | |
|             );
 | |
|             $img->addImg($qrImg->getImg(),
 | |
|                 $cardSettings['qr_location_x'] ?? 190,
 | |
|                 $cardSettings['qr_location_y'] ?? 20,
 | |
|                 0,
 | |
|                 0,
 | |
|                 $cardSettings['qr_box_width'] ?? 135,
 | |
|                 $cardSettings['qr_box_height'] ?? 135,
 | |
|                 100
 | |
|             );
 | |
|             $img->save($uploadFileDir . $newFileName);
 | |
| 
 | |
|             return $uploadDirUri . $newFileName;
 | |
|         }
 | |
| 
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public static function createQr(string|int $text, int $size = 131): \Endroid\QrCode\Writer\Result\ResultInterface
 | |
|     {
 | |
|         $writer = new PngWriter();
 | |
| 
 | |
|         $qrCode = new QrCode(
 | |
|             data: $text,
 | |
|             encoding: new Encoding('UTF-8'),
 | |
|             errorCorrectionLevel: ErrorCorrectionLevel::Low,
 | |
|             size: $size,
 | |
|             margin: 2,
 | |
|             roundBlockSizeMode: RoundBlockSizeMode::Margin,
 | |
|             foregroundColor: new Color(0, 0, 0),
 | |
|             backgroundColor: new Color(255, 255, 255)
 | |
|         );
 | |
| 
 | |
|         return $writer->write($qrCode);
 | |
|     }
 | |
| 
 | |
| } |