اذهب إلى المحتوى

السؤال

نشر

السلام عليكم ورحمه الله وبركاته احبتي الكرام كيف الفكره لاستخراج الربح للصنف المباع 

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()

Recommended Posts

  • 0
نشر

وعليكم السلام ورحمة الله تعالى وبركاته،

الفكرة تعتمد على إضافة الربح في الجدول الحالي كما يلي في جدول invoice_details ستحتاج الكمية المباعة (quantity)، سعر البيع (selling_price) ثم سعر الشراء (buying_price) ويجب أن تعدل query الاستعلام لجلب أسعار البيع والشراء من خلال إضافة عمود "الربح" في جدول عرض البيانات وعند فاتورة المبيعات فقط نحسب:

الربح = الكمية × (سعر البيع - سعر الشراء)

وفي نهاية الجدول تقوم بجمع كل أرباح المبيعات وتعرض إجمالي الربح للصنف.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...