| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | declare(strict_types=1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Cloudlog\QSLManager; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use DateTime; | 
					
						
							|  |  |  | use DateTimeZone; | 
					
						
							|  |  |  | use DomainException; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class QSO | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	private string $qsoID; | 
					
						
							|  |  |  | 	private DateTime $qsoDateTime; | 
					
						
							|  |  |  | 	private string $de; | 
					
						
							|  |  |  | 	private string $dx; | 
					
						
							|  |  |  | 	private string $mode; | 
					
						
							|  |  |  | 	private string $submode; | 
					
						
							|  |  |  | 	private string $band; | 
					
						
							|  |  |  | 	private string $bandRX; | 
					
						
							|  |  |  | 	private string $rstR; | 
					
						
							|  |  |  | 	private string $rstS; | 
					
						
							|  |  |  | 	private string $propagationMode; | 
					
						
							|  |  |  | 	private string $satelliteMode; | 
					
						
							|  |  |  | 	private string $satelliteName; | 
					
						
							|  |  |  | 	private string $name; | 
					
						
							|  |  |  | 	private string $email; | 
					
						
							|  |  |  | 	private string $address; | 
					
						
							|  |  |  | 	private string $deGridsquare; | 
					
						
							|  |  |  | 	private string $deIOTA; | 
					
						
							|  |  |  | 	private string $deSig; | 
					
						
							|  |  |  | 	private string $deSigInfo; | 
					
						
							|  |  |  | 	private string $deIOTAIslandID; | 
					
						
							|  |  |  | 	private string $deSOTAReference; | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 	/** Awards */ | 
					
						
							|  |  |  | 	private string $cqzone; | 
					
						
							|  |  |  | 	private string $state; | 
					
						
							|  |  |  | 	private string $dxcc; | 
					
						
							|  |  |  | 	private string $iota; | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	/** @var string[] */ | 
					
						
							|  |  |  | 	private array $deVUCCGridsquares; | 
					
						
							|  |  |  | 	private string $dxGridsquare; | 
					
						
							|  |  |  | 	private string $dxIOTA; | 
					
						
							|  |  |  | 	private string $dxSig; | 
					
						
							|  |  |  | 	private string $dxSigInfo; | 
					
						
							|  |  |  | 	private string $dxDARCDOK; | 
					
						
							|  |  |  | 	private string $dxSOTAReference; | 
					
						
							|  |  |  | 	/** @var string[] */ | 
					
						
							|  |  |  | 	private array $dxVUCCGridsquares; | 
					
						
							|  |  |  | 	private string $QSLMsg; | 
					
						
							|  |  |  | 	private ?DateTime $QSLReceivedDate; | 
					
						
							|  |  |  | 	private string $QSLReceived; | 
					
						
							|  |  |  | 	private string $QSLReceivedVia; | 
					
						
							|  |  |  | 	private ?DateTime $QSLSentDate; | 
					
						
							|  |  |  | 	private string $QSLSent; | 
					
						
							|  |  |  | 	private string $QSLSentVia; | 
					
						
							|  |  |  | 	private string $QSLVia; | 
					
						
							| 
									
										
										
										
											2023-04-27 22:00:02 +08:00
										 |  |  | 	private ?DateTime $end; | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param array $data Does no validation, it's assumed to be a row from the database in array format | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function __construct(array $data) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$requiredKeys = [ | 
					
						
							|  |  |  | 			'COL_PRIMARY_KEY', | 
					
						
							|  |  |  | 			'COL_ADDRESS', | 
					
						
							|  |  |  | 			'COL_BAND', | 
					
						
							|  |  |  | 			'COL_BAND_RX', | 
					
						
							|  |  |  | 			'COL_CALL', | 
					
						
							|  |  |  | 			'COL_EMAIL', | 
					
						
							|  |  |  | 			'COL_GRIDSQUARE', | 
					
						
							|  |  |  | 			'COL_IOTA', | 
					
						
							|  |  |  | 			'COL_MODE', | 
					
						
							|  |  |  | 			'COL_MY_GRIDSQUARE', | 
					
						
							|  |  |  | 			'COL_MY_IOTA', | 
					
						
							|  |  |  | 			'COL_MY_SIG', | 
					
						
							|  |  |  | 			'COL_MY_SIG_INFO', | 
					
						
							|  |  |  | 			'COL_NAME', | 
					
						
							|  |  |  | 			'COL_PROP_MODE', | 
					
						
							|  |  |  | 			'COL_QSLMSG', | 
					
						
							|  |  |  | 			'COL_QSLRDATE', | 
					
						
							|  |  |  | 			'COL_QSLSDATE', | 
					
						
							|  |  |  | 			'COL_QSL_RCVD', | 
					
						
							|  |  |  | 			'COL_QSL_RCVD_VIA', | 
					
						
							|  |  |  | 			'COL_QSL_SENT', | 
					
						
							|  |  |  | 			'COL_QSL_SENT_VIA', | 
					
						
							|  |  |  | 			'COL_QSL_VIA', | 
					
						
							|  |  |  | 			'COL_RST_RCVD', | 
					
						
							|  |  |  | 			'COL_RST_SENT', | 
					
						
							|  |  |  | 			'COL_SAT_MODE', | 
					
						
							|  |  |  | 			'COL_SAT_NAME', | 
					
						
							|  |  |  | 			'COL_SIG', | 
					
						
							|  |  |  | 			'COL_SIG_INFO', | 
					
						
							|  |  |  | 			'COL_STATION_CALLSIGN', | 
					
						
							|  |  |  | 			'COL_TIME_ON', | 
					
						
							|  |  |  | 			'COL_DARC_DOK', | 
					
						
							|  |  |  | 			'COL_MY_IOTA_ISLAND_ID', | 
					
						
							|  |  |  | 			'COL_MY_SOTA_REF', | 
					
						
							|  |  |  | 			'COL_MY_VUCC_GRIDS', | 
					
						
							|  |  |  | 			'COL_SOTA_REF', | 
					
						
							|  |  |  | 			'COL_SUBMODE', | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 			'COL_VUCC_GRIDS', | 
					
						
							|  |  |  | 			'COL_CQZ', | 
					
						
							|  |  |  | 			'COL_STATE', | 
					
						
							|  |  |  | 			'COL_COUNTRY', | 
					
						
							|  |  |  | 			'COL_IOTA', | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($requiredKeys as $requiredKey) { | 
					
						
							|  |  |  | 			if (!array_key_exists($requiredKey, $data)) { | 
					
						
							|  |  |  | 				throw new DomainException("Required key $requiredKey does not exist"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->qsoID = $data['COL_PRIMARY_KEY']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->qsoDateTime = DateTime::createFromFormat("Y-m-d H:i:s", $data['COL_TIME_ON'], new DateTimeZone("UTC")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->de = $data['COL_STATION_CALLSIGN']; | 
					
						
							|  |  |  | 		$this->dx = $data['COL_CALL']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->mode = $data['COL_MODE'] ?? ''; | 
					
						
							|  |  |  | 		$this->submode = $data['COL_SUBMODE'] ?? ''; | 
					
						
							|  |  |  | 		$this->band = $data['COL_BAND']; | 
					
						
							|  |  |  | 		$this->bandRX = $data['COL_BAND_RX'] ?? ''; | 
					
						
							|  |  |  | 		$this->rstR = $data['COL_RST_RCVD']; | 
					
						
							|  |  |  | 		$this->rstS = $data['COL_RST_SENT']; | 
					
						
							|  |  |  | 		$this->propagationMode = $data['COL_PROP_MODE'] ?? ''; | 
					
						
							|  |  |  | 		$this->satelliteMode = $data['COL_SAT_MODE'] ?? ''; | 
					
						
							|  |  |  | 		$this->satelliteName = $data['COL_SAT_NAME'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->name = $data['COL_NAME'] ?? ''; | 
					
						
							|  |  |  | 		$this->email = $data['COL_EMAIL'] ?? ''; | 
					
						
							|  |  |  | 		$this->address = $data['COL_ADDRESS'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->deGridsquare = $data['COL_MY_GRIDSQUARE'] ?? ''; | 
					
						
							|  |  |  | 		$this->deIOTA = $data['COL_MY_IOTA'] ?? ''; | 
					
						
							|  |  |  | 		$this->deSig = $data['COL_MY_SIG'] ?? ''; | 
					
						
							|  |  |  | 		$this->deSigInfo = $data['COL_MY_SIG_INFO'] ?? ''; | 
					
						
							|  |  |  | 		$this->deIOTAIslandID = $data['COL_MY_IOTA_ISLAND_ID'] ?? ''; | 
					
						
							|  |  |  | 		$this->deSOTAReference = $data['COL_MY_SOTA_REF'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->deVUCCGridsquares = ($data['COL_MY_VUCC_GRIDS'] === null) ? [] : explode(",", $data['COL_MY_VUCC_GRIDS'] ?? ''); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->dxGridsquare = $data['COL_GRIDSQUARE'] ?? ''; | 
					
						
							|  |  |  | 		$this->dxIOTA = $data['COL_IOTA'] ?? ''; | 
					
						
							|  |  |  | 		$this->dxSig = $data['COL_SIG'] ?? ''; | 
					
						
							|  |  |  | 		$this->dxSigInfo = $data['COL_SIG_INFO'] ?? ''; | 
					
						
							|  |  |  | 		$this->dxDARCDOK = $data['COL_DARC_DOK'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->dxSOTAReference = $data['COL_SOTA_REF'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->dxVUCCGridsquares = ($data['COL_VUCC_GRIDS'] === null) ? [] : explode(",", $data['COL_VUCC_GRIDS'] ?? ''); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->QSLMsg = $data['COL_QSLMSG'] ?? ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->QSLReceivedDate = ($data['COL_QSLRDATE'] === null) ? null : DateTime::createFromFormat("Y-m-d H:i:s", $data['COL_QSLRDATE'], new DateTimeZone('UTC')); | 
					
						
							|  |  |  | 		$this->QSLReceived = ($data['COL_QSL_RCVD'] === null) ? '' : $data['COL_QSL_RCVD']; | 
					
						
							|  |  |  | 		$this->QSLReceivedVia = ($data['COL_QSL_RCVD_VIA'] === null) ? '' : $data['COL_QSL_RCVD_VIA']; | 
					
						
							|  |  |  | 		$this->QSLSentDate = ($data['COL_QSLSDATE'] === null) ? null : DateTime::createFromFormat("Y-m-d H:i:s", $data['COL_QSLSDATE'], new DateTimeZone('UTC')); | 
					
						
							|  |  |  | 		$this->QSLSent = ($data['COL_QSL_SENT'] === null) ? '' : $data['COL_QSL_SENT']; | 
					
						
							|  |  |  | 		$this->QSLSentVia = ($data['COL_QSL_SENT_VIA'] === null) ? '' : $data['COL_QSL_SENT_VIA']; | 
					
						
							|  |  |  | 		$this->QSLVia = ($data['COL_QSL_VIA'] === null) ? '' : $data['COL_QSL_VIA']; | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-20 01:20:55 +08:00
										 |  |  | 		$this->cqzone = ($data['COL_CQZ'] === null) ? '' : $data['COL_CQZ']; | 
					
						
							|  |  |  | 		$this->state = ($data['COL_STATE'] === null) ? '' :$data['COL_STATE']; | 
					
						
							|  |  |  | 		$this->dxcc = ($data['COL_COUNTRY'] === null) ? '' :$data['COL_COUNTRY']; | 
					
						
							|  |  |  | 		$this->iota = ($data['COL_IOTA'] === null) ? '' :$data['COL_IOTA']; | 
					
						
							| 
									
										
										
										
											2023-04-27 22:00:02 +08:00
										 |  |  | 		if (array_key_exists('end', $data)) { | 
					
						
							|  |  |  | 			$this->end = ($data['end'] === null) ? null : DateTime::createFromFormat("Y-m-d", $data['end'], new DateTimeZone('UTC')); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$this->end = null; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQsoID(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->qsoID; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return DateTime | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQsoDateTime(): DateTime | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->qsoDateTime; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDe(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->de; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDx(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dx; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getMode(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->mode; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getSubmode(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->submode; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getBand(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->band; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getBandRX(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->bandRX; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getRstR(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->rstR; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getRstS(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->rstS; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getPropagationMode(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->propagationMode; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getSatelliteMode(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->satelliteMode; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getSatelliteName(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->satelliteName; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getName(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->name; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getEmail(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->email; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getAddress(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->address; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeGridsquare(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deGridsquare; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeIOTA(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deIOTA; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeSig(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deSig; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeSigInfo(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deSigInfo; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeIOTAIslandID(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deIOTAIslandID; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeSOTAReference(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deSOTAReference; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string[] | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDeVUCCGridsquares(): array | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->deVUCCGridsquares; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxGridsquare(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxGridsquare; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxIOTA(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxIOTA; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxSig(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxSig; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxSigInfo(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxSigInfo; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxDARCDOK(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxDARCDOK; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxSOTAReference(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxSOTAReference; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string[] | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getDxVUCCGridsquares(): array | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxVUCCGridsquares; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLMsg(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLMsg; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return ?DateTime | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLReceivedDate(): ?DateTime | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLReceivedDate; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLReceived(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLReceived; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLReceivedVia(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLReceivedVia; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return ?DateTime | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLSentDate(): ?DateTime | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLSentDate; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLSent(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLSent; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLSentVia(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLSentVia; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @return string | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getQSLVia(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->QSLVia; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 	public function getDXCC(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->dxcc; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getCqzone(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->cqzone; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getState(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->state; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function getIOTA(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return $this->iota; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 	public function toArray(): array | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return [ | 
					
						
							|  |  |  | 			'qsoID' => $this->qsoID, | 
					
						
							|  |  |  | 			'qsoDateTime' => $this->qsoDateTime->format("Y-m-d H:i"), | 
					
						
							|  |  |  | 			'de' => $this->de, | 
					
						
							|  |  |  | 			'dx' => $this->dx, | 
					
						
							|  |  |  | 			'mode' => $this->getFormattedMode(), | 
					
						
							|  |  |  | 			'rstS' => $this->rstS, | 
					
						
							|  |  |  | 			'rstR' => $this->rstR, | 
					
						
							|  |  |  | 			'band' => $this->getFormattedBand(), | 
					
						
							|  |  |  | 			'deRefs' => $this->getFormattedDeRefs(), | 
					
						
							|  |  |  | 			'dxRefs' => $this->getFormattedDxRefs(), | 
					
						
							|  |  |  | 			'qslVia' => $this->QSLVia, | 
					
						
							|  |  |  | 			'qslSent' => $this->getFormattedQSLSent(), | 
					
						
							|  |  |  | 			'qslReceived' => $this->getFormattedQSLReceived(), | 
					
						
							|  |  |  | 			'qslMessage' => $this->getQSLMsg(), | 
					
						
							|  |  |  | 			'name' => $this->getName(), | 
					
						
							| 
									
										
										
										
											2022-12-19 02:50:54 +08:00
										 |  |  | 			'dxcc' => $this->getDXCC(), | 
					
						
							|  |  |  | 			'state' => $this->getState(), | 
					
						
							|  |  |  | 			'cqzone' => $this->getCqzone(), | 
					
						
							|  |  |  | 			'iota' => $this->getIOTA(), | 
					
						
							| 
									
										
										
										
											2023-04-27 22:00:02 +08:00
										 |  |  | 			'end' => $this->end === null ? null : $this->end->format("Y-m-d"), | 
					
						
							| 
									
										
										
										
											2022-12-18 23:49:54 +08:00
										 |  |  | 		]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedMode(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if ($this->submode !== '') { | 
					
						
							|  |  |  | 			return $this->submode; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return $this->mode; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedBand(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$label = ""; | 
					
						
							|  |  |  | 		if ($this->propagationMode !== '') { | 
					
						
							|  |  |  | 			$label .= $this->propagationMode; | 
					
						
							|  |  |  | 			if ($this->satelliteName !== '') { | 
					
						
							|  |  |  | 				$label .= " " . $this->satelliteName; | 
					
						
							|  |  |  | 				if ($this->satelliteMode !== '') { | 
					
						
							|  |  |  | 					$label .= " " . $this->satelliteMode; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$label .= " " . $this->band; | 
					
						
							|  |  |  | 		if ($this->bandRX !== '' && $this->band !== '') { | 
					
						
							|  |  |  | 			$label .= "/" . $this->bandRX; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return trim($label); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedDeRefs(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$refs = []; | 
					
						
							|  |  |  | 		if ($this->deVUCCGridsquares !== []) { | 
					
						
							|  |  |  | 			$refs[] = implode(",", $this->deVUCCGridsquares); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			if ($this->deGridsquare !== '') { | 
					
						
							|  |  |  | 				$refs[] = $this->deGridsquare; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->deIOTA !== '') { | 
					
						
							|  |  |  | 			if ($this->deIOTAIslandID !== '') { | 
					
						
							|  |  |  | 				$refs[] = "IOTA:" . $this->deIOTA . "(" . $this->deIOTAIslandID . ")"; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$refs[] = "IOTA:" . $this->deIOTA; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->deSOTAReference !== '') { | 
					
						
							|  |  |  | 			$refs[] = "SOTA:" . $this->deSOTAReference; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->deSig !== '') { | 
					
						
							|  |  |  | 			$refs[] = $this->deSig . ":" . $this->deSigInfo; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return trim(implode(" ", $refs)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedDxRefs(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$refs = []; | 
					
						
							|  |  |  | 		if ($this->dxVUCCGridsquares !== []) { | 
					
						
							|  |  |  | 			$refs[] = implode(",", $this->dxVUCCGridsquares); | 
					
						
							|  |  |  | 		} else if ($this->dxGridsquare !== '') { | 
					
						
							|  |  |  | 			$refs[] = $this->dxGridsquare; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->dxSOTAReference !== '') { | 
					
						
							|  |  |  | 			$refs[] = "SOTA:" . $this->dxSOTAReference; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->dxSig !== '') { | 
					
						
							|  |  |  | 			$refs[] = $this->dxSig . ":" . $this->dxSigInfo; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->dxDARCDOK !== '') { | 
					
						
							|  |  |  | 			$refs[] = "DOK:" . $this->dxDARCDOK; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return implode(" ", $refs); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedQSLSent(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$showVia = false; | 
					
						
							|  |  |  | 		$label = []; | 
					
						
							|  |  |  | 		if ($this->QSLSent === "Y") { | 
					
						
							|  |  |  | 			if ($this->QSLSentDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLSentDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$label[] = "Yes"; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} else if ($this->QSLSent === "N") { | 
					
						
							|  |  |  | 			$label[] = "No"; | 
					
						
							|  |  |  | 		} else if ($this->QSLSent === "Q") { | 
					
						
							|  |  |  | 			$label[] = "Queued"; | 
					
						
							|  |  |  | 			if ($this->QSLSentDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLSentDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} else if ($this->QSLSent === "R") { | 
					
						
							|  |  |  | 			$label[] = "Requested"; | 
					
						
							|  |  |  | 			if ($this->QSLSentDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLSentDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($showVia && $this->QSLSentVia !== '') { | 
					
						
							|  |  |  | 			switch ($this->QSLSentVia) { | 
					
						
							|  |  |  | 				case 'B': | 
					
						
							|  |  |  | 					$label[] = "Bureau"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'D': | 
					
						
							|  |  |  | 					$label[] = "Direct"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'E': | 
					
						
							|  |  |  | 					$label[] = "Electronic"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'M': | 
					
						
							|  |  |  | 					$label[] = "Manager"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return trim(implode(" ", $label)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	private function getFormattedQSLReceived(): string | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		$showVia = false; | 
					
						
							|  |  |  | 		$label = []; | 
					
						
							|  |  |  | 		if ($this->QSLReceived === "Y") { | 
					
						
							|  |  |  | 			if ($this->QSLReceivedDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLReceivedDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$label[] = "Yes"; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} else if ($this->QSLReceived === "N") { | 
					
						
							|  |  |  | 			$label[] = "No"; | 
					
						
							|  |  |  | 		} else if ($this->QSLReceived === "Q") { | 
					
						
							|  |  |  | 			$label[] = "Queued"; | 
					
						
							|  |  |  | 			if ($this->QSLReceivedDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLReceivedDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} else if ($this->QSLReceived === "R") { | 
					
						
							|  |  |  | 			$label[] = "Requested"; | 
					
						
							|  |  |  | 			if ($this->QSLReceivedDate !== null) { | 
					
						
							|  |  |  | 				$label[] = $this->QSLReceivedDate->format("Y-m-d"); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			$showVia = true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($showVia && $this->QSLReceivedVia !== '') { | 
					
						
							|  |  |  | 			switch ($this->QSLReceivedVia) { | 
					
						
							|  |  |  | 				case 'B': | 
					
						
							|  |  |  | 					$label[] = "Bureau"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'D': | 
					
						
							|  |  |  | 					$label[] = "Direct"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'E': | 
					
						
							|  |  |  | 					$label[] = "Electronic"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				case 'M': | 
					
						
							|  |  |  | 					$label[] = "Manager"; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return trim(implode(" ", $label)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |