From f55a0bbfac67f36b87a44efecae18c9114666c8d Mon Sep 17 00:00:00 2001 From: anhduy-tech Date: Wed, 28 Jan 2026 14:04:13 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-313.pyc | Bin 3451 -> 3451 bytes api/settings.py | 6 ++--- app/__pycache__/models.cpython-313.pyc | Bin 140441 -> 140576 bytes .../workflow_actions.cpython-313.pyc | Bin 12078 -> 12078 bytes .../workflow_utils.cpython-313.pyc | Bin 30481 -> 30948 bytes app/cleardata.py | 1 + ...payment_schedule_amount_remain_and_more.py | 23 ++++++++++++++++++ app/models.py | 2 ++ app/workflow_utils.py | 8 ++++++ 9 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 app/migrations/0372_payment_schedule_amount_remain_and_more.py diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index f11396c784f091cf64e3a06da7d45f4f966de4b7..ca5a46d38fde4e3651a4923eedc68e418682b082 100644 GIT binary patch delta 32 mcmew@^;?SjGcPX}0}xD}QMr-(HyfLYk)EN6*=8R0d^P~5vk4vm delta 32 mcmew@^;?SjGcPX}0}zBeRcz$`&BkVGq-SVpyqSkRpA7(=J_wEg diff --git a/api/settings.py b/api/settings.py index 32b12399..3be27995 100644 --- a/api/settings.py +++ b/api/settings.py @@ -21,7 +21,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = 'django-insecure-_u202k$8qq2p*cr_eo(7k!0ngr5^n)27@85+5oy8&41(u6&j54' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ['*'] @@ -81,8 +81,8 @@ ASGI_APPLICATION = 'api.asgi.application' # https://docs.djangoproject.com/en/4.1/ref/settings/#databases #prod:5.223.52.193 dev:5.223.42.146 -MODE = 'prod' -DBHOST = '172.17.0.1' if MODE == 'prod' else '5.223.52.193' +MODE = 'dev' +DBHOST = '172.17.0.1' if MODE == 'prod' else '5.223.42.146' DATABASES = { 'default': { diff --git a/app/__pycache__/models.cpython-313.pyc b/app/__pycache__/models.cpython-313.pyc index 29bc8a1216303c846d5de2fe83c253c065680aba..9791e67474219586be1e3b58372d2bc79960fb71 100644 GIT binary patch delta 3547 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 delta 6356 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 diff --git a/app/cleardata.py b/app/cleardata.py index 36277ca5..66adcb0a 100644 --- a/app/cleardata.py +++ b/app/cleardata.py @@ -29,6 +29,7 @@ def data_deletion(request): Contract.objects.all().delete() Product_Booked.objects.all().delete() Transaction_File.objects.all().delete() + Transaction_Gift.objects.all().delete() Co_Ownership.objects.all().delete() Transaction_Current.objects.all().delete() Transaction_Discount.objects.all().delete() diff --git a/app/migrations/0372_payment_schedule_amount_remain_and_more.py b/app/migrations/0372_payment_schedule_amount_remain_and_more.py new file mode 100644 index 00000000..569bb1d4 --- /dev/null +++ b/app/migrations/0372_payment_schedule_amount_remain_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.7 on 2026-01-27 09:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0371_alter_dealer_commission_amount_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='payment_schedule', + name='amount_remain', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AddField( + model_name='payment_schedule', + name='penalty_remain', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + ] diff --git a/app/models.py b/app/models.py index fccd37a9..753f14d6 100644 --- a/app/models.py +++ b/app/models.py @@ -1698,6 +1698,7 @@ class Payment_Schedule(AutoCodeModel): to_date = models.DateField(null=False) amount = models.DecimalField(max_digits=35, decimal_places=2) paid_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) + amount_remain = models.DecimalField(null=True, max_digits=35, decimal_places=2) remain_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) cycle = models.IntegerField(null=False) cycle_days = models.IntegerField(null=False) @@ -1711,6 +1712,7 @@ class Payment_Schedule(AutoCodeModel): ovd_days = models.IntegerField(null=True) penalty_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) penalty_paid = models.DecimalField(null=True, max_digits=35, decimal_places=2) + penalty_remain = models.DecimalField(null=True, max_digits=35, decimal_places=2) penalty_reduce = models.DecimalField(null=True, max_digits=35, decimal_places=2) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) diff --git a/app/workflow_utils.py b/app/workflow_utils.py index 430c7618..d08ca2f1 100644 --- a/app/workflow_utils.py +++ b/app/workflow_utils.py @@ -48,6 +48,14 @@ def resolve_value(expr, context): return now_in_context.date() return date.today() + if expr == "$today_str": + now_val = context.get("now", datetime.now()) + if isinstance(now_val, datetime): + return now_val.date().isoformat() + elif isinstance(now_val, date): + return now_val.isoformat() + return date.today().isoformat() + if expr == "$now_iso": return datetime.now().isoformat(timespec='seconds')