Merge development (840f74787018) into zk7 branch
This commit is contained in:
commit
b8ae8ddcf8
|
@ -25,6 +25,7 @@ RETURN NUMBER
|
|||
|
||||
AS
|
||||
v_Precision NUMBER := 0;
|
||||
v_Currency NUMBER := 0;
|
||||
v_Min NUMBER := 0;
|
||||
Discount NUMBER := 0;
|
||||
CURSOR Cur_PT IS
|
||||
|
@ -36,10 +37,20 @@ AS
|
|||
Add1Date NUMBER := 0;
|
||||
Add2Date NUMBER := 0;
|
||||
BEGIN
|
||||
v_Currency := Currency_ID;
|
||||
IF (v_Currency = 0) THEN
|
||||
SELECT COALESCE(MAX(C_Currency_ID),0)
|
||||
INTO v_Currency
|
||||
FROM AD_ClientInfo ci, C_AcctSchema s, C_PaymentTerm pt
|
||||
WHERE ci.AD_Client_ID = s.AD_Client_ID
|
||||
AND ci.AD_Client_ID = pt.AD_Client_ID
|
||||
AND pt.C_PaymentTerm_ID = PaymentTerm_ID;
|
||||
END IF;
|
||||
|
||||
SELECT StdPrecision
|
||||
INTO v_Precision
|
||||
FROM C_Currency
|
||||
WHERE C_Currency_ID = Currency_ID;
|
||||
WHERE C_Currency_ID = v_Currency;
|
||||
|
||||
SELECT POWER(1/10,v_Precision) INTO v_Min FROM DUAL;
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ RETURNS NUMERIC AS $body$
|
|||
|
||||
DECLARE
|
||||
v_Precision NUMERIC := 0;
|
||||
v_Currency NUMERIC := 0;
|
||||
v_Min NUMERIC := 0;
|
||||
Discount NUMERIC := 0;
|
||||
Discount1Date timestamp with time zone;
|
||||
|
@ -34,10 +35,20 @@ DECLARE
|
|||
Add2Date NUMERIC := 0;
|
||||
p RECORD;
|
||||
BEGIN
|
||||
v_Currency := Currency_ID;
|
||||
IF (v_Currency = 0) THEN
|
||||
SELECT COALESCE(MAX(C_Currency_ID),0)
|
||||
INTO v_Currency
|
||||
FROM AD_ClientInfo ci, C_AcctSchema s, C_PaymentTerm pt
|
||||
WHERE ci.AD_Client_ID = s.AD_Client_ID
|
||||
AND ci.AD_Client_ID = pt.AD_Client_ID
|
||||
AND pt.C_PaymentTerm_ID = PaymentTerm_ID;
|
||||
END IF;
|
||||
|
||||
SELECT StdPrecision
|
||||
INTO v_Precision
|
||||
FROM C_Currency
|
||||
WHERE C_Currency_ID = Currency_ID;
|
||||
WHERE C_Currency_ID = v_Currency;
|
||||
|
||||
SELECT 1/10^v_Precision INTO v_Min;
|
||||
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jun 3, 2014 4:22:36 PM ICT
|
||||
-- IDEMPIERE-1968 valid check box in info window can manual editable
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_DATE('2014-06-03 16:22:36','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201639
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406031604_IDEMPIERE-1968.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,73 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jun 3, 2014 5:05:09 PM ICT
|
||||
-- IDEMPIERE-1968 valid check box in info window can manual editable
|
||||
UPDATE AD_Column SET IsUpdateable='N', FKConstraintType='C',Updated=TO_DATE('2014-06-03 17:05:09','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=208377
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:05:16 PM ICT
|
||||
ALTER TABLE AD_InfoWindow_Access DROP CONSTRAINT adinfowindow_adinfowindowacces
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:05:16 PM ICT
|
||||
ALTER TABLE AD_InfoWindow_Access ADD CONSTRAINT adinfowindow_adinfowindowacces FOREIGN KEY (AD_InfoWindow_ID) REFERENCES ad_infowindow(ad_infowindow_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:25 PM ICT
|
||||
INSERT INTO AD_Tab (ImportFields,Processing,IsSingleRow,AD_Window_ID,SeqNo,IsTranslationTab,IsSortTab,HasTree,IsInfoTab,IsReadOnly,IsInsertRecord,IsAdvancedTab,TabLevel,AD_Tab_UU,EntityType,Name,AD_Tab_ID,AD_Org_ID,Created,CreatedBy,Updated,UpdatedBy,IsActive,AD_Column_ID,AD_Table_ID,AD_Client_ID,TreeDisplayedOn) VALUES ('N','N','Y',385,70,'N','N','N','N','N','Y','N',0,'d7868d02-46bc-4112-af34-35df9e13a79f','D','Role Access',200144,0,TO_DATE('2014-06-03 17:13:24','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2014-06-03 17:13:24','YYYY-MM-DD HH24:MI:SS'),100,'Y',208377,200054,0,'B')
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:52 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,36,'N','N',0,'Y',203051,'N','AD_InfoWindow_Access_UU','ff201a9f-6ce6-4554-8fbf-111507465b96','N','N',100,0,100,TO_DATE('2014-06-03 17:13:51','YYYY-MM-DD HH24:MI:SS'),'Y','N',0,1,'N',0,1,1,'N','N',208373,'D',TO_DATE('2014-06-03 17:13:51','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:53 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,22,'N','N',10,'Y',203052,'Y','A Client is a company or a legal entity. You cannot share data between Clients. Tenant is a synonym for Client.','Client/Tenant for this installation.','Client','7bdd6c94-f7dd-4a1d-8188-bd56e3ffe0a6','Y','N',100,0,100,TO_DATE('2014-06-03 17:13:52','YYYY-MM-DD HH24:MI:SS'),'Y','Y',10,1,'N',0,2,1,'N','N',208367,'D',TO_DATE('2014-06-03 17:13:52','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:54 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,IsAllowCopy,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,22,'N','N',20,'Y',203053,'N','An organization is a unit of your client or legal entity - examples are store, department. You can share data between organizations.','Organizational entity within client','Organization','7f47d673-3e32-4b73-bbeb-9409fd67b5ee','Y','N','Y',100,0,100,TO_DATE('2014-06-03 17:13:53','YYYY-MM-DD HH24:MI:SS'),'Y','Y',20,4,'N',0,2,1,'N','N',208368,'D',TO_DATE('2014-06-03 17:13:53','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:55 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,10,'N','N',30,'Y',203054,'N','The Role determines security and access a user who has this Role will have in the System.','Responsibility Role','Role','71b84a87-093a-483e-ae29-19bf3b29f107','Y','N',100,0,100,TO_DATE('2014-06-03 17:13:54','YYYY-MM-DD HH24:MI:SS'),'Y','Y',30,1,'N',0,2,1,'N','N',208376,'D',TO_DATE('2014-06-03 17:13:54','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:56 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,10,'N','N',40,'Y',203055,'N','The Info window is used to search and select records as well as display information relevant to the selection.','Info and search/select Window','Info Window','a1d6782a-7f0e-4261-b018-83bb3299c382','Y','N',100,0,100,TO_DATE('2014-06-03 17:13:55','YYYY-MM-DD HH24:MI:SS'),'Y','Y',40,1,'N',0,2,1,'N','N',208377,'D',TO_DATE('2014-06-03 17:13:55','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:57 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,1,'N','N',50,'Y',203056,'N','There are two methods of making records unavailable in the system: One is to delete the record, the other is to de-activate the record. A de-activated record is not available for selection, but available for reports.
|
||||
There are two reasons for de-activating and not deleting records:
|
||||
(1) The system requires the record for audit purposes.
|
||||
(2) The record is referenced by other records. E.g., you cannot delete a Business Partner, if there are invoices for this partner record existing. You de-activate the Business Partner and prevent that this record is used for future entries.','The record is active in the system','Active','2fde0d03-3be0-4df2-bd56-56efd4d40008','Y','N',100,0,100,TO_DATE('2014-06-03 17:13:56','YYYY-MM-DD HH24:MI:SS'),'Y','Y',50,2,'N',0,1,1,'N','N',208371,'D',TO_DATE('2014-06-03 17:13:56','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:14:23 PM ICT
|
||||
UPDATE AD_Field SET SeqNo=40, IsDisplayed='Y', XPosition=4,Updated=TO_DATE('2014-06-03 17:14:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:16:04 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y', DisplayLogic='@AD_InfoWindow_ID@',Updated=TO_DATE('2014-06-03 17:16:04','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:17:05 PM ICT
|
||||
UPDATE AD_Field SET DisplayLogic=NULL, DefaultValue='@AD_InfoWindow_ID@',Updated=TO_DATE('2014-06-03 17:17:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:21:06 PM ICT
|
||||
UPDATE AD_Tab SET TabLevel=1,Updated=TO_DATE('2014-06-03 17:21:06','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Tab_ID=200144
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:25:34 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_DATE('2014-06-03 17:25:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201645
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:26:17 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_DATE('2014-06-03 17:26:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203053
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406031605_IDEMPIERE-1968-Access.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,100 @@
|
|||
-- June 6, 2014 18:32:00 PM SGT
|
||||
-- IDEMPIERE-1856 Amount in database functions and views are hardcoded to round to 2 decimal points
|
||||
|
||||
CREATE OR REPLACE FUNCTION paymentTermDiscount
|
||||
(
|
||||
Amount IN NUMBER,
|
||||
Currency_ID IN NUMBER,
|
||||
PaymentTerm_ID IN NUMBER,
|
||||
DocDate IN DATE,
|
||||
PayDate IN DATE
|
||||
)
|
||||
RETURN NUMBER
|
||||
/*************************************************************************
|
||||
* The contents of this file are subject to the Compiere License. You may
|
||||
* obtain a copy of the License at http://www.compiere.org/license.html
|
||||
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
|
||||
* express or implied. See the License for details. Code: Compiere ERP+CRM
|
||||
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
|
||||
*************************************************************************
|
||||
* $Id: C_PaymentTerm_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
|
||||
***
|
||||
* Title: Calculate Discount
|
||||
* Description:
|
||||
* Calculate the allowable Discount Amount of the Payment Term
|
||||
*
|
||||
* Test: SELECT C_PaymentTerm_Discount(17777, 103, '10-DEC-1999') FROM DUAL
|
||||
************************************************************************/
|
||||
|
||||
AS
|
||||
v_Precision NUMBER := 0;
|
||||
v_Currency NUMBER := 0;
|
||||
v_Min NUMBER := 0;
|
||||
Discount NUMBER := 0;
|
||||
CURSOR Cur_PT IS
|
||||
SELECT *
|
||||
FROM C_PaymentTerm
|
||||
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
|
||||
Discount1Date DATE;
|
||||
Discount2Date DATE;
|
||||
Add1Date NUMBER := 0;
|
||||
Add2Date NUMBER := 0;
|
||||
BEGIN
|
||||
v_Currency := Currency_ID;
|
||||
IF (v_Currency = 0) THEN
|
||||
SELECT COALESCE(MAX(C_Currency_ID),0)
|
||||
INTO v_Currency
|
||||
FROM AD_ClientInfo ci, C_AcctSchema s, C_PaymentTerm pt
|
||||
WHERE ci.AD_Client_ID = s.AD_Client_ID
|
||||
AND ci.AD_Client_ID = pt.AD_Client_ID
|
||||
AND pt.C_PaymentTerm_ID = PaymentTerm_ID;
|
||||
END IF;
|
||||
|
||||
SELECT StdPrecision
|
||||
INTO v_Precision
|
||||
FROM C_Currency
|
||||
WHERE C_Currency_ID = v_Currency;
|
||||
|
||||
SELECT POWER(1/10,v_Precision) INTO v_Min FROM DUAL;
|
||||
|
||||
-- No Data - No Discount
|
||||
IF (Amount IS NULL OR PaymentTerm_ID IS NULL OR DocDate IS NULL) THEN
|
||||
RETURN 0;
|
||||
END IF;
|
||||
|
||||
FOR p IN Cur_PT LOOP -- for convineance only
|
||||
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
|
||||
Discount1Date := TRUNC(DocDate + p.DiscountDays + p.GraceDays);
|
||||
Discount2Date := TRUNC(DocDate + p.DiscountDays2 + p.GraceDays);
|
||||
|
||||
-- Next Business Day
|
||||
IF (p.IsNextBusinessDay='Y') THEN
|
||||
Discount1Date := nextBusinessDay(Discount1Date, p.AD_Client_ID);
|
||||
Discount2Date := nextBusinessDay(Discount2Date, p.AD_Client_ID);
|
||||
END IF;
|
||||
|
||||
-- Discount 1
|
||||
IF (Discount1Date >= TRUNC(PayDate)) THEN
|
||||
-- DBMS_OUTPUT.PUT_LINE('Discount 1 ' || TO_CHAR(Discount1Date) || ' ' || p.Discount);
|
||||
Discount := Amount * p.Discount / 100;
|
||||
-- Discount 2
|
||||
ELSIF (Discount2Date >= TRUNC(PayDate)) THEN
|
||||
-- DBMS_OUTPUT.PUT_LINE('Discount 2 ' || TO_CHAR(Discount2Date) || ' ' || p.Discount2);
|
||||
Discount := Amount * p.Discount2 / 100;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
-- Ignore Rounding
|
||||
IF (Discount > -v_Min AND Discount < v_Min) THEN
|
||||
Discount := 0;
|
||||
END IF;
|
||||
|
||||
-- Round to currency precision
|
||||
Discount := ROUND(COALESCE(Discount,0), v_Precision);
|
||||
|
||||
RETURN Discount;
|
||||
END paymentTermDiscount;
|
||||
/
|
||||
|
||||
SELECT register_migration_script('201406061832_IDEMPIERE-1856.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,14 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jun 26, 2014 1:04:37 PM SGT
|
||||
-- IDEMPIERE-2023 Scheduler Recipient record has incorrect defaults
|
||||
UPDATE AD_Column SET DefaultValue='-1',Updated=TO_DATE('2014-06-26 13:04:36','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11504
|
||||
;
|
||||
|
||||
-- Jun 26, 2014 1:04:54 PM SGT
|
||||
UPDATE AD_Column SET DefaultValue='-1',Updated=TO_DATE('2014-06-26 13:04:54','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11512
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406261439_IDEMPIERE-2023.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,10 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jul 1, 2014 2:53:42 PM SGT
|
||||
-- IDEMPIERE-2029 Performance gadgets portlet is not sized correctly on login
|
||||
INSERT INTO AD_SysConfig (AD_SysConfig_ID,ConfigurationLevel,Value,AD_SysConfig_UU,Updated,Created,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name,AD_Client_ID,EntityType) VALUES (200057,'C','500','70b3fe79-cbe4-40d5-89b4-a4c5c9c5a845',TO_DATE('2014-07-01 14:53:41','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-07-01 14:53:41','YYYY-MM-DD HH24:MI:SS'),0,100,'Y',100,'ZK_DASHBOARD_PERFORMANCE_TIMEOUT',0,'D')
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407011455_IDEMPIERE-2029.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,43 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jul 1, 2014 3:44:10 PM MYT
|
||||
-- 1003719 Modify "Update Costing" process to create a cost adjustment document
|
||||
UPDATE AD_Process_Para SET SeqNo=120,Updated=TO_DATE('2014-07-01 15:44:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=53378
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:46:18 PM MYT
|
||||
INSERT INTO AD_Process_Para (AD_Process_Para_ID,IsRange,AD_Process_Para_UU,AD_Process_ID,AD_Reference_ID,AD_Val_Rule_ID,IsMandatory,DisplayLogic,EntityType,Name,ColumnName,FieldLength,IsCentrallyMaintained,SeqNo,IsActive,UpdatedBy,Updated,CreatedBy,AD_Org_ID,IsEncrypted,AD_Client_ID,Created) VALUES (200102,'N','8e8036a8-ae8d-4470-a607-9cd048741419',219,19,200050,'N','@IsUpdateCosting@=''Y''','D','Cost Adjustment Document Type','C_DocType_ID',10,'N',110,'Y',100,TO_DATE('2014-07-01 15:46:18','YYYY-MM-DD HH24:MI:SS'),100,0,'N',0,TO_DATE('2014-07-01 15:46:18','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:51:17 PM MYT
|
||||
INSERT INTO AD_Element (ColumnName,AD_Element_ID,Help,Name,Description,PrintName,AD_Element_UU,Updated,AD_Org_ID,CreatedBy,UpdatedBy,IsActive,AD_Client_ID,EntityType,Created) VALUES ('M_CostingLine_ID',202750,'The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Cost Adjustment Line','Unique line in an Inventory cost adjustment document','Cost Adjustment Line','e60cd491-bd9f-4f5f-b031-7401461264c1',TO_DATE('2014-07-01 15:51:16','YYYY-MM-DD HH24:MI:SS'),0,100,100,'Y',0,'D',TO_DATE('2014-07-01 15:51:16','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:05 PM MYT
|
||||
INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,CreatedBy,Updated,IsActive,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,AD_Client_ID,EntityType,IsEncrypted,IsSecure,FKConstraintType,AD_Element_ID,AD_Reference_ID,AD_Reference_Value_ID,AD_Table_ID,AD_Org_ID,Created) VALUES (0,'N',0,211562,'N','N','N',0,'N',10,'N','N','N','Y','044a1793-a72b-49a0-aa64-f1b99565a884','Y','M_CostingLine_ID','Unique line in an Inventory cost adjustment document','The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Cost Adjustment Line','N',100,TO_DATE('2014-07-01 15:53:04','YYYY-MM-DD HH24:MI:SS'),'Y',100,'N','N',0,'D','N','N','N',202750,30,296,572,0,TO_DATE('2014-07-01 15:53:04','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:13 PM MYT
|
||||
UPDATE AD_Column SET FKConstraintType='N', FKConstraintName='MCostingLine_IInventory',Updated=TO_DATE('2014-07-01 15:53:13','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=211562
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:13 PM MYT
|
||||
ALTER TABLE I_Inventory ADD M_CostingLine_ID NUMBER(10) DEFAULT NULL
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:15 PM MYT
|
||||
ALTER TABLE I_Inventory ADD CONSTRAINT MCostingLine_IInventory FOREIGN KEY (M_CostingLine_ID) REFERENCES m_inventoryline(m_inventoryline_id) DEFERRABLE INITIALLY DEFERRED
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:54:41 PM MYT
|
||||
UPDATE AD_Field SET SeqNo=300, SeqNoGrid=300,Updated=TO_DATE('2014-07-01 15:54:41','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=6697
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:56:40 PM MYT
|
||||
INSERT INTO AD_Field (SortNo,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,AD_Tab_ID,EntityType,Created) VALUES (0,'N',0,'N','N',290,'Y',203261,'N','The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Unique line in an Inventory cost adjustment document','Cost Adjustment Line','c8667068-b4f9-43dd-a80d-2b910584a565','Y','N',100,0,100,TO_DATE('2014-07-01 15:56:39','YYYY-MM-DD HH24:MI:SS'),'Y','Y',290,1,'N',0,2,1,'N','N',211562,481,'D',TO_DATE('2014-07-01 15:56:39','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407021018_1003719.sql') FROM dual
|
||||
;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
-- IDEMPIERE-1998 for backward compatibility insert the creator as scheduler recipient
|
||||
insert
|
||||
into ad_schedulerrecipient
|
||||
(
|
||||
ad_schedulerrecipient_id,
|
||||
ad_client_id,
|
||||
ad_org_id,
|
||||
isactive,
|
||||
created,
|
||||
createdby,
|
||||
updated,
|
||||
updatedby,
|
||||
ad_scheduler_id,
|
||||
ad_user_id,
|
||||
ad_role_id,
|
||||
ad_schedulerrecipient_uu
|
||||
)
|
||||
select nextidfunc(921,'N'), s.ad_client_id, s.ad_org_id, s.isactive, sysdate, 100, sysdate, 100, s.ad_scheduler_id, s.createdby, null, generate_uuid()
|
||||
from ad_scheduler s
|
||||
where not exists ( select 1
|
||||
from ad_schedulerrecipient sr
|
||||
where s.ad_scheduler_id=sr.ad_scheduler_id)
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407151334_IDEMPIERE-1998.sql') FROM dual
|
||||
;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
-- Jun 3, 2014 4:22:36 PM ICT
|
||||
-- IDEMPIERE-1968 valid check box in info window can manual editable
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_TIMESTAMP('2014-06-03 16:22:36','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201639
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406031604_IDEMPIERE-1968.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,70 @@
|
|||
-- Jun 3, 2014 5:05:09 PM ICT
|
||||
-- IDEMPIERE-1968 valid check box in info window can manual editable
|
||||
UPDATE AD_Column SET IsUpdateable='N', FKConstraintType='C',Updated=TO_TIMESTAMP('2014-06-03 17:05:09','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=208377
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:05:16 PM ICT
|
||||
ALTER TABLE AD_InfoWindow_Access DROP CONSTRAINT adinfowindow_adinfowindowacces
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:05:16 PM ICT
|
||||
ALTER TABLE AD_InfoWindow_Access ADD CONSTRAINT adinfowindow_adinfowindowacces FOREIGN KEY (AD_InfoWindow_ID) REFERENCES ad_infowindow(ad_infowindow_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:25 PM ICT
|
||||
INSERT INTO AD_Tab (ImportFields,Processing,IsSingleRow,AD_Window_ID,SeqNo,IsTranslationTab,IsSortTab,HasTree,IsInfoTab,IsReadOnly,IsInsertRecord,IsAdvancedTab,TabLevel,AD_Tab_UU,EntityType,Name,AD_Tab_ID,AD_Org_ID,Created,CreatedBy,Updated,UpdatedBy,IsActive,AD_Column_ID,AD_Table_ID,AD_Client_ID,TreeDisplayedOn) VALUES ('N','N','Y',385,70,'N','N','N','N','N','Y','N',0,'d7868d02-46bc-4112-af34-35df9e13a79f','D','Role Access',200144,0,TO_TIMESTAMP('2014-06-03 17:13:24','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2014-06-03 17:13:24','YYYY-MM-DD HH24:MI:SS'),100,'Y',208377,200054,0,'B')
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:52 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,36,'N','N',0,'Y',203051,'N','AD_InfoWindow_Access_UU','ff201a9f-6ce6-4554-8fbf-111507465b96','N','N',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:51','YYYY-MM-DD HH24:MI:SS'),'Y','N',0,1,'N',0,1,1,'N','N',208373,'D',TO_TIMESTAMP('2014-06-03 17:13:51','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:53 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,22,'N','N',10,'Y',203052,'Y','A Client is a company or a legal entity. You cannot share data between Clients. Tenant is a synonym for Client.','Client/Tenant for this installation.','Client','7bdd6c94-f7dd-4a1d-8188-bd56e3ffe0a6','Y','N',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:52','YYYY-MM-DD HH24:MI:SS'),'Y','Y',10,1,'N',0,2,1,'N','N',208367,'D',TO_TIMESTAMP('2014-06-03 17:13:52','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:54 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,IsAllowCopy,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,22,'N','N',20,'Y',203053,'N','An organization is a unit of your client or legal entity - examples are store, department. You can share data between organizations.','Organizational entity within client','Organization','7f47d673-3e32-4b73-bbeb-9409fd67b5ee','Y','N','Y',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:53','YYYY-MM-DD HH24:MI:SS'),'Y','Y',20,4,'N',0,2,1,'N','N',208368,'D',TO_TIMESTAMP('2014-06-03 17:13:53','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:55 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,10,'N','N',30,'Y',203054,'N','The Role determines security and access a user who has this Role will have in the System.','Responsibility Role','Role','71b84a87-093a-483e-ae29-19bf3b29f107','Y','N',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:54','YYYY-MM-DD HH24:MI:SS'),'Y','Y',30,1,'N',0,2,1,'N','N',208376,'D',TO_TIMESTAMP('2014-06-03 17:13:54','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:56 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,10,'N','N',40,'Y',203055,'N','The Info window is used to search and select records as well as display information relevant to the selection.','Info and search/select Window','Info Window','a1d6782a-7f0e-4261-b018-83bb3299c382','Y','N',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:55','YYYY-MM-DD HH24:MI:SS'),'Y','Y',40,1,'N',0,2,1,'N','N',208377,'D',TO_TIMESTAMP('2014-06-03 17:13:55','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:13:57 PM ICT
|
||||
INSERT INTO AD_Field (IsEncrypted,AD_Tab_ID,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,EntityType,Created) VALUES ('N',200144,1,'N','N',50,'Y',203056,'N','There are two methods of making records unavailable in the system: One is to delete the record, the other is to de-activate the record. A de-activated record is not available for selection, but available for reports.
|
||||
There are two reasons for de-activating and not deleting records:
|
||||
(1) The system requires the record for audit purposes.
|
||||
(2) The record is referenced by other records. E.g., you cannot delete a Business Partner, if there are invoices for this partner record existing. You de-activate the Business Partner and prevent that this record is used for future entries.','The record is active in the system','Active','2fde0d03-3be0-4df2-bd56-56efd4d40008','Y','N',100,0,100,TO_TIMESTAMP('2014-06-03 17:13:56','YYYY-MM-DD HH24:MI:SS'),'Y','Y',50,2,'N',0,1,1,'N','N',208371,'D',TO_TIMESTAMP('2014-06-03 17:13:56','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:14:23 PM ICT
|
||||
UPDATE AD_Field SET SeqNo=40, IsDisplayed='Y', XPosition=4,Updated=TO_TIMESTAMP('2014-06-03 17:14:23','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:16:04 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y', DisplayLogic='@AD_InfoWindow_ID@',Updated=TO_TIMESTAMP('2014-06-03 17:16:04','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:17:05 PM ICT
|
||||
UPDATE AD_Field SET DisplayLogic=NULL, DefaultValue='@AD_InfoWindow_ID@',Updated=TO_TIMESTAMP('2014-06-03 17:17:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203055
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:21:06 PM ICT
|
||||
UPDATE AD_Tab SET TabLevel=1,Updated=TO_TIMESTAMP('2014-06-03 17:21:06','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Tab_ID=200144
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:25:34 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_TIMESTAMP('2014-06-03 17:25:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=201645
|
||||
;
|
||||
|
||||
-- Jun 3, 2014 5:26:17 PM ICT
|
||||
UPDATE AD_Field SET IsReadOnly='Y',Updated=TO_TIMESTAMP('2014-06-03 17:26:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=203053
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406031605_IDEMPIERE-1968-Access.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,100 @@
|
|||
-- June 6, 2014 18:32:00 PM SGT
|
||||
-- IDEMPIERE-1856 Amount in database functions and views are hardcoded to round to 2 decimal points
|
||||
|
||||
create or replace FUNCTION paymenttermDiscount
|
||||
(
|
||||
Amount NUMERIC,
|
||||
Currency_ID NUMERIC,
|
||||
PaymentTerm_ID NUMERIC,
|
||||
DocDate timestamp with time zone,
|
||||
PayDate timestamp with time zone
|
||||
)
|
||||
RETURNS NUMERIC AS $body$
|
||||
/*************************************************************************
|
||||
* The contents of this file are subject to the Compiere License. You may
|
||||
* obtain a copy of the License at http://www.compiere.org/license.html
|
||||
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
|
||||
* express or implied. See the License for details. Code: Compiere ERP+CRM
|
||||
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
|
||||
*
|
||||
* converted to postgreSQL by Karsten Thiemann (Schaeffer AG),
|
||||
* kthiemann@adempiere.org
|
||||
*************************************************************************
|
||||
* Title: Calculate Discount
|
||||
* Description:
|
||||
* Calculate the allowable Discount Amount of the Payment Term
|
||||
*
|
||||
* Test: SELECT paymenttermDiscount(110, 103, 106, now(), now()) FROM TEST; => 2.20
|
||||
************************************************************************/
|
||||
|
||||
DECLARE
|
||||
v_Precision NUMERIC := 0;
|
||||
v_Currency NUMERIC := 0;
|
||||
v_Min NUMERIC := 0;
|
||||
Discount NUMERIC := 0;
|
||||
Discount1Date timestamp with time zone;
|
||||
Discount2Date timestamp with time zone;
|
||||
Add1Date NUMERIC := 0;
|
||||
Add2Date NUMERIC := 0;
|
||||
p RECORD;
|
||||
BEGIN
|
||||
v_Currency := Currency_ID;
|
||||
IF (v_Currency = 0) THEN
|
||||
SELECT COALESCE(MAX(C_Currency_ID),0)
|
||||
INTO v_Currency
|
||||
FROM AD_ClientInfo ci, C_AcctSchema s, C_PaymentTerm pt
|
||||
WHERE ci.AD_Client_ID = s.AD_Client_ID
|
||||
AND ci.AD_Client_ID = pt.AD_Client_ID
|
||||
AND pt.C_PaymentTerm_ID = PaymentTerm_ID;
|
||||
END IF;
|
||||
|
||||
SELECT StdPrecision
|
||||
INTO v_Precision
|
||||
FROM C_Currency
|
||||
WHERE C_Currency_ID = v_Currency;
|
||||
|
||||
SELECT 1/10^v_Precision INTO v_Min;
|
||||
|
||||
-- No Data - No Discount
|
||||
IF (Amount IS NULL OR PaymentTerm_ID IS NULL OR DocDate IS NULL) THEN
|
||||
RETURN 0;
|
||||
END IF;
|
||||
|
||||
FOR p IN
|
||||
SELECT *
|
||||
FROM C_PaymentTerm
|
||||
WHERE C_PaymentTerm_ID = PaymentTerm_ID
|
||||
LOOP -- for convineance only
|
||||
Discount1Date := TRUNC(DocDate + p.DiscountDays + p.GraceDays);
|
||||
Discount2Date := TRUNC(DocDate + p.DiscountDays2 + p.GraceDays);
|
||||
|
||||
-- Next Business Day
|
||||
IF (p.IsNextBusinessDay='Y') THEN
|
||||
Discount1Date := nextBusinessDay(Discount1Date, p.AD_Client_ID);
|
||||
Discount2Date := nextBusinessDay(Discount2Date, p.AD_Client_ID);
|
||||
END IF;
|
||||
|
||||
-- Discount 1
|
||||
IF (Discount1Date >= TRUNC(PayDate)) THEN
|
||||
Discount := Amount * p.Discount / 100;
|
||||
-- Discount 2
|
||||
ELSIF (Discount2Date >= TRUNC(PayDate)) THEN
|
||||
Discount := Amount * p.Discount2 / 100;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
-- Ignore Rounding
|
||||
IF (Discount > -v_Min AND Discount < v_Min) THEN
|
||||
Discount := 0;
|
||||
END IF;
|
||||
|
||||
-- Round to currency precision
|
||||
Discount := ROUND(COALESCE(Discount,0), v_Precision);
|
||||
|
||||
RETURN Discount;
|
||||
END;
|
||||
|
||||
$body$ LANGUAGE plpgsql;
|
||||
|
||||
SELECT register_migration_script('201406061832_IDEMPIERE-1856.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,11 @@
|
|||
-- Jun 26, 2014 1:04:37 PM SGT
|
||||
-- IDEMPIERE-2023 Scheduler Recipient record has incorrect defaults
|
||||
UPDATE AD_Column SET DefaultValue='-1',Updated=TO_TIMESTAMP('2014-06-26 13:04:36','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11504
|
||||
;
|
||||
|
||||
-- Jun 26, 2014 1:04:54 PM SGT
|
||||
UPDATE AD_Column SET DefaultValue='-1',Updated=TO_TIMESTAMP('2014-06-26 13:04:54','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11512
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201406261439_IDEMPIERE-2023.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,7 @@
|
|||
-- Jul 1, 2014 2:53:42 PM SGT
|
||||
-- IDEMPIERE-2029 Performance gadgets portlet is not sized correctly on login
|
||||
INSERT INTO AD_SysConfig (AD_SysConfig_ID,ConfigurationLevel,Value,AD_SysConfig_UU,Updated,Created,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name,AD_Client_ID,EntityType) VALUES (200057,'C','500','70b3fe79-cbe4-40d5-89b4-a4c5c9c5a845',TO_TIMESTAMP('2014-07-01 14:53:41','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2014-07-01 14:53:41','YYYY-MM-DD HH24:MI:SS'),0,100,'Y',100,'ZK_DASHBOARD_PERFORMANCE_TIMEOUT',0,'D')
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407011455_IDEMPIERE-2029.sql') FROM dual
|
||||
;
|
|
@ -0,0 +1,40 @@
|
|||
-- Jul 1, 2014 3:44:10 PM MYT
|
||||
-- 1003719 Modify "Update Costing" process to create a cost adjustment document
|
||||
UPDATE AD_Process_Para SET SeqNo=120,Updated=TO_TIMESTAMP('2014-07-01 15:44:10','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=53378
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:46:18 PM MYT
|
||||
INSERT INTO AD_Process_Para (AD_Process_Para_ID,IsRange,AD_Process_Para_UU,AD_Process_ID,AD_Reference_ID,AD_Val_Rule_ID,IsMandatory,DisplayLogic,EntityType,Name,ColumnName,FieldLength,IsCentrallyMaintained,SeqNo,IsActive,UpdatedBy,Updated,CreatedBy,AD_Org_ID,IsEncrypted,AD_Client_ID,Created) VALUES (200102,'N','8e8036a8-ae8d-4470-a607-9cd048741419',219,19,200050,'N','@IsUpdateCosting@=''Y''','D','Cost Adjustment Document Type','C_DocType_ID',10,'N',110,'Y',100,TO_TIMESTAMP('2014-07-01 15:46:18','YYYY-MM-DD HH24:MI:SS'),100,0,'N',0,TO_TIMESTAMP('2014-07-01 15:46:18','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:51:17 PM MYT
|
||||
INSERT INTO AD_Element (ColumnName,AD_Element_ID,Help,Name,Description,PrintName,AD_Element_UU,Updated,AD_Org_ID,CreatedBy,UpdatedBy,IsActive,AD_Client_ID,EntityType,Created) VALUES ('M_CostingLine_ID',202750,'The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Cost Adjustment Line','Unique line in an Inventory cost adjustment document','Cost Adjustment Line','e60cd491-bd9f-4f5f-b031-7401461264c1',TO_TIMESTAMP('2014-07-01 15:51:16','YYYY-MM-DD HH24:MI:SS'),0,100,100,'Y',0,'D',TO_TIMESTAMP('2014-07-01 15:51:16','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:05 PM MYT
|
||||
INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,CreatedBy,Updated,IsActive,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,AD_Client_ID,EntityType,IsEncrypted,IsSecure,FKConstraintType,AD_Element_ID,AD_Reference_ID,AD_Reference_Value_ID,AD_Table_ID,AD_Org_ID,Created) VALUES (0,'N',0,211562,'N','N','N',0,'N',10,'N','N','N','Y','044a1793-a72b-49a0-aa64-f1b99565a884','Y','M_CostingLine_ID','Unique line in an Inventory cost adjustment document','The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Cost Adjustment Line','N',100,TO_TIMESTAMP('2014-07-01 15:53:04','YYYY-MM-DD HH24:MI:SS'),'Y',100,'N','N',0,'D','N','N','N',202750,30,296,572,0,TO_TIMESTAMP('2014-07-01 15:53:04','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:13 PM MYT
|
||||
UPDATE AD_Column SET FKConstraintType='N', FKConstraintName='MCostingLine_IInventory',Updated=TO_TIMESTAMP('2014-07-01 15:53:13','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=211562
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:13 PM MYT
|
||||
ALTER TABLE I_Inventory ADD COLUMN M_CostingLine_ID NUMERIC(10) DEFAULT NULL
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:53:15 PM MYT
|
||||
ALTER TABLE I_Inventory ADD CONSTRAINT MCostingLine_IInventory FOREIGN KEY (M_CostingLine_ID) REFERENCES m_inventoryline(m_inventoryline_id) DEFERRABLE INITIALLY DEFERRED
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:54:41 PM MYT
|
||||
UPDATE AD_Field SET SeqNo=300, SeqNoGrid=300,Updated=TO_TIMESTAMP('2014-07-01 15:54:41','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=6697
|
||||
;
|
||||
|
||||
-- Jul 1, 2014 3:56:40 PM MYT
|
||||
INSERT INTO AD_Field (SortNo,IsEncrypted,DisplayLength,IsSameLine,IsHeading,SeqNo,IsCentrallyMaintained,AD_Field_ID,IsReadOnly,Help,Description,Name,AD_Field_UU,IsDisplayed,IsFieldOnly,UpdatedBy,AD_Org_ID,CreatedBy,Updated,IsActive,IsDisplayedGrid,SeqNoGrid,XPosition,IsQuickEntry,AD_Client_ID,ColumnSpan,NumLines,IsAdvancedField,IsDefaultFocus,AD_Column_ID,AD_Tab_ID,EntityType,Created) VALUES (0,'N',0,'N','N',290,'Y',203261,'N','The Cost Adjustment Line indicates the inventory cost adjustment document line (if applicable) for this transaction','Unique line in an Inventory cost adjustment document','Cost Adjustment Line','c8667068-b4f9-43dd-a80d-2b910584a565','Y','N',100,0,100,TO_TIMESTAMP('2014-07-01 15:56:39','YYYY-MM-DD HH24:MI:SS'),'Y','Y',290,1,'N',0,2,1,'N','N',211562,481,'D',TO_TIMESTAMP('2014-07-01 15:56:39','YYYY-MM-DD HH24:MI:SS'))
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407021018_1003719.sql') FROM dual
|
||||
;
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
-- IDEMPIERE-1998 for backward compatibility insert the creator as scheduler recipient
|
||||
insert
|
||||
into ad_schedulerrecipient
|
||||
(
|
||||
ad_schedulerrecipient_id,
|
||||
ad_client_id,
|
||||
ad_org_id,
|
||||
isactive,
|
||||
created,
|
||||
createdby,
|
||||
updated,
|
||||
updatedby,
|
||||
ad_scheduler_id,
|
||||
ad_user_id,
|
||||
ad_role_id,
|
||||
ad_schedulerrecipient_uu
|
||||
)
|
||||
select nextidfunc(921,'N'), s.ad_client_id, s.ad_org_id, s.isactive, statement_timestamp(), 100, statement_timestamp(), 100, s.ad_scheduler_id, s.createdby, null, generate_uuid()
|
||||
from ad_scheduler s
|
||||
where not exists ( select 1
|
||||
from ad_schedulerrecipient sr
|
||||
where s.ad_scheduler_id=sr.ad_scheduler_id)
|
||||
;
|
||||
|
||||
SELECT register_migration_script('201407151334_IDEMPIERE-1998.sql') FROM dual
|
||||
;
|
||||
|
|
@ -23,6 +23,7 @@ import java.sql.Timestamp;
|
|||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.compiere.model.I_C_DocType;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MAttributeSet;
|
||||
import org.compiere.model.MAttributeSetInstance;
|
||||
|
@ -31,9 +32,13 @@ import org.compiere.model.MInventory;
|
|||
import org.compiere.model.MInventoryLine;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MProductCategoryAcct;
|
||||
import org.compiere.model.PO;
|
||||
import org.compiere.model.X_I_Inventory;
|
||||
import org.compiere.util.AdempiereUserError;
|
||||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.util.TimeUtil;
|
||||
import org.compiere.util.ValueNamePair;
|
||||
|
||||
|
@ -73,7 +78,9 @@ public class ImportInventory extends SvrProcess
|
|||
private int p_AD_OrgTrx_ID = 0;
|
||||
/** Document Action */
|
||||
private String m_docAction = null;
|
||||
private MInventory costingDoc = null;
|
||||
|
||||
private int p_C_DocType_ID = 0;
|
||||
/**
|
||||
* Prepare - e.g., get Parameters.
|
||||
*/
|
||||
|
@ -107,8 +114,10 @@ public class ImportInventory extends SvrProcess
|
|||
p_AD_OrgTrx_ID = ((BigDecimal)para[i].getParameter()).intValue();
|
||||
else if (name.equals("DocAction"))
|
||||
m_docAction = (String)para[i].getParameter();
|
||||
else if (name.equals("C_DocType_ID"))
|
||||
p_C_DocType_ID = ((BigDecimal)para[i].getParameter()).intValue();
|
||||
else
|
||||
log.log(Level.SEVERE, "Unknown Parameter: " + name);
|
||||
log.log(Level.WARNING, "Unknown Parameter: " + name);
|
||||
}
|
||||
} // prepare
|
||||
|
||||
|
@ -135,6 +144,9 @@ public class ImportInventory extends SvrProcess
|
|||
}
|
||||
if (p_AD_OrgTrx_ID < 0 ) {
|
||||
throw new IllegalArgumentException("AD_OrgTrx required!");
|
||||
}
|
||||
if (p_C_DocType_ID <= 0 ) {
|
||||
throw new IllegalArgumentException("Cost Adjustment Document Type required!");
|
||||
}
|
||||
acctSchema = MAcctSchema.get(getCtx(), p_C_AcctSchema_ID, get_TrxName());
|
||||
}
|
||||
|
@ -426,28 +438,7 @@ public class ImportInventory extends SvrProcess
|
|||
noInsertLine++;
|
||||
//@Trifon update Product cost record if Update costing is enabled
|
||||
if (p_UpdateCosting) {
|
||||
String costingLevel = null;
|
||||
if(product.getM_Product_Category_ID() > 0){
|
||||
MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), product.getM_Product_Category_ID(), p_C_AcctSchema_ID, get_TrxName());
|
||||
costingLevel = pca.getCostingLevel();
|
||||
if (costingLevel == null) {
|
||||
costingLevel = acctSchema.getCostingLevel();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int costOrgID = p_AD_OrgTrx_ID;
|
||||
int costASI = line.getM_AttributeSetInstance_ID();
|
||||
if (MAcctSchema.COSTINGLEVEL_Client.equals(costingLevel)){
|
||||
costOrgID = 0;
|
||||
costASI = 0;
|
||||
} else if (MAcctSchema.COSTINGLEVEL_Organization.equals(costingLevel)) {
|
||||
costASI = 0;
|
||||
}
|
||||
MCost cost = MCost.get (MProduct.get(getCtx(), imp.getM_Product_ID()), costASI
|
||||
, acctSchema, costOrgID, p_M_CostElement_ID, get_TrxName());
|
||||
cost.setCurrentCostPrice( imp.getCurrentCostPrice() );
|
||||
cost.saveEx();
|
||||
updateCosting(imp, product, line);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -470,6 +461,21 @@ public class ImportInventory extends SvrProcess
|
|||
inventory.saveEx();
|
||||
}
|
||||
}
|
||||
|
||||
if (costingDoc != null) {
|
||||
if (!DocumentEngine.processIt(costingDoc, DocAction.ACTION_Complete))
|
||||
{
|
||||
StringBuilder msg = new StringBuilder();
|
||||
I_C_DocType docType = costingDoc.getC_DocType();
|
||||
msg.append(Msg.getMsg(getCtx(), "ProcessFailed")).append(": ");
|
||||
if (Env.isBaseLanguage(getCtx(), I_C_DocType.Table_Name))
|
||||
msg.append(docType.getName());
|
||||
else
|
||||
msg.append(((PO)docType).get_Translation(I_C_DocType.COLUMNNAME_Name));
|
||||
throw new AdempiereUserError(msg.toString());
|
||||
}
|
||||
costingDoc.saveEx();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -493,4 +499,48 @@ public class ImportInventory extends SvrProcess
|
|||
return "";
|
||||
} // doIt
|
||||
|
||||
|
||||
private void updateCosting(X_I_Inventory imp, MProduct product,
|
||||
MInventoryLine line) {
|
||||
String costingLevel = null;
|
||||
if(product.getM_Product_Category_ID() > 0){
|
||||
MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), product.getM_Product_Category_ID(), p_C_AcctSchema_ID, get_TrxName());
|
||||
costingLevel = pca.getCostingLevel();
|
||||
if (costingLevel == null) {
|
||||
costingLevel = acctSchema.getCostingLevel();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int costOrgID = p_AD_OrgTrx_ID;
|
||||
int costASI = line.getM_AttributeSetInstance_ID();
|
||||
if (MAcctSchema.COSTINGLEVEL_Client.equals(costingLevel)){
|
||||
costOrgID = 0;
|
||||
costASI = 0;
|
||||
} else if (MAcctSchema.COSTINGLEVEL_Organization.equals(costingLevel)) {
|
||||
costASI = 0;
|
||||
}
|
||||
MCost cost = MCost.get (MProduct.get(getCtx(), imp.getM_Product_ID()), costASI
|
||||
, acctSchema, costOrgID, p_M_CostElement_ID, get_TrxName());
|
||||
|
||||
if (costingDoc == null) {
|
||||
costingDoc = new MInventory(getCtx(), 0, get_TrxName());
|
||||
costingDoc.setC_DocType_ID(p_C_DocType_ID);
|
||||
costingDoc.setCostingMethod(cost.getM_CostElement().getCostingMethod());
|
||||
costingDoc.setDocAction(DocAction.ACTION_Complete);
|
||||
costingDoc.saveEx();
|
||||
}
|
||||
|
||||
MInventoryLine costingLine = new MInventoryLine(getCtx(), 0, get_TrxName());
|
||||
costingLine.setM_Inventory_ID(costingDoc.getM_Inventory_ID());
|
||||
costingLine.setM_Product_ID(cost.getM_Product_ID());
|
||||
costingLine.setCurrentCostPrice(cost.getCurrentCostPrice());
|
||||
costingLine.setNewCostPrice(imp.getCurrentCostPrice());
|
||||
costingLine.setM_Locator_ID(0);
|
||||
costingLine.saveEx();
|
||||
|
||||
imp.setM_CostingLine_ID(costingLine.getM_InventoryLine_ID());
|
||||
imp.saveEx();
|
||||
}
|
||||
|
||||
} // ImportInventory
|
||||
|
|
|
@ -525,6 +525,10 @@ public class InOutGenerate extends SvrProcess
|
|||
MInOutLine line = new MInOutLine (m_shipment);
|
||||
line.setOrderLine(orderLine, 0, order.isSOTrx() ? toDeliver : Env.ZERO);
|
||||
line.setQty(toDeliver);
|
||||
if (orderLine.getQtyEntered().compareTo(orderLine.getQtyOrdered()) != 0)
|
||||
line.setQtyEntered(line.getMovementQty().multiply(orderLine.getQtyEntered())
|
||||
.divide(orderLine.getQtyOrdered(), 12, BigDecimal.ROUND_HALF_UP));
|
||||
line.setLine(m_line + orderLine.getLine());
|
||||
if (!line.save())
|
||||
throw new IllegalStateException("Could not create Shipment Line");
|
||||
|
||||
|
|
|
@ -16,11 +16,7 @@
|
|||
*****************************************************************************/
|
||||
package org.compiere.process;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
|
||||
import org.compiere.model.MInfoColumn;
|
||||
import org.compiere.model.MInfoWindow;
|
||||
import org.compiere.util.DB;
|
||||
|
||||
/**
|
||||
* Validate Info Window SQL
|
||||
|
@ -50,60 +46,10 @@ public class InfoWindowValidate extends SvrProcess
|
|||
throws Exception
|
||||
{
|
||||
MInfoWindow infoWindow = new MInfoWindow(getCtx(), p_AD_InfoWindow_ID, (String)null);
|
||||
infoWindow.setIsValid(false);
|
||||
infoWindow.validate();
|
||||
infoWindow.saveEx();
|
||||
|
||||
StringBuilder builder = new StringBuilder("SELECT ");
|
||||
if (infoWindow.isDistinct())
|
||||
builder.append("DISTINCT ");
|
||||
|
||||
MInfoColumn[] infoColumns = infoWindow.getInfoColumns();
|
||||
if (infoColumns.length == 0)
|
||||
throw new Exception("NoColumns");
|
||||
|
||||
for (int columnIndex = 0; columnIndex < infoColumns.length; columnIndex++) {
|
||||
if (columnIndex > 0)
|
||||
{
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(infoColumns[columnIndex].getSelectClause());
|
||||
}
|
||||
|
||||
builder.append( " FROM ").append(infoWindow.getFromClause());
|
||||
if (infoWindow.getWhereClause() != null && infoWindow.getWhereClause().trim().length() > 0) {
|
||||
builder.append(" WHERE ").append(infoWindow.getWhereClause());
|
||||
}
|
||||
|
||||
if (infoWindow.getOtherClause() != null && infoWindow.getOtherClause().trim().length() > 0) {
|
||||
builder.append(" ").append(infoWindow.getOtherClause());
|
||||
}
|
||||
|
||||
if (infoWindow.getOrderByClause() != null && infoWindow.getOrderByClause().trim().length() > 0) {
|
||||
builder.append(" ORDER BY ").append(infoWindow.getOrderByClause());
|
||||
}
|
||||
|
||||
while(builder.indexOf("@") >= 0) {
|
||||
int start = builder.indexOf("@");
|
||||
int end = builder.indexOf("@", start+1);
|
||||
if (start >=0 && end > start) {
|
||||
builder.replace(start, end+1, "0");
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PreparedStatement pstmt = null;
|
||||
try {
|
||||
pstmt = DB.prepareStatement(builder.toString(), get_TrxName());
|
||||
pstmt.executeQuery();
|
||||
} finally {
|
||||
DB.close(pstmt);
|
||||
}
|
||||
|
||||
infoWindow.setIsValid(true);
|
||||
infoWindow.saveEx();
|
||||
|
||||
return "Ok";
|
||||
|
||||
return infoWindow.isValid() ? "@OK@" : "@NotValid@";
|
||||
} // doIt
|
||||
|
||||
} // InfoWindowValidate
|
||||
|
|
|
@ -265,7 +265,13 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
if (record_id!=null)
|
||||
sValue = queryExecute(columnRef,tableRef,record_id);
|
||||
}else{
|
||||
sValue = address.get_Value(columnName);
|
||||
sValue = address.get_Value(columnName);
|
||||
if (DisplayType.YesNo == MColumn.get(Env.getCtx(), MLocation.Table_Name, columnName).getAD_Reference_ID()) {
|
||||
if (sValue != null && (Boolean) sValue)
|
||||
sValue = "Y";
|
||||
else if (sValue != null && ! (Boolean) sValue)
|
||||
sValue = "N";
|
||||
}
|
||||
}
|
||||
row.put(gridTab.getTableName()+">"+specialHeader,sValue);
|
||||
idxfld++;
|
||||
|
@ -384,7 +390,13 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
if(record_id!=null)
|
||||
sValue = queryExecute(columnRef,tableRef,record_id);
|
||||
}else{
|
||||
sValue = address.get_Value(columnName);
|
||||
sValue = address.get_Value(columnName);
|
||||
if (DisplayType.YesNo == MColumn.get(Env.getCtx(), MLocation.Table_Name, columnName).getAD_Reference_ID()) {
|
||||
if (sValue != null && (Boolean) sValue)
|
||||
sValue = "Y";
|
||||
else if (sValue != null && ! (Boolean) sValue)
|
||||
sValue = "N";
|
||||
}
|
||||
}
|
||||
row.put(childTab.getTableName()+">"+specialHeader,sValue);
|
||||
}
|
||||
|
|
|
@ -758,8 +758,8 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
if (field.isParentValue())
|
||||
continue;
|
||||
|
||||
if (field.isReadOnly() && !field.isParentValue())
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldIsReadOnly",new Object[] {header.get(i)}));
|
||||
// if (field.isReadOnly() && !field.isParentValue() && !field.isParentColumn())
|
||||
// return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldIsReadOnly",new Object[] {header.get(i)}));
|
||||
|
||||
if (!(field.isDisplayed() || field.isDisplayedGrid()))
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldNotDisplayed",new Object[] {header.get(i)}));
|
||||
|
@ -802,8 +802,8 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
if(field == null)
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), "NotAWindowField",new Object[] {sField}));
|
||||
|
||||
if(field.isReadOnly() && !field.isParentValue())
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldIsReadOnly",new Object[] {field.getColumnName()}));
|
||||
// if(field.isReadOnly() && !field.isParentValue())
|
||||
// return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldIsReadOnly",new Object[] {field.getColumnName()}));
|
||||
|
||||
if(!(field.isDisplayed() || field.isDisplayedGrid()))
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), "FieldNotDisplayed",new Object[] {field.getColumnName()}));
|
||||
|
@ -960,10 +960,10 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
if(!field.isDisplayed(true))
|
||||
continue;
|
||||
|
||||
if(!isInsertMode() && !field.isEditable(true) && value!=null){
|
||||
logMsg = Msg.getMsg(Env.getCtx(), "FieldNotEditable", new Object[] {header.get(i)}) + "{" + value + "}";
|
||||
break;
|
||||
}
|
||||
// if(!isInsertMode() && !field.isEditable(true) && value!=null){
|
||||
// logMsg = Msg.getMsg(Env.getCtx(), "FieldNotEditable", new Object[] {header.get(i)}) + "{" + value + "}";
|
||||
// break;
|
||||
// }
|
||||
if("(null)".equals(value.toString().trim())){
|
||||
logMsg = gridTab.setValue(field,null);
|
||||
if(logMsg.equals(""))
|
||||
|
@ -1035,9 +1035,18 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
isThereRow =true;
|
||||
}
|
||||
}
|
||||
|
||||
if(setValue != null)
|
||||
logMsg = gridTab.setValue(field,setValue);
|
||||
|
||||
if(setValue != null) {
|
||||
Object oldValue = gridTab.getValue(field);
|
||||
if (isValueChanged(oldValue, setValue)) {
|
||||
if (!field.isEditable(true)) {
|
||||
return Msg.getMsg(Env.getCtx(), "FieldIsReadOnly",new Object[] {header.get(i)});
|
||||
}
|
||||
logMsg = gridTab.setValue(field,setValue);
|
||||
} else {
|
||||
logMsg = "";
|
||||
}
|
||||
}
|
||||
|
||||
if(logMsg!=null && logMsg.equals(""))
|
||||
logMsg= null;
|
||||
|
@ -1286,6 +1295,55 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
return id;
|
||||
}
|
||||
|
||||
//Copy from GridTable
|
||||
private boolean isValueChanged(Object oldValue, Object value)
|
||||
{
|
||||
if ( isNotNullAndIsEmpty(oldValue) ) {
|
||||
oldValue = null;
|
||||
}
|
||||
|
||||
if ( isNotNullAndIsEmpty(value) ) {
|
||||
value = null;
|
||||
}
|
||||
|
||||
boolean bChanged = (oldValue == null && value != null)
|
||||
|| (oldValue != null && value == null);
|
||||
|
||||
if (!bChanged && oldValue != null)
|
||||
{
|
||||
if (oldValue.getClass().equals(value.getClass()))
|
||||
{
|
||||
if (oldValue instanceof Comparable<?>)
|
||||
{
|
||||
bChanged = (((Comparable<Object>)oldValue).compareTo(value) != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
bChanged = !oldValue.equals(value);
|
||||
}
|
||||
}
|
||||
else if(value != null)
|
||||
{
|
||||
bChanged = !(oldValue.toString().equals(value.toString()));
|
||||
}
|
||||
}
|
||||
return bChanged;
|
||||
}
|
||||
|
||||
//Copy from GridTable
|
||||
private boolean isNotNullAndIsEmpty (Object value) {
|
||||
if (value != null
|
||||
&& (value instanceof String)
|
||||
&& value.toString().equals("")
|
||||
)
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileExtension() {
|
||||
return "csv";
|
||||
|
|
|
@ -269,7 +269,7 @@ public final class ProcessUtil {
|
|||
|
||||
msg = engine.eval(rule.getScript()).toString();
|
||||
//transaction should rollback if there are error in process
|
||||
if ("@Error@".equals(msg))
|
||||
if (msg.startsWith("@Error@"))
|
||||
success = false;
|
||||
|
||||
// Parse Variables
|
||||
|
|
|
@ -28,6 +28,13 @@ import java.util.Iterator;
|
|||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.model.I_C_AllocationHdr;
|
||||
import org.compiere.model.I_C_BankStatement;
|
||||
import org.compiere.model.I_C_Cash;
|
||||
import org.compiere.model.I_C_ProjectIssue;
|
||||
import org.compiere.model.I_M_MatchInv;
|
||||
import org.compiere.model.I_M_MatchPO;
|
||||
import org.compiere.model.I_M_Production;
|
||||
import org.compiere.model.MAccount;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MConversionRate;
|
||||
|
@ -122,6 +129,8 @@ public abstract class Doc
|
|||
* M_Requisition POR
|
||||
**************************************************************************/
|
||||
|
||||
private static final String DOC_TYPE_BY_DOC_BASE_TYPE_SQL = "SELECT C_DocType_ID FROM C_DocType WHERE AD_Client_ID=? AND DocBaseType=? AND IsActive='Y'";
|
||||
|
||||
/** AR Invoices - ARI */
|
||||
public static final String DOCTYPE_ARInvoice = MDocType.DOCBASETYPE_ARInvoice;
|
||||
/** AR Credit Memo */
|
||||
|
@ -1729,6 +1738,58 @@ public abstract class Doc
|
|||
if (ii != null)
|
||||
return ii.intValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (p_po.get_TableName().equals(I_M_MatchPO.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_MatMatchPO);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_M_MatchInv.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_MatMatchInv);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_C_AllocationHdr.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_Allocation);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_C_BankStatement.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_BankStatement);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_C_Cash.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_CashJournal);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_C_ProjectIssue.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_ProjectIssue);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
else if (p_po.get_TableName().equals(I_M_Production.Table_Name))
|
||||
{
|
||||
int docTypeId = DB.getSQLValue((String)null, DOC_TYPE_BY_DOC_BASE_TYPE_SQL,
|
||||
p_po.getAD_Client_ID(), Doc.DOCTYPE_MatProduction);
|
||||
if (docTypeId > 0)
|
||||
return docTypeId;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} // getC_DocType_ID
|
||||
|
||||
|
|
|
@ -929,13 +929,13 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
|
|||
if (keyNo != -1 || uuid != null)
|
||||
{
|
||||
if ( ( keyNo != -1 && keyNo != m_mTable.getKeyID(m_currentRow) )
|
||||
|| ( uuid != null && uuid.compareTo(m_mTable.getUUID(m_currentRow)) != 0) ) // something changed
|
||||
|| (uuid != null && m_mTable.getUUID(m_currentRow) == null) || ( uuid != null && uuid.compareTo(m_mTable.getUUID(m_currentRow)) != 0) ) // something changed
|
||||
{
|
||||
int size = getRowCount();
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
if ( ( keyNo != -1 && keyNo == m_mTable.getKeyID(i) )
|
||||
|| ( uuid != null && uuid.compareTo(m_mTable.getUUID(i)) == 0) )
|
||||
|| ( uuid != null && m_mTable.getUUID(i) != null && uuid.compareTo(m_mTable.getUUID(i)) == 0) )
|
||||
{
|
||||
m_currentRow = i;
|
||||
break;
|
||||
|
|
|
@ -247,6 +247,21 @@ public interface I_I_Inventory
|
|||
*/
|
||||
public String getLot();
|
||||
|
||||
/** Column name M_CostingLine_ID */
|
||||
public static final String COLUMNNAME_M_CostingLine_ID = "M_CostingLine_ID";
|
||||
|
||||
/** Set Cost Adjustment Line.
|
||||
* Unique line in an Inventory cost adjustment document
|
||||
*/
|
||||
public void setM_CostingLine_ID (int M_CostingLine_ID);
|
||||
|
||||
/** Get Cost Adjustment Line.
|
||||
* Unique line in an Inventory cost adjustment document
|
||||
*/
|
||||
public int getM_CostingLine_ID();
|
||||
|
||||
public org.compiere.model.I_M_InventoryLine getM_CostingLine() throws RuntimeException;
|
||||
|
||||
/** Column name M_Inventory_ID */
|
||||
public static final String COLUMNNAME_M_Inventory_ID = "M_Inventory_ID";
|
||||
|
||||
|
|
|
@ -1395,7 +1395,7 @@ public class MInOut extends X_M_InOut implements DocAction
|
|||
}
|
||||
}
|
||||
|
||||
if (oLine!=null && mtrx!=null)
|
||||
if (oLine!=null && mtrx!=null && oLine.getQtyOrdered().signum() > 0)
|
||||
{
|
||||
if (sLine.getC_OrderLine_ID() != 0)
|
||||
{
|
||||
|
@ -1434,7 +1434,7 @@ public class MInOut extends X_M_InOut implements DocAction
|
|||
m_processMsg = "Cannot correct Inventory OnHand [" + product.getValue() + "] - " + lastError;
|
||||
return DocAction.STATUS_Invalid;
|
||||
}
|
||||
if (oLine!=null)
|
||||
if (oLine!=null && oLine.getQtyOrdered().signum() > 0)
|
||||
{
|
||||
if (!MStorageReservation.add(getCtx(), oLine.getM_Warehouse_ID(),
|
||||
sLine.getM_Product_ID(),
|
||||
|
|
|
@ -36,7 +36,7 @@ public class MInfoColumn extends X_AD_InfoColumn
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 4317064257861102601L;
|
||||
private static final long serialVersionUID = 9198213211937136870L;
|
||||
|
||||
/**
|
||||
* Stanfard Constructor
|
||||
|
@ -60,6 +60,20 @@ public class MInfoColumn extends X_AD_InfoColumn
|
|||
super (ctx, rs, trxName);
|
||||
} // MInfoColumn
|
||||
|
||||
/** Parent */
|
||||
private MInfoWindow m_parent = null;
|
||||
|
||||
/**
|
||||
* Get Parent
|
||||
* @return parent
|
||||
*/
|
||||
public MInfoWindow getParent()
|
||||
{
|
||||
if (m_parent == null)
|
||||
m_parent = new MInfoWindow(getCtx(), getAD_InfoWindow_ID(), get_TrxName());
|
||||
return m_parent;
|
||||
} // getParent
|
||||
|
||||
/**
|
||||
* check column read access
|
||||
* @param tableInfos
|
||||
|
@ -131,5 +145,35 @@ public class MInfoColumn extends X_AD_InfoColumn
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* when change field relate to sql, call valid from infoWindow
|
||||
*/
|
||||
@Override
|
||||
protected boolean afterSave(boolean newRecord, boolean success) {
|
||||
if (!success)
|
||||
return success;
|
||||
|
||||
// evaluate need valid
|
||||
boolean isNeedValid = newRecord || is_ValueChanged (MInfoColumn.COLUMNNAME_SelectClause);
|
||||
|
||||
// call valid of parrent
|
||||
if (isNeedValid){
|
||||
getParent().validate();
|
||||
getParent().saveEx(get_TrxName());
|
||||
}
|
||||
|
||||
return super.afterSave(newRecord, success);
|
||||
}
|
||||
|
||||
/**
|
||||
* when delete record, call valid from parent to set state
|
||||
* when delete all, valid state is false
|
||||
* when delete a wrong column can make valid state to true
|
||||
*/
|
||||
@Override
|
||||
protected boolean afterDelete(boolean success) {
|
||||
getParent().validate();
|
||||
getParent().saveEx(get_TrxName());
|
||||
return super.afterDelete(success);
|
||||
}
|
||||
} // MInfoColumn
|
||||
|
|
|
@ -329,6 +329,17 @@ public class MInfoWindow extends X_AD_InfoWindow
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// evaluate need valid
|
||||
boolean isNeedValid = is_new() || is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_AD_Table_ID) || is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_WhereClause) ||
|
||||
is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_FromClause) || is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_OrderByClause) ||
|
||||
is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_OtherClause) || is_ValueChanged (I_AD_InfoWindow.COLUMNNAME_IsDistinct);
|
||||
|
||||
// valid config
|
||||
if (isNeedValid){
|
||||
validate();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -363,4 +374,76 @@ public class MInfoWindow extends X_AD_InfoWindow
|
|||
}
|
||||
|
||||
|
||||
public void validate ()
|
||||
{
|
||||
// default, before complete check is invalid
|
||||
this.setIsValid(false);
|
||||
|
||||
// add DISTINCT clause
|
||||
StringBuilder builder = new StringBuilder("SELECT ");
|
||||
if (this.isDistinct())
|
||||
builder.append("DISTINCT ");
|
||||
|
||||
MInfoColumn[] infoColumns = this.getInfoColumns();
|
||||
// none column make this invalid
|
||||
if (infoColumns.length == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
// build select clause
|
||||
for (int columnIndex = 0; columnIndex < infoColumns.length; columnIndex++) {
|
||||
if (columnIndex > 0)
|
||||
{
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(infoColumns[columnIndex].getSelectClause());
|
||||
}
|
||||
|
||||
// build from clause
|
||||
builder.append( " FROM ").append(this.getFromClause());
|
||||
|
||||
// build where clause add (1=2) because not need get result, decrease load
|
||||
if (this.getWhereClause() != null && this.getWhereClause().trim().length() > 0) {
|
||||
builder.append(" WHERE (1=2) AND (").append(this.getWhereClause()).append(")");
|
||||
} else {
|
||||
builder.append(" WHERE 1=2");
|
||||
}
|
||||
|
||||
// build other (having) clause
|
||||
if (this.getOtherClause() != null && this.getOtherClause().trim().length() > 0) {
|
||||
builder.append(" ").append(this.getOtherClause());
|
||||
}
|
||||
|
||||
// build order (having) clause
|
||||
if (this.getOrderByClause() != null && this.getOrderByClause().trim().length() > 0) {
|
||||
builder.append(" ORDER BY ").append(this.getOrderByClause());
|
||||
}
|
||||
|
||||
// replace env value by dummy value
|
||||
while(builder.indexOf("@") >= 0) {
|
||||
int start = builder.indexOf("@");
|
||||
int end = builder.indexOf("@", start+1);
|
||||
if (start >=0 && end > start) {
|
||||
builder.replace(start, end+1, "0");
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// try run sql
|
||||
PreparedStatement pstmt = null;
|
||||
try {
|
||||
pstmt = DB.prepareStatement(builder.toString(), null);
|
||||
pstmt.executeQuery();
|
||||
}catch (Exception ex){
|
||||
log.log(Level.WARNING, ex.getMessage());
|
||||
return;
|
||||
} finally {
|
||||
DB.close(pstmt);
|
||||
}
|
||||
|
||||
// valid state
|
||||
this.setIsValid(true);
|
||||
}
|
||||
|
||||
} // MInfoWindow
|
||||
|
|
|
@ -1722,7 +1722,7 @@ public class MOrder extends X_C_Order implements DocAction
|
|||
BigDecimal difference = target
|
||||
.subtract(line.getQtyReserved())
|
||||
.subtract(line.getQtyDelivered());
|
||||
if (difference.signum() == 0)
|
||||
if (difference.signum() <= 0)
|
||||
{
|
||||
MProduct product = line.getProduct();
|
||||
if (product != null)
|
||||
|
|
|
@ -221,11 +221,6 @@ public class MScheduler extends X_AD_Scheduler
|
|||
}
|
||||
}
|
||||
}
|
||||
// Add Updater
|
||||
if (list.size() == 0)
|
||||
{
|
||||
list.add(getCreatedBy());
|
||||
}
|
||||
//
|
||||
return list.toArray(new Integer[list.size()]);
|
||||
} // getRecipientAD_User_IDs
|
||||
|
|
|
@ -42,7 +42,7 @@ public class MSysConfig extends X_AD_SysConfig
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 7850399904723862767L;
|
||||
private static final long serialVersionUID = -4635791167798916808L;
|
||||
|
||||
public static final String ADDRESS_SAVE_REQUEST_RESPONSE_LOG = "ADDRESS_SAVE_REQUEST_RESPONSE_LOG";
|
||||
public static final String ADDRESS_VALIDATION = "ADDRESS_VALIDATION";
|
||||
|
@ -125,7 +125,9 @@ public class MSysConfig extends X_AD_SysConfig
|
|||
public static final String ZK_BROWSER_ICON = "ZK_BROWSER_ICON";
|
||||
public static final String ZK_BROWSER_TITLE = "ZK_BROWSER_TITLE";
|
||||
public static final String ZK_BUTTON_STYLE = "ZK_BUTTON_STYLE";
|
||||
public static final String ZK_DASHBOARD_PERFORMANCE_TIMEOUT = "ZK_DASHBOARD_PERFORMANCE_TIMEOUT";
|
||||
public static final String ZK_DASHBOARD_REFRESH_INTERVAL = "ZK_DASHBOARD_REFRESH_INTERVAL";
|
||||
public static final String ZK_DECIMALBOX_PROCESS_DOTKEYPAD = "ZK_DECIMALBOX_PROCESS_DOTKEYPAD";
|
||||
public static final String ZK_DESKTOP_CLASS = "ZK_DESKTOP_CLASS";
|
||||
public static final String ZK_GRID_EDIT_MODELESS = "ZK_GRID_EDIT_MODELESS";
|
||||
public static final String ZK_LOGIN_ALLOW_REMEMBER_ME = "ZK_LOGIN_ALLOW_REMEMBER_ME";
|
||||
|
@ -681,4 +683,4 @@ public class MSysConfig extends X_AD_SysConfig
|
|||
+"]";
|
||||
}
|
||||
|
||||
} // MSysConfig;
|
||||
} // MSysConfig;
|
||||
|
|
|
@ -55,7 +55,7 @@ public class MTable extends X_AD_Table
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 3743087295968040894L;
|
||||
private static final long serialVersionUID = -1776819186412187384L;
|
||||
|
||||
public final static int MAX_OFFICIAL_ID = 999999;
|
||||
|
||||
|
@ -536,8 +536,8 @@ public class MTable extends X_AD_Table
|
|||
StringBuffer sb = new StringBuffer("CREATE TABLE ")
|
||||
.append(getTableName()).append(" (");
|
||||
//
|
||||
boolean hasPK = false;
|
||||
boolean hasParents = false;
|
||||
// boolean hasPK = false;
|
||||
// boolean hasParents = false;
|
||||
StringBuffer constraints = new StringBuffer();
|
||||
getColumns(true);
|
||||
for (int i = 0; i < m_columns.length; i++)
|
||||
|
@ -553,14 +553,15 @@ public class MTable extends X_AD_Table
|
|||
else // virtual column
|
||||
continue;
|
||||
//
|
||||
if (column.isKey())
|
||||
hasPK = true;
|
||||
if (column.isParent())
|
||||
hasParents = true;
|
||||
// if (column.isKey())
|
||||
// hasPK = true;
|
||||
// if (column.isParent())
|
||||
// hasParents = true;
|
||||
String constraint = column.getConstraint(getTableName());
|
||||
if (constraint != null && constraint.length() > 0)
|
||||
constraints.append(", ").append(constraint);
|
||||
}
|
||||
/* IDEMPIERE-1901 - deprecate code that create composite primary key
|
||||
// Multi Column PK
|
||||
if (!hasPK && hasParents)
|
||||
{
|
||||
|
@ -578,6 +579,7 @@ public class MTable extends X_AD_Table
|
|||
.append(getTableName()).append("_Key PRIMARY KEY (")
|
||||
.append(cols).append(")");
|
||||
}
|
||||
*/
|
||||
|
||||
sb.append(constraints)
|
||||
.append(")");
|
||||
|
|
|
@ -38,7 +38,7 @@ public class MTreeNode extends DefaultMutableTreeNode
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 4663753548813509716L;
|
||||
private static final long serialVersionUID = -6871590404494812487L;
|
||||
|
||||
/**
|
||||
* Construct Model TreeNode
|
||||
|
@ -215,7 +215,18 @@ public class MTreeNode extends DefaultMutableTreeNode
|
|||
return m_description;
|
||||
} // getDescription
|
||||
|
||||
|
||||
/**
|
||||
* Set Description
|
||||
* @param name name
|
||||
*/
|
||||
public void setDescription (String description)
|
||||
{
|
||||
if (description == null)
|
||||
m_description = "";
|
||||
else
|
||||
m_description = description;
|
||||
} // setDescription
|
||||
|
||||
/**************************************************************************
|
||||
* Set Summary (allow children)
|
||||
* @param isSummary summary node
|
||||
|
|
|
@ -33,7 +33,7 @@ public class X_I_Inventory extends PO implements I_I_Inventory, I_Persistent
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 20131031L;
|
||||
private static final long serialVersionUID = 20140701L;
|
||||
|
||||
/** Standard Constructor */
|
||||
public X_I_Inventory (Properties ctx, int I_Inventory_ID, String trxName)
|
||||
|
@ -321,6 +321,34 @@ public class X_I_Inventory extends PO implements I_I_Inventory, I_Persistent
|
|||
return (String)get_Value(COLUMNNAME_Lot);
|
||||
}
|
||||
|
||||
public org.compiere.model.I_M_InventoryLine getM_CostingLine() throws RuntimeException
|
||||
{
|
||||
return (org.compiere.model.I_M_InventoryLine)MTable.get(getCtx(), org.compiere.model.I_M_InventoryLine.Table_Name)
|
||||
.getPO(getM_CostingLine_ID(), get_TrxName()); }
|
||||
|
||||
/** Set Cost Adjustment Line.
|
||||
@param M_CostingLine_ID
|
||||
Unique line in an Inventory cost adjustment document
|
||||
*/
|
||||
public void setM_CostingLine_ID (int M_CostingLine_ID)
|
||||
{
|
||||
if (M_CostingLine_ID < 1)
|
||||
set_Value (COLUMNNAME_M_CostingLine_ID, null);
|
||||
else
|
||||
set_Value (COLUMNNAME_M_CostingLine_ID, Integer.valueOf(M_CostingLine_ID));
|
||||
}
|
||||
|
||||
/** Get Cost Adjustment Line.
|
||||
@return Unique line in an Inventory cost adjustment document
|
||||
*/
|
||||
public int getM_CostingLine_ID ()
|
||||
{
|
||||
Integer ii = (Integer)get_Value(COLUMNNAME_M_CostingLine_ID);
|
||||
if (ii == null)
|
||||
return 0;
|
||||
return ii.intValue();
|
||||
}
|
||||
|
||||
public org.compiere.model.I_M_Inventory getM_Inventory() throws RuntimeException
|
||||
{
|
||||
return (org.compiere.model.I_M_Inventory)MTable.get(getCtx(), org.compiere.model.I_M_Inventory.Table_Name)
|
||||
|
|
|
@ -211,7 +211,7 @@ public abstract class SvrProcess implements ProcessCall
|
|||
}
|
||||
|
||||
//transaction should rollback if there are error in process
|
||||
if ("@Error@".equals(msg))
|
||||
if(msg.startsWith("@Error@"))
|
||||
success = false;
|
||||
|
||||
if (success)
|
||||
|
|
|
@ -815,4 +815,18 @@ public class TimeUtil
|
|||
return endCal.get(Calendar.YEAR) * 12 + endCal.get(Calendar.MONTH)
|
||||
- (startCal.get(Calendar.YEAR) * 12 + startCal.get(Calendar.MONTH));
|
||||
}
|
||||
|
||||
/** Returns start date + nbDays which cannot be saturday or sunday or non business days */
|
||||
public static Timestamp addOnlyBusinessDays(Timestamp startDate, int nbDays, int clientID, String trxName)
|
||||
{
|
||||
Timestamp retValue = startDate;
|
||||
while (nbDays > 0) {
|
||||
retValue = TimeUtil.addDays(retValue, 1);
|
||||
StringBuilder sql = new StringBuilder("SELECT nextBusinessDay(?,?) FROM DUAL");
|
||||
retValue = DB.getSQLValueTSEx(trxName, sql.toString(), retValue, clientID);
|
||||
nbDays--;
|
||||
}
|
||||
return retValue;
|
||||
}
|
||||
|
||||
} // TimeUtil
|
||||
|
|
|
@ -58,6 +58,7 @@ Export-Package: com.jgoodies.looks,
|
|||
org.jdesktop.swingx.multisplitpane,
|
||||
org.jdesktop.swingx.painter,
|
||||
org.jdesktop.swingx.painter.effects,
|
||||
org.jdesktop.swingx.plaf,
|
||||
org.jdesktop.swingx.renderer,
|
||||
org.jdesktop.swingx.rollover,
|
||||
org.jdesktop.swingx.search,
|
||||
|
|
|
@ -142,7 +142,6 @@ public class ADWindowContent extends AbstractADWindowContent
|
|||
LayoutUtils.addSclass("adwindow-status", statusBar);
|
||||
|
||||
contentArea = new Div();
|
||||
contentArea.setRenderdefer(50);
|
||||
contentArea.setParent(layout);
|
||||
contentArea.setVflex("1");
|
||||
contentArea.setHflex("1");
|
||||
|
|
|
@ -523,6 +523,26 @@ public class ADWindowToolbar extends FToolbar implements EventListener<Event>
|
|||
{
|
||||
btnCustomize.setDisabled(!enabled);
|
||||
}
|
||||
|
||||
public void enableArchive(boolean enabled)
|
||||
{
|
||||
btnArchive.setDisabled(!enabled);
|
||||
}
|
||||
|
||||
public void enableZoomAcross(boolean enabled)
|
||||
{
|
||||
btnZoomAcross.setDisabled(!enabled);
|
||||
}
|
||||
|
||||
public void enableActiveWorkflows(boolean enabled)
|
||||
{
|
||||
btnActiveWorkflows.setDisabled(!enabled);
|
||||
}
|
||||
|
||||
public void enableRequests(boolean enabled)
|
||||
{
|
||||
btnRequests.setDisabled(!enabled);
|
||||
}
|
||||
|
||||
public void lock(boolean locked)
|
||||
{
|
||||
|
|
|
@ -1087,7 +1087,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
|||
{
|
||||
ADTabpanel adtab = (ADTabpanel) event.getTarget();
|
||||
if (adtab == adTabbox.getSelectedTabpanel()) {
|
||||
toolbar.enableProcessButton(adtab.getToolbarButtons().size() > 0);
|
||||
toolbar.enableProcessButton(adtab.getToolbarButtons().size() > 0 && !adTabbox.getSelectedGridTab().isNew());
|
||||
toolbar.dynamicDisplay();
|
||||
}
|
||||
}
|
||||
|
@ -1277,7 +1277,7 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
|||
toolbar.lock(adTabbox.getSelectedGridTab().isLocked());
|
||||
}
|
||||
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted());
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted() && !adTabbox.getSelectedGridTab().isNew());
|
||||
|
||||
//Deepak-Enabling customize button IDEMPIERE-364
|
||||
if(!(adTabbox.getSelectedTabpanel() instanceof ADSortTab))
|
||||
|
@ -1612,8 +1612,15 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
|||
adTabbox.evaluate(e);
|
||||
}
|
||||
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted() && !adTabbox.getSelectedGridTab().isNew());
|
||||
toolbar.enableReport(true);
|
||||
boolean isNewRow = adTabbox.getSelectedGridTab().getRowCount() == 0 || adTabbox.getSelectedGridTab().isNew();
|
||||
toolbar.enableProcessButton(!isNewRow);
|
||||
toolbar.enableArchive(!isNewRow);
|
||||
toolbar.enableZoomAcross(!isNewRow);
|
||||
toolbar.enableActiveWorkflows(!isNewRow);
|
||||
toolbar.enableRequests(!isNewRow);
|
||||
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted() && !isNewRow);
|
||||
toolbar.enableReport(!isNewRow);
|
||||
toolbar.enableExport(!adTabbox.getSelectedGridTab().isSortTab());
|
||||
toolbar.enableFileImport(!changed && !adTabbox.getSelectedGridTab().isSortTab() && adTabbox.getSelectedGridTab().isInsertRecord());
|
||||
|
||||
|
@ -1781,8 +1788,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
|||
breadCrumb.enableLastNavigation(adTabbox.getSelectedGridTab().getCurrentRow() + 1 < adTabbox.getSelectedGridTab().getRowCount());
|
||||
toolbar.enableTabNavigation(breadCrumb.hasParentLink(), adTabbox.getSelectedDetailADTabpanel() != null);
|
||||
toolbar.enableIgnore(true);
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted());
|
||||
toolbar.enableReport(true);
|
||||
if (adTabbox.getSelectedGridTab().isSingleRow())
|
||||
{
|
||||
if (adTabbox.getSelectedTabpanel().isGridView())
|
||||
|
@ -1862,8 +1867,6 @@ public abstract class AbstractADWindowContent extends AbstractUIPart implements
|
|||
breadCrumb.enableLastNavigation(adTabbox.getSelectedGridTab().getCurrentRow() + 1 < adTabbox.getSelectedGridTab().getRowCount());
|
||||
toolbar.enableTabNavigation(false);
|
||||
toolbar.enableIgnore(true);
|
||||
toolbar.enablePrint(adTabbox.getSelectedGridTab().isPrinted());
|
||||
toolbar.enableReport(true);
|
||||
if (postCallback != null)
|
||||
postCallback.onCallback(true);
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.adempiere.webui.component.Columns;
|
|||
import org.adempiere.webui.component.EditorBox;
|
||||
import org.adempiere.webui.component.Grid;
|
||||
import org.adempiere.webui.component.NumberBox;
|
||||
import org.adempiere.webui.component.Rows;
|
||||
import org.adempiere.webui.editor.WEditor;
|
||||
import org.adempiere.webui.util.SortComparator;
|
||||
import org.compiere.model.GridField;
|
||||
|
@ -615,8 +616,10 @@ public class GridView extends Vbox implements EventListener<Event>, IdSpace, IFi
|
|||
if (pageSize > 0 && paging != null)
|
||||
renderer.setPaging(paging);
|
||||
|
||||
listbox.setRowRenderer(renderer);
|
||||
listbox.setModel(listModel);
|
||||
if (listbox.getRows() == null)
|
||||
listbox.appendChild(new Rows());
|
||||
listbox.setRowRenderer(renderer);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,365 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2014 Low Heng Sin *
|
||||
* Copyright (C) 2014 Trek Global *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.webui.apps;
|
||||
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import org.adempiere.webui.component.Label;
|
||||
import org.compiere.model.I_AD_SearchDefinition;
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MLookup;
|
||||
import org.compiere.model.MLookupFactory;
|
||||
import org.compiere.model.MLookupInfo;
|
||||
import org.compiere.model.MQuery;
|
||||
import org.compiere.model.MRole;
|
||||
import org.compiere.model.MSearchDefinition;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.MWindow;
|
||||
import org.compiere.model.Query;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Util;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.event.Events;
|
||||
import org.zkoss.zul.A;
|
||||
import org.zkoss.zul.Textbox;
|
||||
import org.zkoss.zul.Vlayout;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class DocumentSearchController implements EventListener<Event>{
|
||||
|
||||
private static final String SEARCH_RESULT = "search.result";
|
||||
private static final String ON_SEARCH_DOCUMENTS = "onSearchDocuments";
|
||||
private Vlayout layout;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public DocumentSearchController() {
|
||||
}
|
||||
|
||||
public void create(Component parent) {
|
||||
layout = new Vlayout();
|
||||
layout.setStyle("padding: 3px;");
|
||||
layout.setWidth("200px");
|
||||
|
||||
parent.appendChild(layout);
|
||||
|
||||
layout.addEventListener(ON_SEARCH_DOCUMENTS, this);
|
||||
}
|
||||
|
||||
public void search(String value) {
|
||||
layout.getChildren().clear();
|
||||
Events.echoEvent(ON_SEARCH_DOCUMENTS, layout, value);
|
||||
}
|
||||
|
||||
private void onSearchDocuments(String searchString) {
|
||||
if (Util.isEmpty(searchString)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SearchResult> list = doSearch(searchString);
|
||||
if (list.size() > 0) {
|
||||
Collections.sort(list, new Comparator<SearchResult>() {
|
||||
@Override
|
||||
public int compare(SearchResult o1, SearchResult o2) {
|
||||
int r = o1.getWindowName().compareTo(o2.getWindowName());
|
||||
if (r == 0)
|
||||
r = o1.getLabel().compareTo(o2.getLabel());
|
||||
return r;
|
||||
}
|
||||
});
|
||||
String windowName = null;
|
||||
for(SearchResult result : list) {
|
||||
if (windowName == null || !windowName.equals(result.getWindowName())) {
|
||||
windowName = result.getWindowName();
|
||||
Label label = new Label(windowName);
|
||||
label.setStyle("padding: 3px; font-weight: bold; display: inline-block;");
|
||||
layout.appendChild(label);
|
||||
}
|
||||
A a = new A();
|
||||
a.setAttribute(SEARCH_RESULT, result);
|
||||
a.setLabel(result.getLabel());
|
||||
layout.appendChild(a);
|
||||
a.setStyle("padding-left: 3px; display: inline-block;");
|
||||
a.addEventListener(Events.ON_CLICK, this);
|
||||
}
|
||||
layout.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private List<SearchResult> doSearch(String searchString) {
|
||||
final MRole role = MRole.get(Env.getCtx(), Env.getAD_Role_ID(Env.getCtx()), Env.getAD_User_ID(Env.getCtx()), true);
|
||||
|
||||
List<SearchResult> list = new ArrayList<SearchResult>();
|
||||
Query query = new Query(Env.getCtx(), I_AD_SearchDefinition.Table_Name, "", null);
|
||||
List<MSearchDefinition> definitions = query.setOnlyActiveRecords(true).list();
|
||||
for(MSearchDefinition msd : definitions) {
|
||||
MTable table = new MTable(Env.getCtx(), msd.getAD_Table_ID(), null);
|
||||
StringBuilder sql = null;
|
||||
MWindow window = msd.getAD_Window_ID() > 0 && role.getWindowAccess(msd.getAD_Window_ID()) != null ? MWindow.get(Env.getCtx(), msd.getAD_Window_ID()) : null;
|
||||
MWindow powindow = msd.getPO_Window_ID() > 0 && role.getWindowAccess(msd.getPO_Window_ID()) != null ? MWindow.get(Env.getCtx(), msd.getPO_Window_ID()) : null;
|
||||
if (window == null && powindow == null)
|
||||
continue;
|
||||
List<Object> params = new ArrayList<Object>();
|
||||
// SearchDefinition with a given table and column
|
||||
if (msd.getSearchType().equals(MSearchDefinition.SEARCHTYPE_TABLE)) {
|
||||
MColumn column = new MColumn(Env.getCtx(), msd.getAD_Column_ID(), null);
|
||||
sql = new StringBuilder("SELECT ").append(table.getTableName()).append("_ID, ")
|
||||
.append(column.getColumnName());
|
||||
sql.append(" FROM ")
|
||||
.append(table.getTableName())
|
||||
.append(" ");
|
||||
// search for an Integer
|
||||
if (msd.getDataType().equals(MSearchDefinition.DATATYPE_INTEGER)) {
|
||||
sql.append("WHERE ").append(column.getColumnName()).append("=?");
|
||||
// search for a String
|
||||
} else {
|
||||
sql.append("WHERE UPPER(").append(column.getColumnName()).append(") LIKE UPPER(?)");
|
||||
}
|
||||
|
||||
// search for a Integer
|
||||
if (msd.getDataType().equals(MSearchDefinition.DATATYPE_INTEGER)) {
|
||||
params.add(Integer.valueOf(searchString.replaceAll("\\D", "")));
|
||||
// search for a String
|
||||
} else if (msd.getDataType().equals(MSearchDefinition.DATATYPE_STRING)) {
|
||||
if (searchString.endsWith("%"))
|
||||
params.add(searchString);
|
||||
else
|
||||
params.add(searchString+"%");
|
||||
}
|
||||
// SearchDefinition with a special query
|
||||
} else if (msd.getSearchType().equals(MSearchDefinition.SEARCHTYPE_QUERY)) {
|
||||
sql = new StringBuilder().append(msd.getQuery());
|
||||
// count '?' in statement
|
||||
int count = 1;
|
||||
for (char c : sql.toString().toCharArray()) {
|
||||
if (c == '?') {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
for (int i = 1; i < count; i++) {
|
||||
if (msd.getDataType().equals(MSearchDefinition.DATATYPE_INTEGER)) {
|
||||
params.add(Integer.valueOf(searchString.replaceAll("\\D", "")));
|
||||
} else if (msd.getDataType().equals(MSearchDefinition.DATATYPE_STRING)) {
|
||||
if (searchString.endsWith("%"))
|
||||
params.add(searchString);
|
||||
else
|
||||
params.add(searchString+"%");
|
||||
}
|
||||
}
|
||||
}
|
||||
MLookupInfo lookupInfo = MLookupFactory.getLookupInfo(Env.getCtx(), -1, -1, DisplayType.Search, Env.getLanguage(Env.getCtx()), table.getTableName() + "_ID", 0, false, null);
|
||||
MLookup lookup = new MLookup(lookupInfo, -1);
|
||||
|
||||
if (sql != null) {
|
||||
if (powindow != null) {
|
||||
if (window != null) {
|
||||
doRetrieval(msd, sql, params, lookup, window, table.getTableName(), " AND IsSOTrx='Y' ", list);
|
||||
}
|
||||
doRetrieval(msd, sql, params, lookup, powindow, table.getTableName(), " AND IsSOTrx='N' ", list);
|
||||
} else if (window != null) {
|
||||
doRetrieval(msd, sql, params, lookup, window, table.getTableName(), null, list);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private void doRetrieval(MSearchDefinition msd, StringBuilder builder, List<Object> params, MLookup lookup, MWindow window, String tableName,
|
||||
String extraWhereClase, List<SearchResult> list) {
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
try {
|
||||
String sql = builder.toString();
|
||||
if (!Util.isEmpty(extraWhereClase))
|
||||
sql = sql + extraWhereClase;
|
||||
pstmt = DB.prepareStatement(sql, (String)null);
|
||||
if (params.size() > 0)
|
||||
DB.setParameters(pstmt, params);
|
||||
pstmt.setQueryTimeout(1);
|
||||
rs = pstmt.executeQuery();
|
||||
int count = 0;
|
||||
while (rs.next() && count < 3) {
|
||||
count++;
|
||||
int id = rs.getInt(1);
|
||||
SearchResult result = new SearchResult();
|
||||
result.setLabel(lookup.getDisplay(id));
|
||||
result.setRecordId(id);
|
||||
result.setWindowName(window.get_Translation("Name"));
|
||||
result.setWindowId(window.getAD_Window_ID());
|
||||
|
||||
result.setTableName(tableName);
|
||||
if (rs.getMetaData().getColumnCount() > 1) {
|
||||
result.setName(rs.getString(2));
|
||||
}
|
||||
list.add(result);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
DB.close(rs, pstmt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (Events.ON_CLICK.equals(event.getName())) {
|
||||
if (event.getTarget() instanceof A) {
|
||||
SearchResult result = (SearchResult) event.getTarget().getAttribute(SEARCH_RESULT);
|
||||
doZoom(result);
|
||||
}
|
||||
} else if (event.getName().equals(ON_SEARCH_DOCUMENTS)) {
|
||||
onSearchDocuments((String)event.getData());
|
||||
}
|
||||
}
|
||||
|
||||
private void doZoom(SearchResult result) {
|
||||
MQuery query = new MQuery();
|
||||
query.addRestriction(result.getTableName()+"_ID", "=", result.getRecordId());
|
||||
AEnv.zoom(result.getWindowId(), query);
|
||||
}
|
||||
|
||||
private class SearchResult {
|
||||
private String windowName;
|
||||
private int windowId;
|
||||
private String tableName;
|
||||
private int recordId;
|
||||
private String label;
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* @return the windowId
|
||||
*/
|
||||
public int getWindowId() {
|
||||
return windowId;
|
||||
}
|
||||
/**
|
||||
* @param windowId the windowId to set
|
||||
*/
|
||||
public void setWindowId(int windowId) {
|
||||
this.windowId = windowId;
|
||||
}
|
||||
/**
|
||||
* @return the tableName
|
||||
*/
|
||||
public String getTableName() {
|
||||
return tableName;
|
||||
}
|
||||
/**
|
||||
* @param tableName the tableName to set
|
||||
*/
|
||||
public void setTableName(String tableName) {
|
||||
this.tableName = tableName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the windowName
|
||||
*/
|
||||
public String getWindowName() {
|
||||
return windowName;
|
||||
}
|
||||
/**
|
||||
* @param windowName the windowName to set
|
||||
*/
|
||||
public void setWindowName(String windowName) {
|
||||
this.windowName = windowName;
|
||||
}
|
||||
/**
|
||||
* @return the recordId
|
||||
*/
|
||||
public int getRecordId() {
|
||||
return recordId;
|
||||
}
|
||||
/**
|
||||
* @param recordId the recordId to set
|
||||
*/
|
||||
public void setRecordId(int recordId) {
|
||||
this.recordId = recordId;
|
||||
}
|
||||
/**
|
||||
* @return the label
|
||||
*/
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
/**
|
||||
* @param label the label to set
|
||||
*/
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
/**
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
/**
|
||||
* @param name the name to set
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean onOk(Textbox textbox) {
|
||||
String text = textbox.getText();
|
||||
if (Util.isEmpty(text))
|
||||
return false;
|
||||
text = text.toLowerCase();
|
||||
int size = layout.getChildren().size();
|
||||
A firstStart = null;
|
||||
A exact = null;
|
||||
for(int i = 0; i < size; i++) {
|
||||
if (!(layout.getChildren().get(i) instanceof A)) continue;
|
||||
A a = (A) layout.getChildren().get(i);
|
||||
SearchResult result = (SearchResult) a.getAttribute(SEARCH_RESULT);
|
||||
if (result.getLabel().equalsIgnoreCase(text)) {
|
||||
exact = a;
|
||||
break;
|
||||
} else if (text.equalsIgnoreCase(result.getName())) {
|
||||
exact = a;
|
||||
break;
|
||||
} else if (firstStart == null && result.getLabel().toLowerCase().startsWith(text) && text.length() >=3 ) {
|
||||
firstStart = a;
|
||||
}
|
||||
}
|
||||
|
||||
SearchResult result = null;
|
||||
if (exact != null)
|
||||
result = (SearchResult) exact.getAttribute(SEARCH_RESULT);
|
||||
else if (firstStart != null)
|
||||
result = (SearchResult) firstStart.getAttribute(SEARCH_RESULT);
|
||||
if (result != null) {
|
||||
doZoom(result);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,151 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2014 Low Heng Sin *
|
||||
* Copyright (C) 2014 Trek Global *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.webui.apps;
|
||||
|
||||
import org.adempiere.webui.component.Bandbox;
|
||||
import org.zkoss.zk.ui.Page;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.event.Events;
|
||||
import org.zkoss.zk.ui.event.InputEvent;
|
||||
import org.zkoss.zk.ui.event.KeyEvent;
|
||||
import org.zkoss.zk.ui.util.Clients;
|
||||
import org.zkoss.zul.Bandpopup;
|
||||
import org.zkoss.zul.Div;
|
||||
import org.zkoss.zul.Hlayout;
|
||||
import org.zkoss.zul.Separator;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class GlobalSearch extends Div implements EventListener<Event> {
|
||||
|
||||
private static final String ON_ENTER_KEY = "onEnterKey";
|
||||
|
||||
private static final String ON_POST_ENTER_KEY = "onPostEnterKey";
|
||||
|
||||
private static final String ON_CREATE_ECHO = "onCreateEcho";
|
||||
|
||||
private static final String ON_SEARCH = "onSearch";
|
||||
|
||||
/**
|
||||
* generated serial id
|
||||
*/
|
||||
private static final long serialVersionUID = -8793878697269469837L;
|
||||
|
||||
private Bandbox bandbox;
|
||||
|
||||
private MenuSearchController menuController;
|
||||
private DocumentSearchController docController;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public GlobalSearch(MenuSearchController menuController) {
|
||||
this.menuController = menuController;
|
||||
docController = new DocumentSearchController();
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
bandbox = new Bandbox();
|
||||
appendChild(bandbox);
|
||||
bandbox.setWidth("100%");
|
||||
bandbox.setAutodrop(true);
|
||||
bandbox.addEventListener(Events.ON_CHANGING, this);
|
||||
bandbox.setCtrlKeys("#up#down");
|
||||
bandbox.addEventListener(Events.ON_CTRL_KEY, this);
|
||||
|
||||
Bandpopup popup = new Bandpopup();
|
||||
popup.setHeight("600px");
|
||||
bandbox.appendChild(popup);
|
||||
|
||||
Hlayout hlayout = new Hlayout();
|
||||
popup.appendChild(hlayout);
|
||||
menuController.create(hlayout);
|
||||
|
||||
Separator separator = new Separator();
|
||||
separator.setHflex("0");
|
||||
separator.setOrient("vertical");
|
||||
hlayout.appendChild(separator);
|
||||
docController.create(hlayout);
|
||||
|
||||
addEventListener(ON_SEARCH, this);
|
||||
addEventListener(ON_CREATE_ECHO, this);
|
||||
bandbox.addEventListener(ON_ENTER_KEY, this);
|
||||
addEventListener(ON_POST_ENTER_KEY, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (Events.ON_CHANGING.equals(event.getName())) {
|
||||
InputEvent inputEvent = (InputEvent) event;
|
||||
String value = inputEvent.getValue();
|
||||
Events.postEvent(ON_SEARCH, this, value);
|
||||
} else if (Events.ON_CTRL_KEY.equals(event.getName())) {
|
||||
KeyEvent ke = (KeyEvent) event;
|
||||
if (ke.getKeyCode() == KeyEvent.UP) {
|
||||
if (bandbox.getFirstChild().isVisible()) {
|
||||
MenuItem selected = menuController.selectPrior();
|
||||
if (selected != null) {
|
||||
bandbox.setText(selected.getLabel());
|
||||
}
|
||||
}
|
||||
} else if (ke.getKeyCode() == KeyEvent.DOWN) {
|
||||
if (bandbox.getFirstChild().isVisible()) {
|
||||
MenuItem selected = menuController.selectNext();
|
||||
if (selected != null && !"...".equals(selected.getType())) {
|
||||
bandbox.setText(selected.getLabel());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (event.getName().equals(ON_SEARCH)) {
|
||||
String value = (String) event.getData();
|
||||
menuController.search(value);
|
||||
docController.search(value);
|
||||
bandbox.focus();
|
||||
} else if (event.getName().equals(ON_CREATE_ECHO)) {
|
||||
StringBuilder script = new StringBuilder("jq('#")
|
||||
.append(bandbox.getUuid())
|
||||
.append("').bind('keydown', function(e) {var code=e.keyCode||e.which;console.log(code);if(code==13){")
|
||||
.append("var widget=zk.Widget.$(this);")
|
||||
.append("var event=new zk.Event(widget,'")
|
||||
.append(ON_ENTER_KEY)
|
||||
.append("',{},{toServer:true});")
|
||||
.append("zAu.send(event);")
|
||||
.append("}});");
|
||||
Clients.evalJavaScript(script.toString());
|
||||
} else if (event.getName().equals(ON_ENTER_KEY)) {
|
||||
Clients.showBusy(bandbox, null);
|
||||
Events.echoEvent(ON_POST_ENTER_KEY, this, null);
|
||||
} else if (event.getName().equals(ON_POST_ENTER_KEY)) {
|
||||
Clients.clearBusy(bandbox);
|
||||
if (menuController.onOk(bandbox)) {
|
||||
return;
|
||||
} else {
|
||||
docController.onOk(bandbox);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.zkoss.zk.ui.AbstractComponent#onPageAttached(org.zkoss.zk.ui.Page, org.zkoss.zk.ui.Page)
|
||||
*/
|
||||
@Override
|
||||
public void onPageAttached(Page newpage, Page oldpage) {
|
||||
super.onPageAttached(newpage, oldpage);
|
||||
Events.echoEvent(ON_CREATE_ECHO, this, null);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.adempiere.webui.apps;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class MenuItem {
|
||||
|
||||
private String label;
|
||||
private String description;
|
||||
private String image;
|
||||
private String type;
|
||||
private Object data;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public MenuItem() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the label
|
||||
*/
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param label the label to set
|
||||
*/
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the description
|
||||
*/
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param description the description to set
|
||||
*/
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the image
|
||||
*/
|
||||
public String getImage() {
|
||||
return image;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param image the image to set
|
||||
*/
|
||||
public void setImage(String image) {
|
||||
this.image = image;
|
||||
}
|
||||
|
||||
public void setData(Object data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Object getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the type
|
||||
*/
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type the type to set
|
||||
*/
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,481 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2014 Low Heng Sin *
|
||||
* Copyright (C) 2014 Trek Global *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.adempiere.webui.apps;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import org.adempiere.webui.component.Label;
|
||||
import org.adempiere.webui.component.ListHead;
|
||||
import org.adempiere.webui.component.ListItem;
|
||||
import org.adempiere.webui.component.Listbox;
|
||||
import org.adempiere.webui.theme.ThemeManager;
|
||||
import org.adempiere.webui.util.TreeItemAction;
|
||||
import org.adempiere.webui.util.TreeNodeAction;
|
||||
import org.adempiere.webui.util.TreeUtils;
|
||||
import org.compiere.model.MTreeNode;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.util.Util;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.event.Events;
|
||||
import org.zkoss.zk.ui.util.Clients;
|
||||
import org.zkoss.zul.A;
|
||||
import org.zkoss.zul.DefaultTreeNode;
|
||||
import org.zkoss.zul.ListModel;
|
||||
import org.zkoss.zul.ListModelList;
|
||||
import org.zkoss.zul.ListModels;
|
||||
import org.zkoss.zul.ListSubModel;
|
||||
import org.zkoss.zul.Listcell;
|
||||
import org.zkoss.zul.Listheader;
|
||||
import org.zkoss.zul.Listitem;
|
||||
import org.zkoss.zul.ListitemRenderer;
|
||||
import org.zkoss.zul.ListitemRendererExt;
|
||||
import org.zkoss.zul.Textbox;
|
||||
import org.zkoss.zul.Toolbarbutton;
|
||||
import org.zkoss.zul.Tree;
|
||||
import org.zkoss.zul.Treechildren;
|
||||
import org.zkoss.zul.Treeitem;
|
||||
import org.zkoss.zul.Vlayout;
|
||||
import org.zkoss.zul.impl.LabelElement;
|
||||
import org.zkoss.zul.impl.LabelImageElement;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class MenuSearchController implements EventListener<Event>{
|
||||
|
||||
private static final String ON_SEARCH_ECHO = "onSearchEcho";
|
||||
private static final String ON_LOAD_MORE = "onLoadMore";
|
||||
private static final String ONSELECT_TIMESTAMP = "onselect.timestamp";
|
||||
private Tree tree;
|
||||
private Listbox listbox;
|
||||
private ListModelList<MenuItem> model;
|
||||
private Vlayout layout;
|
||||
private ListModelList<MenuItem> fullModel;
|
||||
|
||||
private static final String ON_POST_SELECT_TREEITEM_EVENT = "onPostSelectTreeitem";
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public MenuSearchController(Tree tree) {
|
||||
this.tree = tree;
|
||||
}
|
||||
|
||||
public void refreshModel() {
|
||||
final List<MenuItem> list = new ArrayList<MenuItem>();
|
||||
if (tree.getModel() == null) {
|
||||
TreeUtils.traverse(tree, new TreeItemAction() {
|
||||
public void run(Treeitem treeItem) {
|
||||
if (treeItem.isVisible())
|
||||
addTreeItem(list, treeItem);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TreeUtils.traverse(tree.getModel(), new TreeNodeAction() {
|
||||
public void run(DefaultTreeNode<?> treeNode) {
|
||||
addTreeItem(list, treeNode);
|
||||
}
|
||||
});
|
||||
}
|
||||
model = new ListModelList<MenuItem>(list, true);
|
||||
model.sort(new Comparator<MenuItem>() {
|
||||
|
||||
@Override
|
||||
public int compare(MenuItem o1, MenuItem o2) {
|
||||
return o1.getLabel().compareTo(o2.getLabel());
|
||||
}
|
||||
}, true);
|
||||
}
|
||||
|
||||
private void addTreeItem(List<MenuItem> list, DefaultTreeNode<?> treeNode) {
|
||||
MTreeNode mNode = (MTreeNode) treeNode.getData();
|
||||
if (!mNode.isLeaf())
|
||||
return;
|
||||
|
||||
MenuItem item = new MenuItem();
|
||||
item.setLabel(mNode.getName());
|
||||
item.setDescription(mNode.getDescription());
|
||||
item.setImage(mNode.getImagePath());
|
||||
item.setData(treeNode);
|
||||
list.add(item);
|
||||
}
|
||||
|
||||
private boolean isFolder(Treeitem treeItem) {
|
||||
List<Component> list = treeItem.getChildren();
|
||||
for (Component c : list) {
|
||||
if (c instanceof Treechildren && ((Treechildren)c).getChildren().size() > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void addTreeItem(List<MenuItem> list, Treeitem treeItem) {
|
||||
if (isFolder(treeItem))
|
||||
return;
|
||||
|
||||
MenuItem item = new MenuItem();
|
||||
item.setLabel(getLabel(treeItem));
|
||||
item.setDescription(treeItem.getTooltiptext());
|
||||
|
||||
String image = getImage(treeItem);
|
||||
if (image == null || image.length() == 0)
|
||||
{
|
||||
image = ThemeManager.getThemeResource("images/Folder16.png");
|
||||
}
|
||||
item.setImage(image);
|
||||
item.setData(treeItem);
|
||||
list.add(item);
|
||||
item.setType((String) treeItem.getAttribute("menu.type"));
|
||||
}
|
||||
|
||||
private String getLabel(Treeitem treeItem) {
|
||||
String label = treeItem.getLabel();
|
||||
if (label == null || label.trim().length() == 0)
|
||||
{
|
||||
if (treeItem.getTreerow().getFirstChild().getFirstChild() != null &&
|
||||
treeItem.getTreerow().getFirstChild().getFirstChild() instanceof LabelElement)
|
||||
{
|
||||
LabelElement element = (LabelElement) treeItem.getTreerow().getFirstChild().getFirstChild();
|
||||
label = element.getLabel();
|
||||
}
|
||||
}
|
||||
return label;
|
||||
}
|
||||
|
||||
private String getImage(Treeitem treeItem) {
|
||||
String image = treeItem.getImage();
|
||||
if (image == null || image.trim().length() == 0)
|
||||
{
|
||||
if (treeItem.getTreerow().getFirstChild().getFirstChild() != null &&
|
||||
treeItem.getTreerow().getFirstChild().getFirstChild() instanceof LabelImageElement)
|
||||
{
|
||||
LabelImageElement element = (LabelImageElement) treeItem.getTreerow().getFirstChild().getFirstChild();
|
||||
image = element.getImage();
|
||||
}
|
||||
}
|
||||
return image != null ? image.intern() : null;
|
||||
}
|
||||
|
||||
public void create(Component parent) {
|
||||
refreshModel();
|
||||
|
||||
layout = new Vlayout();
|
||||
layout.setHeight("100%");
|
||||
parent.appendChild(layout);
|
||||
|
||||
Label label = new Label(Util.cleanAmp(Msg.getMsg(Env.getCtx(),"Menu")));
|
||||
label.setStyle("padding: 3px; font-weight: bold; display: block;");
|
||||
layout.appendChild(label);
|
||||
listbox = new Listbox();
|
||||
listbox.setEmptyMessage(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "FindZeroRecords")));
|
||||
listbox.setStyle("border: none");
|
||||
listbox.setWidth("500px");
|
||||
layout.appendChild(listbox);
|
||||
listbox.setItemRenderer(new MenuItemRenderer());
|
||||
listbox.addEventListener(Events.ON_SELECT, this);
|
||||
listbox.addEventListener(ON_POST_SELECT_TREEITEM_EVENT, this);
|
||||
ListHead listhead = new ListHead();
|
||||
listbox.appendChild(listhead);
|
||||
Listheader listheader = new Listheader();
|
||||
listhead.appendChild(listheader);
|
||||
listheader = new Listheader();
|
||||
listheader.setWidth("32px");
|
||||
listhead.appendChild(listheader);
|
||||
|
||||
layout.addEventListener(ON_SEARCH_ECHO, this);
|
||||
layout.addEventListener(ON_LOAD_MORE, this);
|
||||
updateListboxModel(model);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (Events.ON_SELECT.equals(event.getName())) {
|
||||
ListItem selected = listbox.getSelectedItem();
|
||||
if (selected == null) return;
|
||||
onSelect(selected, Boolean.FALSE);
|
||||
} else if (event.getName().equals(ON_POST_SELECT_TREEITEM_EVENT)) {
|
||||
onPostSelectTreeitem((Boolean) event.getData());
|
||||
} else if (Events.ON_CLICK.equals(event.getName())) {
|
||||
if (event.getTarget() instanceof ListItem) {
|
||||
ListItem item = (ListItem) event.getTarget();
|
||||
Long onSelect = (Long) item.getAttribute(ONSELECT_TIMESTAMP);
|
||||
if (onSelect == null) {
|
||||
onSelect(item, Boolean.FALSE);
|
||||
} else if (System.currentTimeMillis() - onSelect.longValue() > 1000) {
|
||||
onSelect(item, Boolean.FALSE);
|
||||
}
|
||||
} else if (event.getTarget() instanceof Toolbarbutton) {
|
||||
ListItem item = null;
|
||||
Component parent = event.getTarget();
|
||||
while (parent != null) {
|
||||
if (parent instanceof ListItem) {
|
||||
item = (ListItem) parent;
|
||||
break;
|
||||
}
|
||||
parent = parent.getParent();
|
||||
}
|
||||
if (item != null) {
|
||||
onSelect(item, Boolean.TRUE);
|
||||
}
|
||||
}
|
||||
} else if (event.getName().equals(ON_SEARCH_ECHO)) {
|
||||
onSearchEcho((String) event.getData());
|
||||
} else if (event.getName().equals(ON_LOAD_MORE)) {
|
||||
loadMore();
|
||||
}
|
||||
}
|
||||
|
||||
private void onSelect(ListItem selected, Boolean newRecord) {
|
||||
MenuItem item = selected.getValue();
|
||||
if (item == null) return;
|
||||
if ("...".equals(item.getType())) {
|
||||
selected.setAttribute(ONSELECT_TIMESTAMP, System.currentTimeMillis());
|
||||
Clients.showBusy(selected, null);
|
||||
Events.echoEvent(ON_LOAD_MORE, layout, null);
|
||||
} else {
|
||||
selectTreeitem(item.getData(), newRecord);
|
||||
selected.setAttribute(ONSELECT_TIMESTAMP, System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
private void loadMore() {
|
||||
ListModel<MenuItem> listModel = listbox.getModel();
|
||||
ListModelList<MenuItem> lml = (ListModelList<MenuItem>) listModel;
|
||||
lml.remove(lml.size()-1);
|
||||
List<MenuItem> subList = fullModel.subList(50, fullModel.size());
|
||||
lml.addAll(subList);
|
||||
fullModel = null;
|
||||
listbox.setSelectedIndex(50);
|
||||
Clients.scrollIntoView(listbox.getSelectedItem());
|
||||
}
|
||||
|
||||
private void selectTreeitem(Object node, Boolean newRecord) {
|
||||
if (Executions.getCurrent().getAttribute(listbox.getUuid()+".selectTreeitem") != null)
|
||||
return;
|
||||
|
||||
Treeitem treeItem = null;
|
||||
if (node == null) {
|
||||
return;
|
||||
} else if (node instanceof Treeitem) {
|
||||
treeItem = (Treeitem) node;
|
||||
} else {
|
||||
DefaultTreeNode<?> sNode = (DefaultTreeNode<?>) node;
|
||||
int[] path = tree.getModel().getPath(sNode);
|
||||
treeItem = tree.renderItemByPath(path);
|
||||
tree.setSelectedItem(treeItem);
|
||||
}
|
||||
if (treeItem != null) {
|
||||
Executions.getCurrent().setAttribute(listbox.getUuid()+".selectTreeitem", Boolean.TRUE);
|
||||
|
||||
select(treeItem);
|
||||
Events.postEvent(ON_POST_SELECT_TREEITEM_EVENT, listbox, newRecord);
|
||||
}
|
||||
}
|
||||
|
||||
private void select(Treeitem selectedItem) {
|
||||
Treeitem parent = selectedItem.getParentItem();
|
||||
while (parent != null) {
|
||||
if (!parent.isOpen())
|
||||
parent.setOpen(true);
|
||||
|
||||
parent = parent.getParentItem();
|
||||
}
|
||||
selectedItem.getTree().setSelectedItem(selectedItem);
|
||||
}
|
||||
|
||||
private void onPostSelectTreeitem(Boolean newRecord) {
|
||||
Event event = null;
|
||||
if (tree.getSelectedItem().getTreerow().getFirstChild().getFirstChild() instanceof A)
|
||||
{
|
||||
event = new Event(Events.ON_CLICK, tree.getSelectedItem().getTreerow().getFirstChild().getFirstChild(), newRecord);
|
||||
}
|
||||
else
|
||||
{
|
||||
event = new Event(Events.ON_CLICK, tree.getSelectedItem().getTreerow(), newRecord);
|
||||
}
|
||||
Events.postEvent(event);
|
||||
}
|
||||
|
||||
public void search(String value) {
|
||||
listbox.setVisible(false);
|
||||
Events.echoEvent(ON_SEARCH_ECHO, layout, value);
|
||||
}
|
||||
|
||||
public void onSearchEcho(String value) {
|
||||
ListModelList<MenuItem> newModel = null;
|
||||
if (Util.isEmpty(value)) {
|
||||
newModel = model;
|
||||
} else {
|
||||
@SuppressWarnings("unchecked")
|
||||
ListSubModel<MenuItem> subModel = (ListSubModel<MenuItem>) ListModels.toListSubModel(model, new MenuListComparator(value), model.size());
|
||||
newModel = (ListModelList<MenuItem>) subModel.getSubModel(null, -1);
|
||||
}
|
||||
updateListboxModel(newModel);
|
||||
listbox.setVisible(true);
|
||||
}
|
||||
|
||||
private void updateListboxModel(ListModelList<MenuItem> newModel) {
|
||||
fullModel = null;
|
||||
if (newModel.size() > 50) {
|
||||
List<MenuItem> list = newModel.getInnerList();
|
||||
List<MenuItem> subList = list.subList(0, 50);
|
||||
fullModel = newModel;
|
||||
newModel = new ListModelList<MenuItem>(subList.toArray(new MenuItem[0]));
|
||||
MenuItem more = new MenuItem();
|
||||
more.setLabel("...");
|
||||
more.setType("...");
|
||||
newModel.add(more);
|
||||
}
|
||||
listbox.setModel(newModel);
|
||||
}
|
||||
|
||||
private class MenuListComparator implements Comparator<MenuItem> {
|
||||
|
||||
private String compare;
|
||||
|
||||
private MenuListComparator(String compare) {
|
||||
this.compare = compare;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(MenuItem o1, MenuItem o2) {
|
||||
compare = compare.toLowerCase().trim();
|
||||
boolean match = false;
|
||||
if (compare.length() < 3)
|
||||
{
|
||||
match = o2.getLabel().toLowerCase().startsWith(compare);
|
||||
}
|
||||
else
|
||||
{
|
||||
match = o2.getLabel().toLowerCase().contains(compare);
|
||||
}
|
||||
return match ? 0 : -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public MenuItem selectPrior() {
|
||||
int i = listbox.getSelectedIndex();
|
||||
if (i > 0) {
|
||||
listbox.setSelectedIndex(i-1);
|
||||
ListItem selected = listbox.getSelectedItem();
|
||||
if (selected == null) return null;
|
||||
Clients.scrollIntoView(selected);
|
||||
MenuItem item = selected.getValue();
|
||||
return item;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public MenuItem selectNext() {
|
||||
int i = listbox.getSelectedIndex();
|
||||
if (i < 0 && listbox.getItemCount() > 0) {
|
||||
listbox.setSelectedIndex(0);
|
||||
ListItem selected = listbox.getSelectedItem();
|
||||
if (selected == null) return null;
|
||||
MenuItem item = selected.getValue();
|
||||
return item;
|
||||
} else if (i+1 < listbox.getItemCount()) {
|
||||
listbox.setSelectedIndex(i+1);
|
||||
ListItem selected = listbox.getSelectedItem();
|
||||
if (selected == null) return null;
|
||||
MenuItem item = selected.getValue();
|
||||
if (item == null) return null;
|
||||
if ("...".equals(item.getType())) {
|
||||
onSelect(selected, Boolean.FALSE);
|
||||
}
|
||||
Clients.scrollIntoView(selected);
|
||||
return item;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean onOk(Textbox textbox) {
|
||||
String text = textbox.getText();
|
||||
if (Util.isEmpty(text))
|
||||
return false;
|
||||
text = text.toLowerCase();
|
||||
ListItem exact = null;
|
||||
ListItem firstStart = null;
|
||||
int count = listbox.getItemCount();
|
||||
for(int i = 0; i < count; i++) {
|
||||
ListItem item = listbox.getItemAtIndex(i);
|
||||
String label = item.getLabel();
|
||||
if (Util.isEmpty(label)) continue;
|
||||
if (label.equalsIgnoreCase(text)) {
|
||||
exact = item;
|
||||
break;
|
||||
} else if (firstStart == null && label.toLowerCase().startsWith(text) && text.length() >= 3) {
|
||||
firstStart = item;
|
||||
}
|
||||
}
|
||||
if (exact != null) {
|
||||
textbox.setText(exact.getLabel());
|
||||
onSelect(exact, false);
|
||||
return true;
|
||||
} else if (firstStart != null) {
|
||||
textbox.setText(firstStart.getLabel());
|
||||
onSelect(firstStart, false);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private class MenuItemRenderer implements ListitemRenderer<MenuItem>, ListitemRendererExt {
|
||||
@Override
|
||||
public Listitem newListitem(org.zkoss.zul.Listbox listbox) {
|
||||
return new ListItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Listcell newListcell(Listitem item) {
|
||||
return new Listcell(item.getLabel());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getControls() {
|
||||
return ListitemRendererExt.DETACH_ON_RENDER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Listitem item, MenuItem data, int index)
|
||||
throws Exception {
|
||||
Listcell cell = new Listcell(data.getLabel(), data.getImage());
|
||||
item.appendChild(cell);
|
||||
cell.setTooltip(data.getDescription());
|
||||
item.setValue(data);
|
||||
item.addEventListener(Events.ON_CLICK, MenuSearchController.this);
|
||||
|
||||
cell = new Listcell();
|
||||
item.appendChild(cell);
|
||||
boolean isWindow = data.getType() != null && data.getType().equals("window");
|
||||
if (isWindow) {
|
||||
Toolbarbutton newBtn = new Toolbarbutton(null, ThemeManager.getThemeResource("images/New16.png"));
|
||||
newBtn.addEventListener(Events.ON_CLICK, MenuSearchController.this);
|
||||
newBtn.setSclass("fav-new-btn");
|
||||
newBtn.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "New")));
|
||||
cell.appendChild(newBtn);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -144,6 +144,7 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi
|
|||
dialogContent.setHflex("1");
|
||||
dialogContent.setVflex("1");
|
||||
dialogContent.setSclass("dialog-content");
|
||||
dialogContent.setStyle("overflow-y: auto;");
|
||||
dialogBody.appendChild(dialogContent);
|
||||
Div div = new Div();
|
||||
div.setId("message");
|
||||
|
|
|
@ -795,6 +795,9 @@ public class ProcessParameterPanel extends Panel implements
|
|||
editor.setMandatory(mField.isMandatory(true));
|
||||
editor.updateLabelStyle();
|
||||
}
|
||||
if (getParent() != null) {
|
||||
getParent().invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.text.ParseException;
|
|||
|
||||
import org.adempiere.webui.LayoutUtils;
|
||||
import org.adempiere.webui.theme.ThemeManager;
|
||||
import org.compiere.model.MSysConfig;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Env;
|
||||
import org.zkoss.zk.ui.Page;
|
||||
|
@ -47,7 +48,7 @@ public class NumberBox extends Div
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -3548087521669052891L;
|
||||
private static final long serialVersionUID = 8543853599051754172L;
|
||||
|
||||
private Textbox txtCalc = new Textbox();
|
||||
|
||||
|
@ -84,7 +85,40 @@ public class NumberBox extends Div
|
|||
decimalBox.setStyle("display: inline-block;text-align:right");
|
||||
decimalBox.setHflex("0");
|
||||
decimalBox.setSclass("editor-input");
|
||||
appendChild(decimalBox);
|
||||
decimalBox.setId(decimalBox.getUuid());
|
||||
|
||||
char separatorChar = DisplayType.getNumberFormat(DisplayType.Number, Env.getLanguage(Env.getCtx())).getDecimalFormatSymbols().getDecimalSeparator();
|
||||
String separator = Character.toString(separatorChar);
|
||||
boolean processDotKeypad = MSysConfig.getBooleanValue(MSysConfig.ZK_DECIMALBOX_PROCESS_DOTKEYPAD, true, Env.getAD_Client_ID(Env.getCtx()));
|
||||
if (".".equals(separator))
|
||||
processDotKeypad = false;
|
||||
if (processDotKeypad) {
|
||||
StringBuffer funct = new StringBuffer();
|
||||
funct.append("function(evt)");
|
||||
funct.append("{");
|
||||
// ignore dot and process it on key up
|
||||
funct.append(" if (!this._shallIgnore(evt, '0123456789-%").append(separator).append("'))");
|
||||
funct.append(" {");
|
||||
funct.append(" this.$doKeyPress_(evt);");
|
||||
funct.append(" }");
|
||||
funct.append("}");
|
||||
decimalBox.setWidgetOverride("doKeyPress_", funct.toString());
|
||||
funct = new StringBuffer();
|
||||
// not working correctly on opera
|
||||
funct.append("if (window.event)");
|
||||
funct.append(" key = event.keyCode;");
|
||||
funct.append("else");
|
||||
funct.append(" key = event.which;");
|
||||
funct.append("if ((key == 110 || key == 190) && !window.opera) {");
|
||||
funct.append(" var id = '$'.concat('").append(decimalBox.getId()).append("');");
|
||||
funct.append(" var calcText = jq(id)[0];");
|
||||
funct.append(" calcText.value += '").append(separator).append("';");
|
||||
funct.append(" event.stop;");
|
||||
funct.append("};");
|
||||
decimalBox.setWidgetListener("onKeyUp", funct.toString());
|
||||
}
|
||||
|
||||
appendChild(decimalBox);
|
||||
|
||||
btn = new Button();
|
||||
btn.setImage(ThemeManager.getThemeResource("images/Calculator16.png"));
|
||||
|
@ -197,13 +231,35 @@ public class NumberBox extends Div
|
|||
Vbox vbox = new Vbox();
|
||||
|
||||
char separatorChar = DisplayType.getNumberFormat(DisplayType.Number, Env.getLanguage(Env.getCtx())).getDecimalFormatSymbols().getDecimalSeparator();
|
||||
String separator = Character.toString(separatorChar);
|
||||
|
||||
txtCalc = new Textbox();
|
||||
|
||||
decimalBox.setId(decimalBox.getUuid());
|
||||
txtCalc.setId(txtCalc.getUuid());
|
||||
|
||||
txtCalc.setWidgetListener("onKeyUp", "return calc.validate('" +
|
||||
|
||||
boolean processDotKeypad = MSysConfig.getBooleanValue(MSysConfig.ZK_DECIMALBOX_PROCESS_DOTKEYPAD, true, Env.getAD_Client_ID(Env.getCtx()));
|
||||
if (".".equals(separator))
|
||||
processDotKeypad = false;
|
||||
|
||||
// restrict allowed characters
|
||||
String decimalSep = separator;
|
||||
if (!processDotKeypad && !".".equals(separator))
|
||||
decimalSep += ".";
|
||||
StringBuffer funct = new StringBuffer();
|
||||
funct.append("function(evt)");
|
||||
funct.append("{");
|
||||
funct.append(" if (!this._shallIgnore(evt, '= -/()*%+0123456789").append(decimalSep).append("'))");
|
||||
funct.append(" {");
|
||||
funct.append(" this.$doKeyPress_(evt);");
|
||||
funct.append(" }");
|
||||
funct.append("}");
|
||||
txtCalc.setWidgetOverride("doKeyPress_", funct.toString());
|
||||
|
||||
txtCalc.setWidgetListener("onKeyUp", "calc.validateUp('" +
|
||||
decimalBox.getId() + "','" + txtCalc.getId()
|
||||
+ "'," + integral + "," + (int)separatorChar + ", event, " + ( processDotKeypad ? "true" : "false" ) + ");");
|
||||
txtCalc.setWidgetListener("onKeyPress", "calc.validatePress('" +
|
||||
decimalBox.getId() + "','" + txtCalc.getId()
|
||||
+ "'," + integral + "," + (int)separatorChar + ", event);");
|
||||
txtCalc.setMaxlength(250);
|
||||
|
@ -323,7 +379,6 @@ public class NumberBox extends Div
|
|||
btn0.setLabel("0");
|
||||
btn0.setWidgetListener("onClick", "calc.append('" + txtCalcId + "', '0')");
|
||||
|
||||
String separator = Character.toString(separatorChar);
|
||||
Button btnDot = new Button();
|
||||
btnDot.setWidth("30px");
|
||||
btnDot.setLabel(separator);
|
||||
|
|
|
@ -15,6 +15,8 @@ package org.adempiere.webui.dashboard;
|
|||
|
||||
import org.adempiere.webui.apps.graph.WPAPanel;
|
||||
import org.adempiere.webui.util.ServerPushTemplate;
|
||||
import org.compiere.model.MSysConfig;
|
||||
import org.compiere.util.Env;
|
||||
import org.zkoss.zk.au.out.AuScript;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
|
@ -81,9 +83,10 @@ public class DPPerformance extends DashboardPanel {
|
|||
removeAttribute(ON_POST_RENDER_ATTR);
|
||||
if (this.getFirstChild() != null)
|
||||
{
|
||||
int timeout = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_PERFORMANCE_TIMEOUT, 500, Env.getAD_Client_ID(Env.getCtx()));
|
||||
Component grid = this.getFirstChild().getFirstChild();
|
||||
String script = "setTimeout(function() { var grid = jq('#" + grid.getUuid() + "');";
|
||||
script = script + "grid.parent().height(grid.css('height'));}, 500);";
|
||||
script = script + "grid.parent().height(grid.css('height'));}, " + timeout + ");";
|
||||
if (Executions.getCurrent() != null)
|
||||
Clients.response(new AuScript(script));
|
||||
this.getFirstChild().invalidate();
|
||||
|
|
|
@ -80,6 +80,8 @@ public class WAccountEditor extends WEditor implements ContextMenuListener
|
|||
@Override
|
||||
public Object getValue()
|
||||
{
|
||||
//if (m_mAccount.C_ValidCombination_ID == 0)
|
||||
// return null;
|
||||
return new Integer (m_mAccount.C_ValidCombination_ID);
|
||||
}
|
||||
|
||||
|
|
|
@ -235,7 +235,7 @@ public class WStringEditor extends WEditor implements ContextMenuListener
|
|||
else if (WEditorPopupMenu.EDITOR_EVENT.equals(evt.getContextEvent()))
|
||||
{
|
||||
adwindowContent = findADWindowContent();
|
||||
final WTextEditorDialog dialog = new WTextEditorDialog(this.getColumnName(), getDisplay(),
|
||||
final WTextEditorDialog dialog = new WTextEditorDialog(gridField.getVO().Header, getDisplay(),
|
||||
isReadWrite(), gridField.getFieldLength());
|
||||
dialog.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener<Event>() {
|
||||
@Override
|
||||
|
|
|
@ -16,7 +16,7 @@ public class InfoBPartnerWindow extends InfoWindow {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 126054851491958589L;
|
||||
private static final long serialVersionUID = -5291476382115985651L;
|
||||
|
||||
/**
|
||||
* @param WindowNo
|
||||
|
@ -78,9 +78,12 @@ public class InfoBPartnerWindow extends InfoWindow {
|
|||
ih = null;
|
||||
} // showHistory
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* set value of checkbox IsVendor and IsCustomer by IsSOTrx flag
|
||||
*/
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
protected void initParameters() {
|
||||
String isSOTrx = Env.getContext(Env.getCtx(), p_WindowNo, "IsSOTrx");
|
||||
if (!isLookup() && Util.isEmpty(isSOTrx)) {
|
||||
isSOTrx = "Y";
|
||||
|
@ -88,6 +91,7 @@ public class InfoBPartnerWindow extends InfoWindow {
|
|||
|
||||
if (!Util.isEmpty(isSOTrx)) {
|
||||
if ("Y".equals(isSOTrx)) {
|
||||
// set value of IsCustomer checkbox
|
||||
for (WEditor editor : editors) {
|
||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("IsCustomer")) {
|
||||
editor.setValue("Y");
|
||||
|
@ -95,6 +99,7 @@ public class InfoBPartnerWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
} else if ("N".equals(isSOTrx)) {
|
||||
// set value of IsVendor checkbox
|
||||
for (WEditor editor : editors) {
|
||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("IsVendor")) {
|
||||
editor.setValue("Y");
|
||||
|
@ -103,7 +108,6 @@ public class InfoBPartnerWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
}
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -12,11 +12,10 @@ import org.compiere.util.Util;
|
|||
*
|
||||
*/
|
||||
public class InfoInOutWindow extends InfoWindow {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 3027121642718090785L;
|
||||
private static final long serialVersionUID = 1687215125029008351L;
|
||||
|
||||
/**
|
||||
* @param WindowNo
|
||||
|
@ -51,14 +50,18 @@ public class InfoInOutWindow extends InfoWindow {
|
|||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* set value of checkbox isSoTrx
|
||||
*/
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
protected void initParameters() {
|
||||
String isSOTrx = Env.getContext(Env.getCtx(), p_WindowNo, "IsSOTrx");
|
||||
if (!isLookup() && Util.isEmpty(isSOTrx)) {
|
||||
isSOTrx = "Y";
|
||||
}
|
||||
|
||||
// set value of isSoTrx checkbox by env
|
||||
if (!Util.isEmpty(isSOTrx)) {
|
||||
for (WEditor editor : editors) {
|
||||
if (editor.getGridField() != null && editor.getGridField().getColumnName().equals("IsSOTrx")) {
|
||||
|
@ -67,6 +70,6 @@ public class InfoInOutWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
}
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ public class InfoInvoiceWindow extends InfoWindow {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -5614659763247990639L;
|
||||
private static final long serialVersionUID = -3169476148884310274L;
|
||||
|
||||
/**
|
||||
* @param WindowNo
|
||||
|
@ -50,9 +50,11 @@ public class InfoInvoiceWindow extends InfoWindow {
|
|||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
protected void initParameters() {
|
||||
String isSOTrx = Env.getContext(Env.getCtx(), p_WindowNo, "IsSOTrx");
|
||||
if (!isLookup() && Util.isEmpty(isSOTrx)) {
|
||||
isSOTrx = "Y";
|
||||
|
@ -77,7 +79,6 @@ public class InfoInvoiceWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
}
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -12,11 +12,10 @@ import org.compiere.util.Util;
|
|||
*
|
||||
*/
|
||||
public class InfoOrderWindow extends InfoWindow {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1241927188305227636L;
|
||||
private static final long serialVersionUID = -558954356627208290L;
|
||||
|
||||
/**
|
||||
* @param WindowNo
|
||||
|
@ -51,9 +50,11 @@ public class InfoOrderWindow extends InfoWindow {
|
|||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
protected void initParameters() {
|
||||
String isSOTrx = Env.getContext(Env.getCtx(), p_WindowNo, "IsSOTrx");
|
||||
if (!isLookup() && Util.isEmpty(isSOTrx)) {
|
||||
isSOTrx = "Y";
|
||||
|
@ -78,6 +79,5 @@ public class InfoOrderWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
}
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ public class InfoPAttributeInstanceWindow extends InfoWindow {
|
|||
String whereClause, int AD_InfoWindow_ID, boolean lookup) {
|
||||
super(WindowNo, tableName, keyColumn, queryValue, multipleSelection,
|
||||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
// TODO Auto-generated constructor stub
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ public class InfoPAttributeWindow extends InfoWindow {
|
|||
String whereClause, int AD_InfoWindow_ID) {
|
||||
super(WindowNo, tableName, keyColumn, queryValue, multipleSelection,
|
||||
whereClause, AD_InfoWindow_ID);
|
||||
// TODO Auto-generated constructor stub
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -46,7 +46,7 @@ public class InfoPAttributeWindow extends InfoWindow {
|
|||
String whereClause, int AD_InfoWindow_ID, boolean lookup) {
|
||||
super(WindowNo, tableName, keyColumn, queryValue, multipleSelection,
|
||||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
// TODO Auto-generated constructor stub
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -12,11 +12,10 @@ import org.compiere.util.Util;
|
|||
*
|
||||
*/
|
||||
public class InfoPaymentWindow extends InfoWindow {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1322780214387328688L;
|
||||
private static final long serialVersionUID = -3556977962189259779L;
|
||||
|
||||
/**
|
||||
* @param WindowNo
|
||||
|
@ -51,9 +50,11 @@ public class InfoPaymentWindow extends InfoWindow {
|
|||
whereClause, AD_InfoWindow_ID, lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
protected void initParameters() {
|
||||
String isSOTrx = Env.getContext(Env.getCtx(), p_WindowNo, "IsSOTrx");
|
||||
if (!isLookup() && Util.isEmpty(isSOTrx)) {
|
||||
isSOTrx = "Y";
|
||||
|
@ -67,6 +68,5 @@ public class InfoPaymentWindow extends InfoWindow {
|
|||
}
|
||||
}
|
||||
}
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ public class InfoProductWindow extends InfoWindow {
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 4817648658129732541L;
|
||||
private static final long serialVersionUID = -1343685368452976048L;
|
||||
|
||||
private Tabbox tabbedPane;
|
||||
private WListbox warehouseTbl;
|
||||
|
@ -136,15 +136,6 @@ public class InfoProductWindow extends InfoWindow {
|
|||
return prevWhereClause;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createParameterPanel() {
|
||||
super.createParameterPanel();
|
||||
initParameters();
|
||||
dynamicDisplay(null);
|
||||
// update display of mandatory field
|
||||
validateParameters();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderWindow() {
|
||||
super.renderWindow();
|
||||
|
@ -445,7 +436,11 @@ public class InfoProductWindow extends InfoWindow {
|
|||
return 0;
|
||||
}
|
||||
|
||||
private void initParameters() {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
protected void initParameters() {
|
||||
int M_Warehouse_ID = Env.getContextAsInt(Env.getCtx(), p_WindowNo, "M_Warehouse_ID");
|
||||
int M_PriceList_ID = Env.getContextAsInt(Env.getCtx(), p_WindowNo, "M_PriceList_ID");
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 5015742153094526149L;
|
||||
private static final long serialVersionUID = 1913208136527058096L;
|
||||
|
||||
protected Grid parameterGrid;
|
||||
private Borderlayout layout;
|
||||
|
@ -1096,6 +1096,8 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
|||
}
|
||||
}
|
||||
evalDisplayLogic();
|
||||
initParameters();
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
|
||||
private void evalDisplayLogic() {
|
||||
|
@ -1362,6 +1364,8 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
|||
{
|
||||
if (otherEditor == editor)
|
||||
continue;
|
||||
|
||||
// reset value of WInfoPAttributeEditor to null when change M_AttributeSet_ID
|
||||
if (asiChanged && otherEditor instanceof WInfoPAttributeEditor)
|
||||
((WInfoPAttributeEditor)otherEditor).clearWhereClause();
|
||||
|
||||
|
@ -1404,6 +1408,38 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc-}
|
||||
*/
|
||||
@Override
|
||||
protected void resetParameters() {
|
||||
// reset value of parameter to null, just reset display parameter
|
||||
for (WEditor editor : editors) {
|
||||
GridField gField = editor.getGridField();
|
||||
if (gField == null || !gField.isDisplayed()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// just reset to default Field set explicit DefaultValue
|
||||
Object resetValue = null;
|
||||
if (! Util.isEmpty(gField.getVO().DefaultValue, true)) {
|
||||
resetValue = gField.getDefault();
|
||||
}
|
||||
Object oldValue = gField.getValue();
|
||||
gField.setValue(resetValue, true);
|
||||
|
||||
// call valueChange to update env
|
||||
ValueChangeEvent changeEvent = new ValueChangeEvent (editor, "", oldValue, resetValue);
|
||||
valueChange (changeEvent);
|
||||
}
|
||||
|
||||
// init again parameter
|
||||
initParameters();
|
||||
|
||||
// filter dynamic value
|
||||
dynamicDisplay(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageAttached(Page newpage, Page oldpage) {
|
||||
super.onPageAttached(newpage, oldpage);
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
|
||||
package org.adempiere.webui.panel;
|
||||
|
||||
import org.adempiere.webui.apps.GlobalSearch;
|
||||
import org.adempiere.webui.apps.MenuSearchController;
|
||||
import org.adempiere.webui.component.Panel;
|
||||
import org.adempiere.webui.theme.ThemeManager;
|
||||
import org.adempiere.webui.window.AboutWindow;
|
||||
|
@ -49,6 +51,8 @@ public class HeaderPanel extends Panel implements EventListener<Event>
|
|||
protected LabelImageElement btnMenu;
|
||||
protected Popup popMenu;
|
||||
|
||||
private MenuTreePanel menuTreePanel;
|
||||
|
||||
public HeaderPanel()
|
||||
{
|
||||
super();
|
||||
|
@ -62,9 +66,9 @@ public class HeaderPanel extends Panel implements EventListener<Event>
|
|||
image.addEventListener(Events.ON_CLICK, this);
|
||||
image.setStyle("cursor: pointer;");
|
||||
|
||||
createSearchPanel();
|
||||
|
||||
createPopupMenu();
|
||||
|
||||
createSearchPanel();
|
||||
|
||||
btnMenu = (LabelImageElement) getFellow("menuButton");
|
||||
btnMenu.setLabel(Util.cleanAmp(Msg.getMsg(Env.getCtx(),"Menu")));
|
||||
|
@ -74,7 +78,7 @@ public class HeaderPanel extends Panel implements EventListener<Event>
|
|||
protected void createPopupMenu() {
|
||||
popMenu = new Popup();
|
||||
popMenu.setId("menuTreePopup");
|
||||
new MenuTreePanel(popMenu);
|
||||
menuTreePanel = new MenuTreePanel(popMenu);
|
||||
popMenu.setSclass("desktop-menu-popup");
|
||||
popMenu.setHeight("90%");
|
||||
popMenu.setWidth("600px");
|
||||
|
@ -82,11 +86,11 @@ public class HeaderPanel extends Panel implements EventListener<Event>
|
|||
}
|
||||
|
||||
protected void createSearchPanel() {
|
||||
MenuSearchPanel menuSearchPanel = new MenuSearchPanel(this);
|
||||
GlobalSearch globalSearch = new GlobalSearch(new MenuSearchController(menuTreePanel.getMenuTree()));
|
||||
Component stub = getFellow("menuLookup");
|
||||
stub.getParent().insertBefore(menuSearchPanel, stub);
|
||||
stub.getParent().insertBefore(globalSearch, stub);
|
||||
stub.detach();
|
||||
menuSearchPanel.setId("menuLookup");
|
||||
globalSearch.setId("menuLookup");
|
||||
}
|
||||
|
||||
public void onEvent(Event event) throws Exception {
|
||||
|
|
|
@ -62,6 +62,7 @@ import org.compiere.model.MInfoWindow;
|
|||
import org.compiere.model.MPInstance;
|
||||
import org.compiere.model.MProcess;
|
||||
import org.compiere.model.MRole;
|
||||
import org.compiere.model.MSysConfig;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.X_AD_CtxHelp;
|
||||
import org.compiere.process.ProcessInfo;
|
||||
|
@ -105,15 +106,16 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -6885406231649824253L;
|
||||
private static final long serialVersionUID = -6257894588906175658L;
|
||||
|
||||
private final static int PAGE_SIZE = 100;
|
||||
private final static int DEFAULT_PAGE_SIZE = 100;
|
||||
protected List<Button> btProcessList = new ArrayList<Button>();
|
||||
protected Map<String, WEditor> editorMap = new HashMap<String, WEditor>();
|
||||
protected final static String PROCESS_ID_KEY = "processId";
|
||||
protected final static String ON_RUN_PROCESS = "onRunProcess";
|
||||
// attribute key of info process
|
||||
protected final static String ATT_INFO_PROCESS_KEY = "INFO_PROCESS";
|
||||
protected int pageSize;
|
||||
|
||||
public static InfoPanel create (int WindowNo,
|
||||
String tableName, String keyColumn, String value,
|
||||
|
@ -183,6 +185,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
if (p_whereClause.length() == 0)
|
||||
log.log(Level.SEVERE, "Cannot parse context= " + whereClause);
|
||||
}
|
||||
|
||||
pageSize = MSysConfig.getIntValue(MSysConfig.ZK_PAGING_SIZE, DEFAULT_PAGE_SIZE);
|
||||
|
||||
init();
|
||||
|
||||
this.setAttribute(ITabOnSelectHandler.ATTRIBUTE_KEY, new ITabOnSelectHandler() {
|
||||
|
@ -221,7 +226,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
setStyle("position: absolute");
|
||||
}
|
||||
|
||||
confirmPanel = new ConfirmPanel(true, true, false, true, true, true); // Elaine 2008/12/16
|
||||
confirmPanel = new ConfirmPanel(true, true, true, true, true, true); // Elaine 2008/12/16
|
||||
confirmPanel.addActionListener(Events.ON_CLICK, this);
|
||||
confirmPanel.setHflex("1");
|
||||
|
||||
|
@ -473,12 +478,12 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
{
|
||||
if (m_count > 0)
|
||||
{
|
||||
if (m_count > PAGE_SIZE)
|
||||
if (m_count > pageSize)
|
||||
{
|
||||
if (paging == null)
|
||||
{
|
||||
paging = new Paging();
|
||||
paging.setPageSize(PAGE_SIZE);
|
||||
paging.setPageSize(pageSize);
|
||||
paging.setTotalSize(m_count);
|
||||
paging.setDetailed(true);
|
||||
paging.addEventListener(ZulEvents.ON_PAGING, this);
|
||||
|
@ -489,7 +494,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
paging.setTotalSize(m_count);
|
||||
paging.setActivePage(0);
|
||||
}
|
||||
List<Object> subList = readLine(0, PAGE_SIZE);
|
||||
List<Object> subList = readLine(0, pageSize);
|
||||
model = new ListModelTable(subList);
|
||||
model.setSorter(this);
|
||||
model.addTableModelListener(this);
|
||||
|
@ -555,7 +560,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
}
|
||||
}
|
||||
|
||||
setCacheStart(start + 1 - (PAGE_SIZE * 4));
|
||||
setCacheStart(start + 1 - (pageSize * 4));
|
||||
if (getCacheStart() <= 0)
|
||||
setCacheStart(1);
|
||||
|
||||
|
@ -565,7 +570,7 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
}
|
||||
else
|
||||
{
|
||||
cacheEnd = end + 1 + (PAGE_SIZE * 4);
|
||||
cacheEnd = end + 1 + (pageSize * 4);
|
||||
if (cacheEnd > m_count)
|
||||
cacheEnd = m_count;
|
||||
}
|
||||
|
@ -1137,6 +1142,9 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
m_cancel = true;
|
||||
dispose(false);
|
||||
}
|
||||
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_RESET))) {
|
||||
resetParameters ();
|
||||
}
|
||||
// Elaine 2008/12/16
|
||||
else if (event.getTarget().equals(confirmPanel.getButton(ConfirmPanel.A_HISTORY)))
|
||||
{
|
||||
|
@ -1201,8 +1209,8 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
contentPanel.clearSelection();
|
||||
|
||||
pageNo = pgNo;
|
||||
int start = pageNo * PAGE_SIZE;
|
||||
int end = start + PAGE_SIZE;
|
||||
int start = pageNo * pageSize;
|
||||
int end = start + pageSize;
|
||||
if (end >= m_count)
|
||||
end = m_count - 1;
|
||||
List<Object> subList = readLine(start, end);
|
||||
|
@ -1251,6 +1259,23 @@ public abstract class InfoPanel extends Window implements EventListener<Event>,
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call after load parameter panel to set init value can call when reset
|
||||
* parameter implement this method at inheritance class
|
||||
* with each parameter, remember call Env.setContext to set new value to env
|
||||
*/
|
||||
protected void initParameters() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset parameter to default value or to empty value? implement at
|
||||
* inheritance class when reset parameter maybe need init again parameter,
|
||||
* reset again default value
|
||||
*/
|
||||
protected void resetParameters() {
|
||||
}
|
||||
|
||||
void preRunProcess (Integer processId){
|
||||
// disable all control button when run process
|
||||
enableButtons(false);
|
||||
|
|
|
@ -117,8 +117,11 @@ public final class ThemeManager {
|
|||
public static org.zkoss.image.Image getClientWebLogo() throws IOException {
|
||||
MClientInfo cinfo = MClientInfo.get(Env.getCtx());
|
||||
if (cinfo.getLogoWeb_ID() > 0) {
|
||||
MImage mImage = MImage.get(Env.getCtx(), cinfo.getLogoWeb_ID());
|
||||
return new AImage(mImage.getName(), mImage.getData());
|
||||
MImage mImage = MImage.get(Env.getCtx(), cinfo.getLogoWeb_ID());
|
||||
if (mImage.getData() != null)
|
||||
return new AImage(mImage.getName(), mImage.getData());
|
||||
else
|
||||
return null;
|
||||
|
||||
/* Using different approach: ImageEncoder supports only PNG and JPEG
|
||||
Image image = mImage.getImage();
|
||||
|
|
|
@ -442,7 +442,8 @@ public final class WAccountDialog extends Window
|
|||
// Finish
|
||||
m_query = new MQuery();
|
||||
m_query.addRestriction("C_AcctSchema_ID", MQuery.EQUAL, m_C_AcctSchema_ID);
|
||||
m_query.addRestriction("IsFullyQualified", MQuery.EQUAL, "Y");
|
||||
//action_save doesn't filter by IsFullyQualified
|
||||
// m_query.addRestriction("IsFullyQualified", MQuery.EQUAL, "Y");
|
||||
if (m_mAccount.C_ValidCombination_ID == 0)
|
||||
m_mTab.setQuery(MQuery.getEqualQuery("1", "2"));
|
||||
else
|
||||
|
@ -676,7 +677,7 @@ public final class WAccountDialog extends Window
|
|||
else
|
||||
query = new MQuery();
|
||||
// Alias
|
||||
if (includeAliasCombination && f_Alias != null && f_Alias.getValue().toString().length() > 0)
|
||||
if (includeAliasCombination && f_Alias != null && !isEmpty(f_Alias))
|
||||
{
|
||||
String value = f_Alias.getValue().toString().toUpperCase();
|
||||
if (!value.endsWith("%"))
|
||||
|
@ -684,7 +685,7 @@ public final class WAccountDialog extends Window
|
|||
query.addRestriction("UPPER(Alias)", MQuery.LIKE, value);
|
||||
}
|
||||
// Combination (mandatory)
|
||||
if (includeAliasCombination && f_Combination.getValue().toString().length() > 0)
|
||||
if (includeAliasCombination && !isEmpty(f_Combination.getValue()))
|
||||
{
|
||||
String value = f_Combination.getValue().toString().toUpperCase();
|
||||
if (!value.endsWith("%"))
|
||||
|
@ -692,46 +693,46 @@ public final class WAccountDialog extends Window
|
|||
query.addRestriction("UPPER(Combination)", MQuery.LIKE, value);
|
||||
}
|
||||
// Org (mandatory)
|
||||
if (f_AD_Org_ID != null && f_AD_Org_ID.getValue() != null)
|
||||
if (f_AD_Org_ID != null && !isEmpty(f_AD_Org_ID.getValue()))
|
||||
query.addRestriction("AD_Org_ID", MQuery.EQUAL, f_AD_Org_ID.getValue());
|
||||
// Account (mandatory)
|
||||
if (f_Account_ID != null && f_Account_ID.getValue() != null)
|
||||
if (f_Account_ID != null && !isEmpty(f_Account_ID.getValue()))
|
||||
query.addRestriction("Account_ID", MQuery.EQUAL, f_Account_ID.getValue());
|
||||
if (f_SubAcct_ID != null && f_SubAcct_ID.getValue() != null)
|
||||
if (f_SubAcct_ID != null && !isEmpty(f_SubAcct_ID.getValue()))
|
||||
query.addRestriction("C_SubAcct_ID", MQuery.EQUAL, f_SubAcct_ID.getValue());
|
||||
|
||||
// Product
|
||||
if (f_M_Product_ID != null && f_M_Product_ID.getValue() != null)
|
||||
if (f_M_Product_ID != null && !isEmpty(f_M_Product_ID.getValue()))
|
||||
query.addRestriction("M_Product_ID", MQuery.EQUAL, f_M_Product_ID.getValue());
|
||||
// BPartner
|
||||
if (f_C_BPartner_ID != null && f_C_BPartner_ID.getValue() != null)
|
||||
if (f_C_BPartner_ID != null && !isEmpty(f_C_BPartner_ID.getValue()))
|
||||
query.addRestriction("C_BPartner_ID", MQuery.EQUAL, f_C_BPartner_ID.getValue());
|
||||
// Campaign
|
||||
if (f_C_Campaign_ID != null && f_C_Campaign_ID.getValue() != null)
|
||||
if (f_C_Campaign_ID != null && !isEmpty(f_C_Campaign_ID.getValue()))
|
||||
query.addRestriction("C_Campaign_ID", MQuery.EQUAL, f_C_Campaign_ID.getValue());
|
||||
// Loc From
|
||||
if (f_C_LocFrom_ID != null && f_C_LocFrom_ID.getValue() != null)
|
||||
if (f_C_LocFrom_ID != null && !isEmpty(f_C_LocFrom_ID.getValue()))
|
||||
query.addRestriction("C_LocFrom_ID", MQuery.EQUAL, f_C_LocFrom_ID.getValue());
|
||||
// Loc To
|
||||
if (f_C_LocTo_ID != null && f_C_LocTo_ID.getValue() != null)
|
||||
if (f_C_LocTo_ID != null && !isEmpty(f_C_LocTo_ID.getValue()))
|
||||
query.addRestriction("C_LocTo_ID", MQuery.EQUAL, f_C_LocTo_ID.getValue());
|
||||
// Project
|
||||
if (f_C_Project_ID != null && f_C_Project_ID.getValue() != null)
|
||||
if (f_C_Project_ID != null && !isEmpty(f_C_Project_ID.getValue()))
|
||||
query.addRestriction("C_Project_ID", MQuery.EQUAL, f_C_Project_ID.getValue());
|
||||
// SRegion
|
||||
if (f_C_SalesRegion_ID != null && f_C_SalesRegion_ID.getValue() != null)
|
||||
if (f_C_SalesRegion_ID != null && !isEmpty(f_C_SalesRegion_ID.getValue()))
|
||||
query.addRestriction("C_SalesRegion_ID", MQuery.EQUAL, f_C_SalesRegion_ID.getValue());
|
||||
// Org Trx
|
||||
if (f_AD_OrgTrx_ID != null && f_AD_OrgTrx_ID.getValue() != null)
|
||||
if (f_AD_OrgTrx_ID != null && !isEmpty(f_AD_OrgTrx_ID.getValue()))
|
||||
query.addRestriction("AD_OrgTrx_ID", MQuery.EQUAL, f_AD_OrgTrx_ID.getValue());
|
||||
// Activity
|
||||
if (f_C_Activity_ID != null && f_C_Activity_ID.getValue() != null)
|
||||
if (f_C_Activity_ID != null && !isEmpty(f_C_Activity_ID.getValue()))
|
||||
query.addRestriction("C_Activity_ID", MQuery.EQUAL, f_C_Activity_ID.getValue());
|
||||
// User 1
|
||||
if (f_User1_ID != null && f_User1_ID.getValue() != null)
|
||||
if (f_User1_ID != null && !isEmpty(f_User1_ID.getValue()))
|
||||
query.addRestriction("User1_ID", MQuery.EQUAL, f_User1_ID.getValue());
|
||||
// User 2
|
||||
if (f_User2_ID != null && f_User2_ID.getValue() != null)
|
||||
if (f_User2_ID != null && !isEmpty(f_User2_ID.getValue()))
|
||||
query.addRestriction("User2_ID", MQuery.EQUAL, f_User2_ID.getValue());
|
||||
|
||||
// Query
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
|
||||
function Calc()
|
||||
{
|
||||
this.validate = validate;
|
||||
this.validateUp = validateUp;
|
||||
this.validatePress = validatePress;
|
||||
this.clear = clear;
|
||||
this.clearAll = clearAll;
|
||||
this.evaluate = evaluate;
|
||||
this.append = append;
|
||||
|
||||
function validate(displayTextId, calcTextId, integral, separatorKey, e)
|
||||
function validatePress(displayTextId, calcTextId, integral, separatorKey, e)
|
||||
{
|
||||
var key;
|
||||
|
||||
|
@ -15,43 +16,29 @@ function Calc()
|
|||
key = e.keyCode; //IE
|
||||
else
|
||||
key = e.which; //Firefox
|
||||
|
||||
if(key == 13 || key == 61) // Enter, =
|
||||
// console.log("validatePress: " + displayTextId + " / " + calcTextId + " / " + integral + " / " + separatorKey + " / " + key);
|
||||
if (key == 61) // =
|
||||
{
|
||||
evaluate(displayTextId, calcTextId, String.fromCharCode(separatorKey));
|
||||
return false;
|
||||
}
|
||||
else if (key == 0) // control, delete, ...
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (key == 8) // backspace
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (key >= 17 && key <= 20) // Control
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (key == 32) // space
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (key >= 48 && key <= 57) // 0 - 9
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (key == 42 || key == 43 || key == 45 || key == 47) // *, +, -, /
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if ( key == separatorKey && !integral)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function validateUp(displayTextId, calcTextId, integral, separatorKey, e, processDotKeypad)
|
||||
{
|
||||
var key;
|
||||
if(window.event)
|
||||
key = e.keyCode; //IE
|
||||
else
|
||||
key = e.which; //Firefox
|
||||
// console.log("validateUp: " + displayTextId + " / " + calcTextId + " / " + integral + " / " + separatorKey + " / " + key + " / " + processDotKeypad);
|
||||
if (key == 13) // Enter
|
||||
{
|
||||
return false;
|
||||
evaluate(displayTextId, calcTextId, String.fromCharCode(separatorKey));
|
||||
}
|
||||
else if (processDotKeypad && separatorKey != 46 && (key == 110 || key == 190) && !window.opera) // numeric dot on keypad (not working for opera)
|
||||
{
|
||||
append(calcTextId, String.fromCharCode(separatorKey));
|
||||
e.stop;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,6 +76,8 @@ function Calc()
|
|||
|
||||
function evaluate(displayTextId, calcTextId, separator)
|
||||
{
|
||||
// console.log("evaluate: " + displayTextId + " / " + calcTextId + " / " + separator);
|
||||
var newValue = "error";
|
||||
try
|
||||
{
|
||||
var id = "$".concat(calcTextId);
|
||||
|
@ -99,6 +88,11 @@ function Calc()
|
|||
var re = new RegExp("[" + separator + "]", "g");
|
||||
value = value.replace(re,'.');
|
||||
}
|
||||
var reclean = new RegExp("[^1234567890+-/*%() ]", "g"); // sanitize
|
||||
value = value.replace(reclean,'');
|
||||
var reperc = new RegExp("[%]", "g"); // percentage
|
||||
value = value.replace(reperc,'/100 ');
|
||||
newValue = value;
|
||||
var result = "" + eval(value);
|
||||
if (separator != '.')
|
||||
{
|
||||
|
@ -117,6 +111,7 @@ function Calc()
|
|||
}
|
||||
catch (err)
|
||||
{
|
||||
calcText.value = newValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,3 +83,19 @@ div.z-column-cnt, div.z-grid-header div.z-auxheader-cnt {
|
|||
background-image: none !important;
|
||||
}
|
||||
|
||||
tbody.z-grid-empty-body td {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
tbody.z-listbox-empty-body td {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.z-listbox-body .z-listcell {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.z-listbox-autopaging .z-listcell-cnt {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ import org.compiere.util.CLogger;
|
|||
import org.compiere.util.DB;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Ini;
|
||||
import org.compiere.util.Language;
|
||||
import org.compiere.util.Trx;
|
||||
import org.compiere.util.Util;
|
||||
import org.jfree.io.IOUtils;
|
||||
|
@ -440,10 +441,19 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
|||
**/
|
||||
public String TO_CHAR (String columnName, int displayType, String AD_Language)
|
||||
{
|
||||
StringBuilder retValue = new StringBuilder("CAST (");
|
||||
retValue.append(columnName);
|
||||
retValue.append(" AS Text)");
|
||||
|
||||
StringBuilder retValue = null;
|
||||
if (DisplayType.isDate(displayType)) {
|
||||
retValue = new StringBuilder("TO_CHAR(");
|
||||
retValue.append(columnName)
|
||||
.append(",'")
|
||||
.append(Language.getLanguage(AD_Language).getDBdatePattern())
|
||||
.append("')");
|
||||
} else {
|
||||
retValue = new StringBuilder("CAST (");
|
||||
retValue.append(columnName);
|
||||
retValue.append(" AS Text)");
|
||||
}
|
||||
return retValue.toString();
|
||||
// Numbers
|
||||
/*
|
||||
if (DisplayType.isNumeric(displayType))
|
||||
|
@ -462,8 +472,7 @@ public class DB_PostgreSQL implements AdempiereDatabase
|
|||
.append("'");
|
||||
}
|
||||
retValue.append(")");
|
||||
//*/
|
||||
return retValue.toString();
|
||||
//*/
|
||||
} // TO_CHAR
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue