Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ cd docker/development
- **DO** use `useFormErrorResponseHandler` from `frontend/src/hooks/useFormErrorResponseHandler.tsx` for validation errors
- **DO** handle errors in parent components, not in reusable components

## Git Commit Guidelines

- **NEVER** add `Co-Authored-By: Claude` or any AI attribution lines to commit messages.

## Development Workflows

### Database Changes (in Backend Container)
Expand Down
195 changes: 195 additions & 0 deletions README.el.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
<div align="center">

<img src="https://hievents-public.s3.us-west-1.amazonaws.com/website/github-banner.png?v=1" alt="Hi.Events - Open Source Event Ticketing Platform" width="100%">

# Hi.Events

### Ανοιχτού κώδικα πλατφόρμα διαχείρισης εκδηλώσεων και έκδοσης εισιτηρίων

Πωλήστε εισιτήρια online για συνέδρια, εκδηλώσεις νυχτερινής ζωής, συναυλίες, club nights, εργαστήρια και φεστιβάλ.
Self-hosted ή Cloud. Οι εκδηλώσεις σας, η μάρκα σας, τα δεδομένα σας.

[Δοκιμάστε το Cloud →](https://app.hi.events/auth/register?utm_source=gh-readme) · [Live Demo](https://app.hi.events/event/2/hievents-conference-2030?utm_source=gh-readme) · [Τεκμηρίωση](https://hi.events/docs?utm_source=gh-readme) · [Ιστοσελίδα](https://hi.events?utm_source=gh-readme)

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://github.com/HiEventsDev/Hi.Events/blob/develop/LICENCE)
[![GitHub Release](https://img.shields.io/github/v/release/HiEventsDev/hi.events?include_prereleases)](https://github.com/HiEventsDev/hi.events/releases)
[![Run Unit Tests](https://github.com/HiEventsDev/hi.events/actions/workflows/unit-tests.yml/badge.svg?event=push)](https://github.com/HiEventsDev/hi.events/actions/workflows/unit-tests.yml)
[![Docker Pulls](https://img.shields.io/docker/pulls/daveearley/hi.events-all-in-one)](https://hub.docker.com/r/daveearley/hi.events-all-in-one)

<a href="https://trendshift.io/repositories/10563" target="_blank">
<img src="https://trendshift.io/api/badge/repositories/10563" alt="HiEventsDev%2Fhi.events | Trendshift" width="250" height="55"/>
</a>

<p>
<a href="README.de.md">Deutsch</a> · <a href="README.pt.md">Português</a> · <a href="README.fr.md">Français</a> · <a href="README.it.md">Italiano</a> · <a href="README.nl.md">Nederlands</a> · <a href="README.es.md">Español</a> · <a href="README.zh-cn.md">中文</a> · <a href="README.zh-hk.md">繁體中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.vi.md">Tiếng Việt</a> · <a href="README.tr.md">Türkçe</a> · <a href="README.hu.md">Magyar</a> · <a href="README.pl.md">Polski</a> · <a href="README.el.md">Ελληνικά</a>
</p>

</div>

<br>

## Γιατί Hi.Events;

Οι περισσότερες πλατφόρμες έκδοσης εισιτηρίων χρεώνουν ανά εισιτήριο και κλειδώνουν τα δεδομένα σας στο οικοσύστημά τους. **Το Hi.Events είναι μια σύγχρονη, ανοιχτού κώδικα εναλλακτική για το Eventbrite, το Tickettailor, το Dice.fm και άλλες πλατφόρμες** για διοργανωτές που θέλουν πλήρη έλεγχο πάνω στο branding, το checkout, τα δεδομένα και την υποδομή τους.

Σχεδιασμένο για προωθητές νυχτερινής ζωής, διοργανωτές φεστιβάλ, χώρους εκδηλώσεων, κοινοτικές ομάδες και οικοδεσπότες συνεδρίων.

<br>

<img alt="Hi.Events Dashboard" src="https://hievents-public.s3.us-west-1.amazonaws.com/website/github-screenshot.png"/>

<br>

## Δυνατότητες

<table>
<tr>
<td width="50%" valign="top">

### 🎟️ Έκδοση Εισιτηρίων & Πωλήσεις

- Ευέλικτοι τύποι εισιτηρίων (δωρεάν, επί πληρωμή, δωρεά, κλιμακωτά)
- Κρυφά και κλειδωμένα εισιτήρια πίσω από κωδικούς προώθησης
- Κωδικοί προώθησης και πρόωρη πρόσβαση
- Πρόσθετα προϊόντα (εμπορεύματα, αναβαθμίσεις, extras)
- Κατηγορίες προϊόντων για οργάνωση
- Πλήρης υποστήριξη φόρων και χρεώσεων (ΦΠΑ, χρεώσεις υπηρεσιών)
- Διαχείριση χωρητικότητας και κοινά όρια

</td>
<td width="50%" valign="top">

### 🎨 Branding & Προσαρμογή

- Όμορφο, βελτιστοποιημένο checkout για μετατροπές
- Προσαρμόσιμα σχέδια εισιτηρίων PDF
- Branded αρχική σελίδα διοργανωτή
- Drag-and-drop δημιουργός σελίδας εκδήλωσης
- Ενσωματώσιμο widget εισιτηρίων
- Εργαλεία SEO (meta tags, Open Graph)

</td>
</tr>
<tr>
<td width="50%" valign="top">

### 👥 Διαχείριση Συμμετεχόντων

- Προσαρμοσμένες ερωτήσεις κατά το checkout
- Σύνθετη αναζήτηση, φιλτράρισμα και εξαγωγή (CSV/XLSX)
- Πλήρεις και μερικές επιστροφές χρημάτων
- Μαζικά μηνύματα ανά τύπο εισιτηρίου
- Check-in με QR code και αρχεία σάρωσης
- Λίστες check-in με έλεγχο πρόσβασης

</td>
<td width="50%" valign="top">

### 📊 Αναλυτικά & Ανάπτυξη

- Πίνακας πωλήσεων σε πραγματικό χρόνο
- Παρακολούθηση συνεργατών και παραπομπών
- Σύνθετες αναφορές (πωλήσεις, φόροι, promos)
- Webhooks (Zapier, Make, CRMs)

</td>
</tr>
<tr>
<td colspan="2" valign="top">

### ⚙️ Λειτουργίες

Ρόλοι και δικαιώματα πολλαπλών χρηστών · Άμεσες πληρωμές Stripe Connect · Μέθοδοι εκτός σύνδεσης πληρωμής · Υποστήριξη εκδηλώσεων εκτός σύνδεσης ·
Αυτόματη τιμολόγηση · Αρχείο εκδηλώσεων · Υποστήριξη πολλαπλών γλωσσών · Πλήρες REST API

</td>
</tr>
</table>

<br>

## Σύγκριση

| Χαρακτηριστικό | Hi.Events | Eventbrite | Tickettailor | Dice |
|:---------------------------------|:----------|:-----------|:-------------|:------------|
| Επιλογή self-hosted | ✅ | ❌ | ❌ | ❌ |
| Ανοιχτός κώδικας | ✅ | ❌ | ❌ | ❌ |
| Χωρίς χρεώσεις ανά εισιτήριο (self-hosted) | ✅ | ❌ | ❌ | ❌ |
| Πλήρες custom branding | ✅ | Περιορισμένο | ✅ | Περιορισμένο |
| Παρακολούθηση συνεργατών | ✅ | ✅ | ❌ | ❌ |
| Πρόσβαση API | ✅ | ✅ | ✅ | Περιορισμένο |
| Δικά σας δεδομένα | ✅ | ❌ | ❌ | ❌ |

<br>

## Γρήγορη Εκκίνηση

### One-Click Deploy

[![Deploy on DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://github.com/HiEventsDev/hi.events-digitalocean)
[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://github.com/HiEventsDev/hi.events-render.com)
[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/8CGKmu?referralCode=KvSr11)
[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/8DIRY6)

### Docker

```bash
git clone git@github.com:HiEventsDev/hi.events.git
cd hi.events/docker/all-in-one

# Δημιουργία κλειδιών (Linux/macOS)
echo "APP_KEY=base64:$(openssl rand -base64 32)" >> .env
echo "JWT_SECRET=$(openssl rand -base64 32)" >> .env

docker compose up -d
```

> [!TIP]
> **Χρήστες Windows:** Δείτε το `./docker/all-in-one/README.md` για οδηγίες δημιουργίας κλειδιών.

Ανοίξτε το `http://localhost:8123` και δημιουργήστε τον λογαριασμό σας.

📖 [Πλήρης οδηγός εγκατάστασης](https://hi.events/docs/getting-started?utm_source=gh-readme)

<br>

## Hi.Events Cloud

Προτιμάτε να μην το φιλοξενείτε μόνοι σας; Το **[Hi.Events Cloud](https://app.hi.events/auth/register?utm_source=gh-readme)** είναι μια πλήρως διαχειριζόμενη επιλογή χωρίς ρύθμιση, με αυτόματες ενημερώσεις και διαχειριζόμενη υποδομή.

[Ξεκινήστε →](https://app.hi.events/auth/register?utm_source=gh-readme)

<br>

## Συνεισφορά

Καλωσορίζουμε συνεισφορές. Δείτε τον [οδηγό συνεισφοράς](CONTRIBUTING.md) για λεπτομέρειες.

<br>

## Υποστήριξη

📖 [Τεκμηρίωση](https://hi.events/docs?utm_source=gh-readme) · 📧 [hello@hi.events](mailto:hello@hi.events) ·
🐛 [GitHub Issues](https://github.com/HiEventsDev/hi.events/issues)

<br>

## Changelog

Μείνετε ενημερωμένοι με νέες δυνατότητες και βελτιώσεις στη [σελίδα εκδόσεων](https://github.com/HiEventsDev/hi.events/releases).

<br>

## Άδεια Χρήσης

Το Hi.Events διαθέτει άδεια χρήσης **AGPL-3.0 με πρόσθετους όρους**. Διαθέσιμη εμπορική αδειοδότηση. [Μάθετε περισσότερα](https://hi.events/licensing).

<br>

<div align="center">

**[Ιστοσελίδα](https://hi.events)** · **[Τεκμηρίωση](https://hi.events/docs)** · **[Twitter/X](https://x.com/HiEventsTickets)**

Made with ☘️ in Ireland

</div>
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Self-hosted or cloud. Your events, your brand, your data.
</a>

<p>
<a href="README.de.md">Deutsch</a> · <a href="README.pt.md">Português</a> · <a href="README.fr.md">Français</a> · <a href="README.it.md">Italiano</a> · <a href="README.nl.md">Nederlands</a> · <a href="README.es.md">Español</a> · <a href="README.zh-cn.md">中文</a> · <a href="README.zh-hk.md">繁體中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.vi.md">Tiếng Việt</a> · <a href="README.tr.md">Türkçe</a> · <a href="README.hu.md">Magyar</a> · <a href="README.pl.md">Polski</a>
<a href="README.de.md">Deutsch</a> · <a href="README.pt.md">Português</a> · <a href="README.fr.md">Français</a> · <a href="README.it.md">Italiano</a> · <a href="README.nl.md">Nederlands</a> · <a href="README.es.md">Español</a> · <a href="README.zh-cn.md">中文</a> · <a href="README.zh-hk.md">繁體中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.vi.md">Tiếng Việt</a> · <a href="README.tr.md">Türkçe</a> · <a href="README.hu.md">Magyar</a> · <a href="README.pl.md">Polski</a> · <a href="README.el.md">Ελληνικά</a>
</p>

</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ abstract class EventSettingDomainObjectAbstract extends \HiEvents\DomainObjects\
final public const TICKET_DESIGN_SETTINGS = 'ticket_design_settings';
final public const ATTENDEE_DETAILS_COLLECTION_METHOD = 'attendee_details_collection_method';
final public const SHOW_MARKETING_OPT_IN = 'show_marketing_opt_in';
final public const ALLOW_COPY_DETAILS_TO_ALL_ATTENDEES = 'allow_copy_details_to_all_attendees';
final public const HOMEPAGE_THEME_SETTINGS = 'homepage_theme_settings';
final public const PASS_PLATFORM_FEE_TO_BUYER = 'pass_platform_fee_to_buyer';
final public const ALLOW_ATTENDEE_SELF_EDIT = 'allow_attendee_self_edit';
Expand Down Expand Up @@ -119,6 +120,7 @@ abstract class EventSettingDomainObjectAbstract extends \HiEvents\DomainObjects\
protected array|string|null $ticket_design_settings = null;
protected string $attendee_details_collection_method = 'PER_TICKET';
protected bool $show_marketing_opt_in = true;
protected bool $allow_copy_details_to_all_attendees = true;
protected array|string|null $homepage_theme_settings = null;
protected bool $pass_platform_fee_to_buyer = false;
protected bool $allow_attendee_self_edit = true;
Expand Down Expand Up @@ -180,6 +182,7 @@ public function toArray(): array
'ticket_design_settings' => $this->ticket_design_settings ?? null,
'attendee_details_collection_method' => $this->attendee_details_collection_method ?? null,
'show_marketing_opt_in' => $this->show_marketing_opt_in ?? null,
'allow_copy_details_to_all_attendees' => $this->allow_copy_details_to_all_attendees ?? null,
'homepage_theme_settings' => $this->homepage_theme_settings ?? null,
'pass_platform_fee_to_buyer' => $this->pass_platform_fee_to_buyer ?? null,
'allow_attendee_self_edit' => $this->allow_attendee_self_edit ?? null,
Expand Down Expand Up @@ -751,6 +754,17 @@ public function getShowMarketingOptIn(): bool
return $this->show_marketing_opt_in;
}

public function setAllowCopyDetailsToAllAttendees(bool $allow_copy_details_to_all_attendees): self
{
$this->allow_copy_details_to_all_attendees = $allow_copy_details_to_all_attendees;
return $this;
}

public function getAllowCopyDetailsToAllAttendees(): bool
{
return $this->allow_copy_details_to_all_attendees;
}

public function setHomepageThemeSettings(array|string|null $homepage_theme_settings): self
{
$this->homepage_theme_settings = $homepage_theme_settings;
Expand Down
11 changes: 6 additions & 5 deletions backend/app/Http/Actions/PromoCodes/GetPromoCodePublic.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@
use HiEvents\DomainObjects\Generated\PromoCodeDomainObjectAbstract;
use HiEvents\Http\Actions\BaseAction;
use HiEvents\Repository\Interfaces\PromoCodeRepositoryInterface;
use HiEvents\Services\Domain\PromoCode\PromoCodeUsageValidationService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class GetPromoCodePublic extends BaseAction
{
private PromoCodeRepositoryInterface $promoCodeRepository;

public function __construct(PromoCodeRepositoryInterface $promoCodeRepository)
public function __construct(
private readonly PromoCodeRepositoryInterface $promoCodeRepository,
private readonly PromoCodeUsageValidationService $promoCodeUsageValidationService,
)
{
$this->promoCodeRepository = $promoCodeRepository;
}

public function __invoke(int $eventId, string $promoCode, Request $request): JsonResponse
Expand All @@ -26,7 +27,7 @@ public function __invoke(int $eventId, string $promoCode, Request $request): Jso
]);

return $this->jsonResponse([
'valid' => $promoCode !== null && $promoCode->isValid(),
'valid' => $this->promoCodeUsageValidationService->isPromoCodeUsable($promoCode),
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ public function rules(): array
// Marketing settings
'show_marketing_opt_in' => ['boolean'],

// Attendee detail copy control
'allow_copy_details_to_all_attendees' => ['boolean'],

// Platform fee settings
'pass_platform_fee_to_buyer' => ['boolean'],

Expand Down
1 change: 1 addition & 0 deletions backend/app/Locale.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ enum Locale: string

case TR = 'tr';
case PL = 'pl';
case EL = 'el';

public static function getSupportedLocales(): array
{
Expand Down
20 changes: 20 additions & 0 deletions backend/app/Repository/Eloquent/OrderRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,26 @@ public function countOrdersAssociatedWithProducts(int $eventId, array $productId
return $count;
}

public function countActivePromoCodeUsage(int $promoCodeId): int
{
$count = $this->model
->where('promo_code_id', $promoCodeId)
->where(static function (Builder $query) {
$query->whereIn('status', [
OrderStatus::COMPLETED->name,
OrderStatus::AWAITING_OFFLINE_PAYMENT->name,
])->orWhere(static function (Builder $reserved) {
$reserved->where('status', OrderStatus::RESERVED->name)
->where('reserved_until', '>', now());
});
})
->count();

$this->resetModel();

return $count;
}

public function getAllOrdersForAdmin(
?string $search = null,
int $perPage = 20,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public function findOrdersAssociatedWithProducts(int $eventId, array $productIds

public function countOrdersAssociatedWithProducts(int $eventId, array $productIds, array $orderStatuses): int;

public function countActivePromoCodeUsage(int $promoCodeId): int;

public function getAllOrdersForAdmin(
?string $search = null,
int $perPage = 20,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public function toArray(Request $request): array
{
return [
'id' => $this->getId(),
'email' => $this->getEmail(),
'first_name' => $this->getFirstName(),
'last_name' => $this->getLastName(),
'public_id' => $this->getPublicId(),
Expand Down
3 changes: 3 additions & 0 deletions backend/app/Resources/Event/EventSettingsResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ public function toArray($request): array
// Marketing settings
'show_marketing_opt_in' => $this->getShowMarketingOptIn(),

// Attendee detail copy control
'allow_copy_details_to_all_attendees' => $this->getAllowCopyDetailsToAllAttendees(),

// Platform fee settings
'pass_platform_fee_to_buyer' => $this->getPassPlatformFeeToBuyer(),

Expand Down
3 changes: 3 additions & 0 deletions backend/app/Resources/Event/EventSettingsResourcePublic.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ public function toArray($request): array
// Marketing settings
'show_marketing_opt_in' => $this->getShowMarketingOptIn(),

// Attendee detail copy control
'allow_copy_details_to_all_attendees' => $this->getAllowCopyDetailsToAllAttendees(),

// Platform fee settings
'pass_platform_fee_to_buyer' => $this->getPassPlatformFeeToBuyer(),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ public function __construct(
// Marketing settings
public readonly bool $show_marketing_opt_in = true,

// Attendee detail copy control
public readonly bool $allow_copy_details_to_all_attendees = true,

// Platform fee settings
public readonly bool $pass_platform_fee_to_buyer = false,

Expand Down Expand Up @@ -158,6 +161,9 @@ public static function createWithDefaults(
// Marketing defaults
show_marketing_opt_in: true,

// Attendee detail copy control default
allow_copy_details_to_all_attendees: true,

// Platform fee defaults
pass_platform_fee_to_buyer: false,

Expand Down
Loading
Loading