صابر مغترب نشر الخميس في 18:53 أرسل تقرير نشر الخميس في 18:53 السلام عليكم ورحمه الله وبركاته احبتي الكرام كيف الفكره لاستخراج الربح للصنف المباع import sys import os import sqlite3 from PyQt5.QtWidgets import ( QDialog, QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout, QCompleter, QListView, QHeaderView ) from PyQt5.QtGui import QFont, QStandardItemModel, QStandardItem, QBrush, QColor from PyQt5.QtCore import Qt sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) from database_connection import connect_to_db # استيراد الدالة للاتصال بقاعدة البيانات class ItemMovementUI(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("حركة الأصناف") self.setGeometry(100, 100, 1300, 600) self.setWindowModality(Qt.WindowModality.ApplicationModal) layout = QVBoxLayout() self.title_label = QLabel("حركة الأصناف") self.title_label.setFont(QFont("Amiri", 24, QFont.Weight.Bold)) self.title_label.setStyleSheet("color: #2e8b57;") layout.addWidget(self.title_label) self.item_number_label = QLabel("أدخل رقم الصنف:") self.item_number_label.setFont(QFont("Amiri", 12)) self.item_number_input = QLineEdit() self.item_number_input.setFixedSize(400, 30) self.item_number_input.setFont(QFont("Amiri", 12)) self.completer = QCompleter() self.completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) self.suggestion_view = QListView() self.suggestion_view.setFont(QFont("Aljazeera", 12)) self.completer.setPopup(self.suggestion_view) self.item_number_input.setCompleter(self.completer) self.search_button = QPushButton("بحث") self.search_button.setFixedSize(100, 40) self.search_button.setFont(QFont("Amiri", 14)) self.search_button.clicked.connect(self.search_item_movements) input_layout = QHBoxLayout() input_layout.addWidget(self.item_number_label) input_layout.addWidget(self.item_number_input) input_layout.addWidget(self.search_button) layout.addLayout(input_layout) self.table = QTableWidget() self.table.setColumnCount(11) self.table.setHorizontalHeaderLabels([ "رقم الفاتورة", "Serial فاتورة", "نوع الفاتورة", "رقم الصنف", "اسم الصنف", "الوصف", "السعر مع الضريبة للحبة", "الكمية", "الرصيد الحالي", "المجموع", "تاريخ الحركة" ]) self.table.setRowHeight(0, 40) for row in range(1, 100): self.table.setRowHeight(row, 30) self.table.setFixedSize(1300, 400) self.table.setFont(QFont("Amiri", 12)) self.table.setColumnWidth(2, 150) self.table.setColumnWidth(3, 200) self.table.setColumnWidth(4, 80) self.table.setColumnWidth(6, 150) self.table.setStyleSheet(""" QTableWidget { background-color: #f0f0f0; border: 1px solid #ccc; alternate-background-color: #e0e0e0; } QTableWidget::item { padding: 5px; } QHeaderView::section { background-color: #2e8b57; color: white; font-size: 14px; padding: 5px; } """) self.table.horizontalHeader().setStretchLastSection(True) layout.addWidget(self.table) layout.addWidget(QLabel("المجاميع الشهرية:")) self.monthly_totals_table = QTableWidget() self.monthly_totals_table.setRowCount(1) self.monthly_totals_table.setColumnCount(12) self.monthly_totals_table.setHorizontalHeaderLabels([ 'ش1', 'ش2', 'ش3', 'ش4', 'ش5', 'ش6', 'ش7', 'ش8', 'ش9', 'ش10', 'ش11', 'ش12' ]) self.monthly_totals_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.monthly_totals_table.setRowHeight(0, 30) self.monthly_totals_table.setFixedHeight(60) layout.addWidget(self.monthly_totals_table) self.setLayout(layout) self.load_item_suggestions() def load_item_suggestions(self): connection = connect_to_db() cursor = connection.cursor() cursor.execute("SELECT item_number, item_name, description FROM items") items = cursor.fetchall() model = QStandardItemModel() for item_number, item_name, description in items: description_text = description if description else "لا يوجد" suggestion_text = f"{item_number} - {item_name} - {description_text}" model.appendRow(QStandardItem(suggestion_text)) self.completer.setModel(model) connection.close() def search_item_movements(self): item_number = self.item_number_input.text().split(" - ")[0].strip() if not item_number: return connection = connect_to_db() cursor = connection.cursor() # جلب الرصيد الابتدائي والسعر الابتدائي للشراء من جدول الأصناف cursor.execute("SELECT initial_stock, initial_buying_price FROM items WHERE item_number = ?", (item_number,)) item_row = cursor.fetchone() initial_stock = item_row[0] if item_row else 0 initial_buying_price = item_row[1] if item_row else 0 # حساب السعر مع الضريبة للحبة لصف "أول المدة" price_with_vat_initial = initial_buying_price + (initial_buying_price * 0.15) # حساب المجموع لصف "أول المدة" total_initial = price_with_vat_initial * initial_stock query = """ SELECT invoices.invoice_number, invoices.serialfatwra, invoices.description, invoices.invoice_type, invoice_details.item_number, invoice_details.item_name, invoice_details.quantity, invoice_details.sub_total_after_vat, invoice_details.Auto_Date FROM invoice_details INNER JOIN invoices ON invoice_details.invoice_number = invoices.invoice_number WHERE invoice_details.item_number = ? ORDER BY invoice_details.Auto_Date ASC """ cursor.execute(query, (item_number,)) rows = cursor.fetchall() self.table.setRowCount(len(rows) + 1) # تعبئة صف "أول المدة" initial_item = QTableWidgetItem("أول المدة") initial_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(0, 2, initial_item) initial_balance_item = QTableWidgetItem(f"{int(initial_stock)}") initial_balance_item.setBackground(QColor("#add8e6")) initial_balance_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(0, 8, initial_balance_item) # الكمية في صف "أول المدة" تساوي المخزون الابتدائي self.table.setItem(0, 7, QTableWidgetItem(f"{int(initial_stock)}")) # السعر مع الضريبة للحبة في صف "أول المدة" price_item = QTableWidgetItem(f"{price_with_vat_initial:.2f}") price_item.setForeground(QBrush(QColor("green" if price_with_vat_initial >= 0 else "red"))) self.table.setItem(0, 6, price_item) # المجموع في صف "أول المدة" total_item = QTableWidgetItem(f"{total_initial:.2f}") total_item.setForeground(QBrush(QColor("green" if total_initial >= 0 else "red"))) self.table.setItem(0, 9, total_item) current_balance = initial_stock # تعبئة باقي الصفوف for row_idx, row_data in enumerate(rows, start=1): invoice_number, serialfatwra, description, invoice_type, item_number, item_name, quantity, sub_total_after_vat, auto_date = row_data if invoice_type == 'مبيعات': quantity = -quantity current_balance += quantity # حساب السعر مع الضريبة للحبة price_per_unit_with_vat = sub_total_after_vat / quantity if quantity != 0 else 0 # حساب المجموع total_amount = price_per_unit_with_vat * quantity self.table.setItem(row_idx, 0, QTableWidgetItem(str(invoice_number))) self.table.setItem(row_idx, 1, QTableWidgetItem(serialfatwra or "لا يوجد")) self.table.setItem(row_idx, 2, QTableWidgetItem(invoice_type)) self.table.setItem(row_idx, 3, QTableWidgetItem(str(item_number))) self.table.setItem(row_idx, 4, QTableWidgetItem(item_name)) self.table.setItem(row_idx, 5, QTableWidgetItem(description or "لا يوجد")) price_item = QTableWidgetItem(f"{price_per_unit_with_vat:.2f}") price_item.setForeground(QBrush(QColor("green" if price_per_unit_with_vat >= 0 else "red"))) self.table.setItem(row_idx, 6, price_item) self.table.setItem(row_idx, 7, QTableWidgetItem(str(quantity))) balance_item = QTableWidgetItem(f"{int(current_balance)}") balance_item.setBackground(QColor("#add8e6")) balance_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(row_idx, 8, balance_item) total_item = QTableWidgetItem(f"{total_amount:.2f}") total_item.setForeground(QBrush(QColor("green" if total_amount >= 0 else "red"))) self.table.setItem(row_idx, 9, total_item) self.table.setItem(row_idx, 10, QTableWidgetItem(auto_date)) for col in range(11): self.table.item(row_idx, col).setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.update_monthly_totals(item_number, connection) connection.close() def update_monthly_totals(self, item_number, connection): cursor = connection.cursor() query = """ SELECT strftime('%m', i.date) AS month, SUM(d.quantity) as total_quantity FROM invoice_details d JOIN invoices i ON d.invoice_number = i.invoice_number WHERE i.invoice_type = 'مبيعات' AND d.item_number = ? AND strftime('%Y', i.date) = strftime('%Y', 'now') GROUP BY month """ cursor.execute(query, (item_number,)) results = cursor.fetchall() quarterly_colors = [ QColor("#ffcccc"), # الربع الأول QColor("#ccffcc"), # الربع الثاني QColor("#ccccff"), # الربع الثالث QColor("#ffffcc") # الربع الرابع ] for month in range(12): item = QTableWidgetItem("0") item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) quarter_index = month // 3 item.setBackground(quarterly_colors[quarter_index]) self.monthly_totals_table.setItem(0, month, item) for result in results: month = int(result[0]) - 1 total_quantity = result[1] item = QTableWidgetItem(str(total_quantity)) item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) quarter_index = month // 3 item.setBackground(quarterly_colors[quarter_index]) self.monthly_totals_table.setItem(0, month, item) cursor.close() 1 اقتباس
0 عبد الوهاب بومعراف نشر الخميس في 19:44 أرسل تقرير نشر الخميس في 19:44 وعليكم السلام ورحمة الله تعالى وبركاته، الفكرة تعتمد على إضافة الربح في الجدول الحالي كما يلي في جدول invoice_details ستحتاج الكمية المباعة (quantity)، سعر البيع (selling_price) ثم سعر الشراء (buying_price) ويجب أن تعدل query الاستعلام لجلب أسعار البيع والشراء من خلال إضافة عمود "الربح" في جدول عرض البيانات وعند فاتورة المبيعات فقط نحسب: الربح = الكمية × (سعر البيع - سعر الشراء) وفي نهاية الجدول تقوم بجمع كل أرباح المبيعات وتعرض إجمالي الربح للصنف. 1 اقتباس
0 صابر مغترب نشر الخميس في 20:34 الكاتب أرسل تقرير نشر الخميس في 20:34 ممكن استاذي ذالك تعمله لي في الكود بمثالي اقتباس
السؤال
صابر مغترب
السلام عليكم ورحمه الله وبركاته احبتي الكرام كيف الفكره لاستخراج الربح للصنف المباع
import sys import os import sqlite3 from PyQt5.QtWidgets import ( QDialog, QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem, QVBoxLayout, QHBoxLayout, QCompleter, QListView, QHeaderView ) from PyQt5.QtGui import QFont, QStandardItemModel, QStandardItem, QBrush, QColor from PyQt5.QtCore import Qt sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) from database_connection import connect_to_db # استيراد الدالة للاتصال بقاعدة البيانات class ItemMovementUI(QDialog): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("حركة الأصناف") self.setGeometry(100, 100, 1300, 600) self.setWindowModality(Qt.WindowModality.ApplicationModal) layout = QVBoxLayout() self.title_label = QLabel("حركة الأصناف") self.title_label.setFont(QFont("Amiri", 24, QFont.Weight.Bold)) self.title_label.setStyleSheet("color: #2e8b57;") layout.addWidget(self.title_label) self.item_number_label = QLabel("أدخل رقم الصنف:") self.item_number_label.setFont(QFont("Amiri", 12)) self.item_number_input = QLineEdit() self.item_number_input.setFixedSize(400, 30) self.item_number_input.setFont(QFont("Amiri", 12)) self.completer = QCompleter() self.completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive) self.suggestion_view = QListView() self.suggestion_view.setFont(QFont("Aljazeera", 12)) self.completer.setPopup(self.suggestion_view) self.item_number_input.setCompleter(self.completer) self.search_button = QPushButton("بحث") self.search_button.setFixedSize(100, 40) self.search_button.setFont(QFont("Amiri", 14)) self.search_button.clicked.connect(self.search_item_movements) input_layout = QHBoxLayout() input_layout.addWidget(self.item_number_label) input_layout.addWidget(self.item_number_input) input_layout.addWidget(self.search_button) layout.addLayout(input_layout) self.table = QTableWidget() self.table.setColumnCount(11) self.table.setHorizontalHeaderLabels([ "رقم الفاتورة", "Serial فاتورة", "نوع الفاتورة", "رقم الصنف", "اسم الصنف", "الوصف", "السعر مع الضريبة للحبة", "الكمية", "الرصيد الحالي", "المجموع", "تاريخ الحركة" ]) self.table.setRowHeight(0, 40) for row in range(1, 100): self.table.setRowHeight(row, 30) self.table.setFixedSize(1300, 400) self.table.setFont(QFont("Amiri", 12)) self.table.setColumnWidth(2, 150) self.table.setColumnWidth(3, 200) self.table.setColumnWidth(4, 80) self.table.setColumnWidth(6, 150) self.table.setStyleSheet(""" QTableWidget { background-color: #f0f0f0; border: 1px solid #ccc; alternate-background-color: #e0e0e0; } QTableWidget::item { padding: 5px; } QHeaderView::section { background-color: #2e8b57; color: white; font-size: 14px; padding: 5px; } """) self.table.horizontalHeader().setStretchLastSection(True) layout.addWidget(self.table) layout.addWidget(QLabel("المجاميع الشهرية:")) self.monthly_totals_table = QTableWidget() self.monthly_totals_table.setRowCount(1) self.monthly_totals_table.setColumnCount(12) self.monthly_totals_table.setHorizontalHeaderLabels([ 'ش1', 'ش2', 'ش3', 'ش4', 'ش5', 'ش6', 'ش7', 'ش8', 'ش9', 'ش10', 'ش11', 'ش12' ]) self.monthly_totals_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.monthly_totals_table.setRowHeight(0, 30) self.monthly_totals_table.setFixedHeight(60) layout.addWidget(self.monthly_totals_table) self.setLayout(layout) self.load_item_suggestions() def load_item_suggestions(self): connection = connect_to_db() cursor = connection.cursor() cursor.execute("SELECT item_number, item_name, description FROM items") items = cursor.fetchall() model = QStandardItemModel() for item_number, item_name, description in items: description_text = description if description else "لا يوجد" suggestion_text = f"{item_number} - {item_name} - {description_text}" model.appendRow(QStandardItem(suggestion_text)) self.completer.setModel(model) connection.close() def search_item_movements(self): item_number = self.item_number_input.text().split(" - ")[0].strip() if not item_number: return connection = connect_to_db() cursor = connection.cursor() # جلب الرصيد الابتدائي والسعر الابتدائي للشراء من جدول الأصناف cursor.execute("SELECT initial_stock, initial_buying_price FROM items WHERE item_number = ?", (item_number,)) item_row = cursor.fetchone() initial_stock = item_row[0] if item_row else 0 initial_buying_price = item_row[1] if item_row else 0 # حساب السعر مع الضريبة للحبة لصف "أول المدة" price_with_vat_initial = initial_buying_price + (initial_buying_price * 0.15) # حساب المجموع لصف "أول المدة" total_initial = price_with_vat_initial * initial_stock query = """ SELECT invoices.invoice_number, invoices.serialfatwra, invoices.description, invoices.invoice_type, invoice_details.item_number, invoice_details.item_name, invoice_details.quantity, invoice_details.sub_total_after_vat, invoice_details.Auto_Date FROM invoice_details INNER JOIN invoices ON invoice_details.invoice_number = invoices.invoice_number WHERE invoice_details.item_number = ? ORDER BY invoice_details.Auto_Date ASC """ cursor.execute(query, (item_number,)) rows = cursor.fetchall() self.table.setRowCount(len(rows) + 1) # تعبئة صف "أول المدة" initial_item = QTableWidgetItem("أول المدة") initial_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(0, 2, initial_item) initial_balance_item = QTableWidgetItem(f"{int(initial_stock)}") initial_balance_item.setBackground(QColor("#add8e6")) initial_balance_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(0, 8, initial_balance_item) # الكمية في صف "أول المدة" تساوي المخزون الابتدائي self.table.setItem(0, 7, QTableWidgetItem(f"{int(initial_stock)}")) # السعر مع الضريبة للحبة في صف "أول المدة" price_item = QTableWidgetItem(f"{price_with_vat_initial:.2f}") price_item.setForeground(QBrush(QColor("green" if price_with_vat_initial >= 0 else "red"))) self.table.setItem(0, 6, price_item) # المجموع في صف "أول المدة" total_item = QTableWidgetItem(f"{total_initial:.2f}") total_item.setForeground(QBrush(QColor("green" if total_initial >= 0 else "red"))) self.table.setItem(0, 9, total_item) current_balance = initial_stock # تعبئة باقي الصفوف for row_idx, row_data in enumerate(rows, start=1): invoice_number, serialfatwra, description, invoice_type, item_number, item_name, quantity, sub_total_after_vat, auto_date = row_data if invoice_type == 'مبيعات': quantity = -quantity current_balance += quantity # حساب السعر مع الضريبة للحبة price_per_unit_with_vat = sub_total_after_vat / quantity if quantity != 0 else 0 # حساب المجموع total_amount = price_per_unit_with_vat * quantity self.table.setItem(row_idx, 0, QTableWidgetItem(str(invoice_number))) self.table.setItem(row_idx, 1, QTableWidgetItem(serialfatwra or "لا يوجد")) self.table.setItem(row_idx, 2, QTableWidgetItem(invoice_type)) self.table.setItem(row_idx, 3, QTableWidgetItem(str(item_number))) self.table.setItem(row_idx, 4, QTableWidgetItem(item_name)) self.table.setItem(row_idx, 5, QTableWidgetItem(description or "لا يوجد")) price_item = QTableWidgetItem(f"{price_per_unit_with_vat:.2f}") price_item.setForeground(QBrush(QColor("green" if price_per_unit_with_vat >= 0 else "red"))) self.table.setItem(row_idx, 6, price_item) self.table.setItem(row_idx, 7, QTableWidgetItem(str(quantity))) balance_item = QTableWidgetItem(f"{int(current_balance)}") balance_item.setBackground(QColor("#add8e6")) balance_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.table.setItem(row_idx, 8, balance_item) total_item = QTableWidgetItem(f"{total_amount:.2f}") total_item.setForeground(QBrush(QColor("green" if total_amount >= 0 else "red"))) self.table.setItem(row_idx, 9, total_item) self.table.setItem(row_idx, 10, QTableWidgetItem(auto_date)) for col in range(11): self.table.item(row_idx, col).setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.update_monthly_totals(item_number, connection) connection.close() def update_monthly_totals(self, item_number, connection): cursor = connection.cursor() query = """ SELECT strftime('%m', i.date) AS month, SUM(d.quantity) as total_quantity FROM invoice_details d JOIN invoices i ON d.invoice_number = i.invoice_number WHERE i.invoice_type = 'مبيعات' AND d.item_number = ? AND strftime('%Y', i.date) = strftime('%Y', 'now') GROUP BY month """ cursor.execute(query, (item_number,)) results = cursor.fetchall() quarterly_colors = [ QColor("#ffcccc"), # الربع الأول QColor("#ccffcc"), # الربع الثاني QColor("#ccccff"), # الربع الثالث QColor("#ffffcc") # الربع الرابع ] for month in range(12): item = QTableWidgetItem("0") item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) quarter_index = month // 3 item.setBackground(quarterly_colors[quarter_index]) self.monthly_totals_table.setItem(0, month, item) for result in results: month = int(result[0]) - 1 total_quantity = result[1] item = QTableWidgetItem(str(total_quantity)) item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) quarter_index = month // 3 item.setBackground(quarterly_colors[quarter_index]) self.monthly_totals_table.setItem(0, month, item) cursor.close()
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.