Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
055d902
Fix: Adjust event stats after order cancellation (#729)
daveearley Aug 28, 2025
b6bdb65
Fix custom branding logos (#745)
creativeindustriesgroup Aug 31, 2025
14e1562
Add order level questions and answers to Attendee Export. (#719)
sundeepnarang Aug 31, 2025
759ae6c
Feature: Customer event emails (#748)
daveearley Aug 31, 2025
ea53081
Logout doesnt wait for api call, refirects to login and fails to logo…
sundeepnarang Aug 31, 2025
b5c2a8f
Require Stripe account to enable messaging (#749)
daveearley Aug 31, 2025
a2a6d14
Support multiple stripe platforms (#750)
daveearley Sep 2, 2025
90e0b48
Add support for 2D barcode scanners in check-in app (#751)
daveearley Sep 2, 2025
16dc0ed
Require Stripe account to enable messaging (#752)
daveearley Sep 2, 2025
24e8a2f
Fix height of collapses products on event page (#756)
daveearley Sep 4, 2025
aa9a107
Fix attendee name validation (#755)
daveearley Sep 4, 2025
5bc7034
Ignore taxes and fees for free orders (#754)
daveearley Sep 4, 2025
b0bcb86
Feature: Ticket Designer (Ticket branding, logo and disclaimer suppor…
daveearley Oct 1, 2025
5a70de0
Feature: Stripe migration (#805)
daveearley Oct 9, 2025
a47db64
Translation: Add Turkish locales (#679)
Ardakilic Oct 9, 2025
f29db91
Fix: Organizer homepage UI tweaks (#806)
daveearley Oct 10, 2025
1060882
Fix: Organizer contact form for logged out users (#807)
daveearley Oct 10, 2025
c3056c5
Fix: Events for other organizers not showing (#808)
daveearley Oct 10, 2025
e600711
Email template updates (#824)
daveearley Oct 15, 2025
57d7f17
Feature: Improve Docker image tagging (#825)
daveearley Oct 15, 2025
3c28546
Fix: Unable to re-assign orders on sold out events (#826)
daveearley Oct 15, 2025
4bc73c1
Merge branch 'develop' into v1.2.0-alpha.1
daveearley Oct 15, 2025
b01d918
Fix duplicating ticket logo (#827)
daveearley Oct 15, 2025
ab6074b
Fix duplicating ticket logo (#829)
daveearley Oct 15, 2025
d0f09ec
UTM updates (#830)
daveearley Oct 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/post-release-push-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ jobs:
push_to_registry:
name: Push Docker images to Docker Hub
runs-on: ubuntu-latest

steps:
- name: Check out the repo
uses: actions/checkout@v4
Expand All @@ -28,6 +29,9 @@ jobs:
uses: docker/metadata-action@v3
with:
images: daveearley/hi.events-all-in-one
tags: |
type=ref,event=tag
type=raw,value=latest,enable=${{ github.event.release.prerelease == false }}

- name: Build and push All-in-one Docker image
uses: docker/build-push-action@v3
Expand All @@ -44,6 +48,9 @@ jobs:
uses: docker/metadata-action@v3
with:
images: daveearley/hi.events-backend
tags: |
type=ref,event=tag
type=raw,value=latest,enable=${{ github.event.release.prerelease == false }}

- name: Build and push Backend Docker image
uses: docker/build-push-action@v3
Expand All @@ -60,6 +67,9 @@ jobs:
uses: docker/metadata-action@v3
with:
images: daveearley/hi.events-frontend
tags: |
type=ref,event=tag
type=raw,value=latest,enable=${{ github.event.release.prerelease == false }}

- name: Build and push Frontend Docker image
uses: docker/build-push-action@v3
Expand Down
69 changes: 69 additions & 0 deletions backend/app/DomainObjects/AccountDomainObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@
namespace HiEvents\DomainObjects;

use HiEvents\DomainObjects\DTO\AccountApplicationFeeDTO;
use HiEvents\DomainObjects\Enums\StripePlatform;
use Illuminate\Support\Collection;

class AccountDomainObject extends Generated\AccountDomainObjectAbstract
{
private ?AccountConfigurationDomainObject $configuration = null;

/** @var Collection<int, AccountStripePlatformDomainObject>|null */
private ?Collection $stripePlatforms = null;

public function getApplicationFee(): AccountApplicationFeeDTO
{
/** @var AccountConfigurationDomainObject $applicationFee */
Expand All @@ -28,4 +33,68 @@ public function setConfiguration(AccountConfigurationDomainObject $configuration
{
$this->configuration = $configuration;
}

public function getAccountStripePlatforms(): ?Collection
{
return $this->stripePlatforms;
}

public function setAccountStripePlatforms(Collection $stripePlatforms): void
{
$this->stripePlatforms = $stripePlatforms;
}

/**
* Get the primary active Stripe platform for this account
* Returns the platform with setup completed, preferring the most recent
*/
public function getPrimaryStripePlatform(): ?AccountStripePlatformDomainObject
{
if (!$this->stripePlatforms || $this->stripePlatforms->isEmpty()) {
return null;
}

return $this->stripePlatforms
->filter(fn($platform) => $platform->getStripeSetupCompletedAt() !== null)
->sortByDesc(fn($platform) => $platform->getCreatedAt())
->first();
}

/**
* Get the Stripe platform for a specific platform type
* Handles null platform for open-source installations
*/
public function getStripePlatformByType(?StripePlatform $platformType): ?AccountStripePlatformDomainObject
{
if (!$this->stripePlatforms || $this->stripePlatforms->isEmpty()) {
return null;
}

return $this->stripePlatforms
->filter(fn($platform) => $platform->getStripeConnectPlatform() === $platformType?->value)
->first();
}

public function getActiveStripeAccountId(): ?string
{
return $this->getPrimaryStripePlatform()?->getStripeAccountId();
}

public function getActiveStripePlatform(): ?StripePlatform
{
$primaryPlatform = $this->getPrimaryStripePlatform();
if (!$primaryPlatform || !$primaryPlatform->getStripeConnectPlatform()) {
return null;
}

return StripePlatform::fromString($primaryPlatform->getStripeConnectPlatform());
}

/**
* Check if Stripe is set up and ready for payments
*/
public function isStripeSetupComplete(): bool
{
return $this->getPrimaryStripePlatform() !== null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace HiEvents\DomainObjects;

class AccountStripePlatformDomainObject extends Generated\AccountStripePlatformDomainObjectAbstract
{
}
7 changes: 7 additions & 0 deletions backend/app/DomainObjects/EmailTemplateDomainObject.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace HiEvents\DomainObjects;

class EmailTemplateDomainObject extends Generated\EmailTemplateDomainObjectAbstract
{
}
19 changes: 19 additions & 0 deletions backend/app/DomainObjects/Enums/EmailTemplateEngine.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace HiEvents\DomainObjects\Enums;

enum EmailTemplateEngine: string
{
use BaseEnum;

case LIQUID = 'liquid';
case BLADE = 'blade'; // For future use

public function label(): string
{
return match ($this) {
self::LIQUID => __('Liquid'),
self::BLADE => __('Blade'),
};
}
}
27 changes: 27 additions & 0 deletions backend/app/DomainObjects/Enums/EmailTemplateType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace HiEvents\DomainObjects\Enums;

enum EmailTemplateType: string
{
use BaseEnum;

case ORDER_CONFIRMATION = 'order_confirmation';
case ATTENDEE_TICKET = 'attendee_ticket';

public function label(): string
{
return match ($this) {
self::ORDER_CONFIRMATION => __('Order Confirmation'),
self::ATTENDEE_TICKET => __('Attendee Ticket'),
};
}

public function description(): string
{
return match ($this) {
self::ORDER_CONFIRMATION => __('Sent to the customer after placing an order'),
self::ATTENDEE_TICKET => __('Sent to each attendee with their ticket'),
};
}
}
3 changes: 3 additions & 0 deletions backend/app/DomainObjects/Enums/ImageType.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ enum ImageType

// Event images
case EVENT_COVER;
case TICKET_LOGO;

// Organizer images
case ORGANIZER_LOGO;
Expand All @@ -24,6 +25,7 @@ public static function eventImageTypes(): array
{
return [
self::EVENT_COVER,
self::TICKET_LOGO,
];
}

Expand All @@ -47,6 +49,7 @@ public static function getMinimumDimensionsMap(ImageType $imageType): array
$map = [
self::GENERIC->name => [50, 50],
self::EVENT_COVER->name => [600, 50],
self::TICKET_LOGO->name => [100, 100],
self::ORGANIZER_LOGO->name => [100, 100],
self::ORGANIZER_COVER->name => [600, 50],
];
Expand Down
28 changes: 28 additions & 0 deletions backend/app/DomainObjects/Enums/StripePlatform.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace HiEvents\DomainObjects\Enums;

enum StripePlatform: string
{
case CANADA = 'ca';
case IRELAND = 'ie';

public static function fromString(?string $value): ?self
{
if ($value === null) {
return null;
}

return self::tryFrom($value);
}

public function toString(): string
{
return $this->value;
}

public static function getAllValues(): array
{
return array_column(self::cases(), 'value');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ abstract class AccountDomainObjectAbstract extends \HiEvents\DomainObjects\Abstr
final public const DELETED_AT = 'deleted_at';
final public const NAME = 'name';
final public const EMAIL = 'email';
final public const STRIPE_ACCOUNT_ID = 'stripe_account_id';
final public const SHORT_ID = 'short_id';
final public const STRIPE_CONNECT_SETUP_COMPLETE = 'stripe_connect_setup_complete';
final public const ACCOUNT_VERIFIED_AT = 'account_verified_at';
final public const STRIPE_CONNECT_ACCOUNT_TYPE = 'stripe_connect_account_type';
final public const IS_MANUALLY_VERIFIED = 'is_manually_verified';

protected int $id;
Expand All @@ -35,11 +32,8 @@ abstract class AccountDomainObjectAbstract extends \HiEvents\DomainObjects\Abstr
protected ?string $deleted_at = null;
protected string $name;
protected string $email;
protected ?string $stripe_account_id = null;
protected string $short_id;
protected ?bool $stripe_connect_setup_complete = false;
protected ?string $account_verified_at = null;
protected ?string $stripe_connect_account_type = null;
protected bool $is_manually_verified = false;

public function toArray(): array
Expand All @@ -54,11 +48,8 @@ public function toArray(): array
'deleted_at' => $this->deleted_at ?? null,
'name' => $this->name ?? null,
'email' => $this->email ?? null,
'stripe_account_id' => $this->stripe_account_id ?? null,
'short_id' => $this->short_id ?? null,
'stripe_connect_setup_complete' => $this->stripe_connect_setup_complete ?? null,
'account_verified_at' => $this->account_verified_at ?? null,
'stripe_connect_account_type' => $this->stripe_connect_account_type ?? null,
'is_manually_verified' => $this->is_manually_verified ?? null,
];
}
Expand Down Expand Up @@ -162,17 +153,6 @@ public function getEmail(): string
return $this->email;
}

public function setStripeAccountId(?string $stripe_account_id): self
{
$this->stripe_account_id = $stripe_account_id;
return $this;
}

public function getStripeAccountId(): ?string
{
return $this->stripe_account_id;
}

public function setShortId(string $short_id): self
{
$this->short_id = $short_id;
Expand All @@ -184,17 +164,6 @@ public function getShortId(): string
return $this->short_id;
}

public function setStripeConnectSetupComplete(?bool $stripe_connect_setup_complete): self
{
$this->stripe_connect_setup_complete = $stripe_connect_setup_complete;
return $this;
}

public function getStripeConnectSetupComplete(): ?bool
{
return $this->stripe_connect_setup_complete;
}

public function setAccountVerifiedAt(?string $account_verified_at): self
{
$this->account_verified_at = $account_verified_at;
Expand All @@ -206,17 +175,6 @@ public function getAccountVerifiedAt(): ?string
return $this->account_verified_at;
}

public function setStripeConnectAccountType(?string $stripe_connect_account_type): self
{
$this->stripe_connect_account_type = $stripe_connect_account_type;
return $this;
}

public function getStripeConnectAccountType(): ?string
{
return $this->stripe_connect_account_type;
}

public function setIsManuallyVerified(bool $is_manually_verified): self
{
$this->is_manually_verified = $is_manually_verified;
Expand Down
Loading
Loading