ساعة وبحر

إدارة مشاريعك ووقتك وفواتيرك باستخدام بايثون: دليل الفريلانسر

|

اكتشف كيف تساعدك لغة بايثون في تنظيم مشاريع الفريلانس، وتتبع وقتك بدقة، وتوليد فواتير PDF احترافية تلقائيًا لإرسالها لعملائك بضغطة زر.

عدد الكلمات: ١٠٠٠ · مدة القراءة: ٥ دقائق

إدارة المشاريع ببايثون

كيف تنظم  الوقت والأمور المالية باستخدام سكريبتات بايثون خفيفة وقوية


ملاحظة للقارئ: هذا المقال مستقل تمامًا ويقدم حلولاً عملية يمكنك تطبيقها فورًا. ولكن إذا كنت ترغب في ربط أدوات الإدارة البرمجية بنظام تواصل تلقائي مع عملائك، فننصحك بمراجعة المقال السابق:
بناء بوت تليجرام أو واتساب بسيط لإدارة عملائك ببايثون.

أكبر فخ يقع فيه الفريلانسر المبتدئ هو ظنه بأن جودة عمله التقني هي العامل الوحيد لنجاحه. الحقيقة الصادمة التي يدركها الجميع لاحقًا هي أن “الإدارة” تستهلك نصف وقتك تقريبًا. تتبع الساعات المستغرقة في تطوير كل ميزة، ومراقبة مواعيد تسليم المشاريع المختلفة، وصياغة الفواتير وإرسالها وملاحقتها؛ كل هذه مهام إدارية ضرورية لكنها لا تدر عليك مالاً بشكل مباشر إذا قمت بها يدويًا.

في عام 2026، أصبح بإمكانك تحويل حاسوبك إلى مدير مالي وإداري شخصي يعمل بدقة متناهية عبر بايثون. بدلاً من الاعتماد على تطبيقات مدفوعة باشتراكات شهرية، أو تضييع الوقت في تعديل ملفات إكسل وفوتوشوب لإصدار فاتورة لكل عميل، يمكنك بناء أدواتك الخاصة لتتبع وقتك وإصدار فواتير PDF احترافية خلال ثوانٍ معدودة.

في هذا المقال من منصة ذي يزن، سنبني معًا أداتين عمليتين بلغة بايثون: الأولى هي سكريبت ذكي لتتبع الوقت المستغرق في مهامك، والثانية هي أداة توليد فواتير PDF مخصصة لعملائك تلقائيًا.

الأداة الأولى: سكريبت بايثون لتتبع وقت المهام (Time Tracker)

إذا كنت تحاسب عملاءك بالساعة، أو تريد فقط معرفة أين يضيع يومك بدقة لتسعير مشاريعك القادمة بشكل صحيح، فإن هذه الأداة البسيطة ستغنيك عن البرامج المعقدة. سنستخدم مكتبة بايثون القياسية time ومكتبة datetime لتسجيل البداية والنهاية وحساب صافي وقت العمل، ثم حفظ البيانات في ملف CSV نظيف.

قم بإنشاء ملف جديد باسم tracker.py واكتب فيه الكود التالي:

import time
from datetime import datetime
import csv
import os

