details:   https://code.openbravo.com/erp/devel/pi/rev/331403eece14
changeset: 15188:331403eece14
user:      Gorka Ion Damián <gorkaion.damian <at> openbravo.com>
date:      Tue Jan 24 17:41:26 2012 +0100
summary:   Fixed issue 19534.Set greatest of invoiced or delivered qty.

details:   https://code.openbravo.com/erp/devel/pi/rev/8f2bc6078c77
changeset: 15189:8f2bc6078c77
user:      Gorka Ion Damián <gorkaion.damian <at> openbravo.com>
date:      Tue Jan 24 17:42:28 2012 +0100
summary:   Fixed issue 19534.Properly update grand total difference on psds 
after close.

diffstat:

 
modules/org.openbravo.advpaymentmngt/src-db/database/model/functions/APRM_GEN_PAYMENTSCHEDULE_ORD.xml
 |  110 +++++----
 modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_MESSAGE.xml 
                       |   11 +
 src-db/database/model/functions/C_ORDER_POST1.xml                              
                       |   37 +-
 3 files changed, 91 insertions(+), 67 deletions(-)

diffs (235 lines):

diff -r 91a0972e4ee7 -r 8f2bc6078c77 
modules/org.openbravo.advpaymentmngt/src-db/database/model/functions/APRM_GEN_PAYMENTSCHEDULE_ORD.xml
--- 
a/modules/org.openbravo.advpaymentmngt/src-db/database/model/functions/APRM_GEN_PAYMENTSCHEDULE_ORD.xml
     Tue Jan 24 16:29:50 2012 +0100
+++ 
b/modules/org.openbravo.advpaymentmngt/src-db/database/model/functions/APRM_GEN_PAYMENTSCHEDULE_ORD.xml
     Tue Jan 24 17:42:28 2012 +0100
@@ -38,11 +38,7 @@
 v_bpartner_id c_order.c_bpartner_id%TYPE;
 v_docSubType c_doctype.docsubtypeso%TYPE;
 v_PaymentPriority VARCHAR(32);
-
-v_Outstandingamt NUMBER;
-v_Paidamt NUMBER;
-v_Amount NUMBER;
-v_FinPaymentScheduleId VARCHAR2(32);
+v_count NUMBER;
 
 TYPE RECORD IS REF CURSOR;
 Cur_Params RECORD;
@@ -80,13 +76,25 @@
   FROM c_order
   WHERE c_order_id = p_record_id;
 
-  SELECT docsubtypeso
-  INTO v_docSubType
+  SELECT COALESCE(docsubtypeso, '---') INTO v_docSubType
   FROM c_doctype
   WHERE c_doctype_id = v_C_Doctype_ID;
   
-  IF(v_docSubType is null or v_docSubType not in ('OB', 'ON')) THEN
-    IF (p_docaction = 'CO') THEN
+  SELECT count(*) INTO v_count
+  FROM fin_payment_schedule
+  WHERE c_order_id = p_record_id
+    -- Migrated orders with related debt-payments have an additional 
fin_payment_schedule with the paid amount.
+    -- These additional fin_payment_schedules do not have 
fin_payment_scheduledetail records.
+    AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail
+                WHERE fin_payment_schedule_order = 
fin_payment_schedule.fin_payment_schedule_id);
+  IF (v_count > 1) THEN
+    RAISE_APPLICATION_ERROR(-20000, '@APRM_Multiple_Payment_Schedules@');
+  END IF;
+  
+  IF(v_docSubType in ('OB', 'ON')) THEN
+    RETURN;
+  END IF;
+  IF (p_docaction = 'CO') THEN
     -- Checking Payment Method ID is available
     IF(v_paymentmethod_id IS NULL) THEN
       RAISE_APPLICATION_ERROR(-20000, '@APRM_PAYMENTMETHOD_MISSING@');
@@ -171,7 +179,6 @@
   ELSIF (p_docaction = 'RE') THEN
     -- check there is not any paid payment
     DECLARE
