Quinta do Cota — Diagrama ER Completo da Base de Dados
USERS
CustomUser
id (PK): AutoField
email: EmailField(unique)
username: CharField(150, unique)
first_name, last_name: CharField(30)
address, address_2: CharField(255)
city: CharField(255)
postal_code: CharField(20)
house_number: CharField(20)
country_code, region_code: CharField(10)
country_name, region_name: CharField(100)
phone: CharField(20)
lang: CharField(5, choices)
is_active, is_staff: BooleanField
date_joined: DateTimeField(auto_now_add)
SHOP
Wine
id (PK): AutoField
product_title(_en): CharField(200)
year: PositiveIntegerField
grapes: CharField(250)
wine_doc(_en): CharField(250)
image_url: ImageField
product_pdf: FileField
product_url: SlugField(unique)
main_desc(_en): TextField
wine_type(_en): CharField(20, choices)
soils_type(_en): CharField(250)
alcohol: CharField(4, choices)
capacity: CharField(4, choices)
show_catalog, show_shop: BooleanField
price, new_price: DecimalField(8,2)
bottles_quantity: PositiveIntegerField
sku: CharField(50, unique)
ShopSettings
id (PK): AutoField
shop_enabled: BooleanField
SHIPPING
ShippingCountry
id (PK): AutoField
name: CharField(100)
code: CharField(10, unique)
ShippingRegion
id (PK): AutoField
country_id (FK→ShippingCountry)
name, code: CharField(100/10)
ShippingOption
id (PK): AutoField
name: CharField(100)
allow_shipping, allow_free_shipping: BooleanField
free_shipping_from: DecimalField(8,2)
countries: ManyToMany(ShippingCountry)
regions: ManyToMany(ShippingRegion)
ShippingBottleRange
id (PK): AutoField
shipping_option_id (FK→ShippingOption)
min_bottles, max_bottles: PositiveIntegerField
price_per_bottle: DecimalField(6,2)
ShippingDetail
id (PK): AutoField
title_pt/en: CharField(200)
description_pt/en: TextField
CHECKOUT
Order
id (PK): AutoField
user_id (FK→CustomUser)
order_code: UUIDField(unique)
order_number: CharField(20, unique)
code: CharField(8), code_expires_at: DateTimeField
billing & shipping address fields
total_amount: DecimalField(10,2)
total_without_discount: DecimalField(10,2)
payment_status: CharField(20, choices)
deliver_status: CharField(20, choices)
stripe_payment_intent_id: CharField(255)
shipping_cost: DecimalField(10,2)
shipping_option_name: CharField(255)
created_at: DateTimeField(auto_now_add)
OrderItem
id (PK): AutoField
order_id (FK→Order)
wine_id (FK→Wine)
product_name: CharField(255)
quantity: PositiveIntegerField
price, new_price: DecimalField(10,2)
deliver_status: CharField(20)
NEWSLETTER
Subscriber
id (PK): AutoField
email: EmailField(unique)
language: CharField(2, choices)
is_active: BooleanField, subscribed_at: DateTimeField
Newsletter
id (PK): AutoField
title, subject: CharField(255)
body_html: TextField
language: CharField(2)
created_at, updated_at: DateTimeField
CONTACT
ContactFormMessage
id (PK): AutoField
first_name, last_name: CharField(100)
email: EmailField, phone: CharField(50)
subject: CharField(150)
message: TextField
recaptcha_lang: CharField(5), created_at: DateTimeField
FK → Subscriber
1 → N
M2M
1 → N
info