416 lines
16 KiB
Python
416 lines
16 KiB
Python
import flet as ft
|
|
from dbActions.provider_bills import ProviderBills
|
|
from dbActions.providers import Providers
|
|
from dbActions.bulk_products import BulkProducts
|
|
|
|
class GoodsReception:
|
|
def __init__(self, page: ft.Page, dashboard, inventory):
|
|
self.page = page
|
|
self.bill_manager = ProviderBills()
|
|
self.provider_manager = Providers()
|
|
self.bulk_products_manager = BulkProducts()
|
|
|
|
self.product_suggestions = ft.Text(size=12)
|
|
self.product_name = ft.TextField(label="Denumire", on_change=self.search_for_product_name)
|
|
self.product_mesure_unit = ft.Dropdown(
|
|
label="Unitate de masura",
|
|
options=[
|
|
ft.dropdown.Option(key='kg', text="KG"),
|
|
ft.dropdown.Option(key='buc', text="BUC")
|
|
] ,
|
|
expand=True
|
|
)
|
|
self.product_mesure_unit.value = 'kg'
|
|
self.product_quantity = ft.TextField(label="Cantitate (Numar de unitati)")
|
|
self.product_price = ft.TextField(label="Pret pe unitate")
|
|
self.product_vat = ft.TextField(label="TVA% (0 pentru neplatitor de TVA)", value="0")
|
|
|
|
self.bill_number = ft.TextField(label="Serie si numar")
|
|
self.bill_date = ft.TextField(label="Data", read_only=True, expand=True)
|
|
self.provider = ft.Dropdown(
|
|
label="Furnizor",
|
|
options=self.get_providers(),
|
|
expand=True
|
|
)
|
|
|
|
self.add_bill_dialog = ft.AlertDialog(
|
|
title=ft.Text("Adauga factura"),
|
|
content=ft.Column(
|
|
[
|
|
self.bill_number,
|
|
ft.Row(
|
|
[
|
|
self.bill_date,
|
|
ft.ElevatedButton(
|
|
"Selecteaza",
|
|
icon=ft.Icons.CALENDAR_MONTH,
|
|
on_click=lambda e: page.open(
|
|
ft.DatePicker(
|
|
on_change=self.on_date_selected,
|
|
)
|
|
),
|
|
)
|
|
],
|
|
width=400
|
|
),
|
|
self.provider
|
|
],
|
|
width=400,
|
|
height=200
|
|
),
|
|
actions=[
|
|
ft.Button(
|
|
"Salveaza",
|
|
on_click=self.on_save_bill_btn_click,
|
|
icon=ft.Icons.SAVE
|
|
),
|
|
ft.Button(
|
|
"Anuleaza",
|
|
on_click=self.on_cancel_bill_btn_click,
|
|
icon=ft.Icons.CANCEL,
|
|
bgcolor=ft.Colors.GREY,
|
|
color=ft.Colors.WHITE
|
|
)
|
|
]
|
|
)
|
|
|
|
self.all_bills = self.bill_manager.get_all()
|
|
|
|
self.bills_list = ft.ListView(
|
|
controls=self.create_bill_list(
|
|
self.all_bills,
|
|
self.on_add_product_btn_click,
|
|
self.on_edit_provider_bill_btn_click,
|
|
self.on_delete_provider_bill_btn_click,
|
|
self.on_view_list_btn_click
|
|
),
|
|
spacing=10,
|
|
expand=True,
|
|
width=400
|
|
)
|
|
|
|
self.search_bar = ft.TextField(label="Cauta factura", expand=True, on_submit=self.on_search_btn_click)
|
|
self.search_btn = ft.IconButton(
|
|
icon=ft.Icons.SEARCH,
|
|
bgcolor=ft.Colors.BROWN,
|
|
icon_color=ft.Colors.WHITE,
|
|
on_click=self.on_search_btn_click
|
|
)
|
|
|
|
self.delete_item_id = None
|
|
|
|
self.delete_bill_dialog = ft.AlertDialog(
|
|
title=ft.Text("Setergeti?"),
|
|
actions=[
|
|
ft.Button("Da", on_click=self.on_confirm_delete_bill_btn_click),
|
|
ft.Button("Nu", on_click=self.on_cancel_delete_bill_btn_click, bgcolor=ft.Colors.GREY, color=ft.Colors.WHITE)
|
|
]
|
|
)
|
|
|
|
self.edit_item = None
|
|
|
|
self.add_product_dialog = ft.AlertDialog(
|
|
title=ft.Text("Adauga produs"),
|
|
content=ft.Column(
|
|
[
|
|
self.product_suggestions,
|
|
self.product_name,
|
|
self.product_quantity,
|
|
self.product_mesure_unit,
|
|
self.product_price,
|
|
self.product_vat
|
|
],
|
|
width=400,
|
|
height=300
|
|
),
|
|
actions=[
|
|
ft.Button(
|
|
"Salveaza",
|
|
icon=ft.Icons.SAVE,
|
|
on_click=self.on_save_product_btn_click
|
|
),
|
|
ft.TextButton(
|
|
"Anuleaza",
|
|
on_click=self.on_cancel_product_btn_click
|
|
)
|
|
]
|
|
)
|
|
|
|
self.selected_bill = None
|
|
|
|
self.products_table = ft.DataTable(
|
|
columns=[
|
|
ft.DataColumn(ft.Text("Produs")),
|
|
ft.DataColumn(ft.Text("Cantitate")),
|
|
ft.DataColumn(ft.Text("Unitate\nde masura")),
|
|
ft.DataColumn(ft.Text("Pret\nfara TVA")),
|
|
ft.DataColumn(ft.Text("Procent\nTVA(%)")),
|
|
ft.DataColumn(ft.Text("Pret\nproduse")),
|
|
ft.DataColumn(ft.Text("Valoare\nTVA")),
|
|
ft.DataColumn(ft.Text("Pret\nfinal")),
|
|
],
|
|
rows=[]
|
|
)
|
|
|
|
self.placeholder = ft.Column([self.products_table], width=900, scroll=ft.ScrollMode.ADAPTIVE)
|
|
self.all_procuts = None
|
|
|
|
def search_for_product_name(self, e):
|
|
produts_names = []
|
|
for product in self.all_procuts:
|
|
if len(self.product_name.value) >= 4:
|
|
if self.product_name.value in product['name']:
|
|
print('Suggested name', product['name'])
|
|
produts_names.append(product['name'])
|
|
self.product_suggestions.value = produts_names
|
|
self.product_suggestions.update()
|
|
|
|
def show_bill_products(self):
|
|
all_products = self.bulk_products_manager.get_products_by_bill_id(self.selected_bill['id'])[::-1]
|
|
print(all_products)
|
|
self.products_table.rows.clear()
|
|
for product in all_products:
|
|
print(product)
|
|
price = round((product['price']*product['quantity'])*product['vat']/100+(product['price']*product['quantity']),2)
|
|
product_price = round(product['price']*product['quantity'],2)
|
|
vat_value = round((product['price']*product['quantity'])*product['vat']/100,2)
|
|
self.products_table.rows.append(
|
|
ft.DataRow(
|
|
cells=[
|
|
ft.DataCell(ft.Text(product['name'])),
|
|
ft.DataCell(ft.Text(product['quantity'])),
|
|
ft.DataCell(ft.Text(product['mesure_unit'])),
|
|
ft.DataCell(ft.Text(product['price'])),
|
|
ft.DataCell(ft.Text(product['vat'])),
|
|
ft.DataCell(ft.Text(product_price)),
|
|
ft.DataCell(ft.Text(vat_value)),
|
|
ft.DataCell(ft.Text(price)),
|
|
],
|
|
)
|
|
)
|
|
self.products_table.update()
|
|
|
|
def on_save_product_btn_click(self, e):
|
|
name = self.product_name.value
|
|
quantity = self.product_quantity.value
|
|
mesure_unit = self.product_mesure_unit.value
|
|
price = self.product_price.value
|
|
vat = self.product_vat.value
|
|
self.bulk_products_manager.add_bulk_products_product(
|
|
bill_id=self.selected_bill['id'],
|
|
name=name,
|
|
mesure_unit=mesure_unit,
|
|
quantity=quantity,
|
|
price=price,
|
|
vat=vat
|
|
)
|
|
self.reset_values()
|
|
self.page.close(self.add_product_dialog)
|
|
self.show_bill_products()
|
|
|
|
def on_cancel_product_btn_click(self, e):
|
|
self.reset_values()
|
|
self.page.close(self.add_product_dialog)
|
|
|
|
def reset_values(self):
|
|
self.product_name.value = ''
|
|
self.product_name.update()
|
|
self.product_quantity.value = ''
|
|
self.product_quantity.update()
|
|
self.product_mesure_unit.value = 'kg'
|
|
self.product_mesure_unit.update()
|
|
self.product_price.value = ''
|
|
self.product_price.update()
|
|
self.product_vat.value = '0'
|
|
self.product_vat.update()
|
|
|
|
|
|
def on_confirm_delete_bill_btn_click(self, e):
|
|
self.page.close(self.delete_bill_dialog)
|
|
self.bill_manager.remove(self.delete_item_id)
|
|
self.delete_item_id = None
|
|
list_value = self.bill_manager.get_all()
|
|
self.update_list(list_value)
|
|
|
|
def on_cancel_delete_bill_btn_click(self, e):
|
|
self.page.close(self.delete_bill_dialog)
|
|
self.delete_item_id = None
|
|
|
|
def on_add_product_btn_click(self, item):
|
|
self.selected_bill = item
|
|
self.all_procuts = self.bulk_products_manager.get_all()
|
|
self.page.open(self.add_product_dialog)
|
|
|
|
def on_view_list_btn_click(self, item):
|
|
self.selected_bill = item
|
|
self.show_bill_products()
|
|
|
|
def on_edit_provider_bill_btn_click(self, item):
|
|
self.edit_item = item
|
|
self.bill_number.value = item['number']
|
|
self.bill_date.value = item['date']
|
|
self.provider.value = item['provider_id']
|
|
self.page.open(self.add_bill_dialog)
|
|
|
|
def on_delete_provider_bill_btn_click(self, id):
|
|
print("Delete ", id)
|
|
self.delete_item_id = id
|
|
self.page.open(self.delete_bill_dialog)
|
|
|
|
def get_provider_name(self, id):
|
|
for provider in self.provider_manager.get_all_providers():
|
|
if provider['id'] == id:
|
|
return provider['provider_name']
|
|
|
|
def create_bill_list(self, items, on_click_handler, on_click_handler2, on_click_handler3, on_click_handler4):
|
|
"""Helper to create list items for a column."""
|
|
return [
|
|
ft.Container(
|
|
content=ft.Row(
|
|
[
|
|
|
|
ft.Column(
|
|
[
|
|
ft.Text(value=f"Factura: {item['number']} {item['date']}", weight=ft.FontWeight.BOLD),
|
|
ft.Text(value=f"Din: {item['date']}", size=12),
|
|
ft.Text(value=f"Furnizor: {self.get_provider_name(item['provider_id'])}", size=12)
|
|
]
|
|
),
|
|
|
|
ft.Column(
|
|
[
|
|
ft.FilledButton(
|
|
icon=ft.Icons.ADD,
|
|
text = 'Adauga Produs',
|
|
on_click=lambda e, id=item: on_click_handler(id),
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.IconButton(
|
|
icon=ft.Icons.PREVIEW,
|
|
on_click=lambda e, id=item: on_click_handler4(id)
|
|
),
|
|
ft.IconButton(
|
|
icon=ft.Icons.EDIT,
|
|
on_click=lambda e, id=item: on_click_handler2(id),
|
|
),
|
|
ft.IconButton(
|
|
icon=ft.Icons.DELETE,
|
|
on_click=lambda e, id=item['id']: on_click_handler3(id),
|
|
icon_color=ft.Colors.RED,
|
|
)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
expand=True
|
|
)
|
|
]
|
|
)
|
|
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
vertical_alignment=ft.CrossAxisAlignment.END
|
|
),
|
|
width=300,
|
|
bgcolor=ft.Colors.BROWN_50,
|
|
border = ft.border.all(1, ft.Colors.GREY),
|
|
padding=10,
|
|
border_radius=8,
|
|
)
|
|
for item in items
|
|
]
|
|
|
|
def on_date_selected(self, e):
|
|
self.bill_date.value = e.control.value.strftime('%d/%m/%Y')
|
|
self.bill_date.update()
|
|
|
|
def on_add_bill_btn_click(self, e):
|
|
self.page.open(self.add_bill_dialog)
|
|
|
|
def get_providers(self):
|
|
providers = self.provider_manager.get_all_providers()
|
|
return [
|
|
ft.dropdown.Option(key=provider['id'], text=provider['provider_name'])
|
|
for provider in providers
|
|
]
|
|
|
|
def on_save_bill_btn_click(self, e):
|
|
if self.bill_number.value == None or len(self.bill_number.value)<2:
|
|
print("bill number not inserted")
|
|
return
|
|
if self.edit_item:
|
|
print("Edit bill")
|
|
self.bill_manager.update(
|
|
id=self.edit_item['id'],
|
|
number=self.bill_number.value,
|
|
date=self.bill_date.value,
|
|
provider_id=self.provider.value
|
|
)
|
|
self.edit_item = None
|
|
else:
|
|
print('Add bill')
|
|
self.bill_manager.add_provider_bills(
|
|
self.bill_number.value,
|
|
self.bill_date.value,
|
|
self.provider.value
|
|
)
|
|
self.on_cancel_bill_btn_click('e')
|
|
list_value = self.bill_manager.get_all()
|
|
self.update_list(list_value)
|
|
|
|
def on_cancel_bill_btn_click(self, e):
|
|
self.bill_number.value = ''
|
|
self.bill_number.update()
|
|
self.bill_date.value = ''
|
|
self.bill_date.update()
|
|
self.provider.value = ''
|
|
self.provider.update()
|
|
self.page.close(self.add_bill_dialog)
|
|
|
|
def on_search_btn_click(self, e):
|
|
search = self.search_bar.value
|
|
buffer = []
|
|
for bill in self.all_bills:
|
|
if search.lower() in bill['number'].lower():
|
|
buffer.append(bill)
|
|
self.update_list(buffer)
|
|
|
|
def update_list(self, list_value):
|
|
self.bills_list.controls=self.create_bill_list(
|
|
list_value,
|
|
self.on_add_product_btn_click,
|
|
self.on_edit_provider_bill_btn_click,
|
|
self.on_delete_provider_bill_btn_click,
|
|
self.on_view_list_btn_click
|
|
)
|
|
self.bills_list.update()
|
|
|
|
def build(self):
|
|
return ft.Container(
|
|
content=ft.Column(
|
|
[
|
|
ft.Row(
|
|
[
|
|
ft.Text("Receptie Marfa", weight=ft.FontWeight.BOLD, size=18),
|
|
ft.Button("Adauga Factura", icon=ft.Icons.ADD, on_click=self.on_add_bill_btn_click)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
|
vertical_alignment=ft.CrossAxisAlignment.START
|
|
),
|
|
ft.Row(
|
|
[
|
|
self.search_bar,
|
|
self.search_btn
|
|
],
|
|
vertical_alignment=ft.CrossAxisAlignment.START
|
|
),
|
|
ft.Row(
|
|
[
|
|
self.bills_list,
|
|
self.placeholder
|
|
],
|
|
vertical_alignment=ft.CrossAxisAlignment.START
|
|
)
|
|
],
|
|
scroll=ft.ScrollMode.ADAPTIVE
|
|
)
|
|
) |