def track_time():
    project_name = input("أدخل اسم المشروع أو العميل: ").strip()
    task_name = input("أدخل اسم المهمة الحالية (مثلاً: تصميم الواجهة): ").strip()
    
    input("اضغط Enter عندما تبدأ العمل لبدء المؤقت... ⏳")
    start_time = time.time()
    start_readable = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f" بدأ المؤقت في: {start_readable}")
    
    input("\nاضغط Enter عند الانتهاء من العمل لإيقاف المؤقت... 🛑")
    end_time = time.time()
    end_readable = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    # حساب المدة بالدقائق والساعات
    duration_seconds = end_time - start_time
    duration_minutes = round(duration_seconds / 60, 2)
    duration_hours = round(duration_minutes / 60, 2)
    
    print(f"\n تم إيقاف المؤقت في: {end_readable}")
    print(f"⏱️ إجمالي وقت العمل: {duration_minutes} دقيقة ({duration_hours} ساعة).")
    
    # حفظ السجل في ملف CSV
    file_exists = os.path.isfile("time_log.csv")
    with open("time_log.csv", mode="a", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        if not file_exists:
            # كتابة العناوين إذا كان الملف جديدًا
            writer.writerow(["المشروع", "المهمة", "وقت البداية", "وقت النهاية", "المدة بالدقائق", "المدة بالساعات"])
        
        writer.writerow([project_name, task_name, start_readable, end_readable, duration_minutes, duration_hours])
    
    print(" Succeeded! تم حفظ السجل بنجاح في ملف time_log.csv")

if __name__ == "__main__":
    track_time()

عند تشغيل السكريبت نهاية كل يوم عمل، سيتكون لديك سجل مالي وإداري دقيق لجميع مشاريعك في ملف time_log.csv، والذي يمكنك فتحه عبر إكسل أو Pandas في أي وقت لتحليل إنتاجيتك.

translator desk organized workflow tools

الأداة الثانية: التوليد التلقائي للفواتير بصيغة PDF

بدلاً من ملء قوالب وورد أو فوتوشوب يدويًا لتجهيز فاتورة العميل، سنصنع أداة تأخذ تفاصيل المشروع والقيمة المالية، لتخرج لنا ملف PDF منسقًا باحترافية يحمل شعار عملك وهويتك البصرية.

 

لتحقيق ذلك، سنستخدم مكتبة بايثون شهيرة جدًا لإنشاء مستندات PDF تُدعى reportlab. قم بتثبيتها أولاً عبر موجه الأوامر:

pip install reportlab

بما أن الفواتير الموجهة لعملائك الأجانب أو المحليين يفضل أن تكون باللغة الإنجليزية لتجنب مشاكل دعم الخطوط العربية المعقدة في بعض مكتبات الـ PDF الافتراضية، سنقوم ببناء مولد فواتير باللغة الإنجليزية الاحترافية المباشرة.

قم بإنشاء ملف باسم invoice_generator.py واكتب فيه الكود التالي:

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

def create_invoice(client_name, invoice_id, items, tax_rate=0.05):
    filename = f"Invoice_{invoice_id}.pdf"
    doc = SimpleDocTemplate(filename, pagesize=letter, rightMargin=40, leftMargin=40, topMargin=40, bottomMargin=40)
    story = []
    
    styles = getSampleStyleSheet()
    
    # مواءمة الألوان والتنسيقات لهوية الموقع
    title_style = ParagraphStyle(
        'InvoiceTitle',
        parent=styles['Heading1'],
        fontSize=24,
        textColor=colors.HexColor("#c0392b"),
        spaceAfter=15
    )
    
    normal_style = styles['Normal']
    
    # 1. ترويسة الفاتورة
    story.append(Paragraph("INVOICE", title_style))
    story.append(Paragraph(f"Platform: Zy Yazan Platform (zyyazan.sy)", normal_style))
    story.append(Paragraph(f"Date: {datetime.now().strftime('%Y-%m-%d')}", normal_style))
    story.append(Paragraph(f"Invoice ID: #{invoice_id}", normal_style))
    story.append(Paragraph(f"Billed To: {client_name}", normal_style))
    story.append(Spacer(1, 20))
    
    # 2. تجهيز جدول البيانات
    # هيدر الجدول
    table_data = [["Service Description", "Hours / Qty", "Unit Price ($)", "Total ($)"]]
    
    subtotal = 0
    for item in items:
        name, qty, price = item
        total = qty * price
        subtotal += total
        table_data.append([name, str(qty), f"${price:.2f}", f"${total:.2f}"])
    
    # حساب الضرائب والإجمالي النهائي
    tax = subtotal * tax_rate
    grand_total = subtotal + tax
    
    table_data.append(["", "", "Subtotal:", f"${subtotal:.2f}"])
    table_data.append(["", "", f"Tax ({int(tax_rate*100)}%):", f"${tax:.2f}"])
    table_data.append(["", "", "Grand Total:", f"${grand_total:.2f}"])
    
    # 3. تنسيق الجدول بصريًا ليناسب الجوال واللابتوب كمستند ثابت
    invoice_table = Table(table_data, colWidths=[280, 70, 90, 90])
    invoice_table.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor("#1a3a5c")),
        ('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
        ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ('BOTTOMPADDING', (0, 0), (-1, 0), 8),
        ('BACKGROUND', (0, 1), (-1, -4), colors.HexColor("#f9f9f9")),
        ('GRID', (0, 0), (-1, -4), 0.5, colors.HexColor("#ddd")),
        ('LINEBELOW', (2, -3), (-1, -1), 1, colors.HexColor("#c0392b")), # تمييز خط الإجمالي
        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
        ('FONTSIZE', (0, 0), (-1, -1), 10),
    ]))
    
    story.append(invoice_table)
    story.append(Spacer(1, 40))
    
    # 4. تذييل الفاتورة وملاحظات الدفع
    story.append(Paragraph("Payment Terms: Please remit payment within 14 days of invoice date.", normal_style))
    story.append(Paragraph("Thank you for your business! If you have any questions, contact us via zyyazan.sy", normal_style))
    
    # بناء الملف
    doc.build(story)
    print(f"✔️ Done! Generated: {filename}")

