details:   /erp/devel/pi/rev/d292a7070318
changeset: 11736:d292a7070318
user:      Adrián Romero <adrianromero <at> openbravo.com>
date:      Wed Apr 27 18:00:31 2011 +0200
summary:   Issue 0016056: A sales order with discount cannot be reactivated nor 
closed
It has been fixed the process of closing sales orders. Discounts are 
recalculated reusing previous discount lines if it is not possible to delete 
these discount lines because there already exist records linked to these 
discount lines

diffstat:

 src-db/database/model/functions/C_ORDER_POST1.xml |  105 ++++++++++++++-------
 1 files changed, 69 insertions(+), 36 deletions(-)

diffs (143 lines):

diff -r 33fa8bd2fa96 -r d292a7070318 
src-db/database/model/functions/C_ORDER_POST1.xml
--- a/src-db/database/model/functions/C_ORDER_POST1.xml Wed Apr 27 16:41:09 
2011 +0200
+++ b/src-db/database/model/functions/C_ORDER_POST1.xml Wed Apr 27 18:00:31 
2011 +0200
@@ -104,6 +104,7 @@
     v_Discount NUMBER;
     v_precision NUMBER;
     Cur_OrderLine RECORD;
+    v_DiscountExist NUMBER;
   BEGIN
     IF(p_PInstance_ID IS NOT NULL) THEN
       --  Update AD_PInstance
@@ -616,19 +617,43 @@
         END IF;
       END IF;
     END IF;--END_PROCESSING
+
     IF(NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
      
/**************************************************************************
-        * Calculate Discounts only when processing the document.
+        * Calculate Discounts
         
*************************************************************************/
 
-      -- AProove, COmplete, PRocess
-      IF(v_DocAction IN('AP', 'CO', 'PR')) THEN
+        -- Delete first previous discounts (if possible) and then recalculate 
them
 
-        -- Delete first previous discounts if any and then recalculate them
+        UPDATE C_ORDER
+            SET DocStatus='IP', -- In progress
+            Processing='N',
+            Processed='N',
+            Updated=now(),
+            UpdatedBy=v_User
+        WHERE C_Order_ID=v_Record_ID;
+
         DELETE
         FROM C_ORDERLINE
         WHERE C_ORDER_DISCOUNT_ID IS NOT NULL
+        AND C_ORDER_ID = v_Record_ID
+        AND NOT EXISTS (SELECT C_INVOICELINE_ID FROM C_INVOICELINE WHERE 
C_INVOICELINE.C_ORDERLINE_ID = C_ORDERLINE.C_ORDERLINE_ID)
+        AND NOT EXISTS (SELECT M_INOUTLINE_ID FROM M_INOUTLINE WHERE 
M_INOUTLINE.C_ORDERLINE_ID = C_ORDERLINE.C_ORDERLINE_ID)
+        AND NOT EXISTS (SELECT M_MATCHPO_ID FROM M_MATCHPO WHERE 
M_MATCHPO.C_ORDERLINE_ID = C_ORDERLINE.C_ORDERLINE_ID);
+
+        UPDATE C_ORDERLINE
+        SET pricelist = 0, priceactual = 0, pricelimit = 0, linenetamt = 0, 
pricestd = 0
+        WHERE C_ORDER_DISCOUNT_ID IS NOT NULL
         AND C_ORDER_ID=v_Record_ID;
+
+        UPDATE C_ORDER
+            SET DocStatus=v_DocStatus, -- restore
+            Processing=v_IsProcessing,
+            Processed=v_IsProcessed,
+            Updated=now(),
+            UpdatedBy=v_User
+        WHERE C_Order_ID=v_Record_ID;
+
         v_CumDiscount:=0;
         v_OldCumDiscount:=0;
         v_Line:=10;
@@ -674,43 +699,51 @@
             ELSE
               v_Discount:=(-1) * Cur_TaxDiscount.LINENETAMT * 
Cur_COrderDiscount.Discount/100;
             END IF;
-            v_OrderLineSeqNo:=10 + v_OrderLineSeqNo;
-            v_OrderLine:=get_uuid() ;
+
+            SELECT COUNT(*) INTO v_DiscountExist FROM C_ORDERLINE
+            WHERE C_ORDERLINE.C_ORDER_DISCOUNT_ID = 
Cur_COrderDiscount.C_ORDER_DISCOUNT_ID
+            AND C_ORDERLINE.C_TAX_ID = Cur_TaxDiscount.C_TAX_ID;
             
-            INSERT INTO c_orderline
-              (
-                c_orderline_id, ad_client_id, ad_org_id, isactive, created, 
createdby, 
-                updated, updatedby, c_order_id, line, c_bpartner_id, 
c_bpartner_location_id, 
-                dateordered, datepromised, datedelivered, dateinvoiced, 
description, 
-                m_product_id, m_warehouse_id, directship, c_uom_id, 
qtyordered, 
-                qtyreserved, qtydelivered, qtyinvoiced, m_shipper_id, 
c_currency_id, 
-                pricelist, priceactual, pricelimit, linenetamt, discount, 
freightamt, 
-                c_charge_id, chargeamt, c_tax_id, s_resourceassignment_id, 
ref_orderline_id, 
-                m_attributesetinstance_id, isdescription, quantityorder, 
m_product_uom_id, 
-                m_offer_id, pricestd, C_ORDER_DISCOUNT_ID
-              )
-            VALUES 
-              (
-                v_OrderLine, v_Client_ID, v_Org_ID, 'Y', now(), v_UpdatedBy,
-                now(), v_UpdatedBy, v_Record_ID, v_OrderLineSeqNo, NULL, NULL, 
-                now(), now(), now(), now(), Cur_COrderDiscount.NAME, 
-                Cur_COrderDiscount.M_PRODUCT_ID, v_M_Warehouse_ID, 'N', 
Cur_COrderDiscount.C_UOM_ID, 1, 
-                0, 0, 0, NULL, v_c_currency_id, 
-                ROUND(v_Discount,v_precision), ROUND(v_Discount,v_precision), 
ROUND(v_Discount,v_precision), ROUND(v_Discount,v_precision), 0, 0, 
-                NULL, NULL, Cur_TaxDiscount.C_TAX_ID, NULL, NULL, 
-                NULL, 'N', NULL, NULL, 
-                NULL, ROUND(v_Discount,v_precision), NULL
-              );
-           
-            UPDATE C_ORDERLINE
-            SET C_ORDER_DISCOUNT_ID=Cur_COrderDiscount.C_ORDER_DISCOUNT_ID
-            WHERE C_ORDERLINE_ID=v_OrderLine;
-            
+           IF (v_DiscountExist = 0) THEN
+                   v_OrderLineSeqNo:=10 + v_OrderLineSeqNo;
+                   v_OrderLine:=get_uuid();
+                   INSERT INTO c_orderline
+                     (
+                       c_orderline_id, ad_client_id, ad_org_id, isactive, 
created, createdby,
+                       updated, updatedby, c_order_id, line, c_bpartner_id, 
c_bpartner_location_id,
+                       dateordered, datepromised, datedelivered, dateinvoiced, 
description,
+                       m_product_id, m_warehouse_id, directship, c_uom_id, 
qtyordered,
+                       qtyreserved, qtydelivered, qtyinvoiced, m_shipper_id, 
c_currency_id,
+                       pricelist, priceactual, pricelimit, linenetamt, 
discount, freightamt,
+                       c_charge_id, chargeamt, c_tax_id, 
s_resourceassignment_id, ref_orderline_id,
+                       m_attributesetinstance_id, isdescription, 
quantityorder, m_product_uom_id,
+                       m_offer_id, pricestd, C_ORDER_DISCOUNT_ID
+                     )
+                   VALUES
+                     (
+                       v_OrderLine, v_Client_ID, v_Org_ID, 'Y', now(), 
v_UpdatedBy,
+                       now(), v_UpdatedBy, v_Record_ID, v_OrderLineSeqNo, 
NULL, NULL,
+                       now(), now(), now(), now(), Cur_COrderDiscount.NAME,
+                       Cur_COrderDiscount.M_PRODUCT_ID, v_M_Warehouse_ID, 'N', 
Cur_COrderDiscount.C_UOM_ID, 1,
+                       0, 0, 0, NULL, v_c_currency_id,
+                       ROUND(v_Discount,v_precision), 
ROUND(v_Discount,v_precision), ROUND(v_Discount,v_precision), 
ROUND(v_Discount,v_precision), 0, 0,
+                       NULL, NULL, Cur_TaxDiscount.C_TAX_ID, NULL, NULL,
+                       NULL, 'N', NULL, NULL,
+                       NULL, ROUND(v_Discount,v_precision), NULL
+                     );
 
+                   UPDATE C_ORDERLINE
+                   SET 
C_ORDER_DISCOUNT_ID=Cur_COrderDiscount.C_ORDER_DISCOUNT_ID
+                   WHERE C_ORDERLINE_ID=v_OrderLine;
+            ELSE
+                   UPDATE C_ORDERLINE 
+                   SET pricelist = ROUND(v_Discount,v_precision), priceactual 
= ROUND(v_Discount,v_precision), pricelimit = ROUND(v_Discount,v_precision), 
linenetamt = ROUND(v_Discount,v_precision), pricestd = 
ROUND(v_Discount,v_precision)
+                   WHERE C_ORDERLINE.C_ORDER_DISCOUNT_ID = 
Cur_COrderDiscount.C_ORDER_DISCOUNT_ID
+                   AND C_ORDERLINE.C_TAX_ID = Cur_TaxDiscount.C_TAX_ID;
+            END IF;
           END LOOP;
           v_Line:=v_Line + 10;
         END LOOP;
-        END IF;
     END IF;
     
     IF(NOT END_PROCESSING AND NOT FINISH_PROCESS) THEN

------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to