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

السؤال

نشر

اريد طريقه اطبع الفاتوره في ملف وتكون جميله بنفس التخطيط بالواجهه 

import sys
import traceback
import os
import sqlite3
from PyQt6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, 
    QLabel, QLineEdit, QPushButton, QMessageBox, QSizePolicy, QSplitter, QHBoxLayout, QFrame
)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap, QPainter


class FieldsWidget(QWidget):
    def __init__(self):
        super().__init__()
        # تعيين لون الخلفية يميل إلى البياض
        self.setStyleSheet("background-color: #FFFFFF;")  # لون خلفية مائل إلى البياض

        # إعداد التخطيط العام  
        main_layout = QVBoxLayout(self)  
        self.setLayout(main_layout)  

        # تقسيم النافذة إلى قسمين باستخدام QSplitter  
        splitter = QSplitter(Qt.Orientation.Horizontal)  

        # ---- القسم الأول: الفاتورة ----  
        right_layout = QVBoxLayout()  

        # إعداد الرأس باستخدام QVBoxLayout  
        self.header_frame = QFrame()  # حفظ إطار الرأس في خاصية الكائن self
        self.header_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")  
        header_layout = QVBoxLayout(self.header_frame)  

        # الشعار واسم الشركة في صف واحد  
        company_info_layout = QHBoxLayout()  

        self.logo_label = QLabel("الشعار")  
        self.logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter)  
        self.logo_label.setFixedSize(80, 80)  # حجم مربع مخصص للشعار  

        self.company_info_label = QLabel("اسم الشركة: شركة مثال\nالعنوان: شارع 123، المدينة\nاسم العميل: العميل الافتراضي")  
        self.company_info_label.setAlignment(Qt.AlignmentFlag.AlignLeft)  
        self.company_info_label.setStyleSheet("font-size: 12px;")  

        # إضافة الشعار ومعلومات الشركة إلى التخطيط الأفقي  
        company_info_layout.addWidget(self.logo_label)  
        company_info_layout.addWidget(self.company_info_label)  

        # عنوان الفاتورة  
        self.invoice_title_label = QLabel("فاتورة مبيعات مبسطة")  
        self.invoice_title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)  
        self.invoice_title_label.setStyleSheet("font-size: 16px; font-weight: bold;")  

        # إضافة العناصر إلى header_layout  
        header_layout.addLayout(company_info_layout)  
        header_layout.addWidget(self.invoice_title_label)  

        # إضافة الإطار إلى التخطيط العام  
        right_layout.addWidget(self.header_frame)  # إضافة header_frame إلى التخطيط العام


        # إعداد جدول التفاصيل  
        self.table_details = QTableWidget()  
        self.table_details.setColumnCount(12)  
        self.table_details.setHorizontalHeaderLabels([
            "ID", "رقم الفاتورة", "رقم الصنف", "اسم الصنف", "السعر", "الكمية", 
            "الإجمالي الفرعي", "خصم الصنف", "نسبة الخصم", "الإجمالي بعد الخصم", 
            "قيمة الضريبة", "الإجمالي بعد الضريبة"
        ])

        self.table_details.setColumnHidden(0, True)  # إخفاء عمود المعرف
        self.table_details.setColumnHidden(1, True)  # إخفاء عمود رقم الفاتورة

        self.table_details.setLayoutDirection(Qt.LayoutDirection.RightToLeft)  # تغيير الاتجاه إلى اليمين لليسار
        self.table_details.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)  

        right_layout.addWidget(self.table_details)  

        # إعداد تخطيط الحقول السفلية
        bottom_frame = QFrame()
        bottom_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")
        bottom_layout = QHBoxLayout(bottom_frame)

        # إعداد مستطيل الإجماليات
        totals_widget = QWidget()
        totals_layout = QVBoxLayout(totals_widget)

        self.total_label = QLabel("الإجمالي: 0")
        self.discount_label = QLabel("الخصم: 0")
        self.vat_label = QLabel("قيمة الضريبة: 0")
        self.total_after_vat_label = QLabel("الإجمالي بعد الضريبة: 0")

        # إضافة الحقول إلى التخطيط العمودي
        totals_layout.addWidget(self.total_label)
        totals_layout.addWidget(self.discount_label)
        totals_layout.addWidget(self.vat_label)
        totals_layout.addWidget(self.total_after_vat_label)

        # ضبط ارتفاع مستطيل الإجماليات
        totals_widget.setFixedHeight(170)  # تقليل الارتفاع إلى 100 بكسل

        # إضافة مستطيل الإجماليات إلى التخطيط السفلي
        bottom_layout.addWidget(totals_widget)

        # إعداد تخطيط المدفوعات
        payments_widget = QWidget()
        payments_layout = QVBoxLayout(payments_widget)

        self.cash_paid_label = QLabel("المدفوع نقداً: 0")
        self.bank_paid_label = QLabel("المدفوع بنك: 0")

        # إضافة حقول المدفوعات
        payments_layout.addWidget(self.cash_paid_label)
        payments_layout.addWidget(self.bank_paid_label)

        # ضبط ارتفاع مستطيل المدفوعات
        payments_widget.setFixedHeight(100)  # تقليل الارتفاع إلى 100 بكسل

        # إضافة مستطيل المدفوعات إلى التخطيط السفلي
        bottom_layout.addWidget(payments_widget)

        # إعداد تخطيط الباركود
        barcode_widget = QWidget()
        barcode_layout = QVBoxLayout(barcode_widget)

        # حقل للباركود
        self.barcode_label = QLabel()  # لا نضع نص هنا
        self.barcode_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.barcode_label.setFixedSize(150, 100)  # تصغير حجم الباركود إلى 150x100 بكسل

        # إضافة الباركود إلى التخطيط
        barcode_layout.addWidget(self.barcode_label)

        # ضبط ارتفاع مستطيل الباركود
        barcode_widget.setFixedHeight(120)  # تقليل الارتفاع إلى 120 بكسل

        # إضافة مستطيل الباركود إلى التخطيط السفلي
        bottom_layout.addWidget(barcode_widget)

        # إضافة الإطار إلى التخطيط العام
        right_layout.addWidget(bottom_frame)

        # إضافة القسم الأيمن إلى QSplitter
        right_widget = QWidget()
        right_widget.setLayout(right_layout)
        splitter.addWidget(right_widget)

        # ---- القسم الثاني: البحث والفواتير ----  
        left_layout = QVBoxLayout()  

        # حقل البحث  
        self.search_input = QLineEdit(self)  
        self.search_input.setPlaceholderText("ابحث عن رقم الفاتورة...")  
        self.search_input.textChanged.connect(self.filter_invoices)  
        left_layout.addWidget(self.search_input)  

        # إعداد جدول الفواتير  
        self.table_invoices = QTableWidget()  
        self.table_invoices.setColumnCount(13)  
        self.table_invoices.setHorizontalHeaderLabels([  
            "ID", "رقم الفاتورة", "نوع الفاتورة", "نوع الدفع", "رقم الحساب", "التاريخ",  
            "الإجمالي", "الخصم", "الإجمالي بعد الخصم", "قيمة الضريبة", "الإجمالي بعد الضريبة",  
            "المدفوع نقدا", "المدفوع بنك"  
        ])  

        self.table_invoices.setColumnHidden(0, True)  # إخفاء عمود المعرف
        self.table_invoices.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)  
        left_layout.addWidget(self.table_invoices)  

        # إضافة القسم الأيسر إلى QSplitter  
        left_widget = QWidget()  
        left_widget.setLayout(left_layout)  
        splitter.addWidget(left_widget)  

        # إضافة QSplitter إلى التخطيط الرئيسي
        main_layout.addWidget(splitter)

        # إضافة المتغيرات الجديدة
        self.selected_invoice_number = None

        self.load_data()
        self.table_invoices.cellClicked.connect(self.load_invoice_details)

        self.setWindowTitle("معاينة الفاتورة")
        self.setGeometry(300, 300, 1000, 600)  # تعديل حجم النافذة


    def filter_invoices(self):
        search_text = self.search_input.text().lower()
        filtered_invoices = [invoice for invoice in self.invoices_data if search_text in invoice[1].lower()]
        self.populate_invoices_table(filtered_invoices)

    def populate_invoices_table(self, invoices):
        self.table_invoices.setRowCount(0)
        for invoice in invoices:
            row_position = self.table_invoices.rowCount()
            self.table_invoices.insertRow(row_position)
            for column, data in enumerate(invoice):
                self.table_invoices.setItem(row_position, column, QTableWidgetItem(str(data)))

    def load_data(self):
        base_dir = os.path.dirname(os.path.abspath(__file__))  # المجلد الحالي
        db_path = os.path.join(base_dir, '..', 'data', 'database.db')  # المسار إلى قاعدة البيانات

        if not os.path.exists(db_path):
            QMessageBox.critical(self, "خطأ", "قاعدة البيانات غير موجودة.")
            return
        
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # جلب جميع الفواتير
        cursor.execute("SELECT * FROM invoices")
        self.invoices_data = cursor.fetchall()

        self.populate_invoices_table(self.invoices_data)
        conn.close()

    def load_invoice_details(self, row, column):
        invoice_number = self.table_invoices.item(row, 1).text()  # الحصول على رقم الفاتورة من العمود الثاني
        self.load_invoice_details_from_db(invoice_number)

    def load_invoice_details_from_db(self, invoice_number):
        base_dir = os.path.dirname(os.path.abspath(__file__))  # المجلد الحالي
        db_path = os.path.join(base_dir, '..', 'data', 'database.db')  # المسار إلى قاعدة البيانات

        if not os.path.exists(db_path):
            QMessageBox.critical(self, "خطأ", "قاعدة البيانات غير موجودة.")
            return
        
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # جلب تفاصيل الفاتورة من جدول invoice_details
        cursor.execute("SELECT * FROM invoice_details WHERE invoice_number=?", (invoice_number,))
        details_data = cursor.fetchall()

        # عرض تفاصيل الفاتورة في الجدول
        self.populate_invoice_details_table(details_data)

        # جلب المعلومات من جدول الفواتير الأساسي (للحصول على القيم الإجمالية والمدفوعات)
        cursor.execute("""
            SELECT total, total_discount, discount_percentage, total_after_discount, vat_value, total_after_vat, paid_cash, paid_bank
            FROM invoices
            WHERE invoice_number=?
        """, (invoice_number,))
        invoice_data = cursor.fetchone()

        if invoice_data:
            # تحديث الحقول الإجمالية والمدفوعات
            self.total_label.setText(f"الإجمالي: {invoice_data[0]}")
            self.discount_label.setText(f"الخصم: {invoice_data[1]}")
            self.vat_label.setText(f"قيمة الضريبة: {invoice_data[4]}")
            self.total_after_vat_label.setText(f"الإجمالي بعد الضريبة: {invoice_data[5]}")
            self.cash_paid_label.setText(f"المدفوع نقداً: {invoice_data[6]}")
            self.bank_paid_label.setText(f"المدفوع بنك: {invoice_data[7]}")
        else:
            # إذا لم يتم العثور على الفاتورة، نقوم بإعادة ضبط الحقول
            self.total_label.setText("الإجمالي: 0")
            self.discount_label.setText("الخصم: 0")
            self.vat_label.setText("قيمة الضريبة: 0")
            self.total_after_vat_label.setText("الإجمالي بعد الضريبة: 0")
            self.cash_paid_label.setText("المدفوع نقداً: 0")
            self.bank_paid_label.setText("المدفوع بنك: 0")

        # إعداد الباركود
        barcode_image_path = os.path.join(base_dir, 'barcodes', f"{invoice_number}.png")
        if os.path.exists(barcode_image_path):
            pixmap = QPixmap(barcode_image_path)
            self.barcode_label.setPixmap(pixmap)
            self.barcode_label.setScaledContents(True)
        else:
            self.barcode_label.setText("لا توجد صورة باركود")

        conn.close()


    def populate_invoice_details_table(self, details):
        self.table_details.setRowCount(0)
        for detail in details:
            row_position = self.table_details.rowCount()
            self.table_details.insertRow(row_position)
            for column, data in enumerate(detail):
                self.table_details.setItem(row_position, column, QTableWidgetItem(str(data)))