if __name__ == "__main__":
    # تجربة الأداة ببيانات افتراضية لمشروع حقيقي
    client = "Global Marketing Corp"
    inv_num = "2026_087"
    project_items = [
        ["Custom Python Web Scraper Development", 10, 35], # 10 ساعات بسعر 35 دولار
        ["Telegram Bot Deployment & API Integration", 1, 150], # خدمة بسعر ثابت
        ["Database Optimization (PostgreSQL)", 4, 40]
    ]
    
    create_invoice(client, inv_num, project_items)

كيف تدمج الأداتين لتوفير نصف وقتك؟

القوة الحقيقية لبايثون تظهر عندما تجعل السكريبتات تتحدث مع بعضها البعض. فكر في سير العمل الاحترافي التالي الذي يمكنك تطبيقه بمفردك:

بايثون يستطيع قراءة الساعات المخزنة في ملف السجل time_log.csv الذي أنتجته الأداة الأولى، وتجميع الساعات الخاصة بعميل معين تلقائيًا، ثم تمرير هذه البيانات مباشرة إلى دالة create_invoice في الأداة الثانية، لتجد فاتورة الشهر قد ولدت بصيغة PDF وجاهزة للإرسال دون أن تفتح حاسبة أو تكتب سطرًا واحدًا في وورد!

مقارنة بين الحلول البرمجية الجاهزة والحلول المخصصة ببايثون

قد يتساءل البعض: لماذا لا أستخدم منصات جاهزة مثل FreshBooks أو موجز إكسل؟ الجدول التالي يوضح لك الفارق الاستراتيجي للفريلانسر الذكي:

وجه المقارنة المنصات التجارية الجاهزة أدوات بايثون المخصصة (سكريبت خاص)
التكلفة السنوية تتراوح بين 120 إلى 300 دولار سنويًا كاشتراكات متجددة. مجانية تمامًا وبدون أي مصاريف خفية.
خصوصية البيانات بيانات عملائك وأرباحك مخزنة على سيرفرات شركات أخرى. أمان كامل؛ البيانات مخزنة على جهازك أو سيرفرك الخاص.
المرونة والأتمتة محددة بالخواص المتاحة في باقاتهم فقط. لا نهائية؛ يمكنك جعل السكريبت يرسل الفاتورة للعميل عبر إيميل تلقائي.

الاستثمار في بناء أدواتك بنفسك لا يوفر مالك فحسب، بل يرفع من كفاءتك التقنية ويجعلك قادرًا على بيع هذه الأدوات نفسها كخدمات لأتمتة أعمال عملاء آخرين!

time management freelance workspace

خلاصة المقال والخطوة القادمة

تعلمنا اليوم كيف ننظم الجانب الخلفي من أعمالنا كفريلانسرز (تتبع الوقت والأمور المالية) باستخدام سكربتات بايثون خفيفة وقوية. تذكر دائمًا أن الأتمتة ليست رفاهية، بل هي وسيلتك الوحيدة لزيادة طاقتك الاستيعابية واستقبال مشاريع أكثر دون الاحتراق الوظيفي.

الخطوة التالية الموصى بها:

حتى الآن، كل الأدوات والسكريبتات التي قمنا ببنائها تعمل عبر نافذة الأوامر السوداء (Terminal) أو كخلفية صامتة. حان الوقت لنقهر هذا الحاجز وننتقل إلى عالم الويب الفسيح! في المقال القادم، سنتعلم كيف نأخذ مهاراتنا في بايثون ونحول صفحة ويب ثابتة صممتها بـ HTML إلى موقع ديناميكي تفاعلي يستقبل البيانات ويعالجها.

تابع معنا المقال التاسع: تحويل موقعك الثابت HTML إلى موقع ديناميكي ببايثون (Flask).


المراجع والمصادر:

  1. التوثيق الرسمي لمكتبة ReportLab لتوليد ملفات PDF: ReportLab Official Documentation
  2. دليل التعامل مع ملفات CSV في بايثون: Python CSV Library Guide

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *