feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- Add SendSmsMessage class for encapsulating SMS message data. - Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS. - Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates. - Develop SendSmsHandler for handling SMS sending messages. - Create SmsService to manage SMS dispatching and logging. - Add UserProfileController for managing user profiles with CRUD operations. - Implement UserProfile entity and repository for user profile data management. - Update symfony.lock and bootstrap.php for project dependencies and environment setup.
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
namespace App\Payment\Entity;
|
||||
|
||||
use App\Appointment\Entity\Appointment;
|
||||
use App\Auth\Entity\User;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Symfony\Component\Uid\Uuid;
|
||||
|
||||
#[ORM\Entity]
|
||||
#[ORM\Table(name: 'payments')]
|
||||
#[ORM\Index(columns: ['order_id'], name: 'idx_payments_order')]
|
||||
#[ORM\Index(columns: ['user_id'], name: 'idx_payments_user')]
|
||||
class Payment
|
||||
{
|
||||
public const STATUS_PENDING = 'pending';
|
||||
public const STATUS_SUCCESS = 'success';
|
||||
public const STATUS_FAILED = 'failed';
|
||||
public const STATUS_REFUNDED = 'refunded';
|
||||
|
||||
public const TYPE_APPOINTMENT = 'appointment';
|
||||
public const TYPE_SUBSCRIPTION = 'subscription';
|
||||
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue]
|
||||
#[ORM\Column(type: 'integer')]
|
||||
private ?int $id = null;
|
||||
|
||||
#[ORM\Column(type: 'string', length: 36, unique: true)]
|
||||
private string $uuid;
|
||||
|
||||
#[ORM\Column(name: 'order_id', type: 'string', length: 64, unique: true)]
|
||||
private string $orderId;
|
||||
|
||||
#[ORM\ManyToOne(targetEntity: User::class)]
|
||||
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: false, onDelete: 'RESTRICT')]
|
||||
private User $user;
|
||||
|
||||
#[ORM\ManyToOne(targetEntity: Appointment::class)]
|
||||
#[ORM\JoinColumn(name: 'appointment_id', referencedColumnName: 'id', nullable: true, onDelete: 'SET NULL')]
|
||||
private ?Appointment $appointment = null;
|
||||
|
||||
#[ORM\Column(name: 'amount_rials', type: 'integer')]
|
||||
private int $amountRials;
|
||||
|
||||
#[ORM\Column(type: 'string', length: 30)]
|
||||
private string $status = self::STATUS_PENDING;
|
||||
|
||||
#[ORM\Column(type: 'string', length: 20)]
|
||||
private string $gateway;
|
||||
|
||||
#[ORM\Column(type: 'string', length: 30)]
|
||||
private string $type;
|
||||
|
||||
#[ORM\Column(name: 'gateway_token', type: 'string', length: 255, nullable: true)]
|
||||
private ?string $gatewayToken = null;
|
||||
|
||||
#[ORM\Column(name: 'reference_id', type: 'string', length: 255, nullable: true)]
|
||||
private ?string $referenceId = null;
|
||||
|
||||
#[ORM\Column(name: 'frontend_address', type: 'string', length: 500, nullable: true)]
|
||||
private ?string $frontendAddress = null;
|
||||
|
||||
#[ORM\Column(name: 'callback_ip', type: 'string', length: 45, nullable: true)]
|
||||
private ?string $callbackIp = null;
|
||||
|
||||
#[ORM\Column(name: 'created_at', type: 'integer')]
|
||||
private int $createdAt;
|
||||
|
||||
#[ORM\Column(name: 'updated_at', type: 'integer')]
|
||||
private int $updatedAt;
|
||||
|
||||
public function __construct(User $user, int $amountRials, string $gateway, string $type, string $frontendAddress = '')
|
||||
{
|
||||
$this->uuid = Uuid::v4()->toRfc4122();
|
||||
$this->orderId = 'ORD-' . strtoupper(substr(str_replace('-', '', Uuid::v4()->toRfc4122()), 0, 16));
|
||||
$this->user = $user;
|
||||
$this->amountRials = $amountRials;
|
||||
$this->gateway = $gateway;
|
||||
$this->type = $type;
|
||||
$this->frontendAddress = $frontendAddress ?: null;
|
||||
$this->createdAt = time();
|
||||
$this->updatedAt = time();
|
||||
}
|
||||
|
||||
public function getId(): ?int { return $this->id; }
|
||||
public function getUuid(): string { return $this->uuid; }
|
||||
public function getOrderId(): string { return $this->orderId; }
|
||||
public function getUser(): User { return $this->user; }
|
||||
public function getAppointment(): ?Appointment { return $this->appointment; }
|
||||
public function getAmountRials(): int { return $this->amountRials; }
|
||||
public function getStatus(): string { return $this->status; }
|
||||
public function getGateway(): string { return $this->gateway; }
|
||||
public function getType(): string { return $this->type; }
|
||||
public function getGatewayToken(): ?string { return $this->gatewayToken; }
|
||||
public function getReferenceId(): ?string { return $this->referenceId; }
|
||||
public function getFrontendAddress(): ?string { return $this->frontendAddress; }
|
||||
public function getCallbackIp(): ?string { return $this->callbackIp; }
|
||||
|
||||
public function setAppointment(?Appointment $a): self { $this->appointment = $a; return $this; }
|
||||
public function setGatewayToken(?string $t): self { $this->gatewayToken = $t; $this->touch(); return $this; }
|
||||
public function setReferenceId(?string $r): self { $this->referenceId = $r; $this->touch(); return $this; }
|
||||
public function setStatus(string $s): self { $this->status = $s; $this->touch(); return $this; }
|
||||
public function setCallbackIp(?string $ip): self { $this->callbackIp = $ip; $this->touch(); return $this; }
|
||||
|
||||
private function touch(): void { $this->updatedAt = time(); }
|
||||
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'uuid' => $this->uuid,
|
||||
'order_id' => $this->orderId,
|
||||
'amount_rials' => $this->amountRials,
|
||||
'status' => $this->status,
|
||||
'gateway' => $this->gateway,
|
||||
'type' => $this->type,
|
||||
'reference_id' => $this->referenceId,
|
||||
'appointment_uuid' => $this->appointment?->getUuid(),
|
||||
'created_at' => $this->createdAt,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user