-      v_count NUMBER;
       Cur_PaymentScheduleDetail RECORD;
     BEGIN
       SELECT count(*) INTO v_count
@@ -204,53 +211,60 @@
     END;
   ELSIF (p_docaction = 'CL') THEN
     DECLARE
-      v_OldGrandTotal NUMBER;
+      v_difference NUMBER;
+      v_FinPaymentScheduleId VARCHAR2(32);
+      v_FinPaymentScheduleDetailId VARCHAR2(32);
+      v_psd_amt NUMBER;
     BEGIN
-      SELECT sum(amount) INTO v_OldGrandTotal
+      SELECT v_grandtotal - sum(amount) INTO v_difference
       FROM fin_payment_schedule
       WHERE c_order_id = p_record_id;
-      --IF (v_difference <> 0) THEN
-      --  UPDATE fin_payment_schedule
-      --  SET amount = amount - v_difference,
-      --  outstandingamt = outstandingamt - v_difference,
-      --  updated = TO_DATE(NOW()),
-      --  updatedby = p_user
-      --  WHERE c_order_id = p_record_id
-      --    AND outstandingamt > v_difference;
-      --END IF;
-      --This part of code Update the tables fin_payment_schedule and 
fin_payment_scheduledetail when one order is closed and the pyment is not
-      --the same of the expected amount when the order is closed
-      SELECT 
co.grandtotal,fps.outstandingamt,fps.paidamt,fps.amount,fps.fin_payment_schedule_id
-      INTO 
v_GrandTotal,v_Outstandingamt,v_Paidamt,v_Amount,v_FinPaymentScheduleId
-      FROM c_order co LEFT JOIN c_orderline col ON co.c_order_id=col.c_order_id
-      LEFT JOIN fin_payment_schedule fps ON fps.c_order_id = col.c_order_id
-      WHERE co.C_Order_ID=p_record_id
-      GROUP BY 
co.c_order_id,co.grandtotal,fps.outstandingamt,fps.paidamt,fps.amount,fps.fin_payment_schedule_id;
 
-      IF (v_OldGrandTotal <> v_GrandTotal) THEN
-         IF (v_Paidamt < v_OldGrandTotal) THEN
-            UPDATE fin_payment_scheduledetail set amount = v_GrandTotal - 
v_Paidamt where fin_payment_detail_id IS NULL
-            AND fin_payment_schedule_order = v_FinPaymentScheduleId;
-         ELSE
-            INSERT INTO fin_payment_scheduledetail (
-            
fin_payment_scheduledetail_id,ad_client_id,ad_org_id,created,createdby,updated,updatedby,
-            
fin_payment_detail_id,fin_payment_schedule_order,fin_payment_schedule_invoice,amount,
-            isactive,writeoffamt,iscanceled,c_bpartner_id, 
c_activity_id,m_product_id,c_campaign_id,
-            c_project_id,c_salesregion_id
-            )
-            VALUES(
-            get_uuid(),v_Client_ID,v_Org_ID,now(),p_user,now(),p_user,
-            null,v_FinPaymentScheduleId,null,v_GrandTotal-v_OldGrandTotal,
-            'Y',0 ,'N',v_bpartner_id, null,null,null,
-            null,null
-            );
+      SELECT ps.fin_payment_schedule_id INTO v_finpaymentscheduleid
+      FROM fin_payment_schedule ps
+      WHERE ps.c_order_id=p_record_id
+        AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail WHERE 
fin_payment_schedule_order = ps.fin_payment_schedule_id);
+
+      IF (v_difference <> 0) THEN
+        --Get fin_payment_scheduledetail not related to payments nor invoices.
+        SELECT fin_payment_scheduledetail_id, amount
+          INTO v_finpaymentscheduledetailid, v_psd_amt
+        FROM fin_payment_scheduledetail
+        WHERE fin_payment_schedule_order = v_finpaymentscheduleid
+          AND fin_payment_schedule_invoice IS NULL
+          AND fin_payment_detail_id IS NULL;
+        IF (v_finpaymentscheduledetailid IS NOT NULL) THEN
+          --If exists a psd not related to any invoice nor invoice update its 
amount with the difference.
+          IF (v_psd_amt * -1 = v_difference) THEN
+            -- If amounts are equal we delete the psd
+            DELETE FROM fin_payment_scheduledetail
+            WHERE fin_payment_scheduledetail_id = v_finpaymentscheduledetailid;
+          ELSE 
+            UPDATE fin_payment_scheduledetail
+            SET amount = amount + v_difference
+            WHERE fin_payment_scheduledetail_id = v_finpaymentscheduledetailid;
+          END IF;
+        ELSE
+          -- If not exists a psd to update create one with the difference
+          INSERT INTO fin_payment_scheduledetail (
+              fin_payment_scheduledetail_id, ad_client_id, ad_org_id, isactive,
+              created, createdby, updated, updatedby,
+              fin_payment_detail_id, fin_payment_schedule_order, 
fin_payment_schedule_invoice,
+              amount, writeoffamt, iscanceled
+          ) VALUES (
+              get_uuid(), v_Client_ID, v_Org_ID,'Y',
+              now(), p_user, now(), p_user,
+              null, v_FinPaymentScheduleId, null,
+              v_difference, 0 ,'N'
+          );
         END IF;
-        UPDATE fin_payment_schedule SET amount = v_GrandTotal,outstandingamt = 
v_GrandTotal-v_Paidamt
+        UPDATE fin_payment_schedule 
+        SET amount = amount + v_difference,
+            outstandingamt = outstandingamt + v_difference
         WHERE fin_payment_schedule_id = v_FinPaymentScheduleId;
       END IF;
     END;
   END IF;
-  END IF;
 EXCEPTION
 WHEN OTHERS THEN
   DBMS_OUTPUT.PUT_LINE('APRM_GENERATE_PAYMENT_SCHEDULE exception: '|| 
v_ResultStr);
diff -r 91a0972e4ee7 -r 8f2bc6078c77 
modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_MESSAGE.xml
--- 
a/modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_MESSAGE.xml
    Tue Jan 24 16:29:50 2012 +0100
+++ 
b/modules/org.openbravo.advpaymentmngt/src-db/database/sourcedata/AD_MESSAGE.xml
    Tue Jan 24 17:42:28 2012 +0100
@@ -66,6 +66,17 @@
 <!--19D77522B7A4470FBA505D39A6AA051C-->  
<AD_MODULE_ID><![CDATA[A918E3331C404B889D69AA9BFAFB23AC]]></AD_MODULE_ID>
 <!--19D77522B7A4470FBA505D39A6AA051C--></AD_MESSAGE>
 
+<!--1E8BFED210524080A7F8FE17D6C4DED1--><AD_MESSAGE>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  
<AD_MESSAGE_ID><![CDATA[1E8BFED210524080A7F8FE17D6C4DED1]]></AD_MESSAGE_ID>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  
<VALUE><![CDATA[APRM_Multiple_Payment_Schedules]]></VALUE>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  <MSGTEXT><![CDATA[The order has more 
than one Payment Plan record with related Payment Plan details. Please contact 
your System Administrator to fix it.]]></MSGTEXT>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--1E8BFED210524080A7F8FE17D6C4DED1-->  
<AD_MODULE_ID><![CDATA[A918E3331C404B889D69AA9BFAFB23AC]]></AD_MODULE_ID>
+<!--1E8BFED210524080A7F8FE17D6C4DED1--></AD_MESSAGE>
+
 <!--1EB0D3A668784AF8A9133F066EDE6C44--><AD_MESSAGE>
 <!--1EB0D3A668784AF8A9133F066EDE6C44-->  
<AD_MESSAGE_ID><![CDATA[1EB0D3A668784AF8A9133F066EDE6C44]]></AD_MESSAGE_ID>
 <!--1EB0D3A668784AF8A9133F066EDE6C44-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 91a0972e4ee7 -r 8f2bc6078c77 
src-db/database/model/functions/C_ORDER_POST1.xml
--- a/src-db/database/model/functions/C_ORDER_POST1.xml Tue Jan 24 16:29:50 
2012 +0100
+++ b/src-db/database/model/functions/C_ORDER_POST1.xml Tue Jan 24 17:42:28 
2012 +0100
@@ -421,39 +421,38 @@
         -- Cancel undelivered Items
         IF (v_isSoTrx='Y') THEN --Sales orders
           UPDATE C_ORDERLINE
-          SET QtyOrdered=QtyDelivered,
+          SET QtyOrdered=GREATEST(QtyDelivered, qtyinvoiced),
               --MODIFIED BY P.SAROBE
-              linenetamt=QtyDelivered*priceactual,
+              linenetamt=GREATEST(QtyDelivered, qtyinvoiced)*priceactual,
               --MODIFIED BY F.IRIAZABAL
               QuantityOrder=QuantityOrder,
               Updated=now()
           WHERE C_Order_ID=v_Record_ID
-            AND QtyOrdered<>QtyDelivered;
+            AND QtyOrdered<>GREATEST(QtyDelivered, qtyinvoiced);
           -- For Purchase orders, M_MatchPO table used. Notice that only 
delivered lines(C_Invoiceline_Id is null) using
         ELSE
           UPDATE C_ORDERLINE
-          SET QTYORDERED=COALESCE
-                (
-                  (SELECT SUM(M_MATCHPO.QTY)
+          SET QTYORDERED=COALESCE((
+                  SELECT GREATEST(SUM(CASE WHEN M_MATCHPO.C_INVOICELINE_ID IS 
NULL THEN M_MATCHPO.QTY ELSE 0 END),
+                               SUM(CASE WHEN M_MATCHPO.M_INOUTLINE_ID IS NULL 
THEN M_MATCHPO.QTY ELSE 0 END))
                   FROM M_MATCHPO
                   WHERE M_MATCHPO.C_ORDERLINE_ID=C_ORDERLINE.C_ORDERLINE_ID
-                    AND M_MATCHPO.C_INVOICELINE_ID IS NULL
-                  )
-                  , 0
-                ),
+                  ), 0),
               QuantityOrder=C_ORDERLINE.QuantityOrder,
               Updated=now(),
-              linenetamt=COALESCE
-                (
-                  (SELECT SUM(M_MATCHPO.QTY)
+              linenetamt=COALESCE((
+                  SELECT GREATEST(SUM(CASE WHEN M_MATCHPO.C_INVOICELINE_ID IS 
NULL THEN M_MATCHPO.QTY ELSE 0 END),
+                               SUM(CASE WHEN M_MATCHPO.M_INOUTLINE_ID IS NULL 
THEN M_MATCHPO.QTY ELSE 0 END))
                   FROM M_MATCHPO
                   WHERE M_MATCHPO.C_ORDERLINE_ID=C_ORDERLINE.C_ORDERLINE_ID
-                    AND M_MATCHPO.C_INVOICELINE_ID IS NULL
-                  )
-                  , 0
-                )
-                *priceactual
-          WHERE C_ORDERLINE.C_ORDER_ID=v_Record_ID;
+                  ), 0)*priceactual
+          WHERE C_ORDERLINE.C_ORDER_ID=v_Record_ID
+            AND qtyordered <> COALESCE((
+                  SELECT GREATEST(SUM(CASE WHEN M_MATCHPO.C_INVOICELINE_ID IS 
NULL THEN M_MATCHPO.QTY ELSE 0 END),
+                               SUM(CASE WHEN M_MATCHPO.M_INOUTLINE_ID IS NULL 
THEN M_MATCHPO.QTY ELSE 0 END))
+                  FROM M_MATCHPO
+                  WHERE M_MATCHPO.C_ORDERLINE_ID=C_ORDERLINE.C_ORDERLINE_ID
+                  ), 0);
         END IF;
         -- if there is no change, the tax calculation, etc. is not needed.
         -- potential problem, if posted (i.e. encumbered) for full amount

------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Openbravo-commits mailing list
Openbravo-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to