From acdad3a58e50e20f16d2ebfe7479158bff51167d Mon Sep 17 00:00:00 2001 From: Xuan Loi Date: Mon, 5 Jan 2026 12:02:55 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-312.pyc | Bin 3432 -> 3432 bytes app/__pycache__/models.cpython-312.pyc | Bin 134831 -> 135224 bytes ...0344_payment_schedule_ovd_days_and_more.py | 48 ++++++++++++++++++ app/models.py | 17 +++++-- app/test.py | 17 +++---- 5 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 app/migrations/0344_payment_schedule_ovd_days_and_more.py diff --git a/api/__pycache__/settings.cpython-312.pyc b/api/__pycache__/settings.cpython-312.pyc index d1ea22b9235eb0d6bd918404f9319eb3f1c5a272..616382cf81a509405fd54314529c6c01fe536135 100644 GIT binary patch delta 20 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 delta 6032 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

^CJJO4H9RaB81 zTDQbMq{7j*5bbQZs0P}D+9W?6oueXd?0^jtivMx7OXr~7^WT$o$RN~6EFE}HenXG` zjK1`arcsbccv+&w^e$tNS#xT&>NKiKL;ZxMew0#=aru?VR}rh9T-5I$3DT#Ivnn3d z+d5zR3Iya?>K!TYguplfRaL5Y*JSxr&!-vEQm>W;=2~v5nq6vsRb{HmS=E%PI8=q6 zcaKO_v7^cyRh6j1LKO_^%2zkCx{5=D0J$mEMW-$>b?K-ZL#2F`t-bwNrHfakPn9cG za#I;e&Z9a)YSZv5Vvbddvu);HIpS3_jrXkDeoI0a;%1GVTROY6)x^!#lqkf`8aDT_ v*^jlFxY^pBRs?Ewfe~=kyIW2CUu&9?6Qp$ocO}->NLS+dG@~+D`vU(50~~J^ diff --git a/app/migrations/0344_payment_schedule_ovd_days_and_more.py b/app/migrations/0344_payment_schedule_ovd_days_and_more.py new file mode 100644 index 00000000..f9e08d3d --- /dev/null +++ b/app/migrations/0344_payment_schedule_ovd_days_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 5.1.7 on 2026-01-05 04:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0343_import_setting_call_api_delete_payment'), + ] + + operations = [ + migrations.AddField( + model_name='payment_schedule', + name='ovd_days', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='payment_schedule', + name='penalty_amount', + field=models.DecimalField(decimal_places=2, max_digits=15, null=True), + ), + migrations.AddField( + model_name='transaction', + name='amount_remain', + field=models.DecimalField(decimal_places=2, max_digits=15, null=True), + ), + migrations.AddField( + model_name='transaction', + name='ovd_days', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='transaction', + name='penalty_amount', + field=models.DecimalField(decimal_places=2, max_digits=15, null=True), + ), + migrations.AlterField( + model_name='company', + name='code', + field=models.CharField(db_index=True, max_length=20, null=True, unique=True), + ), + migrations.AlterField( + model_name='people', + name='code', + field=models.CharField(db_index=True, max_length=20, null=True, unique=True), + ), + ] diff --git a/app/models.py b/app/models.py index d5dac4cc..bab90530 100644 --- a/app/models.py +++ b/app/models.py @@ -1166,8 +1166,10 @@ class Country(models.Model): db_table = 'country' -class Company(models.Model): - code = models.CharField(max_length=20, null=False, unique=True, db_index=True) +class Company(AutoCodeModel): + code_prefix = "CP" + code_padding = 5 + code = models.CharField(max_length=20, null=True, unique=True, db_index=True) tax_code = models.CharField(max_length=20, null=True, unique=True) fullname = models.CharField(max_length=300, null=False, db_index=True) shortname = models.CharField(max_length=50, null=True, db_index=True) @@ -1188,8 +1190,10 @@ class Company(models.Model): db_table = 'company' -class People(models.Model): - code = models.CharField(max_length=20, null=False, unique=True, db_index=True) +class People(AutoCodeModel): + code_prefix = "RE" + code_padding = 5 + code = models.CharField(max_length=20, null=True, unique=True, db_index=True) fullname = models.CharField(max_length=50, null=False) phone = models.CharField(max_length=20, null=False) email = models.CharField(max_length=100, null=True) @@ -1356,6 +1360,9 @@ class Transaction(AutoCodeModel): deposit_received = models.DecimalField(max_digits=15, decimal_places=2, null=True) deposit_remaining = models.DecimalField(max_digits=15, decimal_places=2, null=True) amount_received = models.DecimalField(max_digits=15, decimal_places=2, null=True) + amount_remain = models.DecimalField(max_digits=15, decimal_places=2, null=True) + ovd_days = models.IntegerField(null=True) + penalty_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) payment_plan = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) @@ -1638,6 +1645,8 @@ class Payment_Schedule(AutoCodeModel): updater = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) entry = models.ForeignKey(Internal_Entry, null=True, related_name='+', on_delete=models.PROTECT) detail = models.JSONField(null=True) + ovd_days = models.IntegerField(null=True) + penalty_amount = models.DecimalField(null=True, max_digits=15, 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/test.py b/app/test.py index c5e3d5b2..1bb653f2 100644 --- a/app/test.py +++ b/app/test.py @@ -14,14 +14,9 @@ from django.forms.models import model_to_dict # Customer.objects.exclude(creator__username__in=arr).delete() # File.objects.exclude(user__username__in=arr).delete() # User.objects.exclude(username__in=arr).delete() - - - -Dealer_Setting.objects.all().delete() - -objs = [] -for a in Biz_Setting.objects.all(): - data = model_to_dict(a, exclude=['id']) - objs.append(Dealer_Setting(**data)) - -Dealer_Setting.objects.bulk_create(objs) \ No newline at end of file +# Dealer_Setting.objects.all().delete() +# objs = [] +# for a in Biz_Setting.objects.all(): +# data = model_to_dict(a, exclude=['id']) +# objs.append(Dealer_Setting(**data)) +# Dealer_Setting.objects.bulk_create(objs) \ No newline at end of file