From 9a01afd1c635362841e8a0ec5079ea6cb23018cd Mon Sep 17 00:00:00 2001 From: anhduy-tech Date: Tue, 27 Jan 2026 12:05:37 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-313.pyc | Bin 3446 -> 3451 bytes api/settings.py | 2 +- app/__pycache__/models.cpython-313.pyc | Bin 139670 -> 140441 bytes app/__pycache__/views.cpython-313.pyc | Bin 74521 -> 74521 bytes .../0369_alter_internal_entry_customer.py | 19 ++ app/migrations/0370_transaction_gift.py | 27 +++ ...alter_dealer_commission_amount_and_more.py | 173 ++++++++++++++++++ app/models.py | 75 ++++---- 8 files changed, 262 insertions(+), 34 deletions(-) create mode 100644 app/migrations/0369_alter_internal_entry_customer.py create mode 100644 app/migrations/0370_transaction_gift.py create mode 100644 app/migrations/0371_alter_dealer_commission_amount_and_more.py diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index 41931f458752559244a19e31637ac3e838704aef..f11396c784f091cf64e3a06da7d45f4f966de4b7 100644 GIT binary patch delta 288 zcmew+^;?SfGcPX}0}zBeRb)P&$h%CFrHD6}rHC(>Q=cK2C726HatAURFb4DJvFI}v z@dxu32?X;M2?p~|yrW$&9W0~A94xEHVZc}<5-b-i4^$`@tN0q@YnPA~y^{9|B4yaHzSRPC&fJsFIMtznd(O{(_ zv0&vQaiGx>Kr9KwQo$-k(!r`lGQq;ZYQgF;!h8(D8ph1Qn!#E?o!WZLKr>~5ayr4f zF~Y%mCQSMuXXxuO0mbFg4KxiCH8!^~)-W=(ZFiLNJ!~Tq!(QWc&Zg)n$$cu0L=_=IlxpK8LLTuFUlPQvuDTQ3c4-|| zN~P*(@F;b)an||Qs^_k{+90i?w2uGGe32KykMX_Tnc3Ny+1c6I{p1JN#fMxg-ShBp ztAKxcw;y9!Z^^4v4bJD)ZvY)P^_pR-RINf#g)R^u?N6{n-sM2UmqV2XoeJ!xirti3 zb;Py7zd);koheby&{6zri8pqJ3Kg^@WT(Z5cZR*MM$_+Tv2)lyB^reHooWS(hIe-| zMpCnl(58y;lo%0_egLAx)AUc(Sn7!_Semg2lvt2^+e5X2p4tfoB1Nt2sgNXAWp{#P zaVxtW5`>KEWMqQf#41h>ii5^#B5_D8$RCvokSJD++bDh*v&JwATbGH?`Zs z!XdDjKKc^14}mPkPZ|4-Iu1M5fH>LNPc$9pqvjA^j(B@q0^}5|7&ic5vUoB++-)MY z6Zl%hj*Af!Cb+{y5k9~qtb<01J(^oV&52C`ri<7~3*4p>E`iNrMN+tY_5rwxT9bPK zs$f8t9P}nm>-diWB5BHEm?xf02{+Cm0s?zLCI*9_*wa5&EJW(_IPGfU`Sb|?GP)wxtcCjYHBrRQF!@K(=K#_} zR|0Pnm_(qzm@=cAS1xrEID-E&8-Sd53rqzMX7~Z*3dlVrE`6A9SdM+y7fvvV1$kA~ zr9`n*?46YgOBv(I>^16_*jNlAPc&9nQvXVEZcZw!WX<27yUef-8y|~7{n%2*wS+?8 zJ_vJ2XIZl^xWn3l+VkVU@GUkgV)u3(b0c9Ac*>Y!(0A^zu>f*2K;4F|?usz?t43lO zw-P1+Rgt+3z(;IsQ(bt?t*m#IHt zXER-X^4`NlKp>O|*3&N@;V?_IY;nGN65HNX1We!wn~oC-fk+})QA%)}N9g$38ub@! z>#T?s=qNP8X+j~;o(TGuigcO@t}R)mp2N;q#~jWQ0fDYB&*3bKw0hYp^)hz8qZ90z z<72!?1O$4&Yy)v|xjS4GS5}$|oIkItcz;BA^+|x52x7G^ateT-qFocczv!yoq~4Fj ziZ9ISRri!vt<*<|{~;O6Ph4GFJFwiEiy;D@ z53jc2ddzxAV>}dn^Cv0~OUAgJUlU%e?qIdNsfX4Mrt*C-0*A!O zjl+0_*C<6Z@7ND@MT4C!jX{J);I!h1n3aN5A@ z@MCf0=XfX*fxom?6R1C-An_N}LIO+cwHpe>>a+8_-=i)L$YmF}QPZ%!pA+_Vl~>k5 zRk>^r)beFMJSQe&5A?$5xF%RlCqC)oynQI7J4OgPztH_P%ySUgT#mW$z2NCmhNEc| zaU?L1Ftg|vTXYn$Upei9qE5oLbSI3pezN9=P(z0G00YkNhf8(6cs;QVIXZl%M~Csm zWV{HuycWi@4T>)3D(-_&aWPsO(s;i3@akN3CZbJq67Yea$UfvJYK2xDXg6e8veHuQ zu9?|M{G~@XXC$(#sVU~cDVp6SIo+C-V$ITu$dnb6&DM0QCE1*&?IPCf`K&vRn(WsP zsNWUH@i<_y-iOq6xvp64?mxhIze{Y7b z#GCiRO{=M!z!vfyH~PiCv$_;_?ESCRZ?OGm-PtH0&Te0#}InX3`)_zk`Wlmn;&7Co9!`h;UbDj)}GZ9wH*}2N5}vpFN69-;cS! z`_qP?3<9yYPPE8*77Yi)j%QImY+Z63jrUXDvWtYr^EPTBH5Q84=L?~*;L7vm0Gu&c z%Iw3(O6fRI>S0G;X-BB*h-{<4L^wkJCcn$ZxEFS|m(-kK4(-S25wf#0)b&0}xUX@E zpQUhyu7S*oeS#4kK2dgMpCle9WvBsW!ATm=cESLUKs|@;b(}dwfKXA#%68pl5$#$&>ZM8Oj-l6!rjzIv4!uF9%L zcu%>itK9acCu|4V$phxUE`|C-{^J25aE}ua^(N8Zl&velP35M8zSnEAFQZnB$Z;5Z zw7)4hS5Y*biT@p9LZBmc7SS(uoI4JNDA3U=koP))9>}RxO9e9BBWeN(FY~&`*2Mk8 zBE52;o&3}XR=K~%djHB~U+C(?^J0}fC5F27bd^1#hDY*_FARl8uW}8LEvmtE_a}t) za;yM(u^O`G*}k4NCjrl;#e}S%+fJI$E4+DpcA=NKsd8F%=;~ii(0&w}89Pees19MO zGc7A;8BhbpE6z^5rb-N)Ruevboj%=Vqrg&qs%{)8q%{x??B*m!KDZ~l)rK#@TmDrW z!reTno4{xC{a{SuN=~ShASs?Yx~v21RbNE;#`#4^F;yip0;|bN+eue!@v64mx?lyc za`L5CM~rRGVnGoeeK8Q3h{_}f1jAUxWUd4#|@#k(C16iF(Yj$biaTlu&V1gISB2gw?Z!Cz^Isc+|KnbR2BsP&PL zorbTraE7m}WCoLZm539hODNPavN&u=tBeSRz?vUZ$YWQb5My`A&KPXYO3}13E8a7R zWFxR2XP!AoLK4)J#Vw$U?P4gj1SLq9H>@cXIze6euo=|honBLEY zc}#LTCIfmbq-pTvtn|eaHz0!2scDVqXPIfKq0|s+JJbSh0EF5$MZ!D@ym$zeLc7t)NqL))i+M>W zMBqPCU|m#5P$SzPtpPx3sr$t4eov(m1v{am+#Lns{?SB1z>|bHL$hXQi`LO=Ml_Y^ zLY+in6Ia{PwwUw7TXJtZm~4z8LITwdBCmyySbEq)_PPL-L|8j#Ik`QwgBXc3HOXQP zj|+RFVLimkj1CZ0nJH;bc0)$0IWt95`vV-Q>R=U;=bwT3cR6Sm5Mdmpb%} zuB~j`1%i}%PV9(zT_6grdb|sCpOir6aOCx@JvJ?CFOZDfg7`R0+>Cxk5OCPD)a+%f zy_b~2>gW8Q6Z2QBO}3mD!VRT44jQTbiJ-sy zvIiW7{`&BmvfGE#7YD-1n0@1+B9$6a}Acjn;JhK3v}eFnfL=%gn(Rzk7b9uI)ipjh>Ib7LShb265ZPu3lT zPKfb_tT}5C#KBB?ZV+^D$OaotEQqyTHIGQowr1JA^#2pJlo4i&)nXm0O^|VBsDj>+ zVupJDJm@GQbBL*Xm|SIsSam9OO|?BTg9MnWYd?1g^pt@r_{ifHY|9-C`QFUpEz;P_ z+u=uYa0+y)-kJ2mW3iDKoAo!A7{YFC;2=BqsuxOH4>tt%4v-nQo~tnm>VkK&d0Bp zCEYFG7>knff@e#;BI)-u!1waNSQw>z@32vy@vv3>5&PU!DzD1(QBc)$AK?;Ea9h9k z!dRDslzlGThfXN%^N9&`+>Zm;Q0sN>OeKG7)xoR59dm8(~9P*k@5iWrSH0*x*#lxP` zhut+DDk{EhsF^pB88p_*`a3Hh&V<)^VFtX@w{g-} zz!_qGMt=1nd8)DHk_cw!_DIvk5QoLupS1TtiXrS6VMqD}I zCt(o;RrGG9Xu;U@whYg~%;jsQlTg(IXhEx>=l`msdSLf7QtI;1zda!bg7dULqy12TJ!9Gvq*ln32VS% zaGn^ZPm7^WG%wish-r7RSTnLId1ece@pxC$M$;FsJzn+w=%-^dY$NM^iu?M%)Jhrx>oPpVx!N`@gEdZG4rNijRLhj9U%)c83Sw@>RkqGgqO!sQ z$#?A)hiK^|*gr8XPuCrlH}P3gTM6|NV`v4rCFdlkrC?`HrmoX+dlbhPUQUr@07vlV z#GL}9-N2UA<79V2nnX&QEFZ3fw>>>+4g{8x0(X!C>)J9`!RG*;5~pOcg|5cK5?{)8 zmmhrv?bOP04Cm#`p%doY0wAmspYoV=LlUUcZeX|yvL8cK z3EqvVgZHSH15h*h=LQVmOvi>}#4Nc!7Is^bj*_}bIhYQJ_hh1FM^QuAL z@OqzG6A6?AS^Q#E(80CjU`LX&yYPJ3g-UMNTayA>+j6%-CwgUyK8SFZf#PUhqH`Z3{~`k zKMVN!)!BuZcll&53{|@5HXgVS>k~b(In<@JKGB1)2m}-F?W7dm?|SIsSbu;YLG6S6 ztzFpTsYvJJ*n0T-{1Q=JmXixH3+y466=J&Bo7nc2CkkOH^tM^|!%ch}Ap0GJT(@_z zt2+(mPpA2Tutdflf?n!7MDdPXbqMamJNn>wCixQ7q1ch&LKQ+0mZaYyl+S~hb|5h* z@p7*C4W1y&3Zc5lZR^>T(>HcI)()$e zy~0s6C^K(GT=}B5I*bMzCcRI<78oXR!Y1406OaPc_4*56UPRDBm`Z>bN~9cg3P!q( zM9R!keN>fqPeG(_Jo#iF1a{{Pb5`n06^L{iDqW8FAAF~zb662IBi z;U=wT!4p1~6VF0tbrKOyl84S>xnYv7O}tU-2yTws8IgB2R<=G5UDP>4>tqq5e)<7X(6^9>ui&{?=#!fK z8>|8KGwj&mf(QDRrbFo6b{D)>8kUlrrSUe;zA;};{2e0I#l&K<{O)(G11;8N`T7QK z0lwG48$GSTb(pQLK%5_mTQzy&I`mVQ6U}lNdIJV4%S&kv>*!tO?win6rF!8}-5$rU zL$HcJD`<21Fy^+3=m{K<;Wr>quD*rE@Kr3oL>CW}UMHcpt@j^LnVdc4Pl&~OzKnK( z4)UKraR*z6q~}Z5b8S&;hO-<~1eLv*G5h;e8X`)5S_BQ1P-i_{t);fL@}DBu25a@v z@I-mPN*BwJEXyS{OAK!0W2{5*r;Pg>8i}xgz=bV50;#`AkCZI4-)JCl2inq%B_!JgHp(=z&7bIUdX5iu-#JG*7iSW13slPX;eq1TW=C;{u9_0 zz#`^j>sm#B%*73d3GIlph{meYl&8?4Mne+Yn3OTehxWAf5dNHD%d zb3I9Pr)2wQ5McNlzZ=S=XRxEwX=?r%L5P!fjJ~^&1P|!z7X+C|TA`L!g&NP`Z+qo< z94MNdyGdeVW|o$i7%t7vp?~yQqQOk0B&DI*+g&ypQ|hDLB^k;oy_kpWn`KF}WaVgw2sx4@Dy!-sgAy6ogH-LTWv8W} za_m zc{i$@ih1h)5-(=R>Sc!I)QcGS>_B#RQ38BoINWEK%$3vnatZ|!i9idv%|$t{V#WQ{6HD6OQulWMpH&{PRz%aK)-gCX>ZvYN^s;X?8#4m(7LFN1HELuVQ+LoWzay5wG!RAuOQUd&Hl;4HYYfpa2$?r4y z(Ir2m(@!qEccU*p zhw&YXnNR(EVZqxa*AcizE(wwA&RkjM(k>TcZPdZVPOdU=N%1JPog#3C09VwgIL3u8 zu3B+9M&sIuCpiU|0q`(B36I?Ln-7_MZsX%$7i!~kMsND!qYR&1hS5*X^*LvsL_cQ| z;7ph^SI#|`QyV94oS#un#Aya^`n<<-^w*3Ww|Kb*$j|(g0JnzdzvvqkGSA!g`6>M? ZdbvPw?kG7vZ~XlV`1!E1tX^9g_kVv9I^O^Q delta 11690 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 diff --git a/app/__pycache__/views.cpython-313.pyc b/app/__pycache__/views.cpython-313.pyc index 10f3acd6a70519d933e84103415cf05fe9db9451..047e7394b6709bc8a8e0452fb7deafb69c03320c 100644 GIT binary patch delta 25 fcmbPvjAiCA7Vgiyyj%=GFiEYVk$WpQBcCz=W?lxD delta 25 fcmbPvjAiCA7Vgiyyj%=G;G`Pg$i0=Dkxv-_Vr>R3 diff --git a/app/migrations/0369_alter_internal_entry_customer.py b/app/migrations/0369_alter_internal_entry_customer.py new file mode 100644 index 00000000..3b982cca --- /dev/null +++ b/app/migrations/0369_alter_internal_entry_customer.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.7 on 2026-01-27 02:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0368_dealer_count_sale'), + ] + + operations = [ + migrations.AlterField( + model_name='internal_entry', + name='customer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='entrycus', to='app.customer'), + ), + ] diff --git a/app/migrations/0370_transaction_gift.py b/app/migrations/0370_transaction_gift.py new file mode 100644 index 00000000..15d3f779 --- /dev/null +++ b/app/migrations/0370_transaction_gift.py @@ -0,0 +1,27 @@ +# Generated by Django 5.1.7 on 2026-01-27 03:02 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0369_alter_internal_entry_customer'), + ] + + operations = [ + migrations.CreateModel( + name='Transaction_Gift', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(auto_now_add=True, null=True)), + ('update_time', models.DateTimeField(auto_now=True, null=True)), + ('gift', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.gift')), + ('transaction', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='txngift', to='app.transaction')), + ], + options={ + 'db_table': 'transaction_gift', + }, + ), + ] diff --git a/app/migrations/0371_alter_dealer_commission_amount_and_more.py b/app/migrations/0371_alter_dealer_commission_amount_and_more.py new file mode 100644 index 00000000..f8852a48 --- /dev/null +++ b/app/migrations/0371_alter_dealer_commission_amount_and_more.py @@ -0,0 +1,173 @@ +# Generated by Django 5.1.7 on 2026-01-27 04:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0370_transaction_gift'), + ] + + operations = [ + migrations.AlterField( + model_name='dealer', + name='commission_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='dealer', + name='commission_remain', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='dealer', + name='pay_commission', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='dealer', + name='pay_sale', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='dealer', + name='sale_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='internal_entry', + name='allocation_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='payment_schedule', + name='amount', + field=models.DecimalField(decimal_places=2, max_digits=35), + ), + migrations.AlterField( + model_name='payment_schedule', + name='paid_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='payment_schedule', + name='penalty_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='payment_schedule', + name='penalty_paid', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='payment_schedule', + name='penalty_reduce', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='payment_schedule', + name='remain_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='product', + name='building_area', + field=models.DecimalField(decimal_places=2, max_digits=35), + ), + migrations.AlterField( + model_name='product', + name='lot_area', + field=models.DecimalField(decimal_places=2, max_digits=35), + ), + migrations.AlterField( + model_name='product', + name='origin_price', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='product', + name='price_excluding_vat', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='product', + name='total_built_area', + field=models.DecimalField(decimal_places=2, max_digits=35), + ), + migrations.AlterField( + model_name='sale_policy', + name='deposit', + field=models.DecimalField(decimal_places=2, max_digits=35), + ), + migrations.AlterField( + model_name='transaction', + name='amount_received', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='amount_remain', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='deposit_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='deposit_received', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='deposit_remaining', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='discount_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='early_discount_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='origin_price', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='penalty_amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction', + name='sale_price', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction_detail', + name='amount', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction_detail', + name='amount_received', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction_detail', + name='amount_remaining', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + migrations.AlterField( + model_name='transaction_discount', + name='value', + field=models.DecimalField(decimal_places=2, max_digits=35, null=True), + ), + ] diff --git a/app/models.py b/app/models.py index 297bebc6..fccd37a9 100644 --- a/app/models.py +++ b/app/models.py @@ -330,7 +330,7 @@ class Gift(models.Model): class Sale_Policy(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) - deposit = models.DecimalField(max_digits=15, decimal_places=2) + deposit = models.DecimalField(max_digits=35, decimal_places=2) method = models.ForeignKey(Payment_Method, null=False, related_name='+', on_delete=models.PROTECT) enable = models.BooleanField(default=True) contract_allocation_percentage = models.IntegerField(null=True,blank=True,default=100) @@ -784,11 +784,11 @@ class Dealer(AutoCodeModel): phone = models.CharField(max_length=20, null=True, db_index=True) email = models.CharField(max_length=50, null=True) address = models.CharField(max_length=255, null=True) - sale_amount = models.DecimalField(max_digits=15, decimal_places=2,null=True) - pay_sale = models.DecimalField(max_digits=15, decimal_places=2,null=True) - commission_amount = models.DecimalField(max_digits=15, decimal_places=2,null=True) - pay_commission = models.DecimalField(max_digits=15, decimal_places=2,null=True) - commission_remain = models.DecimalField(max_digits=15, decimal_places=2,null=True) + sale_amount = models.DecimalField(max_digits=35, decimal_places=2,null=True) + pay_sale = models.DecimalField(max_digits=35, decimal_places=2,null=True) + commission_amount = models.DecimalField(max_digits=35, decimal_places=2,null=True) + pay_commission = models.DecimalField(max_digits=35, decimal_places=2,null=True) + commission_remain = models.DecimalField(max_digits=35, decimal_places=2,null=True) batch_date = models.DateTimeField(null=True) count_sale = models.IntegerField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) @@ -820,9 +820,9 @@ class Product(AutoCodeModel): zone_code = models.CharField(max_length=255) trade_code = models.CharField(max_length=20, null=True) zone_type = models.ForeignKey(Zone_Type, null=False, related_name='+', on_delete=models.PROTECT) - lot_area = models.DecimalField(max_digits=15, decimal_places=2) - building_area = models.DecimalField(max_digits=15, decimal_places=2) - total_built_area = models.DecimalField(max_digits=15, decimal_places=2) + lot_area = models.DecimalField(max_digits=35, decimal_places=2) + building_area = models.DecimalField(max_digits=35, decimal_places=2) + total_built_area = models.DecimalField(max_digits=35, decimal_places=2) number_of_floors = models.IntegerField() land_lot_size = models.CharField(max_length=255) direction = models.ForeignKey(Direction, null=False, related_name='+', on_delete=models.PROTECT) @@ -834,8 +834,8 @@ class Product(AutoCodeModel): dealer = models.ForeignKey(Dealer, null=True, related_name='+', on_delete=models.PROTECT) policy = models.ForeignKey(Sale_Policy, null=True, related_name='+', on_delete=models.PROTECT) note = models.TextField(null=True) - origin_price = models.DecimalField(max_digits=15, decimal_places=2, null=True) - price_excluding_vat = models.DecimalField(max_digits=15, decimal_places=2, null=True) + origin_price = models.DecimalField(max_digits=35, decimal_places=2, null=True) + price_excluding_vat = models.DecimalField(max_digits=35, decimal_places=2, null=True) product_type = models.CharField(max_length=255, null=True) template_name = models.CharField(max_length=255, null=True) link = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, null=True) @@ -1400,17 +1400,17 @@ class Transaction(AutoCodeModel): policy = models.ForeignKey(Sale_Policy, null=False, related_name='txnplc', on_delete=models.PROTECT) phase = models.ForeignKey(Transaction_Phase, null=False, related_name='+', on_delete=models.PROTECT) date = models.DateField() - origin_price = models.DecimalField(max_digits=15, decimal_places=2, null=True) - discount_amount = models.DecimalField(max_digits=15, decimal_places=2, null=True) - sale_price = models.DecimalField(max_digits=15, decimal_places=2, null=True) - deposit_amount = models.DecimalField(max_digits=15, decimal_places=2, null=True) - 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) + origin_price = models.DecimalField(max_digits=35, decimal_places=2, null=True) + discount_amount = models.DecimalField(max_digits=35, decimal_places=2, null=True) + sale_price = models.DecimalField(max_digits=35, decimal_places=2, null=True) + deposit_amount = models.DecimalField(max_digits=35, decimal_places=2, null=True) + deposit_received = models.DecimalField(max_digits=35, decimal_places=2, null=True) + deposit_remaining = models.DecimalField(max_digits=35, decimal_places=2, null=True) + amount_received = models.DecimalField(max_digits=35, decimal_places=2, null=True) + amount_remain = models.DecimalField(max_digits=35, decimal_places=2, null=True) ovd_days = models.IntegerField(null=True) - penalty_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) - early_discount_amount = models.DecimalField(max_digits=15, decimal_places=2, null=True) + penalty_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) + early_discount_amount = models.DecimalField(max_digits=35, decimal_places=2, null=True) 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) @@ -1424,9 +1424,9 @@ class Transaction_Detail(AutoCodeModel): code_padding = 5 code = models.CharField(max_length=30, null=True, unique=True) date = models.DateField() - amount = models.DecimalField(max_digits=15, decimal_places=2, null=True) - amount_remaining = models.DecimalField(max_digits=15, decimal_places=2, null=True) - amount_received = models.DecimalField(max_digits=15, decimal_places=2, null=True) + amount = models.DecimalField(max_digits=35, decimal_places=2, null=True) + amount_remaining = models.DecimalField(max_digits=35, decimal_places=2, null=True) + amount_received = models.DecimalField(max_digits=35, decimal_places=2, null=True) due_date = models.DateField(null=True) customer_old = models.ForeignKey(Customer, null=True, related_name='+', on_delete=models.PROTECT) customer_new = models.ForeignKey(Customer, null=True, related_name='+', on_delete=models.PROTECT) @@ -1669,9 +1669,9 @@ class Internal_Entry(AutoCodeModel): account = models.ForeignKey(Internal_Account, null=False, related_name='+', on_delete=models.PROTECT) date = models.DateField(null=False) ref = models.CharField(max_length=30, null=True) - customer = models.ForeignKey(Customer, null=True, related_name='+', on_delete=models.PROTECT) + customer = models.ForeignKey(Customer, null=True, related_name='entrycus', on_delete=models.PROTECT) product = models.ForeignKey(Product, null=True, related_name='+', on_delete=models.PROTECT) - allocation_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) + allocation_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) allocation_detail = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) @@ -1696,9 +1696,9 @@ class Payment_Schedule(AutoCodeModel): code = models.CharField(max_length=30, null=True, unique=True) from_date = models.DateField(null=False) to_date = models.DateField(null=False) - amount = models.DecimalField(max_digits=15, decimal_places=2) - paid_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) - remain_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) + amount = models.DecimalField(max_digits=35, decimal_places=2) + paid_amount = 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) txn_detail = models.ForeignKey(Transaction_Detail, null=False, related_name='psh', on_delete=models.PROTECT) @@ -1709,9 +1709,9 @@ class Payment_Schedule(AutoCodeModel): detail = models.JSONField(null=True) batch_date = models.DateField(null=True) ovd_days = models.IntegerField(null=True) - penalty_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2) - penalty_paid = models.DecimalField(null=True, max_digits=15, decimal_places=2) - penalty_reduce = models.DecimalField(null=True, max_digits=15, decimal_places=2) + 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_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) @@ -2012,11 +2012,20 @@ class Email_Job(models.Model): class Meta: db_table = 'email_job' +class Transaction_Gift(models.Model): + transaction = models.ForeignKey(Transaction, null=False, related_name='txngift', on_delete=models.PROTECT) + gift = models.ForeignKey(Gift, null=False, related_name='+', on_delete=models.PROTECT) + create_time = models.DateTimeField(null=True, auto_now_add=True) + update_time = models.DateTimeField(null=True, auto_now=True) + + class Meta: + db_table = 'transaction_gift' + class Transaction_Discount(models.Model): transaction = models.ForeignKey(Transaction, null=False, related_name='txndiscount', on_delete=models.PROTECT) discount = models.ForeignKey(Discount_Type, null=False, related_name='+', on_delete=models.PROTECT) type = models.ForeignKey(Value_Type, null=False, related_name='+', on_delete=models.PROTECT) - value = models.DecimalField(max_digits=15, decimal_places=2, null=True) + value = models.DecimalField(max_digits=35, decimal_places=2, null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True)