درس ~5 دقیقه

محاسبهٔ زندهٔ تخفیف ثبت‌نام با Rollup و Formula

بدون ذخیرهٔ اسنپ‌شات و بدون تغییر فلو، فقط با ترکیب Rollup و Formula، مبلغ کل تخفیف ثبت‌نام روی هر خانواده به‌صورت زنده محاسبه می‌شود.

فرض کنید هر یک از این پنج مورد ۱۰٪ تخفیف می‌دهد و مجموع حداکثر ۱۰۰٪: همکاری پدر، همکاری مادر، طلبگی پدر، دو یا چند فرزندِ ثبت‌نامی، پرداخت یکجا. مبلغ نهایی = شهریهٔ کل × درصد تخفیف / ۱۰۰. هدف این است که این مقدار همیشه بر اساس دادهٔ فعلی خانواده به‌روز باشد، نه یک عدد ذخیره‌شده.

چرا Rollup با count و فیلتر؟

Rollup فقط تجمیع (sum/avg/count/min/max/concat) می‌دهد و نمی‌تواند «مقدار یک فیلد از یک رکورد خاص» را برگرداند. برای پرسش «آیا پدرِ همکارِ مدرسه وجود دارد؟» از count با دو فیلتر روی مجموعهٔ اشخاص استفاده می‌کنیم: role=پدر و is_school_collaborator=yes. خروجی ۰ یا ۱ می‌شود و در فرمول با min(1, …) کلمپ می‌شود تا اگر روزی رکورد تکراری هم باشد بیش از ۱۰٪ حساب نشود.

چهار فیلد Rollup روی خانواده

۱) disc_flag_collab_father — count روی persons با role=پدر و is_school_collaborator=yes. ۲) disc_flag_collab_mother — همان با role=مادر. ۳) disc_flag_seminarian_father — count روی persons با role=پدر و is_seminarian=yes. ۴) disc_enrollments_count — count روی enrollments بدون فیلتر.

فرمول درصد

یک فیلد Formula به نام family_total_discount_pct بسازید: min(100, min(1, disc_flag_collab_father)*10 + min(1, disc_flag_collab_mother)*10 + min(1, disc_flag_seminarian_father)*10 + if(disc_enrollments_count >= 2, 10, 0) + if(installment_plan == "full", 10, 0))

فرمول مبلغ نهایی

فیلد Formula با برچسب «جمع تخفیف‌های ثبت‌نام» به نام family_total_discount: round(family_enrollments_tuition_total * family_total_discount_pct / 100, 0)

چون Rollup و Formula هنگام خواندن رکورد ارزیابی می‌شوند، تغییر هر مبنا (نقش، پرچم‌ها، installment_plan، شهریه‌ها، تعداد enrollments) بلافاصله در فیلد تخفیف بازتاب می‌یابد — هیچ گره‌ای در فلو و هیچ update_record لازم نیست.