374 lines
13 KiB
Python
374 lines
13 KiB
Python
import flet as ft
|
|
from dbActions.orders import Orders
|
|
from dbActions.users import Users
|
|
from dbActions.products import Products
|
|
from helpers.default_user import DefaultUser
|
|
|
|
class OrdersPage:
|
|
def __init__(self, page: ft.Page):
|
|
self.page = page
|
|
self.orders = Orders()
|
|
self.users = Users()
|
|
self.products = Products()
|
|
self.selected_user = None
|
|
self.selected_order = None
|
|
self.selected_order_products = None
|
|
self.original_status = None
|
|
self.customer_email = None
|
|
self.default_user = DefaultUser(self.page)
|
|
self.header = ft.Row(
|
|
[
|
|
ft.Text(
|
|
"Comenzi",
|
|
weight=ft.FontWeight.BOLD,
|
|
size=18
|
|
),
|
|
],
|
|
alignment=ft.MainAxisAlignment.START
|
|
)
|
|
self.all_orders = self.orders.get_orders()
|
|
self.all_orders = self.all_orders[::-1]
|
|
self.oll_orders_list = ft.ListView(
|
|
controls=self.create_list(self.all_orders, self.on_order_click),
|
|
spacing=10,
|
|
expand=3,
|
|
height=700
|
|
)
|
|
self.fileters = ft.RadioGroup(
|
|
content=ft.Row(
|
|
[
|
|
ft.Radio(value="on_hold", label="In asteptare"),
|
|
ft.Radio(value="new", label="Noua"),
|
|
ft.Radio(value="in_progress", label="In lucru"),
|
|
ft.Radio(value="completed", label="Complete"),
|
|
ft.Radio(value="all", label="Toate")
|
|
]
|
|
),
|
|
on_change=self.on_filter_change
|
|
)
|
|
self.name = ft.Text()
|
|
self.email = ft.Text()
|
|
self.phone = ft.Text()
|
|
self.address = ft.Text()
|
|
self.total_pay = ft.Text(weight=ft.FontWeight.BOLD)
|
|
self.products_column = ft.Column([])
|
|
self.status = ft.Text()
|
|
self.buttons_state = ft.RadioGroup(
|
|
content=ft.Row(
|
|
[
|
|
ft.Radio(value="on_hold", label="In asteptare"),
|
|
ft.Radio(value="new", label="Noua"),
|
|
ft.Radio(value="in_progress", label="In lucru"),
|
|
ft.Radio(value="completed", label="Complete"),
|
|
],
|
|
),
|
|
on_change=self.on_radio_value_change
|
|
)
|
|
self.total_row = ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="Total platit",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.total_pay
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
)
|
|
|
|
self.order_details = ft.Column(
|
|
[
|
|
ft.Text(
|
|
value="Detalii utilizator",
|
|
weight=ft.FontWeight.BOLD,
|
|
size=18
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="Nume si prenume",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.name
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="E-mail",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.email
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="Telefon",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.phone
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="Adresa",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.address
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value="Status",
|
|
weight=ft.FontWeight.BOLD,
|
|
),
|
|
self.status,
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
),
|
|
self.total_row,
|
|
ft.Divider(),
|
|
ft.Text(
|
|
value="Produse",
|
|
weight=ft.FontWeight.BOLD,
|
|
size=18
|
|
),
|
|
self.products_column,
|
|
ft.Divider(),
|
|
self.buttons_state
|
|
],
|
|
expand=True
|
|
)
|
|
|
|
self.order_details_placeholder = ft.Container(
|
|
expand=7,
|
|
padding=10,
|
|
border_radius=10,
|
|
)
|
|
|
|
self.message_field = ft.TextField(
|
|
label="Scrie un mesaj clientului",
|
|
min_lines=3,
|
|
max_lines=5,
|
|
multiline=True
|
|
)
|
|
|
|
self.change_state_dialog = ft.AlertDialog(
|
|
title=ft.Text("Modifica statusul"),
|
|
content=self.message_field,
|
|
actions=[
|
|
ft.FilledButton(
|
|
"Da",
|
|
on_click=self.on_change_state_btn_click
|
|
),
|
|
ft.FilledButton(
|
|
"Nu",
|
|
on_click=self.on_cancel_state_btn_click,
|
|
bgcolor=ft.Colors.GREY
|
|
)
|
|
]
|
|
)
|
|
|
|
def on_radio_value_change(self, e):
|
|
self.page.open(self.change_state_dialog)
|
|
|
|
def on_change_state_btn_click(self, e):
|
|
self.page.close(self.change_state_dialog)
|
|
status = self.buttons_state.value
|
|
self.orders.update_order_status(status, self.selected_order['id'])
|
|
print(status)
|
|
self.all_orders = self.orders.get_orders()
|
|
self.all_orders = self.all_orders[::-1]
|
|
self.oll_orders_list.controls.clear()
|
|
self.oll_orders_list.controls = self.create_list(self.all_orders, self.on_order_click)
|
|
self.oll_orders_list.update()
|
|
self.order_details_placeholder.content = None
|
|
self.order_details_placeholder.update()
|
|
#-------------------------------------------> TBI Send information email to customer
|
|
message = self.message_field.value
|
|
self.message_field.value = ''
|
|
self.message_field.update()
|
|
print(message)
|
|
email = self.customer_email
|
|
|
|
def on_cancel_state_btn_click(self, e):
|
|
self.buttons_state.value = self.original_status
|
|
self.buttons_state.update()
|
|
self.page.close(self.change_state_dialog)
|
|
|
|
def get_total_pay(self):
|
|
sume = 0
|
|
print (self.selected_order_products)
|
|
if self.selected_order_products:
|
|
for product in self.selected_order_products:
|
|
sume += (product['price'] - product['price']*product['discount']/100)
|
|
print(sume)
|
|
return sume
|
|
|
|
def on_order_click(self, item):
|
|
self.products_column.controls.clear()
|
|
self.order_details_placeholder.content = None
|
|
self.order_details_placeholder.content = self.order_details
|
|
self.order_details_placeholder.bgcolor=ft.Colors.BROWN_50
|
|
try:
|
|
self.order_details_placeholder.update()
|
|
except:
|
|
print('ERROR Unable to update the Order Details Placeholder')
|
|
print("order item", item)
|
|
self.selected_user = self.users.get(item['user_id'])
|
|
if self.selected_user == None:
|
|
self.selected_user = self.default_user.default_user
|
|
self.selected_order = item
|
|
products = self.orders.get_order_products(item['id'])
|
|
self.selected_order_products = []
|
|
if products:
|
|
for product in products:
|
|
prod = self.products.get(product['prdouct_id'])
|
|
print(prod)
|
|
if prod:
|
|
self.selected_order_products.append(prod)
|
|
|
|
self.name.value = self.selected_user['name'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
|
|
self.name.update()
|
|
self.email.value = self.selected_user['email']
|
|
self.email.update()
|
|
self.customer_email = self.selected_user['email']
|
|
self.address.value = self.selected_user['address'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
|
|
self.address.update()
|
|
self.phone.value = self.selected_user['phone'] if '@default.com' not in self.selected_user['email'] else 'Anonim user'
|
|
self.phone.update()
|
|
self.status.value = "Status"
|
|
self.status.update()
|
|
for product in self.selected_order_products:
|
|
name_label = ft.Text(
|
|
"Denumire produs",
|
|
weight=ft.FontWeight.BOLD
|
|
)
|
|
name = ft.Text(product['name'])
|
|
name_row = ft.Row(
|
|
[
|
|
name_label,
|
|
name
|
|
]
|
|
)
|
|
image = ft.Image(
|
|
src=product['image'],
|
|
width=200,
|
|
height=200,
|
|
fit=ft.ImageFit.CONTAIN
|
|
)
|
|
quantity_label = ft.Text("Cantitate")
|
|
quantity = ft.Text(product['quantity'])
|
|
quantity_row = ft.Row(
|
|
[
|
|
quantity_label,
|
|
quantity
|
|
]
|
|
)
|
|
product_row = ft.Row(
|
|
[
|
|
image,
|
|
ft.Column(
|
|
[
|
|
name_row,
|
|
quantity_row
|
|
]
|
|
)
|
|
]
|
|
)
|
|
self.products_column.controls.append(product_row)
|
|
print(self.products_column.controls)
|
|
self.total_pay.value = f"{self.get_total_pay()} Lei"
|
|
self.total_pay.update()
|
|
self.products_column.update()
|
|
|
|
self.buttons_state.value = item['status']
|
|
self.buttons_state.update()
|
|
self.original_status = item['status']
|
|
|
|
def on_filter_change(self, e):
|
|
print(e.data)
|
|
buffer = []
|
|
if e.data == 'all':
|
|
self.oll_orders_list.controls = self.create_list(self.all_orders, self.on_order_click)
|
|
self.oll_orders_list.update()
|
|
else:
|
|
for order in self.all_orders:
|
|
if order['status'] == e.data:
|
|
buffer.append(order)
|
|
self.oll_orders_list.controls = self.create_list(buffer, self.on_order_click)
|
|
self.oll_orders_list.update()
|
|
|
|
def get_status(self, status):
|
|
STATUS = {
|
|
'on_hold': "In asteptare",
|
|
'new': "Noua",
|
|
'in_progress': "In lucru",
|
|
"completed": "Completa"
|
|
}
|
|
return STATUS[status]
|
|
|
|
def create_list(self, items, on_click_handler):
|
|
return [
|
|
ft.Container(
|
|
content=ft.Row(
|
|
[
|
|
|
|
ft.Row(
|
|
[
|
|
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
|
|
ft.Text(value=item['id'])
|
|
]
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.Text(
|
|
value=self.get_status(item['status'])
|
|
)
|
|
]
|
|
)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
),
|
|
width=300,
|
|
bgcolor=ft.Colors.BROWN_50,
|
|
padding=10,
|
|
border_radius=8,
|
|
ink=True,
|
|
on_click=lambda e, i=item: on_click_handler(i),
|
|
border = ft.border.all(1, ft.Colors.GREY),
|
|
)
|
|
for item in items
|
|
]
|
|
|
|
def build(self):
|
|
return ft.Container(
|
|
content=ft.Column(
|
|
[
|
|
self.header,
|
|
ft.Row(
|
|
[
|
|
ft.Text(value="Filtreaza dupa"),
|
|
self.fileters
|
|
]
|
|
),
|
|
ft.Row(
|
|
[
|
|
self.oll_orders_list,
|
|
self.order_details_placeholder
|
|
],
|
|
vertical_alignment=ft.CrossAxisAlignment.START
|
|
)
|
|
],
|
|
alignment=ft.MainAxisAlignment.START,
|
|
expand=True,
|
|
#scroll=ft.ScrollMode.ADAPTIVE
|
|
),
|
|
expand=True,
|
|
) |