add netopia payment process

This commit is contained in:
2025-11-06 10:48:57 +02:00
parent 5a40af5434
commit 6c713171ed
10 changed files with 566 additions and 72 deletions

View File

@@ -4,7 +4,9 @@ from dbActions.products import Products
from dbActions.company import Company
from dbActions.users import Users
from dbActions.fidelity_cards import FidelityCards
from dbActions.netopia import Netopia
from helpers.emails import send_gmail
from helpers.netopia import start_card_payment
import re
class Cart:
@@ -16,6 +18,7 @@ class Cart:
self.company_manager = Company()
self.user_manager = Users()
self.card_manager = FidelityCards()
self.netopia_manager = Netopia()
self.products = []
self.is_second_address = None
self.is_company = None
@@ -49,7 +52,7 @@ class Cart:
content=ft.Row(
[
ft.Radio(value="ramburs", label="Ramburs la curier"),
ft.Radio(value="plata_online_cu_cardul", label="Plata online cu cardul", disabled=True),
ft.Radio(value="plata_online_cu_cardul", label="Plata online cu cardul"),
]
),
on_change=self.on_payment_value_change
@@ -83,10 +86,15 @@ class Cart:
)
self.user = self.page.session.get("user")
self.company = self.company_manager.get_company(self.user['id'])
self.user_name = ft.TextField(
label="Nume si Prenume",
value=self.user['name'] if "@default.com" not in self.user['email'] else None
self.first_name = ft.TextField(
label="Prenume",
value=self.user['name'].split('~')[0] if "@default.com" not in self.user['email'] else None
)
self.last_name = ft.TextField(
label="Nume",
value=self.user['name'].split('~')[1] if "@default.com" not in self.user['email'] else None
)
self.email = ft.TextField(
label="E-mail",
value=self.user['email'] if "@default.com" not in self.user['email'] else None,
@@ -97,12 +105,17 @@ class Cart:
value=self.user['phone'] if "@default.com" not in self.user['email'] else None
)
self.address = ft.TextField(
label="Adresa",
label="Strada si numar",
multiline=True,
min_lines=3,
max_lines=5,
value = self.user['address'].split("~")[0] if self.user['address'] else ''
value = self.user['address'].split("~")[0].split("%")[1] if self.user['address'] else ''
)
self.city = ft.TextField(
label="Oras",
value = self.user['address'].split("~")[0].split('%')[0] if self.user['address'] else ''
)
self.company_name = ft.TextField(
label="Denumire firma",
value=self.company['name'] if self.company else ''
@@ -123,7 +136,7 @@ class Cart:
value=self.company['address'] if self.company else '')
self.second_address_placeholder = ft.Column()
self.second_address = ft.TextField(
label="Adresa de livrare",
label="Adresa de livrare (str, nr, oras, judet)",
multiline=True,
min_lines=3,
max_lines=5,
@@ -148,10 +161,12 @@ class Cart:
"Detaili de livrare",
weight=ft.FontWeight.BOLD
),
self.user_name,
self.first_name,
self.last_name,
self.email,
self.phone,
self.address,
self.city,
ft.Divider(),
ft.Text("Adresa de livrare difera de adresa de domiciliu?", text_align=ft.TextAlign.CENTER),
ft.Button("Adauga adresa livrare", width=500, on_click=self.on_second_address_btn_click),
@@ -436,7 +451,7 @@ class Cart:
self.error_message.update()
return found
def check_inserted_user_data(self, username, phone, address, email):
def check_inserted_user_data(self, username, phone, address, email, city):
found = False
if username is None or len(username)< 1:
print('Username not found')
@@ -447,6 +462,9 @@ class Cart:
if address is None or len(address)< 1:
print("Adress not found")
found = True
if city is None or len(city)< 1:
print("City not found")
found = True
if email is None or len(email)<1:
print("email not found")
found = True
@@ -469,17 +487,17 @@ class Cart:
return False
def create_update_user_details(self):
username = self.user_name.value
username = self.first_name.value + "~" + self.last_name.value
phone = self.phone.value
address = self.address.value
address = self.city.value+"%"+self.address.value
email = self.email.value
if self.is_second_address:
print("Second address has been selected (button click)")
if self.check_second_address_inserted(self.second_address.value):
return False
address = self.address.value + '~' + self.second_address.value
if self.check_inserted_user_data(username, phone, address, email):
address = self.city.value+"%"+self.address.value + '~' + self.second_address.value
if self.check_inserted_user_data(username, phone, self.address.value, email, self.city.value):
return False
if not self.check_email_is_valid(email):
@@ -521,7 +539,110 @@ class Cart:
'address': self.company_address.value
}
self.company_manager.add_company(company)
if self.payment.value == None:
self.error_message.value = "Va rugam selectati metoda de plata!"
self.error_message.color = ft.Colors.RED
self.error_message.update()
return False
return True
def create_history(self):
if '@default.com' not in self.user['email']:
self.all_orders = self.orders_manager.get_orders_for_user(self.page.session.get('user')['id'])
self.all_orders = self.all_orders[::-1]
buffer = []
for order in self.all_orders:
if order['status'] != 'on_hold':
buffer.append(order)
self.orders_manager_list.controls.clear()
self.orders_manager_list.controls = self.create_history_list(buffer)
self.orders_manager_list.update()
def notify_admin_and_client(self):
users = self.user_manager.get_all()
admins = []
for user in users:
if user['role'] == 'admin':
admins.append(user)
for admin in admins:
send_gmail(
to_email=admin['email'],
subject="Comanda noua pe tainagustului.ro",
body=f'''
Ati primit o noua comanda de la {self.user['email']}.
Va rugam accesati wwww.tainagusutului.ro pentru detalii.
'''
)
send_gmail(
to_email=self.user['email'],
subject="Multumim pentru comanda!",
body=f'''
Buna ziua,
Comanda a fost primita si va fi livrata in cel mai scurt timp.
Va multumim,
Echipa tainagustului.ro
'''
)
def save_order_ntp_id(self, order_id, netopia_id):
self.netopia_manager.add_netopia_card(order_id, netopia_id)
def online_pay(self, order_id):
if self.payment.value == "plata_online_cu_cardul":
print("The user seelected card payment")
order_products = []
products_ids = self.orders_manager.get_order_products(order_id)
for prod in products_ids:
p = self.productsDB.get(prod['prdouct_id'])
order_products.append(
{
'name':p['name'],
'code':p['id'],
'category':p['category_id'],
'price':p['price'],
'vat':0,
}
)
print(order_products)
response = start_card_payment(
order_id=order_id,
amount=self.pret_total.value.split(": ")[1],
currency='RON',
description="Comanda noua",
customer={
'email':self.email.value,
'phone':self.phone.value,
'firstName':self.first_name.value,
'lastName':self.last_name.value,
'city':self.city.value,
'country': 642,
'address':self.address.value,
'county':'',
'zipCode':''
},
products=order_products
)
print(type(response))
# Extract URL & ntpID from SDK response
payment_url = response.payment['paymentURL']
ntp_id = response.payment['ntpID']
# 1) Persist mapping (VERY IMPORTANT for IPN/status reconciliation)
if ntp_id:
self.save_order_ntp_id(order_id, ntp_id) # implement in your DB layer
# 2) Open hosted payment page
if payment_url:
self.page.launch_url(payment_url, web_window_name="_blank")
self.page.go("/payment/redirect") # your UX page
else:
self.page.snack_bar = ft.SnackBar(ft.Text("Nu am primit URL-ul de plată."))
self.page.snack_bar.open = True
self.page.update()
def on_confim_btn_click(self, e):
self.error_message.color = ft.Colors.RED
@@ -531,7 +652,7 @@ class Cart:
self.page.close(self.confirm_dialog)
if self.create_update_user_details():
print('User details updated')
order_id = self.on_hold_orders['id']
self.orders_manager.update_order_status("new", self.on_hold_orders['id'])
print('Order status is set to new')
self.products = []
@@ -551,46 +672,18 @@ class Cart:
self.product_list.update()
#hiostory
if '@default.com' not in self.user['email']:
self.all_orders = self.orders_manager.get_orders_for_user(self.page.session.get('user')['id'])
self.all_orders = self.all_orders[::-1]
self.orders_manager_list.controls.clear()
self.orders_manager_list.controls = self.create_history_list(self.all_orders)
self.orders_manager_list.update()
#notify admin
users = self.user_manager.get_all()
admins = []
for user in users:
if user['role'] == 'admin':
admins.append(user)
for admin in admins:
send_gmail(
to_email=admin['email'],
subject="Comanda noua pe tainagustului.ro",
body=f'''
Ati primit o noua comanda de la {self.user['email']}.
Va rugam accesati wwww.tainagusutului.ro pentru detalii.
'''
)
send_gmail(
to_email=self.user['email'],
subject="Multumim pentru comanda!",
body=f'''
Buna ziua,
Comanda a fost primita si va fi livrata in cel mai scurt timp.
Va multumim,
Echipa tainagustului.ro
'''
)
self.create_history()
self.error_message.value = "Comanda a fost trimisa cu success!"
self.error_message.color = ft.Colors.GREEN
self.error_message.update()
#online pay
self.online_pay(order_id)
#notify admin
self.notify_admin_and_client()
def build(self):
return ft.Container(
content=ft.Column(

View File

@@ -0,0 +1,9 @@
import flet as ft
class ConfirmData:
def __init__(self):
self.first_name = ft.TextField(label="Prenume")
self.last_name = ft.TextField(label="Nume")
self.city = ft.TextField(label="Oras")
self.address = ft.TextField(label="Strada si numar")

View File

@@ -0,0 +1,35 @@
import flet as ft
class PaymentRedirect:
def __init__(self, page: ft.Page):
self.page = page
def build(self):
return ft.Container(
content=ft.Column(
[
ft.Row(
[
ft.Image(src='images/tainagustului.png', width=200)
],
alignment=ft.MainAxisAlignment.CENTER
),
ft.Text(
"Sunteți redirecționat către pagina de plată NETOPIA...",
size=20,
weight=ft.FontWeight.BOLD,
text_align=ft.TextAlign.CENTER,
),
ft.ProgressRing(width=40, height=40, color=ft.Colors.GREEN),
ft.Text(
"Vă rugăm să nu închideți această fereastră până la finalizarea plății.",
size=16,
color=ft.Colors.GREY_700,
text_align=ft.TextAlign.CENTER,
)
],
alignment=ft.MainAxisAlignment.CENTER,
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
spacing=20
)
)