def exception_hook(type, value, tb):
    print("Unhandled Exception:")
    print(f"Type: {type.__name__}")
    print(f"Value: {value}")
    print("Traceback:")
    traceback.print_tb(tb)

if __name__ == "__main__":
    sys.excepthook = exception_hook
    app = QApplication(sys.argv)
    window = FieldsWidget()
    window.show()
    sys.exit(app.exec())

 

Recommended Posts

  • 0
نشر

ستحتاج مكتبة QPrinter من PyQt6 لطباعة محتوى QWidget، ولا يمكنك طباعة QWidget مباشرةً، بل عليك رسم محتوى QWidget على QPainter المرتبط بـ QPrinter.

قم بالاستيراد كالتالي:

from PyQt6.QtGui import QPixmap, QPainter, QPrinter

وإنشاء دالة باسم paint_invoice:

    def paint_invoice(self, painter):
    
        header_rect = QRect(0, 0, painter.device().width(), 150) 
        painter.drawRect(header_rect)
        painter.drawText(header_rect, Qt.AlignmentFlag.AlignCenter, "فاتورة مبيعات مبسطة")

        company_info_rect = QRect(10, 20, painter.device().width() - 20, 100)
        painter.drawText(company_info_rect, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop, "اسم الشركة: شركة مثال\nالعنوان: شارع 123، المدينة\nاسم العميل: العميل الافتراضي")

        table_rect = QRect(10, 170, painter.device().width() - 20, 200) 
        painter.drawRect(table_rect)
        self.paint_table(painter, self.table_details, table_rect)

        totals_rect = QRect(10, 380, painter.device().width() - 20, 100) 
        painter.drawRect(totals_rect)
        self.paint_totals(painter, totals_rect)

        barcode_rect = QRect(painter.device().width() - 170, 380, 150, 100) 
        if self.barcode_label.pixmap():
            painter.drawPixmap(barcode_rect, self.barcode_label.pixmap())

