示例#1
0
def lesson_edit(request, lesson_id=None):
    if lesson_id:
        lesson = get_object_or_404(Lesson, pk=lesson_id)
        title = "レッスン受講記録編集"
    else:
        lesson = Lesson()
        title = "レッスン受講記録登録"

    if request.method == 'POST':
        form = LessonForm(request.POST, instance=lesson)
        if form.is_valid():
            lesson = form.save(commit=False)
            lesson.charge_yen = 0
            lesson.save()

            # 対象ユーザーの対象プランの当月受講履歴を取得
            year = int(lesson.date.strftime('%Y'))
            month = int(lesson.date.strftime('%m'))
            first_day = date(year, month, 1)
            end_day = date(year, month + 1, 1) - timedelta(days=1)
            q = Q(member=lesson.member,
                  plan=lesson.plan,
                  date__range=[first_day, end_day])
            t_lessons = Lesson.objects.filter(q).order_by('date')

            ruiseki_start = 0  # 累積開始時間
            ruiseki_end = 0  # 累積終了時間

            # 当月受講履歴をひとつずつ計算する
            for t_lesson in t_lessons:
                print("id:" + str(t_lesson.id))
                # 今回の累積レッスン終了時間
                ruiseki_end += t_lesson.hour

                # 今回の支払金額
                charge_yen = 0

                # 基本時間 > 0
                if t_lesson.plan.basic_include_hour > 0:
                    # 累積終了時間 <= 基本時間
                    if ruiseki_end <= t_lesson.plan.basic_include_hour:
                        t_lesson.charge_yen = charge_yen
                        t_lesson.save()
                        continue
                    else:
                        ruiseki_start = t_lesson.plan.basic_include_hour

                # 従量開始時間 <= 累積終了時間
                # 従量開始時間 <= 累積開始時間
                # 累積開始時間 <= 従量終了時間 または 従量終了時間 is null
                plan_paygs = PlanPayg.objects.filter(
                    Q(Q(plan=t_lesson.plan), Q(
                        payg_end_hour__gte=ruiseki_start),
                      Q(payg_start_hour__lte=ruiseki_end))
                    | Q(Q(
                        plan=t_lesson.plan), Q(
                            payg_start_hour__lte=ruiseki_end),
                        Q(payg_end_hour__isnull=True))).order_by(
                            'payg_start_hour')

                for plan_payg in plan_paygs:
                    print("ruiseki_start:" + str(ruiseki_start))
                    print("ruiseki_end:" + str(ruiseki_end))
                    print("before_charge_yen:" + str(charge_yen))
                    if plan_paygs.count(
                    ) > 1 and plan_payg.payg_end_hour is not None:
                        if plan_payg == plan_paygs.last():
                            # (累積終了時間 - 現在の従量開始時間) × 従量料金
                            now_hour = (ruiseki_end - ruiseki_start)
                            charge_yen += (ruiseki_end - ruiseki_start
                                           ) * plan_payg.payg_charge_yen
                            ruiseki_start = ruiseki_end
                        else:
                            # (現在の従量終了時間 - 累積開始時間) × 従量料金
                            now_hour = (plan_payg.payg_end_hour -
                                        ruiseki_start)
                            charge_yen += (
                                plan_payg.payg_end_hour -
                                ruiseki_start) * plan_payg.payg_charge_yen
                            ruiseki_start = plan_payg.payg_end_hour
                    else:
                        # (累積終了時間 - 累積開始時間) × 従量料金
                        now_hour = (ruiseki_end - ruiseki_start)
                        charge_yen += (ruiseki_end - ruiseki_start
                                       ) * plan_payg.payg_charge_yen
                        ruiseki_start = ruiseki_end
                    print("now_hour:" + str(now_hour))
                    print("after_charge_yen:" + str(charge_yen))
                    print("payg_charge_yen:" + str(plan_payg.payg_charge_yen))

                # 支払金額を更新
                t_lesson.charge_yen = charge_yen
                t_lesson.save()

            return redirect('lesson:lesson_list')
    else:
        form = LessonForm(instance=lesson)

    return render(request, 'lesson/edit.html',
                  dict(form=form, lesson_id=lesson_id, title=title))