== ER дијаграм [[Image(ERModel_v3.png)]] == Податочни барања === Ентитети 1. ** User** - Ентитет што ги претставува корисниците на системот * user_id – primary key(примарен клуч) * full_name – varchar (задолжителен атрибут) * email – varchar (задолжителен атрибут) * phone – varchar (задолжителен атрибут) * created_at – datetime (задолжителен атрибут) * password_hash – text (задолжителен атрибут) 2. **Role** - Ентитет што ги претставува улогите што корисниците можат да ги имаат во системот * role_id – primary key(примарен клуч) * name – varchar (задолжителен атрибут) 3. **Review** - Ентитет што ги претставува рецензиите дадени од корисниците * review_id – primary key (примарен клуч) * rating – int (задолжителен атрибут) * comment – text (опционален атрибут) * created_at – datetime (задолжителен атрибут) * payment_id – int (задолжителен атрибут) 4. **Service** - Ентитет што ги претставува услугите што ги нуди салонот * service_id – primary key (примарен клуч) * name – varchar (задолжителен атрибут) * price – decimal (задолжителен атрибут) * duration_minutes – int (задолжителен атрибут) * category_id – int (задолжителен атрибут) 5. **Category** - Ентитет што ги претставува категориите на услуги * category_id – primary key(примарен клуч) * name – varchar (задолжителен атрибут) 6. **Package** - Ентитет што ги претставува пакетите на услуги што ги нуди салонот * package_id – primary key(примарен клуч) * name – varchar (задолжителен атрибут) * max_usage – int (задолжителен атрибут) * total_price – decimal (задолжителен атрибут) 7. **Appointment** - Ентитет што ги претставува закажаните термини на корисниците * appointment_id – primary key (примарен клуч) * appointment_time – datetime (задолжителен атрибут) * end_time – datetime (задолжителен атрибут) * notes – text (опционален атрибут) * type – enum('pre-booked','walk-in') (задолжителен атрибут) * total_price – decimal (задолжителен атрибут) * user_id – int (задолжителен атрибут) * status_id – int (задолжителен атрибут) * points_awarded – boolean (задолжителен атрибут) 8. **Status** - Ентитет што ги претставува можните статуси на термините * status_id – primary key(примарен клуч) * name – varchar (задолжителен атрибут) * user_id – int (задолжителен атрибут) 9. **LoyaltyCard** - Ентитет што ги претставува картичките за лојалност на корисниците * card_id – primary key(примарен клуч) * points – int (задолжителен атрибут) 10. **Payment** - Ентитет што ги претставува плаќањата направени од корисниците * payment_id – primary key(примарен клуч) * amount – decimal (задолжителен атрибут) * method – varchar (задолжителен атрибут) * timestamp – datetime (задолжителен атрибут) * status – varchar (задолжителен атрибут) * points_used – int (задолжителен атрибут) * appointment_id – int (опционален атрибут) * package_purchase_id – int (опционален атрибут) 11. **UserPackagePurchase** - Ентитет што ги претставува купените пакети по корисник * purchase_id – primary key (примарен клуч) * user_id – int (задолжителен атрибут) * package_id – int (задолжителен атрибут) * purchased_at – datetime (задолжителен атрибут) * total_uses – int (задолжителен атрибут) * remaining_uses – int (задолжителен атрибут) * status – varchar/text (задолжителен атрибут) * expires_at – date (опционален атрибут) 12. **AppointmentPackageUsage** - Ентитет што евидентира користење пакет за термин * appointment_id – primary key (примарен клуч, истовремено FK) * purchase_id – int (задолжителен атрибут) * service_id – int (задолжителен атрибут) * used_units – int (задолжителен атрибут) * finalized_at – datetime (опционален атрибут) 13. **Availability** - Ентитет што ги претставува временските прозорци за достапност * availability_id – primary key (примарен клуч) * date – date (задолжителен атрибут) * start_time – time (задолжителен атрибут) * end_time – time (задолжителен атрибут) * is_closed – boolean (задолжителен атрибут) === Релации **1. UserRole – M:N релација помеѓу User и Role** Еден корисник може да има повеќе улоги, и една улога може да биде доделена на повеќе корисници. Оваа релација овозможува флексибилен систем за управување со дозволи. **2. ReviewPayment – 1:0..1 релација помеѓу Review и Payment** Секој Review е поврзан со точно еден Payment, а еден Payment може да има најмногу еден Review. На овој начин, само корисници со извршено плаќање можат да остават рецензија. **3. ServiceCategory – N:1 релација помеѓу Service и Category** Повеќе услуги можат да припаѓаат на иста категорија, но секоја услуга припаѓа на точно една категорија. Оваа релација ги организира услугите по категории. **4. PackageService – M:N релација помеѓу Package и Service** Еден пакет може да содржи повеќе услуги, и една услуга може да биде дел од повеќе пакети. Оваа релација овозможува креирање на промотивни пакети со попуст. **5. UserAppointment – 1:N релација помеѓу User и Appointment** Еден корисник може да има повеќе термини, но еден термин припаѓа на точно еден корисник. Оваа релација ги следи закажаните термини на секој корисник. **6. AppointmentService – M:N релација помеѓу Appointment и Service** Еден термин може да вклучува повеќе услуги, и една услуга може да биде дел од повеќе термини. Оваа релација овозможува флексибилно закажување на комбинирани услуги. **7. AppointmentStatus – N:1 релација помеѓу Appointment и Status** Повеќе термини можат да имаат ист статус, но секој термин има точно еден статус. Оваа релација го следи статусот на термините. **8. UserLoyaltyCard – 0..1:1 релација помеѓу User и LoyaltyCard** Еден корисник може да има најмногу една картичка за лојалност, а секоја картичка за лојалност припаѓа на точно еден корисник. Оваа релација овозможува систем за поени и награди. **9. AppointmentPayment – 0..N:0..1 релација помеѓу Appointment и Payment** Еден термин може да има повеќе плаќања поврзани со него, а едно плаќање се однесува на најмногу еден термин. Релацијата е опционална на двете страни бидејќи дел од плаќањата се за купување пакет. **10. UserPurchase – 1:N релација помеѓу User и UserPackagePurchase** Еден корисник може да купи повеќе пакети, но секое купување на пакет припаѓа на точно еден корисник. **11. PurchasePackage – N:1 релација помеѓу UserPackagePurchase и Package** Повеќе кориснички купувања можат да се однесуваат на ист пакет, но секое купување се однесува на точно еден пакет. **12. PackagePayment – 0..N:0..1 релација помеѓу UserPackagePurchase и Payment** Едно купување на пакет може да има повеќе плаќања (обиди/трансакции), а едно плаќање може да се однесува на најмногу едно купување на пакет. **13. AppointmentUsage – 0..1:1 релација помеѓу Appointment и AppointmentPackageUsage** Еден термин може да има најмногу едно евидентирано користење пакет, а секоја евиденција за користење пакет припаѓа на точно еден термин. **14. ServiceUsage – N:1 релација помеѓу AppointmentPackageUsage и Service** Повеќе записи за користење пакет можат да се однесуваат на иста услуга, но секој запис се однесува на точно една услуга. **15. PurchaseUsage – N:1 релација помеѓу AppointmentPackageUsage и UserPackagePurchase** Повеќе записи за користење пакет можат да се однесуваат на исто корисничко купување пакет, но секој запис се однесува на точно едно купување. Забелешка: Availability во тековната шема нема директна FK релација со други табели, се користи како правило за валидација на временски прозорци за термини.