ثم إضافة الزر:

    def __init__(self):
        super().__init__()
        # ... (أضف التالي) ...
        self.print_button = QPushButton("طباعة الفاتورة")
        self.print_button.clicked.connect(self.print_invoice)
        main_layout.addWidget(self.print_button)

 

  • 0
نشر

بارك الله فيك استاذي  مشكوررر  اعطيتني شي جميل جدا ولكن كوني متعلم جديد واستعين بعد الله بكم  وبالبحث هنا وهناك واللذكاء الصناعي الا اني اجد الابداع فيك فحبيت اغير الوضع ونبدا بشكل افضل للواجهه حيث تبدو جذابه الان بحاجه اضافه الي اسفل الفاتوره الاجماليات والتي تتبع جدول الفاتوره 

import sys
import traceback
import os
import sqlite3
from PyQt6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QPushButton, QLabel,
    QFrame, QHBoxLayout, QLineEdit, QMessageBox, QCompleter, QTableWidget, QTableWidgetItem
)
from PyQt6.QtGui import QPixmap
from PyQt6.QtCore import Qt


class FieldsWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("background-color: #FFFFFF;")
        main_layout = QVBoxLayout(self)
        self.setLayout(main_layout)

        # Search field for invoice number
        self.search_field = QLineEdit(self)
        self.search_field.setPlaceholderText("ابحث عن رقم الفاتورة...")
        main_layout.addWidget(self.search_field)

        # Load invoice numbers for auto-complete
        invoice_numbers = self.get_invoice_numbers()
        if invoice_numbers:
            completer = QCompleter(invoice_numbers)
            self.search_field.setCompleter(completer)

        # Connect the textChanged signal to update invoice details
        self.search_field.textChanged.connect(self.update_invoice_details)

        # Header setup
        self.header_frame = self.create_header()
        main_layout.addWidget(self.header_frame)

        # Invoice details setup
        self.invoice_details_frame = self.create_invoice_details()
        main_layout.addWidget(self.invoice_details_frame)

        # Table setup for displaying invoice items
        self.table_details = QTableWidget()
        self.table_details.setColumnCount(8)  # Set the number of columns
        self.table_details.setHorizontalHeaderLabels([
            "ID", "رقم الفاتورة", "رقم الصنف", "اسم الصنف", "السعر", 
            "الكمية", "المجموع الفرعي", "الإجمالي بعد الضريبة"
        ])
        main_layout.addWidget(self.table_details)

        self.setWindowTitle("معاينة الفاتورة")
        self.setGeometry(300, 300, 800, 600)

    def create_header(self):
        # Create header frame
        header_frame = QFrame()
        header_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")
        header_layout = QVBoxLayout(header_frame)

        # Company info layout
        company_info_layout = QHBoxLayout()
        company_data = self.get_company_data()

        if company_data:
            company_name, company_activity, company_address, tax_number, logo_path = company_data
            self.logo_label = QLabel(self)
            self.logo_pixmap = QPixmap(logo_path)
            if not self.logo_pixmap.isNull():
                self.logo_label.setPixmap(self.logo_pixmap.scaled(80, 80, Qt.AspectRatioMode.KeepAspectRatio))
            self.company_info_label = QLabel(
                f"اسم الشركة: {company_name}\n"
                f"النشاط: {company_activity}\n"
                f"العنوان: {company_address}\n"
                f"الرقم الضريبي: {tax_number}"
            )
        else:
            self.logo_label = QLabel("شعار غير متوفر")
            self.company_info_label = QLabel("بيانات الشركة غير متوفرة")

        company_info_layout.addWidget(self.logo_label)
        company_info_layout.addWidget(self.company_info_label)
        self.invoice_title_label = QLabel("فاتورة مبيعات مبسطة")
        self.invoice_title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.invoice_title_label.setStyleSheet("font-size: 16px; font-weight: bold;")

        header_layout.addLayout(company_info_layout)
        header_layout.addWidget(self.invoice_title_label)
        return header_frame

    def create_invoice_details(self):
        # Create invoice details frame
        invoice_details_frame = QFrame()
        invoice_details_frame.setStyleSheet("border: 2px solid #4CAF50; border-radius: 10px; padding: 10px;")
        invoice_details_layout = QHBoxLayout(invoice_details_frame)

        # Invoice info
        self.invoice_info_frame = QFrame()
        self.invoice_info_frame.setStyleSheet("border: 1px solid #000000; padding: 5px;")
        invoice_info_layout = QVBoxLayout(self.invoice_info_frame)

        self.invoice_number_label = QLabel("رقم الفاتورة: ")
        self.invoice_date_label = QLabel("تاريخ الفاتورة: ")
        self.payment_type_label = QLabel("نوع الدفع: ")

        invoice_info_layout.addWidget(self.invoice_number_label)
        invoice_info_layout.addWidget(self.invoice_date_label)
        invoice_info_layout.addWidget(self.payment_type_label)
        self.invoice_info_frame.setLayout(invoice_info_layout)

        # Client info
        self.client_info_frame = QFrame()
        self.client_info_frame.setStyleSheet("border: 1px solid #000000; padding: 5px;")
        client_info_layout = QVBoxLayout(self.client_info_frame)

        self.account_number_label = QLabel("رقم الحساب: 98765")
        self.client_name_label = QLabel("اسم العميل: أحمد محمد")
        self.client_address_label = QLabel("عنوان العميل: الرياض")

        client_info_layout.addWidget(self.account_number_label)
        client_info_layout.addWidget(self.client_name_label)
        client_info_layout.addWidget(self.client_address_label)
        self.client_info_frame.setLayout(client_info_layout)

        # Add frames to layout
        invoice_details_layout.addWidget(self.invoice_info_frame)
        invoice_details_layout.addWidget(self.client_info_frame)
        return invoice_details_frame

    def update_invoice_details(self):
        """تحديث تفاصيل الفاتورة عند تغيير نص البحث"""
        invoice_number = self.search_field.text()
        self.invoice_number_label.setText(f"رقم الفاتورة: {invoice_number}")  # تحديث رقم الفاتورة في الواجهة
        if invoice_number:
            self.load_invoice_details(invoice_number)

    def load_invoice_details(self, invoice_number):
        """تحميل تفاصيل الفاتورة استنادًا إلى رقم الفاتورة المحدد"""
        data_dir = os.path.dirname(os.path.abspath(__file__))
        db_file = os.path.join(data_dir, '..', 'data', 'database.db')

        try:
            conn = sqlite3.connect(db_file)
            cursor = conn.cursor()
            cursor.execute('SELECT payment_type, date FROM invoices WHERE invoice_number = ?', (invoice_number,))
            result = cursor.fetchone()

            if result:
                payment_type, date = result
                self.payment_type_label.setText(f"نوع الدفع: {payment_type}")
                self.invoice_date_label.setText(f"تاريخ الفاتورة: {date}")  # تحديث تاريخ الفاتورة
            else:
                self.payment_type_label.setText("نوع الدفع: غير متوفر")
                self.invoice_date_label.setText("تاريخ الفاتورة: غير متوفر")  # تحديث حالة عدم توفر التاريخ

            # Load invoice items from `invoice_details` table
            self.load_invoice_items(invoice_number)

        except sqlite3.Error as e:
            print(f"خطأ في تحميل تفاصيل الفاتورة: {e}")

        finally:
            conn.close()

    def load_invoice_items(self, invoice_number):
        """تحميل تفاصيل الأصناف المرتبطة بالفاتورة من جدول invoice_details"""
        data_dir = os.path.dirname(os.path.abspath(__file__))
        db_file = os.path.join(data_dir, '..', 'data', 'database.db')

        try:
            conn = sqlite3.connect(db_file)
            cursor = conn.cursor()

            # Query to fetch items related to the invoice
            cursor.execute('SELECT id, invoice_number, item_number, item_name, price, quantity, subtotal, sub_total_after_vat FROM invoice_details WHERE invoice_number = ?', (invoice_number,))
            items = cursor.fetchall()

            # Clear the table before adding new rows
            self.table_details.setRowCount(0)

            # Populate the table with fetched items
            for row_num, row_data in enumerate(items):
                self.table_details.insertRow(row_num)
                for col_num, data in enumerate(row_data):
                    self.table_details.setItem(row_num, col_num, QTableWidgetItem(str(data)))

        except sqlite3.Error as e:
            print(f"خطأ في تحميل تفاصيل الأصناف: {e}")

        finally:
            conn.close()

    def get_invoice_numbers(self):
        """استرجاع أرقام الفواتير من قاعدة البيانات"""
        data_dir = os.path.dirname(os.path.abspath(__file__))
        db_file = os.path.join(data_dir, '..', 'data', 'database.db')

        # Print path for debugging
        print(f"Database file path: {db_file}")

        # Ensure the data directory exists
        if not os.path.exists(data_dir):
            os.makedirs(data_dir)

        try:
            conn = sqlite3.connect(db_file)
            cursor = conn.cursor()

            # استرجاع أرقام الفواتير
            cursor.execute('SELECT invoice_number FROM invoices')
            result = cursor.fetchall()

            # إعادة قائمة بأرقام الفواتير
            return [str(row[0]) for row in result] if result else []

        except sqlite3.Error as e:
            print(f"خطأ في استرجاع أرقام الفواتير: {e}")
            return []

        finally:
            conn.close()


    def get_company_data(self):
        """استرجاع بيانات الشركة من قاعدة البيانات"""
        data_dir = os.path.dirname(os.path.abspath(__file__))
        db_file = os.path.join(data_dir, '..', 'data', 'database.db')

        conn = sqlite3.connect(db_file)
        cursor = conn.cursor()

        try:
            # استرجاع جميع الأعمدة المطلوبة
            cursor.execute('SELECT company_name, company_activity, company_address, tax_number, logo_path FROM company_data WHERE id = 1')
            result = cursor.fetchone()

            if result:
                return result
            else:
                print("لم يتم العثور على بيانات الشركة")
                return None

        except sqlite3.Error as e:
            print(f"خطأ في استرجاع البيانات: {e}")
            return None

        finally:
            conn.close()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FieldsWidget()
    window.show()
    sys.exit(app.exec())
وللتوضيه دي اعمده جدول الفاتوره التي اريده ان تستخرج منها الخاص بالاجمياليات وتكون بداخل مستطيل اسفل الفاتوره invoices (
        id INTEGER PRIMARY KEY AUTOINCREMENT,  -- رقم تسلسلي فريد (العمود الرئيسي)
        invoice_number TEXT NOT NULL,           -- رقم الفاتورة (لا يمكن أن يكون فارغاً)
        payment_type TEXT,                      -- نوع الدفع
        account_number TEXT,                    -- رقم الحساب
        date TEXT,                              -- تاريخ الفاتورة
        total REAL,                             -- المجموع الكلي
        total_discount REAL,                    -- إجمالي الخصم
        discount_percentage REAL,               -- نسبة الخصم
        total_after_discount REAL,              -- الإجمالي بعد الخصم
        vat_value REAL,                         -- قيمة الضريبة
        total_after_vat REAL,                   -- الإجمالي بعد الضريبة

 

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...