# HG changeset patch
# User Pandeeswari Ramakrishnan <pandeeswari.ramakrishnan@openbravo.com>
# Date 1417618561 -19800
#      Wed Dec 03 20:26:01 2014 +0530
# Node ID 2fe4986d49dbd96ce39b18cb131611996863ace8
# Parent  4ccbe7a7da1d0eed0677d7d0baf545607a192c87
Fixes Issue 28236: Payment schedule amount incorrectly calculated.

Payment schedule amount incorrectly calculated when adding a payment from reconcile window to a sales order

diff --git a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_AddPayment.java b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_AddPayment.java
--- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_AddPayment.java
+++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_AddPayment.java
@@ -1160,15 +1160,18 @@
    */
   public static void updatePaymentScheduleAmounts(FIN_PaymentDetail paymentDetail,
       FIN_PaymentSchedule paymentSchedule, BigDecimal amount, BigDecimal writeOffAmount) {
-    paymentSchedule.setPaidAmount(paymentSchedule.getPaidAmount().add(amount));
-    paymentSchedule.setOutstandingAmount(paymentSchedule.getOutstandingAmount().subtract(amount));
-    if (writeOffAmount != null && writeOffAmount.compareTo(BigDecimal.ZERO) != 0) {
-      paymentSchedule.setPaidAmount(paymentSchedule.getPaidAmount().add(writeOffAmount));
-      paymentSchedule.setOutstandingAmount(paymentSchedule.getOutstandingAmount().subtract(
-          writeOffAmount));
+    if (paymentSchedule.getOutstandingAmount().compareTo(BigDecimal.ZERO) != 0) {
+      paymentSchedule.setPaidAmount(paymentSchedule.getPaidAmount().add(amount));
+      paymentSchedule.setOutstandingAmount(paymentSchedule.getOutstandingAmount().subtract(amount));
+      if (writeOffAmount != null && writeOffAmount.compareTo(BigDecimal.ZERO) != 0) {
+        paymentSchedule.setPaidAmount(paymentSchedule.getPaidAmount().add(writeOffAmount));
+        paymentSchedule.setOutstandingAmount(paymentSchedule.getOutstandingAmount().subtract(
+            writeOffAmount));
+      }
+      OBDal.getInstance().save(paymentSchedule);
+      CashVATUtil.createInvoiceTaxCashVAT(paymentDetail, paymentSchedule,
+          amount.add(writeOffAmount));
     }
-    OBDal.getInstance().save(paymentSchedule);
-    CashVATUtil.createInvoiceTaxCashVAT(paymentDetail, paymentSchedule, amount.add(writeOffAmount));
     if (paymentSchedule.getInvoice() != null) {
       updateInvoicePaymentMonitor(paymentSchedule, amount, writeOffAmount);
     }
diff --git a/src-util/modulescript/build/classes/org/openbravo/modulescript/UpdatePaymentPlan.class b/src-util/modulescript/build/classes/org/openbravo/modulescript/UpdatePaymentPlan.class
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f5cbad5d2325dfbb9a0c8b5f8e710f83ed6dd2e6
GIT binary patch
literal 1758
zc$}qG+foxj5IsXSyAW2vOVA)*xG1>*QP7|uc;TW{MGA?6r7sSf0an9qYO+Cn_bYt#
z#b>K5w0z(L`~pA4C-v+St1P7~qe-@Ry0_2io}TW_r>`G(0gPfH0UJXJv|~7d5#&R0
zzK!BSxEc+`SST)9xD<L7ER0*YEMQ)BJvW#Zh@~?t0>+GARstPG*Her2tu>|Z$+ZeC
zhl{==D=SjFq24eW!KPai7%BRCBkxz0x2EN`pWpJ!^@^%F+N}op`_-}x)RKI$rMzIN
zBE3lgOFdUkJs^WAxBR*ng#1tBw#@VSM!pni*V~|9OO@=SO|j3)KoV(4tp^0g9{m%z
zqCA4d0yA*A=&0_wl$=c!!fAG@0=ZwfNha51P332N&r?p|`reZEx81VRBu%)rxxHPN
zN&S!)d6GZvdhWTSsv(HZ2TFl-p5BqwsL;__U9r&3!y{42uWLumyI~?-zwKcpWVCSr
z2W?DX(!y06y_m8wjcYcpqszt(+_W)+SsQbh7dWy{4mNJ#w!ly`)e{)}gZrIGDMgAv
z=C4b~B5kN(Kl^Yx)6@x^Z?+ZK+36-CWO%4%O;u<Xc-$27pW5{3y6ZJMv)1TLm%U~0
zrEsG$Sa+LA<o6-W>^GNYJxWPn`TxlG3CEf1bhHXLtkt^G%5zk+=Rl73P3e^@YEEmP
zopL<=Q>1&F+J6>~)nsOclhMu>XZUG>2#1EUgIb<<!FxRW9^!5ExRcV1jNLdyY417U
zFpluf<M;s<Q;4CBwg=fAv=nn65S!|Gg&8i4#o-AfW$YH>v4WX2lkwLWOc_aYbi&G|
ztapfifH~2cOSLu>YxSim-hBH^XzS`5v=y_t9VFgHkr#27QDRYE1*Q(1Vm7Cdz!_%J
z%dGk^gno=;fWzL01)L)$OH>-m$Y2$@XdmlDjB__hbfJ}qWBeY6MQscz?$y8v{&Ac@
z57|!<bCN5Q?32{G89z?u(~QYC6J{B=kF{E+wV!drJRdYFbe2~?;@=3fES$42C@iG;
V6ZHCm>=zg}Eo9;ZWut=Uz5}f++Q|R_

diff --git a/src-util/modulescript/build/classes/org/openbravo/modulescript/UpdatePaymentPlanData.class b/src-util/modulescript/build/classes/org/openbravo/modulescript/UpdatePaymentPlanData.class
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2be7968a199b532fe76a9815e197845af3dba04e
GIT binary patch
literal 11703
zc%0o>3w)H-mH(g2>&s*a7$G<Ya1?<&89)II&j3RS&C5JMv>GOvk1#ly3G;{`TOUQb
zy6x`jF5055#a%0Qs}_6!ii%scwbm`Wt*y1S+K1ix+_l;jZEMs2{l0G|lVm0aTYuZ%
z=9jtOeVlvGx##@PIrrYD|M1YG0Om=Z8=bgY!##y4!`C$IcjEx=RgL>J+^@b5Xy{R$
z2UX*cDh|8wpc~`Vw1?F9h$<d-;}JaS=I~Jsk7@Wf7ryRBDIPDv6L_)+-@rGE@D#q~
z!qbZAZa2P-XWaOAe8-Jr_zy+;pNinSivD{pJnP1EeBXs1Xn0P;4;72&6^kFa@M8@x
zxG@7i(eR@BzT`$FeyZVT8h);3y`&cVg(_aw@JkK<rQuf^UeWNXhSxN_uHg+0Z)*5&
z4gaIWcuNWNYYlH}ct^u;H2klIcQqW>@ScYEHT+h??=<{g!v`AvpkY80Xd;>va93i}
z#IA`$6Q?FFO*BmkHF0ZFq=`q9aTHmKT{7M!69kS(tmo`40&hbs-s2DU1-m!vexuLd
z5bNpD<BJ3n>Z9RgtKJ=phniBoU3y$l(y%4iAM{6p(H?(WG9HfhkZ$6paI`PDy;qMW
z6I>>gis<2xz||KFhl0IHfioVvG@9yVWpS8GE*03yE7l3@D`O#DFuoxi)lClV!LEp|
z*u=Vnk#)g%ShcNAdvbF)A(&@K9P87gUGZRl%-<VR3=`e)a9`5j(H9CP^%hf@7K*tl
zm<&?HlY8{!$lXjVugJ9@jl`?NdW3tJSw4~==bXY#YC==6mx7LKO9s0yX$<yRf;&Q~
z-rntkjpf5cr>w!QU_$q=j76h*cQPD{w!~xo;Skkdap6bVXG!;nl>}8Mz*gW6Z0pwh
zR40|)bs{3y*MBsj%VJ$yxKz$zK~Z-s6}1c}khR21R!`d{;XXkzx19_}Q+lhONJWS^
zxqx5`_e5iH>VHy}!7`g8U*Xtfb1bnn;%_^zA$zny-$qkz3da*<)e}x6l`5s4?4t&J
z(w)?jGm(t9ZH*|PTl^;uE^CU^rYE_kv!DBn4f;_k8IJhZ8GVXlf-|QK&TNV6eZjaM
zBAk-CQVMC#`bZis9qLcp`_eu&bA%j=vy|0r*k#euMJ_qXB_%F7nUT~b6B!a24P7#c
z{{l}!kC3dcS6M}H-ibhFtlmWhx9Z7MJW70qTY_==nPCs7$(xmwv2{V~pT<6iKs0$#
zGL{TR(mO0Nd95^C?r<WoP47-6b;5J@3As2y>h6lgBI&J7=#J~kesO)19@nGY`iU+`
zQMJY05i7{L+hVDBx4t^8EPZNDY|K{M^<Xo?#P%Eyy1`9MTwUMPQn#To(A3_xa!p`W
zM?;`~747elQkm?5u4r5>b@i+28rwbCgpfy05w8b5tRaXldev|(u1JL=Ml32d0;?|+
z(-XdEEa}s?(TQq(9ywLYJTe7+E}80)X>yteDO@IiV7bruYYQ|4R<`?Q&GOZ?`Eq5P
zYHQ3&JHFMe&5gcQ9d!*<>~NHG%i<%dJ#xC7K}36Gx|~UTdt`>p6wEnMA9KkpkCaP=
zODeewsd7oR`qp@4Hn$>vggr7x<}wlG2t^*5r}RH5XC$II*!1b~cr5M<M}1pUdVG7W
zFFQ`xD(#)+k+bDA!8EnXHh)5o_eb=kzs>w+E$3XmvUyctiAUzk0vdg}M;4+_>Ej%-
z%FqpA<ua#`^julsky@ck&KhEswvNW~zC>tt&~TB8EHemBF)0mm&~BZU;e3qSJItYm
z!0LA2+UEKuW1PQWv^yM(bOyVPNblPe^ffp6`ex@G?F@%}OGuJ;v^tw>XGl*5!x3K}
zF&s3xXBekR(vV7%CPD`L(Cm@xn9SAAbB+nN<l5nIMqD6luo$*Zdb~3n?T>}Kb%Rwn
z4@oHFDTB<qGc&FA!?QD8rszXE1e?bwZ){X~nV9vsA#E(bw6!CpHRoAt$7Wj{rli@;
zoLlXQgqbFN{8;8ncbW59&+eg<n@g-;6KD-s;7ZGBS~WDRPf%e_scTv_+SWLCnMW4O
z5)byO7&bJ3aZ=uic_N!&dTt*Yv<N$yEQajJ3WJN6`pR>Asi4M}|1X!nUN;K;|B(~-
zk0R2?>e*L}Sr;FdyLXI9f)kGcpZ-&J_GbtT&12lx*rUZ*HFcsPWL5rUPb93IpMRNP
zH1r{%W|VkB51(N!)6uf3u01eH=$LELwFTOJu~agVBwrreRQy=tGsA_i#@F85+0@av
zBG6jCtfHD%6?0BH&@34;&TD73B1VgPMz~z6P9vFZTLH`P{_@HSUoc^w6a^=xNwSW2
zbB8KDaDIJTds`;z%{57bq0YXngY}Zp%oa@Y)Y`=(J!PAfb<{J@exX_1ox|Y58&uZh
z`lhx(Ydb&f%|qGw$_2}^t(rY(L^t;E+^$=(jxC-*jcPa%<RQObr@j|utzh01LS5Ud
z)75I9c`Y&etZH>;BRpPa&93mRt83^8v?;k-v-*4VWM?WB4wYB%Fg<5hy4aAeH8ro#
z44L(u+VRLTS)M+1XWb-e;E|UZzi}fNe66S$^L=Ls2lJl6oAt<xH!nZ=@6<z%<n5c|
zu}jUH@dSNqDi}%B8*d0JDF8K?>oG_@G?=8r2&~JqK@jZYe(2~mV|q@qE=%eqDj7@f
zYjU1<I`zDyccpsra96Kv<@M?_k;cuj`#JeV%J&B0(arnrdFp<^D_wa-?$-``RNs~~
z-ukG6Q*&6pgBLR6-9){(tqVp{RB~;3uEoaqPEb79*AR;uI$4{O@T9@M`e;%&^f-xn
z%0=rAhC+der7lNzB&M)%N?ecVL`4pbo>o4Z`jjcg_i^c@@k-bp52|QXlgoCa0K;M2
z2Wbi_E}*LBODa`ePl4Ils3#J^o_wHHs7Qn_<FM8p>)TEh#FQN`%ncwdk+Du-)V<Z$
zkLf{$Xc%WfsKa`-DWu40JXdE+yfP9@B&dpfuhj6N44n{cgaev-eE?9P-Z7xw4s`3g
z$@=yfUk`tq5oUV}Yv+<)_${hD1gR`3cmTEo#v+%nbn^?0haD#&VoWti(Tk|DU<`fM
zGJby5n4|K3*!E`@a2lPHvnD$-leZ#nP2LNe!6;BwVm}DS9%x*}xxcE!m1${g6&{4!
zY!&Ul7oH;+x8V?qOU56>gev|H;-rHp5yjkQFh7GT0Ton;DJaHNiZP9~(=dZ-tK{fP
zOg988HJMw2sak@H5+n_AZN=lpafuZANv5Qo%jMNhT$MK4VVpdCv*lTvb>UKM<99oM
zcJ@>n3teU|WP6K!<Ee=+l}v21HdDiWluR-=!@klDwnLa)>yTP!WzB;)r2w@~uk%58
z87b_A3tjGoh4uwSrG;g?cHe?iCl&3%B(MEJoGMVg?%=}0eFHD6?u}OW9;_>MvEOwB
zW#l)d*5mbf?IrfZnEC*mM%`u9HLs_XwP_Ea$m=OPjMIn<ufyv(2w$md%C6lv!#!mW
zoVEo;`vz`Pi=WQjDbda-z&<=&>+;feXYRwjwXQ5v&E(FEEzV-0D9R0^RUAR(hBQr;
zHB?QeinPXR&o;Gk2>zo()|@kjHRoDG^Rm_$Hz=;Vw%A)talPY?dL0LG)*~q61{`X}
z*<ROv8uptwhVK$CXR`JJ0mQG&G223zNWWYzSF!y9Ye~b{3J~|Anq@WdQbX{~#p#&G
z8S~j%hy^%@zIQGbqZZ4s2o0=tU<oc}s~5`&!8-gER^S@KbT?MvR>E>0R^uLg0uNyg
z9>H2XhEGzScFMM%(skfjti$s-pAt6UMKp?_iBdMpJhVs$&ZA^)(vNnz9P24<hwQ{U
zxrX)6VT0U&3*;7DXn^;hF@e16u!9cap^SgW)~5;P#rPa9XRVMjUV|%eB}2ipbdjs@
z8IHb)R_w&paFO2%>{5N?V2&0mm|M=EYM;elD+gii8rBM6BkybJbT%xIF#d*o>_pV%
z_&olWE1W4iD8t{wNh#fw>N;|}-f}XN>K{m@^!`sM8lZ4)7yePih21XP;KGeAe8Fxf
zyJ^3}#RUV5Wv&t9VC#zm+*xJ_g9Cexqm9GIvC@T`2FSK}IFa$^!p+7q&H?Ty2aBO`
z;1&vN#sLR~cT*WHB@-Jh#8xXn&sW6)RV-A+IjT5U6}75Zq>9C=SfYxhs#s>?yHRTG
zQtPlSa8_2EQNwYyQ@oBz&Iul=I*jG(y$&OYG}Ty9p{U02`&xUA<;jjQcyjf};K?7h
zW-d?G2E}#P7J3VnCu>K&cICL&5-7Xrn60ecO2<{-x6QUJpw7?XQC;PMTUlF>$sGO6
z7GPqvF|pRu2^yH`nwhX#>6RA~Xj@1TC!BW>&^sB=uVr~XLA{&szmd?tnV`OvqkHK%
zkJDk^rrZ1mSIA^sNiLs}bFfpE<Fn*^wFIzB*0SD6S5VH^N2j_m<5YXoPR03YrwUl3
zg$gqnr)n|MJx@VgNx4!1C4A9vB^w&VPI*GaUNeJ&awP}X{R6&4Ih}^%Tm@}_j1+1O
z%$l%e`33q-OO|h#qezeC@{YohWFuT-B$FY|u{Te)ts9<gKmQ@wc5gb{+NW6A_Smp&
zyFwK!Rk2DH0adJ4#V1s;Miup{SgVRps-i&^jjCw+^JnVzOr~BtYNj4@cE0=ne|A2O
z0V$vpZ^Uu&(8<+zqt(8hCci`Okpq}69@cKpWaoQO#qv7h>w2`|HeAHKw-I0F$#@@K
z=T08fzCt+tE8Y03bj`a+bvJIp*VwzC<pCUKet!b@;XAk=&*1?&+d;gBLwFMp;w|Rr
z<8=K2e1nobLHB!73VBxW;D{9CVVR3ZDB+{hg`=_yk5Q_x%N=-J?jijF(%(n=!>k{{
zQ}QIfCC}jLOlCgJ6NH(WQw#!TX5PkZY-Z*i>@hMkd0Ih)9MhS(D-%TS%gW5hGC|~6
zCNm$)WaekA%p8}Ctjv6o#I4M{QDRnResV-+HmQbW<{hJC=GMQM%zPWwY{U#+hRn=7
ze^|_DRz-^{&QnFJ6$Wez(rLFQciPR{tWGE8HU<Ry*wXJ`imT>Mzmx2D(KDlr<J;+p
ze%5x<Gu8Jwvn^#*>{OW{<!tX{tt^v%<GiMUer4myb|$`$3jBbl=pS;{k9cbSF;BoR
z@TB__CcKxp-YewsI=Q?`c)dpCzd=qvCCYzBAO1PH{eoxWm+^c2k{o^|Q}K$-!0Y7t
zs#M}N@v}aUKATRxJ2I(vS0?p7pYfW?tkgR{<2Cc~FGlKBHQh+PHm+%UO$B}ac6yQ>
z)r<gU>h+5=EA_U(H9+yRv*K<^C)Y35kD6dJq#1<2Pwv@Z{xa^c!2A{V@j@&!N+vc~
z_EZolX;(#uD%PoDy=mG8+ftq)E2~T(+f@=_E^Dl|lGEhslJl90N(y)<zX>k;KG<zb
ztF1(1&!E?#BDR5E$1wC(Wsv5`k6y<x^g4#3*D(yeAGYRPYbYDN&OveAma}=CN2e<A
zcA|%ho6a=RNkh#rzE7EL8WmD3rQ&5f$(knv-Y681f6dn01n>JO$8R~~1Dwrdu$UML
z@C3F&Y{nWrG9FuG93l+STV(=QvZG%d*h7FkMRPta8s3ybCaxmIgZ##eSH?*hTRzsO
zi}^0|DH=LrLDNBZFoEk}(lCMRAoSC)CIBqp+T;uaq{55ct43%qptK)Q6IW9DD$1?k
zYBxX{fqQ_rOh+1dH;558mrLewXbnN~g=SYa!H|eNeAOWUzLN>p1n_G1DftVA0eFKd
zE>OjVs`!*DE=r?#i8NUtR+k-y*Ci@A8}>e;U~RzjK&?G5Jni}6X&(kp`%rk=^TIRt
znscq8Y<M~{(z?}wQlZmvbc#afQUtKZ2&GGD?-|DT4y*kd_4fwe!Mnyy=MAH6qO%L9
zP=k|b`%+Xf7}m%%hNIK5P^M$4R1=+ktdSb5mD#*2%t5Q1iFSn;nTb1O7Vc!={I*mu
za8}_B(!WFccS-*q=|2!ZW7b>)k*y3hYc0&#(QYBqPHUQowBtQ%)Tu0*MkIa2L}U%a
z{_VyA#E<V8IJ6l!T%m&H8rV(5q_LJGN*2MHMUy8yYCPVhA41PC?ht_cWbj0N@qO?d
SFrFy~?-~<We$}{t-1SEcR&j~|

diff --git a/src-util/modulescript/build/javasqlc/src/org/openbravo/modulescript/UpdatePaymentPlanData.java b/src-util/modulescript/build/javasqlc/src/org/openbravo/modulescript/UpdatePaymentPlanData.java
new file mode 100644
--- /dev/null
+++ b/src-util/modulescript/build/javasqlc/src/org/openbravo/modulescript/UpdatePaymentPlanData.java
@@ -0,0 +1,307 @@
+//Sqlc generated V1.O00-1
+package org.openbravo.modulescript;
+
+import java.sql.*;
+
+import org.apache.log4j.Logger;
+
+import javax.servlet.ServletException;
+
+import org.openbravo.data.FieldProvider;
+import org.openbravo.database.ConnectionProvider;
+import org.openbravo.data.UtilSql;
+import java.util.*;
+
+class UpdatePaymentPlanData implements FieldProvider {
+static Logger log4j = Logger.getLogger(UpdatePaymentPlanData.class);
+  private String InitRecordNumber="0";
+  public String finpaymentscheduleid;
+  public String paidamt;
+  public String rownum;
+
+  public String getInitRecordNumber() {
+    return InitRecordNumber;
+  }
+
+  public String getField(String fieldName) {
+    if (fieldName.equalsIgnoreCase("FINPAYMENTSCHEDULEID"))
+      return finpaymentscheduleid;
+    else if (fieldName.equalsIgnoreCase("PAIDAMT"))
+      return paidamt;
+    else if (fieldName.equals("rownum"))
+      return rownum;
+   else {
+     log4j.debug("Field does not exist: " + fieldName);
+     return null;
+   }
+ }
+
+  public static UpdatePaymentPlanData[] dummy(ConnectionProvider connectionProvider)    throws ServletException {
+    return dummy(connectionProvider, 0, 0);
+  }
+
+  public static UpdatePaymentPlanData[] dummy(ConnectionProvider connectionProvider, int firstRegister, int numberRegisters)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "      SELECT '' AS finpaymentscheduleid, '' AS paidamt FROM DUAL";
+
+    ResultSet result;
+    Vector<java.lang.Object> vector = new Vector<java.lang.Object>(0);
+    PreparedStatement st = null;
+
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+
+      result = st.executeQuery();
+      long countRecord = 0;
+      long countRecordSkip = 1;
+      boolean continueResult = true;
+      while(countRecordSkip < firstRegister && continueResult) {
+        continueResult = result.next();
+        countRecordSkip++;
+      }
+      while(continueResult && result.next()) {
+        countRecord++;
+        UpdatePaymentPlanData objectUpdatePaymentPlanData = new UpdatePaymentPlanData();
+        objectUpdatePaymentPlanData.finpaymentscheduleid = UtilSql.getValue(result, "FINPAYMENTSCHEDULEID");
+        objectUpdatePaymentPlanData.paidamt = UtilSql.getValue(result, "PAIDAMT");
+        objectUpdatePaymentPlanData.rownum = Long.toString(countRecord);
+        objectUpdatePaymentPlanData.InitRecordNumber = Integer.toString(firstRegister);
+        vector.addElement(objectUpdatePaymentPlanData);
+        if (countRecord >= numberRegisters && numberRegisters != 0) {
+          continueResult = false;
+        }
+      }
+      result.close();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    UpdatePaymentPlanData objectUpdatePaymentPlanData[] = new UpdatePaymentPlanData[vector.size()];
+    vector.copyInto(objectUpdatePaymentPlanData);
+    return(objectUpdatePaymentPlanData);
+  }
+
+  public static String selectAmount(ConnectionProvider connectionProvider, String finpaymentscheduleid)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "      SELECT SUM(psd.amount) AS paidamt" +
+      "      FROM fin_payment p" +
+      "      LEFT JOIN fin_financial_account fa ON p.fin_financial_account_id = fa.fin_financial_account_id, fin_payment_detail pd" +
+      "      JOIN fin_payment_scheduledetail psd ON pd.fin_payment_detail_id = psd.fin_payment_detail_id" +
+      "      LEFT JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id" +
+      "      LEFT JOIN c_invoice i ON psi.c_invoice_id = i.c_invoice_id" +
+      "      LEFT JOIN fin_payment_schedule pso ON psd.fin_payment_schedule_order = pso.fin_payment_schedule_id" +
+      "      LEFT JOIN c_order o ON pso.c_order_id = o.c_order_id" +
+      "      LEFT JOIN c_glitem gli ON pd.c_glitem_id = gli.c_glitem_id" +
+      "      WHERE p.fin_payment_id = pd.fin_payment_id" +
+      "      AND pso.fin_payment_schedule_id = ?";
+
+    ResultSet result;
+    String strReturn = null;
+    PreparedStatement st = null;
+
+    int iParameter = 0;
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+      iParameter++; UtilSql.setValue(st, iParameter, 12, null, finpaymentscheduleid);
+
+      result = st.executeQuery();
+      if(result.next()) {
+        strReturn = UtilSql.getValue(result, "PAIDAMT");
+      }
+      result.close();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    return(strReturn);
+  }
+
+  public static UpdatePaymentPlanData[] select(ConnectionProvider connectionProvider)    throws ServletException {
+    return select(connectionProvider, 0, 0);
+  }
+
+  public static UpdatePaymentPlanData[] select(ConnectionProvider connectionProvider, int firstRegister, int numberRegisters)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "      SELECT fin.fin_payment_schedule_id AS finpaymentscheduleid" +
+      "      FROM fin_payment_schedule fin" +
+      "      WHERE paidamt <> (SELECT SUM(psd.amount)" +
+      "                           FROM fin_payment p" +
+      "                           LEFT JOIN fin_financial_account fa ON p.fin_financial_account_id = fa.fin_financial_account_id, fin_payment_detail pd" +
+      "                           JOIN fin_payment_scheduledetail psd ON pd.fin_payment_detail_id = psd.fin_payment_detail_id" +
+      "                           LEFT JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id" +
+      "                           LEFT JOIN c_invoice i ON psi.c_invoice_id = i.c_invoice_id" +
+      "                           LEFT JOIN fin_payment_schedule pso ON psd.fin_payment_schedule_order = pso.fin_payment_schedule_id" +
+      "                           LEFT JOIN c_order o ON pso.c_order_id = o.c_order_id" +
+      "                           LEFT JOIN c_glitem gli ON pd.c_glitem_id = gli.c_glitem_id" +
+      "                          WHERE p.fin_payment_id = pd.fin_payment_id" +
+      "                          and pso.fin_payment_schedule_id = fin.fin_payment_schedule_id)";
+
+    ResultSet result;
+    Vector<java.lang.Object> vector = new Vector<java.lang.Object>(0);
+    PreparedStatement st = null;
+
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+
+      result = st.executeQuery();
+      long countRecord = 0;
+      long countRecordSkip = 1;
+      boolean continueResult = true;
+      while(countRecordSkip < firstRegister && continueResult) {
+        continueResult = result.next();
+        countRecordSkip++;
+      }
+      while(continueResult && result.next()) {
+        countRecord++;
+        UpdatePaymentPlanData objectUpdatePaymentPlanData = new UpdatePaymentPlanData();
+        objectUpdatePaymentPlanData.finpaymentscheduleid = UtilSql.getValue(result, "FINPAYMENTSCHEDULEID");
+        objectUpdatePaymentPlanData.rownum = Long.toString(countRecord);
+        objectUpdatePaymentPlanData.InitRecordNumber = Integer.toString(firstRegister);
+        vector.addElement(objectUpdatePaymentPlanData);
+        if (countRecord >= numberRegisters && numberRegisters != 0) {
+          continueResult = false;
+        }
+      }
+      result.close();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    UpdatePaymentPlanData objectUpdatePaymentPlanData[] = new UpdatePaymentPlanData[vector.size()];
+    vector.copyInto(objectUpdatePaymentPlanData);
+    return(objectUpdatePaymentPlanData);
+  }
+
+  public static int update(ConnectionProvider connectionProvider, String totalAmount, String finpaymentscheduleid)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "      UPDATE fin_payment_schedule fin" +
+      "      SET outstandingamt = amount - TO_NUMBER(?)," +
+      "      paidamt = TO_NUMBER(?)" +
+      "      WHERE fin.fin_payment_schedule_id = ?";
+
+    int updateCount = 0;
+    PreparedStatement st = null;
+
+    int iParameter = 0;
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+      iParameter++; UtilSql.setValue(st, iParameter, 12, null, totalAmount);
+      iParameter++; UtilSql.setValue(st, iParameter, 12, null, totalAmount);
+      iParameter++; UtilSql.setValue(st, iParameter, 12, null, finpaymentscheduleid);
+
+      updateCount = st.executeUpdate();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    return(updateCount);
+  }
+
+  public static boolean isExecuted(ConnectionProvider connectionProvider)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "        SELECT count(*) as exist" +
+      "        FROM DUAL" +
+      "        WHERE EXISTS (SELECT 1 FROM ad_preference" +
+      "                      WHERE attribute = 'PaymentPlanUpdated')";
+
+    ResultSet result;
+    boolean boolReturn = false;
+    PreparedStatement st = null;
+
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+
+      result = st.executeQuery();
+      if(result.next()) {
+        boolReturn = !UtilSql.getValue(result, "EXIST").equals("0");
+      }
+      result.close();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    return(boolReturn);
+  }
+
+  public static int createPreference(ConnectionProvider connectionProvider)    throws ServletException {
+    String strSql = "";
+    strSql = strSql + 
+      "           INSERT INTO ad_preference (" +
+      "           ad_preference_id, ad_client_id, ad_org_id, isactive," +
+      "           createdby, created, updatedby, updated,attribute" +
+      "           ) VALUES (" +
+      "           get_uuid(), '0', '0', 'Y', '0', NOW(), '0', NOW(),'PaymentPlanUpdated')";
+
+    int updateCount = 0;
+    PreparedStatement st = null;
+
+    try {
+    st = connectionProvider.getPreparedStatement(strSql);
+
+      updateCount = st.executeUpdate();
+    } catch(SQLException e){
+      log4j.error("SQL error in query: " + strSql + "Exception:"+ e);
+      throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage());
+    } catch(Exception ex){
+      log4j.error("Exception in query: " + strSql + "Exception:"+ ex);
+      throw new ServletException("@CODE=@" + ex.getMessage());
+    } finally {
+      try {
+        connectionProvider.releasePreparedStatement(st);
+      } catch(Exception ignore){
+        ignore.printStackTrace();
+      }
+    }
+    return(updateCount);
+  }
+}
diff --git a/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan.java b/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan.java
new file mode 100644
--- /dev/null
+++ b/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan.java
@@ -0,0 +1,44 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo  Public  License
+ * Version  1.0  (the  "License"),  being   the  Mozilla   Public  License
+ * Version 1.1  with a permitted attribution clause; you may not  use this
+ * file except in compliance with the License. You  may  obtain  a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License  is  distributed  on  an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific  language  governing  rights  and  limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo SLU
+ * All portions are Copyright (C) 2014 Openbravo SLU
+ * All Rights Reserved.
+ * Contributor(s):  ______________________________________.
+ *************************************************************************
+ */
+package org.openbravo.modulescript;
+
+import java.sql.PreparedStatement;
+
+import org.openbravo.database.ConnectionProvider;
+import org.openbravo.modulescript.ModuleScript;
+
+public class UpdatePaymentPlan extends ModuleScript {
+
+  public void execute() {
+    try {
+      ConnectionProvider cp = getConnectionProvider();
+      boolean isExecuted = UpdatePaymentPlanData.isExecuted(cp);
+      if (!isExecuted) {
+        UpdatePaymentPlanData[] paymentSchedule = UpdatePaymentPlanData.select(cp);
+        for (UpdatePaymentPlanData ps : paymentSchedule) {
+          String amount = UpdatePaymentPlanData.selectAmount(cp, ps.finpaymentscheduleid);
+          UpdatePaymentPlanData.update(cp, amount, ps.finpaymentscheduleid);
+        }
+        UpdatePaymentPlanData.createPreference(cp);
+      }
+    } catch (Exception e) {
+      handleError(e);
+    }
+  }
+}
\ No newline at end of file
diff --git a/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan_data.xsql b/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan_data.xsql
new file mode 100644
--- /dev/null
+++ b/src-util/modulescript/src/org/openbravo/modulescript/UpdatePaymentPlan_data.xsql
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo  Public  License
+ * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
+ * Version 1.1  with a permitted attribution clause; you may not  use this
+ * file except in compliance with the License. You  may  obtain  a copy of
+ * the License at http://www.openbravo.com/legal/license.html
+ * Software distributed under the License  is  distributed  on  an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific  language  governing  rights  and  limitations
+ * under the License.
+ * The Original Code is Openbravo ERP.
+ * The Initial Developer of the Original Code is Openbravo SLU
+ * All portions are Copyright (C) 2014 Openbravo SLU
+ * All Rights Reserved.
+ * Contributor(s):  ______________________________________.
+ ************************************************************************
+-->
+<SqlClass name="UpdatePaymentPlanData" package="org.openbravo.modulescript">
+   <SqlClassComment></SqlClassComment>
+   <SqlMethod name="dummy" type="preparedStatement" return="multiple">
+    <SqlMethodComment></SqlMethodComment>
+    <Sql>
+      <![CDATA[
+      SELECT '' AS finpaymentscheduleid, '' AS paidamt FROM DUAL
+      ]]>
+    </Sql>
+    <Field name="rownum" value="count"/>
+  </SqlMethod>
+  <SqlMethod name="selectAmount" type="preparedStatement" return="string">
+    <SqlMethodComment></SqlMethodComment>
+    <Sql>
+      <![CDATA[
+      SELECT SUM(psd.amount) AS paidamt
+      FROM fin_payment p
+      LEFT JOIN fin_financial_account fa ON p.fin_financial_account_id = fa.fin_financial_account_id, fin_payment_detail pd
+      JOIN fin_payment_scheduledetail psd ON pd.fin_payment_detail_id = psd.fin_payment_detail_id
+      LEFT JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id
+      LEFT JOIN c_invoice i ON psi.c_invoice_id = i.c_invoice_id
+      LEFT JOIN fin_payment_schedule pso ON psd.fin_payment_schedule_order = pso.fin_payment_schedule_id
+      LEFT JOIN c_order o ON pso.c_order_id = o.c_order_id
+      LEFT JOIN c_glitem gli ON pd.c_glitem_id = gli.c_glitem_id
+      WHERE p.fin_payment_id = pd.fin_payment_id
+      AND pso.fin_payment_schedule_id = ?
+      ]]>
+    </Sql>
+    <Field name="rownum" value="count"/>
+    <Parameter name="finpaymentscheduleid"/>
+  </SqlMethod>
+  <SqlMethod name="select" type="preparedStatement" return="multiple">
+    <SqlMethodComment></SqlMethodComment>
+    <Sql>
+      <![CDATA[
+      SELECT fin.fin_payment_schedule_id AS finpaymentscheduleid
+      FROM fin_payment_schedule fin
+      WHERE paidamt <> (SELECT SUM(psd.amount)
+                           FROM fin_payment p
+                           LEFT JOIN fin_financial_account fa ON p.fin_financial_account_id = fa.fin_financial_account_id, fin_payment_detail pd
+                           JOIN fin_payment_scheduledetail psd ON pd.fin_payment_detail_id = psd.fin_payment_detail_id
+                           LEFT JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id
+                           LEFT JOIN c_invoice i ON psi.c_invoice_id = i.c_invoice_id
+                           LEFT JOIN fin_payment_schedule pso ON psd.fin_payment_schedule_order = pso.fin_payment_schedule_id
+                           LEFT JOIN c_order o ON pso.c_order_id = o.c_order_id
+                           LEFT JOIN c_glitem gli ON pd.c_glitem_id = gli.c_glitem_id
+                          WHERE p.fin_payment_id = pd.fin_payment_id
+                          and pso.fin_payment_schedule_id = fin.fin_payment_schedule_id)
+      ]]>
+    </Sql>
+    <Field name="rownum" value="count"/>
+  </SqlMethod>
+  <SqlMethod name="update" type="preparedStatement" return="rowCount">
+    <SqlMethodComment></SqlMethodComment>
+    <Sql>
+      <![CDATA[
+      UPDATE fin_payment_schedule fin
+      SET outstandingamt = amount - TO_NUMBER(?),
+      paidamt = TO_NUMBER(?)
+      WHERE fin.fin_payment_schedule_id = ?
+      ]]>
+    </Sql>
+    <Parameter name="totalAmount"/>
+    <Parameter name="totalAmount"/>
+    <Parameter name="finpaymentscheduleid"/>
+  </SqlMethod>
+  <SqlMethod name="isExecuted" type="preparedStatement" return="boolean">
+    <SqlMethodComment></SqlMethodComment>
+    <Sql>
+      <![CDATA[
+        SELECT count(*) as exist
+        FROM DUAL
+        WHERE EXISTS (SELECT 1 FROM ad_preference
+                      WHERE attribute = 'PaymentPlanUpdated')
+      ]]>
+    </Sql>
+  </SqlMethod>
+   <SqlMethod name="createPreference" type="preparedStatement" return="rowcount">
+      <SqlMethodComment></SqlMethodComment>
+       <Sql> 
+       <![CDATA[ 
+           INSERT INTO ad_preference (
+           ad_preference_id, ad_client_id, ad_org_id, isactive,
+           createdby, created, updatedby, updated,attribute
+           ) VALUES (
+           get_uuid(), '0', '0', 'Y', '0', NOW(), '0', NOW(),'PaymentPlanUpdated')
+         ]]>
+        </Sql>
+   </SqlMethod>
+</SqlClass>
\ No newline at end of file
