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

تصميم تقرير ب Laravel

Beshoy Wageeh

السؤال

عايز اصمم تقرير دائن ومدين بالشكل ده
هجيب البيانات من قاعدة البيانات
بس عايز اعرف ازاي ابرمج خانه الاجمالي لكل صف
بحث يجمع الي قبله فقط
بحث يبقي اجمالي الدائن - اجمالي المدين

كشف-حساب-دائن-ومدين.jpg

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

في البداية نستخرج البيانات من قاعدة البيانات:

  1. تحديد نموذج قاعدة البيانات الذي يمثل حساباتك (مثلاً: حسابات، معاملات، ...).
  2. كتابة استعلام لعرض البيانات المطلوبة، مع مراعاة ترتيبها حسب التاريخ.

مع تضمين الأعمدة التالية في الاستعلام:

  • التاريخ: تاريخ المعاملة.
  • الدائن: المبلغ الدائن في المعاملة.
  • المدين: المبلغ المدين في المعاملة.
  • البيان: وصف موجز للمعاملة.

ثم برمجة خانة الإجمالي لكل صف كالتالي:

  1. استخدم حلقة foreach لعرض البيانات.
  2. داخل الحلقة، حدد متغير لحفظ إجمالي الدائن حتى الآن.
  3. أضف قيمة الدائن لكل صف إلى متغير إجمالي الدائن.
  4. حدد متغير آخر لحفظ إجمالي المدين حتى الآن.
  5. أضف قيمة المدين لكل صف إلى متغير إجمالي المدين.
  6. اعرض قيمة إجمالي الدائن وإجمالي المدين في كل صف.

بعد ذلك كتابة الكود الخاص بخانة صافي المبلغ (الإجمالي)  من خلال طرح إجمالي المدين من إجمالي الدائن وعرض قيمة صافي المبلغ (الإجمالي) في آخر الصف.

وكمثال بسيط:

@foreach ($transactions as $transaction)
<tr>
    <td>{{ $transaction->date }}</td>
    <td>{{ $transaction->credit }}</td>
    <td>{{ $transaction->debit }}</td>
    <td>{{ $transaction->description }}</td>

    @php
        $totalCredit += $transaction->credit;
        $totalDebit += $transaction->debit;
    @endphp

    <td>{{ number_format($totalCredit, 2) }}</td>
    <td>{{ number_format($totalDebit, 2) }}</td>
    <td>{{ number_format($totalCredit - $totalDebit, 2) }}</td>
</tr>
@endforeach

<tr>
    <th></th>
    <th>{{ number_format($totalCredit, 2) }}</th>
    <th>{{ number_format($totalDebit, 2) }}</th>
    <th></th>
    <th></th>
    <th></th>
    <th>{{ number_format($totalCredit - $totalDebit, 2) }}</th>
</tr>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
@forelse($transactions as $transaction)
<tr role="row">
  <td>{{ $loop->iteration }}</td>

  <td>{{ $transaction->user->first_name }}</td>
  <td>{{ $transaction->num }}
  </td>
  <td>{{ $transaction->payed_at }}</td>
  @php
  $totalCredit += $transaction->credit;
  $totalDebit += $transaction->debit;
  @endphp


  <td>{{ $transaction->formatcurrncy($transaction->credit) }}
  </td>
  <td>{{ $transaction->formatcurrncy($transaction->debit) }}
  <td>{{ number_format($totalCredit - $totalDebit, 2) }}</td>
</tr>
@empty
<tr>
  <td class="text-center" colspan="5">
    {{ trans('client.report_msg') }}</td>
</tr>
@endforelse

عند التجربة يظهر خطأ
Undefined variable $totalCredit

تم التعديل في بواسطة Beshoy Wageeh
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

1. اولا يجب ان تنشئ جدول Transaction يحتوي على الأعمدة التالية:

  • id: معرف للمعاملة (integer).
  • date: تاريخ المعاملة (date).
  • description: وصف المعاملة (string).
  • debit: المبلغ المدفوع (decimal).
  • credit: المبلغ المستحق (decimal).


2. ثانيا قم بإنشاء وحدة تحكم TransactionsController لانشاء دالة العرض index.لعرض جميع المعاملات مع خانة الإجمالي بهذه الطريقه
 

class TransactionsController extends Controller
{
    public function index()
    {
        $transactions = Transaction::all();
        return view('index', compact('transactions'));
    }
}

3. يجب انشاء المودل بهذه الامر 
 

php artisan make:model Transaction -m

ثما قم بوضع هذه الكود داخل المودل 
 

class Transaction extends Model
{
    use HasFactory;

    protected $fillable = [
        'date',
        'description',
        'debit',
        'credit',
    ];

    protected $casts = [
        'debit' => 'decimal:2',
        'credit' => 'decimal:2',
    ];

    public function calculateTotal()
    {
        return $this->debit - $this->credit;
    }
}

calculateTotal تستخدم لحساب الرصيد
4. اخير يمكنك عرض البيانات بهذه الطريقه 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Transactions</title>
</head>
<body>
    <h1>Transactions</h1>

    <table border="1">
        <tr>
            <th>Date</th>
            <th>Description</th>
            <th>Debit</th>
            <th>Credit</th>
            <th>Total</th>
        </tr>
        @foreach ($transactions as $transaction)
            <tr>
                <td>{{ $transaction->date }}</td>
                <td>{{ $transaction->description }}</td>
                <td>{{ $transaction->debit }}</td>
                <td>{{ $transaction->credit }}</td>
                <td>{{ $transaction->calculateTotal() }}</td>
            </tr>
        @endforeach
        <tr>
            <td colspan="4">Total</td>
            <td>{{ $transactions->sum('calculateTotal') }}</td>
        </tr>
    </table>
</body>
</html>


.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 ساعة قال Beshoy Wageeh:
@forelse($transactions as $transaction)
<tr role="row">
  <td>{{ $loop->iteration }}</td>

  <td>{{ $transaction->user->first_name }}</td>
  <td>{{ $transaction->num }}
  </td>
  <td>{{ $transaction->payed_at }}</td>
  @php
  $totalCredit += $transaction->credit;
  $totalDebit += $transaction->debit;
  @endphp


  <td>{{ $transaction->formatcurrncy($transaction->credit) }}
  </td>
  <td>{{ $transaction->formatcurrncy($transaction->debit) }}
  <td>{{ number_format($totalCredit - $totalDebit, 2) }}</td>
</tr>
@empty
<tr>
  <td class="text-center" colspan="5">
    {{ trans('client.report_msg') }}</td>
</tr>
@endforelse

عند التجربة يظهر خطأ
Undefined variable $totalCredit

بالطبع فالكود ليس كامل، ذلك مثال فقط، عليك إنشاء نموذج ومتحكم، في حال لم تكن على دراية بذلك، فأرجو دراسة أساسيات لارافل.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 12 ساعة قال Mustafa Suleiman:

بالطبع فالكود ليس كامل، ذلك مثال فقط، عليك إنشاء نموذج ومتحكم، في حال لم تكن على دراية بذلك، فأرجو دراسة أساسيات لارافل.

كل شئ تم انشائه وموجود وبرضوا لم تعمل

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 13 ساعة قال Mustafa Suleiman:

بالطبع فالكود ليس كامل، ذلك مثال فقط، عليك إنشاء نموذج ومتحكم، في حال لم تكن على دراية بذلك، فأرجو دراسة أساسيات لارافل.

بعد البحث وجدت ان الكود يقوم باعاده انشاء المتغير مع كل لفة في loop في البتالي لا يحتفظ ببيانات او قيمة

    private function calculateTotals($transactions)
    {
        $totals = [];

        foreach ($transactions as $transaction) {
            $previousTransactions = $transactions->filter(function ($t) use ($transaction) {
                return $t->payed_at <= $transaction->payed_at;
            });

            $previousDebit = $previousTransactions->sum('debit');
            $previousCredit = $previousTransactions->sum('credit');

            $totals[$transaction->id] = [
                'transaction' => $transaction,
                'total' => $previousCredit - $previousDebit,
            ];
        }

        return $totals;
    }

وهذه طريقة العرض

  @forelse($calc as $key=> $trans)
                                                <tr role="row">
                                                    <td>{{ $loop->iteration }}</td>
                                                    <td>{{$trans['transaction']->user->first_name}}</td>
                                                    <td>{{ $trans['transaction']->num }}</td>
                                                    <td>{{ $trans['transaction']->payed_at }}</td>
                                                    <td>{{ $trans['transaction']->formatcurrncy($trans['transaction']->credit) }}</td>
                                                    <td>{{ $trans['transaction']->formatcurrncy($trans['transaction']->debit) }}</td>

                                                    <td> {{$trans['transaction']->formatcurrncy($trans['total'])}} </td>
                                                </tr>
                                            @empty
                                                <tr>
                                                    <td class="text-center" colspan="5">
                                                        {{ trans('client.report_msg') }}</td>
                                                </tr>
                                            @endforelse

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...