diff --git a/db/ddlutils/adempiere-model.xml b/db/ddlutils/adempiere-model.xml
new file mode 100644
index 0000000000..08bbeb2608
--- /dev/null
+++ b/db/ddlutils/adempiere-model.xml
@@ -0,0 +1,21719 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db/ddlutils/fyracle/build-ddl.properties b/db/ddlutils/fyracle/build-ddl.properties
new file mode 100644
index 0000000000..3646d29b65
--- /dev/null
+++ b/db/ddlutils/fyracle/build-ddl.properties
@@ -0,0 +1,8 @@
+lib.dir=../lib
+schemaoutputfile=../adempiere-model.xml
+schemafiles=adempiere-model.xml
+datafile=../adempiere-data.xml
+sqloutputfile=adempiere-schema.sql
+fkoutputfile=adempiere-fk.sql
+alterdatabase=false
+delimitedsqlidentifiers=true
diff --git a/db/ddlutils/fyracle/build-ddl.xml b/db/ddlutils/fyracle/build-ddl.xml
new file mode 100644
index 0000000000..36c889911c
--- /dev/null
+++ b/db/ddlutils/fyracle/build-ddl.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db/ddlutils/fyracle/build.properties b/db/ddlutils/fyracle/build.properties
new file mode 100644
index 0000000000..65c7e8a960
--- /dev/null
+++ b/db/ddlutils/fyracle/build.properties
@@ -0,0 +1,9 @@
+fyracle.home=c:/Program Files/fyracle-0.8.10
+
+fyracle.database=${basedir}/adempiere.fdb
+fyracle.user=sysdba
+fyracle.password=masterkey
+
+#it can be deployed locally only now
+fyracle.host=localhost
+fyracle.port=3050
diff --git a/db/ddlutils/fyracle/build.xml b/db/ddlutils/fyracle/build.xml
new file mode 100644
index 0000000000..95618de637
--- /dev/null
+++ b/db/ddlutils/fyracle/build.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File ${file.name} status ${plsql.result}
+
+
+
+
+
+
diff --git a/db/ddlutils/fyracle/init.sql b/db/ddlutils/fyracle/init.sql
new file mode 100644
index 0000000000..3d65990514
--- /dev/null
+++ b/db/ddlutils/fyracle/init.sql
@@ -0,0 +1,55 @@
+/** Get Character at Position */
+CREATE OR REPLACE FUNCTION charAt
+(
+ p_string VARCHAR2,
+ p_pos NUMBER
+)
+ RETURN VARCHAR2
+AS
+BEGIN
+ RETURN SUBSTR(p_string, p_pos, 1);
+END;
+/
+/** GetDate */
+CREATE OR REPLACE FUNCTION getdate
+ RETURN DATE
+AS
+BEGIN
+ RETURN SysDate;
+END;
+/
+/** First Of DD/DY/MM/Q */
+CREATE OR REPLACE FUNCTION firstOf
+(
+ p_date DATE,
+ p_datePart VARCHAR2
+)
+ RETURN DATE
+AS
+BEGIN
+ RETURN TRUNC(p_date, p_datePart);
+END;
+/
+/** Add Number of Days */
+CREATE OR REPLACE FUNCTION addDays
+(
+ p_date DATE,
+ p_days NUMBER
+)
+ RETURN DATE
+AS
+BEGIN
+ RETURN TRUNC(p_date) + p_days;
+END;
+/
+CREATE OR REPLACE FUNCTION daysBetween
+(
+ p_date1 DATE,
+ p_date2 DATE
+)
+ RETURN NUMBER
+AS
+BEGIN
+ RETURN (TRUNC(p_date1) - TRUNC(p_date2));
+END;
+/
diff --git a/db/ddlutils/fyracle/jdbc.properties.fyracle b/db/ddlutils/fyracle/jdbc.properties.fyracle
new file mode 100644
index 0000000000..bad8374fee
--- /dev/null
+++ b/db/ddlutils/fyracle/jdbc.properties.fyracle
@@ -0,0 +1,20 @@
+# JDBC properties for Fyracle
+# Note: Properties starting with "datasource." will be fed into the datasource instance of the
+# class configured via the datasource.class property
+
+# Use this property to choose the Oracle9 platform (instead of the Oracle8 default one)
+ddlutils.platform=Oracle9
+
+#
+# Using the plain DBCP datasource
+#
+
+datasource.class=org.apache.commons.dbcp.BasicDataSource
+datasource.driverClassName=org.firebirdsql.jdbc.FBDriver
+datasource.url=jdbc:firebirdsql:oracle:localhost/3050:${basedir}/adempiere.fdb
+datasource.username=sysdba
+datasource.password=masterkey
+
+# For oracle, we should limit the schema to the one of the user
+# Note that Oracle requires this to be uppercase, even when using delimited identifiers
+ddlutils.schema=ADEMPIERE
diff --git a/db/ddlutils/fyracle/log/readme.txt b/db/ddlutils/fyracle/log/readme.txt
new file mode 100644
index 0000000000..89f91c408a
--- /dev/null
+++ b/db/ddlutils/fyracle/log/readme.txt
@@ -0,0 +1,2 @@
+Folder to store log generated from build
+
diff --git a/db/ddlutils/fyracle/template.fdb b/db/ddlutils/fyracle/template.fdb
new file mode 100644
index 0000000000..1e25cd95a5
Binary files /dev/null and b/db/ddlutils/fyracle/template.fdb differ
diff --git a/db/ddlutils/fyracle/temptables.sql b/db/ddlutils/fyracle/temptables.sql
new file mode 100644
index 0000000000..1b3718755f
--- /dev/null
+++ b/db/ddlutils/fyracle/temptables.sql
@@ -0,0 +1,20 @@
+DROP TABLE T_Selection CASCADE CONSTRAINTS;
+
+CREATE GLOBAL TEMPORARY TABLE T_Selection
+(
+ T_Selection_ID NUMBER(10, 0) NOT NULL
+ CONSTRAINT T_Selection_Key PRIMARY KEY
+)
+ON COMMIT DELETE ROWS;
+
+
+DROP TABLE T_Selection2;
+
+CREATE GLOBAL TEMPORARY TABLE T_Selection2
+(
+ Query_ID NUMBER NOT NULL,
+ T_Selection_ID NUMBER(10) NOT NULL,
+ CONSTRAINT T_Selection2_Key PRIMARY KEY (Query_ID,T_Selection_ID)
+)
+ON COMMIT PRESERVE ROWS;
+
diff --git a/db/ddlutils/oracle/AfterImport.sql b/db/ddlutils/oracle/AfterImport.sql
new file mode 100644
index 0000000000..c60441e653
--- /dev/null
+++ b/db/ddlutils/oracle/AfterImport.sql
@@ -0,0 +1,112 @@
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AfterImport.sql,v 1.2 2006/05/28 22:52:07 jjanke Exp $
+ ***
+ * Title: After Import
+ * Description:
+ * - General Info
+ * - Create Context
+ * - Check Imported User and list ivalid objects
+ * You can ignore import warnings as long as this does not
+ * return error messages or records.
+ ************************************************************************/
+
+SELECT 'DB_Name=' || SYS_CONTEXT('USERENV', 'DB_NAME')
+ || ', Language=' || SYS_CONTEXT('USERENV', 'LANGUAGE')
+ || ', Host=' || SYS_CONTEXT('USERENV', 'HOST')
+ || ', IP=' || SYS_CONTEXT('USERENV', 'IP_ADDRESS')
+ || ', User=' || SYS_CONTEXT('USERENV', 'CURRENT_USER')
+ || ', ID=' || SYS_CONTEXT('USERENV', 'CURRENT_USERID')
+ || ', Session=' || SYS_CONTEXT('USERENV', 'SESSIONID')
+ AS "DBInfo"
+FROM DUAL
+/
+SET serveroutput ON
+
+-- Recompile invalids
+BEGIN
+ DBA_Cleanup();
+ DBA_AfterImport;
+-- DBA_Recompile(NULL); -- called in DBA_AfterImport
+END;
+/
+-- Correct DataFile sizing
+DECLARE
+ CURSOR Cur_TS IS
+ SELECT FILE_NAME, Tablespace_Name, Bytes/1024/1024 as MB
+ FROM DBA_DATA_FILES
+ WHERE (TABLESPACE_NAME='USERS' AND BYTES < 100*1024*1024)
+ OR (TABLESPACE_NAME='INDX' AND BYTES < 100*1024*1024)
+ OR (TABLESPACE_NAME='TEMP' AND BYTES < 100*1024*1024);
+ v_CMD VARCHAR2(300);
+BEGIN
+ FOR ts IN Cur_TS LOOP
+ DBMS_OUTPUT.PUT_LINE('Resize:');
+ v_CMD := 'ALTER DATABASE DATAFILE ''' || ts.FILE_NAME
+ || ''' RESIZE 100M';
+ DBMS_OUTPUT.PUT_LINE(' executing: ' || v_CMD);
+ EXECUTE IMMEDIATE v_CMD;
+ v_CMD := 'ALTER DATABASE DATAFILE ''' || ts.FILE_NAME
+ || ''' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED';
+ DBMS_OUTPUT.PUT_LINE(' executing: ' || v_CMD);
+ EXECUTE IMMEDIATE v_CMD;
+ END LOOP;
+END;
+/
+
+/** Database Sizing
+ ** Oracle 10g should use Automatic Shared Memory Management -
+ ** Example 300MB
+ *
+ * ALTER SYSTEM documentation
+http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_2013.htm#SQLRF00902
+ *
+SELECT Name, Value, Description, IsDefault FROM v$parameter
+WHERE Name LIKE '%cursor%' OR Name LIKE '%process%' OR NAME LIKE '%servers%' ORDER BY 1
+/
+SELECT Name, Value/1024/1024 "MB", Description, IsDefault, Update_Comment FROM v$parameter
+WHERE Name LIKE '%_pool_size' OR Name LIKE 'sga%'
+/
+ALTER SYSTEM SET statistics_level = TYPICAL Comment='Adempiere' SCOPE=BOTH
+/
+ALTER SYSTEM SET sga_target = 314572800 Comment='Adempiere' SCOPE=BOTH
+/
+ALTER SYSTEM SET open_cursors = 900 Comment='Adempiere' SCOPE=BOTH
+/
+
+/** Oracle 9i needs to set explicitly (and restart)
+ ** Example 300MB
+ALTER SYSTEM SET sga_max_size=314572800 SCOPE=SPFILE
+/
+ALTER SYSTEM SET large_pool_size=33554432 SCOPE=SPFILE
+/
+ALTER SYSTEM SET java_pool_size=67108864 SCOPE=SPFILE
+/
+/** SELECT 32*1024*1024 FROM DUAL **/
+
+-- Any invalids
+SELECT Object_Type "Type", Object_Name "Invalid", Status
+FROM User_Objects
+WHERE Status <> 'VALID'
+/
+-- Trigger Info
+SELECT Trigger_Name AS Trigger_NotEnabled, Status
+FROM User_Triggers
+WHERE Status != 'ENABLED'
+/
+-- Constraint Info
+SELECT Constraint_Name AS Constraint_Problem, Status, Validated, Table_Name, Search_Condition, R_Constraint_Name
+FROM User_Constraints
+WHERE Status <> 'ENABLED' OR Validated <> 'VALIDATED'
+/
+SELECT *
+FROM USER_ERRORS
+/
+COMMIT
+/
+EXIT
diff --git a/db/ddlutils/oracle/build-ddl.properties b/db/ddlutils/oracle/build-ddl.properties
new file mode 100644
index 0000000000..3646d29b65
--- /dev/null
+++ b/db/ddlutils/oracle/build-ddl.properties
@@ -0,0 +1,8 @@
+lib.dir=../lib
+schemaoutputfile=../adempiere-model.xml
+schemafiles=adempiere-model.xml
+datafile=../adempiere-data.xml
+sqloutputfile=adempiere-schema.sql
+fkoutputfile=adempiere-fk.sql
+alterdatabase=false
+delimitedsqlidentifiers=true
diff --git a/db/ddlutils/oracle/build-ddl.xml b/db/ddlutils/oracle/build-ddl.xml
new file mode 100644
index 0000000000..8bf269bfbe
--- /dev/null
+++ b/db/ddlutils/oracle/build-ddl.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db/ddlutils/oracle/build.properties b/db/ddlutils/oracle/build.properties
new file mode 100644
index 0000000000..495c883bfb
--- /dev/null
+++ b/db/ddlutils/oracle/build.properties
@@ -0,0 +1,4 @@
+oracle.home=C:/oracle/product/10.2.0/db_1
+
+oracle.connect.param=adempiere/adempiere@orcl
+
diff --git a/db/ddlutils/oracle/build.xml b/db/ddlutils/oracle/build.xml
new file mode 100644
index 0000000000..3fd7768fab
--- /dev/null
+++ b/db/ddlutils/oracle/build.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File ${file.name} status ${sqlplus.result}
+
+
+
+
+
+
diff --git a/db/ddlutils/oracle/functions/Acct_Balance.sql b/db/ddlutils/oracle/functions/Acct_Balance.sql
new file mode 100644
index 0000000000..7c2a551d20
--- /dev/null
+++ b/db/ddlutils/oracle/functions/Acct_Balance.sql
@@ -0,0 +1,64 @@
+CREATE OR REPLACE FUNCTION acctBalance
+(
+ p_Account_ID IN NUMBER,
+ p_AmtDr IN NUMBER,
+ p_AmtCr IN NUMBER
+)
+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-2004 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: Acct_Balance.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Aclculate Balance based on Account Sign + Type
+ * Description:
+ * If an account is specified and found
+ * - If the account sign is Natural it sets it based on Account Type
+ * Returns Credit or Debit Balance
+ * Test:
+ SELECT Acct_Balance (0,11,22) FROM DUAL
+ SELECT AccountType, AccountSign,
+ Acct_Balance(C_ElementValue_ID, 20, 10) "DR Balance",
+ Acct_Balance(C_ElementValue_ID, 10, 20) "CR Balance"
+ FROM C_ElementValue
+ WHERE AccountSign<>'N'
+ ORDER BY AccountSign
+ ************************************************************************/
+AS
+ v_balance NUMBER;
+ v_AccountType C_ElementValue.AccountType%TYPE;
+ v_AccountSign C_ElementValue.AccountSign%TYPE;
+BEGIN
+ v_balance := p_AmtDr - p_AmtCr;
+ --
+ IF (p_Account_ID > 0) THEN
+ SELECT AccountType, AccountSign
+ INTO v_AccountType, v_AccountSign
+ FROM C_ElementValue
+ WHERE C_ElementValue_ID=p_Account_ID;
+ -- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
+ -- Natural Account Sign
+ IF (v_AccountSign='N') THEN
+ IF (v_AccountType IN ('A','E')) THEN
+ v_AccountSign := 'D';
+ ELSE
+ v_AccountSign := 'C';
+ END IF;
+ -- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
+ END IF;
+ -- Debit Balance
+ IF (v_AccountSign = 'C') THEN
+ v_balance := p_AmtCr - p_AmtDr;
+ END IF;
+ END IF;
+ --
+ RETURN v_balance;
+EXCEPTION WHEN OTHERS THEN
+ -- In case Acct not found
+ RETURN p_AmtDr - p_AmtCr;
+END acctBalance;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_PriceLimit.sql b/db/ddlutils/oracle/functions/BOM_PriceLimit.sql
new file mode 100644
index 0000000000..c7f124c69c
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_PriceLimit.sql
@@ -0,0 +1,48 @@
+CREATE OR REPLACE FUNCTION bomPriceLimit
+(
+ Product_ID IN NUMBER,
+ PriceList_Version_ID IN NUMBER
+)
+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-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: BOM_PriceLimit.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return Limit Price of Product/BOM
+ * Description:
+ * if not found: 0
+ ************************************************************************/
+AS
+ v_Price NUMBER;
+ v_ProductPrice NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=Product_ID;
+ --
+BEGIN
+ -- Try to get price from PriceList directly
+ SELECT COALESCE (SUM(PriceLimit), 0)
+ INTO v_Price
+ FROM M_ProductPrice
+ WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
+-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
+
+ -- No Price - Check if BOM
+ IF (v_Price = 0) THEN
+ FOR bom IN CUR_BOM LOOP
+ v_ProductPrice := bomPriceLimit (bom.M_ProductBOM_ID, PriceList_Version_ID);
+ v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
+ END LOOP;
+ END IF;
+ --
+ RETURN v_Price;
+END bomPriceLimit;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_PriceList.sql b/db/ddlutils/oracle/functions/BOM_PriceList.sql
new file mode 100644
index 0000000000..17f42e6a09
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_PriceList.sql
@@ -0,0 +1,49 @@
+CREATE OR REPLACE FUNCTION bomPriceList
+(
+ Product_ID IN NUMBER,
+ PriceList_Version_ID IN NUMBER
+)
+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-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: BOM_PriceList.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return List Price of Product/BOM
+ * Description:
+ * if not found: 0
+ ************************************************************************/
+AS
+ v_Price NUMBER;
+ v_ProductPrice NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=Product_ID;
+ --
+BEGIN
+ -- Try to get price from pricelist directly
+ SELECT COALESCE (SUM(PriceList), 0)
+ INTO v_Price
+ FROM M_ProductPrice
+ WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
+-- DBMS_OUTPUT.PUT_LINE('Price=' || Price);
+
+ -- No Price - Check if BOM
+ IF (v_Price = 0) THEN
+ FOR bom IN CUR_BOM LOOP
+ v_ProductPrice := bomPriceList (bom.M_ProductBOM_ID, PriceList_Version_ID);
+ v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
+ -- DBMS_OUTPUT.PUT_LINE('Qry=' || bom.BOMQty || ' @ ' || v_ProductPrice || ', Price=' || v_Price);
+ END LOOP; -- BOM
+ END IF;
+ --
+ RETURN v_Price;
+END bomPriceList;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_PriceStd.sql b/db/ddlutils/oracle/functions/BOM_PriceStd.sql
new file mode 100644
index 0000000000..fde4309c6d
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_PriceStd.sql
@@ -0,0 +1,49 @@
+CREATE OR REPLACE FUNCTION bomPriceStd
+(
+ Product_ID IN NUMBER,
+ PriceList_Version_ID IN NUMBER
+)
+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-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: BOM_PriceStd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return Standard Price of Product/BOM
+ * Description:
+ * if not found: 0
+ ************************************************************************/
+AS
+ v_Price NUMBER;
+ v_ProductPrice NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=Product_ID;
+ --
+BEGIN
+ -- Try to get price from pricelist directly
+ SELECT COALESCE(SUM(PriceStd), 0)
+ INTO v_Price
+ FROM M_ProductPrice
+ WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
+-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
+
+ -- No Price - Check if BOM
+ IF (v_Price = 0) THEN
+ FOR bom IN CUR_BOM LOOP
+ v_ProductPrice := bomPriceStd (bom.M_ProductBOM_ID, PriceList_Version_ID);
+ v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
+ -- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
+ END LOOP; -- BOM
+ END IF;
+ --
+ RETURN v_Price;
+END bomPriceStd;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_Qty_Available.sql b/db/ddlutils/oracle/functions/BOM_Qty_Available.sql
new file mode 100644
index 0000000000..3d7d50eefd
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_Qty_Available.sql
@@ -0,0 +1,21 @@
+CREATE OR REPLACE FUNCTION bomQtyAvailable
+(
+ Product_ID IN NUMBER,
+ Warehouse_ID IN NUMBER,
+ Locator_ID IN NUMBER -- Only used, if warehouse is null
+)
+RETURN NUMBER
+/******************************************************************************
+ * ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Compiere" to
+ * your product name; See license details http://www.compiere.org/license.html
+ ******************************************************************************
+ * Return quantity available for BOM
+ */
+AS
+BEGIN
+ RETURN bomQtyOnHand(Product_ID, Warehouse_ID, Locator_ID)
+ - bomQtyReserved(Product_ID, Warehouse_ID, Locator_ID);
+END bomQtyAvailable;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_Qty_OnHand.sql b/db/ddlutils/oracle/functions/BOM_Qty_OnHand.sql
new file mode 100644
index 0000000000..a741dfc695
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_Qty_OnHand.sql
@@ -0,0 +1,120 @@
+CREATE OR REPLACE FUNCTION bomQtyOnHand
+(
+ Product_ID IN NUMBER,
+ Warehouse_ID IN NUMBER,
+ Locator_ID IN NUMBER -- Only used, if warehouse is null
+)
+RETURN NUMBER
+/******************************************************************************
+ * ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Compiere" to
+ * your product name; See license details http://www.compiere.org/license.html
+ ******************************************************************************
+ * Return quantity on hand for BOM
+ */
+AS
+ myWarehouse_ID NUMBER;
+ Quantity NUMBER := 99999; -- unlimited
+ IsBOM CHAR(1);
+ IsStocked CHAR(1);
+ ProductType CHAR(1);
+ ProductQty NUMBER;
+ StdPrecision NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=Product_ID;
+ --
+BEGIN
+ -- Check Parameters
+ myWarehouse_ID := Warehouse_ID;
+ IF (myWarehouse_ID IS NULL) THEN
+ IF (Locator_ID IS NULL) THEN
+ RETURN 0;
+ ELSE
+ SELECT SUM(M_Warehouse_ID) INTO myWarehouse_ID
+ FROM M_Locator
+ WHERE M_Locator_ID=Locator_ID;
+ END IF;
+ END IF;
+ IF (myWarehouse_ID IS NULL) THEN
+ RETURN 0;
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || myWarehouse_ID);
+
+ -- Check, if product exists and if it is stocked
+ BEGIN
+ SELECT IsBOM, ProductType, IsStocked
+ INTO IsBOM, ProductType, IsStocked
+ FROM M_Product
+ WHERE M_Product_ID=Product_ID;
+ --
+ EXCEPTION -- not found
+ WHEN OTHERS THEN
+ RETURN 0;
+ END;
+ -- Unimited capacity if no item
+ IF (IsBOM='N' AND (ProductType<>'I' OR IsStocked='N')) THEN
+ RETURN Quantity;
+ -- Stocked item
+ ELSIF (IsStocked='Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyOnHand), 0)
+ INTO ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=Product_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=myWarehouse_ID);
+ --
+ -- DBMS_OUTPUT.PUT_LINE('Qty=' || ProductQty);
+ RETURN ProductQty;
+ END IF;
+
+ -- Go though BOM
+-- DBMS_OUTPUT.PUT_LINE('BOM');
+ FOR bom IN CUR_BOM LOOP
+ -- Stocked Items "leaf node"
+ IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyOnHand), 0)
+ INTO ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=bom.M_ProductBOM_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=myWarehouse_ID);
+ -- Get Rounding Precision
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
+ -- How much can we make with this product
+ ProductQty := ROUND (ProductQty/bom.BOMQty, StdPrecision);
+ -- How much can we make overall
+ IF (ProductQty < Quantity) THEN
+ Quantity := ProductQty;
+ END IF;
+ -- Another BOM
+ ELSIF (bom.IsBOM = 'Y') THEN
+ ProductQty := bomQtyOnHand (bom.M_ProductBOM_ID, myWarehouse_ID, Locator_ID);
+ -- How much can we make overall
+ IF (ProductQty < Quantity) THEN
+ Quantity := ProductQty;
+ END IF;
+ END IF;
+ END LOOP; -- BOM
+
+ IF (Quantity > 0) THEN
+ -- Get Rounding Precision for Product
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=Product_ID;
+ --
+ RETURN ROUND (Quantity, StdPrecision);
+ END IF;
+ RETURN 0;
+END bomQtyOnHand;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_Qty_Ordered.sql b/db/ddlutils/oracle/functions/BOM_Qty_Ordered.sql
new file mode 100644
index 0000000000..292cd936a5
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_Qty_Ordered.sql
@@ -0,0 +1,126 @@
+CREATE OR REPLACE FUNCTION bomQtyOrdered
+(
+ p_Product_ID IN NUMBER,
+ p_Warehouse_ID IN NUMBER,
+ p_Locator_ID IN NUMBER -- Only used, if warehouse is null
+)
+RETURN NUMBER
+/******************************************************************************
+ * ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Compiere" to
+ * your product name; See license details http://www.compiere.org/license.html
+ ******************************************************************************
+ * Return quantity ordered for BOM
+ */
+AS
+ v_Warehouse_ID NUMBER;
+ v_Quantity NUMBER := 99999; -- unlimited
+ v_IsBOM CHAR(1);
+ v_IsStocked CHAR(1);
+ v_ProductType CHAR(1);
+ v_ProductQty NUMBER;
+ v_StdPrecision NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=p_Product_ID;
+ --
+BEGIN
+ -- Check Parameters
+ v_Warehouse_ID := p_Warehouse_ID;
+ IF (v_Warehouse_ID IS NULL) THEN
+ IF (p_Locator_ID IS NULL) THEN
+ RETURN 0;
+ ELSE
+ SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
+ FROM M_Locator
+ WHERE M_Locator_ID=p_Locator_ID;
+ END IF;
+ END IF;
+ IF (v_Warehouse_ID IS NULL) THEN
+ RETURN 0;
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
+
+ -- Check, if product exists and if it is stocked
+ BEGIN
+ SELECT IsBOM, ProductType, IsStocked
+ INTO v_IsBOM, v_ProductType, v_IsStocked
+ FROM M_Product
+ WHERE M_Product_ID=p_Product_ID;
+ --
+ EXCEPTION -- not found
+ WHEN OTHERS THEN
+ RETURN 0;
+ END;
+
+ -- No reservation for non-stocked
+ IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
+ RETURN 0;
+ -- Stocked item
+ ELSIF (v_IsStocked='Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyOrdered), 0)
+ INTO v_ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=p_Product_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=v_Warehouse_ID);
+ --
+ RETURN v_ProductQty;
+ END IF;
+
+ -- Go though BOM
+-- DBMS_OUTPUT.PUT_LINE('BOM');
+ FOR bom IN CUR_BOM LOOP
+ -- Stocked Items "leaf node"
+ IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyOrdered), 0)
+ INTO v_ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=bom.M_ProductBOM_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=v_Warehouse_ID);
+ -- Get Rounding Precision
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO v_StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
+ -- How much can we make with this product
+ v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
+ -- How much can we make overall
+ IF (v_ProductQty < v_Quantity) THEN
+ v_Quantity := v_ProductQty;
+ END IF;
+ -- Another BOM
+ ELSIF (bom.IsBOM = 'Y') THEN
+ v_ProductQty := bomQtyOrdered (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
+ -- How much can we make overall
+ IF (v_ProductQty < v_Quantity) THEN
+ v_Quantity := v_ProductQty;
+ END IF;
+ END IF;
+ END LOOP; -- BOM
+
+ -- Unlimited (e.g. only services)
+ IF (v_Quantity = 99999) THEN
+ RETURN 0;
+ END IF;
+
+ IF (v_Quantity > 0) THEN
+ -- Get Rounding Precision for Product
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO v_StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
+ --
+ RETURN ROUND (v_Quantity, v_StdPrecision);
+ END IF;
+ --
+ RETURN 0;
+END bomQtyOrdered;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/BOM_Qty_Reserved.sql b/db/ddlutils/oracle/functions/BOM_Qty_Reserved.sql
new file mode 100644
index 0000000000..73e9f0b1f8
--- /dev/null
+++ b/db/ddlutils/oracle/functions/BOM_Qty_Reserved.sql
@@ -0,0 +1,125 @@
+CREATE OR REPLACE FUNCTION bomQtyReserved
+(
+ p_Product_ID IN NUMBER,
+ p_Warehouse_ID IN NUMBER,
+ p_Locator_ID IN NUMBER -- Only used, if warehouse is null
+)
+RETURN NUMBER
+/******************************************************************************
+ * ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Compiere" to
+ * your product name; See license details http://www.compiere.org/license.html
+ ******************************************************************************
+ * Return quantity reserved for BOM
+ */
+AS
+ v_Warehouse_ID NUMBER;
+ v_Quantity NUMBER := 99999; -- unlimited
+ v_IsBOM CHAR(1);
+ v_IsStocked CHAR(1);
+ v_ProductType CHAR(1);
+ v_ProductQty NUMBER;
+ v_StdPrecision NUMBER;
+ -- Get BOM Product info
+ CURSOR CUR_BOM IS
+ SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
+ FROM M_Product_BOM b, M_Product p
+ WHERE b.M_ProductBOM_ID=p.M_Product_ID
+ AND b.M_Product_ID=p_Product_ID;
+ --
+BEGIN
+ -- Check Parameters
+ v_Warehouse_ID := p_Warehouse_ID;
+ IF (v_Warehouse_ID IS NULL) THEN
+ IF (p_Locator_ID IS NULL) THEN
+ RETURN 0;
+ ELSE
+ SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
+ FROM M_Locator
+ WHERE M_Locator_ID=p_Locator_ID;
+ END IF;
+ END IF;
+ IF (v_Warehouse_ID IS NULL) THEN
+ RETURN 0;
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
+
+ -- Check, if product exists and if it is stocked
+ BEGIN
+ SELECT IsBOM, ProductType, IsStocked
+ INTO v_IsBOM, v_ProductType, v_IsStocked
+ FROM M_Product
+ WHERE M_Product_ID=p_Product_ID;
+ --
+ EXCEPTION -- not found
+ WHEN OTHERS THEN
+ RETURN 0;
+ END;
+
+ -- No reservation for non-stocked
+ IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
+ RETURN 0;
+ -- Stocked item
+ ELSIF (v_IsStocked='Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyReserved), 0)
+ INTO v_ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=p_Product_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=v_Warehouse_ID);
+ --
+ RETURN v_ProductQty;
+ END IF;
+
+ -- Go though BOM
+-- DBMS_OUTPUT.PUT_LINE('BOM');
+ FOR bom IN CUR_BOM LOOP
+ -- Stocked Items "leaf node"
+ IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
+ -- Get ProductQty
+ SELECT NVL(SUM(QtyReserved), 0)
+ INTO v_ProductQty
+ FROM M_Storage s
+ WHERE M_Product_ID=bom.M_ProductBOM_ID
+ AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=v_Warehouse_ID);
+ -- Get Rounding Precision
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO v_StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
+ -- How much can we make with this product
+ v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
+ -- How much can we make overall
+ IF (v_ProductQty < v_Quantity) THEN
+ v_Quantity := v_ProductQty;
+ END IF;
+ -- Another BOM
+ ELSIF (bom.IsBOM = 'Y') THEN
+ v_ProductQty := bomQtyReserved (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
+ -- How much can we make overall
+ IF (v_ProductQty < v_Quantity) THEN
+ v_Quantity := v_ProductQty;
+ END IF;
+ END IF;
+ END LOOP; -- BOM
+
+ -- Unlimited (e.g. only services)
+ IF (v_Quantity = 99999) THEN
+ RETURN 0;
+ END IF;
+
+ IF (v_Quantity > 0) THEN
+ -- Get Rounding Precision for Product
+ SELECT NVL(MAX(u.StdPrecision), 0)
+ INTO v_StdPrecision
+ FROM C_UOM u, M_Product p
+ WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
+ --
+ RETURN ROUND (v_Quantity, v_StdPrecision);
+ END IF;
+ RETURN 0;
+END bomQtyReserved;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_BPartner_RemitLocation.SQL b/db/ddlutils/oracle/functions/C_BPartner_RemitLocation.SQL
new file mode 100644
index 0000000000..62aec19390
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_BPartner_RemitLocation.SQL
@@ -0,0 +1,34 @@
+CREATE OR REPLACE FUNCTION bpartnerRemitLocation
+(
+ p_C_BPartner_ID C_BPartner.C_BPartner_ID%TYPE
+)
+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-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: C_BPartner_RemitLocation.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return the first RemitTo C_Location_ID of a Business Partner
+ * Description:
+ *
+ ************************************************************************/
+AS
+ v_C_Location_ID NUMBER := NULL;
+ CURSOR CUR_BPLoc IS
+ SELECT IsRemitTo, C_Location_ID
+ FROM C_BPartner_Location
+ WHERE C_BPartner_ID=p_C_BPartner_ID
+ ORDER BY IsRemitTo DESC;
+BEGIN
+ FOR l IN CUR_BPLoc LOOP
+ IF (v_C_Location_ID IS NULL) THEN
+ v_C_Location_ID := l.C_Location_ID;
+ END IF;
+ END LOOP;
+ RETURN v_C_Location_ID;
+END bpartnerRemitLocation;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Base_Convert.sql b/db/ddlutils/oracle/functions/C_Base_Convert.sql
new file mode 100644
index 0000000000..de6151cb81
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Base_Convert.sql
@@ -0,0 +1,47 @@
+CREATE OR REPLACE FUNCTION currencyBase
+(
+ p_Amount IN NUMBER,
+ p_CurFrom_ID IN NUMBER,
+ p_ConvDate IN DATE,
+ p_Client_ID IN NUMBER,
+ p_Org_ID IN NUMBER
+)
+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_Base_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Convert Amount to Base Currency of Client
+ * Description:
+ * Get CurrencyTo from Client
+ * Returns NULL, if conversion not found
+ * Standard Rounding
+ * Test:
+ * SELECT C_Base_Convert(100,116,11,null) FROM DUAL => 64.72
+ ************************************************************************/
+AS
+ v_CurTo_ID NUMBER;
+BEGIN
+ -- Get Currency
+ SELECT MAX(ac.C_Currency_ID)
+ INTO v_CurTo_ID
+ FROM AD_ClientInfo ci, C_AcctSchema ac
+ WHERE ci.C_AcctSchema1_ID=ac.C_AcctSchema_ID
+ AND ci.AD_Client_ID=p_Client_ID;
+ -- Same as Currency_Conversion - if currency/rate not found - return 0
+ IF (v_CurTo_ID IS NULL) THEN
+ RETURN NULL;
+ END IF;
+ -- Same currency
+ IF (p_CurFrom_ID = v_CurTo_ID) THEN
+ RETURN p_Amount;
+ END IF;
+
+ RETURN currencyConvert (p_Amount, p_CurFrom_ID, v_CurTo_ID, p_ConvDate, null, p_Client_ID, p_Org_ID);
+END currencyBase;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Currency_Convert.sql b/db/ddlutils/oracle/functions/C_Currency_Convert.sql
new file mode 100644
index 0000000000..e7d9961913
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Currency_Convert.sql
@@ -0,0 +1,51 @@
+CREATE OR REPLACE FUNCTION currencyConvert
+(
+ p_Amount IN NUMBER,
+ p_CurFrom_ID IN NUMBER,
+ p_CurTo_ID IN NUMBER,
+ p_ConvDate IN DATE,
+ p_ConversionType_ID IN NUMBER,
+ p_Client_ID IN NUMBER,
+ p_Org_ID IN NUMBER
+)
+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_Currency_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Convert Amount (using IDs)
+ * Description:
+ * from CurrencyFrom_ID to CurrencyTo_ID
+ * Returns NULL, if conversion not found
+ * Standard Rounding
+ * Test:
+ * SELECT C_Currency_Convert(100,116,100,null,null) FROM DUAL => 64.72
+ * SELECT C_Currency_Convert(100,116,100) FROM DUAL => 64.72
+ ************************************************************************/
+AS
+ v_Rate NUMBER;
+BEGIN
+ -- Return Amount
+ IF (p_Amount = 0 OR p_CurFrom_ID = p_CurTo_ID) THEN
+ RETURN p_Amount;
+ END IF;
+ -- Return NULL
+ IF (p_Amount IS NULL OR p_CurFrom_ID IS NULL OR p_CurTo_ID IS NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ -- Get Rate
+ v_Rate := currencyRate (p_CurFrom_ID, p_CurTo_ID, p_ConvDate, p_ConversionType_ID, p_Client_ID, p_Org_ID);
+ IF (v_Rate IS NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ -- Standard Precision
+ RETURN currencyRound(p_Amount * v_Rate, p_CurTo_ID, null);
+END currencyConvert;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Currency_Rate.sql b/db/ddlutils/oracle/functions/C_Currency_Rate.sql
new file mode 100644
index 0000000000..2f047d2277
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Currency_Rate.sql
@@ -0,0 +1,171 @@
+CREATE OR REPLACE FUNCTION currencyRate
+(
+ p_CurFrom_ID IN NUMBER,
+ p_CurTo_ID IN NUMBER,
+ p_ConvDate IN DATE,
+ p_ConversionType_ID IN NUMBER,
+ p_Client_ID IN NUMBER,
+ p_Org_ID IN NUMBER
+)
+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_Currency_Rate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return Conversion Rate
+ * Description:
+ * from CurrencyFrom_ID to CurrencyTo_ID
+ * Returns NULL, if rate not found
+ * Test
+ * SELECT C_Currency_Rate(116, 100, null, null) FROM DUAL; => .647169
+ * SELECT C_Currency_Rate(116, 100) FROM DUAL; => .647169
+ ************************************************************************/
+AS
+ -- Currency From variables
+ cf_IsEuro CHAR(1);
+ cf_IsEMUMember CHAR(1);
+ cf_EMUEntryDate DATE;
+ cf_EMURate NUMBER;
+ -- Currency To variables
+ ct_IsEuro CHAR(1);
+ ct_IsEMUMember CHAR(1);
+ ct_EMUEntryDate DATE;
+ ct_EMURate NUMBER;
+ -- Triangle
+ v_CurrencyFrom NUMBER;
+ v_CurrencyTo NUMBER;
+ v_CurrencyEuro NUMBER;
+ --
+ v_ConvDate DATE := SysDate;
+ v_ConversionType_ID NUMBER := 0;
+ v_Rate NUMBER;
+BEGIN
+ -- No Conversion
+ IF (p_CurFrom_ID = p_CurTo_ID) THEN
+ RETURN 1;
+ END IF;
+ -- Default Date Parameter
+ IF (p_ConvDate IS NOT NULL) THEN
+ v_ConvDate := p_ConvDate; -- SysDate
+ END IF;
+ -- Default Conversion Type
+ IF (p_ConversionType_ID IS NULL OR p_ConversionType_ID = 0) THEN
+ BEGIN
+ SELECT C_ConversionType_ID
+ INTO v_ConversionType_ID
+ FROM C_ConversionType
+ WHERE IsDefault='Y'
+ AND AD_Client_ID IN (0,p_Client_ID)
+ AND ROWNUM=1
+ ORDER BY AD_Client_ID DESC;
+ EXCEPTION WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE('Conversion Type Not Found');
+ END;
+ ELSE
+ v_ConversionType_ID := p_ConversionType_ID;
+ END IF;
+
+ -- Get Currency Info
+ SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
+ INTO cf_IsEuro, cf_IsEMUMember, cf_EMUEntryDate, cf_EMURate
+ FROM C_Currency
+ WHERE C_Currency_ID = p_CurFrom_ID;
+ -- Not Found
+ IF (cf_IsEuro IS NULL) THEN
+ DBMS_OUTPUT.PUT_LINE('From Currency Not Found');
+ RETURN NULL;
+ END IF;
+ SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
+ INTO ct_IsEuro, ct_IsEMUMember, ct_EMUEntryDate, ct_EMURate
+ FROM C_Currency
+ WHERE C_Currency_ID = p_CurTo_ID;
+ -- Not Found
+ IF (ct_IsEuro IS NULL) THEN
+ DBMS_OUTPUT.PUT_LINE('To Currency Not Found');
+ RETURN NULL;
+ END IF;
+
+ -- Fixed - From Euro to EMU
+ IF (cf_IsEuro = 'Y' AND ct_IsEMUMember ='Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
+ RETURN ct_EMURate;
+ END IF;
+
+ -- Fixed - From EMU to Euro
+ IF (ct_IsEuro = 'Y' AND cf_IsEMUMember ='Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
+ RETURN 1 / cf_EMURate;
+ END IF;
+
+ -- Fixed - From EMU to EMU
+ IF (cf_IsEMUMember = 'Y' AND cf_IsEMUMember ='Y'
+ AND v_ConvDate >= cf_EMUEntryDate AND v_ConvDate >= ct_EMUEntryDate) THEN
+ RETURN ct_EMURate / cf_EMURate;
+ END IF;
+
+ -- Flexible Rates
+ v_CurrencyFrom := p_CurFrom_ID;
+ v_CurrencyTo := p_CurTo_ID;
+
+ -- if EMU Member involved, replace From/To Currency
+ IF ((cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate)
+ OR (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate)) THEN
+ SELECT MAX(C_Currency_ID)
+ INTO v_CurrencyEuro
+ FROM C_Currency
+ WHERE IsEuro = 'Y';
+ -- Conversion Rate not Found
+ IF (v_CurrencyEuro IS NULL) THEN
+ DBMS_OUTPUT.PUT_LINE('Euro Not Found');
+ RETURN NULL;
+ END IF;
+ IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
+ v_CurrencyFrom := v_CurrencyEuro;
+ ELSE
+ v_CurrencyTo := v_CurrencyEuro;
+ END IF;
+ END IF;
+
+ -- Get Rate
+ DECLARE
+ CURSOR CUR_Rate IS
+ SELECT MultiplyRate
+ FROM C_Conversion_Rate
+ WHERE C_Currency_ID=v_CurrencyFrom AND C_Currency_ID_To=v_CurrencyTo
+ AND C_ConversionType_ID=v_ConversionType_ID
+ AND v_ConvDate BETWEEN ValidFrom AND ValidTo
+ AND AD_Client_ID IN (0,p_Client_ID) AND AD_Org_ID IN (0,p_Org_ID)
+ ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC;
+ BEGIN
+ FOR c IN CUR_Rate LOOP
+ v_Rate := c.MultiplyRate;
+ EXIT; -- only first
+ END LOOP;
+ END;
+ -- Not found
+ IF (v_Rate IS NULL) THEN
+ DBMS_OUTPUT.PUT_LINE('Conversion Rate Not Found');
+ RETURN NULL;
+ END IF;
+
+ -- Currency From was EMU
+ IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
+ RETURN v_Rate / cf_EMURate;
+ END IF;
+
+ -- Currency To was EMU
+ IF (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
+ RETURN v_Rate * ct_EMURate;
+ END IF;
+
+ RETURN v_Rate;
+
+EXCEPTION WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE(SQLERRM);
+ RETURN NULL;
+
+END currencyRate;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Currency_Round.SQL b/db/ddlutils/oracle/functions/C_Currency_Round.SQL
new file mode 100644
index 0000000000..9101a733a0
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Currency_Round.SQL
@@ -0,0 +1,49 @@
+CREATE OR REPLACE FUNCTION currencyRound
+(
+ p_Amount IN NUMBER,
+ p_CurTo_ID IN NUMBER,
+ p_Costing IN VARCHAR2 -- Default 'N'
+)
+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_Currency_Round.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Round amount for Traget Currency
+ * Description:
+ * Round Amount using Costing or Standard Precision
+ * Returns unmodified amount if currency not found
+ * Test:
+ * SELECT C_Currency_Round(C_Currency_Convert(100,116,100,null,null),100,null) FROM DUAL => 64.72
+ ************************************************************************/
+AS
+ v_StdPrecision NUMBER;
+ v_CostPrecision NUMBER;
+BEGIN
+ -- Nothing to convert
+ IF (p_Amount IS NULL OR p_CurTo_ID IS NULL) THEN
+ RETURN p_Amount;
+ END IF;
+
+ -- Ger Precision
+ SELECT MAX(StdPrecision), MAX(CostingPrecision)
+ INTO v_StdPrecision, v_CostPrecision
+ FROM C_Currency
+ WHERE C_Currency_ID = p_CurTo_ID;
+ -- Currency Not Found
+ IF (v_StdPrecision IS NULL) THEN
+ RETURN p_Amount;
+ END IF;
+
+ IF (p_Costing = 'Y') THEN
+ RETURN ROUND (p_Amount, v_CostPrecision);
+ END IF;
+
+ RETURN ROUND (p_Amount, v_StdPrecision);
+END currencyRound;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Invoice_Discount.sql b/db/ddlutils/oracle/functions/C_Invoice_Discount.sql
new file mode 100644
index 0000000000..797ae2dc48
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Invoice_Discount.sql
@@ -0,0 +1,74 @@
+CREATE OR REPLACE FUNCTION invoiceDiscount
+(
+ p_C_Invoice_ID IN NUMBER,
+ p_PayDate IN DATE,
+ p_C_InvoicePaySchedule_ID IN NUMBER
+)
+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_Invoice_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Calculate Payment Discount Amount
+ * Description:
+ * - Calculate discountable amount (i.e. with or without tax)
+ * - Calculate and return payment discount
+ ************************************************************************/
+AS
+ v_Amount NUMBER;
+ v_IsDiscountLineAmt CHAR(1);
+ v_GrandTotal NUMBER;
+ v_TotalLines NUMBER;
+ v_C_PaymentTerm_ID NUMBER(10);
+ v_DocDate DATE;
+ v_PayDate DATE := SysDate;
+ v_IsPayScheduleValid CHAR(1);
+
+BEGIN
+ SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines,
+ i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid
+ INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines,
+ v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid
+ FROM AD_ClientInfo ci, C_Invoice i
+ WHERE ci.AD_Client_ID=i.AD_Client_ID
+ AND i.C_Invoice_ID=p_C_Invoice_ID;
+ -- What Amount is the Discount Base?
+ IF (v_IsDiscountLineAmt = 'Y') THEN
+ v_Amount := v_TotalLines;
+ ELSE
+ v_Amount := v_GrandTotal;
+ END IF;
+
+ -- Anything to discount?
+ IF (v_Amount = 0) THEN
+ RETURN 0;
+ END IF;
+ IF (p_PayDate IS NOT NULL) THEN
+ v_PayDate := p_PayDate;
+ END IF;
+
+ -- Valid Payment Schedule
+ IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN
+ SELECT COALESCE(MAX(DiscountAmt),0)
+ INTO v_Amount
+ FROM C_InvoicePaySchedule
+ WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
+ AND DiscountDate <= v_PayDate;
+ --
+ RETURN v_Amount;
+ END IF;
+
+ -- return discount amount
+ RETURN paymentTermDiscount (v_Amount, 0, v_C_PaymentTerm_ID, v_DocDate, p_PayDate);
+
+-- Most likely if invoice not found
+EXCEPTION
+ WHEN OTHERS THEN
+ RETURN NULL;
+END invoiceDiscount;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Invoice_Open.sql b/db/ddlutils/oracle/functions/C_Invoice_Open.sql
new file mode 100644
index 0000000000..28bf8049ad
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Invoice_Open.sql
@@ -0,0 +1,115 @@
+CREATE OR REPLACE FUNCTION invoiceOpen
+(
+ p_C_Invoice_ID IN NUMBER,
+ p_C_InvoicePaySchedule_ID IN NUMBER
+)
+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_Invoice_Open.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Calculate Open Item Amount in Invoice Currency
+ * Description:
+ * Add up total amount open for C_Invoice_ID if no split payment.
+ * Grand Total minus Sum of Allocations in Invoice Currency
+ *
+ * For Split Payments:
+ * Allocate Payments starting from first schedule.
+
+SELECT C_Invoice_Open (109) FROM DUAL;
+SELECT C_Invoice_Open (109, null) FROM DUAL;
+SELECT C_Invoice_Open (109, 11) FROM DUAL;
+SELECT C_Invoice_Open (109, 102) FROM DUAL;
+SELECT C_Invoice_Open (109, 103) FROM DUAL;
+SELECT * FROM RV_OpenItem WHERE C_Invoice_ID=109;
+SELECT C_InvoicePaySchedule_ID, DueAmt FROM C_InvoicePaySchedule WHERE C_Invoice_ID=109 ORDER BY DueDate;
+
+ * Cannot be used for IsPaid as mutating
+ ************************************************************************/
+AS
+ v_Currency_ID NUMBER(10);
+ v_TotalOpenAmt NUMBER := 0;
+ v_PaidAmt NUMBER := 0;
+ v_Remaining NUMBER := 0;
+ v_MultiplierAP NUMBER := 0;
+ v_MultiplierCM NUMBER := 0;
+ v_Temp NUMBER := 0;
+ --
+ CURSOR Cur_Alloc IS
+ SELECT a.AD_Client_ID, a.AD_Org_ID,
+ al.Amount, al.DiscountAmt, al.WriteOffAmt,
+ a.C_Currency_ID, a.DateTrx
+ FROM C_AllocationLine al
+ INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
+ WHERE al.C_Invoice_ID = p_C_Invoice_ID
+ AND a.IsActive='Y';
+ --
+ CURSOR Cur_PaySchedule IS
+ SELECT C_InvoicePaySchedule_ID, DueAmt
+ FROM C_InvoicePaySchedule
+ WHERE C_Invoice_ID = p_C_Invoice_ID
+ AND IsValid='Y'
+ ORDER BY DueDate;
+
+BEGIN
+ -- Get Currency
+ BEGIN
+ SELECT MAX(C_Currency_ID), SUM(GrandTotal), MAX(MultiplierAP), MAX(Multiplier)
+ INTO v_Currency_ID, v_TotalOpenAmt, v_MultiplierAP, v_MultiplierCM
+ FROM C_Invoice_v -- corrected for CM / Split Payment
+ WHERE C_Invoice_ID = p_C_Invoice_ID;
+ EXCEPTION -- Invoice in draft form
+ WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE('InvoiceOpen - ' || SQLERRM);
+ RETURN NULL;
+ END;
+-- DBMS_OUTPUT.PUT_LINE('== C_Invoice_ID=' || p_C_Invoice_ID || ', Total=' || v_TotalOpenAmt || ', AP=' || v_MultiplierAP || ', CM=' || v_MultiplierCM);
+
+ -- Calculate Allocated Amount
+ FOR a IN Cur_Alloc LOOP
+ v_Temp := a.Amount + a.DisCountAmt + a.WriteOffAmt;
+ v_PaidAmt := v_PaidAmt
+ -- Allocation
+ + currencyConvert(v_Temp * v_MultiplierAP,
+ a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
+ DBMS_OUTPUT.PUT_LINE(' PaidAmt=' || v_PaidAmt || ', Allocation=' || v_Temp || ' * ' || v_MultiplierAP);
+ END LOOP;
+
+ -- Do we have a Payment Schedule ?
+ IF (p_C_InvoicePaySchedule_ID > 0) THEN -- if not valid = lists invoice amount
+ v_Remaining := v_PaidAmt;
+ FOR s IN Cur_PaySchedule LOOP
+ IF (s.C_InvoicePaySchedule_ID = p_C_InvoicePaySchedule_ID) THEN
+ v_TotalOpenAmt := (s.DueAmt*v_MultiplierCM) + v_Remaining;
+ IF (s.DueAmt - v_Remaining < 0) THEN
+ v_TotalOpenAmt := 0;
+ END IF;
+ -- DBMS_OUTPUT.PUT_LINE('Sched Total=' || v_TotalOpenAmt || ', Due=' || s.DueAmt || ',Remaining=' || v_Remaining || ',CM=' || v_MultiplierCM);
+ ELSE -- calculate amount, which can be allocated to next schedule
+ v_Remaining := v_Remaining - s.DueAmt;
+ IF (v_Remaining < 0) THEN
+ v_Remaining := 0;
+ END IF;
+ -- DBMS_OUTPUT.PUT_LINE('Remaining=' || v_Remaining);
+ END IF;
+ END LOOP;
+ ELSE
+ v_TotalOpenAmt := v_TotalOpenAmt - v_PaidAmt;
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE('== Total=' || v_TotalOpenAmt);
+
+ -- Ignore Rounding
+ IF (v_TotalOpenAmt BETWEEN -0.00999 AND 0.00999) THEN
+ v_TotalOpenAmt := 0;
+ END IF;
+
+ -- Round to penny
+ v_TotalOpenAmt := ROUND(COALESCE(v_TotalOpenAmt,0), 2);
+ RETURN v_TotalOpenAmt;
+END invoiceOpen;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Invoice_Paid.sql b/db/ddlutils/oracle/functions/C_Invoice_Paid.sql
new file mode 100644
index 0000000000..bfc4d675bc
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Invoice_Paid.sql
@@ -0,0 +1,60 @@
+CREATE OR REPLACE FUNCTION invoicePaid
+(
+ p_C_Invoice_ID IN NUMBER,
+ p_C_Currency_ID IN NUMBER,
+ p_MultiplierAP IN NUMBER -- DEFAULT 1
+)
+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_Invoice_Paid.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Calculate Paid/Allocated amount in Currency
+ * Description:
+ * Add up total amount paid for for C_Invoice_ID.
+ * Split Payments are ignored.
+ * all allocation amounts converted to invoice C_Currency_ID
+ * round it to the nearest cent
+ * and adjust for CreditMemos by using C_Invoice_v
+ * and for Payments with the multiplierAP (-1, 1)
+ *
+ SELECT C_Invoice_ID, IsPaid, IsSOTrx, GrandTotal,
+ C_Invoice_Paid (C_Invoice_ID, C_Currency_ID, MultiplierAP)
+ FROM C_Invoice_v;
+ --
+ UPDATE C_Invoice_v1
+ SET IsPaid = CASE WHEN C_Invoice_Paid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
+ WHERE C_Invoice_ID>1000000
+ *
+ ************************************************************************/
+AS
+ v_MultiplierAP NUMBER := 1;
+ v_PaymentAmt NUMBER := 0;
+ CURSOR Cur_Alloc IS
+ SELECT a.AD_Client_ID, a.AD_Org_ID,
+ al.Amount, al.DiscountAmt, al.WriteOffAmt,
+ a.C_Currency_ID, a.DateTrx
+ FROM C_AllocationLine al
+ INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
+ WHERE al.C_Invoice_ID = p_C_Invoice_ID
+ AND a.IsActive='Y';
+BEGIN
+ -- Default
+ IF (p_MultiplierAP IS NOT NULL) THEN
+ v_MultiplierAP := p_MultiplierAP;
+ END IF;
+ -- Calculate Allocated Amount
+ FOR a IN Cur_Alloc LOOP
+ v_PaymentAmt := v_PaymentAmt
+ + currencyConvert(a.Amount + a.DisCountAmt + a.WriteOffAmt,
+ a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
+ END LOOP;
+ --
+ RETURN ROUND(NVL(v_PaymentAmt,0), 2) * v_MultiplierAP;
+END invoicePaid;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_PaymentTerm_Discount.sql b/db/ddlutils/oracle/functions/C_PaymentTerm_Discount.sql
new file mode 100644
index 0000000000..ae2cf83052
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_PaymentTerm_Discount.sql
@@ -0,0 +1,71 @@
+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
+ 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
+ -- 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
+ -- Not fully correct - only does weekends (7=Saturday, 1=Sunday)
+ SELECT DECODE(TO_CHAR(Discount1Date,'D'), '7',2, '1',1, 0),
+ DECODE(TO_CHAR(Discount2Date,'D'), '7',2, '1',1, 0)
+ INTO Add1Date, Add2Date
+ FROM DUAL;
+ Discount1Date := Discount1Date+Add1Date;
+ Discount2Date := Discount2Date+Add2Date;
+ 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;
+ --
+ RETURN ROUND(NVL(Discount,0), 2); -- fixed rounding
+END paymentTermDiscount;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_PaymentTerm_DueDate.sql b/db/ddlutils/oracle/functions/C_PaymentTerm_DueDate.sql
new file mode 100644
index 0000000000..fd07dcf23e
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_PaymentTerm_DueDate.sql
@@ -0,0 +1,52 @@
+CREATE OR REPLACE FUNCTION paymentTermDueDate
+(
+ PaymentTerm_ID IN NUMBER,
+ DocDate IN DATE
+)
+RETURN DATE
+/*************************************************************************
+ * 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_DueDate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get Due Date
+ * Description:
+ * Returns the due date
+ ************************************************************************/
+AS
+ Days NUMBER := 0;
+ DueDate DATE := TRUNC(DocDate);
+ --
+ CURSOR Cur_PT IS
+ SELECT *
+ FROM C_PaymentTerm
+ WHERE C_PaymentTerm_ID = PaymentTerm_ID;
+ FirstDay DATE;
+ NoDays NUMBER;
+BEGIN
+ FOR p IN Cur_PT LOOP -- for convineance only
+ -- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
+ -- Due 15th of following month
+ IF (p.IsDueFixed = 'Y') THEN
+ -- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
+ FirstDay := TRUNC(DocDate, 'MM');
+ NoDays := TRUNC(DocDate) - FirstDay;
+ DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
+ DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
+ IF (NoDays > p.FixMonthCutoff) THEN
+ DueDate := ADD_MONTHS(DueDate, 1);
+ END IF;
+ ELSE
+ -- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
+ DueDate := TRUNC(DocDate) + p.NetDays;
+ END IF;
+ END LOOP;
+-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
+
+ RETURN DueDate;
+END paymentTermDueDate;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_PaymentTerm_DueDays.sql b/db/ddlutils/oracle/functions/C_PaymentTerm_DueDays.sql
new file mode 100644
index 0000000000..057c216271
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_PaymentTerm_DueDays.sql
@@ -0,0 +1,58 @@
+CREATE OR REPLACE FUNCTION paymentTermDueDays
+(
+ 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_DueDays.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get Due Days
+ * Description:
+ * Returns the days due (positive) or the days till due (negative)
+ * Grace days are not considered!
+ * If record is not found it assumes due immediately
+ *
+ * Test: SELECT C_PaymentTerm_DueDays(103, '01-DEC-2000', '15-DEC-2000') FROM DUAL
+ ************************************************************************/
+AS
+ Days NUMBER := 0;
+ DueDate DATE := TRUNC(DocDate);
+ --
+ CURSOR Cur_PT IS
+ SELECT *
+ FROM C_PaymentTerm
+ WHERE C_PaymentTerm_ID = PaymentTerm_ID;
+ FirstDay DATE;
+ NoDays NUMBER;
+BEGIN
+ FOR p IN Cur_PT LOOP -- for convineance only
+ -- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
+ -- Due 15th of following month
+ IF (p.IsDueFixed = 'Y') THEN
+ -- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
+ FirstDay := TRUNC(DocDate, 'MM');
+ NoDays := TRUNC(DocDate) - FirstDay;
+ DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
+ DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
+ IF (NoDays > p.FixMonthCutoff) THEN
+ DueDate := ADD_MONTHS(DueDate, 1);
+ END IF;
+ ELSE
+ -- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
+ DueDate := TRUNC(DocDate) + p.NetDays;
+ END IF;
+ END LOOP;
+-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
+
+ Days := TRUNC(PayDate) - DueDate;
+ RETURN Days;
+END paymentTermDueDays;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Payment_Allocated.sql b/db/ddlutils/oracle/functions/C_Payment_Allocated.sql
new file mode 100644
index 0000000000..a564a4545b
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Payment_Allocated.sql
@@ -0,0 +1,57 @@
+CREATE OR REPLACE FUNCTION paymentAllocated
+(
+ p_C_Payment_ID IN NUMBER,
+ p_C_Currency_ID IN NUMBER
+)
+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_Payment_Allocated.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Calculate Allocated Payment Amount in Payment Currency
+ * Description:
+ --
+ SELECT C_Payment_Allocated(C_Payment_ID,C_Currency_ID), PayAmt, IsAllocated
+ FROM C_Payment_v
+ WHERE C_Payment_ID>=1000000;
+ --
+ UPDATE C_Payment_v
+ SET IsAllocated=CASE WHEN C_Payment_Allocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
+ WHERE C_Payment_ID>=1000000;
+
+ ************************************************************************/
+AS
+ v_AllocatedAmt NUMBER := 0;
+ v_PayAmt NUMBER;
+ CURSOR Cur_Alloc IS
+ SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
+ FROM C_AllocationLine al
+ INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
+ WHERE al.C_Payment_ID = p_C_Payment_ID
+ AND a.IsActive='Y';
+ -- AND al.C_Invoice_ID IS NOT NULL;
+BEGIN
+ -- Charge - nothing available
+ SELECT MAX(PayAmt)
+ INTO v_PayAmt
+ FROM C_Payment
+ WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
+ IF (v_PayAmt IS NOT NULL) THEN
+ RETURN 0;
+ END IF;
+
+ -- Calculate Allocated Amount
+ FOR a IN Cur_Alloc LOOP
+ v_AllocatedAmt := v_AllocatedAmt
+ + currencyConvert(a.Amount, a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
+ END LOOP;
+ -- Round to penny
+ v_AllocatedAmt := ROUND(NVL(v_AllocatedAmt,0), 2);
+ RETURN v_AllocatedAmt;
+END paymentAllocated;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/C_Payment_Available.sql b/db/ddlutils/oracle/functions/C_Payment_Available.sql
new file mode 100644
index 0000000000..84e77971db
--- /dev/null
+++ b/db/ddlutils/oracle/functions/C_Payment_Available.sql
@@ -0,0 +1,62 @@
+CREATE OR REPLACE FUNCTION paymentAvailable
+(
+ p_C_Payment_ID IN NUMBER
+)
+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_Payment_Available.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Calculate Available Payment Amount in Payment Currency
+ * Description:
+ * similar to C_Invoice_Open
+ ************************************************************************/
+AS
+ v_Currency_ID NUMBER(10);
+ v_AvailableAmt NUMBER := 0;
+ v_IsReceipt C_Payment.IsReceipt%TYPE;
+ v_Amt NUMBER := 0;
+ CURSOR Cur_Alloc IS
+ SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
+ FROM C_AllocationLine al
+ INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
+ WHERE al.C_Payment_ID = p_C_Payment_ID
+ AND a.IsActive='Y';
+ -- AND al.C_Invoice_ID IS NOT NULL;
+BEGIN
+ -- Charge - fully allocated
+ SELECT MAX(PayAmt)
+ INTO v_Amt
+ FROM C_Payment
+ WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
+ IF (v_Amt IS NOT NULL) THEN
+ RETURN v_Amt;
+ END IF;
+
+ -- Get Currency
+ SELECT C_Currency_ID, PayAmt, IsReceipt
+ INTO v_Currency_ID, v_AvailableAmt, v_IsReceipt
+ FROM C_Payment_v -- corrected for AP/AR
+ WHERE C_Payment_ID = p_C_Payment_ID;
+-- DBMS_OUTPUT.PUT_LINE('== C_Payment_ID=' || p_C_Payment_ID || ', PayAmt=' || v_AvailableAmt || ', Receipt=' || v_IsReceipt);
+
+ -- Calculate Allocated Amount
+ FOR a IN Cur_Alloc LOOP
+ v_Amt := currencyConvert(a.Amount, a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
+ v_AvailableAmt := v_AvailableAmt - v_Amt;
+-- DBMS_OUTPUT.PUT_LINE(' Allocation=' || a.Amount || ' - Available=' || v_AvailableAmt);
+ END LOOP;
+ -- Ignore Rounding
+ IF (v_AvailableAmt BETWEEN -0.00999 AND 0.00999) THEN
+ v_AvailableAmt := 0;
+ END IF;
+ -- Round to penny
+ v_AvailableAmt := ROUND(NVL(v_AvailableAmt,0), 2);
+ RETURN v_AvailableAmt;
+END paymentAvailable;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/functions/DBA_ConstraintCmd.sql b/db/ddlutils/oracle/functions/DBA_ConstraintCmd.sql
new file mode 100644
index 0000000000..75d82cc6d9
--- /dev/null
+++ b/db/ddlutils/oracle/functions/DBA_ConstraintCmd.sql
@@ -0,0 +1,59 @@
+CREATE OR REPLACE FUNCTION DBA_ConstraintCmd
+(
+ p_ConstraintName IN VARCHAR2
+)
+RETURN VARCHAR2
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: DBA_ConstraintCmd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ * $Source: /cvs/adempiere/db/database/Functions/DBA_ConstraintCmd.sql,v $
+ ***
+ * Title: Create DML command for given constraint
+ * Description:
+ * SELECT DBA_ConstraintCmd(Constraint_Name) FROM User_Constraints WHERE CONSTRAINT_TYPE='R'
+ ************************************************************************/
+AS
+ v_Result VARCHAR2(2000);
+ v_TableName VARCHAR2(256);
+ v_ColumnName VARCHAR2(256);
+ v_ConstraintName VARCHAR2(256);
+ v_DeleteRule VARCHAR2(256);
+BEGIN
+ -- Get First Part
+ SELECT c.Table_Name, cc.Column_name, c.R_Constraint_Name, c.Delete_Rule
+ INTO v_TableName, v_ColumnName, v_ConstraintName, v_DeleteRule
+ FROM USER_Constraints c, USER_Cons_Columns cc
+ WHERE c.Constraint_Name=cc.Constraint_Name
+ AND cc.Constraint_Name=p_ConstraintName;
+ -- Create First Part
+ v_Result := 'ALTER TABLE ' || v_TableName || ' ADD CONSTRAINT ' || p_ConstraintName
+ || ' FOREIGN KEY (' || v_ColumnName || ') ';
+
+ -- Not a valid FK Reference
+ IF (v_ConstraintName IS NULL) THEN
+ RETURN NULL;
+ END IF;
+
+ -- Get Second Part
+ SELECT c.Table_Name, cc.Column_name
+ INTO v_TableName, v_ColumnName
+ FROM USER_Constraints c, USER_Cons_Columns cc
+ WHERE c.Constraint_Name=cc.Constraint_Name
+ AND cc.Constraint_Name=v_ConstraintName;
+ -- Create Second Part
+ v_Result := v_Result || 'REFERENCES ' || v_TableName || '(' || v_ColumnName || ')';
+
+ IF (v_DeleteRule = 'CASCADE') THEN
+ v_Result := v_Result || ' ON DELETE CASCADE';
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE(v_Result);
+ RETURN v_Result;
+
+END DBA_ConstraintCmd;
+/
+
diff --git a/db/ddlutils/oracle/functions/DBA_DisplayType.sql b/db/ddlutils/oracle/functions/DBA_DisplayType.sql
new file mode 100644
index 0000000000..b1cf73139e
--- /dev/null
+++ b/db/ddlutils/oracle/functions/DBA_DisplayType.sql
@@ -0,0 +1,46 @@
+CREATE OR REPLACE FUNCTION DBA_DisplayType
+(
+ AD_Reference_ID IN NUMBER
+)
+RETURN VARCHAR2
+AS
+BEGIN
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: DBA_DisplayType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Show clear text od DisplayType
+ * Description:
+ ************************************************************************/
+ IF (AD_Reference_ID = 10) THEN RETURN 'String = 10';
+ ELSIF (AD_Reference_ID = 11) THEN RETURN 'Integer = 11';
+ ELSIF (AD_Reference_ID = 12) THEN RETURN 'Amount = 12';
+ ELSIF (AD_Reference_ID = 13) THEN RETURN 'ID = 13';
+ ELSIF (AD_Reference_ID = 14) THEN RETURN 'Text = 14';
+ ELSIF (AD_Reference_ID = 15) THEN RETURN 'Date = 15';
+ ELSIF (AD_Reference_ID = 16) THEN RETURN 'DateTime = 16';
+ ELSIF (AD_Reference_ID = 17) THEN RETURN 'List = 17';
+ ELSIF (AD_Reference_ID = 18) THEN RETURN 'Table = 18';
+ ELSIF (AD_Reference_ID = 19) THEN RETURN 'TableDir = 19';
+ ELSIF (AD_Reference_ID = 20) THEN RETURN 'YesNo = 20';
+ ELSIF (AD_Reference_ID = 21) THEN RETURN 'Location = 21';
+ ELSIF (AD_Reference_ID = 22) THEN RETURN 'Number = 22';
+ ELSIF (AD_Reference_ID = 23) THEN RETURN 'Binary = 23';
+ ELSIF (AD_Reference_ID = 24) THEN RETURN 'Time = 24';
+ ELSIF (AD_Reference_ID = 25) THEN RETURN 'Account = 25';
+ ELSIF (AD_Reference_ID = 26) THEN RETURN 'RowID = 26';
+ ELSIF (AD_Reference_ID = 27) THEN RETURN 'Color = 27';
+ ELSIF (AD_Reference_ID = 28) THEN RETURN 'Button = 28';
+ ELSIF (AD_Reference_ID = 29) THEN RETURN 'Quantity = 29';
+ ELSIF (AD_Reference_ID = 30) THEN RETURN 'Search = 30';
+ ELSIF (AD_Reference_ID = 31) THEN RETURN 'Locator = 31';
+ ELSIF (AD_Reference_ID = 32) THEN RETURN 'Image = 32';
+ ELSIF (AD_Reference_ID = 33) THEN RETURN 'Assignment= 33';
+ ELSE RETURN 'Unknown ('||AD_Reference_ID||')'; END IF;
+END DBA_DisplayType;
+/
diff --git a/db/ddlutils/oracle/functions/M_Attribute_Name.sql b/db/ddlutils/oracle/functions/M_Attribute_Name.sql
new file mode 100644
index 0000000000..44427bbe73
--- /dev/null
+++ b/db/ddlutils/oracle/functions/M_Attribute_Name.sql
@@ -0,0 +1,84 @@
+CREATE OR REPLACE FUNCTION productAttribute
+(
+ p_M_AttributeSetInstance_ID IN NUMBER
+)
+RETURN VARCHAR2
+/*************************************************************************
+ * 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: M_Attribute_Name.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Return Instance Attribute Info
+ * Description:
+ *
+ * Test:
+ SELECT M_Attribute_Name (M_AttributeSetInstance_ID)
+ FROM M_InOutLine WHERE M_AttributeSetInstance_ID > 0
+ --
+ SELECT p.Name
+ FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
+ SELECT p.Name || M_Attribute_Name (il.M_AttributeSetInstance_ID)
+ FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
+
+ ************************************************************************/
+AS
+ v_Name VARCHAR2(2000) := NULL;
+ v_NameAdd VARCHAR2(2000) := '';
+ --
+ v_Lot M_AttributeSetInstance.Lot%TYPE;
+ v_LotStart M_AttributeSet.LotCharSOverwrite%TYPE;
+ v_LotEnd M_AttributeSet.LotCharEOverwrite%TYPE;
+ v_SerNo M_AttributeSetInstance.SerNo%TYPE;
+ v_SerNoStart M_AttributeSet.SerNoCharSOverwrite%TYPE;
+ v_SerNoEnd M_AttributeSet.SerNoCharEOverwrite%TYPE;
+ v_GuaranteeDate M_AttributeSetInstance.GuaranteeDate%TYPE;
+ --
+ CURSOR CUR_Attributes IS
+ SELECT ai.Value, a.Name
+ FROM M_AttributeInstance ai
+ INNER JOIN M_Attribute a ON (ai.M_Attribute_ID=a.M_Attribute_ID AND a.IsInstanceAttribute='Y')
+ WHERE ai.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
+
+BEGIN
+/* -- Get Product Name
+ SELECT Name
+ INTO v_Name
+ FROM M_Product WHERE M_Product_ID=p_M_Product_ID;
+*/
+ -- Get Product Attribute Set Instance
+ IF (p_M_AttributeSetInstance_ID > 0) THEN
+ SELECT asi.Lot, asi.SerNo, asi.GuaranteeDate,
+ COALESCE(a.SerNoCharSOverwrite, '#'), COALESCE(a.SerNoCharEOverwrite, ''),
+ COALESCE(a.LotCharSOverwrite, '«'), COALESCE(a.LotCharEOverwrite, '»')
+ INTO v_Lot, v_SerNo, v_GuaranteeDate,
+ v_SerNoStart, v_SerNoEnd, v_LotStart, v_LotEnd
+ FROM M_AttributeSetInstance asi
+ INNER JOIN M_AttributeSet a ON (asi.M_AttributeSet_ID=a.M_AttributeSet_ID)
+ WHERE asi.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
+ --
+ IF (v_SerNo IS NOT NULL) THEN
+ v_NameAdd := v_NameAdd || v_SerNoStart || v_SerNo || v_SerNoEnd || ' ';
+ END IF;
+ IF (v_Lot IS NOT NULL) THEN
+ v_NameAdd := v_NameAdd || v_LotStart || v_Lot || v_LotEnd || ' ';
+ END IF;
+ IF (v_GuaranteeDate IS NOT NULL) THEN
+ v_NameAdd := v_NameAdd || v_GuaranteeDate || ' ';
+ END IF;
+ --
+ FOR a IN CUR_Attributes LOOP
+ v_NameAdd := v_NameAdd || a.Name || ':' || a.Value || ' ';
+ END LOOP;
+ --
+ IF (LENGTH(v_NameAdd) > 0) THEN
+ v_Name := v_Name || ' (' || TRIM(v_NameAdd) || ')';
+ END IF;
+ END IF;
+
+ RETURN v_Name;
+END productAttribute;
+/
\ No newline at end of file
diff --git a/db/ddlutils/oracle/init.sql b/db/ddlutils/oracle/init.sql
new file mode 100644
index 0000000000..3d65990514
--- /dev/null
+++ b/db/ddlutils/oracle/init.sql
@@ -0,0 +1,55 @@
+/** Get Character at Position */
+CREATE OR REPLACE FUNCTION charAt
+(
+ p_string VARCHAR2,
+ p_pos NUMBER
+)
+ RETURN VARCHAR2
+AS
+BEGIN
+ RETURN SUBSTR(p_string, p_pos, 1);
+END;
+/
+/** GetDate */
+CREATE OR REPLACE FUNCTION getdate
+ RETURN DATE
+AS
+BEGIN
+ RETURN SysDate;
+END;
+/
+/** First Of DD/DY/MM/Q */
+CREATE OR REPLACE FUNCTION firstOf
+(
+ p_date DATE,
+ p_datePart VARCHAR2
+)
+ RETURN DATE
+AS
+BEGIN
+ RETURN TRUNC(p_date, p_datePart);
+END;
+/
+/** Add Number of Days */
+CREATE OR REPLACE FUNCTION addDays
+(
+ p_date DATE,
+ p_days NUMBER
+)
+ RETURN DATE
+AS
+BEGIN
+ RETURN TRUNC(p_date) + p_days;
+END;
+/
+CREATE OR REPLACE FUNCTION daysBetween
+(
+ p_date1 DATE,
+ p_date2 DATE
+)
+ RETURN NUMBER
+AS
+BEGIN
+ RETURN (TRUNC(p_date1) - TRUNC(p_date2));
+END;
+/
diff --git a/db/ddlutils/oracle/jdbc.properties.oracle10 b/db/ddlutils/oracle/jdbc.properties.oracle10
new file mode 100644
index 0000000000..7124576401
--- /dev/null
+++ b/db/ddlutils/oracle/jdbc.properties.oracle10
@@ -0,0 +1,31 @@
+# JDBC properties for Oracle10
+# Note: Properties starting with "datasource." will be fed into the datasource instance of the
+# class configured via the datasource.class property
+
+# Use this property to choose the Oracle10 platform (instead of the Oracle8 default one)
+ddlutils.platform=Oracle10
+
+#
+# Using the plain DBCP datasource
+#
+
+datasource.class=org.apache.commons.dbcp.BasicDataSource
+datasource.driverClassName=oracle.jdbc.driver.OracleDriver
+datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
+datasource.username=adempiere
+datasource.password=adempiere
+
+#
+# Or the Oracle datasource
+#
+
+#datasource.class=oracle.jdbc.pool.OracleDataSource
+#datasource.URL=jdbc:oracle:thin:@leesf:1521:orcl
+#datasource.user=adempiere
+#datasource.password=adempiere
+#datasource.connectionCachingEnabled=true
+
+
+# For oracle, we should limit the schema to the one of the user
+# Note that Oracle requires this to be uppercase, even when using delimited identifiers
+ddlutils.schema=ADEMPIERE
diff --git a/db/ddlutils/oracle/log/readme.txt b/db/ddlutils/oracle/log/readme.txt
new file mode 100644
index 0000000000..89f91c408a
--- /dev/null
+++ b/db/ddlutils/oracle/log/readme.txt
@@ -0,0 +1,2 @@
+Folder to store log generated from build
+
diff --git a/db/ddlutils/oracle/procedures/AD_Column_Sync.sql b/db/ddlutils/oracle/procedures/AD_Column_Sync.sql
new file mode 100644
index 0000000000..b1b85a49e3
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_Column_Sync.sql
@@ -0,0 +1,280 @@
+CREATE OR REPLACE PROCEDURE AD_Column_Sync
+(
+ p_PInstance_ID IN NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_Column_Sync.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Synchronize Column with Database
+ * Description:
+ ************************************************************************/
+AS
+ -- Logistice
+ v_ResultStr VARCHAR2(2000);
+ v_Message VARCHAR2(2000);
+ v_Result NUMBER := 1; -- 0=failure
+ v_Record_ID NUMBER;
+ v_AD_User_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
+ SELECT i.Record_ID, i.AD_User_ID,
+ p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=pp_PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+ -- Variables
+ v_TableName AD_Table.TableName%TYPE;
+ v_ColumnName AD_Column.ColumnName%TYPE;
+ v_AD_Reference_ID AD_Column.AD_Reference_ID%TYPE;
+ v_FieldLength AD_Column.FieldLength%TYPE;
+ v_DefaultValue AD_Column.DefaultValue%TYPE;
+ v_IsMandatory AD_Column.IsMandatory%TYPE;
+ --
+ v_DB_DataType USER_TAB_COLUMNS.DATA_TYPE%TYPE;
+ v_Cmd VARCHAR2(255);
+ v_DB_TableName VARCHAR(60) := NULL;
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
+ v_ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ v_ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
+ v_Record_ID := p.Record_ID;
+ v_AD_User_ID := p.AD_User_ID;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
+
+ -- Get Table/Column Info
+ v_ResultStr := 'ReadingColumnInfo';
+ SELECT t.TableName, c.ColumnName, c.AD_Reference_ID, c.FieldLength,
+ c.DefaultValue, c.IsMandatory
+ INTO v_TableName, v_ColumnName, v_AD_Reference_ID, v_FieldLength,
+ v_DefaultValue, v_IsMandatory
+ FROM AD_Table t, AD_Column c
+ WHERE t.AD_Table_ID = c.AD_Table_ID
+ AND c.AD_Column_ID = v_Record_ID;
+
+
+ -- Check if Table exists
+ v_ResultStr := 'ReadingDBTableInfo';
+ BEGIN
+ SELECT Table_Name
+ INTO v_DB_TableName
+ FROM USER_TABLES
+ WHERE Table_Name=UPPER(v_TableName);
+ EXCEPTION
+ WHEN OTHERS THEN NULL;
+ END;
+
+ -- Table does not exists
+ IF (v_DB_TableName IS NULL) THEN
+ v_ResultStr := 'CreateTableCommand';
+ BEGIN
+ v_CMD := 'CREATE TABLE ' || SYS_CONTEXT('USERENV', 'CURRENT_USER') || '.'
+ || UPPER(v_TableName) || ' (XXXX CHAR(1))';
+ EXECUTE IMMEDIATE v_Cmd;
+ EXCEPTION
+ WHEN OTHERS THEN
+ v_Result := 0; -- failure
+ v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
+ GOTO FINISH_PROCESS;
+ END;
+ END IF;
+
+
+ -- Get Data Dictionary Info
+ v_ResultStr := 'ReadingDBColumnInfo';
+ BEGIN
+ SELECT DATA_TYPE --, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT
+ INTO v_DB_DataType
+ FROM USER_TAB_COLUMNS
+ WHERE TABLE_NAME=UPPER(v_TableName)
+ AND COLUMN_NAME=UPPER(v_ColumnName);
+ EXCEPTION
+ WHEN OTHERS THEN NULL;
+ END;
+
+
+ /**
+ * Create Column in Database
+ */
+ IF (v_DB_DataType IS NULL) THEN
+ v_ResultStr := 'CreateALTERCommand';
+ BEGIN
+ -- Get TableName
+ v_Cmd := 'ALTER TABLE ' || v_TableName || ' ADD ' || v_ColumnName || ' ';
+ -- Map Data Type
+ IF (v_AD_Reference_ID IN (10,14)) THEN
+ -- String, Text
+ v_Cmd := v_Cmd || 'VARCHAR2(' || v_FieldLength || ')';
+ ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
+ -- List,YesNo,Button
+ v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
+ ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
+ -- ID,Table,TableDir,Location,Account,Color,Search,Locator
+ v_Cmd := v_Cmd || 'NUMBER(10)';
+ ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
+ -- Integer,Amount,Number,Quantity
+ v_Cmd := v_Cmd || 'NUMBER';
+ ELSIF (v_AD_Reference_ID IN (15,16)) THEN
+ -- Date,DateTime
+ v_Cmd := v_Cmd || 'DATE';
+ ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
+ v_Result := 0; -- failure
+ v_Message := 'DisplayType Not Supported';
+ END IF;
+ -- Default (literal)
+ IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
+ IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
+ v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
+ ELSE
+ v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
+ END IF;
+ END IF;
+ -- Mandatory
+ IF (v_IsMandatory = 'Y') THEN
+ IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
+ v_Result := 0; -- failure
+ v_Message := 'Mandatory requites literal default value';
+ ELSE
+ v_Cmd := v_Cmd || ' NOT NULL';
+ END IF;
+ END IF;
+ -- Execute it
+ IF (v_Result = 1) THEN
+ EXECUTE IMMEDIATE v_Cmd;
+ v_Message := '@Created@ - ' || v_Cmd;
+ END IF;
+ EXCEPTION
+ WHEN OTHERS THEN
+ v_Result := 0; -- failure
+ v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
+ END;
+
+ /**
+ * Change certain Attributes
+ */
+ ELSE
+ v_ResultStr := 'CreateALTERCommand';
+ BEGIN
+ -- Get TableName
+ v_Cmd := 'ALTER TABLE ' || v_TableName || ' MODIFY ' || v_ColumnName || ' ';
+ -- Map Data Type
+ IF (v_AD_Reference_ID IN (10,14)) THEN
+ -- String, Text
+ v_Cmd := v_Cmd || 'VARCHAR2(' || v_FieldLength || ')';
+ ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
+ -- List,YesNo,Button
+ v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
+ ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
+ -- ID,Table,TableDir,Location,Account,Color,Search,Locator
+ v_Cmd := v_Cmd || 'NUMBER(10)';
+ ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
+ -- Integer,Amount,Number,Quantity
+ v_Cmd := v_Cmd || 'NUMBER';
+ ELSIF (v_AD_Reference_ID IN (15,16)) THEN
+ -- Date,DateTime
+ v_Cmd := v_Cmd || 'DATE';
+ ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
+ v_Result := 0; -- failure
+ v_Message := 'DisplayType Not Supported';
+ END IF;
+ -- Default (literal)
+ IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
+ IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
+ v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
+ ELSE
+ v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
+ END IF;
+ END IF;
+ -- Mandatory
+ IF (v_IsMandatory = 'Y') THEN
+ IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
+ v_Result := 0; -- failure
+ v_Message := 'Mandatory requites literal default value';
+ ELSE
+ v_Cmd := v_Cmd || ' NOT NULL';
+ END IF;
+ END IF;
+ -- Execute it
+ IF (v_Result = 1) THEN
+ EXECUTE IMMEDIATE v_Cmd;
+ v_Message := '@Updated@ - ' || v_Cmd;
+ END IF;
+ EXCEPTION
+ WHEN OTHERS THEN
+ v_Result := 0; -- failure
+ v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
+ END;
+ END IF;
+
+ /**
+ * Delete Column
+ *
+ ELSE
+ v_Cmd := 'ALTER TABLE ' || v_TableName
+ || ' DROP COLUMN ' || v_ColumnName;
+ -- Execute it
+ EXECUTE IMMEDIATE v_Cmd;
+ END IF;
+ /**/
+
+
+ -- Table did not exist - drop initial column
+ IF (v_DB_TableName IS NULL) THEN
+ v_ResultStr := 'CreateDropXXColumnCommand';
+ BEGIN
+ v_CMD := 'ALTER TABLE ' || v_TableName || ' DROP COLUMN XXXX';
+ EXECUTE IMMEDIATE v_Cmd;
+ EXCEPTION
+ WHEN OTHERS THEN
+ v_Result := 0; -- failure
+ v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
+ END;
+ END IF;
+
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = v_Result, -- 1=success
+ ErrorMsg = v_Message
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
+ DBMS_OUTPUT.PUT_LINE(v_ResultStr);
+ ROLLBACK;
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = v_ResultStr
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END AD_Column_Sync;
+/
diff --git a/db/ddlutils/oracle/procedures/AD_PrintPaper_Default.sql b/db/ddlutils/oracle/procedures/AD_PrintPaper_Default.sql
new file mode 100644
index 0000000000..71a014d0f5
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_PrintPaper_Default.sql
@@ -0,0 +1,92 @@
+CREATE OR REPLACE PROCEDURE AD_PrintPaper_Default
+(
+ p_AD_PInstance_ID IN NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_PrintPaper_Default.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Set Current Format as Default
+ * Description:
+ ************************************************************************/
+AS
+ -- Logistice
+ v_ResultStr VARCHAR2(2000);
+ v_Message VARCHAR2(2000);
+ p_Record_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (PInstance NUMBER) IS
+ SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+ p_AD_Client_ID NUMBER := NULL;
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_AD_PInstance_ID);
+ v_ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=p_AD_PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ v_ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (p_AD_PInstance_ID) LOOP
+ p_Record_ID := p.Record_ID;
+ IF (p.ParameterName = 'AD_Client_ID') THEN
+ p_AD_Client_ID := p.P_Number;
+ DBMS_OUTPUT.PUT_LINE(' AD_Client_ID=' || p_AD_Client_ID);
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+ END IF;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || p_Record_ID);
+
+
+ v_ResultStr := 'Updating';
+ UPDATE AD_PrintFormat pf
+ SET AD_PrintPaper_ID = p_Record_ID
+ WHERE (AD_Client_ID = p_AD_Client_ID OR p_AD_Client_ID IS NULL)
+ AND EXISTS (SELECT * FROM AD_PrintPaper pp
+ WHERE pf.AD_PrintPaper_ID=pp.AD_PrintPaper_ID
+ AND IsLandscape = (SELECT IsLandscape FROM AD_PrintPaper
+ WHERE AD_PrintPaper_ID=p_Record_ID));
+ v_Message := '@Copied@=' || SQL%ROWCOUNT;
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 1, -- success
+ ErrorMsg = v_Message
+ WHERE AD_PInstance_ID=p_AD_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
+ DBMS_OUTPUT.PUT_LINE(v_ResultStr);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = v_ResultStr
+ WHERE AD_PInstance_ID=p_AD_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END AD_PrintPaper_Default;
+/
diff --git a/db/ddlutils/oracle/procedures/AD_Sequence_Doc.sql b/db/ddlutils/oracle/procedures/AD_Sequence_Doc.sql
new file mode 100644
index 0000000000..444ec4914a
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_Sequence_Doc.sql
@@ -0,0 +1,56 @@
+CREATE OR REPLACE PROCEDURE AD_Sequence_Doc
+(
+ p_SequenceName IN VARCHAR2,
+ p_AD_Client_ID IN NUMBER,
+ o_DocumentNo OUT VARCHAR2
+ )
+AS
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_Sequence_Doc.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get the next DocumentNo of TableName
+ * Description:
+ * store in parameter o_DocumentNo
+ * if ID < 1000000, use System Doc Sequence
+ ************************************************************************/
+ v_NextNo NUMBER;
+ v_NextNoSys NUMBER;
+ v_Prefix VARCHAR2(30);
+ v_Suffix VARCHAR2(30);
+BEGIN
+ SELECT CurrentNext, CurrentNextSys, Prefix, Suffix
+ INTO v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
+ FROM AD_Sequence
+ WHERE Name = p_SequenceName
+ AND IsActive = 'Y'
+ AND IsTableID = 'N'
+ AND IsAutoSequence = 'Y'
+ AND AD_Client_ID = p_AD_Client_ID
+ FOR UPDATE OF CurrentNext, CurrentNextSys;
+
+ IF (v_NextNoSys <> -1 AND p_AD_Client_ID < 1000000) THEN -- System No
+ UPDATE AD_Sequence
+ SET CurrentNextSys = CurrentNextSys + IncrementNo,
+ Updated = SysDate
+ WHERE Name = p_SequenceName;
+ o_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
+ ELSE -- Standard No
+ UPDATE AD_Sequence
+ SET CurrentNext = CurrentNext + IncrementNo,
+ Updated = SysDate
+ WHERE Name = p_SequenceName;
+ o_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
+ END IF;
+
+EXCEPTION
+ WHEN NO_DATA_FOUND THEN
+ RAISE_APPLICATION_ERROR (-20100, 'Document Sequence not found - ' || p_SequenceName);
+
+END AD_Sequence_Doc;
+/
diff --git a/db/ddlutils/oracle/procedures/AD_Sequence_DocType.sql b/db/ddlutils/oracle/procedures/AD_Sequence_DocType.sql
new file mode 100644
index 0000000000..71baa975e4
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_Sequence_DocType.sql
@@ -0,0 +1,80 @@
+CREATE OR REPLACE PROCEDURE AD_Sequence_DocType
+(
+ p_DocType_ID IN NUMBER,
+ p_ID IN NUMBER,
+ p_DocumentNo OUT VARCHAR2
+ )
+AS
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_Sequence_DocType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get the next DocumentNo of Document Type
+ * Description:
+ * store in parameter p_DocumentNo
+ * If ID < 1000000, use System Doc Sequence
+ * If no Document Sequence is defined, return null !
+ * Use AD_Sequence_Doc('DocumentNo_myTable',.. to get it directly
+ ************************************************************************/
+
+ v_NextNo NUMBER;
+ v_NextNoSys NUMBER;
+ v_Sequence_ID NUMBER := NULL;
+ v_Prefix VARCHAR2(30);
+ v_Suffix VARCHAR2(30);
+BEGIN
+ -- Is a document Sequence defined and valid?
+ BEGIN
+ SELECT DocNoSequence_ID
+ INTO v_Sequence_ID
+ FROM C_DocType
+ WHERE C_DocType_ID=p_DocType_ID -- parameter
+ AND IsDocNoControlled='Y'
+ AND IsActive='Y';
+ EXCEPTION
+ WHEN OTHERS THEN
+ NULL;
+ END;
+
+ IF (v_Sequence_ID IS NULL) THEN -- No Sequence Number
+ p_DocumentNo := ''; -- Return NULL
+ DBMS_OUTPUT.PUT_LINE('[AD_Sequence_DocType: not found - C_DocType_ID=' || p_DocType_ID || ']');
+ RETURN;
+ END IF;
+
+ -- Get the numbers
+ SELECT s.AD_Sequence_ID, s.CurrentNext, s.CurrentNextSys, s.Prefix, s.Suffix
+ INTO v_Sequence_ID, v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
+ FROM C_DocType d, AD_Sequence s
+ WHERE d.C_DocType_ID=p_DocType_ID -- parameter
+ AND d.DocNoSequence_ID=s.AD_Sequence_ID
+ AND s.IsActive = 'Y'
+ AND s.IsTableID = 'N'
+ AND s.IsAutoSequence = 'Y'
+ FOR UPDATE OF CurrentNext, CurrentNextSys;
+
+ IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
+ UPDATE AD_Sequence
+ SET CurrentNextSys = CurrentNextSys + IncrementNo
+ WHERE AD_Sequence_ID = v_Sequence_ID;
+ p_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
+ ELSE -- Standard No
+ UPDATE AD_Sequence
+ SET CurrentNext = CurrentNext + IncrementNo
+ WHERE AD_Sequence_ID = v_Sequence_ID;
+ p_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
+ END IF;
+-- DBMS_OUTPUT.PUT_LINE(p_DocumentNo);
+
+EXCEPTION
+ WHEN NO_DATA_FOUND THEN
+ RAISE_APPLICATION_ERROR (-20100, 'AD_Sequence_DocType: not found - DocType_ID='
+ || p_DocType_ID || ', Sequence_ID=' || v_Sequence_ID);
+
+END AD_Sequence_DocType;
+/
diff --git a/db/ddlutils/oracle/procedures/AD_Sequence_Next.sql b/db/ddlutils/oracle/procedures/AD_Sequence_Next.sql
new file mode 100644
index 0000000000..85f756bd64
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_Sequence_Next.sql
@@ -0,0 +1,56 @@
+CREATE OR REPLACE PROCEDURE AD_Sequence_Next
+(
+ p_TableName IN VARCHAR2,
+ p_ID IN NUMBER,
+ p_NextNo OUT NUMBER
+ )
+AS
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_Sequence_Next.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get the next sequence number of TableName
+ * Description:
+ * store in parameter p_NextNo
+ * if ID < 1000000, use System Doc Sequence
+ ************************************************************************/
+
+ v_NextNoSys NUMBER;
+ v_ResultStr VARCHAR(255);
+BEGIN
+ v_ResultStr := 'Read';
+ SELECT CurrentNext, CurrentNextSys
+ INTO p_NextNo, v_NextNoSys
+ FROM AD_Sequence
+ WHERE Name = p_TableName
+ AND IsActive = 'Y'
+ AND IsTableID = 'Y'
+ AND IsAutoSequence = 'Y'
+ FOR UPDATE OF CurrentNext, CurrentNextSys;
+
+ v_ResultStr := 'Write';
+ IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
+ UPDATE AD_Sequence
+ SET CurrentNextSys = CurrentNextSys + IncrementNo,
+ Updated = SysDate
+ WHERE Name = p_TableName;
+ p_NextNo := v_NextNoSys;
+ ELSE -- Standard No
+ UPDATE AD_Sequence
+ SET CurrentNext = CurrentNext + IncrementNo,
+ Updated = SysDate
+ WHERE Name = p_TableName;
+ END IF;
+
+EXCEPTION
+ WHEN NO_DATA_FOUND THEN
+ RAISE_APPLICATION_ERROR (-20100, 'Table Sequence not found ');
+-- || v_ResultStr || ': ' || p_TableName);
+
+END AD_Sequence_Next;
+/
diff --git a/db/ddlutils/oracle/procedures/AD_Syncronize.sql b/db/ddlutils/oracle/procedures/AD_Syncronize.sql
new file mode 100644
index 0000000000..6301e8db3b
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/AD_Syncronize.sql
@@ -0,0 +1,775 @@
+CREATE OR REPLACE PROCEDURE AD_Synchronize
+(
+ p_PInstance_ID IN NUMBER -- DEFAULT NULL
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: AD_Syncronize.sql,v 1.2 2006/05/03 00:06:58 jjanke Exp $
+ ***
+ * Title: Syncronize Application Dictionary
+ * Description:
+ * Synchronize Elements
+ * Update Column and Field with Names from Element and Process
+ * Update Process Parameters from Elements
+ * Update Workflow Notes from Windows
+ * Update Menu from Window/Form/Process/Task
+ ************************************************************************/
+AS
+ -- Logistice
+ v_ResultStr VARCHAR2(2000);
+ v_Message VARCHAR2(2000);
+ v_Result NUMBER := 1; -- 0=failure
+ v_Record_ID NUMBER;
+ v_AD_User_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
+ SELECT i.Record_ID, i.AD_User_ID,
+ p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=pp_PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+
+BEGIN
+ IF (p_PInstance_ID IS NOT NULL) THEN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
+ v_ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ v_ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
+ v_Record_ID := p.Record_ID;
+ v_AD_User_ID := p.AD_User_ID;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
+ END IF;
+
+ ---------------------------------------------------------------------------
+
+ DBMS_OUTPUT.PUT_LINE('Adding missing Elements');
+ DECLARE
+ NextNo NUMBER;
+ CURSOR Cur_Column IS
+ SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
+ FROM AD_Column c
+ WHERE NOT EXISTS
+ (SELECT * FROM AD_Element e
+ WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName));
+ CURSOR Cur_Process IS
+ SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
+ FROM AD_Process_Para p
+ WHERE NOT EXISTS
+ (SELECT * FROM AD_Element e
+ WHERE UPPER(p.ColumnName)=UPPER(e.ColumnName));
+ CC Cur_Column%ROWTYPE;
+ BEGIN
+ DBMS_OUTPUT.PUT_LINE('Column:');
+ FOR CC IN Cur_Column LOOP
+ AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
+ INSERT INTO AD_ELEMENT
+ (AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
+ ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
+ ColumnName, Name, PrintName, Description, Help, EntityType)
+ VALUES
+ (NextNo, 0, 0,
+ 'Y', SysDate, 0, SysDate, 0,
+ CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
+ DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
+ COMMIT;
+ END LOOP;
+ DBMS_OUTPUT.PUT_LINE('Parameter:');
+ FOR CC IN Cur_Process LOOP
+ AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
+ INSERT INTO AD_ELEMENT
+ (AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
+ ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
+ ColumnName, Name, PrintName, Description, Help, EntityType)
+ VALUES
+ (NextNo, 0, 0,
+ 'Y', SysDate, 0, SysDate, 0,
+ CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
+ DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
+ COMMIT;
+ END LOOP;
+ END;
+
+
+ DBMS_OUTPUT.PUT_LINE('Adding missing Element Translations');
+ INSERT INTO AD_Element_Trl (AD_Element_ID, AD_Language, AD_Client_ID, AD_Org_ID,
+ IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ Name, PrintName, Description, Help, IsTranslated)
+ SELECT m.AD_Element_ID, l.AD_Language, m.AD_Client_ID, m.AD_Org_ID,
+ m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
+ m.Name, m.PrintName, m.Description, m.Help, 'N'
+ FROM AD_Element m, AD_Language l
+ WHERE l.IsActive = 'Y' AND l.IsSystemLanguage = 'Y'
+ AND AD_Element_ID || AD_Language NOT IN
+ (SELECT AD_Element_ID || AD_Language FROM AD_Element_Trl);
+ DBMS_OUTPUT.PUT_LINE(' rows added: ' || SQL%ROWCOUNT);
+
+
+ DBMS_OUTPUT.PUT_LINE('Creating link from Element to Column');
+ UPDATE AD_Column c
+ SET AD_Element_id =
+ (SELECT AD_Element_ID FROM AD_Element e
+ WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName))
+ WHERE AD_Element_ID IS NULL;
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+ COMMIT;
+
+
+ DBMS_OUTPUT.PUT_LINE('Deleting unused Elements');
+ DELETE AD_Element_Trl
+ WHERE AD_Element_ID IN
+ (SELECT AD_Element_ID FROM AD_Element e
+ WHERE NOT EXISTS
+ (SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
+ AND NOT EXISTS
+ (SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName)));
+
+ DELETE AD_Element e
+ WHERE NOT EXISTS
+ (SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
+ AND NOT EXISTS
+ (SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName));
+ DBMS_OUTPUT.PUT_LINE(' rows deleted: ' || SQL%ROWCOUNT);
+
+ ---------------------------------------------------------------------------
+
+ -- Columns
+ DBMS_OUTPUT.PUT_LINE('Synchronize Column');
+ /* Identify offending column
+SELECT UPPER(ColumnName)
+FROM AD_Element
+GROUP BY UPPER(ColumnName)
+HAVING COUNT(UPPER(ColumnName)) > 1
+
+SELECT c.ColumnName, e.ColumnName
+FROM AD_Column c
+ INNER JOIN AD_Element e ON (c.AD_Element_ID=e.AD_Element_ID)
+WHERE c.ColumnName <> e.ColumnName
+ */
+ UPDATE AD_Column c
+ SET (ColumnName, Name, Description, Help) =
+ (SELECT ColumnName, Name, Description, Help
+ FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID),
+ Updated = SysDate
+ WHERE EXISTS (SELECT * FROM AD_Element e
+ WHERE c.AD_Element_ID=e.AD_Element_ID
+ AND (c.ColumnName <> e.ColumnName OR c.Name <> e.Name
+ OR NVL(c.Description,' ') <> NVL(e.Description,' ') OR NVL(c.Help,' ') <> NVL(e.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Fields should now be syncronized
+ DBMS_OUTPUT.PUT_LINE('Synchronize Field');
+ UPDATE AD_Field f
+ SET (Name, Description, Help) =
+ (SELECT e.Name, e.Description, e.Help
+ FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
+ Updated = SysDate
+ WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
+ WHERE f.AD_Column_ID=c.AD_Column_ID
+ AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
+ AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Field Translations
+ DBMS_OUTPUT.PUT_LINE('Synchronize Field Translations');
+ UPDATE AD_Field_trl trl
+ SET Name = (SELECT e.Name FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Description = (SELECT e.Description FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Help = (SELECT e.Help FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Updated = SysDate
+ WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
+ WHERE trl.AD_Field_ID=f.AD_Field_ID
+ AND f.AD_Column_ID=c.AD_Column_ID
+ AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
+ AND trl.AD_Language=e.AD_Language
+ AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND (trl.Name <> e.Name OR NVL(trl.Description,' ') <> NVL(e.Description,' ') OR NVL(trl.Help,' ') <> NVL(e.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Fields should now be syncronized
+ DBMS_OUTPUT.PUT_LINE('Synchronize PO Field');
+ UPDATE AD_Field f
+ SET Name = (SELECT e.PO_Name FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
+ Description = (SELECT e.PO_Description FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
+ Help = (SELECT e.PO_Help FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
+ Updated = SysDate
+ WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
+ WHERE f.AD_Column_ID=c.AD_Column_ID
+ AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
+ AND (f.Name <> e.PO_Name OR NVL(f.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(f.Help,' ') <> NVL(e.PO_Help,' '))
+ AND e.PO_Name IS NOT NULL)
+ AND EXISTS (SELECT * FROM AD_Tab t, AD_Window w
+ WHERE f.AD_Tab_ID=t.AD_Tab_ID
+ AND t.AD_Window_ID=w.AD_Window_ID
+ AND w.IsSOTrx='N');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Field Translations
+ DBMS_OUTPUT.PUT_LINE('Synchronize PO Field Translations');
+ UPDATE AD_Field_trl trl
+ SET Name = (SELECT e.PO_Name FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Description = (SELECT e.PO_Description FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Help = (SELECT e.PO_Help FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
+ WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
+ Updated = SysDate
+ WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
+ WHERE trl.AD_Field_ID=f.AD_Field_ID
+ AND f.AD_Column_ID=c.AD_Column_ID
+ AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
+ AND trl.AD_Language=e.AD_Language
+ AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND (trl.Name <> e.PO_Name OR NVL(trl.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(trl.Help,' ') <> NVL(e.PO_Help,' '))
+ AND e.PO_Name IS NOT NULL)
+ AND EXISTS (SELECT * FROM AD_Field f, AD_Tab t, AD_Window w
+ WHERE trl.AD_Field_ID=f.AD_Field_ID
+ AND f.AD_Tab_ID=t.AD_Tab_ID
+ AND t.AD_Window_ID=w.AD_Window_ID
+ AND w.IsSOTrx='N');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+
+ -- Fields from Process
+ DBMS_OUTPUT.PUT_LINE('Synchronize Field from Process');
+ UPDATE AD_Field f
+ SET Name = (SELECT p.Name FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
+ AND c.AD_Column_ID=f.AD_Column_ID),
+ Description = (SELECT p.Description FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
+ AND c.AD_Column_ID=f.AD_Column_ID),
+ Help = (SELECT p.Help FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
+ AND c.AD_Column_ID=f.AD_Column_ID),
+ Updated = SysDate
+ WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND EXISTS (SELECT * FROM AD_Process p, AD_Column c
+ WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
+ AND (f.Name<>p.Name OR NVL(f.Description,' ')<>NVL(p.Description,' ') OR NVL(f.Help,' ')<>NVL(p.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Field Translations from Process
+ DBMS_OUTPUT.PUT_LINE('Synchronize Field Trl from Process Trl');
+ UPDATE AD_Field_trl trl
+ SET Name = (SELECT p.Name FROM AD_Process_trl p, AD_Column c, AD_Field f
+ WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
+ AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
+ Description = (SELECT p.Description FROM AD_Process_trl p, AD_Column c, AD_Field f
+ WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
+ AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
+ Help = (SELECT p.Help FROM AD_Process_trl p, AD_Column c, AD_Field f
+ WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
+ AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
+ IsTranslated = (SELECT p.IsTranslated FROM AD_Process_trl p, AD_Column c, AD_Field f
+ WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
+ AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
+ Updated = SysDate
+ WHERE EXISTS (SELECT * FROM AD_Process_Trl p, AD_Column c, AD_Field f
+ WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
+ AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language
+ AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND (trl.Name<>p.Name OR NVL(trl.Description,' ')<>NVL(p.Description,' ') OR NVL(trl.Help,' ')<>NVL(p.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Sync Parameter ColumnName
+ UPDATE AD_Process_Para f
+ SET ColumnName = (SELECT e.ColumnName FROM AD_Element e
+ WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName))
+ WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND EXISTS (SELECT * FROM AD_Element e
+ WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName)
+ AND e.ColumnName<>f.ColumnName);
+
+
+ -- Paramenter Fields
+ UPDATE AD_Process_Para p
+ SET IsCentrallyMaintained = 'N'
+ WHERE IsCentrallyMaintained <> 'N'
+ AND NOT EXISTS (SELECT * FROM AD_Element e WHERE p.ColumnName=e.ColumnName);
+
+ -- Parameter Fields
+ DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter');
+ UPDATE AD_Process_Para f
+ SET Name = (SELECT e.Name FROM AD_Element e
+ WHERE e.ColumnName=f.ColumnName),
+ Description = (SELECT e.Description FROM AD_Element e
+ WHERE e.ColumnName=f.ColumnName),
+ Help = (SELECT e.Help FROM AD_Element e
+ WHERE e.ColumnName=f.ColumnName),
+ Updated = SysDate
+ WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND EXISTS (SELECT * FROM AD_Element e
+ WHERE e.ColumnName=f.ColumnName
+ AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Parameter Translations
+ DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter Trl');
+ UPDATE AD_Process_Para_Trl trl
+ SET Name = (SELECT et.Name FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
+ WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
+ AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
+ Description = (SELECT et.Description FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
+ WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
+ AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
+ Help = (SELECT et.Help FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
+ WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
+ AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
+ IsTranslated = (SELECT et.IsTranslated FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
+ WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
+ AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
+ Updated = SysDate
+ WHERE EXISTS (SELECT * FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
+ WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
+ AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID
+ AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
+ AND (trl.Name <> et.Name OR NVL(trl.Description,' ') <> NVL(et.Description,' ') OR NVL(trl.Help,' ') <> NVL(et.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+
+ -- Workflow Node - Window
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Window');
+ UPDATE AD_WF_Node n
+ SET Name = (SELECT w.Name FROM AD_Window w
+ WHERE w.AD_Window_ID=n.AD_Window_ID),
+ Description = (SELECT w.Description FROM AD_Window w
+ WHERE w.AD_Window_ID=n.AD_Window_ID),
+ Help = (SELECT w.Help FROM AD_Window w
+ WHERE w.AD_Window_ID=n.AD_Window_ID)
+ WHERE n.IsCentrallyMaintained = 'Y'
+ AND EXISTS (SELECT * FROM AD_Window w
+ WHERE w.AD_Window_ID=n.AD_Window_ID
+ AND (w.Name <> n.Name OR NVL(w.Description,' ') <> NVL(n.Description,' ') OR NVL(w.Help,' ') <> NVL(n.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Workflow Translations - Window
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Window Trl');
+ UPDATE AD_WF_Node_Trl trl
+ SET Name = (SELECT t.Name FROM AD_Window_trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
+ AND trl.AD_Language=t.AD_Language),
+ Description = (SELECT t.Description FROM AD_Window_trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
+ AND trl.AD_Language=t.AD_Language),
+ Help = (SELECT t.Help FROM AD_Window_trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
+ AND trl.AD_Language=t.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Window_Trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
+ AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
+ AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Workflow Node - Form
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Form');
+ UPDATE AD_WF_Node n
+ SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
+ FROM AD_Form f
+ WHERE f.AD_Form_ID=n.AD_Form_ID)
+ WHERE n.IsCentrallyMaintained = 'Y'
+ AND EXISTS (SELECT * FROM AD_Form f
+ WHERE f.AD_Form_ID=n.AD_Form_ID
+ AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Workflow Translations - Form
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Form Trl');
+ UPDATE AD_WF_Node_Trl trl
+ SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
+ FROM AD_Form_trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
+ AND trl.AD_Language=t.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Form_Trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
+ AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
+ AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Workflow Node - Report
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Process');
+ UPDATE AD_WF_Node n
+ SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
+ FROM AD_Process f
+ WHERE f.AD_Process_ID=n.AD_Process_ID)
+ WHERE n.IsCentrallyMaintained = 'Y'
+ AND EXISTS (SELECT * FROM AD_Process f
+ WHERE f.AD_Process_ID=n.AD_Process_ID
+ AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Workflow Translations - Form
+ DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Process Trl');
+ UPDATE AD_WF_Node_Trl trl
+ SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
+ FROM AD_Process_trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
+ AND trl.AD_Language=t.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Process_Trl t, AD_WF_Node n
+ WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
+ AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
+ AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ -- Need centrally maintained flag here!
+ DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Name from Element');
+ UPDATE AD_PrintFormatItem pfi
+ SET Name = (SELECT e.Name
+ FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID)
+ WHERE pfi.IsCentrallyMaintained='Y'
+ AND EXISTS (SELECT *
+ FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID
+ AND e.Name<>pfi.Name)
+ AND EXISTS (SELECT * FROM AD_Client
+ WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem PrintName from Element');
+ UPDATE AD_PrintFormatItem pfi
+ SET PrintName = (SELECT e.PrintName
+ FROM AD_Element e, AD_Column c
+ WHERE e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID)
+ WHERE pfi.IsCentrallyMaintained='Y'
+ AND EXISTS (SELECT *
+ FROM AD_Element e, AD_Column c, AD_PrintFormat pf
+ WHERE e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID
+ AND LENGTH(pfi.PrintName) > 0
+ AND e.PrintName<>pfi.PrintName
+ AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
+ AND pf.IsForm='N' AND IsTableBased='Y')
+ AND EXISTS (SELECT * FROM AD_Client
+ WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl from Element Trl (Multi-Lingual)');
+ UPDATE AD_PrintFormatItem_Trl trl
+ SET PrintName = (SELECT e.PrintName
+ FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi
+ WHERE e.AD_Language=trl.AD_Language
+ AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID
+ AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
+ WHERE EXISTS (SELECT *
+ FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi, AD_PrintFormat pf
+ WHERE e.AD_Language=trl.AD_Language
+ AND e.AD_Element_ID=c.AD_Element_ID
+ AND c.AD_Column_ID=pfi.AD_Column_ID
+ AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
+ AND pfi.IsCentrallyMaintained='Y'
+ AND LENGTH(pfi.PrintName) > 0
+ AND (e.PrintName<>trl.PrintName OR trl.PrintName IS NULL)
+ AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
+ AND pf.IsForm='N' AND IsTableBased='Y')
+ AND EXISTS (SELECT * FROM AD_Client
+ WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='Y');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl (Not Multi-Lingual)');
+ UPDATE AD_PrintFormatItem_Trl trl
+ SET PrintName = (SELECT pfi.PrintName
+ FROM AD_PrintFormatItem pfi
+ WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
+ WHERE EXISTS (SELECT *
+ FROM AD_PrintFormatItem pfi, AD_PrintFormat pf
+ WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
+ AND pfi.IsCentrallyMaintained='Y'
+ AND LENGTH(pfi.PrintName) > 0
+ AND pfi.PrintName<>trl.PrintName
+ AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
+ AND pf.IsForm='N' AND pf.IsTableBased='Y')
+ AND EXISTS (SELECT * FROM AD_Client
+ WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='N');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ DBMS_OUTPUT.PUT_LINE('Reset PrintFormatItem Trl where not used in base table');
+ UPDATE AD_PrintFormatItem_Trl trl
+ SET PrintName = NULL
+ WHERE PrintName IS NOT NULL
+ AND EXISTS (SELECT *
+ FROM AD_PrintFormatItem pfi
+ WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
+ AND pfi.IsCentrallyMaintained='Y'
+ AND (LENGTH (pfi.PrintName) = 0 OR pfi.PrintName IS NULL));
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+/**
+SELECT e.PrintName "Element", pfi.PrintName "FormatItem", trl.AD_Language, trl.PrintName "Trl"
+FROM AD_Element e
+ INNER JOIN AD_Column c ON (e.AD_Element_ID=c.AD_Element_ID)
+ INNER JOIN AD_PrintFormatItem pfi ON (c.AD_Column_ID=pfi.AD_Column_ID)
+ INNER JOIN AD_PrintFormatItem_Trl trl ON (pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
+WHERE pfi.AD_PrintFormatItem_ID=?
+**/
+
+ -- Sync Names - Window
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Window');
+ UPDATE AD_Menu m
+ SET Name = (SELECT Name FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID),
+ Description = (SELECT Description FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID)
+ WHERE AD_Window_ID IS NOT NULL
+ AND Action = 'W';
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ UPDATE AD_Menu_Trl mt
+ SET Name = (SELECT wt.Name FROM AD_Window_Trl wt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
+ AND mt.AD_Language=wt.AD_Language),
+ Description = (SELECT wt.Description FROM AD_Window_Trl wt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
+ AND mt.AD_Language=wt.AD_Language),
+ IsTranslated = (SELECT wt.IsTranslated FROM AD_Window_Trl wt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
+ AND mt.AD_Language=wt.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Window_Trl wt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
+ AND mt.AD_Language=wt.AD_Language
+ AND m.AD_Window_ID IS NOT NULL
+ AND m.Action = 'W');
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Sync Names - Process
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Processes');
+ UPDATE AD_Menu m
+ SET Name = (SELECT p.Name FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID),
+ Description = (SELECT p.Description FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID)
+ WHERE m.AD_Process_ID IS NOT NULL
+ AND m.Action IN ('R', 'P');
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ UPDATE AD_Menu_Trl mt
+ SET Name = (SELECT pt.Name FROM AD_Process_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
+ AND mt.AD_Language=pt.AD_Language),
+ Description = (SELECT pt.Description FROM AD_Process_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
+ AND mt.AD_Language=pt.AD_Language),
+ IsTranslated = (SELECT pt.IsTranslated FROM AD_Process_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
+ AND mt.AD_Language=pt.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Process_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
+ AND mt.AD_Language=pt.AD_Language
+ AND m.AD_Process_ID IS NOT NULL
+ AND Action IN ('R', 'P'));
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Sync Names = Form
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Forms');
+ UPDATE AD_Menu m
+ SET Name = (SELECT Name FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID),
+ Description = (SELECT Description FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID)
+ WHERE AD_Form_ID IS NOT NULL
+ AND Action = 'X';
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ UPDATE AD_Menu_Trl mt
+ SET Name = (SELECT ft.Name FROM AD_Form_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
+ AND mt.AD_Language=ft.AD_Language),
+ Description = (SELECT ft.Description FROM AD_Form_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
+ AND mt.AD_Language=ft.AD_Language),
+ IsTranslated = (SELECT ft.IsTranslated FROM AD_Form_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
+ AND mt.AD_Language=ft.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Form_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
+ AND mt.AD_Language=ft.AD_Language
+ AND m.AD_Form_ID IS NOT NULL
+ AND Action = 'X');
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Sync Names - Workflow
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Workflows');
+ UPDATE AD_Menu m
+ SET Name = (SELECT p.Name FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID),
+ Description = (SELECT p.Description FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID)
+ WHERE m.AD_Workflow_ID IS NOT NULL
+ AND m.Action = 'F';
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ UPDATE AD_Menu_Trl mt
+ SET Name = (SELECT pt.Name FROM AD_Workflow_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
+ AND mt.AD_Language=pt.AD_Language),
+ Description = (SELECT pt.Description FROM AD_Workflow_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
+ AND mt.AD_Language=pt.AD_Language),
+ IsTranslated = (SELECT pt.IsTranslated FROM AD_Workflow_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
+ AND mt.AD_Language=pt.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Workflow_Trl pt, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
+ AND mt.AD_Language=pt.AD_Language
+ AND m.AD_Workflow_ID IS NOT NULL
+ AND Action = 'F');
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Sync Names = Task
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Tasks');
+ UPDATE AD_Menu m
+ SET Name = (SELECT Name FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID),
+ Description = (SELECT Description FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID)
+ WHERE AD_Task_ID IS NOT NULL
+ AND Action = 'T';
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+
+ UPDATE AD_Menu_Trl mt
+ SET Name = (SELECT ft.Name FROM AD_Task_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
+ AND mt.AD_Language=ft.AD_Language),
+ Description = (SELECT ft.Description FROM AD_Task_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
+ AND mt.AD_Language=ft.AD_Language),
+ IsTranslated = (SELECT ft.IsTranslated FROM AD_Task_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
+ AND mt.AD_Language=ft.AD_Language)
+ WHERE EXISTS (SELECT * FROM AD_Task_Trl ft, AD_Menu m
+ WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
+ AND mt.AD_Language=ft.AD_Language
+ AND m.AD_Task_ID IS NOT NULL
+ AND Action = 'T');
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Column Name + Element
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Column with Element');
+ UPDATE AD_Column c
+ SET (Name,Description,Help) =
+ (SELECT e.Name,e.Description,e.Help
+ FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID)
+ WHERE EXISTS
+ (SELECT * FROM AD_Element e
+ WHERE c.AD_Element_ID=e.AD_Element_ID
+ AND c.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+ UPDATE AD_Column_Trl ct
+ SET Name = (SELECT e.Name
+ FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
+ WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language)
+ WHERE EXISTS
+ (SELECT * FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
+ WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language
+ AND ct.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+
+ -- Table Name + Element
+ DBMS_OUTPUT.PUT_LINE('Synchronizing Table with Element');
+ UPDATE AD_Table t
+ SET (Name,Description) = (SELECT e.Name,e.Description FROM AD_Element e
+ WHERE t.TableName||'_ID'=e.ColumnName)
+ WHERE EXISTS (SELECT * FROM AD_Element e
+ WHERE t.TableName||'_ID'=e.ColumnName
+ AND t.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+ UPDATE AD_Table_Trl tt
+ SET Name = (SELECT e.Name
+ FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
+ INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
+ WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
+ WHERE EXISTS (SELECT *
+ FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
+ INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
+ WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
+ AND tt.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ -- Trl Table Name + Element
+ UPDATE AD_Table t
+ SET (Name,Description) = (SELECT e.Name||' Trl', e.Description
+ FROM AD_Element e
+ WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName)
+ WHERE TableName LIKE '%_Trl'
+ AND EXISTS (SELECT * FROM AD_Element e
+ WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName
+ AND t.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
+ UPDATE AD_Table_Trl tt
+ SET Name = (SELECT e.Name || ' **'
+ FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
+ INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
+ WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
+ WHERE EXISTS (SELECT *
+ FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
+ INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
+ WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
+ AND t.TableName LIKE '%_Trl'
+ AND tt.Name<>e.Name);
+ DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
+
+ /** Remaining tables
+ SELECT Name, TableName FROM AD_Table t WHERE Name=TableName ORDER BY 1
+ **/
+
+
+<>
+ IF (p_PInstance_ID IS NOT NULL) THEN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = v_Result, -- 1=success
+ ErrorMsg = v_Message
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ END IF;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
+ DBMS_OUTPUT.PUT_LINE(v_ResultStr);
+ ROLLBACK;
+ IF (p_PInstance_ID IS NOT NULL) THEN
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = v_ResultStr
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+ END IF;
+ RETURN;
+
+END AD_Synchronize;
+/
diff --git a/db/ddlutils/oracle/procedures/C_Order_DrillDown.sql b/db/ddlutils/oracle/procedures/C_Order_DrillDown.sql
new file mode 100644
index 0000000000..3e55c3e299
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/C_Order_DrillDown.sql
@@ -0,0 +1,173 @@
+CREATE OR REPLACE PROCEDURE C_Order_DrillDown
+(
+ PInstance_ID IN NUMBER
+)
+/******************************************************************************
+ * ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Adempiere" to
+ * your product name; See license details http://www.adempiere.org/license.html
+ ******************************************************************************
+ * List Orders with their Shipments and Invoices
+ * Spool to T_Spool
+ */
+AS
+ ResultStr VARCHAR2(2000);
+ Message VARCHAR2(2000);
+ Record_ID NUMBER;
+ CURSOR Cur_Parameter (PInstance NUMBER) IS
+ SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter
+ C_Order_ID NUMBER;
+ --
+ CURSOR Cur_Order IS
+ SELECT o.C_Order_ID, d.Name, o.DocumentNo, o.DocStatus, o.DocAction, o.Processed
+ FROM C_Order o, C_DocType d
+ WHERE o.C_Order_ID=C_Order_ID
+ AND o.C_DocType_ID=d.C_DocType_ID
+ ORDER BY o.DocumentNo DESC;
+
+BEGIN
+ -- No locking or Updating
+
+ -- Get Parameters
+ ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (PInstance_ID) LOOP
+ Record_ID := p.Record_ID;
+ IF (p.ParameterName = 'C_Order_ID') THEN
+ C_Order_ID := p.P_Number;
+ DBMS_OUTPUT.PUT_LINE(' C_Order_ID=' || C_Order_ID);
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+ END IF;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
+
+ IF (C_Order_ID IS NULL) THEN
+ C_Order_ID := Record_ID;
+ END IF;
+
+ -- Should be nothing there
+ DELETE T_Spool
+ WHERE AD_PInstance_ID=PInstance_ID;
+
+ -- Order Info
+ FOR o IN Cur_Order LOOP
+
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ o.Name || ' ' || o.DocumentNo || ': @DocStatus@=' || o.DocStatus
+ || ', @DocAction@=' || o.DocAction || ', @Processed@=' || o.Processed);
+
+ -- Order Lines
+ DECLARE
+ CURSOR Cur_OrderLine IS
+ SELECT *
+ FROM C_OrderLine
+ WHERE C_Order_ID=o.C_Order_ID
+ ORDER BY Line;
+ BEGIN
+ FOR ol IN Cur_OrderLine LOOP
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ ' @QtyOrdered@=' || ol.QtyOrdered || ', @QtyReserved@=' || ol.QtyReserved
+ || ', @QtyDelivered@=' || ol.QtyDelivered || ', @QtyInvoiced@=' || ol.QtyInvoiced
+ || ' - Wh=' || ol.M_Warehouse_ID
+ || ', Prd=' || ol.M_Product_ID);
+ END LOOP;
+ END;
+
+ -- Shipment
+ DECLARE
+ CURSOR Cur_InOut IS
+ SELECT s.M_InOut_ID, d.Name, s.DocumentNo, s.DocStatus, s.Processed, s.M_Warehouse_ID
+ FROM M_InOut s, C_DocType d
+ WHERE s.C_Order_ID = o.C_Order_ID
+ AND s.C_DocType_ID=d.C_DocType_ID;
+ BEGIN
+ FOR s IN Cur_InOut LOOP
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ '> ' || s.Name || ' ' || s.DocumentNo || ': @DocStatus@=' || s.DocStatus
+ || ', @Processed@=' || s.Processed || ', Wh=' || s.M_Warehouse_ID);
+
+ -- Shipment Lines
+ DECLARE
+ CURSOR Cur_InOutLine IS
+ SELECT *
+ FROM M_InOutLine
+ WHERE M_InOut_ID=s.M_InOut_ID
+ ORDER BY Line;
+ BEGIN
+ FOR sl IN Cur_InOutLine LOOP
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ ' @QtyDelivered@=' || sl.MovementQty || ', Prd=' || sl.M_Product_ID);
+ END LOOP;
+ END; -- Shipment Lines
+ END LOOP; -- Shipments
+ END; -- Shipment
+
+ -- Invoice
+ DECLARE
+ CURSOR Cur_Invoice IS
+ SELECT i.C_Invoice_ID, d.Name, i.DocumentNo, i.DocStatus, i.Processed
+ FROM C_Invoice i, C_DocType d
+ WHERE i.C_DocType_ID=d.C_DocType_ID
+ AND EXISTS (SELECT * FROM C_InvoiceLine l, C_OrderLine ol
+ WHERE i.C_Invoice_ID = l.C_Invoice_ID
+ AND l.C_OrderLine_ID = ol.C_OrderLine_ID
+ AND ol.C_Order_ID=o.C_Order_ID);
+ BEGIN
+ FOR i IN Cur_Invoice LOOP
+
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ '> ' || i.Name || ' ' || i.DocumentNo || ': @DocStatus@=' || i.DocStatus
+ || ', @Processed@=' || i.Processed);
+
+ -- Invoice Lines
+ DECLARE
+ CURSOR Cur_InvoiceLine IS
+ SELECT *
+ FROM C_InvoiceLine
+ WHERE C_Invoice_ID=i.C_Invoice_ID
+ ORDER BY Line;
+ BEGIN
+ FOR il IN Cur_InvoiceLine LOOP
+ INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
+ ' @QtyInvoiced@=' || il.QtyInvoiced || ', Prd=' || il.M_Product_ID);
+ END LOOP;
+ END; -- Invoice Lines
+ END LOOP; -- Invoices
+ END; -- Invoice
+
+ END LOOP; -- Order
+
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 1, -- success
+ ErrorMsg = Message
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = ResultStr
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END C_Order_DrillDown;
+/
diff --git a/db/ddlutils/oracle/procedures/C_ProcessCreate.sql b/db/ddlutils/oracle/procedures/C_ProcessCreate.sql
new file mode 100644
index 0000000000..4ac739d956
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/C_ProcessCreate.sql
@@ -0,0 +1,56 @@
+IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'C_ProcessCreate')
+ BEGIN
+ PRINT '<<< DROPPING PROCEDURE C_ProcessCreate >>>'
+ DROP Procedure C_ProcessCreate
+ END
+go
+------------------------------------------------------------------------------
+CREATE Procedure C_ProcessCreate
+(
+ @AD_Table_ID Identifier,
+ @Record_ID Identifier,
+ @AD_IProcess_ID Identifier OUTPUT
+)
+--WITH ENCRYPTION
+AS
+/******************************************************************************
+ * Author: Jorg Janke (c) ClassApps 1999
+ * Version: $Header: /cvs/adempiere/db/database/Procedures/C_ProcessCreate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ *
+ * Description:
+ * Create process for background execution
+ *
+ * Return values:
+ * Int_Process_ID
+ *
+ * Called by:
+ *
+ ******************************************************************************/
+BEGIN
+ Set NoCount ON
+ BEGIN TRANSACTION
+
+ SELECT @AD_IProcess_ID = ISNULL(MAX(AD_IProcess_ID), 0)+1
+ FROM AD_IProcess
+ ---------------------------------
+ INSERT INTO AD_IProcess
+ (AD_IProcess_ID, AD_Table_ID, Record_ID, IsProcessing, Updated)
+ VALUES
+ (@AD_IProcess_ID, @AD_Table_ID, @Record_ID, 'N', null)
+
+ IF (@@ERROR <> 0)
+ BEGIN
+ RAISERROR 60001 'Int_Process insert error'
+ ROLLBACK TRAN
+ RETURN(1)
+ END
+
+ COMMIT TRANSACTION
+END -- C_ProcessCreate
+go
+------------------------------------------------------------------------------
+IF OBJECT_ID('C_ProcessCreate') IS NOT NULL
+ PRINT '<<< CREATED PROCEDURE C_ProcessCreate >>>'
+ELSE
+ PRINT '<<< FAILED CREATING PROCEDURE C_ProcessCreate >>>'
+go
\ No newline at end of file
diff --git a/db/ddlutils/oracle/procedures/Cleanup.sql b/db/ddlutils/oracle/procedures/Cleanup.sql
new file mode 100644
index 0000000000..ff9ea7aa53
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/Cleanup.sql
@@ -0,0 +1,21 @@
+CREATE OR REPLACE PROCEDURE Cleanup
+/******************************************************************************
+ * ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Adempiere" to
+ * your product name; See license details http://www.adempiere.org/license.html
+ ******************************************************************************
+ * Cleanup old temporary data
+ */
+AS
+BEGIN
+ -- Processes
+ DELETE FROM AD_PInstance;
+ -- Search Info
+ DELETE FROM AD_Find;
+ -- Errors older than 1 week
+ DELETE AD_ERROR WHERE Created < SysDate-7;
+ --
+ COMMIT;
+END Cleanup;
+/
diff --git a/db/ddlutils/oracle/procedures/DBA_AfterImport.sql b/db/ddlutils/oracle/procedures/DBA_AfterImport.sql
new file mode 100644
index 0000000000..663bfe50b8
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/DBA_AfterImport.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE PROCEDURE DBA_AfterImport
+AS
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: DBA_AfterImport.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ * $Source: /cvs/adempiere/db/database/Procedures/DBA_AfterImport.sql,v $
+ ***
+ * Title: Run after Import
+ * Description:
+ * - Set Java Permissions
+ * - Recompile
+ * - Compute Statistics
+ *****************************************************************************/
+
+ -- Statistics
+ CURSOR Cur_Stat IS
+ SELECT Table_Name, Blocks
+ FROM USER_TABLES
+ WHERE DURATION IS NULL -- No temporary tables
+ AND Table_Name NOT LIKE '%$%'
+ AND (LAST_ANALYZED IS NULL OR LAST_ANALYZED < SysDate-7);
+ --
+ v_Cmd VARCHAR2(256);
+ v_NoC NUMBER := 0;
+ --
+BEGIN
+ -- Recompile
+ DBA_Recompile(NULL);
+
+ -- Statistics
+ FOR s IN Cur_Stat LOOP
+ v_Cmd := 'ANALYZE TABLE ' || s.Table_Name || ' COMPUTE STATISTICS';
+ -- DBMS_OUTPUT.PUT_LINE (v_Cmd);
+ v_NoC := v_NoC + 1;
+ EXECUTE IMMEDIATE v_Cmd;
+ END LOOP;
+ DBMS_OUTPUT.PUT_LINE ('Statistics computed: ' || v_NoC);
+ --
+END DBA_AfterImport;
+/
diff --git a/db/ddlutils/oracle/procedures/DBA_Cleanup.sql b/db/ddlutils/oracle/procedures/DBA_Cleanup.sql
new file mode 100644
index 0000000000..2161e25083
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/DBA_Cleanup.sql
@@ -0,0 +1,117 @@
+CREATE OR REPLACE PROCEDURE DBA_Cleanup
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: DBA_Cleanup.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Cleanup old temporary data
+ * Description:
+ ************************************************************************/
+AS
+BEGIN
+ DBMS_OUTPUT.PUT_LINE('DBA_Cleanup');
+ -- Clean up data
+ /**
+-- C_Invoice_CheckPaid();
+ UPDATE C_Payment_v
+ SET IsAllocated=CASE WHEN paymentAllocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
+ WHERE IsAllocated='N';
+ UPDATE C_Invoice_v1
+ SET IsPaid = CASE WHEN invoicePaid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
+ WHERE IsPaid='N';
+ **/
+
+ -- Temporary Tables
+ DELETE FROM T_Aging;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Aging=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_DistributionRunDetail;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_DistributionRunDetail=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_InventoryValue;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_InventoryValue=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_Replenish;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Replenish=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_Report;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Report=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_ReportStatement;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_ReportStatement=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_TrialBalance;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_TrialBalance=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_Selection;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Selection=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_Selection2;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Selection2=' || SQL%ROWCOUNT);
+ END IF;
+
+ DELETE FROM T_Spool;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' T_Spool=' || SQL%ROWCOUNT);
+ END IF;
+
+ -- Search Info
+ DELETE FROM AD_Find;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' AD_Find=' || SQL%ROWCOUNT);
+ END IF;
+
+ -- Processes older than a week
+ DELETE FROM AD_PInstance WHERE Created < SysDate-7;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' Old AD_PInstance=' || SQL%ROWCOUNT);
+ END IF;
+
+ /** Old Session (1 Week)
+ DELETE FROM AD_ChangeLog WHERE Created < SysDate-7;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' Old AD_ChangeLock=' || SQL%ROWCOUNT);
+ END IF;
+ DELETE FROM AD_Session WHERE Created < SysDate-7;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' Old AD_Session=' || SQL%ROWCOUNT);
+ END IF;
+ /** */
+
+ -- Errors older than 1 week
+ DELETE FROM AD_Error WHERE Created < SysDate-7;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' Old AD_Error=' || SQL%ROWCOUNT);
+ END IF;
+
+ -- Acknowledged Notes older than a day
+ DELETE FROM AD_Note WHERE Processed='Y' AND Updated < SysDate-1;
+ IF (SQL%ROWCOUNT <> 0) THEN
+ DBMS_OUTPUT.PUT_LINE(' Processed AD_Note=' || SQL%ROWCOUNT);
+ END IF;
+
+ --
+ COMMIT;
+END DBA_Cleanup;
+/
diff --git a/db/ddlutils/oracle/procedures/DBA_Recompile.sql b/db/ddlutils/oracle/procedures/DBA_Recompile.sql
new file mode 100644
index 0000000000..760c95dbaf
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/DBA_Recompile.sql
@@ -0,0 +1,148 @@
+CREATE OR REPLACE PROCEDURE DBA_Recompile
+(
+ p_PInstance_ID IN NUMBER -- DEFAULT NULL
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: DBA_Recompile.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Recompile all User_Objects
+ * Description:
+ ************************************************************************/
+AS
+ -- Logistice
+ v_Message VARCHAR2(2000) := ' ';
+ v_Result NUMBER := 1; -- 0=failure
+ --
+ v_Buffer VARCHAR2(2000);
+ v_Line VARCHAR(100);
+ v_PrintInfo CHAR(1) := 'N'; -- Diagnostic
+ --
+ CURSOR Cur_Invalids IS
+ SELECT object_id, object_name, object_type
+ FROM user_objects
+ WHERE status <> 'VALID'
+ AND object_type IN ('VIEW', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION',
+ 'PROCEDURE', 'TRIGGER', 'JAVA CLASS')
+ ORDER BY object_type, object_name;
+
+ CURSOR Cur_Valids (p_id NUMBER) IS
+ SELECT 'FOUND'
+ FROM user_objects
+ WHERE status = 'VALID'
+ AND object_id = p_id;
+
+ -- failed compile
+ TYPE invalid_tab IS TABLE OF Cur_Invalids%ROWTYPE INDEX BY BINARY_INTEGER;
+ invalid_tab_rec invalid_tab;
+
+ count_compiled PLS_INTEGER;
+ valid_text VARCHAR2(5);
+ exec_cursor PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
+ sql_statement VARCHAR2(200);
+ count_object PLS_INTEGER := 0;
+
+BEGIN
+ LOOP
+ count_compiled := 0;
+ FOR ci IN Cur_Invalids LOOP
+ -- not unsuccessfuly compiled yet
+ IF NOT invalid_tab_rec.EXISTS(ci.object_id) THEN
+ IF (ci.object_type = 'JAVA CLASS') THEN
+ sql_statement := 'ALTER JAVA CLASS "' || ci.object_name || '" RESOLVE';
+ ELSIF (ci.object_type = 'PACKAGE BODY') THEN
+ sql_statement := 'ALTER PACKAGE ' || ci.object_name || ' COMPILE BODY';
+ ELSE
+ sql_statement := 'ALTER ' || ci.object_type || ' ' || ci.object_name || ' COMPILE';
+ END IF;
+ -- compile
+ BEGIN
+ count_object := count_object + 1;
+ DBMS_SQL.PARSE(exec_cursor, sql_statement, DBMS_SQL.NATIVE);
+ EXCEPTION
+ WHEN OTHERS THEN
+ NULL;
+ END;
+ --
+ OPEN Cur_Valids (ci.object_ID);
+ FETCH Cur_Valids INTO valid_text;
+ IF Cur_Valids%ROWCOUNT > 0 THEN
+ IF (v_PrintInfo = 'Y') THEN
+ DBMS_OUTPUT.PUT_LINE('OK: ' || ci.object_type || ' ' || ci.object_name);
+ END IF;
+ count_compiled := count_compiled + 1;
+ CLOSE Cur_Valids;
+ EXIT;
+ ELSE
+ IF (LENGTH(v_Message) < 1950) THEN
+ v_Message := v_Message || ci.object_name || ' ';
+ END IF;
+ IF (v_PrintInfo = 'Y') THEN
+ DBMS_OUTPUT.PUT_LINE('Error: ' || ci.object_type || ' ' || ci.object_name);
+ END IF;
+ --
+ invalid_tab_rec(ci.object_id).object_name := ci.object_name;
+ invalid_tab_rec(ci.object_id).object_type := ci.object_type;
+ CLOSE Cur_Valids;
+ END IF;
+ END IF; -- not unsuccessfuly compiled yet
+ END LOOP; -- Cur_Invalids
+ -- any other to be compiled
+ IF count_compiled = 0 THEN
+ EXIT;
+ END IF;
+ END LOOP; -- outer loop
+
+ DBMS_SQL.CLOSE_CURSOR(exec_cursor);
+ --
+ -- Print Message
+ IF (LENGTH(v_Message) = 1) THEN
+ v_Message := 'All valid';
+ DBMS_OUTPUT.PUT_LINE(v_Message);
+ ELSIF (LENGTH(v_Message) > 80) THEN
+ v_Buffer := v_Message;
+ DBMS_OUTPUT.PUT_LINE('>');
+ WHILE (LENGTH(v_Buffer) > 0) LOOP
+ v_Line := SUBSTR(v_Buffer, 1, 80);
+ DBMS_OUTPUT.PUT_LINE(v_Line);
+ v_Buffer := SUBSTR(v_Buffer, 81);
+ END LOOP;
+ DBMS_OUTPUT.PUT_LINE('<');
+ v_Result := 0;
+ DBMS_OUTPUT.PUT_LINE('ERROR');
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('>' || v_Message || '<');
+ v_Result := 0;
+ DBMS_OUTPUT.PUT_LINE('ERROR');
+ END IF;
+
+<>
+ IF (p_PInstance_ID IS NOT NULL) THEN
+ -- Update AD_PInstance
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = v_Result, -- 1=success
+ ErrorMsg = v_Message
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ END IF;
+ COMMIT;
+ RETURN;
+
+
+EXCEPTION
+ WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE(SQLERRM);
+ IF DBMS_SQL.IS_OPEN(exec_cursor) THEN
+ DBMS_SQL.CLOSE_CURSOR(exec_cursor);
+ END IF;
+ IF Cur_Valids%ISOPEN THEN
+ CLOSE Cur_Valids;
+ END IF;
+END DBA_Recompile;
+/
diff --git a/db/ddlutils/oracle/procedures/Fact_Acct_Balance_Update.sql b/db/ddlutils/oracle/procedures/Fact_Acct_Balance_Update.sql
new file mode 100644
index 0000000000..5fcf9c1a96
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/Fact_Acct_Balance_Update.sql
@@ -0,0 +1,116 @@
+CREATE OR REPLACE PROCEDURE Fact_Acct_Balance_Update
+(
+ p_DeleteFirst IN VARCHAR2 DEFAULT 'N'
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: Fact_Acct_Balance_Update.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Update ALL Balances
+ * Description:
+ * - Recreates all Balances
+ ************************************************************************/
+AS
+BEGIN
+
+ IF (p_DeleteFirst = 'Y') THEN
+ DELETE Fact_Acct_Balance;
+ DBMS_OUTPUT.PUT_LINE(' Deletes=' || SQL%ROWCOUNT);
+ ELSE
+ /** Update **/
+ UPDATE Fact_Acct_Balance ab
+ SET (AmtAcctDr, AmtAcctCr, Qty) =
+ (SELECT COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
+ FROM Fact_Acct a
+ WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
+ AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
+ AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
+ AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
+ AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
+ AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
+ AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
+ AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
+ GROUP BY AD_Client_ID,AD_Org_ID,
+ C_AcctSchema_ID, TRUNC(DateAcct),
+ Account_ID, PostingType,
+ M_Product_ID, C_BPartner_ID,
+ C_Project_ID, AD_OrgTrx_ID,
+ C_SalesRegion_ID, C_Activity_ID,
+ C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
+ User1_ID, User2_ID, GL_Budget_ID)
+ WHERE EXISTS
+ (SELECT *
+ FROM Fact_Acct a
+ WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
+ AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
+ AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
+ AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
+ AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
+ AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
+ AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
+ AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
+ GROUP BY AD_Client_ID,AD_Org_ID,
+ C_AcctSchema_ID, TRUNC(DateAcct),
+ Account_ID, PostingType,
+ M_Product_ID, C_BPartner_ID,
+ C_Project_ID, AD_OrgTrx_ID,
+ C_SalesRegion_ID, C_Activity_ID,
+ C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
+ User1_ID, User2_ID, GL_Budget_ID);
+ DBMS_OUTPUT.PUT_LINE(' Updates=' || SQL%ROWCOUNT);
+ END IF;
+
+
+ /** Insert **/
+ INSERT INTO Fact_Acct_Balance ab
+ (AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, DateAcct,
+ Account_ID, PostingType,
+ M_Product_ID, C_BPartner_ID,
+ C_Project_ID, AD_OrgTrx_ID,
+ C_SalesRegion_ID,C_Activity_ID,
+ C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
+ User1_ID, User2_ID, GL_Budget_ID,
+ AmtAcctDr, AmtAcctCr, Qty)
+ --
+ SELECT AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, TRUNC(DateAcct),
+ Account_ID, PostingType,
+ M_Product_ID, C_BPartner_ID,
+ C_Project_ID, AD_OrgTrx_ID,
+ C_SalesRegion_ID,C_Activity_ID,
+ C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
+ User1_ID, User2_ID, GL_Budget_ID,
+ COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
+ FROM Fact_Acct a
+ WHERE NOT EXISTS
+ (SELECT *
+ FROM Fact_Acct_Balance x
+ WHERE a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID
+ AND a.C_AcctSchema_ID=x.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(x.DateAcct)
+ AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType
+ AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)
+ AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)
+ AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)
+ AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)
+ AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) )
+ GROUP BY AD_Client_ID,AD_Org_ID,
+ C_AcctSchema_ID, TRUNC(DateAcct),
+ Account_ID, PostingType,
+ M_Product_ID, C_BPartner_ID,
+ C_Project_ID, AD_OrgTrx_ID,
+ C_SalesRegion_ID, C_Activity_ID,
+ C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
+ User1_ID, User2_ID, GL_Budget_ID;
+ DBMS_OUTPUT.PUT_LINE(' Inserts=' || SQL%ROWCOUNT);
+
+ -----------------------
+ COMMIT;
+
+END Fact_Acct_Balance_Update;
+/
diff --git a/db/ddlutils/oracle/procedures/M_PriceList_Create.sql b/db/ddlutils/oracle/procedures/M_PriceList_Create.sql
new file mode 100644
index 0000000000..5c18436699
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/M_PriceList_Create.sql
@@ -0,0 +1,374 @@
+CREATE OR REPLACE PROCEDURE M_PriceList_Create
+(
+ PInstance_ID IN NUMBER
+)
+AS
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: M_PriceList_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Create Pricelist
+ * Description:
+ * Create PriceList by copying purchase prices (M_Product_PO)
+ * and applying product category discounts (M_CategoryDiscount)
+ ************************************************************************/
+ -- Logistice
+ ResultStr VARCHAR2(2000);
+ Message VARCHAR2(2000) := '';
+ NoRate EXCEPTION;
+ -- Parameter
+ CURSOR Cur_Parameter (PInstance NUMBER) IS
+ SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+ p_PriceList_Version_ID NUMBER;
+ p_DeleteOld CHAR(1) := 'N';
+ --
+ v_Currency_ID NUMBER;
+ v_Client_ID NUMBER;
+ v_Org_ID NUMBER;
+ v_UpdatedBy NUMBER;
+ v_StdPrecision NUMBER;
+ v_DiscountSchema_ID NUMBER;
+ v_PriceList_Version_Base_ID NUMBER;
+ --
+ v_NextNo NUMBER := 0;
+
+ -- Get PL Parameter
+ CURSOR Cur_DiscountLine (DiscountSchema_ID NUMBER) IS
+ SELECT *
+ FROM M_DiscountSchemaLine
+ WHERE M_DiscountSchema_ID=DiscountSchema_ID
+ AND IsActive='Y'
+ ORDER BY SeqNo;
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing');
+ ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (PInstance_ID) LOOP
+ p_PriceList_Version_ID := p.Record_ID;
+ IF (p.ParameterName = 'DeleteOld') THEN
+ p_DeleteOld := p.P_String;
+ DBMS_OUTPUT.PUT_LINE(' DeleteOld=' || p_DeleteOld);
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+ END IF;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' PriceList_Version_ID=' || p_PriceList_Version_ID);
+
+ -- Checking Prerequisites
+ -- -- PO Prices must exists
+ ResultStr := 'CorrectingProductPO';
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ UPDATE M_Product_PO
+ SET PriceList = 0
+ WHERE PriceList IS NULL;
+ UPDATE M_Product_PO
+ SET PriceLastPO = 0
+ WHERE PriceLastPO IS NULL;
+ UPDATE M_Product_PO
+ SET PricePO = PriceLastPO
+ WHERE (PricePO IS NULL OR PricePO = 0) AND PriceLastPO <> 0;
+ UPDATE M_Product_PO
+ SET PricePO = 0
+ WHERE PricePO IS NULL;
+ -- Set default current vendor
+ UPDATE M_Product_PO p
+ SET IsCurrentVendor = 'Y'
+ WHERE IsCurrentVendor = 'N'
+ AND NOT EXISTS
+ (SELECT pp.M_Product_ID FROM M_Product_PO pp
+ WHERE pp.M_Product_ID=p.M_Product_ID
+ GROUP BY pp.M_Product_ID HAVING COUNT(*) > 1);
+ COMMIT;
+
+ /**
+ * Make sure that we have only one active product
+ */
+ ResultStr := 'CorrectingDuplicates';
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ DECLARE
+ -- All duplicate products
+ CURSOR Cur_Duplicates IS
+ SELECT DISTINCT M_Product_ID
+ FROM M_Product_PO po
+ WHERE IsCurrentVendor='Y' AND IsActive='Y'
+ AND EXISTS ( SELECT M_Product_ID FROM M_Product_PO x
+ WHERE x.M_Product_ID=po.M_Product_ID
+ GROUP BY M_Product_ID HAVING COUNT(*) > 1 )
+ ORDER BY 1;
+ -- All vendors of Product - expensive first
+ CURSOR Cur_Vendors (Product_ID NUMBER) IS
+ SELECT M_Product_ID, C_BPartner_ID
+ FROM M_Product_PO
+ WHERE IsCurrentVendor='Y' AND IsActive='Y'
+ AND M_Product_ID=Product_ID
+ ORDER BY PriceList DESC;
+ --
+ Product_ID NUMBER;
+ BPartner_ID NUMBER;
+ BEGIN
+ FOR dupl IN Cur_Duplicates LOOP
+ OPEN Cur_Vendors (dupl.M_Product_ID);
+ FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Leave First
+ LOOP
+ FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Get Record ID
+ EXIT WHEN Cur_Vendors%NOTFOUND;
+ --
+ DBMS_OUTPUT.PUT_LINE(' Record: ' || Product_ID || ' / ' || BPartner_ID);
+ UPDATE M_Product_PO
+ SET IsCurrentVendor='N'
+ WHERE M_Product_ID=Product_ID AND C_BPartner_ID=BPartner_ID;
+ END LOOP;
+ CLOSE Cur_Vendors;
+ END LOOP;
+ COMMIT;
+ END;
+
+ /** Delete Old Data */
+ ResultStr := 'DeletingOld';
+ IF (p_DeleteOld = 'Y') THEN
+ DELETE M_ProductPrice
+ WHERE M_PriceList_Version_ID = p_PriceList_Version_ID;
+ Message := '@Deleted@=' || SQL%ROWCOUNT || ' - ';
+ DBMS_OUTPUT.PUT_LINE(Message);
+ END IF;
+
+ -- Get PriceList Info
+ ResultStr := 'GetPLInfo';
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ SELECT p.C_Currency_ID, c.StdPrecision,
+ v.AD_Client_ID, v.AD_Org_ID, v.UpdatedBy,
+ v.M_DiscountSchema_ID, M_PriceList_Version_Base_ID
+ INTO v_Currency_ID, v_StdPrecision,
+ v_Client_ID, v_Org_ID, v_UpdatedBy,
+ v_DiscountSchema_ID, v_PriceList_Version_Base_ID
+ FROM M_PriceList p, M_PriceList_Version v, C_Currency c
+ WHERE p.M_PriceList_ID=v.M_PriceList_ID
+ AND p.C_Currency_ID=c.C_Currency_ID
+ AND v.M_PriceList_Version_ID=p_PriceList_Version_ID;
+
+ /**
+ * For All Discount Lines in Sequence
+ */
+ FOR dl IN Cur_DiscountLine (v_DiscountSchema_ID) LOOP
+ ResultStr := 'Parameter Seq=' || dl.SeqNo;
+ -- DBMS_OUTPUT.PUT_LINE(ResultStr);
+
+ -- Clear Temporary Table
+ DELETE FROM T_Selection;
+
+ -- -----------------------------------
+ -- Create Selection in temporary table
+ -- -----------------------------------
+ IF (v_PriceList_Version_Base_ID IS NULL) THEN
+ -- Create Selection from M_Product_PO
+ INSERT INTO T_Selection (T_Selection_ID)
+ SELECT DISTINCT po.M_Product_ID
+ FROM M_Product p, M_Product_PO po
+ WHERE p.M_Product_ID=po.M_Product_ID
+ AND (p.AD_Client_ID=v_Client_ID OR p.AD_Client_ID=0)
+ AND p.IsActive='Y' AND po.IsActive='Y' AND po.IsCurrentVendor='Y'
+ -- Optional Restrictions
+ AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
+ AND (dl.C_BPartner_ID IS NULL OR po.C_BPartner_ID=dl.C_BPartner_ID)
+ AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
+ ELSE
+ -- Create Selection from existing PriceList
+ INSERT INTO T_Selection (T_Selection_ID)
+ SELECT DISTINCT p.M_Product_ID
+ FROM M_Product p, M_ProductPrice pp
+ WHERE p.M_Product_ID=pp.M_Product_ID
+ AND pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
+ AND p.IsActive='Y' AND pp.IsActive='Y'
+ -- Optional Restrictions
+ AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
+ AND (dl.C_BPartner_ID IS NULL OR EXISTS
+ (SELECT * FROM M_Product_PO po WHERE po.M_Product_ID=p.M_Product_ID AND po.C_BPartner_ID=dl.C_BPartner_ID))
+ AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
+ END IF;
+ Message := Message || '@Selected@=' || SQL%ROWCOUNT;
+ -- DBMS_OUTPUT.PUT_LINE(Message);
+
+ -- Delete Prices in Selection, so that we can insert
+ IF (v_PriceList_Version_Base_ID IS NULL
+ OR v_PriceList_Version_Base_ID <> p_PriceList_Version_ID) THEN
+ ResultStr := ResultStr || ', Delete';
+ DELETE M_ProductPrice pp
+ WHERE pp.M_PriceList_Version_ID = p_PriceList_Version_ID
+ AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID);
+ Message := ', @Deleted@=' || SQL%ROWCOUNT;
+ END IF;
+
+ -- --------------------
+ -- Copy (Insert) Prices
+ -- --------------------
+ IF (v_PriceList_Version_Base_ID = p_PriceList_Version_ID) THEN
+ -- We have Prices already
+ NULL;
+ ELSIF (v_PriceList_Version_Base_ID IS NULL) THEN
+ -- Copy and Convert from Product_PO
+ ResultStr := ResultStr || ',Copy_PO';
+ INSERT INTO M_ProductPrice
+ (M_PriceList_Version_ID, M_Product_ID,
+ AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ PriceList, PriceStd, PriceLimit)
+ SELECT
+ p_PriceList_Version_ID, po.M_Product_ID,
+ v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
+ -- Price List
+ COALESCE(currencyConvert(po.PriceList,
+ po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
+ -- Price Std
+ COALESCE(currencyConvert(po.PriceList,
+ po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
+ -- Price Limit
+ COALESCE(currencyConvert(po.PricePO,
+ po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
+ FROM M_Product_PO po
+ WHERE EXISTS (SELECT * FROM T_Selection s WHERE po.M_Product_ID=s.T_Selection_ID)
+ AND po.IsCurrentVendor='Y' AND po.IsActive='Y';
+ ELSE
+ -- Copy and Convert from other PriceList_Version
+ ResultStr := ResultStr || ',Copy_PL';
+ INSERT INTO M_ProductPrice
+ (M_PriceList_Version_ID, M_Product_ID,
+ AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ PriceList, PriceStd, PriceLimit)
+ SELECT
+ p_PriceList_Version_ID, pp.M_Product_ID,
+ v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
+ -- Price List
+ COALESCE(currencyConvert(pp.PriceList,
+ pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
+ -- Price Std
+ COALESCE(currencyConvert(pp.PriceStd,
+ pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
+ -- Price Limit
+ COALESCE(currencyConvert(pp.PriceLimit,
+ pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
+ FROM M_ProductPrice pp
+ INNER JOIN M_PriceList_Version plv ON (pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID)
+ INNER JOIN M_PriceList pl ON (plv.M_PriceList_ID=pl.M_PriceList_ID)
+ WHERE pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
+ AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID)
+ AND pp.IsActive='Y';
+ END IF;
+ Message := Message || ', @Inserted@=' || SQL%ROWCOUNT;
+
+ -- -----------
+ -- Calculation
+ -- -----------
+ ResultStr := ResultStr || ',Calc';
+ UPDATE M_ProductPrice p
+ SET PriceList = (DECODE(dl.List_Base, 'S', PriceStd, 'X', PriceLimit, PriceList)
+ + dl.List_AddAmt) * (1 - dl.List_Discount/100),
+ PriceStd = (DECODE(dl.Std_Base, 'L', PriceList, 'X', PriceLimit, PriceStd)
+ + dl.Std_AddAmt) * (1 - dl.Std_Discount/100),
+ PriceLimit = (DECODE(dl.Limit_Base, 'L', PriceList, 'S', PriceStd, PriceLimit)
+ + dl.Limit_AddAmt) * (1 - dl.Limit_Discount/100)
+ WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
+ AND EXISTS (SELECT * FROM T_Selection s
+ WHERE s.T_Selection_ID=p.M_Product_ID);
+
+ -- --------
+ -- Rounding (AD_Reference_ID=155)
+ -- --------
+ ResultStr := ResultStr || ',Round';
+ UPDATE M_ProductPrice p
+ SET PriceList = DECODE(dl.List_Rounding,
+ 'N', PriceList,
+ '0', ROUND(PriceList, 0), -- Even .00
+ 'D', ROUND(PriceList, 1), -- Dime .10
+ 'T', ROUND(PriceList, -1), -- Ten 10.00
+ '5', ROUND(PriceList*20,0)/20, -- Nickle .05
+ 'Q', ROUND(PriceList*4,0)/4, -- Quarter .25
+ ROUND(PriceList, v_StdPrecision)),-- Currency
+ PriceStd = DECODE(dl.Std_Rounding,
+ 'N', PriceStd,
+ '0', ROUND(PriceStd, 0), -- Even .00
+ 'D', ROUND(PriceStd, 1), -- Dime .10
+ 'T', ROUND(PriceStd, -1), -- Ten 10.00
+ '5', ROUND(PriceStd*20,0)/20, -- Nickle .05
+ 'Q', ROUND(PriceStd*4,0)/4, -- Quarter .25
+ ROUND(PriceStd, v_StdPrecision)), -- Currency
+ PriceLimit = DECODE(dl.Limit_Rounding,
+ 'N', PriceLimit,
+ '0', ROUND(PriceLimit, 0), -- Even .00
+ 'D', ROUND(PriceLimit, 1), -- Dime .10
+ 'T', ROUND(PriceLimit, -1), -- Ten 10.00
+ '5', ROUND(PriceLimit*20,0)/20, -- Nickle .05
+ 'Q', ROUND(PriceLimit*4,0)/4, -- Quarter .25
+ ROUND(PriceLimit, v_StdPrecision))-- Currency
+ WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
+ AND EXISTS (SELECT * FROM T_Selection s
+ WHERE s.T_Selection_ID=p.M_Product_ID);
+ Message := Message || ', @Updated@=' || SQL%ROWCOUNT;
+
+ -- Fixed Price overwrite
+ ResultStr := ResultStr || ',Fix';
+ UPDATE M_ProductPrice p
+ SET PriceList = DECODE(dl.List_Base, 'F', dl.List_Fixed, PriceList),
+ PriceStd = DECODE(dl.Std_Base, 'F', dl.Std_Fixed, PriceStd),
+ PriceLimit = DECODE(dl.Limit_Base, 'F', dl.Limit_Fixed, PriceLimit)
+ WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
+ AND EXISTS (SELECT * FROM T_Selection s
+ WHERE s.T_Selection_ID=p.M_Product_ID);
+
+ -- Log Info
+ INSERT INTO AD_PInstance_Log (AD_PInstance_ID, Log_ID, P_ID, P_NUMBER, P_MSG)
+ VALUES (PInstance_ID, v_NextNo, null, dl.SeqNo, Message);
+ --
+ v_NextNo := v_NextNo + 1;
+ Message := '';
+ END LOOP; -- For all DiscountLines
+
+ -- Delete Temporary Selection
+ DELETE FROM T_Selection;
+
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE(Message);
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished');
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 1, -- success
+ ErrorMsg = Message
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ ResultStr := ResultStr || ':' || SQLERRM || ' ' || Message;
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = ResultStr
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END M_PriceList_Create;
+/
diff --git a/db/ddlutils/oracle/procedures/M_Product_BOM_Check.sql b/db/ddlutils/oracle/procedures/M_Product_BOM_Check.sql
new file mode 100644
index 0000000000..94c845e410
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/M_Product_BOM_Check.sql
@@ -0,0 +1,147 @@
+CREATE OR REPLACE PROCEDURE M_Product_BOM_Check
+(
+ PInstance_ID IN NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: M_Product_BOM_Check.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Check BOM Structure (free of cycles)
+ * Description:
+ * Tree cannot contain BOMs which are already referenced
+ ************************************************************************/
+AS
+ -- Logistice
+ ResultStr VARCHAR2(2000);
+ Message VARCHAR2(2000);
+ Record_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (PInstance NUMBER) IS
+ SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Variables
+ Verified CHAR(1) := 'Y';
+ IsBOM CHAR(1);
+ CountNo NUMBER;
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
+ ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (PInstance_ID) LOOP
+ Record_ID := p.Record_ID;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
+
+ -- Record ID is M_Product_ID of product to be tested
+ SELECT IsBOM
+ INTO IsBOM
+ FROM M_Product
+ WHERE M_Product_ID=Record_ID;
+
+ -- No BOM - should not happen, but no problem
+ IF (IsBOM = 'N') THEN
+ GOTO FINISH_PROCESS;
+ -- Did not find product
+ ELSIF (IsBOM <> 'Y') THEN
+ RETURN;
+ END IF;
+
+ -- Checking BOM Structure
+ ResultStr := 'InsertingRoot';
+ -- Table to put all BOMs - duplicate will cause exception
+ DELETE FROM T_Selection2 WHERE Query_ID = 0;
+ INSERT INTO T_Selection2 (Query_ID, T_Selection_ID) VALUES (0, Record_ID);
+ -- Table of root modes
+ DELETE FROM T_Selection;
+ INSERT INTO T_Selection (T_Selection_ID) VALUES (Record_ID);
+
+ LOOP
+ -- How many do we have?
+ SELECT COUNT(*)
+ INTO CountNo
+ FROM T_Selection;
+ -- Nothing to do
+ EXIT WHEN (CountNo = 0);
+
+ -- Insert BOM Nodes into "All" table
+ INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
+ SELECT 0, p.M_Product_ID
+ FROM M_Product p
+ WHERE IsBOM='Y'
+ AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
+ AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
+
+ -- Insert BOM Nodes into temporary table
+ DELETE FROM T_Selection2 WHERE Query_ID = 1;
+ INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
+ SELECT 1, p.M_Product_ID
+ FROM M_Product p
+ WHERE IsBOM='Y'
+ AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
+ AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
+
+ -- Copy into root table
+ DELETE FROM T_Selection;
+ INSERT INTO T_Selection (T_Selection_ID)
+ SELECT T_Selection_ID
+ FROM T_Selection2
+ WHERE Query_ID = 1;
+
+ END LOOP;
+
+<>
+ -- OK
+ Message := 'OK';
+ UPDATE M_Product
+ SET IsVerified = 'Y'
+ WHERE M_Product_ID=Record_ID;
+
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 1, -- success
+ ErrorMsg = Message
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = ResultStr
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ --
+ UPDATE M_Product
+ SET IsVerified = 'N'
+ WHERE M_Product_ID=Record_ID;
+ COMMIT;
+ --
+ RETURN;
+
+END M_Product_BOM_Check;
+/
diff --git a/db/ddlutils/oracle/procedures/M_Product_Delete.sql b/db/ddlutils/oracle/procedures/M_Product_Delete.sql
new file mode 100644
index 0000000000..cc878d536c
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/M_Product_Delete.sql
@@ -0,0 +1,37 @@
+CREATE OR REPLACE PROCEDURE M_Product_Delete
+(
+ whereClause IN VARCHAR2 DEFAULT NULL
+)
+AS
+/******************************************************************************
+ * ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
+ * Open Source Software Provided "AS IS" without warranty or liability
+ * When you use any parts (changed or unchanged), add "Powered by Adempiere" to
+ * your product name; See license details http://www.adempiere.org/license.html
+ ******************************************************************************
+ * Delete Products
+ */
+ CURSOR CUR_DEL IS
+ SELECT M_Product_ID, Value, Name
+ FROM M_Product
+ WHERE IsActive='N';
+ --
+ SQL_Base VARCHAR2(255) := 'SELECT M_Product_ID FROM M_Product WHERE ';
+-- SQL_Where VARCHAR2(255) := 'ValueX IN (SELECT ValueX FROM M_Product GROUP BY ValueX HAVING Count(*) <> 1) AND INSTR(Value,''@'') <> 0';
+ SQL_Statement VARCHAR2(255);
+BEGIN
+ -- Delete inactive
+ IF (whereClause IS NULL OR LENGTH(whereClause) = 0) THEN
+ For d IN CUR_DEL LOOP
+ BEGIN
+ DBMS_OUTPUT.PUT('Deleting ' || d.Name || ' - ');
+ DELETE M_Product
+ WHERE M_Product_ID=d.M_Product_ID;
+ DBMS_OUTPUT.PUT_LINE('OK');
+ EXCEPTION WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE('Error ' || SQLERRM);
+ END;
+ END LOOP;
+ END IF;
+END M_Product_Delete;
+/
diff --git a/db/ddlutils/oracle/procedures/M_Production_Run.sql b/db/ddlutils/oracle/procedures/M_Production_Run.sql
new file mode 100644
index 0000000000..4f6ed64390
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/M_Production_Run.sql
@@ -0,0 +1,298 @@
+CREATE OR REPLACE PROCEDURE M_Production_Run
+(
+ PInstance_ID IN NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: M_Production_Run.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Production of BOMs
+ * Description:
+ * 1) Creating ProductionLines when IsCreated = 'N'
+ * 2) Posting the Lines (optionally only when fully stocked)
+ ************************************************************************/
+AS
+ -- Logistice
+ ResultStr VARCHAR2(2000);
+ Message VARCHAR2(2000);
+ Record_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (PInstance NUMBER) IS
+ SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+ MustBeStocked CHAR(1);
+ IsCreated CHAR(1);
+ Processed CHAR(1);
+ Client_ID NUMBER;
+ Org_ID NUMBER;
+ --
+ Line NUMBER;
+ NextNo NUMBER;
+ CountNo NUMBER;
+ -- ProductionPlan
+ CURSOR CUR_PP IS
+ SELECT *
+ FROM M_ProductionPlan
+ WHERE M_Production_ID=Record_ID
+ ORDER BY Line, M_Product_ID;
+ -- BOM Lines
+ CURSOR CUR_BOM (Product_ID NUMBER) IS
+ SELECT *
+ FROM M_Product_BOM
+ WHERE M_Product_ID=Product_ID
+ ORDER BY Line;
+ -- ProductionLines which are non-stocked BOMs (need to be resolved)
+ CURSOR CUR_PLineBOM (ProductionPlan_ID NUMBER) IS
+ SELECT pl.M_ProductionLine_ID, pl.Line, pl.M_Product_ID, pl.MovementQty
+ FROM M_ProductionLine pl, M_Product p
+ WHERE pl.M_ProductionPlan_ID=ProductionPlan_ID
+ AND pl.M_Product_ID=p.M_Product_ID
+ AND pl.Line<>100 -- Origin Line
+ AND p.IsBOM='Y' AND p.IsStocked='N';
+
+ -- Posting
+ CURSOR CUR_PL_Post IS
+ SELECT pl.M_ProductionLine_ID, pl.AD_Client_ID, pl.AD_Org_ID, p.MovementDate,
+ pl.M_Product_ID, pl.M_AttributeSetInstance_ID, pl.MovementQty, pl.M_Locator_ID
+ FROM M_Production p, M_ProductionLine pl, M_ProductionPlan pp
+ WHERE p.M_Production_ID=pp.M_Production_ID
+ AND pp.M_ProductionPlan_ID=pl.M_ProductionPlan_ID
+ AND pp.M_Production_ID=Record_ID
+ ORDER BY pp.Line, pl.Line;
+
+
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
+ ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (PInstance_ID) LOOP
+ Record_ID := p.Record_ID;
+ IF (p.ParameterName = 'MustBeStocked') THEN
+ MustBeStocked := p.P_String;
+ DBMS_OUTPUT.PUT_LINE(' MustBeStocked=' || MustBeStocked);
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+ END IF;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
+
+ -- Processing??? Lock ????
+ -- TODO
+
+ /**
+ * Get Info + Lock
+ */
+ ResultStr := 'ReadingRecord';
+ SELECT IsCreated, Processed, AD_Client_ID, AD_Org_ID
+ INTO IsCreated, Processed, Client_ID, Org_ID
+ FROM M_Production
+ WHERE M_Production_ID=Record_ID
+ FOR UPDATE;
+
+ /**
+ * No Action
+ */
+ IF (Processed <> 'N') THEN
+ Message := '@AlreadyPosted@';
+ GOTO FINISH_PROCESS;
+ END IF;
+
+ /**************************************************************************
+ * Create Lines
+ */
+ IF (IsCreated <> 'Y') THEN
+ -- For every Production Plan
+ FOR pp IN CUR_PP LOOP
+ -- Delete prior lines
+ DELETE M_ProductionLine
+ WHERE M_ProductionPlan_ID=pp.M_ProductionPlan_ID;
+ -- DBMS_OUTPUT.PUT_LINE('ProductionPlan=' || pp.M_ProductionPlan_ID);
+ -- Create BOM Line
+ ResultStr := 'CreatingLine BOM';
+ Line := 100; -- OriginLine
+ AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
+ INSERT INTO M_ProductionLine
+ (M_ProductionLine_ID, M_ProductionPlan_ID, Line,
+ AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
+ M_Product_ID, MovementQty, M_Locator_ID, Description)
+ VALUES
+ (NextNo, pp.M_ProductionPlan_ID, Line,
+ pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
+ pp.M_Product_ID, pp.ProductionQty, pp.M_Locator_ID, pp.Description);
+
+ -- Create First Level
+ FOR bom IN CUR_BOM (pp.M_Product_ID) LOOP
+ ResultStr := 'CreatingLine Products';
+ Line := Line + 100;
+ AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
+ INSERT INTO M_ProductionLine
+ (M_ProductionLine_ID, M_ProductionPlan_ID, Line,
+ AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
+ M_Product_ID, MovementQty, M_Locator_ID)
+ VALUES
+ (NextNo, pp.M_ProductionPlan_ID, Line,
+ pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
+ bom.M_ProductBOM_ID, -pp.ProductionQty*bom.BOMQty, pp.M_Locator_ID);
+ END LOOP;
+
+ -- While we have BOMs
+ LOOP
+ -- Are there non-stored BOMs to list details?
+ ResultStr := 'CreatingLine CheckBOM';
+ SELECT COUNT(*) INTO CountNo
+ FROM M_ProductionLine pl, M_Product p
+ WHERE pl.M_Product_ID=p.M_Product_ID
+ AND pl.M_ProductionPlan_ID=pp.M_ProductionPlan_ID
+ AND pl.Line<>100 -- Origin Line
+ AND p.IsBOM='Y' AND p.IsStocked='N';
+ -- Nothing to do
+ EXIT WHEN (CountNo = 0);
+ --
+
+ -- Resolve BOMs in ProductLine which are not stocked
+ FOR pl IN CUR_PLineBOM (pp.M_ProductionPlan_ID) LOOP
+ ResultStr := 'CreatingLineBOM Resolution';
+ Line := pl.Line;
+ -- Resolve BOM Line in product line
+ FOR bom IN CUR_BOM (pl.M_Product_ID) LOOP
+ ResultStr := 'CreatingLine Products2';
+ Line := Line + 10;
+ AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
+ INSERT INTO M_ProductionLine
+ (M_ProductionLine_ID, M_ProductionPlan_ID, Line,
+ AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
+ M_Product_ID, MovementQty, M_Locator_ID)
+ VALUES
+ (NextNo, pp.M_ProductionPlan_ID, Line,
+ pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
+ bom.M_ProductBOM_ID, pl.MovementQty*bom.BOMQty, pp.M_Locator_ID);
+ END LOOP;
+ -- Delete BOM line
+ DELETE M_ProductionLine
+ WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
+ END LOOP;
+ END LOOP; -- While we have BOMs
+
+ END LOOP; -- For every Production Plan
+
+ -- Modifying locator to have sufficient stock
+
+
+ -- Indicate that it is Created
+ UPDATE M_Production
+ SET IsCreated='Y'
+ WHERE M_Production_ID=Record_ID;
+
+ /**************************************************************************
+ * Post Lines
+ */
+ ELSE
+ -- All Production Lines
+ FOR pl IN CUR_PL_Post LOOP
+ -- M_ProductionLine_ID, AD_Client_ID, AD_Org_ID, MovementDate, M_Product_ID, MovementQty, M_Locator_ID
+ -- DBMS_OUTPUT.PUT_LINE('ProductionLine=' || pl.M_ProductionLine_ID);
+ -- DBMS_OUTPUT.PUT_LINE(' Qty=' || pl.MovementQty || ', OnHand=' || BOM_Qty_OnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID));
+ -- Check Stock levels for reductions
+ IF (pl.MovementQty < 0 AND MustBeStocked <> 'N'
+ AND bomQtyOnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID)+pl.MovementQty < 0) THEN
+ ROLLBACK;
+ SELECT '@NotEnoughStocked@: ' || Name INTO Message
+ FROM M_Product WHERE M_Product_ID=pl.M_Product_ID;
+ GOTO FINISH_PROCESS;
+ END IF;
+
+ -- Adjust Quantity at Location
+ UPDATE M_Storage
+ SET QtyOnHand = QtyOnHand + pl.MovementQty,
+ Updated = SysDate
+ WHERE M_Locator_ID = pl.M_Locator_ID
+ AND M_AttributeSetInstance_ID = COALESCE(pl.M_AttributeSetInstance_ID,0)
+ AND M_Product_ID = pl.M_Product_ID;
+ -- Product not on Stock yet
+ IF (SQL%ROWCOUNT = 0) THEN
+ INSERT INTO M_Storage
+ (M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID,
+ AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ QtyOnHand, QtyReserved, QtyOrdered)
+ VALUES
+ (pl.M_Product_ID, pl.M_Locator_ID, COALESCE(pl.M_AttributeSetInstance_ID,0),
+ pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
+ pl.MovementQty, 0, 0);
+ END IF;
+
+ -- Create Transaction Entry
+ ResultStr := 'CreateTransaction';
+ AD_Sequence_Next('M_Transaction', pl.AD_Org_ID, NextNo);
+ INSERT INTO M_Transaction
+ (M_Transaction_ID, M_ProductionLine_ID,
+ AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ MovementType, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,
+ MovementDate, MovementQty)
+ VALUES
+ (NextNo, pl.M_ProductionLine_ID,
+ pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
+ 'P+', pl.M_Locator_ID, pl.M_Product_ID, COALESCE(pl.M_AttributeSetInstance_ID,0), -- not distinguishing between assemby/disassembly
+ pl.MovementDate, pl.MovementQty);
+ --
+ UPDATE M_ProductionLine
+ SET Processed='Y'
+ WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
+ END LOOP;
+
+ -- Indicate that we are done
+ UPDATE M_Production
+ SET Processed='Y'
+ WHERE M_Production_ID=Record_ID;
+ UPDATE M_ProductionPlan
+ SET Processed='Y'
+ WHERE M_Production_ID=Record_ID;
+
+ END IF;
+ -- Only commit when entire job successful
+ COMMIT;
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 1, -- success
+ ErrorMsg = Message
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
+ DBMS_OUTPUT.PUT_LINE(ResultStr);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = ResultStr
+ WHERE AD_PInstance_ID=PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END M_Production_Run;
+/
diff --git a/db/ddlutils/oracle/procedures/T_InventoryValue_Create.sql b/db/ddlutils/oracle/procedures/T_InventoryValue_Create.sql
new file mode 100644
index 0000000000..b9c7d9e96f
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/T_InventoryValue_Create.sql
@@ -0,0 +1,198 @@
+CREATE OR REPLACE PROCEDURE T_InventoryValue_Create
+(
+ p_PInstance_ID IN NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: T_InventoryValue_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Inventory Valuation Temporary Table
+ * Description:
+ ************************************************************************/
+AS
+ -- Logistice
+ v_ResultStr VARCHAR2(2000);
+ v_Message VARCHAR2(2000);
+ v_Result NUMBER := 1; -- 0=failure
+ v_Record_ID NUMBER;
+ v_AD_User_ID NUMBER;
+ -- Parameter
+ CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
+ SELECT i.Record_ID, i.AD_User_ID,
+ p.ParameterName, p.P_String, p.P_Number, p.P_Date
+ FROM AD_PInstance i, AD_PInstance_Para p
+ WHERE i.AD_PInstance_ID=pp_PInstance
+ AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
+ ORDER BY p.SeqNo;
+ -- Parameter Variables
+ p_M_PriceList_Version_ID NUMBER(10);
+ p_DateValue DATE;
+ p_M_Warehouse_ID NUMBER(10);
+ p_C_Currency_ID NUMBER(10);
+
+BEGIN
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
+ v_ResultStr := 'PInstanceNotFound';
+ UPDATE AD_PInstance
+ SET Created = SysDate,
+ IsProcessing = 'Y'
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+
+ -- Get Parameters
+ v_ResultStr := 'ReadingParameters';
+ FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
+ v_Record_ID := p.Record_ID;
+ v_AD_User_ID := p.AD_User_ID;
+ IF (p.ParameterName = 'M_PriceList_Version_ID') THEN
+ p_M_PriceList_Version_ID := p.P_Number;
+ DBMS_OUTPUT.PUT_LINE(' M_PriceList_Version_ID=' || p_M_PriceList_Version_ID);
+ ELSIF (p.ParameterName = 'DateValue') THEN
+ p_DateValue := p.P_Date;
+ DBMS_OUTPUT.PUT_LINE(' DateValue=' || p_DateValue);
+ ELSIF (p.ParameterName = 'M_Warehouse_ID') THEN
+ p_M_Warehouse_ID := p.P_Number;
+ DBMS_OUTPUT.PUT_LINE(' M_Warehouse_ID=' || p_M_Warehouse_ID);
+ ELSIF (p.ParameterName = 'C_Currency_ID') THEN
+ p_C_Currency_ID := p.P_Number;
+ DBMS_OUTPUT.PUT_LINE(' C_Currency_ID=' || p_C_Currency_ID);
+ ELSE
+ DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
+ END IF;
+ END LOOP; -- Get Parameter
+ DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
+
+ -- Clear
+-- v_ResultStr := 'ClearTable';
+-- DELETE T_InventoryValue WHERE M_Warehouse_ID=p_M_Warehouse_ID;
+-- COMMIT;
+
+ -- Insert Products
+ v_ResultStr := 'InsertStockedProducts';
+ INSERT INTO T_InventoryValue
+ (AD_Client_ID,AD_Org_ID, AD_PInstance_ID, M_Warehouse_ID,M_Product_ID)
+ SELECT AD_Client_ID,AD_Org_ID, p_PInstance_ID, p_M_Warehouse_ID,M_Product_ID
+ FROM M_Product
+ WHERE IsStocked='Y';
+ --
+ IF (SQL%ROWCOUNT = 0) THEN
+ v_Message := '@Created@ = 0';
+ GOTO FINISH_PROCESS;
+ END IF;
+
+ -- Update Constants
+ v_ResultStr := 'UpdateConstants';
+ UPDATE T_InventoryValue
+ SET DateValue = TRUNC(p_DateValue) + 0.9993,
+ M_PriceList_Version_ID = p_M_PriceList_Version_ID,
+ C_Currency_ID = p_C_Currency_ID
+ WHERE M_Warehouse_ID = p_M_Warehouse_ID;
+
+ -- Get current QtyOnHand
+ v_ResultStr := 'GetQtyOnHand';
+ UPDATE T_InventoryValue iv
+ SET QtyOnHand = (SELECT SUM(QtyOnHand) FROM M_Storage s, M_Locator l
+ WHERE iv.M_Product_ID=s.M_Product_ID
+ AND l.M_Locator_ID=s.M_Locator_ID
+ AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
+ WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
+
+ -- Adjust for Valuation Date
+ v_ResultStr := 'AdjustQtyOnHand';
+ UPDATE T_InventoryValue iv
+ SET QtyOnHand =
+ (SELECT iv.QtyOnHand - NVL(SUM(t.MovementQty), 0)
+ FROM M_Transaction t, M_Locator l
+ WHERE t.M_Product_ID=iv.M_Product_ID
+ -- AND t.M_AttributeSetInstance_ID=iv.M_AttributeSetInstance_ID
+ AND t.MovementDate > iv.DateValue
+ AND t.M_Locator_ID=l.M_Locator_ID
+ AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
+ WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
+
+ -- Delete Records w/o OnHand Qty
+ v_ResultStr := 'DeleteZeroQtyOnHand';
+ DELETE T_InventoryValue
+ WHERE QtyOnHand=0
+ OR QtyOnHand IS NULL;
+
+ -- Update Prices
+ v_ResultStr := 'GetPrices';
+ UPDATE T_InventoryValue iv
+ SET PricePO =
+ (SELECT currencyConvert (po.PriceList,po.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
+ FROM M_Product_PO po WHERE po.M_Product_ID=iv.M_Product_ID
+ AND po.IsCurrentVendor='Y' AND RowNum=1),
+ PriceList =
+ (SELECT currencyConvert(pp.PriceList,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
+ FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
+ WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
+ AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
+ AND plv.M_PriceList_ID=pl.M_PriceList_ID),
+ PriceStd =
+ (SELECT currencyConvert(pp.PriceStd,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
+ FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
+ WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
+ AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
+ AND plv.M_PriceList_ID=pl.M_PriceList_ID),
+ PriceLimit =
+ (SELECT currencyConvert(pp.PriceLimit,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
+ FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
+ WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
+ AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
+ AND plv.M_PriceList_ID=pl.M_PriceList_ID),
+ CostStandard =
+ (SELECT currencyConvert(pc.CurrentCostPrice,acs.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
+ FROM AD_ClientInfo ci, C_AcctSchema acs, M_Product_Costing pc
+ WHERE iv.AD_Client_ID=ci.AD_Client_ID AND ci.C_AcctSchema1_ID=acs.C_AcctSchema_ID
+ AND acs.C_AcctSchema_ID=pc.C_AcctSchema_ID
+ AND iv.M_Product_ID=pc.M_Product_ID)
+ WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
+
+ -- Update Values
+ v_ResultStr := 'UpdateValue';
+ UPDATE T_InventoryValue
+ SET PricePOAmt = QtyOnHand * PricePO,
+ PriceListAmt = QtyOnHand * PriceList,
+ PriceStdAmt = QtyOnHand * PriceStd,
+ PriceLimitAmt = QtyOnHand * PriceLimit,
+ CostStandardAmt = QtyOnHand * CostStandard
+ WHERE M_Warehouse_ID = p_M_Warehouse_ID;
+
+ v_Message := '@Created@ = ' || SQL%ROWCOUNT;
+
+
+<>
+ -- Update AD_PInstance
+ DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = v_Result, -- 1=success
+ ErrorMsg = v_Message
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+EXCEPTION
+ WHEN OTHERS THEN
+ v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
+ DBMS_OUTPUT.PUT_LINE(v_ResultStr);
+ ROLLBACK;
+ UPDATE AD_PInstance
+ SET Updated = SysDate,
+ IsProcessing = 'N',
+ Result = 0, -- failure
+ ErrorMsg = v_ResultStr
+ WHERE AD_PInstance_ID=p_PInstance_ID;
+ COMMIT;
+ RETURN;
+
+END T_InventoryValue_Create;
+/
diff --git a/db/ddlutils/oracle/procedures/nextID.sql b/db/ddlutils/oracle/procedures/nextID.sql
new file mode 100644
index 0000000000..2d23db2471
--- /dev/null
+++ b/db/ddlutils/oracle/procedures/nextID.sql
@@ -0,0 +1,55 @@
+CREATE OR REPLACE PROCEDURE nextID
+(
+ p_AD_Sequence_ID IN NUMBER,
+ p_System IN CHAR,
+ o_NextID OUT NUMBER
+)
+/*************************************************************************
+ * The contents of this file are subject to the Adempiere License. You may
+ * obtain a copy of the License at http://www.adempiere.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: Adempiere ERP+CRM
+ * Copyright (C) 1999-2005 Jorg Janke, ComPiere, Inc. All Rights Reserved.
+ *************************************************************************
+ * $Id: nextID.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
+ ***
+ * Title: Get Next ID - no Commit
+ * Description:
+ * Test via
+DECLARE
+ v_NextID NUMBER;
+BEGIN
+ nextID(2, 'Y', v_NextID);
+ DBMS_OUTPUT.PUT_LINE(v_NextID);
+END;
+ *
+ ************************************************************************/
+AS
+BEGIN
+ IF (p_System = 'Y') THEN
+ SELECT CurrentNextSys
+ INTO o_NextID
+ FROM AD_Sequence
+ WHERE AD_Sequence_ID=p_AD_Sequence_ID
+ FOR UPDATE OF CurrentNextSys;
+ --
+ UPDATE AD_Sequence
+ SET CurrentNextSys = CurrentNextSys + IncrementNo
+ WHERE AD_Sequence_ID=p_AD_Sequence_ID;
+ ELSE
+ SELECT CurrentNext
+ INTO o_NextID
+ FROM AD_Sequence
+ WHERE AD_Sequence_ID=p_AD_Sequence_ID
+ FOR UPDATE OF CurrentNext;
+ --
+ UPDATE AD_Sequence
+ SET CurrentNext = CurrentNext + IncrementNo
+ WHERE AD_Sequence_ID=p_AD_Sequence_ID;
+ END IF;
+ --
+EXCEPTION
+ WHEN OTHERS THEN
+ DBMS_OUTPUT.PUT_LINE(SQLERRM);
+END nextID;
+/
diff --git a/db/ddlutils/oracle/temptables.sql b/db/ddlutils/oracle/temptables.sql
new file mode 100644
index 0000000000..1b3718755f
--- /dev/null
+++ b/db/ddlutils/oracle/temptables.sql
@@ -0,0 +1,20 @@
+DROP TABLE T_Selection CASCADE CONSTRAINTS;
+
+CREATE GLOBAL TEMPORARY TABLE T_Selection
+(
+ T_Selection_ID NUMBER(10, 0) NOT NULL
+ CONSTRAINT T_Selection_Key PRIMARY KEY
+)
+ON COMMIT DELETE ROWS;
+
+
+DROP TABLE T_Selection2;
+
+CREATE GLOBAL TEMPORARY TABLE T_Selection2
+(
+ Query_ID NUMBER NOT NULL,
+ T_Selection_ID NUMBER(10) NOT NULL,
+ CONSTRAINT T_Selection2_Key PRIMARY KEY (Query_ID,T_Selection_ID)
+)
+ON COMMIT PRESERVE ROWS;
+
diff --git a/db/ddlutils/postgresql/build-ddl.properties b/db/ddlutils/postgresql/build-ddl.properties
new file mode 100644
index 0000000000..3646d29b65
--- /dev/null
+++ b/db/ddlutils/postgresql/build-ddl.properties
@@ -0,0 +1,8 @@
+lib.dir=../lib
+schemaoutputfile=../adempiere-model.xml
+schemafiles=adempiere-model.xml
+datafile=../adempiere-data.xml
+sqloutputfile=adempiere-schema.sql
+fkoutputfile=adempiere-fk.sql
+alterdatabase=false
+delimitedsqlidentifiers=true
diff --git a/db/ddlutils/postgresql/build-ddl.xml b/db/ddlutils/postgresql/build-ddl.xml
new file mode 100644
index 0000000000..37bcd8abbd
--- /dev/null
+++ b/db/ddlutils/postgresql/build-ddl.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/db/ddlutils/postgresql/build.properties b/db/ddlutils/postgresql/build.properties
new file mode 100644
index 0000000000..12fb221290
--- /dev/null
+++ b/db/ddlutils/postgresql/build.properties
@@ -0,0 +1,6 @@
+postgresql.home=C:/Program Files/PostgreSQL/8.2
+
+postgresql.database=adempiere
+postgresql.user=adempiere
+postgresql.password=adempiere1
+sqlj.jar.url=file:///d:/Opensource/Applications/Adempiere/sqlj/sqlj.jar
diff --git a/db/ddlutils/postgresql/build.xml b/db/ddlutils/postgresql/build.xml
new file mode 100644
index 0000000000..3d46994d59
--- /dev/null
+++ b/db/ddlutils/postgresql/build.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CREATE SCHEMA adempiere;
+
+
+ SET search_path TO adempiere,sqlj;
+
+
+ SELECT sqlj.install_jar('${sqlj.jar.url}', 'sqlj', true);
+
+
+ SELECT sqlj.set_classpath('adempiere', 'sqlj');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File ${file.name} status ${psql.result}
+
+
+
+
+
+
diff --git a/db/ddlutils/postgresql/init.sql b/db/ddlutils/postgresql/init.sql
new file mode 100644
index 0000000000..8d449db3d9
--- /dev/null
+++ b/db/ddlutils/postgresql/init.sql
@@ -0,0 +1,59 @@
+/** Change Numeric for Integer */
+CREATE OR REPLACE FUNCTION adempiere.ID (record NUMERIC)
+RETURNS INTEGER AS $$
+DECLARE
+ID integer := 0;
+BEGIN
+ ID := CAST(record AS INTEGER);
+ --RAISE NOTICE 'Quantity here is %', ID;
+ RETURN ID;
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+CREATE OR REPLACE FUNCTION adempiere.getdate()
+RETURNS TIMESTAMP WITH TIME ZONE AS $$
+BEGIN
+ RETURN now();
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+/**TIMESTAMP WITH TIME ZONE **/
+CREATE OR REPLACE FUNCTION adempiere.addDays (day TIMESTAMP WITH TIME ZONE, days DECIMAL)
+RETURNS TIMESTAMP WITH TIME ZONE AS $$
+BEGIN
+ RETURN adempiere.addDays(day,adempiere.ID(days));
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+
+CREATE OR REPLACE FUNCTION adempiere.subtractdays (day TIMESTAMP WITH TIME ZONE, days DECIMAL)
+RETURNS TIMESTAMP WITH TIME ZONE AS $$
+BEGIN
+ RETURN adempiere.addDays(day,adempiere.ID(days * -1));
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+CREATE OR REPLACE FUNCTION adempiere.addDays (day TIMESTAMP WITH TIME ZONE, days INTEGER)
+RETURNS TIMESTAMP WITH TIME ZONE AS $$
+BEGIN
+ RETURN adempiere.addDays(day,Idays);
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+
+CREATE OR REPLACE FUNCTION adempiere.subtractdays (day TIMESTAMP WITH TIME ZONE, days INTEGER)
+RETURNS TIMESTAMP WITH TIME ZONE AS $$
+BEGIN
+ RETURN adempiere.addDays(day,days * -1);
+END;
+$$ LANGUAGE plpgsql VOLATILE;
+
+DROP OPERATOR adempiere.+ (timestamptz, INTEGER);
+CREATE OPERATOR adempiere.+ ( PROCEDURE = adempiere.adddays,
+LEFTARG = TIMESTAMPTZ, RIGHTARG = INTEGER,
+COMMUTATOR = +);
+
+DROP OPERATOR adempiere.- (timestamptz, INTEGER);
+CREATE OPERATOR adempiere.- ( PROCEDURE = adempiere. subtractdays,
+LEFTARG = TIMESTAMPTZ, RIGHTARG = INTEGER,
+COMMUTATOR = -);
diff --git a/db/ddlutils/postgresql/jdbc.properties.postgresql b/db/ddlutils/postgresql/jdbc.properties.postgresql
new file mode 100644
index 0000000000..8fc825fd0d
--- /dev/null
+++ b/db/ddlutils/postgresql/jdbc.properties.postgresql
@@ -0,0 +1,34 @@
+# JDBC properties for PostgreSQL
+# Note: Properties starting with "datasource." will be fed into the datasource instance of the
+# class configured via the datasource.class property
+
+# Use this property if ddlutils does not recognize the platform from the settings
+ddlutils.platform=PostgreSQL
+
+#
+# Using the plain DBCP datasource
+#
+
+datasource.class=org.apache.commons.dbcp.BasicDataSource
+datasource.driverClassName=org.postgresql.Driver
+datasource.url=jdbc:postgresql://localhost/adempiere
+datasource.username=adempiere
+datasource.password=adempiere1
+
+#
+# PostgreSQL comes with its own DataSource implementations which can be configured like this:
+#
+
+#datasource.class=org.postgresql.ds.PGSimpleDataSource
+# or this one for pooling:
+#datasource.class=org.postgresql.ds.PGPoolingDataSource
+
+#datasource.serverName=localhost
+#datasource.databaseName=ddlutils
+#datasource.user=
+#datasource.password=
+
+# additional properties for the pooling datasource:
+#datasource.dataSourceName=pooling datasource
+#datasource.initialConnections=5
+#datasource.maxConnections=20
\ No newline at end of file
diff --git a/db/ddlutils/postgresql/log/readme.txt b/db/ddlutils/postgresql/log/readme.txt
new file mode 100644
index 0000000000..89f91c408a
--- /dev/null
+++ b/db/ddlutils/postgresql/log/readme.txt
@@ -0,0 +1,2 @@
+Folder to store log generated from build
+
diff --git a/db/ddlutils/sequences/Sequences.sql b/db/ddlutils/sequences/Sequences.sql
new file mode 100644
index 0000000000..cbc0d0ac13
--- /dev/null
+++ b/db/ddlutils/sequences/Sequences.sql
@@ -0,0 +1,16 @@
+DROP SEQUENCE AD_Error_Seq;
+
+CREATE SEQUENCE AD_Error_Seq START WITH 1 INCREMENT BY 1;
+
+DROP SEQUENCE AD_PInstance_Seq;
+
+CREATE SEQUENCE AD_PInstance_Seq START WITH 1 INCREMENT BY 1;
+
+DROP SEQUENCE T_Spool_Seq;
+
+CREATE SEQUENCE T_Spool_Seq START WITH 1 INCREMENT BY 1;
+
+DROP SEQUENCE W_BASKET_SEQ;
+
+CREATE SEQUENCE W_BASKET_SEQ START WITH 1 INCREMENT BY 1;
+
diff --git a/db/ddlutils/views/AD_CHANGELOG_V.sql b/db/ddlutils/views/AD_CHANGELOG_V.sql
new file mode 100644
index 0000000000..cfe4845bfe
--- /dev/null
+++ b/db/ddlutils/views/AD_CHANGELOG_V.sql
@@ -0,0 +1,16 @@
+CREATE OR REPLACE VIEW AD_CHANGELOG_V
+(AD_SESSION_ID, AD_CHANGELOG_ID, TABLENAME, RECORD_ID, COLUMNNAME,
+ OLDVALUE, NEWVALUE, NAME, CREATED)
+AS
+SELECT l.AD_Session_ID, l.AD_ChangeLog_ID,
+ t.TableName, l.Record_ID, c.ColumnName,
+ l.OldValue, l.NewValue,
+ u.Name, l.Created
+FROM AD_ChangeLog l
+ INNER JOIN AD_Table t ON (l.AD_Table_ID=t.AD_Table_ID)
+ INNER JOIN AD_Column c ON (l.AD_Column_ID=c.AD_Column_ID)
+ INNER JOIN AD_User u ON (l.CreatedBy=u.AD_User_ID)
+ORDER BY l.AD_Session_ID, l.AD_ChangeLog_ID, t.TableName, l.Record_ID, c.ColumnName;
+
+
+
diff --git a/db/ddlutils/views/AD_FIELD_V.sql b/db/ddlutils/views/AD_FIELD_V.sql
new file mode 100644
index 0000000000..f3525c141d
--- /dev/null
+++ b/db/ddlutils/views/AD_FIELD_V.sql
@@ -0,0 +1,36 @@
+CREATE OR REPLACE VIEW AD_FIELD_V
+(AD_WINDOW_ID, AD_TAB_ID, AD_FIELD_ID, AD_TABLE_ID, AD_COLUMN_ID,
+ NAME, DESCRIPTION, HELP, ISDISPLAYED, DISPLAYLOGIC,
+ DISPLAYLENGTH, SEQNO, SORTNO, ISSAMELINE, ISHEADING,
+ ISFIELDONLY, ISREADONLY, ISENCRYPTEDFIELD, OBSCURETYPE, COLUMNNAME,
+ COLUMNSQL, FIELDLENGTH, VFORMAT, DEFAULTVALUE, ISKEY,
+ ISPARENT, ISMANDATORY, ISIDENTIFIER, ISTRANSLATED, AD_REFERENCE_VALUE_ID,
+ CALLOUT, AD_REFERENCE_ID, AD_VAL_RULE_ID, AD_PROCESS_ID, ISALWAYSUPDATEABLE,
+ READONLYLOGIC, ISUPDATEABLE, ISENCRYPTEDCOLUMN, ISSELECTIONCOLUMN, TABLENAME,
+ VALUEMIN, VALUEMAX, FIELDGROUP, VALIDATIONCODE)
+AS
+SELECT t.AD_Window_ID, f.AD_Tab_ID, f.AD_Field_ID, tbl.AD_Table_ID, f.AD_Column_ID,
+ f.Name, f.Description, f.Help, f.IsDisplayed, f.DisplayLogic, f.DisplayLength,
+ f.SeqNo, f.SortNo, f.IsSameLine, f.IsHeading, f.IsFieldOnly, f.IsReadOnly,
+ f.IsEncrypted AS IsEncryptedField, f.ObscureType,
+ c.ColumnName, c.ColumnSQL, c.FieldLength, c.VFormat, c.DefaultValue, c.IsKey, c.IsParent,
+ COALESCE(f.IsMandatory, c.IsMandatory) AS IsMandatory,
+ c.IsIdentifier, c.IsTranslated, c.AD_Reference_Value_ID,
+ c.Callout, COALESCE(f.AD_Reference_ID, c.AD_Reference_ID) AS AD_Reference_ID,
+ c.AD_Val_Rule_ID, c.AD_Process_ID, c.IsAlwaysUpdateable,
+ c.ReadOnlyLogic, c.IsUpdateable, c.IsEncrypted AS IsEncryptedColumn,
+ c.IsSelectionColumn,
+ tbl.TableName, c.ValueMin, c.ValueMax,
+ fg.Name AS FieldGroup, vr.Code AS ValidationCode
+FROM AD_Field f
+ INNER JOIN AD_Tab t ON (f.AD_Tab_ID = t.AD_Tab_ID)
+ LEFT OUTER JOIN AD_FieldGroup fg ON (f.AD_FieldGroup_ID = fg.AD_FieldGroup_ID)
+ LEFT OUTER JOIN AD_Column c ON (f.AD_Column_ID = c.AD_Column_ID)
+ INNER JOIN AD_Table tbl ON (c.AD_Table_ID = tbl.AD_Table_ID)
+ INNER JOIN AD_Reference r ON (c.AD_Reference_ID = r.AD_Reference_ID)
+ LEFT OUTER JOIN AD_Val_Rule vr ON (c.AD_Val_Rule_ID=vr.AD_Val_Rule_ID)
+WHERE f.IsActive = 'Y'
+ AND c.IsActive = 'Y';
+
+
+
diff --git a/db/ddlutils/views/AD_FIELD_VT.sql b/db/ddlutils/views/AD_FIELD_VT.sql
new file mode 100644
index 0000000000..f89aea7114
--- /dev/null
+++ b/db/ddlutils/views/AD_FIELD_VT.sql
@@ -0,0 +1,37 @@
+CREATE OR REPLACE VIEW AD_FIELD_VT
+(AD_LANGUAGE, AD_WINDOW_ID, AD_TAB_ID, AD_FIELD_ID, AD_TABLE_ID,
+ AD_COLUMN_ID, NAME, DESCRIPTION, HELP, ISDISPLAYED,
+ DISPLAYLOGIC, DISPLAYLENGTH, SEQNO, SORTNO, ISSAMELINE,
+ ISHEADING, ISFIELDONLY, ISREADONLY, ISENCRYPTEDFIELD, OBSCURETYPE,
+ COLUMNNAME, COLUMNSQL, FIELDLENGTH, VFORMAT, DEFAULTVALUE,
+ ISKEY, ISPARENT, ISMANDATORY, ISIDENTIFIER, ISTRANSLATED,
+ AD_REFERENCE_VALUE_ID, CALLOUT, AD_REFERENCE_ID, AD_VAL_RULE_ID, AD_PROCESS_ID,
+ ISALWAYSUPDATEABLE, READONLYLOGIC, ISUPDATEABLE, ISENCRYPTEDCOLUMN, ISSELECTIONCOLUMN,
+ TABLENAME, VALUEMIN, VALUEMAX, FIELDGROUP, VALIDATIONCODE)
+AS
+SELECT trl.AD_Language, t.AD_Window_ID, f.AD_Tab_ID, f.AD_Field_ID, tbl.AD_Table_ID, f.AD_Column_ID,
+ trl.Name, trl.Description, trl.Help, f.IsDisplayed, f.DisplayLogic, f.DisplayLength,
+ f.SeqNo, f.SortNo, f.IsSameLine, f.IsHeading, f.IsFieldOnly, f.IsReadOnly,
+ f.IsEncrypted AS IsEncryptedField, f.ObscureType,
+ c.ColumnName, c.ColumnSQL, c.FieldLength, c.VFormat, c.DefaultValue, c.IsKey, c.IsParent,
+ COALESCE(f.IsMandatory, c.IsMandatory) AS IsMandatory,
+ c.IsIdentifier, c.IsTranslated, c.AD_Reference_Value_ID,
+ c.Callout, COALESCE(f.AD_Reference_ID, c.AD_Reference_ID) AS AD_Reference_ID,
+ c.AD_Val_Rule_ID, c.AD_Process_ID, c.IsAlwaysUpdateable,
+ c.ReadOnlyLogic, c.IsUpdateable, c.IsEncrypted AS IsEncryptedColumn, c.IsSelectionColumn,
+ tbl.TableName, c.ValueMin, c.ValueMax,
+ fgt.Name AS FieldGroup, vr.Code AS ValidationCode
+FROM AD_Field f
+ INNER JOIN AD_Field_Trl trl ON (f.AD_Field_ID = trl.AD_Field_ID)
+ INNER JOIN AD_Tab t ON (f.AD_Tab_ID = t.AD_Tab_ID)
+ LEFT OUTER JOIN AD_FieldGroup_Trl fgt ON
+ (f.AD_FieldGroup_ID = fgt.AD_FieldGroup_ID AND trl.AD_Language=fgt.AD_Language)
+ LEFT OUTER JOIN AD_Column c ON (f.AD_Column_ID = c.AD_Column_ID)
+ INNER JOIN AD_Table tbl ON (c.AD_Table_ID = tbl.AD_Table_ID)
+ INNER JOIN AD_Reference r ON (c.AD_Reference_ID = r.AD_Reference_ID)
+ LEFT OUTER JOIN AD_Val_Rule vr ON (c.AD_Val_Rule_ID=vr.AD_Val_Rule_ID)
+WHERE f.IsActive = 'Y'
+ AND c.IsActive = 'Y';
+
+
+
diff --git a/db/ddlutils/views/AD_ORG_V.sql b/db/ddlutils/views/AD_ORG_V.sql
new file mode 100644
index 0000000000..912f011378
--- /dev/null
+++ b/db/ddlutils/views/AD_ORG_V.sql
@@ -0,0 +1,19 @@
+CREATE OR REPLACE VIEW AD_ORG_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, VALUE, NAME, DESCRIPTION,
+ ISSUMMARY, C_LOCATION_ID, DUNS, TAXID, SUPERVISOR_ID,
+ PARENT_ORG_ID, AD_ORGTYPE_ID, M_WAREHOUSE_ID, C_BPARTNER_ID)
+AS
+SELECT o.AD_Client_ID, o.AD_Org_ID,
+ o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
+ o.Value, o.Name, o.Description, o.IsSummary,
+ i.C_Location_ID, i.DUNS, i.TaxID,
+ i.Supervisor_ID, i.Parent_Org_ID,
+ i.AD_OrgType_ID, i.M_Warehouse_ID,
+ bp.C_BPartner_ID
+FROM AD_Org o
+ INNER JOIN AD_OrgInfo i ON (o.AD_Org_ID=i.AD_Org_ID)
+ LEFT OUTER JOIN C_BPartner bp ON (o.AD_Org_ID=bp.AD_OrgBP_ID);
+
+
+
diff --git a/db/ddlutils/views/AD_TAB_V.sql b/db/ddlutils/views/AD_TAB_V.sql
new file mode 100644
index 0000000000..d1e526dea0
--- /dev/null
+++ b/db/ddlutils/views/AD_TAB_V.sql
@@ -0,0 +1,24 @@
+CREATE OR REPLACE VIEW AD_TAB_V
+(AD_TAB_ID, AD_WINDOW_ID, AD_TABLE_ID, NAME, DESCRIPTION,
+ HELP, SEQNO, ISSINGLEROW, HASTREE, ISINFOTAB,
+ REPLICATIONTYPE, TABLENAME, ACCESSLEVEL, ISSECURITYENABLED, ISDELETEABLE,
+ ISHIGHVOLUME, ISVIEW, HASASSOCIATION, ISTRANSLATIONTAB, ISREADONLY,
+ AD_IMAGE_ID, TABLEVEL, WHERECLAUSE, ORDERBYCLAUSE, COMMITWARNING,
+ READONLYLOGIC, DISPLAYLOGIC, AD_COLUMN_ID, AD_PROCESS_ID, ISSORTTAB,
+ ISINSERTRECORD, ISADVANCEDTAB, AD_COLUMNSORTORDER_ID, AD_COLUMNSORTYESNO_ID, INCLUDED_TAB_ID)
+AS
+SELECT t.AD_Tab_ID, t.AD_Window_ID, t.AD_Table_ID, t.Name, t.Description,
+ t.Help, t.SeqNo, t.IsSingleRow, t.HasTree, t.IsInfoTab, tbl.ReplicationType,
+ tbl.TableName, tbl.AccessLevel, tbl.IsSecurityEnabled, tbl.IsDeleteable,
+ tbl.IsHighVolume, tbl.IsView, 'N' AS HasAssociation, -- compatibility
+ t.IsTranslationTab, t.IsReadOnly, t.AD_Image_ID, t.TabLevel,
+ t.WhereClause, t.OrderByClause, t.CommitWarning, t.ReadOnlyLogic, t.DisplayLogic,
+ t.AD_Column_ID, t.AD_Process_ID, t.IsSortTab, t.IsInsertRecord, t.IsAdvancedTab,
+ t.AD_ColumnSortOrder_ID, t.AD_ColumnSortYesNo_ID, t.Included_Tab_ID
+FROM AD_Tab t
+ INNER JOIN AD_Table tbl ON (t.AD_Table_ID = tbl.AD_Table_ID)
+WHERE t.IsActive='Y'
+ AND tbl.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/AD_TAB_VT.sql b/db/ddlutils/views/AD_TAB_VT.sql
new file mode 100644
index 0000000000..1cb8d0b244
--- /dev/null
+++ b/db/ddlutils/views/AD_TAB_VT.sql
@@ -0,0 +1,26 @@
+CREATE OR REPLACE VIEW AD_TAB_VT
+(AD_LANGUAGE, AD_TAB_ID, AD_WINDOW_ID, AD_TABLE_ID, NAME,
+ DESCRIPTION, HELP, SEQNO, ISSINGLEROW, HASTREE,
+ ISINFOTAB, REPLICATIONTYPE, TABLENAME, ACCESSLEVEL, ISSECURITYENABLED,
+ ISDELETEABLE, ISHIGHVOLUME, ISVIEW, HASASSOCIATION, ISTRANSLATIONTAB,
+ ISREADONLY, AD_IMAGE_ID, TABLEVEL, WHERECLAUSE, ORDERBYCLAUSE,
+ COMMITWARNING, READONLYLOGIC, DISPLAYLOGIC, AD_COLUMN_ID, AD_PROCESS_ID,
+ ISSORTTAB, ISINSERTRECORD, ISADVANCEDTAB, AD_COLUMNSORTORDER_ID, AD_COLUMNSORTYESNO_ID,
+ INCLUDED_TAB_ID)
+AS
+SELECT trl.AD_Language, t.AD_Tab_ID, t.AD_Window_ID, t.AD_Table_ID, trl.Name, trl.Description,
+ trl.Help, t.SeqNo, t.IsSingleRow, t.HasTree, t.IsInfoTab, tbl.ReplicationType,
+ tbl.TableName, tbl.AccessLevel, tbl.IsSecurityEnabled, tbl.IsDeleteable,
+ tbl.IsHighVolume, tbl.IsView, 'N' AS HasAssociation, -- compatibility
+ t.IsTranslationTab, t.IsReadOnly, t.AD_Image_ID, t.TabLevel,
+ t.WhereClause, t.OrderByClause, trl.CommitWarning, t.ReadOnlyLogic, t.DisplayLogic,
+ t.AD_Column_ID, t.AD_Process_ID, t.IsSortTab, t.IsInsertRecord, t.IsAdvancedTab,
+ t.AD_ColumnSortOrder_ID, t.AD_ColumnSortYesNo_ID, t.Included_Tab_ID
+FROM AD_Tab t
+ INNER JOIN AD_Table tbl ON (t.AD_Table_ID = tbl.AD_Table_ID)
+ INNER JOIN AD_Tab_Trl trl ON (t.AD_Tab_ID = trl.AD_Tab_ID)
+WHERE t.IsActive='Y'
+ AND tbl.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/AD_USER_ROLES_V.sql b/db/ddlutils/views/AD_USER_ROLES_V.sql
new file mode 100644
index 0000000000..b6a8fb4833
--- /dev/null
+++ b/db/ddlutils/views/AD_USER_ROLES_V.sql
@@ -0,0 +1,10 @@
+CREATE OR REPLACE VIEW AD_USER_ROLES_V
+(NAME, ROLENAME)
+AS
+SELECT u.Name, r.Name AS RoleName
+FROM AD_User_Roles ur
+ INNER JOIN AD_User u ON (ur.AD_User_ID=u.AD_User_ID)
+ INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID);
+
+
+
diff --git a/db/ddlutils/views/AD_WINDOW_VT.sql b/db/ddlutils/views/AD_WINDOW_VT.sql
new file mode 100644
index 0000000000..401b718808
--- /dev/null
+++ b/db/ddlutils/views/AD_WINDOW_VT.sql
@@ -0,0 +1,15 @@
+CREATE OR REPLACE VIEW AD_WINDOW_VT
+(AD_LANGUAGE, AD_WINDOW_ID, NAME, DESCRIPTION, HELP,
+ WINDOWTYPE, AD_COLOR_ID, AD_IMAGE_ID, ISACTIVE, WINWIDTH,
+ WINHEIGHT, ISSOTRX)
+AS
+SELECT trl.AD_Language,
+ bt.AD_Window_ID, trl.Name, trl.Description, trl.Help, bt.WindowType,
+ bt.AD_Color_ID, bt.AD_Image_ID, bt.IsActive, bt.WinWidth, bt.WinHeight,
+ bt.IsSOTrx
+FROM AD_Window bt
+ INNER JOIN AD_Window_Trl trl ON (bt.AD_Window_ID=trl.AD_Window_ID)
+WHERE bt.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/C_DUNNING_HEADER_V.sql b/db/ddlutils/views/C_DUNNING_HEADER_V.sql
new file mode 100644
index 0000000000..f65f34084b
--- /dev/null
+++ b/db/ddlutils/views/C_DUNNING_HEADER_V.sql
@@ -0,0 +1,37 @@
+CREATE OR REPLACE VIEW C_DUNNING_HEADER_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUN_ID, C_DUNNINGRUNENTRY_ID,
+ DUNNINGDATE, PRINTNAME, DOCUMENTNOTE, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ SALESREP_ID, SALESREP_NAME, BPGREETING, NAME, NAME2,
+ BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME, C_LOCATION_ID,
+ REFERENCENO, POSTAL, AMT, QTY, NOTE)
+AS
+SELECT dr.AD_Client_ID, dr.AD_Org_ID, dr.IsActive, dr.Created, dr.CreatedBy, dr.Updated, dr.UpdatedBy,
+ 'en_US' AS AD_Language, dr.C_DunningRun_ID, C_DunningRunEntry_ID,
+ dr.DunningDate, dl.PrintName, dl.Note AS DocumentNote,
+ dre.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ dre.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
+ dre.Amt, dre.Qty, dre.Note
+FROM C_DunningRun dr
+ INNER JOIN C_DunningLevel dl ON (dr.C_DunningLevel_ID=dl.C_DunningLevel_ID)
+ INNER JOIN C_DunningRunEntry dre ON (dr.C_DunningRun_ID=dre.C_DunningRun_ID)
+ INNER JOIN C_BPartner bp ON (dre.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ INNER JOIN C_BPartner_Location bpl ON (dre.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (dre.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ INNER JOIN AD_OrgInfo oi ON (dr.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (dre.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);
+
+
+
diff --git a/db/ddlutils/views/C_DUNNING_HEADER_VT.sql b/db/ddlutils/views/C_DUNNING_HEADER_VT.sql
new file mode 100644
index 0000000000..9fb90735b6
--- /dev/null
+++ b/db/ddlutils/views/C_DUNNING_HEADER_VT.sql
@@ -0,0 +1,40 @@
+CREATE OR REPLACE VIEW C_DUNNING_HEADER_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUN_ID, C_DUNNINGRUNENTRY_ID,
+ DUNNINGDATE, PRINTNAME, DOCUMENTNOTE, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ SALESREP_ID, SALESREP_NAME, BPGREETING, NAME, NAME2,
+ BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME, C_LOCATION_ID,
+ REFERENCENO, POSTAL, AMT, QTY, NOTE)
+AS
+SELECT dr.AD_Client_ID, dr.AD_Org_ID, dr.IsActive, dr.Created, dr.CreatedBy, dr.Updated, dr.UpdatedBy,
+ dlt.AD_Language, dr.C_DunningRun_ID, C_DunningRunEntry_ID,
+ dr.DunningDate, dlt.PrintName, dlt.Note AS DocumentNote,
+ dre.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ dre.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
+ dre.Amt, dre.Qty, dre.Note
+FROM C_DunningRun dr
+ INNER JOIN C_DunningLevel dl ON (dr.C_DunningLevel_ID=dl.C_DunningLevel_ID)
+ INNER JOIN C_DunningLevel_Trl dlt ON (dl.C_DunningLevel_ID=dlt.C_DunningLevel_ID)
+ INNER JOIN C_DunningRunEntry dre ON (dr.C_DunningRun_ID=dre.C_DunningRun_ID)
+ INNER JOIN C_BPartner bp ON (dre.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID
+ AND dlt.AD_Language=bpg.AD_Language)
+ INNER JOIN C_BPartner_Location bpl ON (dre.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (dre.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID
+ AND dlt.AD_Language=bpcg.AD_Language)
+ INNER JOIN AD_OrgInfo oi ON (dr.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (dre.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);
+
+
+
diff --git a/db/ddlutils/views/C_DUNNING_LINE_V.sql b/db/ddlutils/views/C_DUNNING_LINE_V.sql
new file mode 100644
index 0000000000..485394b9db
--- /dev/null
+++ b/db/ddlutils/views/C_DUNNING_LINE_V.sql
@@ -0,0 +1,50 @@
+CREATE OR REPLACE VIEW C_DUNNING_LINE_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUNLINE_ID, C_DUNNINGRUNENTRY_ID,
+ AMT, CONVERTEDAMT, DAYSDUE, TIMESDUNNED, INTERESTAMT,
+ FEEAMT, TOTALAMT, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, DATETRX, C_DOCTYPE_ID, DOCUMENTTYPE, DESCRIPTION,
+ C_CURRENCY_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, USER1_ID,
+ USER2_ID, DATEACCT, C_CONVERSIONTYPE_ID, AD_ORGTRX_ID, POREFERENCE,
+ DATEORDERED, DATEINVOICED, ISINDISPUTE, PAYMENTTERM, C_CHARGE_ID,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
+ ISPAID, ISALLOCATED, TENDERTYPE, DISCOUNTAMT)
+AS
+SELECT drl.AD_Client_ID, drl.AD_Org_ID, drl.IsActive, drl.Created, drl.CreatedBy, drl.Updated, drl.UpdatedBy,
+ 'en_US' AS AD_Language,
+ drl.C_DunningRunLine_ID, drl.C_DunningRunEntry_ID,
+ drl.Amt, drl.ConvertedAmt, drl.DaysDue, drl.TimesDunned,
+ drl.InterestAmt, drl.FeeAmt, drl.TotalAmt,
+ drl.C_Invoice_ID,
+ COALESCE(i.IsSOTrx,p.IsReceipt) AS IsSOTrx,
+ COALESCE(i.DocumentNo,p.DocumentNo) AS DocumentNo,
+ COALESCE(i.DocStatus,p.DocStatus) AS DocStatus,
+ COALESCE(i.DateInvoiced, p.DateTrx) AS DateTrx,
+ COALESCE(i.C_DocType_ID,p.C_DocType_ID) AS C_DocType_ID,
+ COALESCE(dt.PrintName,dtp.PrintName) AS DocumentType,
+ COALESCE(i.Description,p.Description) AS Description,
+ COALESCE(i.C_Currency_ID,p.C_Currency_ID) AS C_Currency_ID,
+ COALESCE(i.C_Campaign_ID,p.C_Campaign_ID) AS C_Campaign_ID,
+ COALESCE(i.C_Project_ID,p.C_Project_ID) AS C_Project_ID,
+ COALESCE(i.C_Activity_ID,p.C_Activity_ID) AS C_Activity_ID,
+ COALESCE(i.User1_ID,p.User1_ID) AS User1_ID,
+ COALESCE(i.User2_ID,p.User2_ID) AS User2_ID,
+ COALESCE(i.DateAcct,p.DateAcct) AS DateAcct,
+ COALESCE(i.C_ConversionType_ID,i.C_ConversionType_ID) AS C_ConversionType_ID,
+ COALESCE(i.AD_OrgTrx_ID,p.AD_OrgTrx_ID) AS AD_OrgTrx_ID,
+ i.POReference, i.DateOrdered,
+ i.DateInvoiced, i.IsInDispute,
+ pt.Name AS PaymentTerm,
+ i.C_Charge_ID, i.ChargeAmt,
+ i.TotalLines, i.GrandTotal, i.GrandTotal AS AmtInWords,
+ i.M_PriceList_ID, i.IsPaid,
+ p.IsAllocated, p.TenderType, p.DiscountAmt
+FROM C_DunningRunLine drl
+ LEFT OUTER JOIN C_Invoice i ON (drl.C_Invoice_ID=i.C_Invoice_ID)
+ LEFT OUTER JOIN C_DocType dt ON (i.C_DocType_ID=dt.C_DocType_ID)
+ LEFT OUTER JOIN C_PaymentTerm pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
+ LEFT OUTER JOIN C_Payment p ON (drl.C_Payment_ID=p.C_Payment_ID)
+ LEFT OUTER JOIN C_DocType dtp ON (p.C_DocType_ID=dtp.C_DocType_ID);
+
+
+
diff --git a/db/ddlutils/views/C_DUNNING_LINE_VT.sql b/db/ddlutils/views/C_DUNNING_LINE_VT.sql
new file mode 100644
index 0000000000..d88f116904
--- /dev/null
+++ b/db/ddlutils/views/C_DUNNING_LINE_VT.sql
@@ -0,0 +1,52 @@
+CREATE OR REPLACE VIEW C_DUNNING_LINE_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUNLINE_ID, C_DUNNINGRUNENTRY_ID,
+ AMT, CONVERTEDAMT, DAYSDUE, TIMESDUNNED, INTERESTAMT,
+ FEEAMT, TOTALAMT, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, DATETRX, C_DOCTYPE_ID, DOCUMENTTYPE, DESCRIPTION,
+ C_CURRENCY_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, USER1_ID,
+ USER2_ID, DATEACCT, C_CONVERSIONTYPE_ID, AD_ORGTRX_ID, POREFERENCE,
+ DATEORDERED, DATEINVOICED, ISINDISPUTE, PAYMENTTERM, C_CHARGE_ID,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
+ ISPAID, ISALLOCATED, TENDERTYPE, DISCOUNTAMT)
+AS
+SELECT drl.AD_Client_ID, drl.AD_Org_ID, drl.IsActive, drl.Created, drl.CreatedBy, drl.Updated, drl.UpdatedBy,
+ COALESCE(dt.AD_Language,dtp.AD_Language) AS AD_Language,
+ drl.C_DunningRunLine_ID, drl.C_DunningRunEntry_ID,
+ drl.Amt, drl.ConvertedAmt, drl.DaysDue, drl.TimesDunned,
+ drl.InterestAmt, drl.FeeAmt, drl.TotalAmt,
+ drl.C_Invoice_ID,
+ COALESCE(i.IsSOTrx,p.IsReceipt) AS IsSOTrx,
+ COALESCE(i.DocumentNo,p.DocumentNo) AS DocumentNo,
+ COALESCE(i.DocStatus,p.DocStatus) AS DocStatus,
+ COALESCE(i.DateInvoiced, p.DateTrx) AS DateTrx,
+ COALESCE(i.C_DocType_ID,p.C_DocType_ID) AS C_DocType_ID,
+ COALESCE(dt.PrintName,dtp.PrintName) AS DocumentType,
+ COALESCE(i.Description,p.Description) AS Description,
+ COALESCE(i.C_Currency_ID,p.C_Currency_ID) AS C_Currency_ID,
+ COALESCE(i.C_Campaign_ID,p.C_Campaign_ID) AS C_Campaign_ID,
+ COALESCE(i.C_Project_ID,p.C_Project_ID) AS C_Project_ID,
+ COALESCE(i.C_Activity_ID,p.C_Activity_ID) AS C_Activity_ID,
+ COALESCE(i.User1_ID,p.User1_ID) AS User1_ID,
+ COALESCE(i.User2_ID,p.User2_ID) AS User2_ID,
+ COALESCE(i.DateAcct,p.DateAcct) AS DateAcct,
+ COALESCE(i.C_ConversionType_ID,i.C_ConversionType_ID) AS C_ConversionType_ID,
+ COALESCE(i.AD_OrgTrx_ID,p.AD_OrgTrx_ID) AS AD_OrgTrx_ID,
+ i.POReference, i.DateOrdered,
+ i.DateInvoiced, i.IsInDispute,
+ pt.Name AS PaymentTerm,
+ i.C_Charge_ID, i.ChargeAmt,
+ i.TotalLines, i.GrandTotal, i.GrandTotal AS AmtInWords,
+ i.M_PriceList_ID, i.IsPaid,
+ p.IsAllocated, p.TenderType, p.DiscountAmt
+FROM C_DunningRunLine drl
+ LEFT OUTER JOIN C_Invoice i ON (drl.C_Invoice_ID=i.C_Invoice_ID)
+ LEFT OUTER JOIN C_DocType_Trl dt ON (i.C_DocType_ID=dt.C_DocType_ID)
+ LEFT OUTER JOIN C_PaymentTerm_Trl pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID
+ AND pt.AD_Language=dt.AD_Language)
+ LEFT OUTER JOIN C_Payment p ON (drl.C_Payment_ID=p.C_Payment_ID)
+ LEFT OUTER JOIN C_DocType_Trl dtp ON (p.C_DocType_ID=dtp.C_DocType_ID)
+WHERE COALESCE(dt.AD_Language,dtp.AD_Language)=COALESCE(dtp.AD_Language,dt.AD_Language);
+
+
+
diff --git a/db/ddlutils/views/C_INVOICELINE_V.sql b/db/ddlutils/views/C_INVOICELINE_V.sql
new file mode 100644
index 0000000000..926cd2cdf5
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICELINE_V.sql
@@ -0,0 +1,28 @@
+CREATE OR REPLACE VIEW C_INVOICELINE_V
+(AD_CLIENT_ID, AD_ORG_ID, C_INVOICELINE_ID, C_INVOICE_ID, SALESREP_ID,
+ C_BPARTNER_ID, M_PRODUCT_ID, DOCUMENTNO, DATEINVOICED, DATEACCT,
+ ISSOTRX, DOCSTATUS, LINENETAMT, LINELISTAMT, LINELIMITAMT,
+ LINEDISCOUNTAMT, LINEOVERLIMITAMT, QTYINVOICED, QTYENTERED, LINE,
+ C_ORDERLINE_ID, C_UOM_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID,
+ C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID,
+ il.C_InvoiceLine_ID, i.C_Invoice_ID, i.SalesRep_ID,
+ i.C_BPartner_ID, il.M_Product_ID,
+ i.DocumentNo, i.DateInvoiced, i.DateAcct,
+ i.IsSOTrx, i.DocStatus,
+ ROUND(i.Multiplier*LineNetAmt, 2) AS LineNetAmt,
+ ROUND(i.Multiplier*PriceList*QtyInvoiced, 2) AS LineListAmt,
+ CASE WHEN COALESCE(il.PriceLimit, 0)=0 THEN ROUND(i.Multiplier*LineNetAmt,2) ELSE ROUND(i.Multiplier*PriceLimit*QtyInvoiced,2) END AS LineLimitAmt,
+ ROUND(i.Multiplier*PriceList*QtyInvoiced-LineNetAmt,2) AS LineDiscountAmt,
+ CASE WHEN COALESCE(il.PriceLimit,0)=0 THEN 0 ELSE ROUND(i.Multiplier*LineNetAmt-PriceLimit*QtyInvoiced,2) END AS LineOverLimitAmt,
+ il.QtyInvoiced, il.QtyEntered,
+ il.Line, il.C_OrderLine_ID, il.C_UOM_ID,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
+FROM C_Invoice_v i, C_InvoiceLine il
+WHERE i.C_Invoice_ID=il.C_Invoice_ID;
+
+--COMMENT ON TABLE C_INVOICELINE_V IS 'Invoice Line Summary for Reporting Views - Corrected for Credit Memos';
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_CANDIDATE_V.sql b/db/ddlutils/views/C_INVOICE_CANDIDATE_V.sql
new file mode 100644
index 0000000000..d78996cad4
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_CANDIDATE_V.sql
@@ -0,0 +1,54 @@
+CREATE OR REPLACE VIEW C_INVOICE_CANDIDATE_V
+(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, C_ORDER_ID, DOCUMENTNO,
+ DATEORDERED, C_DOCTYPE_ID, TOTALLINES)
+AS
+SELECT
+ o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
+ o.DocumentNo, o.DateOrdered, o.C_DocType_ID,
+ SUM((l.QtyOrdered-l.QtyInvoiced)*l.PriceActual) AS TotalLines
+FROM C_Order o
+ INNER JOIN C_OrderLine l ON (o.C_Order_ID=l.C_Order_ID)
+ INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_InvoiceSchedule si ON (bp.C_InvoiceSchedule_ID=si.C_InvoiceSchedule_ID)
+WHERE o.DocStatus IN ('CO','CL','IP') -- Standard Orders are IP
+ -- not Offers and open Walkin-Receipts
+ AND o.C_DocType_ID IN (SELECT C_DocType_ID FROM C_DocType
+ WHERE DocBaseType='SOO' AND DocSubTypeSO NOT IN ('ON','OB','WR'))
+ -- we need to invoice
+ AND l.QtyOrdered <> l.QtyInvoiced
+ --
+ AND (
+ -- Immediate
+ o.InvoiceRule='I'
+ -- Order compete ** not supported **
+ OR o.InvoiceRule='O'
+ -- Delivery
+ OR (o.InvoiceRule='D' AND l.QtyInvoiced<>l.QtyDelivered)
+ -- Order Schedule, but none defined on Business Partner level
+ OR (o.InvoiceRule='S' AND bp.C_InvoiceSchedule_ID IS NULL)
+ -- Schedule defined at BP
+ OR (o.InvoiceRule='S' AND bp.C_InvoiceSchedule_ID IS NOT NULL AND
+ (
+ -- Daily or none
+ (si.InvoiceFrequency IS NULL OR si.InvoiceFrequency='D')
+ -- Weekly
+ OR (si.InvoiceFrequency='W')
+ -- Bi-Monthly
+ OR (si.InvoiceFrequency='T'
+ AND ((TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff-1
+ AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay-1)
+ OR (TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff+14
+ AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay+14))
+ )
+ -- Monthly
+ OR (si.InvoiceFrequency='M'
+ AND TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff-1 -- after cutoff
+ AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay-1) -- after invoice day
+ )
+ )
+ )
+GROUP BY o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
+ o.DocumentNo, o.DateOrdered, o.C_DocType_ID;
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_HEADER_V.sql b/db/ddlutils/views/C_INVOICE_HEADER_V.sql
new file mode 100644
index 0000000000..1eba37b56c
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_HEADER_V.sql
@@ -0,0 +1,56 @@
+CREATE OR REPLACE VIEW C_INVOICE_HEADER_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID, SALESREP_ID, SALESREP_NAME,
+ DATEINVOICED, BPGREETING, NAME, NAME2, BPCONTACTGREETING,
+ TITLE, PHONE, CONTACTNAME, C_LOCATION_ID, REFERENCENO,
+ POSTAL, DESCRIPTION, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
+ PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID, CHARGEAMT, TOTALLINES,
+ GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID, ISTAXINCLUDED, C_CAMPAIGN_ID,
+ C_PROJECT_ID, C_ACTIVITY_ID, ISPAID)
+AS
+SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ 'en_US' AS AD_Language,
+ i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID,
+ i.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ i.C_Order_ID, i.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ i.DateInvoiced,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
+ i.Description,
+ i.POReference,
+ i.DateOrdered,
+ i.C_Currency_ID,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ i.C_Charge_ID, i.ChargeAmt,
+ i.TotalLines,
+ i.GrandTotal, i.GrandTotal AS AmtInWords,
+ i.M_PriceList_ID,
+ i.IsTaxIncluded,
+ i.C_Campaign_ID,
+ i.C_Project_ID,
+ i.C_Activity_ID,
+ i.IsPaid
+FROM C_Invoice i
+ INNER JOIN C_DocType dt ON (i.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN C_PaymentTerm pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
+ INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ INNER JOIN C_BPartner_Location bpl ON (i.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (i.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ INNER JOIN AD_OrgInfo oi ON (i.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (i.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_HEADER_VT.sql b/db/ddlutils/views/C_INVOICE_HEADER_VT.sql
new file mode 100644
index 0000000000..8ebbd047a0
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_HEADER_VT.sql
@@ -0,0 +1,56 @@
+CREATE OR REPLACE VIEW C_INVOICE_HEADER_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID, SALESREP_ID, SALESREP_NAME,
+ DATEINVOICED, BPGREETING, NAME, NAME2, BPCONTACTGREETING,
+ TITLE, PHONE, CONTACTNAME, C_LOCATION_ID, REFERENCENO,
+ POSTAL, DESCRIPTION, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
+ PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID, CHARGEAMT, TOTALLINES,
+ GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID, ISTAXINCLUDED, C_CAMPAIGN_ID,
+ C_PROJECT_ID, C_ACTIVITY_ID, ISPAID)
+AS
+SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ dt.AD_Language,
+ i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID,
+ i.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ i.C_Order_ID, i.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ i.DateInvoiced,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
+ i.Description,
+ i.POReference,
+ i.DateOrdered,
+ i.C_Currency_ID,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ i.C_Charge_ID, i.ChargeAmt,
+ i.TotalLines,
+ i.GrandTotal, i.GrandTotal AS AmtInWords,
+ i.M_PriceList_ID,
+ i.IsTaxIncluded,
+ i.C_Campaign_ID,
+ i.C_Project_ID,
+ i.C_Activity_ID,
+ i.IsPaid
+FROM C_Invoice i
+ INNER JOIN C_DocType_Trl dt ON (i.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN C_PaymentTerm_Trl pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID AND dt.AD_Language=pt.AD_Language)
+ INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID AND dt.AD_Language=bpg.AD_Language)
+ INNER JOIN C_BPartner_Location bpl ON (i.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (i.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID AND dt.AD_Language=bpcg.AD_Language)
+ INNER JOIN AD_OrgInfo oi ON (i.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (i.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_LINETAX_V.sql b/db/ddlutils/views/C_INVOICE_LINETAX_V.sql
new file mode 100644
index 0000000000..39ee90ec30
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_LINETAX_V.sql
@@ -0,0 +1,114 @@
+CREATE OR REPLACE VIEW C_INVOICE_LINETAX_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, C_INVOICELINE_ID,
+ C_TAX_ID, TAXAMT, LINETOTALAMT, TAXINDICATOR, LINE,
+ M_PRODUCT_ID, QTYINVOICED, QTYENTERED, UOMSYMBOL, NAME,
+ DESCRIPTION, DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE,
+ RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST, DISCOUNT, PRICEACTUAL,
+ PRICEENTERED, LINENETAMT, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO,
+ LOT, M_LOT_ID, GUARANTEEDATE, PRODUCTDESCRIPTION, IMAGEURL,
+ C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ 'en_US' AS AD_Language,
+ il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
+ il.Line, p.M_Product_ID,
+ CASE WHEN il.QtyInvoiced<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyInvoiced END AS QtyInvoiced,
+ CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyEntered END AS QtyEntered,
+ CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ COALESCE(c.Name,p.Name||productAttribute(il.M_AttributeSetInstance_ID), il.Description) AS Name, -- main line
+ CASE WHEN COALESCE(c.Name,p.Name) IS NOT NULL THEN il.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
+ ra.Description AS ResourceDescription, -- forth line
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0
+ THEN il.PriceList END AS PriceList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0 AND il.QtyEntered<>0
+ THEN il.PriceList*il.QtyInvoiced/il.QtyEntered END AS PriceEnteredList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList>il.PriceActual AND il.PriceList<>0
+ THEN (il.PriceList-il.PriceActual)/il.PriceList*100 END AS Discount,
+ CASE WHEN il.PriceActual<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceActual END AS PriceActual,
+ CASE WHEN il.PriceEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceEntered END AS PriceEntered,
+ CASE WHEN il.LineNetAmt<>0 OR il.M_Product_ID IS NOT NULL THEN il.LineNetAmt END AS LineNetAmt,
+ il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID,
+ asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ p.Description as ProductDescription, p.ImageURL,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
+FROM C_InvoiceLine il
+ INNER JOIN C_UOM uom ON (il.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID)
+ LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
+ LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID=c.C_Charge_ID)
+ LEFT OUTER JOIN C_BPartner_Product pp ON (il.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
+ LEFT OUTER JOIN S_ResourceAssignment ra ON (il.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+UNION -- bom lines
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ 'en_US' AS AD_Language,
+ il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
+ il.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ il.QtyInvoiced*b.BOMQty AS QtyInvoiced,
+ il.QtyEntered*b.BOMQty AS QtyEntered,
+ uom.UOMSymbol,
+ p.Name, -- main
+ b.Description,
+ p.DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
+ null, null, null, null, null, null, null,
+ il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ p.Description as ProductDescription, p.ImageURL,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN C_InvoiceLine il ON (b.M_Product_ID=il.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=il.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+UNION -- comment lines
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ 'en_US', il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ null, null, null, null,
+ il.Line, null,
+ null, null, null,
+ il.Description,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null, null, null, null, null
+FROM C_InvoiceLine il
+WHERE il.C_UOM_ID IS NULL
+UNION -- empty line
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ 'en_US', C_Invoice_ID, null,
+ null, null, null, null,
+ 9998, null,
+ null, null, null,
+ null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null, null, null, null, null
+FROM C_Invoice
+UNION -- tax lines
+SELECT it.AD_Client_ID, it.AD_Org_ID, it.IsActive, it.Created, it.CreatedBy, it.Updated, it.UpdatedBy,
+ 'en_US', it.C_Invoice_ID, null,
+ it.C_Tax_ID, null, null, t.TaxIndicator,
+ 9999, null,
+ null, null, null,
+ t.Name,
+ null, null, null, null, null, null,
+ null, null, null,
+ CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
+ CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
+ CASE WHEN it.IsTaxIncluded='Y' THEN NULL ELSE it.TaxAmt END,
+ null, null, null, null, null, null, null, null,
+ null, null, null, null, null
+FROM C_InvoiceTax it
+ INNER JOIN C_Tax t ON (it.C_Tax_ID=t.C_Tax_ID);
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_LINETAX_VT.sql b/db/ddlutils/views/C_INVOICE_LINETAX_VT.sql
new file mode 100644
index 0000000000..84790d1450
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_LINETAX_VT.sql
@@ -0,0 +1,117 @@
+CREATE OR REPLACE VIEW C_INVOICE_LINETAX_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, C_INVOICELINE_ID,
+ C_TAX_ID, TAXAMT, LINETOTALAMT, TAXINDICATOR, LINE,
+ M_PRODUCT_ID, QTYINVOICED, QTYENTERED, UOMSYMBOL, NAME,
+ DESCRIPTION, DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE,
+ RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST, DISCOUNT, PRICEACTUAL,
+ PRICEENTERED, LINENETAMT, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO,
+ LOT, M_LOT_ID, GUARANTEEDATE, PRODUCTDESCRIPTION, IMAGEURL,
+ C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ uom.AD_Language,
+ il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
+ il.Line, p.M_Product_ID,
+ CASE WHEN il.QtyInvoiced<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyInvoiced END AS QtyInvoiced,
+ CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyEntered END AS QtyEntered,
+ CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ COALESCE(c.Name,COALESCE(pt.Name,p.Name)||productAttribute(il.M_AttributeSetInstance_ID), il.Description) AS Name, -- main line
+ CASE WHEN COALESCE(c.Name,pt.Name,p.Name) IS NOT NULL THEN il.Description END AS Description, -- second line
+ COALESCE(pt.DocumentNote,p.DocumentNote) AS DocumentNote, -- third line
+ p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
+ ra.Description AS ResourceDescription, -- forth line
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0
+ THEN il.PriceList END AS PriceList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0 AND il.QtyEntered<>0
+ THEN il.PriceList*il.QtyInvoiced/il.QtyEntered END AS PriceEnteredList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList>il.PriceActual AND il.PriceList<>0
+ THEN (il.PriceList-il.PriceActual)/il.PriceList*100 END AS Discount,
+ CASE WHEN il.PriceActual<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceActual END AS PriceActual,
+ CASE WHEN il.PriceEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceEntered END AS PriceEntered,
+ CASE WHEN il.LineNetAmt<>0 OR il.M_Product_ID IS NOT NULL THEN il.LineNetAmt END AS LineNetAmt,
+ il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ pt.Description as ProductDescription, p.ImageURL,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
+FROM C_InvoiceLine il
+ INNER JOIN C_UOM_Trl uom ON (il.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID)
+ LEFT OUTER JOIN C_Tax_Trl t ON (il.C_Tax_ID=t.C_Tax_ID AND uom.AD_Language=t.AD_Language)
+ LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID=c.C_Charge_ID)
+ LEFT OUTER JOIN C_BPartner_Product pp ON (il.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
+ LEFT OUTER JOIN M_Product_Trl pt ON (il.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN S_ResourceAssignment ra ON (il.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+UNION -- bom lines
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ uom.AD_Language,
+ il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
+ il.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ il.QtyInvoiced*b.BOMQty AS QtyInvoiced,
+ il.QtyEntered*b.BOMQty AS QtyEntered,
+ uom.UOMSymbol,
+ COALESCE(pt.Name,p.Name) AS Name, -- main
+ b.Description,
+ COALESCE(pt.DocumentNote,p.DocumentNote) AS DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
+ null, null, null, null, null, null, null,
+ il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ pt.Description as ProductDescription, p.ImageURL,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN C_InvoiceLine il ON (b.M_Product_ID=il.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=il.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM_Trl uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN M_Product_Trl pt ON (b.M_ProductBOM_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+UNION -- comment line
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ l.AD_Language, il.C_Invoice_ID, il.C_InvoiceLine_ID,
+ null, null, null, null,
+ il.Line, null,
+ null, null, null,
+ il.Description,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null,null,null,null,null
+FROM C_InvoiceLine il, AD_Language l
+WHERE il.C_UOM_ID IS NULL
+ AND l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
+UNION -- empty line
+SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ AD_Language, i.C_Invoice_ID, null,
+ null, null, null, null,
+ 9998, null,
+ null, null, null,
+ null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null,null,null,null,null
+FROM C_Invoice i, AD_Language l
+WHERE l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
+UNION -- tax lines
+SELECT it.AD_Client_ID, it.AD_Org_ID, it.IsActive, it.Created, it.CreatedBy, it.Updated, it.UpdatedBy,
+ t.AD_Language, it.C_Invoice_ID, null,
+ it.C_Tax_ID, null, null, t.TaxIndicator,
+ 9999, null,
+ null, null, null,
+ t.Name,
+ null, null, null, null, null, null,
+ null, null, null,
+ CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
+ CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
+ CASE WHEN it.IsTaxIncluded='Y' THEN NULL ELSE it.TaxAmt END,
+ null, null, null, null, null, null, null, null,
+ null,null,null,null,null
+FROM C_InvoiceTax it
+ INNER JOIN C_Tax_Trl t ON (it.C_Tax_ID=t.C_Tax_ID);
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_V.sql b/db/ddlutils/views/C_INVOICE_V.sql
new file mode 100644
index 0000000000..990da34c72
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_V.sql
@@ -0,0 +1,53 @@
+CREATE OR REPLACE VIEW C_INVOICE_V
+(C_INVOICE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, DOCACTION, PROCESSING, PROCESSED, C_DOCTYPE_ID,
+ C_DOCTYPETARGET_ID, C_ORDER_ID, DESCRIPTION, ISAPPROVED, ISTRANSFERRED,
+ SALESREP_ID, DATEINVOICED, DATEPRINTED, DATEACCT, C_BPARTNER_ID,
+ C_BPARTNER_LOCATION_ID, AD_USER_ID, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
+ C_CONVERSIONTYPE_ID, PAYMENTRULE, C_PAYMENTTERM_ID, C_CHARGE_ID, M_PRICELIST_ID,
+ C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, ISPRINTED, ISDISCOUNTPRINTED,
+ ISPAID, ISINDISPUTE, ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, MULTIPLIER, MULTIPLIERAP,
+ DOCBASETYPE)
+AS
+SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
+ i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
+ i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
+ i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
+ i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
+ i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
+ i.IsPayScheduleValid, null AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.ChargeAmt*-1 ELSE i.ChargeAmt END AS ChargeAmt,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.TotalLines*-1 ELSE i.TotalLines END AS TotalLines,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.GrandTotal*-1 ELSE i.GrandTotal END AS GrandTotal,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
+ CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
+ d.DocBaseType
+FROM C_Invoice i
+ INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
+WHERE i.IsPayScheduleValid<>'Y'
+UNION
+SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
+ i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
+ i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
+ i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
+ i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
+ i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
+ i.IsPayScheduleValid, ips.C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
+ null AS ChargeAmt,
+ null AS TotalLines,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN ips.DueAmt*-1 ELSE ips.DueAmt END AS GrandTotal,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
+ CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
+ d.DocBaseType
+FROM C_Invoice i
+ INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
+ INNER JOIN C_InvoicePaySchedule ips ON (i.C_Invoice_ID=ips.C_Invoice_ID)
+WHERE i.IsPayScheduleValid='Y'
+ AND ips.IsValid='Y';
+
+
+
diff --git a/db/ddlutils/views/C_INVOICE_V1.sql b/db/ddlutils/views/C_INVOICE_V1.sql
new file mode 100644
index 0000000000..0c8435b313
--- /dev/null
+++ b/db/ddlutils/views/C_INVOICE_V1.sql
@@ -0,0 +1,32 @@
+CREATE OR REPLACE VIEW C_INVOICE_V1
+(C_INVOICE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, DOCACTION, PROCESSING, PROCESSED, C_DOCTYPE_ID,
+ C_DOCTYPETARGET_ID, C_ORDER_ID, DESCRIPTION, ISAPPROVED, ISTRANSFERRED,
+ SALESREP_ID, DATEINVOICED, DATEPRINTED, DATEACCT, C_BPARTNER_ID,
+ C_BPARTNER_LOCATION_ID, AD_USER_ID, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
+ C_CONVERSIONTYPE_ID, PAYMENTRULE, C_PAYMENTTERM_ID, C_CHARGE_ID, M_PRICELIST_ID,
+ C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, ISPRINTED, ISDISCOUNTPRINTED,
+ ISPAID, ISINDISPUTE, ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, MULTIPLIER, MULTIPLIERAP,
+ DOCBASETYPE)
+AS
+SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
+ i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
+ i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
+ i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
+ i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
+ i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
+ i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
+ i.IsPayScheduleValid, null AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.ChargeAmt*-1 ELSE i.ChargeAmt END AS ChargeAmt,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.TotalLines*-1 ELSE i.TotalLines END AS TotalLines,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.GrandTotal*-1 ELSE i.GrandTotal END AS GrandTotal,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
+ CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
+ d.DocBaseType
+FROM C_Invoice i
+ INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID);
+
+
+
diff --git a/db/ddlutils/views/C_ORDER_HEADER_V.sql b/db/ddlutils/views/C_ORDER_HEADER_V.sql
new file mode 100644
index 0000000000..594ac27cec
--- /dev/null
+++ b/db/ddlutils/views/C_ORDER_HEADER_V.sql
@@ -0,0 +1,70 @@
+CREATE OR REPLACE VIEW C_ORDER_HEADER_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, SALESREP_ID,
+ SALESREP_NAME, DATEORDERED, DATEPROMISED, BPGREETING, NAME,
+ NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
+ C_LOCATION_ID, POSTAL, REFERENCENO, BILL_BPARTNER_ID, BILL_LOCATION_ID,
+ BILL_USER_ID, BILL_BPVALUE, BILL_BPTAXID, BILL_NAME, BILL_NAME2,
+ BILL_TITLE, BILL_PHONE, BILL_CONTACTNAME, BILL_C_LOCATION_ID, DESCRIPTION,
+ POREFERENCE, C_CURRENCY_ID, PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
+ ISTAXINCLUDED, VOLUME, WEIGHT, C_CAMPAIGN_ID, C_PROJECT_ID,
+ C_ACTIVITY_ID, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE, PRIORITYRULE,
+ INVOICERULE)
+AS
+SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
+ 'en_US' AS AD_Language,
+ o.C_Order_ID, o.IsSOTrx, o.DocumentNo, o.DocStatus, o.C_DocType_ID,
+ o.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ o.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ o.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ o.DateOrdered, o.DatePromised,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
+ bp.ReferenceNo,
+ -- Bill to
+ o.Bill_BPartner_ID, o.Bill_Location_ID, o.Bill_User_ID,
+ bbp.Value AS Bill_BPValue, bbp.TaxID AS Bill_BPTaxID,
+ bbp.Name AS Bill_Name, bbp.Name2 AS Bill_Name2,
+ bbpc.Title AS Bill_Title, bbpc.Phone AS Bill_Phone,
+ NULLIF (bbpc.Name, bbp.Name) AS Bill_ContactName,
+ bbpl.C_Location_ID AS Bill_C_Location_ID,
+ o.Description,
+ o.POReference,
+ o.C_Currency_ID,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ o.C_Charge_ID, o.ChargeAmt,
+ o.TotalLines,
+ o.GrandTotal, o.GrandTotal AS AmtInWords,
+ o.M_PriceList_ID,
+ o.IsTaxIncluded, o.Volume, o.Weight,
+ o.C_Campaign_ID, o.C_Project_ID, o.C_Activity_ID,
+ o.M_Shipper_ID, o.DeliveryRule, o.DeliveryViaRule, o.PriorityRule, o.InvoiceRule
+FROM C_Order o
+ INNER JOIN C_DocType dt ON (o.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN M_Warehouse wh ON (o.M_Warehouse_ID=wh.M_Warehouse_ID)
+ INNER JOIN C_PaymentTerm pt ON (o.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
+ INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ INNER JOIN C_BPartner_Location bpl ON (o.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (o.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ INNER JOIN AD_OrgInfo oi ON (o.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (o.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
+ INNER JOIN C_BPartner bbp ON (o.Bill_BPartner_ID=bbp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bbpl ON (o.Bill_Location_ID=bbpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN AD_User bbpc ON (o.Bill_User_ID=bbpc.AD_User_ID);
+
+
+
diff --git a/db/ddlutils/views/C_ORDER_HEADER_VT.sql b/db/ddlutils/views/C_ORDER_HEADER_VT.sql
new file mode 100644
index 0000000000..b4c1fa7ebc
--- /dev/null
+++ b/db/ddlutils/views/C_ORDER_HEADER_VT.sql
@@ -0,0 +1,70 @@
+CREATE OR REPLACE VIEW C_ORDER_HEADER_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, SALESREP_ID,
+ SALESREP_NAME, DATEORDERED, DATEPROMISED, BPGREETING, NAME,
+ NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
+ C_LOCATION_ID, POSTAL, REFERENCENO, BILL_BPARTNER_ID, BILL_LOCATION_ID,
+ BILL_USER_ID, BILL_BPVALUE, BILL_BPTAXID, BILL_NAME, BILL_NAME2,
+ BILL_TITLE, BILL_PHONE, BILL_CONTACTNAME, BILL_C_LOCATION_ID, DESCRIPTION,
+ POREFERENCE, C_CURRENCY_ID, PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID,
+ CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
+ ISTAXINCLUDED, VOLUME, WEIGHT, C_CAMPAIGN_ID, C_PROJECT_ID,
+ C_ACTIVITY_ID, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE, PRIORITYRULE,
+ INVOICERULE)
+AS
+SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
+ dt.AD_Language,
+ o.C_Order_ID, o.IsSOTrx, o.DocumentNo, o.DocStatus, o.C_DocType_ID,
+ o.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ o.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ o.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ o.DateOrdered, o.DatePromised,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
+ bp.ReferenceNo,
+ -- Bill to
+ o.Bill_BPartner_ID, o.Bill_Location_ID, o.Bill_User_ID,
+ bbp.Value AS Bill_BPValue, bbp.TaxID AS Bill_BPTaxID,
+ bbp.Name AS Bill_Name, bbp.Name2 AS Bill_Name2,
+ bbpc.Title AS Bill_Title, bbpc.Phone AS Bill_Phone,
+ NULLIF (bbpc.Name, bbp.Name) AS Bill_ContactName,
+ bbpl.C_Location_ID AS Bill_C_Location_ID,
+ o.Description,
+ o.POReference,
+ o.C_Currency_ID,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ o.C_Charge_ID, o.ChargeAmt,
+ o.TotalLines,
+ o.GrandTotal, o.GrandTotal AS AmtInWords,
+ o.M_PriceList_ID,
+ o.IsTaxIncluded, o.Volume, o.Weight,
+ o.C_Campaign_ID, o.C_Project_ID, o.C_Activity_ID,
+ o.M_Shipper_ID, o.DeliveryRule, o.DeliveryViaRule, o.PriorityRule, o.InvoiceRule
+FROM C_Order o
+ INNER JOIN C_DocType_Trl dt ON (o.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN M_Warehouse wh ON (o.M_Warehouse_ID=wh.M_Warehouse_ID)
+ INNER JOIN C_PaymentTerm_Trl pt ON (o.C_PaymentTerm_ID=pt.C_PaymentTerm_ID AND dt.AD_Language=pt.AD_Language)
+ INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID AND dt.AD_Language=bpg.AD_Language)
+ INNER JOIN C_BPartner_Location bpl ON (o.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (o.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID AND dt.AD_Language=bpcg.AD_Language)
+ INNER JOIN AD_OrgInfo oi ON (o.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_User u ON (o.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
+ INNER JOIN C_BPartner bbp ON (o.Bill_BPartner_ID=bbp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bbpl ON (o.Bill_Location_ID=bbpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN AD_User bbpc ON (o.Bill_User_ID=bbpc.AD_User_ID);
+
+
+
diff --git a/db/ddlutils/views/C_ORDER_LINETAX_V.sql b/db/ddlutils/views/C_ORDER_LINETAX_V.sql
new file mode 100644
index 0000000000..2dbe7f8464
--- /dev/null
+++ b/db/ddlutils/views/C_ORDER_LINETAX_V.sql
@@ -0,0 +1,93 @@
+CREATE OR REPLACE VIEW C_ORDER_LINETAX_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, C_ORDERLINE_ID,
+ C_TAX_ID, TAXINDICATOR, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, BPNAME,
+ C_LOCATION_ID, LINE, M_PRODUCT_ID, QTYORDERED, QTYENTERED,
+ UOMSYMBOL, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
+ SKU, PRODUCTVALUE, RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST,
+ DISCOUNT, PRICEACTUAL, PRICEENTERED, LINENETAMT, PRODUCTDESCRIPTION,
+ IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID,
+ C_PROJECTTASK_ID)
+AS
+SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
+ 'en_US' AS AD_Language,
+ ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, t.TaxIndicator,
+ ol.C_BPartner_ID, ol.C_BPartner_Location_ID, bp.Name AS BPName, bpl.C_Location_ID,
+ ol.Line, p.M_Product_ID,
+ CASE WHEN ol.QtyOrdered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered END AS QtyOrdered,
+ CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyEntered END AS QtyEntered,
+ CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ COALESCE(c.Name,p.Name||productAttribute(ol.M_AttributeSetInstance_ID), ol.Description) AS Name, -- main line
+ CASE WHEN COALESCE(c.Name,p.Name) IS NOT NULL THEN ol.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
+ ra.Description AS ResourceDescription, -- forth line
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0
+ THEN ol.PriceList END AS PriceList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0 AND ol.QtyEntered<>0
+ THEN ol.PriceList*ol.QtyOrdered/ol.QtyEntered END AS PriceEnteredList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList>ol.PriceActual AND ol.PriceList<>0
+ THEN (ol.PriceList-ol.PriceActual)/ol.PriceList*100 END AS Discount,
+ CASE WHEN ol.PriceActual<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceActual END AS PriceActual,
+ CASE WHEN ol.PriceEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceEntered END AS PriceEntered,
+ CASE WHEN ol.LineNetAmt<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.LineNetAmt END AS LineNetAmt,
+ p.Description as ProductDescription, p.ImageURL,
+ ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
+FROM C_OrderLine ol
+ INNER JOIN C_UOM uom ON (ol.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_Order i ON (ol.C_Order_ID=i.C_Order_ID)
+ LEFT OUTER JOIN M_Product p ON (ol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN S_ResourceAssignment ra ON (ol.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
+ LEFT OUTER JOIN C_Charge c ON (ol.C_Charge_ID=c.C_Charge_ID)
+ LEFT OUTER JOIN C_BPartner_Product pp ON (ol.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
+ INNER JOIN C_BPartner bp ON (ol.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bpl ON (ol.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN C_Tax t ON (ol.C_Tax_ID=t.C_Tax_ID)
+UNION
+SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
+ 'en_US' AS AD_Language,
+ ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, null,
+ null, null, null, null,
+ ol.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ ol.QtyOrdered*b.BOMQty AS QtyInvoiced, ol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
+ p.Name, -- main
+ b.Description,
+ p.DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
+ null, null, null, null, null, null, null, p.Description as ProductDescription, p.ImageURL,
+ ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN C_OrderLine ol ON (b.M_Product_ID=ol.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=ol.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+UNION
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ 'en_US', C_Order_ID, null, null, null,
+ null,
+ null, null, null,
+ null, null, null, null,
+ null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null,null,null,null,null
+FROM C_Order
+UNION
+SELECT ot.AD_Client_ID, ot.AD_Org_ID, ot.IsActive, ot.Created, ot.CreatedBy, ot.Updated, ot.UpdatedBy,
+ 'en_US', ot.C_Order_ID, null, ot.C_Tax_ID, t.TaxIndicator,
+ null, null, null, null,
+ null, null,
+ null, null, null,
+ t.Name,
+ null, null, null, null, null, null,
+ null, null, null,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN NULL ELSE ot.TaxAmt END,
+ null, null,
+ null,null,null,null,null
+FROM C_OrderTax ot
+ INNER JOIN C_Tax t ON (ot.C_Tax_ID=t.C_Tax_ID);
+
+
+
diff --git a/db/ddlutils/views/C_ORDER_LINETAX_VT.sql b/db/ddlutils/views/C_ORDER_LINETAX_VT.sql
new file mode 100644
index 0000000000..2d3a781c33
--- /dev/null
+++ b/db/ddlutils/views/C_ORDER_LINETAX_VT.sql
@@ -0,0 +1,96 @@
+CREATE OR REPLACE VIEW C_ORDER_LINETAX_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, C_ORDERLINE_ID,
+ C_TAX_ID, TAXINDICATOR, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, BPNAME,
+ C_LOCATION_ID, LINE, M_PRODUCT_ID, QTYORDERED, QTYENTERED,
+ UOMSYMBOL, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
+ SKU, PRODUCTVALUE, RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST,
+ DISCOUNT, PRICEACTUAL, PRICEENTERED, LINENETAMT, PRODUCTDESCRIPTION,
+ IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID,
+ C_PROJECTTASK_ID)
+AS
+SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
+ uom.AD_Language,
+ ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, t.TaxIndicator,
+ ol.C_BPartner_ID, ol.C_BPartner_Location_ID, bp.Name AS BPName, bpl.C_Location_ID,
+ ol.Line, p.M_Product_ID,
+ CASE WHEN ol.QtyOrdered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered END AS QtyOrdered,
+ CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyEntered END AS QtyEntered,
+ CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ COALESCE(c.Name,p.Name||productAttribute(ol.M_AttributeSetInstance_ID), ol.Description) AS Name, -- main line
+ CASE WHEN COALESCE(c.Name,pt.Name, p.Name) IS NOT NULL THEN ol.Description END AS Description, -- second line
+ COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, -- third line
+ p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
+ ra.Description AS ResourceDescription, -- forth line
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0
+ THEN ol.PriceList END AS PriceList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0 AND ol.QtyEntered<>0
+ THEN ol.PriceList*ol.QtyOrdered/ol.QtyEntered END AS PriceEnteredList,
+ CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList>ol.PriceActual AND ol.PriceList<>0
+ THEN (ol.PriceList-ol.PriceActual)/ol.PriceList*100 END AS Discount,
+ CASE WHEN ol.PriceActual<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceActual END AS PriceActual,
+ CASE WHEN ol.PriceEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceEntered END AS PriceEntered,
+ CASE WHEN ol.LineNetAmt<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.LineNetAmt END AS LineNetAmt,
+ pt.Description as ProductDescription, p.ImageURL,
+ ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
+FROM C_OrderLine ol
+ INNER JOIN C_UOM_Trl uom ON (ol.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_Order i ON (ol.C_Order_ID=i.C_Order_ID)
+ LEFT OUTER JOIN M_Product p ON (ol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_Product_Trl pt ON (ol.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN S_ResourceAssignment ra ON (ol.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
+ LEFT OUTER JOIN C_Charge c ON (ol.C_Charge_ID=c.C_Charge_ID)
+ LEFT OUTER JOIN C_BPartner_Product pp ON (ol.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
+ INNER JOIN C_BPartner bp ON (ol.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bpl ON (ol.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN C_Tax_Trl t ON (ol.C_Tax_ID=t.C_Tax_ID AND uom.AD_Language=t.AD_Language)
+UNION
+SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
+ uom.AD_Language,
+ ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, null,
+ null, null, null, null,
+ ol.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ ol.QtyOrdered*b.BOMQty AS QtyInvoiced, ol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
+ COALESCE(pt.Name, p.Name) AS Name, -- main
+ b.Description,
+ COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
+ null, null, null, null, null, null, null, pt.Description AS ProductDescription, p.ImageURL,
+ ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN C_OrderLine ol ON (b.M_Product_ID=ol.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=ol.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM_Trl uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN M_Product_Trl pt ON (b.M_ProductBOM_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+UNION
+SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
+ l.AD_Language, o.C_Order_ID, null, null, null,
+ null,
+ null, null, null,
+ null, null, null, null,
+ null, null,
+ null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null,
+ null,null,null,null,null
+FROM C_Order o, AD_Language l
+WHERE l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
+UNION
+SELECT ot.AD_Client_ID, ot.AD_Org_ID, ot.IsActive, ot.Created, ot.CreatedBy, ot.Updated, ot.UpdatedBy,
+ t.AD_Language, ot.C_Order_ID, null, ot.C_Tax_ID, t.TaxIndicator,
+ null, null, null, null,
+ null, null,
+ null, null, null,
+ t.Name,
+ null, null, null, null, null, null,
+ null, null, null,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
+ CASE WHEN ot.IsTaxIncluded='Y' THEN NULL ELSE ot.TaxAmt END,
+ null, null,
+ null,null,null,null,null
+FROM C_OrderTax ot
+ INNER JOIN C_Tax_Trl t ON (ot.C_Tax_ID=t.C_Tax_ID);
+
+
+
diff --git a/db/ddlutils/views/C_PAYMENT_V.sql b/db/ddlutils/views/C_PAYMENT_V.sql
new file mode 100644
index 0000000000..88f9bffbeb
--- /dev/null
+++ b/db/ddlutils/views/C_PAYMENT_V.sql
@@ -0,0 +1,42 @@
+CREATE OR REPLACE VIEW C_PAYMENT_V
+(C_PAYMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, DATETRX,
+ ISRECEIPT, C_DOCTYPE_ID, TRXTYPE, C_BANKACCOUNT_ID, C_BPARTNER_ID,
+ C_INVOICE_ID, C_BP_BANKACCOUNT_ID, C_PAYMENTBATCH_ID, TENDERTYPE, CREDITCARDTYPE,
+ CREDITCARDNUMBER, CREDITCARDVV, CREDITCARDEXPMM, CREDITCARDEXPYY, MICR,
+ ROUTINGNO, ACCOUNTNO, CHECKNO, A_NAME, A_STREET,
+ A_CITY, A_STATE, A_ZIP, A_IDENT_DL, A_IDENT_SSN,
+ A_EMAIL, VOICEAUTHCODE, ORIG_TRXID, PONUM, C_CURRENCY_ID,
+ C_CONVERSIONTYPE_ID, PAYAMT, DISCOUNTAMT, WRITEOFFAMT, TAXAMT,
+ OVERUNDERAMT, MULTIPLIERAP, ISOVERUNDERPAYMENT, ISAPPROVED, R_PNREF,
+ R_RESULT, R_RESPMSG, R_AUTHCODE, R_AVSADDR, R_AVSZIP,
+ R_INFO, PROCESSING, OPROCESSING, DOCSTATUS, DOCACTION,
+ ISPREPAYMENT, C_CHARGE_ID, ISRECONCILED, ISALLOCATED, ISONLINE,
+ PROCESSED, POSTED, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID)
+AS
+SELECT C_Payment_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ DocumentNo, DateTrx, IsReceipt, C_DocType_ID, TrxType,
+ C_BankAccount_ID, C_BPartner_ID, C_Invoice_ID, C_BP_BankAccount_ID, C_PaymentBatch_ID,
+ TenderType, CreditCardType, CreditCardNumber, CreditCardVV, CreditCardExpMM, CreditCardExpYY,
+ Micr, RoutingNo, AccountNo, CheckNo,
+ A_Name, A_Street, A_City, A_State, A_Zip, A_Ident_DL, A_Ident_SSN, A_EMail,
+ VoiceAuthCode, Orig_TrxID, PONum,
+ C_Currency_ID, C_ConversionType_ID,
+ CASE IsReceipt WHEN 'Y' THEN PayAmt ELSE PayAmt*-1 END AS PayAmt,
+ CASE IsReceipt WHEN 'Y' THEN DiscountAmt ELSE DiscountAmt*-1 END AS DiscountAmt,
+ CASE IsReceipt WHEN 'Y' THEN WriteOffAmt ELSE WriteOffAmt*-1 END AS WriteOffAmt,
+ CASE IsReceipt WHEN 'Y' THEN TaxAmt ELSE TaxAmt*-1 END AS TaxAmt,
+ CASE IsReceipt WHEN 'Y' THEN OverUnderAmt ELSE OverUnderAmt*-1 END AS OverUnderAmt,
+ CASE IsReceipt WHEN 'Y' THEN 1 ELSE -1 END AS MultiplierAP,
+ IsOverUnderPayment, IsApproved,
+ R_PnRef, R_Result, R_RespMsg, R_AuthCode, R_AvsAddr, R_AvsZip, R_Info,
+ Processing, OProcessing, DocStatus, DocAction,
+ IsPrepayment, C_Charge_ID,
+ IsReconciled, IsAllocated, IsOnline, Processed, Posted,
+ C_Campaign_ID, C_Project_ID, C_Activity_ID
+FROM C_Payment;
+
+--COMMENT ON TABLE C_PAYMENT_V IS 'Payment Information corrected for AP/AR';
+
+
+
diff --git a/db/ddlutils/views/C_PAYSELECTION_CHECK_V.sql b/db/ddlutils/views/C_PAYSELECTION_CHECK_V.sql
new file mode 100644
index 0000000000..1a5692a6de
--- /dev/null
+++ b/db/ddlutils/views/C_PAYSELECTION_CHECK_V.sql
@@ -0,0 +1,27 @@
+CREATE OR REPLACE VIEW C_PAYSELECTION_CHECK_V
+(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONCHECK_ID,
+ ORG_LOCATION_ID, TAXID, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, BPGREETING, NAME,
+ NAME2, C_LOCATION_ID, REFERENCENO, POREFERENCE, PAYDATE,
+ PAYAMT, AMTINWORDS, QTY, PAYMENTRULE, DOCUMENTNO)
+AS
+SELECT psc.AD_Client_ID, psc.AD_Org_ID,
+ 'en_US' AS AD_Language,
+ psc.C_PaySelection_ID, psc.C_PaySelectionCheck_ID,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID, 0 AS C_DocType_ID,
+ bp.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpartnerRemitLocation(bp.C_BPartner_ID) AS C_Location_ID,
+ bp.ReferenceNo, bp.POReference,
+ ps.PayDate,
+ psc.PayAmt, psc.PayAmt AS AmtInWords,
+ psc.Qty, psc.PaymentRule, psc.DocumentNo
+FROM C_PaySelectionCheck psc
+ INNER JOIN C_PaySelection ps ON (psc.C_PaySelection_ID=ps.C_PaySelection_ID)
+ INNER JOIN C_BPartner bp ON (psc.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ INNER JOIN AD_OrgInfo oi ON (psc.AD_Org_ID=oi.AD_Org_ID);
+
+
+
diff --git a/db/ddlutils/views/C_PAYSELECTION_CHECK_VT.sql b/db/ddlutils/views/C_PAYSELECTION_CHECK_VT.sql
new file mode 100644
index 0000000000..e4963630cd
--- /dev/null
+++ b/db/ddlutils/views/C_PAYSELECTION_CHECK_VT.sql
@@ -0,0 +1,28 @@
+CREATE OR REPLACE VIEW C_PAYSELECTION_CHECK_VT
+(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONCHECK_ID,
+ ORG_LOCATION_ID, TAXID, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, BPGREETING, NAME,
+ NAME2, C_LOCATION_ID, REFERENCENO, POREFERENCE, PAYDATE,
+ PAYAMT, AMTINWORDS, QTY, PAYMENTRULE, DOCUMENTNO)
+AS
+SELECT psc.AD_Client_ID, psc.AD_Org_ID,
+ l.AD_Language,
+ psc.C_PaySelection_ID, psc.C_PaySelectionCheck_ID,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID, 0 AS C_DocType_ID,
+ bp.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpartnerRemitLocation(bp.C_BPartner_ID) AS C_Location_ID,
+ bp.ReferenceNo, bp.POReference,
+ ps.PayDate,
+ psc.PayAmt, psc.PayAmt AS AmtInWords,
+ psc.Qty, psc.PaymentRule, psc.DocumentNo
+FROM C_PaySelectionCheck psc
+ INNER JOIN C_PaySelection ps ON (psc.C_PaySelection_ID=ps.C_PaySelection_ID)
+ INNER JOIN C_BPartner bp ON (psc.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN AD_OrgInfo oi ON (psc.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN AD_Language l ON (l.IsSystemLanguage='Y')
+ LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID AND bpg.AD_Language=l.AD_Language);
+
+
+
diff --git a/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_V.sql b/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_V.sql
new file mode 100644
index 0000000000..2b22732e8d
--- /dev/null
+++ b/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_V.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW C_PAYSELECTION_REMITTANCE_V
+(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONLINE_ID,
+ C_PAYSELECTIONCHECK_ID, PAYMENTRULE, LINE, OPENAMT, PAYAMT,
+ DISCOUNTAMT, DIFFERENCEAMT, C_BPARTNER_ID, DOCUMENTNO, DATEINVOICED,
+ GRANDTOTAL, AMTINWORDS)
+AS
+SELECT psl.AD_Client_ID, psl.AD_Org_ID,
+ 'en_US' AS AD_Language,
+ psl.C_PaySelection_ID, psl.C_PaySelectionLine_ID,
+ psl.C_PaySelectionCheck_ID,
+ psl.PaymentRule, psl.Line, psl.OpenAmt, psl.PayAmt, psl.DiscountAmt, psl.DifferenceAmt,
+ i.C_BPartner_ID, i.DocumentNo, i.DateInvoiced, i.GrandTotal, i.GrandTotal AS AmtInWords
+FROM C_PaySelectionLine psl
+ INNER JOIN C_Invoice i ON (psl.C_Invoice_ID=i.C_Invoice_ID);
+
+
+
diff --git a/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_VT.sql b/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_VT.sql
new file mode 100644
index 0000000000..ddfdae5af0
--- /dev/null
+++ b/db/ddlutils/views/C_PAYSELECTION_REMITTANCE_VT.sql
@@ -0,0 +1,18 @@
+CREATE OR REPLACE VIEW C_PAYSELECTION_REMITTANCE_VT
+(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONLINE_ID,
+ C_PAYSELECTIONCHECK_ID, PAYMENTRULE, LINE, OPENAMT, PAYAMT,
+ DISCOUNTAMT, DIFFERENCEAMT, C_BPARTNER_ID, DOCUMENTNO, DATEINVOICED,
+ GRANDTOTAL, AMTINWORDS)
+AS
+SELECT psl.AD_Client_ID, psl.AD_Org_ID,
+ l.AD_Language,
+ psl.C_PaySelection_ID, psl.C_PaySelectionLine_ID,
+ psl.C_PaySelectionCheck_ID,
+ psl.PaymentRule, psl.Line, psl.OpenAmt, psl.PayAmt, psl.DiscountAmt, psl.DifferenceAmt,
+ i.C_BPartner_ID, i.DocumentNo, i.DateInvoiced, i.GrandTotal, i.GrandTotal AS AmtInWords
+FROM C_PaySelectionLine psl
+ INNER JOIN C_Invoice i ON (psl.C_Invoice_ID=i.C_Invoice_ID)
+ INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y');
+
+
+
diff --git a/db/ddlutils/views/C_PROJECT_DETAILS_V.sql b/db/ddlutils/views/C_PROJECT_DETAILS_V.sql
new file mode 100644
index 0000000000..40dd1e32de
--- /dev/null
+++ b/db/ddlutils/views/C_PROJECT_DETAILS_V.sql
@@ -0,0 +1,28 @@
+CREATE OR REPLACE VIEW C_PROJECT_DETAILS_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_PROJECT_ID, C_PROJECTLINE_ID,
+ LINE, PLANNEDQTY, PLANNEDPRICE, PLANNEDAMT, PLANNEDMARGINAMT,
+ COMMITTEDAMT, M_PRODUCT_ID, NAME, DESCRIPTION, DOCUMENTNOTE,
+ UPC, SKU, PRODUCTVALUE, M_PRODUCT_CATEGORY_ID, INVOICEDAMT,
+ INVOICEDQTY, COMMITTEDQTY)
+AS
+SELECT pl.AD_Client_ID, pl.AD_Org_ID, pl.IsActive, pl.Created, pl.CreatedBy, pl.Updated, pl.UpdatedBy,
+ 'en_US' AS AD_Language,
+ pj.C_Project_ID, pl.C_ProjectLine_ID,
+ pl.Line,
+ pl.PlannedQty, pl.PlannedPrice, pl.PlannedAmt, pl.PlannedMarginAmt,
+ pl.CommittedAmt,
+ pl.M_Product_ID,
+ COALESCE(p.Name, pl.Description) AS Name, -- main line
+ CASE WHEN p.Name IS NOT NULL THEN pl.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ pl.M_Product_Category_ID,
+ pl.InvoicedAmt, pl.InvoicedQty, pl.CommittedQty
+FROM C_ProjectLine pl
+ INNER JOIN C_Project pj ON (pl.C_Project_ID=pj.C_Project_ID)
+ LEFT OUTER JOIN M_Product p ON (pl.M_Product_ID=p.M_Product_ID)
+WHERE pl.IsPrinted='Y';
+
+
+
diff --git a/db/ddlutils/views/C_PROJECT_DETAILS_VT.sql b/db/ddlutils/views/C_PROJECT_DETAILS_VT.sql
new file mode 100644
index 0000000000..a86b58285b
--- /dev/null
+++ b/db/ddlutils/views/C_PROJECT_DETAILS_VT.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW C_PROJECT_DETAILS_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_PROJECT_ID, C_PROJECTLINE_ID,
+ LINE, PLANNEDQTY, PLANNEDPRICE, PLANNEDAMT, PLANNEDMARGINAMT,
+ COMMITTEDAMT, M_PRODUCT_ID, NAME, DESCRIPTION, DOCUMENTNOTE,
+ UPC, SKU, PRODUCTVALUE, M_PRODUCT_CATEGORY_ID, INVOICEDAMT,
+ INVOICEDQTY, COMMITTEDQTY)
+AS
+SELECT pl.AD_Client_ID, pl.AD_Org_ID, pl.IsActive, pl.Created, pl.CreatedBy, pl.Updated, pl.UpdatedBy,
+ l.AD_Language,
+ pj.C_Project_ID, pl.C_ProjectLine_ID,
+ pl.Line,
+ pl.PlannedQty, pl.PlannedPrice, pl.PlannedAmt, pl.PlannedMarginAmt,
+ pl.CommittedAmt,
+ pl.M_Product_ID,
+ COALESCE(p.Name, pl.Description) AS Name, -- main line
+ CASE WHEN p.Name IS NOT NULL THEN pl.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ pl.M_Product_Category_ID,
+ pl.InvoicedAmt, pl.InvoicedQty, pl.CommittedQty
+FROM C_ProjectLine pl
+ INNER JOIN C_Project pj ON (pl.C_Project_ID=pj.C_Project_ID)
+ LEFT OUTER JOIN M_Product p ON (pl.M_Product_ID=p.M_Product_ID)
+ INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y')
+WHERE pl.IsPrinted='Y';
+
+
+
diff --git a/db/ddlutils/views/C_PROJECT_HEADER_V.sql b/db/ddlutils/views/C_PROJECT_HEADER_V.sql
new file mode 100644
index 0000000000..d8bbc95046
--- /dev/null
+++ b/db/ddlutils/views/C_PROJECT_HEADER_V.sql
@@ -0,0 +1,50 @@
+CREATE OR REPLACE VIEW C_PROJECT_HEADER_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_PROJECT_ID, VALUE,
+ PROJECTNAME, DESCRIPTION, NOTE, ISSUMMARY, PROJECTCATEGORY,
+ ORG_LOCATION_ID, TAXID, C_PROJECTTYPE_ID, PROJECTTYPENAME, C_PHASE_ID,
+ PROJECTPHASENAME, SALESREP_ID, SALESREP_NAME, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, BPGREETING, NAME,
+ NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
+ C_LOCATION_ID, REFERENCENO, PAYMENTTERM, PAYMENTTERMNOTE, POREFERENCE,
+ C_CURRENCY_ID, M_PRICELIST_VERSION_ID, C_CAMPAIGN_ID, PLANNEDAMT, PLANNEDQTY,
+ PLANNEDMARGINAMT, INVOICEDAMT, INVOICEDQTY, PROJECTBALANCEAMT, ISCOMMITMENT,
+ COMMITTEDAMT, COMMITTEDQTY, DATECONTRACT, DATEFINISH, ISCOMMITCEILING,
+ M_WAREHOUSE_ID)
+AS
+SELECT p.AD_Client_ID, p.AD_Org_ID, p.IsActive, p.Created, p.CreatedBy, p.Updated, p.UpdatedBy,
+ 'en_US' AS AD_Language, p.C_Project_ID,
+ p.Value, p.Name AS ProjectName, p.Description, p.Note, p.IsSummary, p.ProjectCategory,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ p.C_ProjectType_ID, pjt.Name AS ProjectTypeName, p.C_Phase_ID, pjp.Name AS ProjectPhaseName,
+ p.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ p.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID,
+ bp.ReferenceNo,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ p.POReference,
+ p.C_Currency_ID, p.M_PriceList_Version_ID,
+ p.C_Campaign_ID,
+ p.PlannedAmt, p.PlannedQty, p.PlannedMarginAmt, p.InvoicedAmt, p.InvoicedQty, p.ProjectBalanceAmt,
+ p.IsCommitment, p.CommittedAmt, p.CommittedQty, p.DateContract, p.DateFinish, p.IsCommitCeiling,
+ p.M_Warehouse_ID
+FROM C_Project p
+ LEFT OUTER JOIN C_BPartner bp ON (p.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN AD_OrgInfo oi ON (p.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN C_ProjectType pjt ON (p.C_ProjectType_ID=pjt.C_ProjectType_ID)
+ LEFT OUTER JOIN C_Phase pjp ON (p.C_Phase_ID=pjp.C_Phase_ID)
+ LEFT OUTER JOIN AD_User u ON (p.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ LEFT OUTER JOIN AD_User bpc ON (p.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ LEFT OUTER JOIN C_BPartner_Location bpl ON (p.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN C_PaymentTerm pt ON (p.C_PaymentTerm_ID=pt.C_PaymentTerm_ID);
+
+
+
diff --git a/db/ddlutils/views/C_PROJECT_HEADER_VT.sql b/db/ddlutils/views/C_PROJECT_HEADER_VT.sql
new file mode 100644
index 0000000000..676c6cfd17
--- /dev/null
+++ b/db/ddlutils/views/C_PROJECT_HEADER_VT.sql
@@ -0,0 +1,50 @@
+CREATE OR REPLACE VIEW C_PROJECT_HEADER_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, C_PROJECT_ID, VALUE,
+ PROJECTNAME, DESCRIPTION, NOTE, ISSUMMARY, PROJECTCATEGORY,
+ ORG_LOCATION_ID, TAXID, C_PROJECTTYPE_ID, PROJECTTYPENAME, C_PHASE_ID,
+ PROJECTPHASENAME, SALESREP_ID, SALESREP_NAME, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, BPGREETING, NAME,
+ NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
+ C_LOCATION_ID, REFERENCENO, PAYMENTTERM, PAYMENTTERMNOTE, POREFERENCE,
+ C_CURRENCY_ID, M_PRICELIST_VERSION_ID, C_CAMPAIGN_ID, PLANNEDAMT, PLANNEDQTY,
+ PLANNEDMARGINAMT, INVOICEDAMT, INVOICEDQTY, PROJECTBALANCEAMT, ISCOMMITMENT,
+ COMMITTEDAMT, COMMITTEDQTY, DATECONTRACT, DATEFINISH, ISCOMMITCEILING,
+ M_WAREHOUSE_ID)
+AS
+SELECT p.AD_Client_ID, p.AD_Org_ID, p.IsActive, p.Created, p.CreatedBy, p.Updated, p.UpdatedBy,
+ pt.AD_Language, p.C_Project_ID,
+ p.Value, p.Name AS ProjectName, p.Description, p.Note, p.IsSummary, p.ProjectCategory,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ p.C_ProjectType_ID, pjt.Name AS ProjectTypeName, p.C_Phase_ID, pjp.Name AS ProjectPhaseName,
+ p.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
+ p.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID,
+ bp.ReferenceNo,
+ pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
+ p.POReference,
+ p.C_Currency_ID, p.M_PriceList_Version_ID,
+ p.C_Campaign_ID,
+ p.PlannedAmt, p.PlannedQty, p.PlannedMarginAmt, p.InvoicedAmt, p.InvoicedQty, p.ProjectBalanceAmt,
+ p.IsCommitment, p.CommittedAmt, p.CommittedQty, p.DateContract, p.DateFinish, p.IsCommitCeiling,
+ p.M_Warehouse_ID
+FROM C_Project p
+ LEFT OUTER JOIN C_BPartner bp ON (p.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN AD_OrgInfo oi ON (p.AD_Org_ID=oi.AD_Org_ID)
+ LEFT OUTER JOIN C_PaymentTerm_Trl pt ON (p.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
+ LEFT OUTER JOIN C_ProjectType pjt ON (p.C_ProjectType_ID=pjt.C_ProjectType_ID)
+ LEFT OUTER JOIN C_Phase pjp ON (p.C_Phase_ID=pjp.C_Phase_ID)
+ LEFT OUTER JOIN AD_User u ON (p.SalesRep_ID=u.AD_User_ID)
+ LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ LEFT OUTER JOIN AD_User bpc ON (p.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ LEFT OUTER JOIN C_BPartner_Location bpl ON (p.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID);
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSELINEQTY_V.sql b/db/ddlutils/views/C_RFQRESPONSELINEQTY_V.sql
new file mode 100644
index 0000000000..6b52c771b8
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSELINEQTY_V.sql
@@ -0,0 +1,18 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSELINEQTY_V
+(C_RFQRESPONSELINE_ID, C_RFQRESPONSELINEQTY_ID, C_RFQLINEQTY_ID, AD_CLIENT_ID, AD_ORG_ID,
+ ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
+ AD_LANGUAGE, C_UOM_ID, UOMSYMBOL, QTY, PRICE,
+ DISCOUNT)
+AS
+SELECT rq.C_RfQResponseLine_ID, rq.C_RfQResponseLineQty_ID, rq.C_RfQLineQty_ID,
+ rq.AD_Client_ID, rq.AD_Org_ID, rq.IsActive, rq.Created, rq.CreatedBy, rq.Updated, rq.UpdatedBy,
+ 'en_US' AS AD_Language,
+ q.C_UOM_ID, uom.UOMSymbol,
+ q.Qty, rq.Price, rq.Discount
+FROM C_RfQResponseLineQty rq
+ INNER JOIN C_RfQLineQty q ON (rq.C_RfQLineQty_ID=q.C_RfQLineQty_ID)
+ INNER JOIN C_UOM uom ON (q.C_UOM_ID=uom.C_UOM_ID)
+WHERE rq.IsActive='Y' AND q.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSELINEQTY_VT.sql b/db/ddlutils/views/C_RFQRESPONSELINEQTY_VT.sql
new file mode 100644
index 0000000000..b1e3bbc390
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSELINEQTY_VT.sql
@@ -0,0 +1,19 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSELINEQTY_VT
+(C_RFQRESPONSELINE_ID, C_RFQRESPONSELINEQTY_ID, C_RFQLINEQTY_ID, AD_CLIENT_ID, AD_ORG_ID,
+ ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
+ AD_LANGUAGE, C_UOM_ID, UOMSYMBOL, QTY, PRICE,
+ DISCOUNT)
+AS
+SELECT rq.C_RfQResponseLine_ID, rq.C_RfQResponseLineQty_ID, rq.C_RfQLineQty_ID,
+ rq.AD_Client_ID, rq.AD_Org_ID, rq.IsActive, rq.Created, rq.CreatedBy, rq.Updated, rq.UpdatedBy,
+ l.AD_Language,
+ q.C_UOM_ID, uom.UOMSymbol,
+ q.Qty, rq.Price, rq.Discount
+FROM C_RfQResponseLineQty rq
+ INNER JOIN C_RfQLineQty q ON (rq.C_RfQLineQty_ID=q.C_RfQLineQty_ID)
+ INNER JOIN C_UOM uom ON (q.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y')
+WHERE rq.IsActive='Y' AND q.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSELINE_V.sql b/db/ddlutils/views/C_RFQRESPONSELINE_V.sql
new file mode 100644
index 0000000000..faa6cc10d7
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSELINE_V.sql
@@ -0,0 +1,34 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSELINE_V
+(C_RFQRESPONSE_ID, C_RFQRESPONSELINE_ID, C_RFQLINE_ID, C_RFQRESPONSELINEQTY_ID, C_RFQLINEQTY_ID,
+ AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, LINE, M_PRODUCT_ID,
+ M_ATTRIBUTESETINSTANCE_ID, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
+ SKU, PRODUCTVALUE, HELP, DATEWORKSTART, DELIVERYDAYS,
+ C_UOM_ID, UOMSYMBOL, BENCHMARKPRICE, QTY, PRICE,
+ DISCOUNT)
+AS
+SELECT rrl.C_RfQResponse_ID, rrl.C_RfQResponseLine_ID, rrl.C_RfQLine_ID,
+ rq.C_RfQResponseLineQty_ID, rq.C_RfQLineQty_ID,
+ rrl.AD_Client_ID, rrl.AD_Org_ID, rrl.IsActive, rrl.Created, rrl.CreatedBy, rrl.Updated, rrl.UpdatedBy,
+ 'en_US' AS AD_Language,
+ rl.Line,
+ rl.M_Product_ID, rl.M_AttributeSetInstance_ID,
+ COALESCE(p.Name||productAttribute(rl.M_AttributeSetInstance_ID), rl.Description) AS Name, -- main line
+ CASE WHEN p.Name IS NOT NULL THEN rl.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ rl.Help,
+ rl.DateWorkStart, rl.DeliveryDays,
+ q.C_UOM_ID, uom.UOMSymbol, q.BenchmarkPrice,
+ q.Qty, rq.Price, rq.Discount
+FROM C_RfQResponseLineQty rq
+ INNER JOIN C_RfQLineQty q ON (rq.C_RfQLineQty_ID=q.C_RfQLineQty_ID)
+ INNER JOIN C_UOM uom ON (q.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_RfQResponseLine rrl ON (rq.C_RfQResponseLine_ID=rrl.C_RfQResponseLine_ID)
+ INNER JOIN C_RfQLine rl ON (rrl.C_RfQLine_ID=rl.C_RfQLine_ID)
+ LEFT OUTER JOIN M_Product p ON (rl.M_Product_ID=p.M_Product_ID)
+WHERE rq.IsActive='Y' AND q.IsActive='Y'
+ AND rrl.IsActive='Y' AND rl.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSELINE_VT.sql b/db/ddlutils/views/C_RFQRESPONSELINE_VT.sql
new file mode 100644
index 0000000000..32848e3228
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSELINE_VT.sql
@@ -0,0 +1,34 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSELINE_VT
+(C_RFQRESPONSE_ID, C_RFQRESPONSELINE_ID, C_RFQLINE_ID, C_RFQRESPONSELINEQTY_ID, C_RFQLINEQTY_ID,
+ AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, LINE, M_PRODUCT_ID,
+ M_ATTRIBUTESETINSTANCE_ID, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
+ SKU, PRODUCTVALUE, HELP, DATEWORKSTART, DELIVERYDAYS,
+ C_UOM_ID, UOMSYMBOL, QTY, PRICE, DISCOUNT)
+AS
+SELECT rrl.C_RfQResponse_ID, rrl.C_RfQResponseLine_ID, rrl.C_RfQLine_ID,
+ rq.C_RfQResponseLineQty_ID, rq.C_RfQLineQty_ID,
+ rrl.AD_Client_ID, rrl.AD_Org_ID, rrl.IsActive, rrl.Created, rrl.CreatedBy, rrl.Updated, rrl.UpdatedBy,
+ l.AD_Language,
+ rl.Line,
+ rl.M_Product_ID, rl.M_AttributeSetInstance_ID,
+ COALESCE(p.Name||productAttribute(rl.M_AttributeSetInstance_ID), rl.Description) AS Name, -- main line
+ CASE WHEN p.Name IS NOT NULL THEN rl.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ rl.Help,
+ rl.DateWorkStart, rl.DeliveryDays,
+ q.C_UOM_ID, uom.UOMSymbol,
+ q.Qty, rq.Price, rq.Discount
+FROM C_RfQResponseLineQty rq
+ INNER JOIN C_RfQLineQty q ON (rq.C_RfQLineQty_ID=q.C_RfQLineQty_ID)
+ INNER JOIN C_UOM uom ON (q.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN C_RfQResponseLine rrl ON (rq.C_RfQResponseLine_ID=rrl.C_RfQResponseLine_ID)
+ INNER JOIN C_RfQLine rl ON (rrl.C_RfQLine_ID=rl.C_RfQLine_ID)
+ LEFT OUTER JOIN M_Product p ON (rl.M_Product_ID=p.M_Product_ID)
+ INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y')
+WHERE rq.IsActive='Y' AND q.IsActive='Y'
+ AND rrl.IsActive='Y' AND rl.IsActive='Y';
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSE_V.sql b/db/ddlutils/views/C_RFQRESPONSE_V.sql
new file mode 100644
index 0000000000..755342ff8b
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSE_V.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSE_V
+(C_RFQRESPONSE_ID, C_RFQ_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
+ CREATED, CREATEDBY, UPDATED, UPDATEDBY, AD_LANGUAGE,
+ ORG_LOCATION_ID, TAXID, NAME, DESCRIPTION, HELP,
+ C_CURRENCY_ID, ISO_CODE, DATERESPONSE, DATEWORKSTART, DELIVERYDAYS,
+ C_BPARTNER_ID, BPNAME, BPNAME2, C_BPARTNER_LOCATION_ID, C_LOCATION_ID,
+ AD_USER_ID, TITLE, PHONE, CONTACTNAME)
+AS
+SELECT rr.C_RfQResponse_ID, rr.C_RfQ_ID,
+ rr.AD_Client_ID, rr.AD_Org_ID, rr.IsActive, rr.Created, rr.CreatedBy, rr.Updated, rr.UpdatedBy,
+ 'en_US' AS AD_Language,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ r.Name, r.Description, r.Help,
+ r.C_Currency_ID, c.ISO_Code,
+ r.DateResponse, r.DateWorkStart, r.DeliveryDays,
+ rr.C_BPartner_ID, bp.Name AS BPName, bp.Name2 AS BPName2,
+ rr.C_BPartner_Location_ID, bpl.C_Location_ID,
+ rr.AD_User_ID, bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName
+FROM C_RfQResponse rr
+ INNER JOIN C_RfQ r ON (rr.C_RfQ_ID=r.C_RfQ_ID)
+ INNER JOIN AD_OrgInfo oi ON (rr.AD_Org_ID=oi.AD_Org_ID)
+ INNER JOIN C_Currency c ON (r.C_Currency_ID=c.C_Currency_ID)
+ INNER JOIN C_BPartner bp ON (rr.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bpl ON (rr.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (rr.AD_User_ID=bpc.AD_User_ID);
+
+
+
diff --git a/db/ddlutils/views/C_RFQRESPONSE_VT.sql b/db/ddlutils/views/C_RFQRESPONSE_VT.sql
new file mode 100644
index 0000000000..baf3e6b937
--- /dev/null
+++ b/db/ddlutils/views/C_RFQRESPONSE_VT.sql
@@ -0,0 +1,30 @@
+CREATE OR REPLACE VIEW C_RFQRESPONSE_VT
+(C_RFQRESPONSE_ID, C_RFQ_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
+ CREATED, CREATEDBY, UPDATED, UPDATEDBY, AD_LANGUAGE,
+ ORG_LOCATION_ID, TAXID, NAME, DESCRIPTION, HELP,
+ C_CURRENCY_ID, ISO_CODE, DATERESPONSE, DATEWORKSTART, DELIVERYDAYS,
+ C_BPARTNER_ID, BPNAME, BPNAME2, C_BPARTNER_LOCATION_ID, C_LOCATION_ID,
+ AD_USER_ID, TITLE, PHONE, CONTACTNAME)
+AS
+SELECT rr.C_RfQResponse_ID, rr.C_RfQ_ID,
+ rr.AD_Client_ID, rr.AD_Org_ID, rr.IsActive, rr.Created, rr.CreatedBy, rr.Updated, rr.UpdatedBy,
+ l.AD_Language,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ r.Name, r.Description, r.Help,
+ r.C_Currency_ID, c.ISO_Code,
+ r.DateResponse, r.DateWorkStart, r.DeliveryDays,
+ rr.C_BPartner_ID, bp.Name AS BPName, bp.Name2 AS BPName2,
+ rr.C_BPartner_Location_ID, bpl.C_Location_ID,
+ rr.AD_User_ID, bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName
+FROM C_RfQResponse rr
+ INNER JOIN C_RfQ r ON (rr.C_RfQ_ID=r.C_RfQ_ID)
+ INNER JOIN AD_OrgInfo oi ON (rr.AD_Org_ID=oi.AD_Org_ID)
+ INNER JOIN C_Currency c ON (r.C_Currency_ID=c.C_Currency_ID)
+ INNER JOIN C_BPartner bp ON (rr.C_BPartner_ID=bp.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bpl ON (rr.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (rr.AD_User_ID=bpc.AD_User_ID)
+ INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y');
+
+
+
diff --git a/db/ddlutils/views/GL_JOURNALLINE_ACCT_V.sql b/db/ddlutils/views/GL_JOURNALLINE_ACCT_V.sql
new file mode 100644
index 0000000000..5a8cdff810
--- /dev/null
+++ b/db/ddlutils/views/GL_JOURNALLINE_ACCT_V.sql
@@ -0,0 +1,26 @@
+CREATE OR REPLACE VIEW GL_JOURNALLINE_ACCT_V
+(GL_JOURNALLINE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, GL_JOURNAL_ID, LINE,
+ ISGENERATED, DESCRIPTION, AMTSOURCEDR, AMTSOURCECR, C_CURRENCY_ID,
+ C_CONVERSIONTYPE_ID, CURRENCYRATE, DATEACCT, AMTACCTDR, AMTACCTCR,
+ C_UOM_ID, QTY, C_VALIDCOMBINATION_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID,
+ M_PRODUCT_ID, C_BPARTNER_ID, AD_ORGTRX_ID, C_LOCFROM_ID, C_LOCTO_ID,
+ C_SALESREGION_ID, C_PROJECT_ID, C_CAMPAIGN_ID, USER1_ID, USER2_ID,
+ ISFULLYQUALIFIED, C_ACTIVITY_ID)
+AS
+SELECT
+ gl.GL_JournalLine_ID, gl.AD_Client_ID, gl.AD_Org_ID, gl.IsActive,
+ gl.Created, gl.CreatedBy, gl.Updated, gl.UpdatedBy, gl.GL_Journal_ID,
+ gl.Line, gl.IsGenerated, gl.Description,
+ gl.AmtSourceDr, gl.AmtSourceCr, gl.C_Currency_ID,
+ gl.C_ConversionType_ID, gl.CurrencyRate, gl.DateAcct,
+ gl.AmtAcctDr, gl.AmtAcctCr, gl.C_UOM_ID, gl.Qty, gl.C_ValidCombination_ID,
+ vc.C_AcctSchema_ID, vc.Account_ID, vc.M_Product_ID, vc.C_BPartner_ID,
+ vc.AD_OrgTrx_ID, vc.C_LocFrom_ID, vc.C_LocTo_ID, vc.C_SalesRegion_ID,
+ vc.C_Project_ID, vc.C_Campaign_ID, vc.User1_ID, vc.User2_ID,
+ vc.IsFullyQualified, vc.C_Activity_ID
+FROM GL_JournalLine gl, C_ValidCombination vc
+WHERE gl.C_ValidCombination_ID = vc.C_ValidCombination_ID;
+
+
+
diff --git a/db/ddlutils/views/M_INOUTCONFIRM_V.sql b/db/ddlutils/views/M_INOUTCONFIRM_V.sql
new file mode 100644
index 0000000000..59a0c50682
--- /dev/null
+++ b/db/ddlutils/views/M_INOUTCONFIRM_V.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW M_INOUTCONFIRM_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUTCONFIRM_ID, DOCUMENTNO,
+ CONFIRMTYPE, ISAPPROVED, ISCANCELLED, DESCRIPTION, M_INOUT_ID,
+ SHIPDESCRIPTION, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID, SALESREP_ID,
+ C_DOCTYPE_ID, DOCUMENTTYPE, C_ORDER_ID, DATEORDERED, MOVEMENTDATE,
+ MOVEMENTTYPE, M_WAREHOUSE_ID, POREFERENCE, DELIVERYRULE, FREIGHTCOSTRULE,
+ DELIVERYVIARULE, M_SHIPPER_ID, PRIORITYRULE, PROCESSED)
+AS
+SELECT ioc.AD_Client_ID, ioc.AD_Org_ID, ioc.IsActive, ioc.Created, ioc.CreatedBy, ioc.Updated, ioc.UpdatedBy,
+ 'en_US' AS AD_Language,
+ ioc.M_InOutConfirm_ID,
+ ioc.DocumentNo, ioc.ConfirmType,
+ ioc.IsApproved, ioc.IsCancelled, ioc.Description,
+ --
+ io.M_InOut_ID, io.Description AS ShipDescription,
+ io.C_BPartner_ID, io.C_BPartner_Location_ID, io.AD_User_ID,
+ io.SalesRep_ID, io.C_DocType_ID, dt.PrintName AS DocumentType,
+ io.C_Order_ID, io.DateOrdered, io.MovementDate, io.MovementType,
+ io.M_Warehouse_ID, io.POReference,
+ io.DeliveryRule, io.FreightCostRule,
+ io.DeliveryViaRule, io.M_Shipper_ID, PriorityRule,
+ ioc.Processed
+FROM M_InOutConfirm ioc
+ INNER JOIN M_InOut io ON (ioc.M_InOut_ID=io.M_InOut_ID)
+ INNER JOIN C_DocType dt ON (io.C_DocType_ID=dt.C_DocType_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUTCONFIRM_VT.sql b/db/ddlutils/views/M_INOUTCONFIRM_VT.sql
new file mode 100644
index 0000000000..7cb32029ce
--- /dev/null
+++ b/db/ddlutils/views/M_INOUTCONFIRM_VT.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW M_INOUTCONFIRM_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUTCONFIRM_ID, DOCUMENTNO,
+ CONFIRMTYPE, ISAPPROVED, ISCANCELLED, DESCRIPTION, M_INOUT_ID,
+ SHIPDESCRIPTION, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID, SALESREP_ID,
+ C_DOCTYPE_ID, DOCUMENTTYPE, C_ORDER_ID, DATEORDERED, MOVEMENTDATE,
+ MOVEMENTTYPE, M_WAREHOUSE_ID, POREFERENCE, DELIVERYRULE, FREIGHTCOSTRULE,
+ DELIVERYVIARULE, M_SHIPPER_ID, PRIORITYRULE, PROCESSED)
+AS
+SELECT ioc.AD_Client_ID, ioc.AD_Org_ID, ioc.IsActive, ioc.Created, ioc.CreatedBy, ioc.Updated, ioc.UpdatedBy,
+ dt.AD_Language,
+ ioc.M_InOutConfirm_ID,
+ ioc.DocumentNo, ioc.ConfirmType,
+ ioc.IsApproved, ioc.IsCancelled, ioc.Description,
+ --
+ io.M_InOut_ID, io.Description AS ShipDescription,
+ io.C_BPartner_ID, io.C_BPartner_Location_ID, io.AD_User_ID,
+ io.SalesRep_ID, io.C_DocType_ID, dt.PrintName AS DocumentType,
+ io.C_Order_ID, io.DateOrdered, io.MovementDate, io.MovementType,
+ io.M_Warehouse_ID, io.POReference,
+ io.DeliveryRule, io.FreightCostRule,
+ io.DeliveryViaRule, io.M_Shipper_ID, PriorityRule,
+ ioc.Processed
+FROM M_InOutConfirm ioc
+ INNER JOIN M_InOut io ON (ioc.M_InOut_ID=io.M_InOut_ID)
+ INNER JOIN C_DocType_Trl dt ON (io.C_DocType_ID=dt.C_DocType_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUTLINEMA_V.sql b/db/ddlutils/views/M_INOUTLINEMA_V.sql
new file mode 100644
index 0000000000..34363d1c30
--- /dev/null
+++ b/db/ddlutils/views/M_INOUTLINEMA_V.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW M_INOUTLINEMA_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_INOUT_ID, M_INOUTLINE_ID, LINE,
+ M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID, MOVEMENTQTY, M_LOCATOR_ID)
+AS
+SELECT m.AD_Client_ID, m.AD_Org_ID, m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
+ l.M_InOut_ID, m.M_InOutLine_ID, l.Line, l.M_Product_ID,
+ m.M_AttributeSetInstance_ID, m.MovementQty, l.M_Locator_ID
+FROM M_InOutLineMA m INNER JOIN M_InOutLine l ON (m.M_InOutLine_ID=l.M_InOutLine_ID)
+UNION
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ M_InOut_ID, M_InOutLine_ID, Line, M_Product_ID,
+ M_AttributeSetInstance_ID, MovementQty, M_Locator_ID
+FROM M_InOutLine;
+
+
+
diff --git a/db/ddlutils/views/M_INOUTLINEMA_VT.sql b/db/ddlutils/views/M_INOUTLINEMA_VT.sql
new file mode 100644
index 0000000000..d2489bedf0
--- /dev/null
+++ b/db/ddlutils/views/M_INOUTLINEMA_VT.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW M_INOUTLINEMA_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_INOUT_ID, M_INOUTLINE_ID, LINE,
+ M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID, MOVEMENTQTY, M_LOCATOR_ID)
+AS
+SELECT m.AD_Client_ID, m.AD_Org_ID, m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
+ l.M_InOut_ID, m.M_InOutLine_ID, l.Line, l.M_Product_ID,
+ m.M_AttributeSetInstance_ID, m.MovementQty, l.M_Locator_ID
+FROM M_InOutLineMA m INNER JOIN M_InOutLine l ON (m.M_InOutLine_ID=l.M_InOutLine_ID)
+UNION
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ M_InOut_ID, M_InOutLine_ID, Line, M_Product_ID,
+ M_AttributeSetInstance_ID, MovementQty, M_Locator_ID
+FROM M_InOutLine;
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_CANDIDATE_V.sql b/db/ddlutils/views/M_INOUT_CANDIDATE_V.sql
new file mode 100644
index 0000000000..501c6d4a50
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_CANDIDATE_V.sql
@@ -0,0 +1,37 @@
+CREATE OR REPLACE VIEW M_INOUT_CANDIDATE_V
+(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, C_ORDER_ID, DOCUMENTNO,
+ DATEORDERED, C_DOCTYPE_ID, POREFERENCE, DESCRIPTION, SALESREP_ID,
+ M_WAREHOUSE_ID, TOTALLINES)
+AS
+SELECT
+ o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
+ o.DocumentNo, o.DateOrdered, o.C_DocType_ID,
+ o.POReference, o.Description, o.SalesRep_ID,
+ l.M_Warehouse_ID,
+ SUM((l.QtyOrdered-l.QtyDelivered)*l.PriceActual) AS TotalLines
+FROM C_Order o
+ INNER JOIN C_OrderLine l ON (o.C_Order_ID=l.C_Order_ID)
+WHERE (o.DocStatus = 'CO' AND o.IsDelivered='N') -- Status must be CO - not CL/RE
+ -- not Offers and open Walkin-Receipts
+ AND o.C_DocType_ID IN (SELECT C_DocType_ID FROM C_DocType
+ WHERE DocBaseType='SOO' AND DocSubTypeSO NOT IN ('ON','OB','WR'))
+ -- Delivery Rule - not manual
+ AND o.DeliveryRule<>'M'
+ AND (l.M_Product_ID IS NULL OR EXISTS
+ (SELECT * FROM M_Product p
+ WHERE l.M_Product_ID=p.M_Product_ID AND p.IsExcludeAutoDelivery='N'))
+ -- we need to ship
+ AND l.QtyOrdered <> l.QtyDelivered
+ AND o.IsDropShip='N'
+ AND (l.M_Product_ID IS NOT NULL OR l.C_Charge_ID IS NOT NULL)
+ -- Not confirmed shipment
+ AND NOT EXISTS (SELECT * FROM M_InOutLine iol
+ INNER JOIN M_InOut io ON (iol.M_InOut_ID=io.M_InOut_ID)
+ WHERE iol.C_OrderLine_ID=l.C_OrderLine_ID AND io.DocStatus IN ('IP','WC'))
+ --
+GROUP BY o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
+ o.DocumentNo, o.DateOrdered, o.C_DocType_ID,
+ o.POReference, o.Description, o.SalesRep_ID, l.M_Warehouse_ID;
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_HEADER_V.sql b/db/ddlutils/views/M_INOUT_HEADER_V.sql
new file mode 100644
index 0000000000..9607aa8d04
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_HEADER_V.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW M_INOUT_HEADER_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUT_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID,
+ MOVEMENTDATE, MOVEMENTTYPE, BPGREETING, NAME, NAME2,
+ BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME, C_LOCATION_ID,
+ POSTAL, REFERENCENO, DESCRIPTION, POREFERENCE, DATEORDERED,
+ VOLUME, WEIGHT, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE,
+ PRIORITYRULE)
+AS
+SELECT io.AD_Client_ID, io.AD_Org_ID, io.IsActive, io.Created, io.CreatedBy, io.Updated, io.UpdatedBy,
+ 'en_US' AS AD_Language,
+ io.M_InOut_ID, io.IsSOTrx, io.DocumentNo, io.DocStatus, io.C_DocType_ID,
+ io.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ io.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ io.C_Order_ID,
+ io.MovementDate, io.MovementType,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title, bpc.Phone,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
+ bp.ReferenceNo,
+ io.Description,
+ io.POReference,
+ io.DateOrdered, io.Volume, io.Weight,
+ io.M_Shipper_ID, io.DeliveryRule, io.DeliveryViaRule, io.PriorityRule
+FROM M_InOut io
+ INNER JOIN C_DocType dt ON (io.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN C_BPartner bp ON (io.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID)
+ INNER JOIN C_BPartner_Location bpl ON (io.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (io.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
+ INNER JOIN AD_OrgInfo oi ON (io.AD_Org_ID=oi.AD_Org_ID)
+ INNER JOIN M_Warehouse wh ON (io.M_Warehouse_ID=wh.M_Warehouse_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_HEADER_VT.sql b/db/ddlutils/views/M_INOUT_HEADER_VT.sql
new file mode 100644
index 0000000000..c34d7a02bb
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_HEADER_VT.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW M_INOUT_HEADER_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUT_ID, ISSOTRX,
+ DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
+ BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
+ M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID,
+ PHONE, MOVEMENTDATE, MOVEMENTTYPE, BPGREETING, NAME,
+ NAME2, BPCONTACTGREETING, TITLE, CONTACTNAME, C_LOCATION_ID,
+ POSTAL, REFERENCENO, DESCRIPTION, POREFERENCE, DATEORDERED,
+ VOLUME, WEIGHT, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE,
+ PRIORITYRULE)
+AS
+SELECT io.AD_Client_ID, io.AD_Org_ID, io.IsActive, io.Created, io.CreatedBy, io.Updated, io.UpdatedBy,
+ dt.AD_Language,
+ io.M_InOut_ID, io.IsSOTrx, io.DocumentNo, io.DocStatus, io.C_DocType_ID,
+ io.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
+ oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
+ io.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
+ dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
+ io.C_Order_ID, bpc.Phone,
+ io.MovementDate, io.MovementType,
+ bpg.Greeting AS BPGreeting,
+ bp.Name, bp.Name2,
+ bpcg.Greeting AS BPContactGreeting,
+ bpc.Title,
+ NULLIF (bpc.Name, bp.Name) AS ContactName,
+ bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
+ bp.ReferenceNo,
+ io.Description,
+ io.POReference,
+ io.DateOrdered, io.Volume, io.Weight,
+ io.M_Shipper_ID, io.DeliveryRule, io.DeliveryViaRule, io.PriorityRule
+FROM M_InOut io
+ INNER JOIN C_DocType_Trl dt ON (io.C_DocType_ID=dt.C_DocType_ID)
+ INNER JOIN C_BPartner bp ON (io.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID AND dt.AD_Language=bpg.AD_Language)
+ INNER JOIN C_BPartner_Location bpl ON (io.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
+ LEFT OUTER JOIN AD_User bpc ON (io.AD_User_ID=bpc.AD_User_ID)
+ LEFT OUTER JOIN C_Greeting_Trl bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID AND dt.AD_Language=bpcg.AD_Language)
+ INNER JOIN AD_OrgInfo oi ON (io.AD_Org_ID=oi.AD_Org_ID)
+ INNER JOIN M_Warehouse wh ON (io.M_Warehouse_ID=wh.M_Warehouse_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_LINECONFIRM_V.sql b/db/ddlutils/views/M_INOUT_LINECONFIRM_V.sql
new file mode 100644
index 0000000000..74d3789c17
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_LINECONFIRM_V.sql
@@ -0,0 +1,34 @@
+CREATE OR REPLACE VIEW M_INOUT_LINECONFIRM_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUTLINECONFIRM_ID, M_INOUTCONFIRM_ID,
+ TARGETQTY, CONFIRMEDQTY, DIFFERENCEQTY, SCRAPPEDQTY, DESCRIPTION,
+ PROCESSED, M_INOUT_ID, M_INOUTLINE_ID, LINE, M_PRODUCT_ID,
+ MOVEMENTQTY, UOMSYMBOL, QTYBACKORDERED, NAME, SHIPDESCRIPTION,
+ DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE, M_LOCATOR_ID,
+ M_WAREHOUSE_ID, X, Y, Z, M_ATTRIBUTESETINSTANCE_ID,
+ M_ATTRIBUTESET_ID, SERNO, LOT, M_LOT_ID, GUARANTEEDATE)
+AS
+SELECT iolc.AD_Client_ID, iolc.AD_Org_ID, iolc.IsActive, iolc.Created, iolc.CreatedBy, iolc.Updated, iolc.UpdatedBy,
+ 'en_US' AS AD_Language,
+ iolc.M_InOutLineConfirm_ID, iolc.M_InOutConfirm_ID,
+ iolc.TargetQty, iolc.ConfirmedQty, iolc.DifferenceQty, iolc.ScrappedQty,
+ iolc.Description, iolc.Processed,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line, p.M_Product_ID,
+ iol.MovementQty, uom.UOMSymbol, ol.QtyOrdered-ol.QtyDelivered AS QtyBackOrdered,
+ COALESCE(p.Name, iol.Description) AS Name, -- main line
+ CASE WHEN p.Name IS NOT NULL THEN iol.Description END AS ShipDescription, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate
+FROM M_InOutLineConfirm iolc
+ INNER JOIN M_InOutLine iol ON (iolc.M_InOutLine_ID=iol.M_InOutLine_ID)
+ INNER JOIN C_UOM uom ON (iol.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_Product p ON (iol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID)
+ LEFT OUTER JOIN C_OrderLine ol ON (iol.C_OrderLine_ID=ol.C_OrderLine_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_LINECONFIRM_VT.sql b/db/ddlutils/views/M_INOUT_LINECONFIRM_VT.sql
new file mode 100644
index 0000000000..e1b0060784
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_LINECONFIRM_VT.sql
@@ -0,0 +1,35 @@
+CREATE OR REPLACE VIEW M_INOUT_LINECONFIRM_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUTLINECONFIRM_ID, M_INOUTCONFIRM_ID,
+ TARGETQTY, CONFIRMEDQTY, DIFFERENCEQTY, SCRAPPEDQTY, DESCRIPTION,
+ PROCESSED, M_INOUT_ID, M_INOUTLINE_ID, LINE, M_PRODUCT_ID,
+ MOVEMENTQTY, UOMSYMBOL, QTYBACKORDERED, NAME, SHIPDESCRIPTION,
+ DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE, M_LOCATOR_ID,
+ M_WAREHOUSE_ID, X, Y, Z, M_ATTRIBUTESETINSTANCE_ID,
+ M_ATTRIBUTESET_ID, SERNO, LOT, M_LOT_ID, GUARANTEEDATE)
+AS
+SELECT iolc.AD_Client_ID, iolc.AD_Org_ID, iolc.IsActive, iolc.Created, iolc.CreatedBy, iolc.Updated, iolc.UpdatedBy,
+ uom.AD_Language,
+ iolc.M_InOutLineConfirm_ID, iolc.M_InOutConfirm_ID,
+ iolc.TargetQty, iolc.ConfirmedQty, iolc.DifferenceQty, iolc.ScrappedQty,
+ iolc.Description, iolc.Processed,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line, p.M_Product_ID,
+ iol.MovementQty, uom.UOMSymbol, ol.QtyOrdered-ol.QtyDelivered AS QtyBackOrdered,
+ COALESCE(COALESCE(pt.Name,p.Name), iol.Description) AS Name, -- main line
+ CASE WHEN COALESCE(pt.Name,p.Name) IS NOT NULL THEN iol.Description END AS ShipDescription, -- second line
+ COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate
+FROM M_InOutLineConfirm iolc
+ INNER JOIN M_InOutLine iol ON (iolc.M_InOutLine_ID=iol.M_InOutLine_ID)
+ INNER JOIN C_UOM_Trl uom ON (iol.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_Product p ON (iol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_Product_Trl pt ON (iol.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID)
+ LEFT OUTER JOIN C_OrderLine ol ON (iol.C_OrderLine_ID=ol.C_OrderLine_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_LINE_V.sql b/db/ddlutils/views/M_INOUT_LINE_V.sql
new file mode 100644
index 0000000000..f17173e114
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_LINE_V.sql
@@ -0,0 +1,61 @@
+CREATE OR REPLACE VIEW M_INOUT_LINE_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUT_ID, M_INOUTLINE_ID,
+ LINE, M_PRODUCT_ID, MOVEMENTQTY, QTYENTERED, UOMSYMBOL,
+ QTYORDERED, QTYDELIVERED, QTYBACKORDERED, NAME, DESCRIPTION,
+ DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE, M_LOCATOR_ID,
+ M_WAREHOUSE_ID, X, Y, Z, M_ATTRIBUTESETINSTANCE_ID,
+ M_ATTRIBUTESET_ID, SERNO, LOT, M_LOT_ID, GUARANTEEDATE,
+ PRODUCTDESCRIPTION, IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID,
+ C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
+AS
+SELECT iol.AD_Client_ID, iol.AD_Org_ID, iol.IsActive, iol.Created, iol.CreatedBy, iol.Updated, iol.UpdatedBy,
+ 'en_US' AS AD_Language,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line, p.M_Product_ID,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN iol.MovementQty END AS MovementQty,
+ CASE WHEN iol.QtyEntered<>0 OR iol.M_Product_ID IS NOT NULL THEN iol.QtyEntered END AS QtyEntered,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ ol.QtyOrdered, ol.QtyDelivered,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered-ol.QtyDelivered END AS QtyBackOrdered,
+ COALESCE(p.Name||productAttribute(iol.M_AttributeSetInstance_ID), c.Name, iol.Description) AS Name, -- main line
+ CASE WHEN COALESCE(c.Name,p.Name) IS NOT NULL THEN iol.Description END AS Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ p.Description AS ProductDescription, p.ImageURL,
+ iol.C_Campaign_ID, iol.C_Project_ID, iol.C_Activity_ID, iol.C_ProjectPhase_ID, iol.C_ProjectTask_ID
+FROM M_InOutLine iol
+ INNER JOIN C_UOM uom ON (iol.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_Product p ON (iol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID)
+ LEFT OUTER JOIN C_OrderLine ol ON (iol.C_OrderLine_ID=ol.C_OrderLine_ID)
+ LEFT OUTER JOIN C_Charge c ON (iol.C_Charge_ID=c.C_Charge_ID)
+UNION -- BOM lines
+SELECT iol.AD_Client_ID, iol.AD_Org_ID, iol.IsActive, iol.Created, iol.CreatedBy, iol.Updated, iol.UpdatedBy,
+ 'en_US' AS AD_Language,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ iol.MovementQty*b.BOMQty AS QtyInvoiced, iol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
+ null, null, null,
+ p.Name, -- main line
+ b.Description, -- second line
+ p.DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ p.Description AS ProductDescription, p.ImageURL,
+ iol.C_Campaign_ID, iol.C_Project_ID, iol.C_Activity_ID, iol.C_ProjectPhase_ID, iol.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN M_InOutLine iol ON (b.M_Product_ID=iol.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=iol.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsPickListPrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID);
+
+
+
diff --git a/db/ddlutils/views/M_INOUT_LINE_VT.sql b/db/ddlutils/views/M_INOUT_LINE_VT.sql
new file mode 100644
index 0000000000..672c7e89d5
--- /dev/null
+++ b/db/ddlutils/views/M_INOUT_LINE_VT.sql
@@ -0,0 +1,63 @@
+CREATE OR REPLACE VIEW M_INOUT_LINE_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_LANGUAGE, M_INOUT_ID, M_INOUTLINE_ID,
+ LINE, M_PRODUCT_ID, MOVEMENTQTY, QTYENTERED, UOMSYMBOL,
+ QTYORDERED, QTYDELIVERED, QTYBACKORDERED, NAME, DESCRIPTION,
+ DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE, M_LOCATOR_ID,
+ M_WAREHOUSE_ID, X, Y, Z, M_ATTRIBUTESETINSTANCE_ID,
+ M_ATTRIBUTESET_ID, SERNO, LOT, M_LOT_ID, GUARANTEEDATE,
+ PRODUCTDESCRIPTION, IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID,
+ C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
+AS
+SELECT iol.AD_Client_ID, iol.AD_Org_ID, iol.IsActive, iol.Created, iol.CreatedBy, iol.Updated, iol.UpdatedBy,
+ uom.AD_Language,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line, p.M_Product_ID,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN iol.MovementQty END AS MovementQty,
+ CASE WHEN iol.QtyEntered<>0 OR iol.M_Product_ID IS NOT NULL THEN iol.QtyEntered END AS QtyEntered,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
+ ol.QtyOrdered, ol.QtyDelivered,
+ CASE WHEN iol.MovementQty<>0 OR iol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered-ol.QtyDelivered END AS QtyBackOrdered,
+ COALESCE(COALESCE(pt.Name,p.Name)||productAttribute(iol.M_AttributeSetInstance_ID), c.Name, iol.Description) AS Name, -- main line
+ CASE WHEN COALESCE(pt.Name,p.Name,c.Name) IS NOT NULL THEN iol.Description END AS Description, -- second line
+ COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ pt.Description AS ProductDescription, p.ImageURL,
+ iol.C_Campaign_ID, iol.C_Project_ID, iol.C_Activity_ID, iol.C_ProjectPhase_ID, iol.C_ProjectTask_ID
+FROM M_InOutLine iol
+ INNER JOIN C_UOM_Trl uom ON (iol.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_Product p ON (iol.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_Product_Trl pt ON (iol.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID)
+ LEFT OUTER JOIN C_OrderLine ol ON (iol.C_OrderLine_ID=ol.C_OrderLine_ID)
+ LEFT OUTER JOIN C_Charge c ON (iol.C_Charge_ID=c.C_Charge_ID)
+UNION
+SELECT iol.AD_Client_ID, iol.AD_Org_ID, iol.IsActive, iol.Created, iol.CreatedBy, iol.Updated, iol.UpdatedBy,
+ uom.AD_Language,
+ iol.M_InOut_ID, iol.M_InOutLine_ID,
+ iol.Line+(b.Line/100) AS Line, p.M_Product_ID,
+ iol.MovementQty*b.BOMQty AS QtyInvoiced, iol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
+ null, null, null,
+ COALESCE (pt.Name, p.Name) AS Name, -- main line
+ b.Description, -- second line
+ COALESCE (pt.DocumentNote, p.DocumentNote) AS DocumentNote, -- third line
+ p.UPC, p.SKU, p.Value AS ProductValue,
+ iol.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ iol.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ pt.Description AS ProductDescription, p.ImageURL,
+ iol.C_Campaign_ID, iol.C_Project_ID, iol.C_Activity_ID, iol.C_ProjectPhase_ID, iol.C_ProjectTask_ID
+FROM M_Product_BOM b -- BOM lines
+ INNER JOIN M_InOutLine iol ON (b.M_Product_ID=iol.M_Product_ID)
+ INNER JOIN M_Product bp ON (bp.M_Product_ID=iol.M_Product_ID -- BOM Product
+ AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsPickListPrintDetails='Y')
+ INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
+ INNER JOIN C_UOM_Trl uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ INNER JOIN M_Product_Trl pt ON (iol.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (iol.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_Locator l ON (iol.M_Locator_ID=l.M_Locator_ID);
+
+
+
diff --git a/db/ddlutils/views/M_MOVEMENTLINEMA_V.sql b/db/ddlutils/views/M_MOVEMENTLINEMA_V.sql
new file mode 100644
index 0000000000..bcb84e3996
--- /dev/null
+++ b/db/ddlutils/views/M_MOVEMENTLINEMA_V.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW M_MOVEMENTLINEMA_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_MOVEMENT_ID, M_MOVEMENTLINE_ID, LINE,
+ M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID, MOVEMENTQTY, M_LOCATOR_ID, M_LOCATORTO_ID)
+AS
+SELECT m.AD_Client_ID, m.AD_Org_ID, m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
+ l.M_Movement_ID, m.M_MovementLine_ID, l.Line, l.M_Product_ID,
+ m.M_AttributeSetInstance_ID, m.MovementQty, l.M_Locator_ID, l.M_LocatorTo_ID
+FROM M_MovementLineMA m INNER JOIN M_MovementLine l ON (m.M_MovementLine_ID=l.M_MovementLine_ID)
+UNION
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ M_Movement_ID, M_MovementLine_ID, Line, M_Product_ID,
+ M_AttributeSetInstance_ID, MovementQty, M_Locator_ID, M_LocatorTo_ID
+FROM M_MovementLine;
+
+
+
diff --git a/db/ddlutils/views/M_MOVEMENTLINEMA_VT.sql b/db/ddlutils/views/M_MOVEMENTLINEMA_VT.sql
new file mode 100644
index 0000000000..52e25d9825
--- /dev/null
+++ b/db/ddlutils/views/M_MOVEMENTLINEMA_VT.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW M_MOVEMENTLINEMA_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_MOVEMENT_ID, M_MOVEMENTLINE_ID, LINE,
+ M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID, MOVEMENTQTY, M_LOCATOR_ID, M_LOCATORTO_ID)
+AS
+SELECT m.AD_Client_ID, m.AD_Org_ID, m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
+ l.M_Movement_ID, m.M_MovementLine_ID, l.Line, l.M_Product_ID,
+ m.M_AttributeSetInstance_ID, m.MovementQty, l.M_Locator_ID, l.M_LocatorTo_ID
+FROM M_MovementLineMA m INNER JOIN M_MovementLine l ON (m.M_MovementLine_ID=l.M_MovementLine_ID)
+UNION
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ M_Movement_ID, M_MovementLine_ID, Line, M_Product_ID,
+ M_AttributeSetInstance_ID, MovementQty, M_Locator_ID, M_LocatorTo_ID
+FROM M_MovementLine;
+
+
+
diff --git a/db/ddlutils/views/M_TRANSACTION_V.sql b/db/ddlutils/views/M_TRANSACTION_V.sql
new file mode 100644
index 0000000000..18d8de6960
--- /dev/null
+++ b/db/ddlutils/views/M_TRANSACTION_V.sql
@@ -0,0 +1,26 @@
+CREATE OR REPLACE VIEW M_TRANSACTION_V
+(M_TRANSACTION_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, MOVEMENTTYPE, M_LOCATOR_ID,
+ M_PRODUCT_ID, MOVEMENTDATE, MOVEMENTQTY, M_INVENTORYLINE_ID, M_INVENTORY_ID,
+ M_MOVEMENTLINE_ID, M_MOVEMENT_ID, M_INOUTLINE_ID, M_INOUT_ID, M_PRODUCTIONLINE_ID,
+ M_PRODUCTION_ID, C_PROJECTISSUE_ID, C_PROJECT_ID, M_ATTRIBUTESETINSTANCE_ID)
+AS
+SELECT M_Transaction_ID,
+ t.AD_Client_ID, t.AD_Org_ID, t.IsActive, t.Created,t.CreatedBy, t.Updated,t.UpdatedBy,
+ t.MovementType, t.M_Locator_ID, t.M_Product_ID, t.MovementDate, t.MovementQty,
+ t.M_InventoryLine_ID, i.M_Inventory_ID,
+ t.M_MovementLine_ID, m.M_Movement_ID,
+ t.M_InOutLine_ID, io.M_InOut_ID,
+ t.M_ProductionLine_ID, pp.M_Production_ID,
+ t.C_ProjectIssue_ID, pi.C_Project_ID,
+ t.M_AttributeSetInstance_ID
+FROM M_Transaction t
+ LEFT OUTER JOIN M_InOutLine io ON (t.M_InOutLine_ID=io.M_InOutLine_ID AND t.M_AttributeSetInstance_ID=io.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_MovementLine m ON (t.M_MovementLine_ID=m.M_MovementLine_ID AND t.M_AttributeSetInstance_ID=m.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_InventoryLine i ON (t.M_InventoryLine_ID=i.M_InventoryLine_ID AND t.M_AttributeSetInstance_ID=i.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN C_ProjectIssue pi ON (t.C_ProjectIssue_ID=pi.C_ProjectIssue_ID AND t.M_AttributeSetInstance_ID=pi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_ProductionLine pl ON (t.M_ProductionLine_ID=pl.M_ProductionLine_ID AND t.M_AttributeSetInstance_ID=pl.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_ProductionPlan pp ON (pl.M_ProductionPlan_ID=pp.M_ProductionPlan_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_ALLOCATION.sql b/db/ddlutils/views/RV_ALLOCATION.sql
new file mode 100644
index 0000000000..d81f630e0a
--- /dev/null
+++ b/db/ddlutils/views/RV_ALLOCATION.sql
@@ -0,0 +1,20 @@
+CREATE OR REPLACE VIEW RV_ALLOCATION
+(C_ALLOCATIONHDR_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, DESCRIPTION,
+ DATETRX, DATEACCT, C_CURRENCY_ID, APPROVALAMT, ISMANUAL,
+ DOCSTATUS, DOCACTION, PROCESSED, C_ALLOCATIONLINE_ID, C_INVOICE_ID,
+ C_BPARTNER_ID, C_ORDER_ID, C_PAYMENT_ID, C_CASHLINE_ID, AMOUNT,
+ DISCOUNTAMT, WRITEOFFAMT, OVERUNDERAMT)
+AS
+SELECT h.C_AllocationHdr_ID, h.AD_Client_ID, h.AD_Org_ID,
+ h.IsActive, h.Created, h.CreatedBy, h.Updated, h.UpdatedBy,
+ h.DocumentNo, h.Description, h.DateTrx, h.DateAcct,
+ h.C_Currency_ID, h.ApprovalAmt, h.IsManual, h.DocStatus, h.DocAction, h.Processed,
+ l.C_AllocationLine_ID,
+ l.C_Invoice_ID, l.C_BPartner_ID, l.C_Order_ID, l.C_Payment_ID, l.C_CashLine_ID,
+ l.Amount, l.DiscountAmt, l.WriteOffAmt, l.OverUnderAmt
+FROM C_AllocationHdr h
+ INNER JOIN C_AllocationLine l ON (h.C_AllocationHdr_ID=l.C_AllocationHdr_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_ASSET_CUSTOMER.sql b/db/ddlutils/views/RV_ASSET_CUSTOMER.sql
new file mode 100644
index 0000000000..d4741ed942
--- /dev/null
+++ b/db/ddlutils/views/RV_ASSET_CUSTOMER.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW RV_ASSET_CUSTOMER
+(A_ASSET_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, VALUE, NAME,
+ DESCRIPTION, HELP, A_ASSET_GROUP_ID, M_PRODUCT_ID, SERNO,
+ LOT, VERSIONNO, GUARANTEEDATE, ASSETSERVICEDATE, C_BPARTNER_ID,
+ C_BPARTNER_LOCATION_ID, AD_USER_ID, DELIVERYCOUNT)
+AS
+SELECT A_Asset_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ Value, Name, Description, Help, A_Asset_Group_ID, M_Product_ID, SerNo, Lot, VersionNo,
+ GuaranteeDate, AssetServiceDate,
+ C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID,
+ (SELECT COUNT(*) FROM A_Asset_Delivery ad WHERE a.A_Asset_ID=ad.A_Asset_ID) AS DeliveryCount
+FROM A_Asset a
+WHERE C_BPartner_ID IS NOT NULL;
+
+
+
diff --git a/db/ddlutils/views/RV_ASSET_DELIVERY.sql b/db/ddlutils/views/RV_ASSET_DELIVERY.sql
new file mode 100644
index 0000000000..6a6f3a4b10
--- /dev/null
+++ b/db/ddlutils/views/RV_ASSET_DELIVERY.sql
@@ -0,0 +1,22 @@
+CREATE OR REPLACE VIEW RV_ASSET_DELIVERY
+(A_ASSET_DELIVERY_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, A_ASSET_ID, A_ASSET_GROUP_ID,
+ M_PRODUCT_ID, GUARANTEEDATE, ASSETSERVICEDATE, C_BPARTNER_ID, AD_USER_ID,
+ MOVEMENTDATE, SERNO, LOT, VERSIONNO, M_INOUTLINE_ID,
+ EMAIL, MESSAGEID, DELIVERYCONFIRMATION, URL, REMOTE_ADDR,
+ REMOTE_HOST, REFERRER, DESCRIPTION)
+AS
+SELECT ad.A_Asset_Delivery_ID, ad.AD_Client_ID, ad.AD_Org_ID, ad.IsActive, ad.Created, ad.CreatedBy, ad.Updated, ad.UpdatedBy,
+ a.A_Asset_ID, a.A_Asset_Group_ID, a.M_Product_ID,
+ a.GuaranteeDate, a.AssetServiceDate,
+ a.C_BPartner_ID, ad.AD_User_ID,
+ ad.MovementDate, ad.SerNo, ad.Lot, ad.VersionNo,
+ ad.M_InOutLine_ID,
+ ad.Email, ad.MessageID, ad.DeliveryConfirmation,
+ ad.URL, ad.Remote_Addr, ad.Remote_Host, ad.Referrer,
+ ad.Description
+FROM A_Asset_Delivery ad
+ INNER JOIN A_Asset a ON (a.A_Asset_ID=ad.A_Asset_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_ASSET_SUMMONTH.sql b/db/ddlutils/views/RV_ASSET_SUMMONTH.sql
new file mode 100644
index 0000000000..cd2dce6878
--- /dev/null
+++ b/db/ddlutils/views/RV_ASSET_SUMMONTH.sql
@@ -0,0 +1,25 @@
+CREATE OR REPLACE VIEW RV_ASSET_SUMMONTH
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, A_ASSET_ID, A_ASSET_GROUP_ID, M_PRODUCT_ID,
+ VALUE, NAME, DESCRIPTION, HELP, GUARANTEEDATE,
+ ASSETSERVICEDATE, C_BPARTNER_ID, AD_USER_ID, SERNO, LOT,
+ VERSIONNO, MOVEMENTDATE, DELIVERYCOUNT)
+AS
+SELECT a.AD_Client_ID, a.AD_Org_ID, a.IsActive, a.Created, a.CreatedBy, a.Updated, a.UpdatedBy,
+ a.A_Asset_ID, a.A_Asset_Group_ID, a.M_Product_ID,
+ a.Value, a.Name, a.Description, a.Help,
+ a.GuaranteeDate, a.AssetServiceDate,
+ a.C_BPartner_ID, a.AD_User_ID, a.SerNo, a.Lot, a.VersionNo,
+ firstOf(ad.MovementDate, 'MM') AS MovementDate,
+ COUNT(*) AS DeliveryCount
+FROM A_Asset a
+ INNER JOIN A_Asset_Delivery ad ON (a.A_Asset_ID=ad.A_Asset_ID)
+GROUP BY a.AD_Client_ID, a.AD_Org_ID, a.IsActive, a.Created, a.CreatedBy, a.Updated, a.UpdatedBy,
+ a.A_Asset_ID, a.A_Asset_Group_ID, a.M_Product_ID,
+ a.Value, a.Name, a.Description, a.Help,
+ a.GuaranteeDate, a.AssetServiceDate,
+ a.C_BPartner_ID, a.AD_User_ID, a.SerNo, a.Lot, a.VersionNo,
+ firstOf(ad.MovementDate, 'MM');
+
+
+
diff --git a/db/ddlutils/views/RV_BPARTNER.sql b/db/ddlutils/views/RV_BPARTNER.sql
new file mode 100644
index 0000000000..19720289aa
--- /dev/null
+++ b/db/ddlutils/views/RV_BPARTNER.sql
@@ -0,0 +1,59 @@
+CREATE OR REPLACE VIEW RV_BPARTNER
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_BPARTNER_ID, VALUE, NAME,
+ NAME2, DESCRIPTION, ISSUMMARY, C_BP_GROUP_ID, ISONETIME,
+ ISPROSPECT, ISVENDOR, ISCUSTOMER, ISEMPLOYEE, ISSALESREP,
+ REFERENCENO, DUNS, URL, AD_LANGUAGE, TAXID,
+ ISTAXEXEMPT, C_INVOICESCHEDULE_ID, RATING, SALESVOLUME, NUMBEREMPLOYEES,
+ NAICS, FIRSTSALE, ACQUSITIONCOST, POTENTIALLIFETIMEVALUE, ACTUALLIFETIMEVALUE,
+ SHAREOFCUSTOMER, PAYMENTRULE, SO_CREDITLIMIT, SO_CREDITUSED, SO_CREDITAVAILABLE,
+ C_PAYMENTTERM_ID, M_PRICELIST_ID, M_DISCOUNTSCHEMA_ID, C_DUNNING_ID, ISDISCOUNTPRINTED,
+ SO_DESCRIPTION, POREFERENCE, PAYMENTRULEPO, PO_PRICELIST_ID, PO_DISCOUNTSCHEMA_ID,
+ PO_PAYMENTTERM_ID, DOCUMENTCOPIES, C_GREETING_ID, INVOICERULE, DELIVERYRULE,
+ FREIGHTCOSTRULE, DELIVERYVIARULE, SALESREP_ID, SENDEMAIL, BPARTNER_PARENT_ID,
+ INVOICE_PRINTFORMAT_ID, SOCREDITSTATUS, SHELFLIFEMINPCT, AD_ORGBP_ID, FLATDISCOUNT,
+ TOTALOPENBALANCE, AD_USER_ID, CONTACTNAME, CONTACTDESCRIPTION, EMAIL,
+ SUPERVISOR_ID, EMAILUSER, BPCONTACTGREETING, TITLE, COMMENTS,
+ PHONE, PHONE2, FAX, LASTCONTACT, LASTRESULT,
+ BIRTHDAY, AD_ORGTRX_ID, EMAILVERIFY, LDAPUSER, EMAILVERIFYDATE,
+ NOTIFICATIONTYPE, C_BPARTNER_LOCATION_ID, POSTAL, CITY, ADDRESS1,
+ ADDRESS2, ADDRESS3, C_REGION_ID, REGIONNAME, C_COUNTRY_ID,
+ COUNTRYNAME)
+AS
+SELECT bp.AD_Client_ID, bp.AD_Org_ID,
+ bp.IsActive, bp.Created, bp.CreatedBy, bp.Updated, bp.UpdatedBy,
+ bp.C_BPartner_ID, bp.Value, bp.Name, bp.Name2, bp.Description, bp.IsSummary,
+ bp.C_BP_Group_ID, bp.IsOneTime, bp.IsProspect, bp.IsVendor, bp.IsCustomer, bp.IsEmployee, bp.IsSalesRep,
+ bp.ReferenceNo, bp.Duns, bp.URL, bp.AD_Language, bp.TaxID, bp.IsTaxExempt,
+ bp.C_InvoiceSchedule_ID, bp.Rating, bp.SalesVolume, bp.NumberEmployees, bp.NAICS,
+ bp.FirstSale, bp.AcqusitionCost, bp.PotentialLifeTimeValue, bp.ActualLifeTimeValue,
+ bp.ShareOfCustomer, bp.PaymentRule,
+ bp.SO_CreditLimit, bp.SO_CreditUsed, bp.SO_CreditUsed-bp.SO_CreditLimit AS SO_CreditAvailable,
+ bp.C_PaymentTerm_ID, bp.M_PriceList_ID, bp.M_DiscountSchema_ID, bp.C_Dunning_ID,
+ bp.IsDiscountPrinted, bp.SO_Description, bp.POReference, PaymentRulePO,
+ bp.PO_PriceList_ID, bp.PO_DiscountSchema_ID, bp.PO_PaymentTerm_ID,
+ bp.DocumentCopies, bp.C_Greeting_ID, bp.InvoiceRule, bp.DeliveryRule,
+ bp.FreightCostRule, bp.DeliveryViaRule, bp.SalesRep_ID,
+ bp.SendEMail, bp.BPartner_Parent_ID, bp.Invoice_PrintFormat_ID,
+ bp.SOCreditStatus, bp.ShelfLifeMinPct, bp.AD_OrgBP_ID,
+ bp.FlatDiscount, bp.TotalOpenBalance,
+ -- Contact
+ c.AD_User_ID, c.Name AS ContactName, c.Description AS ContactDescription,
+ c.EMail, c.Supervisor_ID,
+ c.EMailUser, c.C_Greeting_ID AS BPContactGreeting,
+ c.Title, c.Comments, c.Phone, c.Phone2, c.Fax,
+ c.LastContact, c.LastResult, c.BirthDay, c.AD_OrgTrx_ID,
+ c.EMailVerify, c.LDAPUser, c.EMailVerifyDate, c.NotificationType,
+ -- Location
+ l.C_BPartner_Location_ID, a.Postal, a.City, a.Address1, a.Address2, a.Address3,
+ a.C_Region_ID, COALESCE(r.Name,a.RegionName) AS RegionName,
+ a.C_Country_ID, cc.Name AS CountryName
+FROM C_BPartner bp
+ LEFT OUTER JOIN C_BPartner_Location l ON (bp.C_BPartner_ID=l.C_BPartner_ID AND l.IsActive='Y')
+ LEFT OUTER JOIN AD_User c ON (bp.C_BPartner_ID=c.C_BPartner_ID AND (c.C_BPartner_Location_ID IS NULL OR c.C_BPartner_Location_ID=l.C_BPartner_Location_ID) AND c.IsActive='Y')
+ LEFT OUTER JOIN C_Location a ON (l.C_Location_ID=a.C_Location_ID)
+ LEFT OUTER JOIN C_Region r ON (a.C_Region_ID=r.C_Region_ID)
+ INNER JOIN C_Country cc ON (a.C_Country_ID=cc.C_Country_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_BPARTNEROPEN.sql b/db/ddlutils/views/RV_BPARTNEROPEN.sql
new file mode 100644
index 0000000000..5a8f04d326
--- /dev/null
+++ b/db/ddlutils/views/RV_BPARTNEROPEN.sql
@@ -0,0 +1,31 @@
+CREATE OR REPLACE VIEW RV_BPARTNEROPEN
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_BPARTNER_ID, C_CURRENCY_ID, AMT,
+ OPENAMT, DATEDOC, DAYSDUE, C_CAMPAIGN_ID, C_PROJECT_ID,
+ C_ACTIVITY_ID)
+AS
+SELECT i.AD_Client_ID,i.AD_Org_ID, i.IsActive, i.Created,i.CreatedBy,i.Updated,i.UpdatedBy,
+ i.C_BPartner_ID, i.C_Currency_ID,
+ i.GrandTotal*i.MultiplierAP AS Amt,
+ invoiceOpen (i.C_Invoice_ID, i.C_InvoicePaySchedule_ID)*MultiplierAP AS OpenAmt,
+ i.DateInvoiced AS DateDoc,
+ COALESCE(daysBetween(getdate(),ips.DueDate), paymentTermDueDays(C_PaymentTerm_ID,DateInvoiced,getdate())) AS DaysDue,
+ i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
+FROM C_Invoice_v i
+ LEFT OUTER JOIN C_InvoicePaySchedule ips ON (i.C_InvoicePaySchedule_ID=ips.C_InvoicePaySchedule_ID)
+WHERE IsPaid='N'
+ AND DocStatus IN ('CO','CL')
+UNION
+SELECT p.AD_Client_ID,p.AD_Org_ID, p.IsActive, p.Created,p.CreatedBy,p.Updated,p.UpdatedBy,
+ p.C_BPartner_ID, p.C_Currency_ID,
+ p.PayAmt*MultiplierAP*-1 AS Amt,
+ paymentAvailable(p.C_Payment_ID)*p.MultiplierAP*-1 AS OpenAmt,
+ p.DateTrx AS DateDoc,
+ null,
+ p.C_Campaign_ID, p.C_Project_ID, p.C_Activity_ID
+FROM C_Payment_v p
+WHERE p.IsAllocated='N' AND p.C_BPartner_ID IS NOT NULL
+ AND p.DocStatus IN ('CO','CL');
+
+
+
diff --git a/db/ddlutils/views/RV_CASH_DETAIL.sql b/db/ddlutils/views/RV_CASH_DETAIL.sql
new file mode 100644
index 0000000000..2ea507b6b0
--- /dev/null
+++ b/db/ddlutils/views/RV_CASH_DETAIL.sql
@@ -0,0 +1,19 @@
+CREATE OR REPLACE VIEW RV_CASH_DETAIL
+(C_CASH_ID, C_CASHLINE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
+ CREATED, CREATEDBY, UPDATED, UPDATEDBY, C_CASHBOOK_ID,
+ NAME, STATEMENTDATE, DATEACCT, PROCESSED, POSTED,
+ LINE, DESCRIPTION, CASHTYPE, C_CURRENCY_ID, AMOUNT,
+ CONVERTEDAMT, C_BANKACCOUNT_ID, C_INVOICE_ID, C_CHARGE_ID)
+AS
+SELECT cl.C_Cash_ID, cl.C_CashLine_ID,
+ c.AD_Client_ID, c.AD_Org_ID, cl.IsActive, cl.Created, cl.CreatedBy, cl.Updated, cl.UpdatedBy,
+ c.C_CashBook_ID, c.Name, c.StatementDate, c.DateAcct, c.Processed, c.Posted,
+ cl.Line, cl.Description, cl.CashType, cl.C_Currency_ID, cl.Amount,
+ currencyConvert(cl.Amount,cl.C_Currency_ID,cb.C_Currency_ID,c.StatementDate,0, c.AD_Client_ID, c.AD_Org_ID) AS ConvertedAmt,
+ cl.C_BankAccount_ID, cl.C_Invoice_ID, cl.C_Charge_ID
+FROM C_Cash c
+ INNER JOIN C_CashLine cl ON (c.C_Cash_ID=cl.C_Cash_ID)
+ INNER JOIN C_CashBook cb ON (c.C_CashBook_ID=cb.C_CashBook_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_CLICK_MONTH.sql b/db/ddlutils/views/RV_CLICK_MONTH.sql
new file mode 100644
index 0000000000..f130f06c40
--- /dev/null
+++ b/db/ddlutils/views/RV_CLICK_MONTH.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW RV_CLICK_MONTH
+(AD_CLIENT_ID, AD_ORG_ID, NAME, DESCRIPTION, TARGETURL,
+ C_BPARTNER_ID, CREATED, COUNTER)
+AS
+SELECT cc.AD_Client_ID, cc.AD_Org_ID,
+ cc.Name, cc.Description, cc.TargetURL, cc.C_BPartner_ID,
+ firstOf(c.Created,'MM') AS Created,
+ COUNT(*) AS Counter
+FROM W_ClickCount cc
+ INNER JOIN W_Click c ON (cc.W_ClickCount_ID=c.W_ClickCount_ID)
+WHERE cc.IsActive='Y'
+GROUP BY cc.AD_Client_ID, cc.AD_Org_ID,
+ cc.Name, cc.Description, cc.TargetURL, cc.C_BPartner_ID,
+ firstOf(c.Created,'MM');
+
+
+
diff --git a/db/ddlutils/views/RV_CLICK_UNPROCESSED.sql b/db/ddlutils/views/RV_CLICK_UNPROCESSED.sql
new file mode 100644
index 0000000000..8219c65666
--- /dev/null
+++ b/db/ddlutils/views/RV_CLICK_UNPROCESSED.sql
@@ -0,0 +1,14 @@
+CREATE OR REPLACE VIEW RV_CLICK_UNPROCESSED
+(W_CLICK_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, TARGETURL, REFERRER,
+ REMOTE_HOST, REMOTE_ADDR, USERAGENT, ACCEPTLANGUAGE, PROCESSED,
+ W_CLICKCOUNT_ID, AD_USER_ID, EMAIL)
+AS
+SELECT W_CLICK_ID,AD_CLIENT_ID,AD_ORG_ID,ISACTIVE,CREATED,CREATEDBY,UPDATED,
+UPDATEDBY,TARGETURL,REFERRER,REMOTE_HOST,REMOTE_ADDR,USERAGENT,ACCEPTLANGUAGE,
+PROCESSED,W_CLICKCOUNT_ID,AD_USER_ID,EMAIL
+FROM W_Click
+WHERE W_ClickCount_ID IS NULL OR Processed='N';
+
+
+
diff --git a/db/ddlutils/views/RV_COMMISSIONRUNDETAIL.sql b/db/ddlutils/views/RV_COMMISSIONRUNDETAIL.sql
new file mode 100644
index 0000000000..651a6212f0
--- /dev/null
+++ b/db/ddlutils/views/RV_COMMISSIONRUNDETAIL.sql
@@ -0,0 +1,46 @@
+CREATE OR REPLACE VIEW RV_COMMISSIONRUNDETAIL
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_COMMISSIONRUN_ID, DOCUMENTNO, DESCRIPTION,
+ STARTDATE, GRANDTOTAL, PROCESSED, C_COMMISSION_ID, COMMISSION_BPARTNER_ID,
+ C_COMMISSIONAMT_ID, COMMISSIONCONVERTEDAMT, COMMISSIONQTY, COMMISSIONAMT, C_COMMISSIONDETAIL_ID,
+ REFERENCE, C_ORDERLINE_ID, C_INVOICELINE_ID, INFO, C_CURRENCY_ID,
+ ACTUALAMT, CONVERTEDAMT, ACTUALQTY, INVOICEDOCUMENTNO, DATEDOC,
+ M_PRODUCT_ID, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID, C_DOCTYPE_ID)
+AS
+SELECT cr.AD_Client_ID, cr.AD_Org_ID, cr.IsActive, cr.Created,cr.CreatedBy, cr.Updated,cr.UpdatedBy,
+ -- Run
+ cr.C_CommissionRun_ID, cr.DocumentNo, cr.Description,
+ cr.StartDate, cr.GrandTotal, cr.Processed,
+ -- Commission
+ c.C_Commission_ID, c.C_BPartner_ID AS Commission_BPartner_ID,
+ -- Commission Amount
+ ca.C_CommissionAmt_ID,
+ ca.ConvertedAmt AS CommissionConvertedAmt, ca.ActualQty AS CommissionQty,
+ ca.CommissionAmt,
+ -- Commission Detail
+ cd.C_CommissionDetail_ID,
+ cd.Reference,
+ cd.C_OrderLine_ID,
+ cd.C_InvoiceLine_ID,
+ cd.Info,
+ cd.C_Currency_ID, cd.ActualAmt, cd.ConvertedAmt,
+ cd.ActualQty,
+ -- Invoice/Order
+ i.DocumentNo AS InvoiceDocumentNo,
+ COALESCE (i.DateInvoiced, o.DateOrdered) AS DateDoc,
+ COALESCE (il.M_Product_ID,ol.M_Product_ID) AS M_Product_ID,
+ COALESCE (i.C_BPartner_ID,o.C_BPartner_ID) AS C_BPartner_ID,
+ COALESCE (i.C_BPartner_Location_ID,o.C_BPartner_Location_ID) AS C_BPartner_Location_ID,
+ COALESCE (i.AD_User_ID,o.AD_User_ID) AS AD_User_ID,
+ COALESCE (i.C_DocType_ID,o.C_DocType_ID) AS C_DocType_ID
+FROM C_CommissionRun cr
+ INNER JOIN C_Commission c ON (cr.C_Commission_ID=c.C_Commission_ID)
+ INNER JOIN C_CommissionAmt ca ON (cr.C_CommissionRun_ID=ca.C_CommissionRun_ID)
+ INNER JOIN C_CommissionDetail cd ON (ca.C_CommissionAmt_ID=cd.C_CommissionAmt_ID)
+ LEFT OUTER JOIN C_OrderLine ol ON (cd.C_OrderLine_ID=ol.C_OrderLine_ID)
+ LEFT OUTER JOIN C_InvoiceLine il ON (cd.C_InvoiceLine_ID=il.C_InvoiceLine_ID)
+ LEFT OUTER JOIN C_Order o ON (ol.C_Order_ID=o.C_Order_ID)
+ LEFT OUTER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_COST.sql b/db/ddlutils/views/RV_COST.sql
new file mode 100644
index 0000000000..117a9fe76c
--- /dev/null
+++ b/db/ddlutils/views/RV_COST.sql
@@ -0,0 +1,20 @@
+CREATE OR REPLACE VIEW RV_COST
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_PRODUCT_ID, VALUE, NAME,
+ UPC, ISBOM, PRODUCTTYPE, M_PRODUCT_CATEGORY_ID, M_COSTTYPE_ID,
+ M_COSTELEMENT_ID, COSTELEMENTTYPE, COSTINGMETHOD, ISCALCULATED, C_ACCTSCHEMA_ID,
+ C_CURRENCY_ID, CURRENTCOSTPRICE, FUTURECOSTPRICE, DESCRIPTION)
+AS
+SELECT c.AD_Client_ID, c.AD_Org_ID, c.IsActive, c.Created,c.CreatedBy,c.Updated,c.UpdatedBy,
+ p.M_Product_ID, p.Value, p.Name, p.UPC, p.IsBOM, p.ProductType, p.M_Product_Category_ID,
+ c.M_CostType_ID,
+ ce.M_CostElement_ID, ce.CostElementType, ce.CostingMethod, ce.IsCalculated,
+ acct.C_AcctSchema_ID, acct.C_Currency_ID,
+ c.CurrentCostPrice, c.FutureCostPrice, c.Description
+FROM M_Cost c
+ INNER JOIN M_Product p ON (c.M_Product_ID=p.M_Product_ID)
+ INNER JOIN M_CostElement ce ON (c.M_CostElement_ID=ce.M_CostElement_ID)
+ INNER JOIN C_AcctSchema acct ON (c.C_AcctSchema_ID=acct.C_AcctSchema_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_COSTDETAIL.sql b/db/ddlutils/views/RV_COSTDETAIL.sql
new file mode 100644
index 0000000000..e491605b98
--- /dev/null
+++ b/db/ddlutils/views/RV_COSTDETAIL.sql
@@ -0,0 +1,21 @@
+CREATE OR REPLACE VIEW RV_COSTDETAIL
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_PRODUCT_ID, VALUE, NAME,
+ UPC, ISBOM, PRODUCTTYPE, M_PRODUCT_CATEGORY_ID, M_INOUTLINE_ID,
+ C_INVOICELINE_ID, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, LOT, SERNO,
+ C_ACCTSCHEMA_ID, C_CURRENCY_ID, AMT, QTY, DESCRIPTION,
+ PROCESSED)
+AS
+SELECT c.AD_Client_ID, c.AD_Org_ID, c.IsActive, c.Created,c.CreatedBy,c.Updated,c.UpdatedBy,
+ p.M_Product_ID, p.Value, p.Name, p.UPC, p.IsBOM, p.ProductType, p.M_Product_Category_ID,
+ c.M_InOutLine_ID, c.C_InvoiceLine_ID,
+ asi.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.Lot, asi.SerNo,
+ acct.C_AcctSchema_ID, acct.C_Currency_ID,
+ c.Amt, c.Qty, c.Description, Processed
+FROM M_CostDetail c
+ INNER JOIN M_Product p ON (c.M_Product_ID=p.M_Product_ID)
+ INNER JOIN C_AcctSchema acct ON (c.C_AcctSchema_ID=acct.C_AcctSchema_ID)
+ INNER JOIN M_AttributeSetInstance asi ON (c.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_COSTSUMMARY.sql b/db/ddlutils/views/RV_COSTSUMMARY.sql
new file mode 100644
index 0000000000..93671a2271
--- /dev/null
+++ b/db/ddlutils/views/RV_COSTSUMMARY.sql
@@ -0,0 +1,21 @@
+CREATE OR REPLACE VIEW RV_COSTSUMMARY
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATEDBY, CREATED,
+ UPDATEDBY, UPDATED, M_PRODUCT_ID, VALUE, NAME,
+ UPC, ISBOM, PRODUCTTYPE, M_PRODUCT_CATEGORY_ID, M_COSTTYPE_ID,
+ C_ACCTSCHEMA_ID, C_CURRENCY_ID, CURRENTCOSTPRICE, FUTURECOSTPRICE)
+AS
+SELECT c.AD_Client_ID, c.AD_Org_ID, c.IsActive, 0 AS CreatedBy,getdate() AS Created,0 AS UpdatedBy,getdate() AS Updated,
+ p.M_Product_ID, p.Value, p.Name, p.UPC, p.IsBOM, p.ProductType, p.M_Product_Category_ID,
+ c.M_CostType_ID,
+ acct.C_AcctSchema_ID, acct.C_Currency_ID,
+ SUM(c.CurrentCostPrice) AS CurrentCostPrice, SUM(c.FutureCostPrice) AS FutureCostPrice
+FROM M_Cost c
+ INNER JOIN M_Product p ON (c.M_Product_ID=p.M_Product_ID)
+ INNER JOIN C_AcctSchema acct ON (c.C_AcctSchema_ID=acct.C_AcctSchema_ID)
+WHERE acct.M_CostType_ID=c.M_CostType_ID
+GROUP BY c.AD_Client_ID, c.AD_Org_ID, c.IsActive,
+ p.M_Product_ID, p.Value, p.Name, p.UPC, p.IsBOM, p.ProductType, p.M_Product_Category_ID,
+ c.M_CostType_ID, acct.C_AcctSchema_ID, acct.C_Currency_ID;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE.sql b/db/ddlutils/views/RV_C_INVOICE.sql
new file mode 100644
index 0000000000..8b1bf85407
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE.sql
@@ -0,0 +1,38 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE
+(C_INVOICE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, DOCACTION, ISPRINTED, ISDISCOUNTPRINTED, PROCESSING,
+ PROCESSED, ISTRANSFERRED, ISPAID, C_DOCTYPE_ID, C_DOCTYPETARGET_ID,
+ C_ORDER_ID, DESCRIPTION, ISAPPROVED, SALESREP_ID, DATEINVOICED,
+ DATEPRINTED, DATEACCT, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID,
+ C_BP_GROUP_ID, POREFERENCE, DATEORDERED, C_CURRENCY_ID, C_CONVERSIONTYPE_ID,
+ PAYMENTRULE, C_PAYMENTTERM_ID, M_PRICELIST_ID, C_CAMPAIGN_ID, C_PROJECT_ID,
+ C_ACTIVITY_ID, ISPAYSCHEDULEVALID, INVOICECOLLECTIONTYPE, C_COUNTRY_ID, C_REGION_ID,
+ POSTAL, CITY, C_CHARGE_ID, CHARGEAMT, TOTALLINES,
+ GRANDTOTAL, MULTIPLIER)
+AS
+SELECT i.C_Invoice_ID,
+ i.AD_Client_ID,i.AD_Org_ID,i.IsActive,i.Created,i.CreatedBy,i.Updated,i.UpdatedBy,
+ i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction,
+ i.IsPrinted, i.IsDiscountPrinted, i.Processing, i.Processed, i.IsTransferred, i.IsPaid,
+ i.C_DocType_ID, i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved,
+ i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct,
+ i.C_BPartner_ID, i.C_BPartner_Location_ID, i.AD_User_ID, b.C_BP_Group_ID,
+ i.POReference, i.DateOrdered, i.C_Currency_ID, C_ConversionType_ID, i.PaymentRule, i.C_PaymentTerm_ID,
+ i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID,
+ i.IsPayScheduleValid, i.InvoiceCollectionType,
+ loc.C_Country_ID, loc.C_Region_ID, loc.Postal, loc.City,
+ -- Amounts
+ i.C_Charge_ID,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.ChargeAmt*-1 ELSE i.ChargeAmt END AS ChargeAmt,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.TotalLines*-1 ELSE i.TotalLines END AS TotalLines,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.GrandTotal*-1 ELSE i.GrandTotal END AS GrandTotal,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier
+FROM C_Invoice i
+ INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
+ INNER JOIN C_BPartner b ON (i.C_BPartner_ID=b.C_BPartner_ID)
+ INNER JOIN C_BPartner_Location bpl ON (i.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
+ INNER JOIN C_Location loc ON (bpl.C_Location_ID=loc.C_Location_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICELINE.sql b/db/ddlutils/views/RV_C_INVOICELINE.sql
new file mode 100644
index 0000000000..62dacc2e32
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICELINE.sql
@@ -0,0 +1,48 @@
+CREATE OR REPLACE VIEW RV_C_INVOICELINE
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_INVOICELINE_ID, C_INVOICE_ID, SALESREP_ID,
+ C_BPARTNER_ID, C_BP_GROUP_ID, M_PRODUCT_ID, M_PRODUCT_CATEGORY_ID, DATEINVOICED,
+ DATEACCT, ISSOTRX, C_DOCTYPE_ID, DOCSTATUS, ISPAID,
+ C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID,
+ QTYINVOICED, QTYENTERED, M_ATTRIBUTESETINSTANCE_ID, PRODUCTATTRIBUTE, M_ATTRIBUTESET_ID,
+ M_LOT_ID, GUARANTEEDATE, LOT, SERNO, PRICELIST,
+ PRICEACTUAL, PRICELIMIT, PRICEENTERED, DISCOUNT, MARGIN,
+ MARGINAMT, LINENETAMT, LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT,
+ LINEOVERLIMITAMT)
+AS
+SELECT
+ il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
+ il.C_InvoiceLine_ID, i.C_Invoice_ID, i.SalesRep_ID,
+ i.C_BPartner_ID, i.C_BP_Group_ID,
+ il.M_Product_ID, p.M_Product_Category_ID,
+ i.DateInvoiced, i.DateAcct, i.IsSOTrx, i.C_DocType_ID, i.DocStatus, i.IsPaid,
+ il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID,
+ -- Qty
+ il.QtyInvoiced*i.Multiplier AS QtyInvoiced,
+ il.QtyEntered*i.Multiplier AS QtyEntered,
+ -- Attributes
+ il.M_AttributeSetInstance_ID, productAttribute(il.M_AttributeSetInstance_ID) AS ProductAttribute,
+ pasi.M_AttributeSet_ID, pasi.M_Lot_ID, pasi.GuaranteeDate, pasi.Lot, pasi.SerNo,
+ -- Item Amounts
+ il.PriceList, il.PriceActual, il.PriceLimit, il.PriceEntered,
+ CASE WHEN PriceList=0 THEN 0 ELSE
+ ROUND((PriceList-PriceActual)/PriceList*100,2) END AS Discount,
+ CASE WHEN PriceLimit=0 THEN 0 ELSE
+ ROUND((PriceActual-PriceLimit)/PriceLimit*100,2) END AS Margin,
+ CASE WHEN PriceLimit=0 THEN 0 ELSE
+ (PriceActual-PriceLimit)*QtyInvoiced END AS MarginAmt,
+ -- Line Amounts
+ ROUND(i.Multiplier*LineNetAmt, 2) AS LineNetAmt,
+ ROUND(i.Multiplier*PriceList*QtyInvoiced, 2) AS LineListAmt,
+ CASE WHEN COALESCE(il.PriceLimit, 0)=0 THEN ROUND(i.Multiplier*LineNetAmt,2) ELSE
+ ROUND(i.Multiplier*PriceLimit*QtyInvoiced,2) END AS LineLimitAmt,
+ ROUND(i.Multiplier*PriceList*QtyInvoiced-LineNetAmt,2) AS LineDiscountAmt,
+ CASE WHEN COALESCE(il.PriceLimit,0)=0 THEN 0 ELSE
+ ROUND(i.Multiplier*LineNetAmt-PriceLimit*QtyInvoiced,2) END AS LineOverLimitAmt
+FROM RV_C_Invoice i
+ INNER JOIN C_InvoiceLine il ON (i.C_Invoice_ID=il.C_Invoice_ID)
+ LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance pasi ON (il.M_AttributeSetInstance_ID=pasi.M_AttributeSetInstance_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICETAX.sql b/db/ddlutils/views/RV_C_INVOICETAX.sql
new file mode 100644
index 0000000000..6ee7f6f319
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICETAX.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICETAX
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_TAX_ID, C_INVOICE_ID, C_DOCTYPE_ID,
+ C_BPARTNER_ID, TAXID, ISTAXEXEMPT, DATEACCT, DATEINVOICED,
+ ISSOTRX, DOCUMENTNO, ISPAID, C_CURRENCY_ID, TAXBASEAMT,
+ TAXAMT, TAXLINETOTAL, MULTIPLIER)
+AS
+SELECT
+ i.AD_Client_ID, i.AD_Org_ID, i.IsActive, t.Created, t.CreatedBy, t.Updated, t.UpdatedBy,
+ t.C_Tax_ID, i.C_Invoice_ID, i.C_DocType_ID,
+ i.C_BPartner_ID, bp.TaxID, bp.IsTaxExempt,
+ i.DateAcct, i.DateInvoiced, i.IsSOTrx, i.DocumentNo, i.IsPaid, i.C_Currency_ID,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN t.TaxBaseAmt*-1 ELSE t.TaxBaseAmt END AS TaxBaseAmt,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN t.TaxAmt*-1 ELSE t.TaxAmt END AS TaxAmt,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN (t.TaxBaseAmt + t.TaxAmt)*-1 ELSE (t.TaxBaseAmt + t.TaxAmt) END AS TaxLineTotal,
+ CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier
+FROM C_InvoiceTax t
+ INNER JOIN C_Invoice i ON (t.C_Invoice_ID=i.C_Invoice_ID)
+ INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
+ INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_CUSTOMERPRODQTR.sql b/db/ddlutils/views/RV_C_INVOICE_CUSTOMERPRODQTR.sql
new file mode 100644
index 0000000000..0d490499db
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_CUSTOMERPRODQTR.sql
@@ -0,0 +1,24 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_CUSTOMERPRODQTR
+(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, M_PRODUCT_CATEGORY_ID, DATEINVOICED,
+ LINENETAMT, LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT,
+ LINEOVERLIMITAMT, LINEOVERLIMIT, QTYINVOICED, ISSOTRX)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID,
+ il.C_BPartner_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'Q') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced, IsSOTrx
+FROM RV_C_InvoiceLine il
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.C_BPartner_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'Q'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_CUSTOMERVENDQTR.sql b/db/ddlutils/views/RV_C_INVOICE_CUSTOMERVENDQTR.sql
new file mode 100644
index 0000000000..0afecf2025
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_CUSTOMERVENDQTR.sql
@@ -0,0 +1,26 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_CUSTOMERVENDQTR
+(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, VENDOR_ID, DATEINVOICED,
+ LINENETAMT, LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT,
+ LINEOVERLIMITAMT, LINEOVERLIMIT, QTYINVOICED)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID,
+ il.C_BPartner_ID, po.C_BPartner_ID AS Vendor_ID,
+ firstOf(il.DateInvoiced, 'Q') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced
+FROM RV_C_InvoiceLine il
+ INNER JOIN M_Product_PO po ON (il.M_Product_ID=po.M_Product_ID)
+WHERE il.IsSOTrx='Y'
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.C_BPartner_ID, po.C_BPartner_ID,
+ firstOf(il.DateInvoiced, 'Q');
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_DAY.sql b/db/ddlutils/views/RV_C_INVOICE_DAY.sql
new file mode 100644
index 0000000000..683c924d02
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_DAY.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_DAY
+(AD_CLIENT_ID, AD_ORG_ID, SALESREP_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, ISSOTRX)
+AS
+SELECT AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'DD') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ IsSOTrx
+FROM RV_C_InvoiceLine
+GROUP BY AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'DD'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_MONTH.sql b/db/ddlutils/views/RV_C_INVOICE_MONTH.sql
new file mode 100644
index 0000000000..aa41f7c3e3
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_MONTH.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_MONTH
+(AD_CLIENT_ID, AD_ORG_ID, SALESREP_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, ISSOTRX)
+AS
+SELECT AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'MM') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ IsSOTrx
+FROM RV_C_InvoiceLine
+GROUP BY AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'MM'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_PRODMONTH.sql b/db/ddlutils/views/RV_C_INVOICE_PRODMONTH.sql
new file mode 100644
index 0000000000..50b33b4b4d
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_PRODMONTH.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_PRODMONTH
+(AD_CLIENT_ID, AD_ORG_ID, M_PRODUCT_CATEGORY_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, QTYINVOICED, ISSOTRX)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'MM') AS DateInvoiced,
+ SUM(il.LineNetAmt) AS LineNetAmt,
+ SUM(il.LineListAmt) AS LineListAmt,
+ SUM(il.LineLimitAmt) AS LineLimitAmt,
+ SUM(il.LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced, IsSOTrx
+FROM RV_C_InvoiceLine il
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'MM'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_PRODUCTMONTH.sql b/db/ddlutils/views/RV_C_INVOICE_PRODUCTMONTH.sql
new file mode 100644
index 0000000000..559c9bfa9e
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_PRODUCTMONTH.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_PRODUCTMONTH
+(AD_CLIENT_ID, AD_ORG_ID, M_PRODUCT_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, QTYINVOICED, ISSOTRX)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.M_Product_ID,
+ firstOf(il.DateInvoiced, 'MM') AS DateInvoiced,
+ SUM(il.LineNetAmt) AS LineNetAmt,
+ SUM(il.LineListAmt) AS LineListAmt,
+ SUM(il.LineLimitAmt) AS LineLimitAmt,
+ SUM(il.LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced, IsSOTrx
+FROM RV_C_InvoiceLine il
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.M_Product_ID,
+ firstOf(il.DateInvoiced, 'MM'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_PRODUCTQTR.sql b/db/ddlutils/views/RV_C_INVOICE_PRODUCTQTR.sql
new file mode 100644
index 0000000000..8782b5757b
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_PRODUCTQTR.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_PRODUCTQTR
+(AD_CLIENT_ID, AD_ORG_ID, M_PRODUCT_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, QTYINVOICED, ISSOTRX)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.M_Product_ID,
+ firstOf(il.DateInvoiced, 'Q') AS DateInvoiced,
+ SUM(il.LineNetAmt) AS LineNetAmt,
+ SUM(il.LineListAmt) AS LineListAmt,
+ SUM(il.LineLimitAmt) AS LineLimitAmt,
+ SUM(il.LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced, IsSOTrx
+FROM RV_C_InvoiceLine il
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.M_Product_ID,
+ firstOf(il.DateInvoiced, 'Q'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_PRODWEEK.sql b/db/ddlutils/views/RV_C_INVOICE_PRODWEEK.sql
new file mode 100644
index 0000000000..f742108c40
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_PRODWEEK.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_PRODWEEK
+(AD_CLIENT_ID, AD_ORG_ID, M_PRODUCT_CATEGORY_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, QTYINVOICED, ISSOTRX)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'DY') AS DateInvoiced,
+ SUM(il.LineNetAmt) AS LineNetAmt,
+ SUM(il.LineListAmt) AS LineListAmt,
+ SUM(il.LineLimitAmt) AS LineLimitAmt,
+ SUM(il.LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced, IsSOTrx
+FROM RV_C_InvoiceLine il
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'DY'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_VENDORMONTH.sql b/db/ddlutils/views/RV_C_INVOICE_VENDORMONTH.sql
new file mode 100644
index 0000000000..43a6f22c19
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_VENDORMONTH.sql
@@ -0,0 +1,26 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_VENDORMONTH
+(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, M_PRODUCT_CATEGORY_ID, DATEINVOICED,
+ LINENETAMT, LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT,
+ LINEOVERLIMITAMT, LINEOVERLIMIT, QTYINVOICED)
+AS
+SELECT il.AD_Client_ID, il.AD_Org_ID,
+ po.C_BPartner_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'MM') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ SUM(QtyInvoiced) AS QtyInvoiced
+FROM RV_C_InvoiceLine il
+ INNER JOIN M_Product_PO po ON (il.M_Product_ID=po.M_Product_ID)
+WHERE il.IsSOTrx='Y'
+GROUP BY il.AD_Client_ID, il.AD_Org_ID, po.C_BPartner_ID, il.M_Product_Category_ID,
+ firstOf(il.DateInvoiced, 'MM');
+
+
+
diff --git a/db/ddlutils/views/RV_C_INVOICE_WEEK.sql b/db/ddlutils/views/RV_C_INVOICE_WEEK.sql
new file mode 100644
index 0000000000..a9c28f316c
--- /dev/null
+++ b/db/ddlutils/views/RV_C_INVOICE_WEEK.sql
@@ -0,0 +1,23 @@
+CREATE OR REPLACE VIEW RV_C_INVOICE_WEEK
+(AD_CLIENT_ID, AD_ORG_ID, SALESREP_ID, DATEINVOICED, LINENETAMT,
+ LINELISTAMT, LINELIMITAMT, LINEDISCOUNTAMT, LINEDISCOUNT, LINEOVERLIMITAMT,
+ LINEOVERLIMIT, ISSOTRX)
+AS
+SELECT AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'DY') AS DateInvoiced, -- DD Day, DY Week, MM Month
+ SUM(LineNetAmt) AS LineNetAmt,
+ SUM(LineListAmt) AS LineListAmt,
+ SUM(LineLimitAmt) AS LineLimitAmt,
+ SUM(LineDiscountAmt) AS LineDiscountAmt,
+ CASE WHEN SUM(LineListAmt)=0 THEN 0 ELSE
+ ROUND((SUM(LineListAmt)-SUM(LineNetAmt))/SUM(LineListAmt)*100,2) END AS LineDiscount,
+ SUM(LineOverLimitAmt) AS LineOverLimitAmt,
+ CASE WHEN SUM(LineNetAmt)=0 THEN 0 ELSE
+ 100-ROUND((SUM(LineNetAmt)-SUM(LineOverLimitAmt))/SUM(LineNetAmt)*100,2) END AS LineOverLimit,
+ IsSOTrx
+FROM RV_C_InvoiceLine
+GROUP BY AD_Client_ID, AD_Org_ID, SalesRep_ID,
+ firstOf(DateInvoiced, 'DY'), IsSOTrx;
+
+
+
diff --git a/db/ddlutils/views/RV_C_RFQRESPONSE.sql b/db/ddlutils/views/RV_C_RFQRESPONSE.sql
new file mode 100644
index 0000000000..8666d5676e
--- /dev/null
+++ b/db/ddlutils/views/RV_C_RFQRESPONSE.sql
@@ -0,0 +1,35 @@
+CREATE OR REPLACE VIEW RV_C_RFQRESPONSE
+(AD_CLIENT_ID, AD_ORG_ID, C_RFQ_ID, C_RFQ_TOPIC_ID, C_BPARTNER_ID,
+ C_BPARTNER_LOCATION_ID, AD_USER_ID, C_RFQRESPONSE_ID, C_CURRENCY_ID, DATERESPONSE,
+ DATEWORKSTART, DELIVERYDAYS, DATEWORKCOMPLETE, PRICE, RANKING,
+ ISSELFSERVICE, DESCRIPTION, HELP, M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID,
+ LINE, LINEDATEWORKSTART, LINEDELIVERYDAYS, LINEDATEWORKCOMPLETE, LINEDESCRIPTION,
+ LINEHELP, C_UOM_ID, QTY, BENCHMARKPRICE, BENCHMARKDIFFERENCE,
+ QTYPRICE, DISCOUNT, QTYRANKING)
+AS
+SELECT q.AD_Client_ID, q.AD_Org_ID, q.C_RfQ_ID, q.C_RfQ_Topic_ID,
+ r.C_BPartner_ID, r.C_BPartner_Location_ID, r.AD_User_ID,
+ r.C_RfQResponse_ID,
+ r.C_Currency_ID, r.DateResponse, r.DateWorkStart, r.DeliveryDays, r.DateWorkComplete,
+ r.Price, r.Ranking, r.IsSelfService,
+ r.Description, r.Help,
+ -- Line
+ ql.M_Product_ID, ql.M_AttributeSetInstance_ID,
+ ql.Line, rl.DateWorkStart AS LineDateWorkStart, rl.DeliveryDays AS LineDeliveryDays, rl.DateWorkComplete AS LineDateworkComplete,
+ rl.Description AS LineDescription, rl.Help AS LineHelp,
+ -- Qty
+ qlq.C_UOM_ID, qlq.Qty, qlq.BenchmarkPrice, rlq.Price-qlq.BenchmarkPrice AS BenchmarkDifference,
+ rlq.Price AS QtyPrice, rlq.Discount, rlq.Ranking AS QtyRanking
+FROM C_RfQ q
+ INNER JOIN C_RfQLine ql ON (q.C_RfQ_ID = ql.C_RfQ_ID)
+ INNER JOIN C_RfQLineQty qlq ON (ql.C_RfQLine_ID = qlq.C_RfQLine_ID)
+ INNER JOIN C_RfQResponse r ON (q.C_RfQ_ID = r.C_RfQ_ID)
+ INNER JOIN C_RfQResponseLine rl ON
+ (r.C_RfQResponse_ID = rl.C_RfQResponse_ID AND ql.C_RfQLine_ID = rl.C_RfQLine_ID)
+ INNER JOIN C_RfQResponseLineQty rlq ON
+ (rl.C_RfQResponseLine_ID = rlq.C_RfQResponseLine_ID AND qlq.C_RfQLineQty_ID = rlq.C_RfQLineQty_ID)
+WHERE r.IsComplete='Y'
+ AND q.Processed='N';
+
+
+
diff --git a/db/ddlutils/views/RV_C_RFQ_UNANSWERED.sql b/db/ddlutils/views/RV_C_RFQ_UNANSWERED.sql
new file mode 100644
index 0000000000..4de4424cd2
--- /dev/null
+++ b/db/ddlutils/views/RV_C_RFQ_UNANSWERED.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW RV_C_RFQ_UNANSWERED
+(AD_CLIENT_ID, AD_ORG_ID, C_RFQ_ID, NAME, DESCRIPTION,
+ HELP, SALESREP_ID, C_RFQ_TOPIC_ID, QUOTETYPE, ISQUOTETOTALAMT,
+ ISQUOTEALLQTY, C_CURRENCY_ID, DATERESPONSE, ISRFQRESPONSEACCEPTED, DATEWORKSTART,
+ DELIVERYDAYS, DATEWORKCOMPLETE, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID)
+AS
+SELECT q.AD_Client_ID, q.AD_Org_ID, q.C_RfQ_ID, q.Name, q.Description, q.Help, q.SalesRep_ID,
+ q.C_RfQ_Topic_ID, q.QuoteType, q.IsQuoteTotalAmt, q.IsQuoteAllQty, q.C_Currency_ID,
+ q.DateResponse, q.IsRfQResponseAccepted, q.DateWorkStart, q.DeliveryDays, q.DateWorkComplete,
+ r.C_BPartner_ID, r.C_BPartner_Location_ID, r.AD_User_ID
+FROM C_RfQ q
+ INNER JOIN C_RfQResponse r ON (q.C_RfQ_ID=r.C_RfQ_ID)
+WHERE r.IsComplete='N'
+ AND q.Processed='N';
+
+
+
diff --git a/db/ddlutils/views/RV_FACT_ACCT.sql b/db/ddlutils/views/RV_FACT_ACCT.sql
new file mode 100644
index 0000000000..08a092be92
--- /dev/null
+++ b/db/ddlutils/views/RV_FACT_ACCT.sql
@@ -0,0 +1,42 @@
+CREATE OR REPLACE VIEW RV_FACT_ACCT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, FACT_ACCT_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID,
+ DATETRX, DATEACCT, C_PERIOD_ID, AD_TABLE_ID, RECORD_ID,
+ LINE_ID, GL_CATEGORY_ID, GL_BUDGET_ID, C_TAX_ID, M_LOCATOR_ID,
+ POSTINGTYPE, C_CURRENCY_ID, AMTSOURCEDR, AMTSOURCECR, AMTSOURCE,
+ AMTACCTDR, AMTACCTCR, AMTACCT, RATE, C_UOM_ID,
+ QTY, M_PRODUCT_ID, C_BPARTNER_ID, AD_ORGTRX_ID, C_LOCFROM_ID,
+ C_LOCTO_ID, C_SALESREGION_ID, C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID,
+ USER1_ID, USER2_ID, A_ASSET_ID, DESCRIPTION, ORGVALUE,
+ ORGNAME, ACCOUNTVALUE, NAME, ACCOUNTTYPE, BPARTNERVALUE,
+ BPNAME, C_BP_GROUP_ID, PRODUCTVALUE, PRODUCTNAME, UPC,
+ M_PRODUCT_CATEGORY_ID)
+AS
+SELECT f.AD_Client_ID, f.AD_Org_ID, f.IsActive,f.Created,f.CreatedBy,f.Updated,f.UpdatedBy,
+ f.Fact_Acct_ID,
+ f.C_AcctSchema_ID, f.Account_ID, f.DateTrx, f.DateAcct, f.C_Period_ID,
+ f.AD_Table_ID, f.Record_ID, f.Line_ID,
+ f.GL_Category_ID, f.GL_Budget_ID, f.C_Tax_ID, f.M_Locator_ID,
+ f.PostingType, f.C_Currency_ID,
+ f.AmtSourceDr, f.AmtSourceCr, (f.AmtSourceDr - f.AmtSourceCr) AS AmtSource,
+ f.AmtAcctDr, f.AmtAcctCr, (f.AmtAcctDr - f.AmtAcctCr) AS AmtAcct,
+ CASE WHEN (f.AmtSourceDr - f.AmtSourceCr) = 0 THEN 0 ELSE
+ (f.AmtAcctDr - f.AmtAcctCr) / (f.AmtSourceDr - f.AmtSourceCr) END AS Rate,
+ f.C_UOM_ID, f.Qty,
+ f.M_Product_ID, f.C_BPartner_ID, f.AD_OrgTrx_ID,
+ f.C_LocFrom_ID, f.C_LocTo_ID, f.C_SalesRegion_ID,
+ f.C_Project_ID, f.C_Campaign_ID, f.C_Activity_ID,
+ f.User1_ID, f.User2_ID, f.A_Asset_ID,
+ f.Description,
+ o.Value AS OrgValue, o.Name AS OrgName,
+ ev.Value AS AccountValue, ev.Name, ev.AccountType,
+ bp.Value AS BPartnerValue, bp.Name AS BPName, bp.C_BP_Group_ID,
+ p.Value AS ProductValue, p.Name AS ProductName, p.UPC, p.M_Product_Category_ID
+FROM Fact_Acct f
+ INNER JOIN AD_Org o ON (f.AD_Org_ID=o.AD_Org_ID)
+ INNER JOIN C_ElementValue ev ON (f.Account_ID=ev.C_ElementValue_ID)
+ LEFT OUTER JOIN C_BPartner bp ON (f.C_BPartner_ID=bp.C_BPartner_ID)
+ LEFT OUTER JOIN M_Product p ON (f.M_Product_ID=p.M_Product_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_FACT_ACCT_DAY.sql b/db/ddlutils/views/RV_FACT_ACCT_DAY.sql
new file mode 100644
index 0000000000..c246b0fcbf
--- /dev/null
+++ b/db/ddlutils/views/RV_FACT_ACCT_DAY.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW RV_FACT_ACCT_DAY
+(AD_CLIENT_ID, AD_ORG_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID, DATEACCT,
+ C_PERIOD_ID, GL_CATEGORY_ID, GL_BUDGET_ID, C_TAX_ID, M_LOCATOR_ID,
+ POSTINGTYPE, C_CURRENCY_ID, AMTSOURCEDR, AMTSOURCECR, AMTSOURCE,
+ AMTACCTDR, AMTACCTCR, AMTACCT, RATE, M_PRODUCT_ID,
+ C_BPARTNER_ID, AD_ORGTRX_ID, C_LOCFROM_ID, C_LOCTO_ID, C_SALESREGION_ID,
+ C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID, USER1_ID, USER2_ID,
+ A_ASSET_ID)
+AS
+SELECT AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, Account_ID, firstOf(DateAcct, 'DD') AS DateAcct, C_Period_ID,
+ GL_Category_ID, GL_Budget_ID, C_Tax_ID, M_Locator_ID,
+ PostingType, C_Currency_ID,
+ SUM(AmtSourceDr) AS AmtSourceDr, SUM(AmtSourceCr) AS AmtSourceCr, SUM(AmtSourceDr - AmtSourceCr) AS AmtSource,
+ SUM(AmtAcctDr) AS AmtAcctDr, SUM(AmtAcctCr) AS AmtAcctCr, SUM(AmtAcctDr - AmtAcctCr) AS AmtAcct,
+ CASE WHEN SUM(AmtSourceDr - AmtSourceCr) = 0 THEN 0 ELSE
+ SUM(AmtAcctDr - AmtAcctCr) / SUM(AmtSourceDr - AmtSourceCr) END AS Rate,
+ M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SalesRegion_ID,
+ C_Project_ID, C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID, A_Asset_ID
+FROM Fact_Acct
+GROUP BY AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, Account_ID, firstOf(DateAcct, 'DD'), C_Period_ID,
+ GL_Category_ID, GL_Budget_ID, C_Tax_ID, M_Locator_ID,
+ PostingType, C_Currency_ID,
+ M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SalesRegion_ID,
+ C_Project_ID, C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID, A_Asset_ID;
+
+
+
diff --git a/db/ddlutils/views/RV_FACT_ACCT_PERIOD.sql b/db/ddlutils/views/RV_FACT_ACCT_PERIOD.sql
new file mode 100644
index 0000000000..8c40426420
--- /dev/null
+++ b/db/ddlutils/views/RV_FACT_ACCT_PERIOD.sql
@@ -0,0 +1,28 @@
+CREATE OR REPLACE VIEW RV_FACT_ACCT_PERIOD
+(AD_CLIENT_ID, AD_ORG_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID, C_PERIOD_ID,
+ GL_CATEGORY_ID, GL_BUDGET_ID, C_TAX_ID, M_LOCATOR_ID, POSTINGTYPE,
+ C_CURRENCY_ID, AMTSOURCEDR, AMTSOURCECR, AMTSOURCE, AMTACCTDR,
+ AMTACCTCR, AMTACCT, RATE, M_PRODUCT_ID, C_BPARTNER_ID,
+ AD_ORGTRX_ID, C_LOCFROM_ID, C_LOCTO_ID, C_SALESREGION_ID, C_PROJECT_ID,
+ C_CAMPAIGN_ID, C_ACTIVITY_ID, USER1_ID, USER2_ID, A_ASSET_ID)
+AS
+SELECT AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, Account_ID, C_Period_ID,
+ GL_Category_ID, GL_Budget_ID, C_Tax_ID, M_Locator_ID,
+ PostingType, C_Currency_ID,
+ SUM(AmtSourceDr) AS AmtSourceDr, SUM(AmtSourceCr) AS AmtSourceCr, SUM(AmtSourceDr - AmtSourceCr) AS AmtSource,
+ SUM(AmtAcctDr) AS AmtAcctDr, SUM(AmtAcctCr) AS AmtAcctCr, SUM(AmtAcctDr - AmtAcctCr) AS AmtAcct,
+ CASE WHEN SUM(AmtSourceDr - AmtSourceCr) = 0 THEN 0 ELSE
+ SUM(AmtAcctDr - AmtAcctCr) / SUM(AmtSourceDr - AmtSourceCr) END AS Rate,
+ M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SalesRegion_ID,
+ C_Project_ID, C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID, A_Asset_ID
+FROM Fact_Acct
+GROUP BY AD_Client_ID, AD_Org_ID,
+ C_AcctSchema_ID, Account_ID, C_Period_ID,
+ GL_Category_ID, GL_Budget_ID, C_Tax_ID, M_Locator_ID,
+ PostingType, C_Currency_ID,
+ M_Product_ID, C_BPartner_ID, AD_OrgTrx_ID, C_LocFrom_ID, C_LocTo_ID, C_SalesRegion_ID,
+ C_Project_ID, C_Campaign_ID, C_Activity_ID, User1_ID, User2_ID, A_Asset_ID;
+
+
+
diff --git a/db/ddlutils/views/RV_INOUTCONFIRM.sql b/db/ddlutils/views/RV_INOUTCONFIRM.sql
new file mode 100644
index 0000000000..9fbd866f1a
--- /dev/null
+++ b/db/ddlutils/views/RV_INOUTCONFIRM.sql
@@ -0,0 +1,17 @@
+CREATE OR REPLACE VIEW RV_INOUTCONFIRM
+(M_INOUTCONFIRM_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, M_INOUT_ID, DOCUMENTNO,
+ CONFIRMTYPE, ISAPPROVED, ISCANCELLED, DESCRIPTION, PROCESSING,
+ PROCESSED, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, M_WAREHOUSE_ID, C_ORDER_ID,
+ ISSOTRX)
+AS
+SELECT c.M_InOutConfirm_ID,
+ c.AD_Client_ID, c.AD_Org_ID, c.IsActive, c.Created, c.CreatedBy, c.Updated, c.UpdatedBy,
+ c.M_InOut_ID, c.DocumentNo, c.ConfirmType, c.IsApproved, c.IsCancelled,
+ c.Description, c.Processing, c.Processed,
+ i.C_BPartner_ID, i.C_BPartner_Location_ID, i.M_Warehouse_ID, i.C_Order_ID, i.IsSOTrx
+FROM M_InOutConfirm c
+ INNER JOIN M_InOut i ON (c.M_InOut_ID=i.M_InOut_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_INOUTDETAILS.sql b/db/ddlutils/views/RV_INOUTDETAILS.sql
new file mode 100644
index 0000000000..019056def6
--- /dev/null
+++ b/db/ddlutils/views/RV_INOUTDETAILS.sql
@@ -0,0 +1,47 @@
+CREATE OR REPLACE VIEW RV_INOUTDETAILS
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_INOUT_ID, ISSOTRX, DOCUMENTNO,
+ DOCACTION, DOCSTATUS, POSTED, PROCESSED, C_DOCTYPE_ID,
+ DESCRIPTION, C_ORDER_ID, DATEORDERED, MOVEMENTTYPE, MOVEMENTDATE,
+ DATEACCT, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID, SALESREP_ID,
+ M_WAREHOUSE_ID, POREFERENCE, DELIVERYRULE, FREIGHTCOSTRULE, FREIGHTAMT,
+ DELIVERYVIARULE, M_SHIPPER_ID, PRIORITYRULE, DATEPRINTED, NOPACKAGES,
+ PICKDATE, SHIPDATE, TRACKINGNO, AD_ORGTRX_ID, C_PROJECT_ID,
+ C_CAMPAIGN_ID, C_ACTIVITY_ID, USER1_ID, USER2_ID, DATERECEIVED,
+ ISAPPROVED, ISINDISPUTE, M_INOUTLINE_ID, LINE, LINEDESCRIPTION,
+ C_ORDERLINE_ID, M_LOCATOR_ID, M_PRODUCT_ID, C_UOM_ID, M_ATTRIBUTESETINSTANCE_ID,
+ PRODUCTATTRIBUTE, M_ATTRIBUTESET_ID, M_LOT_ID, GUARANTEEDATE, LOT,
+ SERNO, MOVEMENTQTY, QTYENTERED, ISDESCRIPTION, CONFIRMEDQTY,
+ PICKEDQTY, SCRAPPEDQTY, TARGETQTY, LOCATORVALUE, X,
+ Y, Z)
+AS
+SELECT h.AD_Client_ID, h.AD_Org_ID, l.IsActive, l.Created, l.CreatedBy, l.Updated, l.UpdatedBy,
+ h.M_InOut_ID,
+ h.IsSOTrx, h.DocumentNo, h.DocAction, h.DocStatus, h.Posted, h.Processed,
+ h.C_DocType_ID, h.Description, h.C_Order_ID, h.DateOrdered,
+ h.MovementType, h.MovementDate, h.DateAcct,
+ h.C_BPartner_ID, h.C_BPartner_Location_ID, h.AD_User_ID,
+ h.SalesRep_ID,
+ h.M_Warehouse_ID,
+ h.POReference, h.DeliveryRule, h.FreightCostRule, h.FreightAmt,
+ h.DeliveryViaRule, h.M_Shipper_ID, -- h.C_CHARGE_ID, h.CHARGEAmt,
+ h.PriorityRule, h.DatePrinted,
+ h.NoPackages, h.PickDate, h.ShipDate, h.TrackingNo,
+ h.AD_OrgTrx_ID, h.C_Project_ID, h.C_Campaign_ID, h.C_Activity_ID, h.User1_ID, h.User2_ID,
+ h.DateReceived, h.IsApproved, h.IsInDispute,
+ l.M_InOutLine_ID, l.Line, l.Description AS LineDescription,
+ l.C_OrderLine_ID, l.M_Locator_ID,
+ l.M_Product_ID, l.C_UOM_ID,
+ l.M_AttributeSetInstance_ID, productAttribute(l.M_AttributeSetInstance_ID) AS ProductAttribute,
+ pasi.M_AttributeSet_ID, pasi.M_Lot_ID, pasi.GuaranteeDate, pasi.Lot, pasi.SerNo,
+ l.MovementQty, l.QtyEntered,
+ l.IsDescription,
+ l.ConfirmedQty, l.PickedQty, l.ScrappedQty, l.TargetQty,
+ loc.Value AS LocatorValue, loc.X, loc.Y, loc.Z
+FROM M_InOut h
+ INNER JOIN M_InOutLine l ON (h.M_InOut_ID=l.M_InOut_ID)
+ LEFT OUTER JOIN M_Locator loc ON (l.M_Locator_ID=loc.M_Locator_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance pasi ON (l.M_AttributeSetInstance_ID=pasi.M_AttributeSetInstance_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_INOUTLINECONFIRM.sql b/db/ddlutils/views/RV_INOUTLINECONFIRM.sql
new file mode 100644
index 0000000000..4a6075e127
--- /dev/null
+++ b/db/ddlutils/views/RV_INOUTLINECONFIRM.sql
@@ -0,0 +1,22 @@
+CREATE OR REPLACE VIEW RV_INOUTLINECONFIRM
+(M_INOUTCONFIRM_ID, M_INOUTLINECONFIRM_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
+ CREATED, CREATEDBY, UPDATED, UPDATEDBY, TARGETQTY,
+ CONFIRMEDQTY, DIFFERENCEQTY, SCRAPPEDQTY, DESCRIPTION, PROCESSED,
+ M_INOUT_ID, DOCUMENTNO, CONFIRMTYPE, ISAPPROVED, ISCANCELLED,
+ C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, M_WAREHOUSE_ID, C_ORDER_ID, ISSOTRX,
+ M_INOUTLINE_ID, M_PRODUCT_ID, M_ATTRIBUTESETINSTANCE_ID, M_LOCATOR_ID)
+AS
+SELECT cl.M_InOutConfirm_ID, cl.M_InOutLineConfirm_ID,
+ cl.AD_Client_ID, cl.AD_Org_ID, cl.IsActive, cl.Created, cl.CreatedBy, cl.Updated, cl.UpdatedBy,
+ cl.TargetQty, cl.ConfirmedQty, cl.DifferenceQty, cl.ScrappedQty,
+ cl.Description, cl.Processed,
+ c.M_InOut_ID, c.DocumentNo, c.ConfirmType, c.IsApproved, c.IsCancelled,
+ i.C_BPartner_ID, i.C_BPartner_Location_ID, i.M_Warehouse_ID, i.C_Order_ID, i.IsSOTrx,
+ cl.M_InOutLine_ID, il.M_Product_ID, il.M_AttributeSetInstance_ID, il.M_Locator_ID
+FROM M_InOutLineConfirm cl
+ INNER JOIN M_InOutConfirm c ON (cl.M_InOutConfirm_ID=c.M_InOutConfirm_ID)
+ INNER JOIN M_InOut i ON (c.M_InOut_ID=i.M_InOut_ID)
+ INNER JOIN M_InOutLine il ON (cl.M_InOutLine_ID=il.M_InOutLine_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_M_REQUISITION.sql b/db/ddlutils/views/RV_M_REQUISITION.sql
new file mode 100644
index 0000000000..6baa98a918
--- /dev/null
+++ b/db/ddlutils/views/RV_M_REQUISITION.sql
@@ -0,0 +1,22 @@
+CREATE OR REPLACE VIEW RV_M_REQUISITION
+(M_REQUISITION_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, DESCRIPTION,
+ HELP, AD_USER_ID, M_PRICELIST_ID, M_WAREHOUSE_ID, ISAPPROVED,
+ PRIORITYRULE, DATEREQUIRED, TOTALLINES, DOCACTION, DOCSTATUS,
+ PROCESSED, M_REQUISITIONLINE_ID, LINE, QTY, M_PRODUCT_ID,
+ LINEDESCRIPTION, PRICEACTUAL, LINENETAMT)
+AS
+SELECT r.M_Requisition_ID,
+ r.AD_Client_ID, r.AD_Org_ID, r.IsActive, r.Created, r.CreatedBy, r.Updated, r.UpdatedBy,
+ r.DocumentNo, r.Description, r.Help,
+ r.AD_User_ID, r.M_PriceList_ID, r.M_Warehouse_ID, r.IsApproved, r.PriorityRule,
+ r.DateRequired, r.TotalLines, r.DocAction, r.DocStatus, r.Processed,
+ l.M_RequisitionLine_ID, l.Line,
+ l.Qty, l.M_Product_ID,
+ l.Description AS LineDescription,
+ l.PriceActual, l.LineNetAmt
+FROM M_Requisition r
+ INNER JOIN M_RequisitionLine l ON (r.M_Requisition_ID=l.M_Requisition_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_M_TRANSACTION.sql b/db/ddlutils/views/RV_M_TRANSACTION.sql
new file mode 100644
index 0000000000..b4cffa7d80
--- /dev/null
+++ b/db/ddlutils/views/RV_M_TRANSACTION.sql
@@ -0,0 +1,16 @@
+CREATE OR REPLACE VIEW RV_M_TRANSACTION
+(AD_CLIENT_ID, AD_ORG_ID, MOVEMENTDATE, MOVEMENTQTY, M_PRODUCT_ID,
+ M_LOCATOR_ID, M_ATTRIBUTESETINSTANCE_ID, M_PRODUCT_CATEGORY_ID, VALUE, C_BPARTNER_ID,
+ PRICEPO, PRICELASTPO, PRICELIST)
+AS
+SELECT t.AD_Client_ID,t.AD_Org_ID, t.MovementDate, t.MovementQty,
+ t.M_Product_ID, t.M_Locator_ID, t.M_AttributeSetInstance_ID,
+ p.M_Product_Category_ID, p.Value,
+ po.C_BPartner_ID, po.PricePO, po.PriceLastPO, po.PriceList
+FROM M_Transaction t
+ INNER JOIN M_Product p ON (t.M_Product_ID=p.M_Product_ID)
+ INNER JOIN M_Product_PO po ON (t.M_Product_ID=po.M_Product_ID)
+WHERE po.IsCurrentVendor='Y';
+
+
+
diff --git a/db/ddlutils/views/RV_M_TRANSACTION_SUM.sql b/db/ddlutils/views/RV_M_TRANSACTION_SUM.sql
new file mode 100644
index 0000000000..75962ccf3b
--- /dev/null
+++ b/db/ddlutils/views/RV_M_TRANSACTION_SUM.sql
@@ -0,0 +1,14 @@
+CREATE OR REPLACE VIEW RV_M_TRANSACTION_SUM
+(AD_CLIENT_ID, AD_ORG_ID, MOVEMENTTYPE, M_WAREHOUSE_ID, M_LOCATOR_ID,
+ M_PRODUCT_ID, MOVEMENTDATE, MOVEMENTQTY)
+AS
+SELECT t.AD_Client_ID, t.AD_Org_ID,
+ t.MovementType, l.M_Warehouse_ID, t.M_Locator_ID, t.M_Product_ID, t.MovementDate,
+ SUM(t.MovementQty) AS MovementQty
+FROM M_Transaction t, M_Locator l
+WHERE t.M_Locator_ID=l.M_Locator_ID
+GROUP BY t.AD_Client_ID, t.AD_Org_ID,
+ t.MovementType, l.M_Warehouse_ID, t.M_Locator_ID, t.M_Product_ID, t.MovementDate;
+
+
+
diff --git a/db/ddlutils/views/RV_OPENITEM.sql b/db/ddlutils/views/RV_OPENITEM.sql
new file mode 100644
index 0000000000..346e3555df
--- /dev/null
+++ b/db/ddlutils/views/RV_OPENITEM.sql
@@ -0,0 +1,55 @@
+CREATE OR REPLACE VIEW RV_OPENITEM
+(AD_ORG_ID, AD_CLIENT_ID, DOCUMENTNO, C_INVOICE_ID, C_ORDER_ID,
+ C_BPARTNER_ID, ISSOTRX, DATEINVOICED, DATEACCT, NETDAYS,
+ DUEDATE, DAYSDUE, DISCOUNTDATE, DISCOUNTAMT, GRANDTOTAL,
+ PAIDAMT, OPENAMT, C_CURRENCY_ID, C_CONVERSIONTYPE_ID, C_PAYMENTTERM_ID,
+ ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE, C_CAMPAIGN_ID, C_PROJECT_ID,
+ C_ACTIVITY_ID)
+AS
+SELECT i.AD_Org_ID, i.AD_Client_ID,
+ i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
+ i.DateInvoiced, i.DateAcct,
+ p.NetDays,
+ paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DueDate,
+ paymentTermDueDays(i.C_PaymentTerm_ID, i.DateInvoiced, getdate()) AS DaysDue,
+ addDays(i.DateInvoiced,p.DiscountDays) AS DiscountDate,
+ ROUND(i.GrandTotal*p.Discount/100,2) AS DiscountAmt,
+ i.GrandTotal,
+ invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
+ invoiceOpen(i.C_Invoice_ID,0) AS OpenAmt,
+ i.C_Currency_ID, i.C_ConversionType_ID,
+ i.C_PaymentTerm_ID,
+ i.IsPayScheduleValid, null AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
+ i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
+FROM RV_C_Invoice i
+ INNER JOIN C_PaymentTerm p ON (i.C_PaymentTerm_ID=p.C_PaymentTerm_ID)
+WHERE -- i.IsPaid='N'
+ invoiceOpen(i.C_Invoice_ID,0) <> 0
+ AND i.IsPayScheduleValid<>'Y'
+ AND i.DocStatus<>'DR'
+UNION
+SELECT i.AD_Org_ID, i.AD_Client_ID,
+ i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
+ i.DateInvoiced, i.DateAcct,
+ daysBetween(ips.DueDate,i.DateInvoiced) AS NetDays,
+ ips.DueDate,
+ daysBetween(getdate(),ips.DueDate) AS DaysDue,
+ ips.DiscountDate,
+ ips.DiscountAmt,
+ ips.DueAmt AS GrandTotal,
+ invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
+ invoiceOpen(i.C_Invoice_ID, ips.C_InvoicePaySchedule_ID) AS OpenAmt,
+ i.C_Currency_ID, i.C_ConversionType_ID,
+ i.C_PaymentTerm_ID,
+ i.IsPayScheduleValid, ips.C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
+ i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
+FROM RV_C_Invoice i
+ INNER JOIN C_InvoicePaySchedule ips ON (i.C_Invoice_ID=ips.C_Invoice_ID)
+WHERE -- i.IsPaid='N'
+ invoiceOpen(i.C_Invoice_ID,ips.C_InvoicePaySchedule_ID) <> 0
+ AND i.IsPayScheduleValid='Y'
+ AND i.DocStatus<>'DR'
+ AND ips.IsValid='Y';
+
+
+
diff --git a/db/ddlutils/views/RV_ORDERDETAIL.sql b/db/ddlutils/views/RV_ORDERDETAIL.sql
new file mode 100644
index 0000000000..a8d312f5a6
--- /dev/null
+++ b/db/ddlutils/views/RV_ORDERDETAIL.sql
@@ -0,0 +1,43 @@
+CREATE OR REPLACE VIEW RV_ORDERDETAIL
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_ORDER_ID, DOCSTATUS, DOCACTION,
+ C_DOCTYPE_ID, ISAPPROVED, ISCREDITAPPROVED, SALESREP_ID, BILL_BPARTNER_ID,
+ BILL_LOCATION_ID, BILL_USER_ID, ISDROPSHIP, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID,
+ AD_USER_ID, POREFERENCE, C_CURRENCY_ID, ISSOTRX, C_CAMPAIGN_ID,
+ C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID, C_ORDERLINE_ID,
+ DATEORDERED, DATEPROMISED, M_PRODUCT_ID, M_WAREHOUSE_ID, M_ATTRIBUTESETINSTANCE_ID,
+ PRODUCTATTRIBUTE, M_ATTRIBUTESET_ID, M_LOT_ID, GUARANTEEDATE, LOT,
+ SERNO, C_UOM_ID, QTYENTERED, QTYORDERED, QTYRESERVED,
+ QTYDELIVERED, QTYINVOICED, PRICEACTUAL, PRICEENTERED, QTYTODELIVER,
+ QTYTOINVOICE, NETAMTTOINVOICE, QTYLOSTSALES, AMTLOSTSALES, DISCOUNT,
+ MARGIN, MARGINAMT)
+AS
+SELECT l.AD_Client_ID, l.AD_Org_ID,
+ l.IsActive, l.Created, l.CreatedBy, l.Updated, l.UpdatedBy,
+ o.C_Order_ID, o.DocStatus, o.DocAction, o.C_DocType_ID, o.IsApproved, o.IsCreditApproved,
+ o.SalesRep_ID,
+ o.Bill_BPartner_ID, o.Bill_Location_ID, o.Bill_User_ID, o.IsDropShip,
+ l.C_BPartner_ID, l.C_BPartner_Location_ID, o.AD_User_ID,
+ o.POReference, o.C_Currency_ID, o.IsSOTrx,
+ l.C_Campaign_ID, l.C_Project_ID, l.C_Activity_ID, l.C_ProjectPhase_ID, l.C_ProjectTask_ID,
+ l.C_OrderLine_ID, l.DateOrdered, l.DatePromised, l.M_Product_ID, l.M_Warehouse_ID,
+ l.M_AttributeSetInstance_ID, productAttribute(l.M_AttributeSetInstance_ID) AS ProductAttribute,
+ pasi.M_AttributeSet_ID, pasi.M_Lot_ID, pasi.GuaranteeDate, pasi.Lot, pasi.SerNo,
+ l.C_UOM_ID, l.QtyEntered, l.QtyOrdered, l.QtyReserved, l.QtyDelivered, l.QtyInvoiced,
+ l.PriceActual, l.PriceEntered,
+ l.QtyOrdered-l.QtyDelivered AS QtyToDeliver,
+ l.QtyOrdered-l.QtyInvoiced AS QtyToInvoice,
+ (l.QtyOrdered-l.QtyInvoiced)*l.PriceActual AS NetAmtToInvoice,
+ l.QtyLostSales, l.QtyLostSales*l.PriceActual AS AmtLostSales,
+ CASE WHEN PriceList=0 THEN 0 ELSE
+ ROUND((PriceList-PriceActual)/PriceList*100,2) END AS Discount,
+ CASE WHEN PriceLimit=0 THEN 0 ELSE
+ ROUND((PriceActual-PriceLimit)/PriceLimit*100,2) END AS Margin,
+ CASE WHEN PriceLimit=0 THEN 0 ELSE
+ (PriceActual-PriceLimit)*QtyDelivered END AS MarginAmt
+FROM C_Order o
+ INNER JOIN C_OrderLine l ON (o.C_Order_ID=l.C_Order_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance pasi ON (l.M_AttributeSetInstance_ID=pasi.M_AttributeSetInstance_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_PAYMENT.sql b/db/ddlutils/views/RV_PAYMENT.sql
new file mode 100644
index 0000000000..175ee97043
--- /dev/null
+++ b/db/ddlutils/views/RV_PAYMENT.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW RV_PAYMENT
+(C_PAYMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, DATETRX,
+ ISRECEIPT, C_DOCTYPE_ID, TRXTYPE, C_BANKACCOUNT_ID, C_BPARTNER_ID,
+ C_INVOICE_ID, C_BP_BANKACCOUNT_ID, C_PAYMENTBATCH_ID, TENDERTYPE, CREDITCARDTYPE,
+ CREDITCARDNUMBER, CREDITCARDVV, CREDITCARDEXPMM, CREDITCARDEXPYY, MICR,
+ ROUTINGNO, ACCOUNTNO, CHECKNO, A_NAME, A_STREET,
+ A_CITY, A_STATE, A_ZIP, A_IDENT_DL, A_IDENT_SSN,
+ A_EMAIL, VOICEAUTHCODE, ORIG_TRXID, PONUM, C_CURRENCY_ID,
+ C_CONVERSIONTYPE_ID, PAYAMT, DISCOUNTAMT, WRITEOFFAMT, TAXAMT,
+ OVERUNDERAMT, MULTIPLIERAP, ALLOCATEDAMT, AVAILABLEAMT, ISOVERUNDERPAYMENT,
+ ISAPPROVED, R_PNREF, R_RESULT, R_RESPMSG, R_AUTHCODE,
+ R_AVSADDR, R_AVSZIP, R_INFO, PROCESSING, OPROCESSING,
+ DOCSTATUS, DOCACTION, ISPREPAYMENT, C_CHARGE_ID, ISRECONCILED,
+ ISALLOCATED, ISONLINE, PROCESSED, POSTED, C_CAMPAIGN_ID,
+ C_PROJECT_ID, C_ACTIVITY_ID)
+AS
+SELECT C_Payment_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ DocumentNo, DateTrx, IsReceipt, C_DocType_ID, TrxType,
+ C_BankAccount_ID, C_BPartner_ID, C_Invoice_ID, C_BP_BankAccount_ID, C_PaymentBatch_ID,
+ TenderType, CreditCardType, CreditCardNumber, CreditCardVV, CreditCardExpMM, CreditCardExpYY,
+ Micr, RoutingNo, AccountNo, CheckNo,
+ A_Name, A_Street, A_City, A_State, A_Zip, A_Ident_DL, A_Ident_SSN, A_EMail,
+ VoiceAuthCode, Orig_TrxID, PONum,
+ C_Currency_ID, C_ConversionType_ID,
+ CASE IsReceipt WHEN 'Y' THEN PayAmt ELSE PayAmt*-1 END AS PayAmt,
+ CASE IsReceipt WHEN 'Y' THEN DiscountAmt ELSE DiscountAmt*-1 END AS DiscountAmt,
+ CASE IsReceipt WHEN 'Y' THEN WriteOffAmt ELSE WriteOffAmt*-1 END AS WriteOffAmt,
+ CASE IsReceipt WHEN 'Y' THEN TaxAmt ELSE TaxAmt*-1 END AS TaxAmt,
+ CASE IsReceipt WHEN 'Y' THEN OverUnderAmt ELSE OverUnderAmt*-1 END AS OverUnderAmt,
+ CASE IsReceipt WHEN 'Y' THEN 1 ELSE -1 END AS MultiplierAP,
+ paymentAllocated(C_Payment_ID, C_Currency_ID) AS AllocatedAmt,
+ paymentAvailable(C_Payment_ID) AS AvailableAmt,
+ IsOverUnderPayment, IsApproved,
+ R_PnRef, R_Result, R_RespMsg, R_AuthCode, R_AvsAddr, R_AvsZip, R_Info,
+ Processing, OProcessing, DocStatus, DocAction,
+ IsPrepayment, C_Charge_ID,
+ IsReconciled, IsAllocated, IsOnline, Processed, Posted,
+ C_Campaign_ID, C_Project_ID, C_Activity_ID
+FROM C_Payment;
+
+--COMMENT ON TABLE RV_PAYMENT IS 'Payment Information corrected for AP/AR';
+
+
+
diff --git a/db/ddlutils/views/RV_PRINTFORMATDETAIL.sql b/db/ddlutils/views/RV_PRINTFORMATDETAIL.sql
new file mode 100644
index 0000000000..e1a3b61a2a
--- /dev/null
+++ b/db/ddlutils/views/RV_PRINTFORMATDETAIL.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW RV_PRINTFORMATDETAIL
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, AD_PRINTFORMAT_ID, NAME, DESCRIPTION,
+ ISTABLEBASED, ISFORM, AD_TABLE_ID, AD_REPORTVIEW_ID, AD_PRINTPAPER_ID,
+ DEFAULT_AD_PRINTCOLOR_ID, DEFAULT_AD_PRINTFONT_ID, ISSTANDARDHEADERFOOTER, AD_PRINTTABLEFORMAT_ID, HEADERMARGIN,
+ FOOTERMARGIN, PRINTERNAME, ISDEFAULT, AD_PRINTFORMATITEM_ID, ITEMNAME,
+ PRINTNAME, PRINTNAMESUFFIX, ISPRINTED, PRINTAREATYPE, SEQNO,
+ PRINTFORMATTYPE, AD_COLUMN_ID, AD_PRINTFORMATCHILD_ID, IMAGEISATTACHED, IMAGEURL,
+ ISRELATIVEPOSITION, ISNEXTLINE, XSPACE, YSPACE, XPOSITION,
+ YPOSITION, MAXWIDTH, ISHEIGHTONELINE, MAXHEIGHT, ISFIXEDWIDTH,
+ ISSETNLPOSITION, ISSUPPRESSNULL, BELOWCOLUMN, FIELDALIGNMENTTYPE, LINEALIGNMENTTYPE,
+ AD_PRINTCOLOR_ID, AD_PRINTFONT_ID, ISORDERBY, SORTNO, ISGROUPBY,
+ ISPAGEBREAK, ISNEXTPAGE, ISSUMMARIZED, ISAVERAGED, ISCOUNTED,
+ ISMINCALC, ISMAXCALC, ISVARIANCECALC, ISDEVIATIONCALC, ISRUNNINGTOTAL,
+ RUNNINGTOTALLINES, AD_PRINTGRAPH_ID)
+AS
+SELECT f.AD_Client_ID, f.AD_Org_ID, i.IsActive, i.Created,i.CreatedBy,i.Updated,i.UpdatedBy,
+ f.AD_PrintFormat_ID,
+ f.Name, f.Description,
+ f.IsTableBased,f.IsForm,f.AD_Table_ID,f.AD_ReportView_ID,
+ f.AD_PrintPaper_ID,
+ f.AD_PrintColor_ID AS Default_AD_PrintColor_ID,
+ f.AD_PrintFont_ID AS Default_AD_PrintFont_ID,
+ f.IsStandardHeaderFooter,
+ f.AD_PrintTableFormat_ID,
+ f.HeaderMargin,f.FooterMargin,
+ f.PrinterName,f.IsDefault,
+ i.AD_PrintFormatItem_ID,
+ i.Name AS ItemName, i.PrintName, i.PrintNameSuffix, i.IsPrinted, i.PrintAreaType, i.SeqNo,
+ i.PrintFormatType, i.AD_Column_ID, i.AD_PrintFormatChild_ID, i.ImageIsAttached,i.ImageURL,
+ i.IsRelativePosition, i.IsNextLine, XSpace,YSpace, XPosition,YPosition,
+ i.MaxWidth, IsHeightOneLine, MaxHeight, i.IsFixedWidth,
+ i.IsSetNLPosition,i.IsSuppressNull, i.BelowColumn,
+ i.FieldAlignmentType,i.LineAlignmentType,
+ i.AD_PrintColor_ID,i.AD_PrintFont_ID,
+ i.IsOrderBy,i.SortNo, i.IsGroupBy,i.IsPageBreak,i.IsNextPage,
+ i.IsSummarized,i.IsAveraged,i.IsCounted,i.IsMinCalc,i.IsMaxCalc,
+ i.IsVarianceCalc,i.IsDeviationCalc,
+ i.IsRunningTotal,i.RunningTotalLines,
+ i.AD_PrintGraph_ID
+FROM AD_PrintFormat f
+ INNER JOIN AD_PrintFormatItem i ON (f.AD_PrintFormat_ID=i.AD_PrintFormat_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_PRODUCT_COSTING.sql b/db/ddlutils/views/RV_PRODUCT_COSTING.sql
new file mode 100644
index 0000000000..54d51b1596
--- /dev/null
+++ b/db/ddlutils/views/RV_PRODUCT_COSTING.sql
@@ -0,0 +1,29 @@
+CREATE OR REPLACE VIEW RV_PRODUCT_COSTING
+(M_PRODUCT_ID, C_ACCTSCHEMA_ID, VALUE, NAME, M_PRODUCT_CATEGORY_ID,
+ AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, CURRENTCOSTPRICE, FUTURECOSTPRICE, COSTSTANDARD,
+ COSTSTANDARDPOQTY, COSTSTANDARDPOAMT, COSTSTANDARDPODIFF, COSTSTANDARDCUMQTY, COSTSTANDARDCUMAMT,
+ COSTSTANDARDINVDIFF, COSTAVERAGE, COSTAVERAGECUMQTY, COSTAVERAGECUMAMT, TOTALINVQTY,
+ TOTALINVAMT, TOTALINVCOST, PRICELASTPO, PRICELASTINV)
+AS
+SELECT pc.M_Product_ID, pc.C_AcctSchema_ID, p.Value, p.Name, p.M_Product_Category_ID,
+ pc.AD_Client_ID, pc.AD_Org_ID, pc.IsActive, pc.Created,pc.CreatedBy,pc.Updated,pc.UpdatedBy,
+ pc.CurrentCostPrice,
+ -- Standard Costing
+ pc.FutureCostPrice, pc.CostStandard,
+ pc.CostStandardPOQty, pc.CostStandardPOAmt,
+ CASE WHEN pc.CostStandardPOQty=0 THEN 0 ELSE pc.CostStandardPOAmt/pc.CostStandardPOQty END AS CostStandardPODiff,
+ pc.CostStandardCumQty, pc.CostStandardCumAmt,
+ CASE WHEN pc.CostStandardCumQty=0 THEN 0 ELSE pc.CostStandardCumAmt/pc.CostStandardCumQty END AS CostStandardInvDiff,
+ -- Average Costing
+ pc.CostAverage,
+ pc.CostAverageCumQty, pc.CostAverageCumAmt,
+ pc.TotalInvQty, pc.TotalInvAmt,
+ CASE WHEN pc.TotalInvQty=0 THEN 0 ELSE pc.TotalInvAmt/pc.TotalInvQty END AS TotalInvCost,
+ -- LastPrice
+ pc.PriceLastPO, pc.PriceLastInv
+FROM M_Product_Costing pc
+ INNER JOIN M_Product p ON (pc.M_Product_ID=p.M_Product_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_PROJECTCYCLE.sql b/db/ddlutils/views/RV_PROJECTCYCLE.sql
new file mode 100644
index 0000000000..715d542d7d
--- /dev/null
+++ b/db/ddlutils/views/RV_PROJECTCYCLE.sql
@@ -0,0 +1,38 @@
+CREATE OR REPLACE VIEW RV_PROJECTCYCLE
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_CYCLE_ID, CYCLENAME, C_CURRENCY_ID,
+ C_CYCLESTEP_ID, CYCLESTEPNAME, SEQNO, RELATIVEWEIGHT, C_PHASE_ID,
+ PROJECTPHASENAME, C_PROJECTTYPE_ID, PROJECTTYPENAME, PROJECTVALUE, PROJECTNAME,
+ DESCRIPTION, NOTE, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, AD_USER_ID,
+ POREFERENCE, SALESREP_ID, M_WAREHOUSE_ID, PROJECTCATEGORY, DATECONTRACT,
+ DATEFINISH, ISCOMMITMENT, ISCOMMITCEILING, COMMITTEDQTY, COMMITTEDAMT,
+ PLANNEDQTY, PLANNEDAMT, PLANNEDMARGINAMT, INVOICEDAMT, INVOICEDQTY,
+ PROJECTBALANCEAMT)
+AS
+SELECT p.AD_Client_ID, p.AD_Org_ID, p.IsActive, p.Created,p.CreatedBy, p.Updated,p.UpdatedBy,
+ c.C_Cycle_ID, c.Name AS CycleName, c.C_Currency_ID,
+ cs.C_CycleStep_ID, cs.Name AS CycleStepName, cs.SeqNo, cs.RelativeWeight,
+ pp.C_Phase_ID, pp.Name AS ProjectPhaseName,
+ pt.C_ProjectType_ID, pt.Name AS ProjectTypeName,
+ p.Value AS ProjectValue, p.Name AS ProjectName, p.Description, p.Note,
+ p.C_BPartner_ID, p.C_BPartner_Location_ID, p.AD_User_ID, p.POReference,
+ p.SalesRep_ID, p.M_Warehouse_ID, p.ProjectCategory,
+ p.DateContract, p.DateFinish,
+ p.IsCommitment, p.IsCommitCeiling,
+ p.CommittedQty*cs.RelativeWeight AS CommittedQty,
+ currencyConvert (p.CommittedAmt, p.C_Currency_ID, c.C_Currency_ID, getdate(),0, p.AD_Client_ID, p.AD_Org_ID)*cs.RelativeWeight AS CommittedAmt,
+ p.PlannedQty*cs.RelativeWeight AS PlannedQty,
+ currencyConvert (p.PlannedAmt, p.C_Currency_ID, c.C_Currency_ID, getdate(),0, p.AD_Client_ID, p.AD_Org_ID)*cs.RelativeWeight AS PlannedAmt,
+ currencyConvert (p.PlannedMarginAmt, p.C_Currency_ID, c.C_Currency_ID, getdate(),0, p.AD_Client_ID, p.AD_Org_ID)*cs.RelativeWeight AS PlannedMarginAmt,
+ currencyConvert (p.InvoicedAmt, p.C_Currency_ID, c.C_Currency_ID, getdate(),0, p.AD_Client_ID, p.AD_Org_ID)*cs.RelativeWeight AS InvoicedAmt,
+ p.InvoicedQty*cs.RelativeWeight AS InvoicedQty,
+ currencyConvert (p.ProjectBalanceAmt, p.C_Currency_ID, c.C_Currency_ID, getdate(),0, p.AD_Client_ID, p.AD_Org_ID)*cs.RelativeWeight AS ProjectBalanceAmt
+FROM C_Cycle c
+ INNER JOIN C_CycleStep cs ON (c.C_Cycle_ID=cs.C_Cycle_ID)
+ INNER JOIN C_CyclePhase cp ON (cs.C_CycleStep_ID=cp.C_CycleStep_ID)
+ INNER JOIN C_Phase pp ON (cp.C_Phase_ID=pp.C_Phase_ID)
+ INNER JOIN C_Project p ON (cp.C_Phase_ID=p.C_Phase_ID)
+ INNER JOIN C_ProjectType pt ON (p.C_ProjectType_ID=pt.C_ProjectType_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_PROJECTLINEISSUE.sql b/db/ddlutils/views/RV_PROJECTLINEISSUE.sql
new file mode 100644
index 0000000000..86d431bd2b
--- /dev/null
+++ b/db/ddlutils/views/RV_PROJECTLINEISSUE.sql
@@ -0,0 +1,33 @@
+CREATE OR REPLACE VIEW RV_PROJECTLINEISSUE
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_PROJECT_ID, M_PRODUCT_ID, C_PROJECTLINE_ID,
+ LINE, DESCRIPTION, PLANNEDQTY, PLANNEDPRICE, PLANNEDAMT,
+ PLANNEDMARGINAMT, COMMITTEDQTY, C_PROJECTISSUE_ID, M_LOCATOR_ID, MOVEMENTQTY,
+ MOVEMENTDATE, ISSUELINE, ISSUEDESCRIPTION, M_INOUTLINE_ID, S_TIMEEXPENSELINE_ID,
+ C_ACCTSCHEMA_ID, ACCOUNT_ID, AMTSOURCEDR, AMTSOURCECR, AMTACCTDR,
+ AMTACCTCR, LINEMARGIN)
+AS
+SELECT COALESCE(l.AD_Client_ID,i.AD_Client_ID) AS AD_Client_ID,COALESCE(l.AD_Org_ID,i.AD_Org_ID) AS AD_Org_ID,
+ COALESCE(l.IsActive,i.IsActive) AS IsActive,
+ COALESCE(l.Created,i.Created) AS Created,COALESCE(l.CreatedBy,i.CreatedBy) AS CreatedBy,
+ COALESCE(l.Updated,i.Updated) AS Updated,COALESCE(l.UpdatedBy,i.UpdatedBy) AS UpdatedBy,
+ COALESCE(l.C_Project_ID,i.C_Project_ID) AS C_Project_ID,
+ COALESCE(l.M_Product_ID,i.M_Product_ID) AS M_Product_ID,
+ --
+ l.C_ProjectLine_ID, l.Line, l.Description, l.PlannedQty, l.PlannedPrice, l.PlannedAmt,
+ l.PlannedMarginAmt, l.CommittedQty,
+ --
+ i.C_ProjectIssue_ID, i.M_Locator_ID, i.MovementQty, i.MovementDate,
+ i.Line AS IssueLine, i.Description AS IssueDescription,
+ i.M_InOutLine_ID, i.S_TimeExpenseLine_ID,
+ --
+ fa.C_AcctSchema_ID, fa.Account_ID,
+ fa.AmtSourceDr, fa.AmtSourceCr, fa.AmtAcctDr, fa.AmtAcctCr,
+ --
+ l.PlannedAmt-fa.AmtSourceDr+fa.AmtSourceCr AS LineMargin
+FROM C_ProjectLine l
+ FULL JOIN C_ProjectIssue i ON (i.C_Project_ID=l.C_Project_ID AND i.C_ProjectIssue_ID=l.C_ProjectIssue_ID)
+ LEFT OUTER JOIN Fact_Acct fa ON (fa.AD_Table_ID=623 AND fa.Record_ID=i.C_ProjectIssue_ID AND fa.M_Locator_ID IS NULL);
+
+
+
diff --git a/db/ddlutils/views/RV_REQUESTUPDATES.sql b/db/ddlutils/views/RV_REQUESTUPDATES.sql
new file mode 100644
index 0000000000..bb8955347f
--- /dev/null
+++ b/db/ddlutils/views/RV_REQUESTUPDATES.sql
@@ -0,0 +1,46 @@
+CREATE OR REPLACE VIEW RV_REQUESTUPDATES
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, R_REQUEST_ID, AD_USER_ID, ISSELFSERVICE,
+ R_GROUP_ID, R_REQUESTTYPE_ID, R_CATEGORY_ID)
+AS
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ R_Request_ID, AD_User_ID, IsSelfService,
+ cast(NULL as integer) AS R_Group_ID, cast(NULL as integer) AS R_RequestType_ID,
+ cast(NULL as integer) AS R_Category_ID
+FROM R_RequestUpdates
+UNION
+SELECT u.AD_Client_ID, u.AD_Org_ID, u.IsActive, u.Created, u.CreatedBy, u.Updated, u.UpdatedBy,
+ r.R_Request_ID, u.AD_User_ID, u.IsSelfService,
+ r.R_Group_ID, NULL, NULL
+FROM R_GroupUpdates u
+ INNER JOIN R_Request r ON (u.R_Group_ID=r.R_Group_ID)
+UNION
+SELECT u.AD_Client_ID, u.AD_Org_ID, u.IsActive, u.Created, u.CreatedBy, u.Updated, u.UpdatedBy,
+ r.R_Request_ID, u.AD_User_ID, u.IsSelfService,
+ NULL, r.R_RequestType_ID, NULL
+FROM R_RequestTypeUpdates u
+ INNER JOIN R_Request r ON (u.R_RequestType_ID=r.R_RequestType_ID)
+UNION
+SELECT u.AD_Client_ID, u.AD_Org_ID, u.IsActive, u.Created, u.CreatedBy, u.Updated, u.UpdatedBy,
+ r.R_Request_ID, u.AD_User_ID, u.IsSelfService,
+ NULL, NULL, r.R_Category_ID
+FROM R_CategoryUpdates u
+ INNER JOIN R_Request r ON (u.R_Category_ID=r.R_Category_ID)
+UNION -- BP User
+SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
+ R_Request_ID, AD_User_ID, IsSelfService,
+ NULL, NULL, NULL
+FROM R_Request
+WHERE AD_User_ID IS NOT NULL
+UNION -- SalesRep
+SELECT u.AD_Client_ID, u.AD_Org_ID, u.IsActive, u.Created, u.CreatedBy, u.Updated, u.UpdatedBy,
+ r.R_Request_ID, u.AD_User_ID, NULL,
+ NULL, NULL, r.R_Category_ID
+FROM AD_User u
+ INNER JOIN R_Request r ON (u.AD_User_ID=r.SalesRep_ID)
+UNION -- Role
+SELECT r.AD_Client_ID, r.AD_Org_ID, u.IsActive, r.Created, r.CreatedBy, r.Updated, r.UpdatedBy,
+ r.R_Request_ID, u.AD_User_ID, NULL,
+ NULL, NULL, NULL
+FROM R_Request r
+ INNER JOIN AD_User_Roles u ON (u.AD_Role_ID=r.AD_Role_ID);
diff --git a/db/ddlutils/views/RV_REQUESTUPDATES_ONLY.sql b/db/ddlutils/views/RV_REQUESTUPDATES_ONLY.sql
new file mode 100644
index 0000000000..396f966359
--- /dev/null
+++ b/db/ddlutils/views/RV_REQUESTUPDATES_ONLY.sql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE VIEW RV_REQUESTUPDATES_ONLY
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, R_REQUEST_ID, AD_USER_ID)
+AS
+SELECT MIN(AD_Client_ID) AS AD_Client_ID, MIN(AD_Org_ID) AS AD_ORG_ID, 'Y' AS IsActive,
+ getdate() AS Created, 0 AS CreatedBy, getdate() AS Updated, 0 AS UpdatedBy,
+ R_Request_ID, AD_User_ID
+FROM RV_RequestUpdates
+WHERE IsActive='Y'
+GROUP BY R_Request_ID, AD_User_ID;
+
+
+
diff --git a/db/ddlutils/views/RV_REQUESTUPDATES_V.sql b/db/ddlutils/views/RV_REQUESTUPDATES_V.sql
new file mode 100644
index 0000000000..068e50c6b1
--- /dev/null
+++ b/db/ddlutils/views/RV_REQUESTUPDATES_V.sql
@@ -0,0 +1,13 @@
+CREATE OR REPLACE VIEW RV_REQUESTUPDATES_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, R_REQUEST_ID, AD_USER_ID)
+AS
+SELECT MIN(AD_Client_ID) AS AD_Client_ID, MIN(AD_Org_ID) AS AD_ORG_ID, 'Y' AS IsActive,
+ getdate() AS Created, 0 AS CreatedBy, getdate() AS Updated, 0 AS UpdatedBy,
+ R_Request_ID, AD_User_ID
+FROM RV_RequestUpdates
+WHERE IsActive='Y'
+GROUP BY R_Request_ID, AD_User_ID;
+
+
+
diff --git a/db/ddlutils/views/RV_STORAGE.sql b/db/ddlutils/views/RV_STORAGE.sql
new file mode 100644
index 0000000000..33d6c33ec0
--- /dev/null
+++ b/db/ddlutils/views/RV_STORAGE.sql
@@ -0,0 +1,32 @@
+CREATE OR REPLACE VIEW RV_STORAGE
+(AD_CLIENT_ID, AD_ORG_ID, M_PRODUCT_ID, VALUE, NAME,
+ DESCRIPTION, UPC, SKU, C_UOM_ID, M_PRODUCT_CATEGORY_ID,
+ CLASSIFICATION, WEIGHT, VOLUME, VERSIONNO, GUARANTEEDAYS,
+ GUARANTEEDAYSMIN, M_LOCATOR_ID, M_WAREHOUSE_ID, X, Y,
+ Z, QTYONHAND, QTYRESERVED, QTYAVAILABLE, QTYORDERED,
+ DATELASTINVENTORY, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO, LOT,
+ M_LOT_ID, GUARANTEEDATE, SHELFLIFEDAYS, GOODFORDAYS, SHELFLIFEREMAININGPCT)
+AS
+SELECT s.AD_Client_ID, s.AD_Org_ID,
+ -- Product
+ s.M_Product_ID,p.Value,p.Name,p.Description,p.UPC,p.SKU,
+ p.C_UOM_ID,p.M_Product_Category_ID,p.Classification, p.Weight,p.Volume,p.VersionNo,
+ p.GuaranteeDays,p.GuaranteeDaysMin,
+ -- Locator
+ s.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ -- Storage
+ s.QtyOnHand, s.QtyReserved, s.QtyOnHand-s.QtyReserved AS QtyAvailable,
+ s.QtyOrdered, s.DateLastInventory,
+ -- Instance
+ s.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,
+ asi.GuaranteeDate, -- see PAttributeInstance.java
+ daysBetween(asi.GuaranteeDate,getdate()) AS ShelfLifeDays,
+ daysBetween(asi.GuaranteeDate,getdate())-p.GuaranteeDaysMin AS GoodForDays,
+ ROUND((daysBetween(asi.GuaranteeDate,getdate())/p.GuaranteeDays)*100,0) AS ShelfLifeRemainingPct
+FROM M_Storage s
+ INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)
+ INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_TRANSACTION.sql b/db/ddlutils/views/RV_TRANSACTION.sql
new file mode 100644
index 0000000000..6720db2265
--- /dev/null
+++ b/db/ddlutils/views/RV_TRANSACTION.sql
@@ -0,0 +1,44 @@
+CREATE OR REPLACE VIEW RV_TRANSACTION
+(M_TRANSACTION_ID, AD_CLIENT_ID, AD_ORG_ID, MOVEMENTTYPE, MOVEMENTDATE,
+ MOVEMENTQTY, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO, LOT,
+ M_LOT_ID, GUARANTEEDATE, M_PRODUCT_ID, VALUE, NAME,
+ DESCRIPTION, UPC, SKU, C_UOM_ID, M_PRODUCT_CATEGORY_ID,
+ CLASSIFICATION, WEIGHT, VOLUME, VERSIONNO, M_LOCATOR_ID,
+ M_WAREHOUSE_ID, X, Y, Z, M_INVENTORYLINE_ID,
+ M_INVENTORY_ID, M_MOVEMENTLINE_ID, M_MOVEMENT_ID, M_INOUTLINE_ID, M_INOUT_ID,
+ M_PRODUCTIONLINE_ID, M_PRODUCTIONPLAN_ID, M_PRODUCTION_ID, C_PROJECTISSUE_ID, C_PROJECT_ID,
+ LINE)
+AS
+SELECT t.M_Transaction_ID, t.AD_Client_ID,t.AD_Org_ID,
+ t.MovementType,t.MovementDate,t.MovementQty,
+ -- Instance
+ t.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
+ -- Product
+ t.M_Product_ID,p.Value,p.Name,p.Description,p.UPC,p.SKU,
+ p.C_UOM_ID,p.M_Product_Category_ID,p.Classification, p.Weight,p.Volume,p.VersionNo,
+ -- Locator
+ t.M_Locator_ID, l.M_Warehouse_ID, l.X, l.Y, l.Z,
+ -- Inventory
+ t.M_InventoryLine_ID,il.M_Inventory_ID,
+ -- Movement
+ t.M_MovementLine_ID,ml.M_Movement_ID,
+ -- In/Out
+ t.M_InOutLine_ID,iol.M_InOut_ID,
+ -- Production
+ t.M_ProductionLine_ID,prdl.M_ProductionPlan_ID,prdp.M_Production_ID,
+ -- ProjectIssue
+ t.C_ProjectIssue_ID,pjl.C_Project_ID,
+ COALESCE(il.Line,ml.Line,iol.Line,prdl.Line,pjl.Line) AS Line
+FROM M_Transaction t
+ INNER JOIN M_Locator l ON (t.M_Locator_ID=l.M_Locator_ID)
+ INNER JOIN M_Product p ON (t.M_Product_ID=p.M_Product_ID)
+ LEFT OUTER JOIN M_AttributeSetInstance asi ON (t.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
+ LEFT OUTER JOIN M_InventoryLine il ON (t.M_InventoryLine_ID=il.M_InventoryLine_ID)
+ LEFT OUTER JOIN M_MovementLine ml ON (t.M_MovementLine_ID=ml.M_MovementLine_ID)
+ LEFT OUTER JOIN M_InOutLine iol ON (t.M_InOutLine_ID=iol.M_InOutLine_ID)
+ LEFT OUTER JOIN M_ProductionLine prdl ON (t.M_ProductionLine_ID=prdl.M_ProductionLine_ID)
+ LEFT OUTER JOIN M_ProductionPlan prdp ON (prdl.M_ProductionPlan_ID=prdp.M_ProductionPlan_ID)
+ LEFT OUTER JOIN C_ProjectIssue pjl ON (t.C_ProjectIssue_ID=pjl.C_ProjectIssue_ID);
+
+
+
diff --git a/db/ddlutils/views/RV_UNPOSTED.sql b/db/ddlutils/views/RV_UNPOSTED.sql
new file mode 100644
index 0000000000..ea12da8afe
--- /dev/null
+++ b/db/ddlutils/views/RV_UNPOSTED.sql
@@ -0,0 +1,68 @@
+CREATE OR REPLACE VIEW RV_UNPOSTED
+(AD_CLIENT_ID, AD_ORG_ID, CREATED, CREATEDBY, UPDATED,
+ UPDATEDBY, ISACTIVE, DOCUMENTNO, DATEDOC, DATEACCT,
+ AD_TABLE_ID, RECORD_ID, ISSOTRX)
+AS
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateDoc, DateAcct, 224 AS AD_Table_ID, GL_Journal_ID AS Record_ID, 'N' AS IsSOTrx
+FROM GL_Journal WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT pi.AD_Client_ID, pi.AD_Org_ID, pi.Created, pi.CreatedBy, pi.Updated, pi.UpdatedBy, pi. IsActive,
+ p.Name || '_' || pi.Line, pi.MovementDate, pi.MovementDate, 623, pi.C_ProjectIssue_ID, 'N'
+FROM C_ProjectIssue pi INNER JOIN C_Project p ON (pi.C_Project_ID=p.C_Project_ID)
+WHERE Posted<>'Y' --AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateInvoiced, DateAcct, 318, C_Invoice_ID, IsSOTrx
+FROM C_Invoice WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, MovementDate, DateAcct, 319, M_InOut_ID, IsSOTrx
+FROM M_InOut WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, MovementDate, MovementDate, 321, M_Inventory_ID, 'N'
+FROM M_Inventory WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, MovementDate, MovementDate, 323, M_Movement_ID, 'N'
+FROM M_Movement WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ Name, MovementDate, MovementDate, 325, M_Production_ID, 'N'
+FROM M_Production WHERE Posted<>'Y' -- AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ Name, StatementDate, DateAcct, 407, C_Cash_ID, 'N'
+FROM C_Cash WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateTrx, DateTrx, 335, C_Payment_ID, 'N'
+FROM C_Payment WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateTrx, DateTrx, 735, C_AllocationHdr_ID, 'N'
+FROM C_AllocationHdr WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ Name, StatementDate, StatementDate, 392, C_BankStatement_ID, 'N'
+FROM C_BankStatement WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateTrx, DateTrx, 472, M_MatchInv_ID, 'N'
+FROM M_MatchInv WHERE Posted<>'Y' --AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateTrx, DateTrx, 473, M_MatchPO_ID, 'N'
+FROM M_MatchPO WHERE Posted<>'Y' --AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateOrdered, DateAcct, 259, C_Order_ID, IsSOTrx
+FROM C_Order WHERE Posted<>'Y' AND DocStatus<>'VO'
+UNION
+SELECT AD_Client_ID, AD_Org_ID, Created, CreatedBy, Updated, UpdatedBy, IsActive,
+ DocumentNo, DateRequired, DateRequired, 702, M_Requisition_ID, 'N'
+FROM M_Requisition WHERE Posted<>'Y' AND DocStatus<>'VO';
+
+
+
diff --git a/db/ddlutils/views/RV_WAREHOUSEPRICE.sql b/db/ddlutils/views/RV_WAREHOUSEPRICE.sql
new file mode 100644
index 0000000000..e8bee47bc6
--- /dev/null
+++ b/db/ddlutils/views/RV_WAREHOUSEPRICE.sql
@@ -0,0 +1,39 @@
+CREATE OR REPLACE VIEW RV_WAREHOUSEPRICE
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, M_PRODUCT_ID, M_PRICELIST_VERSION_ID, M_WAREHOUSE_ID,
+ VALUE, NAME, UPC, SKU, C_UOM_ID,
+ UOMSYMBOL, PRICELIST, PRICESTD, MARGIN, PRICELIMIT,
+ WAREHOUSENAME, QTYAVAILABLE, QTYONHAND, QTYRESERVED, QTYORDERED,
+ ISINSTANCEATTRIBUTE)
+AS
+SELECT w.AD_Client_ID, w.AD_Org_ID,
+ CASE WHEN p.Discontinued='N' THEN 'Y' ELSE 'N' END AS IsActive,
+ pr.Created, pr.CreatedBy, pr.Updated, pr.UpdatedBy,
+ p.M_Product_ID, pr.M_PriceList_Version_ID, w.M_Warehouse_ID,
+ p.Value, p.Name, p.UPC, p.SKU,
+ uom.C_UOM_ID, uom.UOMSymbol,
+ bomPriceList(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceList,
+ bomPriceStd(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceStd,
+ bomPriceStd(p.M_Product_ID, pr.M_PriceList_Version_ID)-bomPriceLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS Margin,
+ bomPriceLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceLimit,
+ w.Name AS WarehouseName,
+ bomQtyAvailable(p.M_Product_ID,w.M_Warehouse_ID,0) AS QtyAvailable,
+ bomQtyOnHand(p.M_Product_ID,w.M_Warehouse_ID,0) AS QtyOnHand,
+ bomQtyReserved(p.M_Product_ID,w.M_Warehouse_ID,0) AS QtyReserved,
+ bomQtyOrdered(p.M_Product_ID,w.M_Warehouse_ID,0) AS QtyOrdered,
+ COALESCE (pa.IsInstanceAttribute, 'N') AS IsInstanceAttribute
+FROM M_Product p
+ INNER JOIN M_ProductPrice pr ON (p.M_Product_ID=pr.M_Product_ID)
+ INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
+ LEFT OUTER JOIN M_AttributeSet pa ON (p.M_AttributeSet_ID=pa.M_AttributeSet_ID)
+ INNER JOIN M_Warehouse w ON (p.AD_Client_ID=w.AD_Client_ID)
+WHERE p.IsSummary='N' AND p.IsActive='Y' AND pr.IsActive='Y' AND w.IsActive='Y';
+
+--AND pr.M_PriceList_Version_ID=?
+--AND w.M_Warehouse_ID=?
+--AND UPPER(p.Value) LIKE ? AND UPPER(p.Name) LIKE ?
+--AND UPPER(p.UPC) LIKE ? AND UPPER(p.SKU) LIKE ?
+--ORDER BY QtyAvailable DESC, Margin DESC;
+
+
+
diff --git a/db/ddlutils/views/R_REQUEST_V.sql b/db/ddlutils/views/R_REQUEST_V.sql
new file mode 100644
index 0000000000..ccff15ed1d
--- /dev/null
+++ b/db/ddlutils/views/R_REQUEST_V.sql
@@ -0,0 +1,30 @@
+CREATE OR REPLACE VIEW R_REQUEST_V
+(R_REQUEST_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
+ CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, R_REQUESTTYPE_ID,
+ R_GROUP_ID, R_CATEGORY_ID, R_STATUS_ID, R_RESOLUTION_ID, R_REQUESTRELATED_ID,
+ PRIORITY, PRIORITYUSER, DUETYPE, SUMMARY, CONFIDENTIALTYPE,
+ ISESCALATED, ISSELFSERVICE, SALESREP_ID, AD_ROLE_ID, DATELASTACTION,
+ DATELASTALERT, LASTRESULT, PROCESSED, ISINVOICED, C_BPARTNER_ID,
+ AD_USER_ID, C_CAMPAIGN_ID, C_ORDER_ID, C_INVOICE_ID, C_PAYMENT_ID,
+ M_PRODUCT_ID, C_PROJECT_ID, A_ASSET_ID, M_INOUT_ID, M_RMA_ID,
+ AD_TABLE_ID, RECORD_ID, REQUESTAMT, R_MAILTEXT_ID, RESULT,
+ CONFIDENTIALTYPEENTRY, R_STANDARDRESPONSE_ID, NEXTACTION, DATENEXTACTION, STARTTIME,
+ ENDTIME, QTYSPENT, QTYINVOICED, M_PRODUCTSPENT_ID, C_ACTIVITY_ID,
+ STARTDATE, CLOSEDATE, C_INVOICEREQUEST_ID, M_CHANGEREQUEST_ID, TASKSTATUS,
+ QTYPLAN, DATECOMPLETEPLAN, DATESTARTPLAN, M_FIXCHANGENOTICE_ID)
+AS
+SELECT R_REQUEST_ID,AD_CLIENT_ID,AD_ORG_ID,ISACTIVE,CREATED,CREATEDBY,UPDATED,UPDATEDBY,
+DOCUMENTNO,R_REQUESTTYPE_ID,R_GROUP_ID,R_CATEGORY_ID,R_STATUS_ID,R_RESOLUTION_ID,
+R_REQUESTRELATED_ID,PRIORITY,PRIORITYUSER,DUETYPE,SUMMARY,CONFIDENTIALTYPE,ISESCALATED,
+ISSELFSERVICE,SALESREP_ID,AD_ROLE_ID,DATELASTACTION,DATELASTALERT,LASTRESULT,PROCESSED,
+ISINVOICED,C_BPARTNER_ID,AD_USER_ID,C_CAMPAIGN_ID,C_ORDER_ID,C_INVOICE_ID,C_PAYMENT_ID,
+M_PRODUCT_ID,C_PROJECT_ID,A_ASSET_ID,M_INOUT_ID,M_RMA_ID,AD_TABLE_ID,RECORD_ID,REQUESTAMT,
+R_MAILTEXT_ID,RESULT,CONFIDENTIALTYPEENTRY,R_STANDARDRESPONSE_ID,NEXTACTION,DATENEXTACTION,
+STARTTIME,ENDTIME,QTYSPENT,QTYINVOICED,M_PRODUCTSPENT_ID,C_ACTIVITY_ID,STARTDATE,CLOSEDATE,
+C_INVOICEREQUEST_ID,M_CHANGEREQUEST_ID,TASKSTATUS,QTYPLAN,DATECOMPLETEPLAN,DATESTARTPLAN,M_FIXCHANGENOTICE_ID
+FROM R_Request
+WHERE IsActive='Y' AND Processed='N'
+ AND getdate() > DateNextAction;
+
+
+
diff --git a/db/ddlutils/views/T_INVOICEGL_V.sql b/db/ddlutils/views/T_INVOICEGL_V.sql
new file mode 100644
index 0000000000..3767f23707
--- /dev/null
+++ b/db/ddlutils/views/T_INVOICEGL_V.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW T_INVOICEGL_V
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, C_DOCTYPE_ID, C_ORDER_ID, DESCRIPTION, SALESREP_ID,
+ DATEINVOICED, DATEACCT, C_PAYMENTTERM_ID, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID,
+ AD_USER_ID, ISSELFSERVICE, C_CURRENCY_ID, C_CONVERSIONTYPE_ID, GRANDTOTAL,
+ ISTAXINCLUDED, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, AD_ORGTRX_ID,
+ USER1_ID, USER2_ID, C_LOCFROM_ID, C_LOCTO_ID, C_SALESREGION_ID,
+ FACT_ACCT_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID, C_PERIOD_ID, GL_CATEGORY_ID,
+ GL_BUDGET_ID, C_TAX_ID, M_LOCATOR_ID, POSTINGTYPE, AMTSOURCEDR,
+ AMTSOURCECR, AMTACCTDR, AMTACCTCR, C_UOM_ID, QTY,
+ AD_PINSTANCE_ID, APAR, OPENAMT, PERCENT, AMTREVALDR,
+ AMTREVALCR, DATEREVAL, C_CONVERSIONTYPEREVAL_ID, AMTSOURCEBALANCE, AMTACCTBALANCE,
+ C_DOCTYPEREVAL_ID, AMTREVALDRDIFF, AMTREVALCRDIFF, ISALLCURRENCIES, AMTACCTOPENDR,
+ AMTACCTOPENCR, AMTACCTOPENBALANCE)
+AS
+SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created,i.CreatedBy, i.Updated,i.UpdatedBy,
+ i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID, i.C_Order_ID,
+ i.Description, i.SalesRep_ID, i.DateInvoiced, i.DateAcct, i.C_PaymentTerm_ID,
+ i.C_BPartner_ID, i.C_BPartner_Location_ID, i.AD_User_ID, i.IsSelfService,
+ i.C_Currency_ID, i.C_ConversionType_ID, i.GrandTotal, i.IsTaxIncluded,
+-- References
+ i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID,
+ i.AD_OrgTrx_ID, i.User1_ID, i.User2_ID,
+ fa.C_LocFrom_ID, fa.C_LocTo_ID, fa.C_SalesRegion_ID,
+-- Accounting
+ fa.Fact_Acct_ID, fa.C_AcctSchema_ID, fa.Account_ID, fa.C_Period_ID, fa.GL_Category_ID, fa.GL_Budget_ID,
+ fa.C_Tax_ID, fa.M_Locator_ID,
+ fa.PostingType, fa.AmtSourceDr, fa.AmtSourceCr,
+ fa.AmtAcctDr, fa.AmtAcctCr,
+ fa.C_UOM_ID, fa.Qty,
+-- Gain/Loss
+ gl.AD_PInstance_ID, gl.APAR, gl.OpenAmt, gl.Percent,
+ gl.AmtRevalDr, gl.AmtRevalCr, gl.DateReval, gl.C_ConversionTypeReval_ID,
+ gl.AmtSourceBalance, gl.AmtAcctBalance,
+ gl.C_DocTypeReval_ID,
+ gl.AmtRevalDrDiff, gl.AmtRevalCrDiff, gl.IsAllCurrencies,
+ (fa.AmtAcctDr*gl.Percent/100) AS AmtAcctOpenDr, (fa.AmtAcctCr*gl.Percent/100) AS AmtAcctOpenCr,
+ ((fa.AmtAcctDr-fa.AmtAcctCr)*gl.Percent/100) AS AmtAcctOpenBalance
+FROM T_InvoiceGL gl
+ INNER JOIN C_Invoice i ON (gl.C_Invoice_ID=i.C_Invoice_ID)
+ INNER JOIN Fact_Acct fa ON (gl.Fact_Acct_ID=fa.Fact_Acct_ID);
+
+
+
diff --git a/db/ddlutils/views/T_INVOICEGL_VT.sql b/db/ddlutils/views/T_INVOICEGL_VT.sql
new file mode 100644
index 0000000000..4bafe5d55a
--- /dev/null
+++ b/db/ddlutils/views/T_INVOICEGL_VT.sql
@@ -0,0 +1,45 @@
+CREATE OR REPLACE VIEW T_INVOICEGL_VT
+(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
+ DOCSTATUS, C_DOCTYPE_ID, C_ORDER_ID, DESCRIPTION, SALESREP_ID,
+ DATEINVOICED, DATEACCT, C_PAYMENTTERM_ID, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID,
+ AD_USER_ID, ISSELFSERVICE, C_CURRENCY_ID, C_CONVERSIONTYPE_ID, GRANDTOTAL,
+ ISTAXINCLUDED, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, AD_ORGTRX_ID,
+ USER1_ID, USER2_ID, C_LOCFROM_ID, C_LOCTO_ID, C_SALESREGION_ID,
+ FACT_ACCT_ID, C_ACCTSCHEMA_ID, ACCOUNT_ID, C_PERIOD_ID, GL_CATEGORY_ID,
+ GL_BUDGET_ID, C_TAX_ID, M_LOCATOR_ID, POSTINGTYPE, AMTSOURCEDR,
+ AMTSOURCECR, AMTACCTDR, AMTACCTCR, C_UOM_ID, QTY,
+ AD_PINSTANCE_ID, APAR, OPENAMT, PERCENT, AMTREVALDR,
+ AMTREVALCR, DATEREVAL, C_CONVERSIONTYPEREVAL_ID, AMTSOURCEBALANCE, AMTACCTBALANCE,
+ C_DOCTYPEREVAL_ID, AMTREVALDRDIFF, AMTREVALCRDIFF, ISALLCURRENCIES, AMTACCTOPENDR,
+ AMTACCTOPENCR, AMTACCTOPENBALANCE)
+AS
+SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created,i.CreatedBy, i.Updated,i.UpdatedBy,
+ i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID, i.C_Order_ID,
+ i.Description, i.SalesRep_ID, i.DateInvoiced, i.DateAcct, i.C_PaymentTerm_ID,
+ i.C_BPartner_ID, i.C_BPartner_Location_ID, i.AD_User_ID, i.IsSelfService,
+ i.C_Currency_ID, i.C_ConversionType_ID, i.GrandTotal, i.IsTaxIncluded,
+-- References
+ i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID,
+ i.AD_OrgTrx_ID, i.User1_ID, i.User2_ID,
+ fa.C_LocFrom_ID, fa.C_LocTo_ID, fa.C_SalesRegion_ID,
+-- Accounting
+ fa.Fact_Acct_ID, fa.C_AcctSchema_ID, fa.Account_ID, fa.C_Period_ID, fa.GL_Category_ID, fa.GL_Budget_ID,
+ fa.C_Tax_ID, fa.M_Locator_ID,
+ fa.PostingType, fa.AmtSourceDr, fa.AmtSourceCr,
+ fa.AmtAcctDr, fa.AmtAcctCr,
+ fa.C_UOM_ID, fa.Qty,
+-- Gain/Loss
+ gl.AD_PInstance_ID, gl.APAR, gl.OpenAmt, gl.Percent,
+ gl.AmtRevalDr, gl.AmtRevalCr, gl.DateReval, gl.C_ConversionTypeReval_ID,
+ gl.AmtSourceBalance, gl.AmtAcctBalance,
+ gl.C_DocTypeReval_ID,
+ gl.AmtRevalDrDiff, gl.AmtRevalCrDiff, gl.IsAllCurrencies,
+ (fa.AmtAcctDr*gl.Percent/100) AS AmtAcctOpenDr, (fa.AmtAcctCr*gl.Percent/100) AS AmtAcctOpenCr,
+ ((fa.AmtAcctDr-fa.AmtAcctCr)*gl.Percent/100) AS AmtAcctOpenBalance
+FROM T_InvoiceGL gl
+ INNER JOIN C_Invoice i ON (gl.C_Invoice_ID=i.C_Invoice_ID)
+ INNER JOIN Fact_Acct fa ON (gl.Fact_Acct_ID=fa.Fact_Acct_ID);
+
+
+