[Python] Generowanie faktur z pliku csv

W tym wpisie zajmiemy się generowaniem fakur na podstawie danych z pliku CSV. Zadaniem programu będzie wczytanie danych z pliku CSV i wygenerowanie faktur w formacie PDF. Do generowania plików PDF użyty zostanie moduł reportlab, więc przed rozpoczęciem pracy zainstaluj go.

Przed rozpoczęciem tworzenia kodu ustalmy strukturę danych w pliku: numer faktury`data wystawienia`termin płatności`numer konta`kwota netto`kwota do zapłaty`dane wystawcy`dane klienta`nazwa usługi. Każda faktura to pojedynczy wiersz w pliku.

import csv
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

def generate_invoice(invoice_data):
    invoice_number, issue_date, due_date, account_number, net_amount, amount_due, issuer_info, client_info, service_info = invoice_data
    filename = f"invoice_{invoice_number}.pdf"

    # Tworzenie pliku PDF
    pdf = SimpleDocTemplate(filename, pagesize=letter)
    elements = []

    # Dodajemy tytuł dokumentu "Faktura VAT"
    styles = getSampleStyleSheet()
    title_style = styles['Heading1']
    title_paragraph = Paragraph("Faktura VAT", title_style)
    elements.append(title_paragraph)

    # Dodanie tytułu faktury
    header = f"Numer faktury: {invoice_number}"
    header_paragraph = Paragraph(header, styles['Normal'])
    elements.append(header_paragraph)

    data = [
        ['Element', 'Wartość'],
        ['Data wystawienia', issue_date],
        ['Termin płatności', due_date],
        ['Numer konta', account_number],
        ['Kwota netto', net_amount],
        ['Kwota do zapłaty', amount_due],
        ['Dane wystawcy', issuer_info],
        ['Dane Klienta', client_info],
        ['Usługa', service_info]  # Nowa kolumna dla usługi
    ]

    # Utworzenie tabeli faktury
    table = Table(data)
    table.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
        ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
        ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
        ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
        ('GRID', (0, 0), (-1, -1), 1, colors.black),
    ]))

    elements.append(table)

    # Ostateczne zapisanie dokumentu
    pdf.build(elements)
    print(f"Faktura zapisana: {filename}")

def read_invoices_from_csv(file_path):
    with open(file_path, mode='r', encoding='utf-8') as csvfile:
        csv_reader = csv.reader(csvfile, delimiter='`')
        for row in csv_reader:
            # Zakładamy, że każda linia w CSV ma odpowiednią liczbę danych
            if len(row) == 9:  # Teraz 9 elementów w wierszu
                generate_invoice(row)

if __name__ == "__main__":
    csv_file_path = 'invoices.csv'  # Ścieżka do pliku CSV
    read_invoices_from_csv(csv_file_path)

Przykładowy plik CSV:

00001`2023-10-01`2023-10-15`1234567890123456`1000.00`1230.00`"Firma XYZ, ul. Przykładowa 1, 00-001 Warszawa"`"Jan Kowalski, ul. Klienta 1, 00-001 Warszawa"`"Usługa informatyczna"
00002`2023-05-15`2023-05-30`1234567890123456`80.00`98.04`"Firma XYZ, ul. Przykładowa 2, 00-001 Warszawa"`"Jan Kowalski, ul. Klienta 2, 00-002 Warszawa"`"Usługa informatyczna"

Komentarze

Popular

[C++] Jak obliczyć pole i obwód trapezu?

[HTML] Jak wyśrodkować tekst?

[PHP|HTML] Odświeżenie strony