diff --git a/PROYECTO/MBSVG240-marmodesarrollador.4pw b/PROYECTO/MBSVG240-marmodesarrollador.4pw
deleted file mode 100644
index 92003d7..0000000
--- a/PROYECTO/MBSVG240-marmodesarrollador.4pw
+++ /dev/null
@@ -1,2281 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/PROYECTO/MBSVG240-marmotecnologia.4pw b/PROYECTO/MBSVG240-marmotecnologia.4pw
deleted file mode 100644
index 2a283a5..0000000
--- a/PROYECTO/MBSVG240-marmotecnologia.4pw
+++ /dev/null
@@ -1,2271 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/PROYECTO/PRDIR/prprmt008.4gl b/PROYECTO/PRDIR/prprmt008.4gl
index 20e7395..8ab0f28 100644
--- a/PROYECTO/PRDIR/prprmt008.4gl
+++ b/PROYECTO/PRDIR/prprmt008.4gl
@@ -64,7 +64,7 @@ GLOBALS "prprgb000.4gl"
nombre_vend,nombres,apellidos CHAR(40),fcalle CHAR(25),
fcasa_num CHAR(5), fbarrio,furbanizacion CHAR(15),
monto_desc,total1,p_costos1,total_i,total_mo DECIMAL(12,2),
- ult_numero,cuenta INTEGER,
+ ult_numero,cuenta,existe_oc INTEGER,
vetb05 RECORD LIKE vetb00005.*,
cuenta_p,ridx SMALLINT,
pbalance1,pbalance2 DEC(12,2),
@@ -798,19 +798,26 @@ FUNCTION prpcad008()
# SE COLOCO QUE EL NUMERO SE GENERARA A PARTIR DEL 01/01/2003 HACIA ATRAS POR MODIFICACION DEL
# SISTEMA Y LA INCLUSION DEL NCF A PARTIR DEL 01/01/2007
# FECHA MODIFICACION: 11/01/2007
- SELECT num_oc INTO ult_numero FROM prtb00020
IF nuevo = "S" THEN
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
- LET prtb08.num_oc = ult_numero
- DISPLAY BY NAME prtb08.num_oc
-
- UPDATE prtb00020 set num_oc = ult_numero,
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia y luego se escribia -> PK_prtb00012 duplicada)
+ BEGIN WORK
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1,
us_crea = SUSER_SNAME(),
fech_crea = GETDATE()
-
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre
+ LET existe_oc = 0
+ SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
+ COMMIT WORK
+ LET prtb08.num_oc = ult_numero
+ DISPLAY BY NAME prtb08.num_oc
+
{ CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of,
doble_on,doble_off,comp_on,comp_off,
doce,normal,archivo,copia1
@@ -851,9 +858,8 @@ CALL seleccionarsalida() RETURNING r_output
fech_crea = GETDATE()
WHERE @num_oc = prtb09.num_oc
- UPDATE prtb00020 SET num_oc = ult_numero,
- us_Crea = SUSER_SNAME(),
- fech_crea = GETDATE()
+ # (se elimino la re-escritura de prtb00020 aqui: el consecutivo ya se tomo
+ # arriba de forma atomica y re-escribirlo podia retroceder el contador)
# ACTUALIZA NUMERO TEMPORAL PARA EL DESPIECE
UPDATE prtb00022 SET num_oc = prtb08.num_oc WHERE num_oc = tmpnumero
diff --git a/PROYECTO/addir/Manual_Usuario_Accion_Personal_Capacitacion_Desvinculacion.docx b/PROYECTO/addir/Manual_Usuario_Accion_Personal_Capacitacion_Desvinculacion.docx
new file mode 100644
index 0000000..69c1ccb
Binary files /dev/null and b/PROYECTO/addir/Manual_Usuario_Accion_Personal_Capacitacion_Desvinculacion.docx differ
diff --git a/PROYECTO/addir/adfmmt017.4fd b/PROYECTO/addir/adfmmt017.4fd
index a303cde..8913a18 100644
--- a/PROYECTO/addir/adfmmt017.4fd
+++ b/PROYECTO/addir/adfmmt017.4fd
@@ -59,7 +59,7 @@
-
+
@@ -79,7 +79,7 @@
-
+
@@ -100,10 +100,12 @@
-
+
+
+
diff --git a/PROYECTO/addir/adfmrp048.per b/PROYECTO/addir/adfmrp048.per
new file mode 100644
index 0000000..b44ddcf
--- /dev/null
+++ b/PROYECTO/addir/adfmrp048.per
@@ -0,0 +1,33 @@
+{
+------------------------------------------------------------------------
+ FORMULARIO : ADFMRP048
+ OBJETIVO : Parametros del reporte de horas de capacitacion por
+ colaborador. Es utilizada por: ADPRRP048
+ FECHA REALIZACION : Octubre 05, 2026
+------------------------------------------------------------------------
+}
+LAYOUT (TEXT="HORAS DE CAPACITACION POR COLABORADOR", STYLE="basic")
+GRID
+{
+
+ Fecha desde [f001 ] Hasta [f002 ]
+ Departamento [f003 ]
+ Ficha (opcional) [f004 ]
+ Filtro [f005]
+}
+END
+ATTRIBUTES
+DATEEDIT f001 = formonly.fecha_ini TYPE DATE, FORMAT="dd/mm/yyyy", REQUIRED,
+ COMMENT="Fecha de inicio de la capacitacion (plan o ejecucion)";
+DATEEDIT f002 = formonly.fecha_fin TYPE DATE, FORMAT="dd/mm/yyyy", REQUIRED;
+COMBOBOX f003 = formonly.departamento TYPE SMALLINT, NOT NULL,
+ COMMENT="Departamento del colaborador (TODOS = toda la empresa)";
+EDIT f004 = formonly.num_emp TYPE INTEGER,
+ COMMENT="Deje en blanco para todos los colaboradores";
+CHECKBOX f005 = formonly.solo_pend, VALUECHECKED="S", VALUEUNCHECKED="N",
+ TEXT="Solo colaboradores con horas pendientes",
+ COMMENT="Muestra solo a quienes tienen capacitaciones requeridas sin cubrir en el periodo";
+END
+INSTRUCTIONS
+DELIMITERS " "
+END
diff --git a/PROYECTO/addir/adfmrp049.per b/PROYECTO/addir/adfmrp049.per
new file mode 100644
index 0000000..7b15efa
--- /dev/null
+++ b/PROYECTO/addir/adfmrp049.per
@@ -0,0 +1,31 @@
+{
+------------------------------------------------------------------------
+ FORMULARIO : ADFMRP049
+ OBJETIVO : Parametros del reporte de rotacion laboral.
+ Es utilizada por: ADPRRP049
+ FECHA REALIZACION : Octubre 05, 2026
+------------------------------------------------------------------------
+}
+LAYOUT (TEXT="ROTACION LABORAL", STYLE="basic")
+GRID
+{
+
+ Ano desde [f001 ] Hasta [f002 ]
+ Departamento [f003 ]
+ Tipo de empleado [f004 ]
+ Formato [f005 ]
+}
+END
+ATTRIBUTES
+EDIT f001 = formonly.ano_ini TYPE SMALLINT, REQUIRED;
+EDIT f002 = formonly.ano_fin TYPE SMALLINT, REQUIRED;
+COMBOBOX f003 = formonly.departamento TYPE SMALLINT, NOT NULL,
+ COMMENT="Departamento (TODOS = toda la empresa)";
+COMBOBOX f004 = formonly.tipo_emp, NOT NULL,
+ ITEMS=(("TODOS","TODOS"),("NORMAL","NORMAL"),("TEMPORERO","TEMPORERO"));
+COMBOBOX f005 = formonly.formato, NOT NULL,
+ ITEMS=(("R","RESUMEN MENSUAL"),("D","DETALLE DE SALIDAS POR CAUSA"));
+END
+INSTRUCTIONS
+DELIMITERS " "
+END
diff --git a/PROYECTO/addir/adfmwd017.per b/PROYECTO/addir/adfmwd017.per
new file mode 100644
index 0000000..4de59c8
--- /dev/null
+++ b/PROYECTO/addir/adfmwd017.per
@@ -0,0 +1,49 @@
+{
+------------------------------------------------------------------------
+ FORMULARIO : ADFMWD017
+ OBJETIVO : Ventana de capacitacion (requerida / tomada) de la
+ Accion de Personal. Es utilizada por: ADPRMT017
+ FECHA REALIZACION : Octubre 05, 2026
+------------------------------------------------------------------------
+}
+LAYOUT (TEXT="CAPACITACION DEL EMPLEADO")
+GRID
+{
+
+ Movimiento [f001 ]
+ Requerida a cubrir [f002 ]
+ Capacitacion [f003 ]
+ [b01 ]
+ Tipo de evento [f004 ]
+ Horas requeridas [f005 ]
+ Fecha inicio [f006 ] Fecha fin [f007 ]
+ Horas tomadas [f008 ]
+ Institucion/Facilitador [f009 ]
+ Costo [f010 ]
+
+
+ Requeridas [t001 ] Tomadas [t002 ] Pendientes [t003 ]
+}
+END
+ATTRIBUTES
+EDIT f001 = formonly.tipo_desc, NOENTRY, COLOR=BLUE;
+COMBOBOX f002 = formonly.id_requerida TYPE INTEGER,
+ COMMENT="Capacitacion requerida pendiente que cubre esta capacitacion tomada";
+COMBOBOX f003 = formonly.cod_cap TYPE INTEGER,
+ COMMENT="Seleccione la capacitacion. Si no existe use el boton Nuevo curso";
+BUTTON b01 : nuevo_curso, TEXT="Nuevo curso";
+COMBOBOX f004 = formonly.evento TYPE SMALLINT, NOENTRY,
+ ITEMS=((1,"SEMINARIO"),(2,"CURSO"),(3,"TALLER"),(4,"CONFERENCIA"));
+EDIT f005 = formonly.horas_req TYPE DECIMAL(6,2), FORMAT="##&.&&";
+DATEEDIT f006 = formonly.fecha_ini TYPE DATE, FORMAT="dd/mm/yyyy";
+DATEEDIT f007 = formonly.fecha_fin TYPE DATE, FORMAT="dd/mm/yyyy";
+EDIT f008 = formonly.horas_tom TYPE DECIMAL(6,2), FORMAT="##&.&&";
+EDIT f009 = formonly.institucion, UPSHIFT;
+EDIT f010 = formonly.costo TYPE DECIMAL(12,2), FORMAT="###,##&.&&";
+EDIT t001 = formonly.trq TYPE DECIMAL(8,2), NOENTRY, COLOR=BLUE, FORMAT="###&.&&";
+EDIT t002 = formonly.ttm TYPE DECIMAL(8,2), NOENTRY, COLOR=BLUE, FORMAT="###&.&&";
+EDIT t003 = formonly.tpd TYPE DECIMAL(8,2), NOENTRY, COLOR=RED, FORMAT="###&.&&";
+END
+INSTRUCTIONS
+DELIMITERS " "
+END
diff --git a/PROYECTO/addir/adfmwd018.per b/PROYECTO/addir/adfmwd018.per
new file mode 100644
index 0000000..8e52216
--- /dev/null
+++ b/PROYECTO/addir/adfmwd018.per
@@ -0,0 +1,32 @@
+{
+------------------------------------------------------------------------
+ FORMULARIO : ADFMWD018
+ OBJETIVO : Ventana de desvinculacion (causa de salida) de la
+ Accion de Personal. Es utilizada por: ADPRMT017
+ FECHA REALIZACION : Octubre 05, 2026
+------------------------------------------------------------------------
+}
+LAYOUT (TEXT="DESVINCULACION DEL EMPLEADO")
+GRID
+{
+
+ Fecha de salida [f001 ]
+ Causa [f002 ]
+ Clasificacion [f003 ]
+ Recontratable [f004]
+ Detalle [f005 ]
+ [f005 ]
+}
+END
+ATTRIBUTES
+DATEEDIT f001 = formonly.fecha_salida TYPE DATE, FORMAT="dd/mm/yyyy",
+ COMMENT="Ultimo dia laborado";
+COMBOBOX f002 = formonly.cod_causa TYPE SMALLINT,
+ COMMENT="Causa de la salida (se usa para el indicador de rotacion)";
+EDIT f003 = formonly.clase_desc, NOENTRY, COLOR=BLUE;
+COMBOBOX f004 = formonly.recontratable, ITEMS=(("S","SI"),("N","NO"));
+TEXTEDIT f005 = formonly.detalle, UPSHIFT, SCROLLBARS=NONE, STRETCH=X;
+END
+INSTRUCTIONS
+DELIMITERS " "
+END
diff --git a/PROYECTO/addir/adfmwd019.per b/PROYECTO/addir/adfmwd019.per
new file mode 100644
index 0000000..c01bfe5
--- /dev/null
+++ b/PROYECTO/addir/adfmwd019.per
@@ -0,0 +1,29 @@
+{
+------------------------------------------------------------------------
+ FORMULARIO : ADFMWD019
+ OBJETIVO : Alta de una capacitacion en el catalogo (adtb00059)
+ desde la ventana de capacitacion. Es utilizada por:
+ ADPRMT017 (boton Nuevo curso)
+ FECHA REALIZACION : Octubre 05, 2026
+------------------------------------------------------------------------
+}
+LAYOUT (TEXT="NUEVA CAPACITACION")
+GRID
+{
+
+ Nombre [f001 ]
+ Tipo de evento [f002 ]
+ Horas estandar [f003 ]
+}
+END
+ATTRIBUTES
+EDIT f001 = formonly.nom_cap, UPSHIFT, REQUIRED,
+ COMMENT="Nombre de la capacitacion (revise antes que no exista en la lista)";
+COMBOBOX f002 = formonly.evento TYPE SMALLINT, NOT NULL,
+ ITEMS=((1,"SEMINARIO"),(2,"CURSO"),(3,"TALLER"),(4,"CONFERENCIA"));
+EDIT f003 = formonly.horas TYPE DECIMAL(6,2), FORMAT="##&.&&",
+ COMMENT="Horas que dura normalmente esta capacitacion";
+END
+INSTRUCTIONS
+DELIMITERS " "
+END
diff --git a/PROYECTO/addir/adprmt017.4gl b/PROYECTO/addir/adprmt017.4gl
index 2baf358..30dab79 100644
--- a/PROYECTO/addir/adprmt017.4gl
+++ b/PROYECTO/addir/adprmt017.4gl
@@ -44,6 +44,38 @@ DEFINE vacacion RECORD
tipo_sueldo CHAR(20),
proporcion_vacaciones,salario_quincenal DEC(12,2)
+#### VARIABLES PARA MODULO DE CAPACITACION (2026-10-05) ##########
+#### tipo_mov 'CAPACITACION REQUERIDA' / 'CAPACITACION TOMADA'
+#### detalle en adtb00060, catalogo en adtb00059 (adprmt017_capacitacion.sql)
+DEFINE capac RECORD
+ tipo_desc VARCHAR(30),
+ id_requerida INTEGER,
+ cod_cap INTEGER,
+ evento SMALLINT,
+ horas_req DEC(6,2),
+ fecha_ini DATE,
+ fecha_fin DATE,
+ horas_tom DEC(6,2),
+ institucion VARCHAR(100),
+ costo DEC(12,2)
+ END RECORD
+DEFINE cap_tot RECORD
+ trq, ttm, tpd DEC(8,2)
+ END RECORD
+#### VARIABLES PARA DESVINCULACION (2026-10-05) ##########
+#### tipo_mov 'CANCELAR' (mov. 4 DESVINCULAR) / 'DESVINCULAR' / 'TERMINO'
+#### detalle en adtb00062, causas en adtb00061 (adprmt017_desvinculacion.sql)
+DEFINE desv RECORD
+ fecha_salida DATE,
+ cod_causa SMALLINT,
+ clase_desc VARCHAR(20),
+ recontratable CHAR(1),
+ detalle VARCHAR(200)
+ END RECORD
+DEFINE realiza_desvinculacion BOOLEAN
+DEFINE realiza_capacitacion BOOLEAN,
+ cap_sql STRING
+
#### MODULO MENU GENERAL DE ACCION DE NOMINA #####
MAIN
@@ -479,6 +511,28 @@ FUNCTION adpcad017()
END IF
END IF
+## LLAMA LA VENTANA DE CAPACITACION (REQUERIDA / TOMADA)
+ IF xtipo = "CAPACITACION REQUERIDA" OR xtipo = "CAPACITACION TOMADA" THEN
+ CALL capacitacion('A') RETURNING realiza_capacitacion
+ IF NOT realiza_capacitacion THEN
+ RETURN
+ END IF
+ NEXT FIELD observacion
+ END IF
+
+## LLAMA LA VENTANA DE DESVINCULACION (CAUSA DE SALIDA)
+ IF es_desvinculacion(xtipo) THEN
+ IF empleado_desactivado(acc_per.num_emp) THEN
+ CALL fgl_winmessage("INFO","ESTE EMPLEADO YA ESTA DESACTIVADO","info")
+ NEXT FIELD num_emp
+ END IF
+ CALL desvinculacion('A') RETURNING realiza_desvinculacion
+ IF NOT realiza_desvinculacion THEN
+ RETURN
+ END IF
+ NEXT FIELD observacion
+ END IF
+
AFTER FIELD sueldo_ac
IF acc_per.sueldo_ac IS NULL OR acc_per.sueldo_ac < 0 THEN
LET numero_msg = 16
@@ -666,9 +720,18 @@ FUNCTION adpcad017()
RETURN
END IF
-## SE ASEGURA DE QUE TODA LA INFORMACION ESTE CORRECTA
- PROMPT "Informacion Correcta? (S/N).." FOR CHAR opt
- LET opt = UPSHIFT(opt)
+## SE ASEGURA DE QUE TODA LA INFORMACION ESTE CORRECTA
+ IF fgl_winquestion("ACCION DE PERSONAL","La informacion esta correcta? Desea grabar la accion?",
+ "YES","YES|NO","question",0) = "YES" THEN
+ LET opt = "S"
+ ELSE
+ LET opt = "N"
+ # Antes de 2026-10-05 un "N" seguia de largo: mensaje de grabado,
+ # UPDATE de adtb00028 con num_trx nulo y pregunta de impresion.
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ RETURN
+ END IF
## SI NO HA OCURRIDO NINGUN PROBLEMA SE PROCEDE A INSERTAR LA INFORMACION
## EN LA TABLA DE ACCION DE PERSONAL
@@ -751,8 +814,17 @@ FUNCTION adpcad017()
VALUES (vacacion.num_nomi,acc_per.nomina,acc_per.num_emp,acc_per.departamento,acc_per.departamento,acc_per.nivel_emp,
acc_per.cod_puesto,vacacion.cod_mov2,salario_quincenal,usuarios,getdate(),
acc_per.num_trx,acc_per.cod_mto)
- END IF
-
+ END IF
+
+ END IF
+
+ IF xtipo = "CAPACITACION REQUERIDA" OR xtipo = "CAPACITACION TOMADA" THEN
+ CALL graba_capacitacion()
+ END IF
+
+## DESVINCULACION: DESACTIVA AL EMPLEADO (status_t = 'D') Y GUARDA LA CAUSA
+ IF es_desvinculacion(xtipo) THEN
+ CALL graba_desvinculacion()
END IF
################## DATOS PARA INSERTAR O MODIFICAR PETB00003 ############
@@ -877,16 +949,9 @@ FUNCTION adpcad017()
COMMIT WORK
END IF
-## ACTUALIZA LA TABLA DE EMPLEADOS EN CUANTO AL MOVIMIENTO DE LAS TERMINACIONES
-## DE LA ACCION DE PERSONAL
-
- IF xtipo = "TERMINO" THEN
- UPDATE adtb00003 SET status_t = "T"
- WHERE num_emp = acc_per.num_emp
-
- UPDATE adtb00021 SET status_t = "T"
- WHERE num_emp = acc_per.num_emp
- END IF
+## LAS TERMINACIONES (TERMINO/CANCELAR/DESVINCULAR) SE GRABAN DENTRO DE LA
+## TRANSACCION EN graba_desvinculacion() (2026-10-05). Antes ponia status_t='T'
+## pero el movimiento existente es 'CANCELAR' y nunca entraba aqui.
## ACTUALIZA LA TABLA DE SECUENCIA NUMERICA
UPDATE adtb00028 SET num_trx = acc_per.num_trx
@@ -895,19 +960,28 @@ FUNCTION adpcad017()
LET numero_msg = 1
CALL msg(numero_msg)
CLEAR FORM
- LABEL preg:
-
- PROMPT "Desea Imprimir Este Documento (S/N)?..." FOR CHAR optt
- LET optt = UPSHIFT(optt)
- IF optt IS NULL OR (optt != "S" AND optt != "N") THEN
- GOTO preg
- END IF
+ IF fgl_winquestion("ACCION DE PERSONAL","Accion grabada. Desea imprimir el documento?",
+ "NO","YES|NO","question",0) = "YES" THEN
+ LET optt = "S"
+ ELSE
+ LET optt = "N"
+ END IF
IF optt = "S" THEN
- CALL configureoutput("PDF") RETURNING handler
- START REPORT imp_accion TO XML HANDLER handler
- OUTPUT TO REPORT imp_accion()
- FINISH REPORT imp_accion
- RUN imprime
+ # 2026-10-05: antes usaba configureoutput("PDF"), que carga el motor
+ # SIN diseno (loadCurrentSettings(NULL)) -> PDF en blanco. Ahora usa
+ # el mismo adprmt017.4rp que la consulta.
+ IF fgl_report_loadCurrentSettings("adprmt017.4rp") THEN
+ CALL fgl_report_selectDevice("PDF")
+ CALL fgl_report_selectPreview(TRUE)
+ LET handler = fgl_report_commitCurrentSettings()
+ IF handler IS NOT NULL THEN
+ START REPORT imp_accion TO XML HANDLER handler
+ OUTPUT TO REPORT imp_accion()
+ FINISH REPORT imp_accion
+ END IF
+ ELSE
+ CALL fgl_winmessage("INFO","No se pudo cargar el diseno adprmt017.4rp","stop")
+ END IF
END IF
END FUNCTION
@@ -1559,7 +1633,13 @@ FUNCTION adpcmf017()
UPDATE notb00007 SET status_t ="E",
us_mod = usuarios,
fech_mod = getdate()
- WHERE num_trx = acc_per.num_trx AND cod_mto = acc_per.cod_mto
+ WHERE num_trx = acc_per.num_trx AND cod_mto = acc_per.cod_mto
+ IF xtipo = "CAPACITACION REQUERIDA" OR xtipo = "CAPACITACION TOMADA" THEN
+ CALL anula_capacitacion(acc_per.num_trx)
+ END IF
+ IF es_desvinculacion(xtipo) THEN
+ CALL anula_desvinculacion(acc_per.num_trx, acc_per.num_emp)
+ END IF
COMMIT WORK
LET numero_msg = 39
CALL msg(numero_msg)
@@ -1704,8 +1784,19 @@ nombre5 clipped," ",nombre6 clipped," ",apellido5 clipped," ",apellido6 clipped
END IF
CALL vacaciones('C') RETURNING realiza_vacaciones # CUANDO ESTA CONSULTANDO ES 'C' Y ADICIONANDO ES 'A'
-
-
+
+
+ END IF
+ ## DATOS CAPACITACION
+ IF xtipo = "CAPACITACION REQUERIDA" OR xtipo = "CAPACITACION TOMADA" THEN
+ CALL carga_capacitacion(acc_per.num_trx)
+ CALL capacitacion('C') RETURNING realiza_capacitacion
+ END IF
+ ## DATOS DESVINCULACION
+ IF es_desvinculacion(xtipo) THEN
+ IF carga_desvinculacion(acc_per.num_trx) THEN
+ CALL desvinculacion('C') RETURNING realiza_desvinculacion
+ END IF
END IF
@@ -1946,7 +2037,574 @@ FUNCTION vacaciones(operacion)
END IF
END FUNCTION
-## VENTANA DE LOS NIVELES DEL LOS EMPLEADOS
+##################################################################
+## CAPACITACION (2026-10-05)
+## 'CAPACITACION REQUERIDA' : plan de horas por empleado (tipo_reg 'R')
+## 'CAPACITACION TOMADA' : horas ejecutadas (tipo_reg 'T'), puede
+## cubrir una requerida (id_requerida)
+## Tablas adtb00059/adtb00060 via SQL dinamico (no estan en smarmotech.sch)
+##################################################################
+FUNCTION capacitacion(operacion)
+ DEFINE operacion VARCHAR(1),
+ es_requerida BOOLEAN,
+ pend DEC(8,2),
+ xcod INTEGER,
+ xnum INTEGER
+
+ LET int_flag = FALSE
+ LET es_requerida = (xtipo = "CAPACITACION REQUERIDA")
+
+ OPEN WINDOW adwindow17 AT 10,12 WITH FORM "adfmwd017"
+ ATTRIBUTE(BORDER,FORM LINE FIRST + 2)
+
+ CALL combo_capacitaciones()
+ CALL combo_requeridas(acc_per.num_emp, operacion = 'C')
+ CALL totales_capacitacion(acc_per.num_emp)
+
+ IF operacion = 'A' THEN
+ INITIALIZE capac.* TO NULL
+ LET capac.tipo_desc = xtipo
+ LET capac.fecha_ini = acc_per.fech_efec
+
+ INPUT BY NAME capac.* WITHOUT DEFAULTS ATTRIBUTE(UNBUFFERED)
+ BEFORE INPUT
+ DISPLAY BY NAME cap_tot.*
+ IF es_requerida THEN
+ CALL DIALOG.setFieldActive("id_requerida", FALSE)
+ CALL DIALOG.setFieldActive("horas_tom", FALSE)
+ CALL DIALOG.setFieldActive("fecha_fin", FALSE)
+ ELSE
+ CALL DIALOG.setFieldActive("horas_req", FALSE)
+ END IF
+
+ ON CHANGE id_requerida
+ IF capac.id_requerida IS NOT NULL THEN
+ CALL datos_requerida(capac.id_requerida)
+ RETURNING capac.cod_cap, capac.evento, pend
+ LET capac.horas_req = pend
+ IF capac.horas_tom IS NULL THEN
+ LET capac.horas_tom = pend
+ END IF
+ CALL DIALOG.setFieldActive("cod_cap", FALSE)
+ ELSE
+ LET capac.cod_cap = NULL
+ LET capac.evento = NULL
+ LET capac.horas_req = NULL
+ CALL DIALOG.setFieldActive("cod_cap", TRUE)
+ END IF
+
+ ON CHANGE cod_cap
+ IF capac.cod_cap IS NOT NULL THEN
+ CALL datos_curso(capac.cod_cap) RETURNING capac.evento, pend
+ IF es_requerida THEN
+ LET capac.horas_req = pend
+ ELSE
+ IF capac.horas_tom IS NULL THEN
+ LET capac.horas_tom = pend
+ END IF
+ END IF
+ END IF
+
+ ON ACTION nuevo_curso
+ CALL nuevo_curso() RETURNING xcod
+ IF xcod IS NOT NULL THEN
+ CALL combo_capacitaciones()
+ LET capac.cod_cap = xcod
+ CALL datos_curso(capac.cod_cap) RETURNING capac.evento, pend
+ IF es_requerida THEN
+ LET capac.horas_req = pend
+ ELSE
+ LET capac.horas_tom = pend
+ END IF
+ END IF
+
+ AFTER INPUT
+ IF int_flag THEN
+ EXIT INPUT
+ END IF
+ IF capac.cod_cap IS NULL THEN
+ CALL fgl_winmessage("INFO","DEBE SELECCIONAR LA CAPACITACION","info")
+ NEXT FIELD cod_cap
+ END IF
+ IF es_requerida THEN
+ IF capac.horas_req IS NULL OR capac.horas_req <= 0 THEN
+ CALL fgl_winmessage("INFO","DEBE INDICAR LAS HORAS REQUERIDAS","info")
+ NEXT FIELD horas_req
+ END IF
+ # Evita duplicar una requerida que todavia esta pendiente
+ LET xnum = 0
+ LET cap_sql =
+ "SELECT COUNT(*) FROM adtb00060 r WHERE r.num_emp = ? AND r.cod_cap = ? ",
+ " AND r.tipo_reg = 'R' AND r.status_t IS NULL ",
+ " AND r.horas_req > ISNULL((SELECT SUM(t.horas_tom) FROM adtb00060 t ",
+ " WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0)"
+ PREPARE p_cap_dup FROM cap_sql
+ EXECUTE p_cap_dup INTO xnum USING acc_per.num_emp, capac.cod_cap
+ IF xnum > 0 THEN
+ IF fgl_winquestion("INFO",
+ "ESTE EMPLEADO YA TIENE ESTA CAPACITACION REQUERIDA PENDIENTE. DESEA REGISTRARLA DE NUEVO?",
+ "NO","YES|NO","QUESTION",0) = "NO" THEN
+ NEXT FIELD cod_cap
+ END IF
+ END IF
+ ELSE
+ IF capac.horas_tom IS NULL OR capac.horas_tom <= 0 THEN
+ CALL fgl_winmessage("INFO","DEBE INDICAR LAS HORAS TOMADAS","info")
+ NEXT FIELD horas_tom
+ END IF
+ IF capac.fecha_ini IS NULL THEN
+ CALL fgl_winmessage("INFO","DEBE INDICAR LA FECHA DE INICIO","info")
+ NEXT FIELD fecha_ini
+ END IF
+ IF capac.fecha_fin IS NOT NULL AND capac.fecha_fin < capac.fecha_ini THEN
+ CALL fgl_winmessage("INFO","LA FECHA FIN NO PUEDE SER MENOR QUE LA FECHA INICIO","info")
+ NEXT FIELD fecha_fin
+ END IF
+ IF capac.id_requerida IS NOT NULL AND capac.horas_tom > capac.horas_req THEN
+ IF fgl_winquestion("INFO",
+ "LAS HORAS TOMADAS EXCEDEN LAS HORAS PENDIENTES DE LA REQUERIDA. CONTINUAR?",
+ "NO","YES|NO","QUESTION",0) = "NO" THEN
+ NEXT FIELD horas_tom
+ END IF
+ END IF
+ END IF
+ END INPUT
+ ELSE
+ LET capac.tipo_desc = xtipo
+ DISPLAY BY NAME capac.*, cap_tot.*
+ MENU "Capacitacion"
+ COMMAND "Cerrar" "Cierra la ventana de capacitacion"
+ EXIT MENU
+ ON ACTION close
+ EXIT MENU
+ END MENU
+ END IF
+
+ CLOSE WINDOW adwindow17
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ INITIALIZE capac.* TO NULL
+ RETURN FALSE
+ END IF
+ RETURN TRUE
+END FUNCTION
+
+## LLENA EL COMBO DEL CATALOGO DE CAPACITACIONES
+FUNCTION combo_capacitaciones()
+ DEFINE cb ui.ComboBox,
+ xcod INTEGER,
+ xnom VARCHAR(100)
+
+ LET cb = ui.ComboBox.forName("formonly.cod_cap")
+ IF cb IS NULL THEN
+ RETURN
+ END IF
+ CALL cb.clear()
+ LET cap_sql =
+ "SELECT cod_cap, nom_cap FROM adtb00059 WHERE status_t IS NULL ORDER BY nom_cap"
+ PREPARE p_cap_cat FROM cap_sql
+ DECLARE c_cap_cat CURSOR FOR p_cap_cat
+ FOREACH c_cap_cat INTO xcod, xnom
+ CALL cb.addItem(xcod, xnom CLIPPED)
+ END FOREACH
+ FREE c_cap_cat
+END FUNCTION
+
+## LLENA EL COMBO DE CAPACITACIONES REQUERIDAS DEL EMPLEADO
+## p_todas = FALSE solo las que tienen horas pendientes (captura)
+FUNCTION combo_requeridas(p_num_emp, p_todas)
+ DEFINE p_num_emp INTEGER,
+ p_todas BOOLEAN,
+ cb ui.ComboBox,
+ xid INTEGER,
+ xnom VARCHAR(100),
+ pend DEC(8,2)
+
+ LET cb = ui.ComboBox.forName("formonly.id_requerida")
+ IF cb IS NULL THEN
+ RETURN
+ END IF
+ CALL cb.clear()
+ LET cap_sql =
+ "SELECT r.id_cap, c.nom_cap, ",
+ " ISNULL(r.horas_req,0) - ISNULL((SELECT SUM(t.horas_tom) FROM adtb00060 t ",
+ " WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0) ",
+ "FROM adtb00060 r JOIN adtb00059 c ON c.cod_cap = r.cod_cap ",
+ "WHERE r.num_emp = ? AND r.tipo_reg = 'R' AND r.status_t IS NULL ",
+ "ORDER BY c.nom_cap"
+ PREPARE p_cap_req FROM cap_sql
+ DECLARE c_cap_req CURSOR FOR p_cap_req
+ FOREACH c_cap_req USING p_num_emp INTO xid, xnom, pend
+ IF NOT p_todas AND pend <= 0 THEN
+ CONTINUE FOREACH
+ END IF
+ CALL cb.addItem(xid, xnom CLIPPED || " (" || (pend USING "<<<&.&&") || " h pend.)")
+ END FOREACH
+ FREE c_cap_req
+END FUNCTION
+
+## TOTALES DE HORAS DEL EMPLEADO: REQUERIDAS, TOMADAS Y PENDIENTES
+FUNCTION totales_capacitacion(p_num_emp)
+ DEFINE p_num_emp INTEGER
+
+ LET cap_tot.trq = 0
+ LET cap_tot.ttm = 0
+ LET cap_sql =
+ "SELECT ISNULL(SUM(CASE WHEN tipo_reg = 'R' THEN horas_req END),0), ",
+ " ISNULL(SUM(CASE WHEN tipo_reg = 'T' THEN horas_tom END),0) ",
+ "FROM adtb00060 WHERE num_emp = ? AND status_t IS NULL"
+ PREPARE p_cap_tot FROM cap_sql
+ EXECUTE p_cap_tot INTO cap_tot.trq, cap_tot.ttm USING p_num_emp
+ # Pendiente = lo requerido que falta por cubrir (las tomadas sin requerida no restan)
+ LET cap_sql =
+ "SELECT ISNULL(SUM(CASE WHEN x.pend > 0 THEN x.pend ELSE 0 END),0) FROM ( ",
+ " SELECT ISNULL(r.horas_req,0) - ISNULL((SELECT SUM(t.horas_tom) FROM adtb00060 t ",
+ " WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0) pend ",
+ " FROM adtb00060 r WHERE r.num_emp = ? AND r.tipo_reg = 'R' AND r.status_t IS NULL) x"
+ PREPARE p_cap_pend FROM cap_sql
+ EXECUTE p_cap_pend INTO cap_tot.tpd USING p_num_emp
+END FUNCTION
+
+## TIPO DE EVENTO Y HORAS ESTANDAR DE UN CURSO DEL CATALOGO
+FUNCTION datos_curso(p_cod)
+ DEFINE p_cod INTEGER,
+ xev SMALLINT,
+ xhoras DEC(8,2)
+
+ LET cap_sql = "SELECT evento, horas FROM adtb00059 WHERE cod_cap = ?"
+ PREPARE p_cap_cur FROM cap_sql
+ EXECUTE p_cap_cur INTO xev, xhoras USING p_cod
+ RETURN xev, xhoras
+END FUNCTION
+
+## CURSO, EVENTO Y HORAS PENDIENTES DE UNA CAPACITACION REQUERIDA
+FUNCTION datos_requerida(p_id)
+ DEFINE p_id INTEGER,
+ xcod INTEGER,
+ xev SMALLINT,
+ pend DEC(8,2)
+
+ LET cap_sql =
+ "SELECT r.cod_cap, c.evento, ",
+ " ISNULL(r.horas_req,0) - ISNULL((SELECT SUM(t.horas_tom) FROM adtb00060 t ",
+ " WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0) ",
+ "FROM adtb00060 r JOIN adtb00059 c ON c.cod_cap = r.cod_cap WHERE r.id_cap = ?"
+ PREPARE p_cap_dreq FROM cap_sql
+ EXECUTE p_cap_dreq INTO xcod, xev, pend USING p_id
+ RETURN xcod, xev, pend
+END FUNCTION
+
+## AGREGA UN CURSO AL CATALOGO adtb00059 Y DEVUELVE SU CODIGO
+FUNCTION nuevo_curso()
+ DEFINE nc RECORD
+ nom_cap VARCHAR(100),
+ evento SMALLINT,
+ horas DEC(6,2)
+ END RECORD,
+ xnom VARCHAR(100),
+ xev SMALLINT,
+ xhoras DEC(6,2),
+ xcod INTEGER
+
+ # Ventana adfmwd019: nombre, tipo y horas en un solo paso
+ LET int_flag = FALSE
+ LET nc.nom_cap = NULL
+ LET nc.evento = 2
+ LET nc.horas = NULL
+ OPEN WINDOW adwindow19 AT 12,14 WITH FORM "adfmwd019"
+ ATTRIBUTE(BORDER,FORM LINE FIRST + 2)
+ INPUT BY NAME nc.* WITHOUT DEFAULTS ATTRIBUTE(UNBUFFERED)
+ AFTER INPUT
+ IF int_flag THEN
+ EXIT INPUT
+ END IF
+ IF nc.nom_cap IS NULL OR length(nc.nom_cap CLIPPED) = 0 THEN
+ CALL fgl_winmessage("INFO","DEBE INDICAR EL NOMBRE DE LA CAPACITACION","info")
+ NEXT FIELD nom_cap
+ END IF
+ IF nc.horas IS NOT NULL AND nc.horas < 0 THEN
+ CALL fgl_winmessage("INFO","LAS HORAS NO PUEDEN SER NEGATIVAS","info")
+ NEXT FIELD horas
+ END IF
+ END INPUT
+ CLOSE WINDOW adwindow19
+ IF int_flag THEN
+ LET int_flag = FALSE
+ RETURN NULL
+ END IF
+
+ LET xnom = upshift(nc.nom_cap CLIPPED)
+ LET xev = nc.evento
+ IF xev IS NULL OR xev < 1 OR xev > 4 THEN
+ LET xev = 2
+ END IF
+ LET xhoras = nc.horas
+ IF xhoras IS NULL THEN
+ LET xhoras = 0
+ END IF
+
+ LET xcod = NULL
+ LET cap_sql = "SELECT cod_cap FROM adtb00059 WHERE nom_cap = ? AND status_t IS NULL"
+ PREPARE p_cap_bnom FROM cap_sql
+ EXECUTE p_cap_bnom INTO xcod USING xnom
+ IF xcod IS NOT NULL THEN
+ CALL fgl_winmessage("INFO","ESA CAPACITACION YA EXISTE EN EL CATALOGO, SE SELECCIONA","info")
+ RETURN xcod
+ END IF
+
+ LET cap_sql =
+ "INSERT INTO adtb00059 (nom_cap, evento, horas, us_crea, fech_crea) ",
+ "VALUES (?, ?, ?, SUSER_SNAME(), GETDATE())"
+ PREPARE p_cap_ins_cat FROM cap_sql
+ EXECUTE p_cap_ins_cat USING xnom, xev, xhoras
+ EXECUTE p_cap_bnom INTO xcod USING xnom
+ RETURN xcod
+END FUNCTION
+
+## GRABA EL DETALLE DE CAPACITACION DE LA ACCION (dentro de la transaccion)
+FUNCTION graba_capacitacion()
+ DEFINE xtipo_reg CHAR(1)
+
+ IF xtipo = "CAPACITACION REQUERIDA" THEN
+ LET xtipo_reg = "R"
+ LET capac.id_requerida = NULL
+ LET capac.horas_tom = NULL
+ LET capac.fecha_fin = NULL
+ ELSE
+ LET xtipo_reg = "T"
+ LET capac.horas_req = NULL
+ END IF
+
+ LET cap_sql =
+ "INSERT INTO adtb00060 (num_trx, num_emp, tipo_reg, cod_cap, id_requerida, ",
+ " horas_req, horas_tom, fecha_ini, fecha_fin, institucion, costo, us_crea, fech_crea) ",
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?, SUSER_SNAME(), GETDATE())"
+ PREPARE p_cap_ins FROM cap_sql
+ EXECUTE p_cap_ins USING acc_per.num_trx, acc_per.num_emp, xtipo_reg, capac.cod_cap,
+ capac.id_requerida, capac.horas_req, capac.horas_tom,
+ capac.fecha_ini, capac.fecha_fin, capac.institucion, capac.costo
+END FUNCTION
+
+## CARGA EL DETALLE DE CAPACITACION DE UNA ACCION PARA CONSULTA
+FUNCTION carga_capacitacion(p_trx)
+ DEFINE p_trx INTEGER
+
+ INITIALIZE capac.* TO NULL
+ LET cap_sql =
+ "SELECT a.id_requerida, a.cod_cap, c.evento, a.horas_req, a.fecha_ini, a.fecha_fin, ",
+ " a.horas_tom, a.institucion, a.costo ",
+ "FROM adtb00060 a JOIN adtb00059 c ON c.cod_cap = a.cod_cap WHERE a.num_trx = ?"
+ PREPARE p_cap_sel FROM cap_sql
+ EXECUTE p_cap_sel INTO capac.id_requerida, capac.cod_cap, capac.evento, capac.horas_req,
+ capac.fecha_ini, capac.fecha_fin, capac.horas_tom,
+ capac.institucion, capac.costo
+ USING p_trx
+END FUNCTION
+
+## ANULA EL DETALLE DE CAPACITACION JUNTO CON LA ACCION
+FUNCTION anula_capacitacion(p_trx)
+ DEFINE p_trx INTEGER
+
+ LET cap_sql =
+ "UPDATE adtb00060 SET status_t = 'E', us_mod = ?, fech_mod = GETDATE() WHERE num_trx = ?"
+ PREPARE p_cap_anu FROM cap_sql
+ EXECUTE p_cap_anu USING usuarios, p_trx
+END FUNCTION
+
+##################################################################
+## DESVINCULACION (2026-10-05)
+## La desactivacion del empleado (adtb00003.status_t = 'D') se hace
+## por la accion de personal; noprmt016 ya no desactiva.
+## Causa codificada en adtb00062 (catalogo adtb00061) para Rotacion.
+##################################################################
+FUNCTION es_desvinculacion(p_tipo)
+ DEFINE p_tipo VARCHAR(25)
+ LET p_tipo = p_tipo CLIPPED
+ RETURN (p_tipo = "CANCELAR" OR p_tipo = "DESVINCULAR" OR p_tipo = "TERMINO")
+END FUNCTION
+
+FUNCTION empleado_desactivado(p_num_emp)
+ DEFINE p_num_emp INTEGER,
+ xst CHAR(1)
+ LET xst = NULL
+ SELECT a.status_t INTO xst FROM adtb00003 a WHERE a.num_emp = p_num_emp
+ RETURN (xst = "D")
+END FUNCTION
+
+FUNCTION desvinculacion(operacion)
+ DEFINE operacion VARCHAR(1),
+ cb ui.ComboBox,
+ xcod SMALLINT,
+ xdesc VARCHAR(60),
+ xingreso DATE
+
+ LET int_flag = FALSE
+ OPEN WINDOW adwindow18 AT 10,12 WITH FORM "adfmwd018"
+ ATTRIBUTE(BORDER,FORM LINE FIRST + 2)
+
+ LET cb = ui.ComboBox.forName("formonly.cod_causa")
+ CALL cb.clear()
+ LET cap_sql = "SELECT cod_causa, desc_causa FROM adtb00061 WHERE status_t IS NULL ORDER BY cod_causa"
+ PREPARE p_desv_cat FROM cap_sql
+ DECLARE c_desv_cat CURSOR FOR p_desv_cat
+ FOREACH c_desv_cat INTO xcod, xdesc
+ CALL cb.addItem(xcod, xdesc CLIPPED)
+ END FOREACH
+ FREE c_desv_cat
+
+ IF operacion = 'A' THEN
+ INITIALIZE desv.* TO NULL
+ LET desv.fecha_salida = acc_per.fech_efec
+ LET desv.recontratable = "S"
+
+ INPUT BY NAME desv.* WITHOUT DEFAULTS ATTRIBUTE(UNBUFFERED)
+ ON CHANGE cod_causa
+ LET desv.clase_desc = clase_causa(desv.cod_causa)
+
+ AFTER INPUT
+ IF int_flag THEN
+ EXIT INPUT
+ END IF
+ IF desv.fecha_salida IS NULL THEN
+ CALL fgl_winmessage("INFO","DEBE INDICAR LA FECHA DE SALIDA","info")
+ NEXT FIELD fecha_salida
+ END IF
+ LET xingreso = NULL
+ SELECT a.fech_efec INTO xingreso FROM adtb00003 a WHERE a.num_emp = acc_per.num_emp
+ IF xingreso IS NOT NULL AND desv.fecha_salida < xingreso THEN
+ CALL fgl_winmessage("INFO","LA FECHA DE SALIDA ES MENOR QUE LA FECHA DE INGRESO","info")
+ NEXT FIELD fecha_salida
+ END IF
+ IF desv.cod_causa IS NULL THEN
+ CALL fgl_winmessage("INFO","DEBE SELECCIONAR LA CAUSA DE LA SALIDA","info")
+ NEXT FIELD cod_causa
+ END IF
+ IF desv.recontratable IS NULL THEN
+ CALL fgl_winmessage("INFO","INDIQUE SI EL EMPLEADO ES RECONTRATABLE","info")
+ NEXT FIELD recontratable
+ END IF
+ END INPUT
+ ELSE
+ LET desv.clase_desc = clase_causa(desv.cod_causa)
+ DISPLAY BY NAME desv.*
+ MENU "Desvinculacion"
+ COMMAND "Cerrar" "Cierra la ventana de desvinculacion"
+ EXIT MENU
+ ON ACTION close
+ EXIT MENU
+ END MENU
+ END IF
+
+ CLOSE WINDOW adwindow18
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ INITIALIZE desv.* TO NULL
+ RETURN FALSE
+ END IF
+ RETURN TRUE
+END FUNCTION
+
+## DESCRIPCION DE LA CLASE DE LA CAUSA (VOLUNTARIA / INVOLUNTARIA / OTRA)
+FUNCTION clase_causa(p_cod)
+ DEFINE p_cod SMALLINT,
+ xclase CHAR(1)
+
+ LET xclase = NULL
+ LET cap_sql = "SELECT clase FROM adtb00061 WHERE cod_causa = ?"
+ PREPARE p_desv_clase FROM cap_sql
+ EXECUTE p_desv_clase INTO xclase USING p_cod
+ CASE xclase
+ WHEN "V" RETURN "VOLUNTARIA"
+ WHEN "I" RETURN "INVOLUNTARIA"
+ WHEN "O" RETURN "OTRA"
+ END CASE
+ RETURN NULL
+END FUNCTION
+
+## GRABA LA DESVINCULACION Y DESACTIVA AL EMPLEADO (dentro de la transaccion)
+FUNCTION graba_desvinculacion()
+ DEFINE xdep, xpuesto SMALLINT,
+ xtipo_emp VARCHAR(20),
+ xingreso DATE,
+ xdesc VARCHAR(60),
+ xmotivo VARCHAR(255)
+
+ SELECT a.departamento, a.cod_puesto, a.tipo_empleado, a.fech_efec
+ INTO xdep, xpuesto, xtipo_emp, xingreso
+ FROM adtb00003 a
+ WHERE a.num_emp = acc_per.num_emp
+
+ LET cap_sql =
+ "INSERT INTO adtb00062 (num_trx, num_emp, fecha_salida, cod_causa, recontratable, detalle, ",
+ " departamento, cod_puesto, tipo_empleado, fech_ingreso, origen, us_crea, fech_crea) ",
+ "VALUES (?,?,?,?,?,?,?,?,?,?,'A', SUSER_SNAME(), GETDATE())"
+ PREPARE p_desv_ins FROM cap_sql
+ EXECUTE p_desv_ins USING acc_per.num_trx, acc_per.num_emp, desv.fecha_salida, desv.cod_causa,
+ desv.recontratable, desv.detalle, xdep, xpuesto, xtipo_emp, xingreso
+
+ # Motivo al inicio de adtb00003.observacion (lo que ya habia se conserva detras)
+ LET xdesc = NULL
+ LET cap_sql = "SELECT desc_causa FROM adtb00061 WHERE cod_causa = ?"
+ PREPARE p_desv_desc FROM cap_sql
+ EXECUTE p_desv_desc INTO xdesc USING desv.cod_causa
+ LET xmotivo = xdesc CLIPPED, " ", desv.fecha_salida USING "dd/mm/yyyy"
+ IF desv.detalle IS NOT NULL THEN
+ LET xmotivo = xmotivo CLIPPED, " ", desv.detalle CLIPPED
+ END IF
+ IF desv.recontratable = "N" THEN
+ LET xmotivo = xmotivo CLIPPED, " NO REINGRESO"
+ END IF
+
+ LET cap_sql =
+ "UPDATE adtb00003 SET status_t = 'D', fecha_salida = ?, ",
+ " observacion = LEFT(? + CASE WHEN observacion IS NULL OR LTRIM(observacion) = '' ",
+ " THEN '' ELSE ' | ' + observacion END, 255), ",
+ " us_mod = SUSER_SNAME(), fech_mod = GETDATE() ",
+ "WHERE num_emp = ?"
+ PREPARE p_desv_emp FROM cap_sql
+ EXECUTE p_desv_emp USING desv.fecha_salida, xmotivo, acc_per.num_emp
+END FUNCTION
+
+## CARGA LA DESVINCULACION DE UNA ACCION PARA CONSULTA
+FUNCTION carga_desvinculacion(p_trx)
+ DEFINE p_trx INTEGER
+
+ INITIALIZE desv.* TO NULL
+ LET cap_sql =
+ "SELECT fecha_salida, cod_causa, recontratable, detalle FROM adtb00062 WHERE num_trx = ?"
+ PREPARE p_desv_sel FROM cap_sql
+ EXECUTE p_desv_sel INTO desv.fecha_salida, desv.cod_causa, desv.recontratable, desv.detalle
+ USING p_trx
+ # Las desvinculaciones anteriores a 2026-10-05 no tienen detalle
+ RETURN (desv.cod_causa IS NOT NULL)
+END FUNCTION
+
+## ANULA LA DESVINCULACION Y REACTIVA AL EMPLEADO SI NO TIENE OTRA SALIDA VIGENTE
+FUNCTION anula_desvinculacion(p_trx, p_num_emp)
+ DEFINE p_trx, p_num_emp INTEGER
+
+ LET cap_sql =
+ "UPDATE adtb00062 SET status_t = 'E', us_mod = ?, fech_mod = GETDATE() WHERE num_trx = ?"
+ PREPARE p_desv_anu FROM cap_sql
+ EXECUTE p_desv_anu USING usuarios, p_trx
+ # Acciones anteriores a 2026-10-05 no tienen detalle: no se reactiva al empleado
+ IF sqlca.sqlerrd[3] = 0 THEN
+ RETURN
+ END IF
+
+ LET cap_sql =
+ "UPDATE adtb00003 SET status_t = NULL, fecha_salida = NULL, us_mod = ?, fech_mod = GETDATE() ",
+ "WHERE num_emp = ? AND status_t = 'D' ",
+ " AND NOT EXISTS (SELECT 1 FROM adtb00062 d WHERE d.num_emp = ? AND d.status_t IS NULL)"
+ PREPARE p_desv_react FROM cap_sql
+ EXECUTE p_desv_react USING usuarios, p_num_emp, p_num_emp
+END FUNCTION
+
+## VENTANA DE LOS NIVELES DEL LOS EMPLEADOS
FUNCTION busca_nivel()
OPEN WINDOW busqueda AT 10,10 WITH FORM "adfmwd008"
ATTRIBUTE (BORDER,FORM LINE FIRST + 2, comment line last)
@@ -2036,8 +2694,13 @@ DEFINE doble_of,doble_on,doble_off,negrillas_on,negrillas_off,comp_on,comp_of,
depende,codigo_s,cod_provincia,codigo_n,serie SMALLINT,
fecha_nac DATE,
provincia,nombre_nac CHAR(30),
- hoy VARCHAR(25)
-
+ hoy VARCHAR(25),
+ # Bloque de detalle para CAPACITACION / DESVINCULACION (2026-10-05).
+ # es_vac = 1 muestra el bloque de vacaciones del .4rp; 0 muestra el detalle.
+ es_vac SMALLINT,
+ det_tit, det1, det2, det3 VARCHAR(150),
+ xnom_det VARCHAR(100)
+
OUTPUT
TOP MARGIN 4
LEFT MARGIN 0
@@ -2085,9 +2748,43 @@ ON EVERY ROW
SELECT @desc_mto INTO mov_emp.desc_mto
FROM adtb00009
- WHERE @cod_mto = acc_per.cod_mto
+ WHERE @cod_mto = acc_per.cod_mto
+
+## DETALLE SEGUN EL MOVIMIENTO (CAPACITACION / DESVINCULACION)
+ LET es_vac = 1
+ LET det_tit = NULL LET det1 = NULL LET det2 = NULL LET det3 = NULL
+ IF xtipo = "CAPACITACION REQUERIDA" OR xtipo = "CAPACITACION TOMADA" THEN
+ LET es_vac = 0
+ LET xnom_det = NULL
+ LET cap_sql = "SELECT nom_cap FROM adtb00059 WHERE cod_cap = ?"
+ PREPARE p_imp_cap FROM cap_sql
+ EXECUTE p_imp_cap INTO xnom_det USING capac.cod_cap
+ LET det_tit = xtipo CLIPPED
+ LET det1 = "CAPACITACION: ", xnom_det CLIPPED
+ IF xtipo = "CAPACITACION REQUERIDA" THEN
+ LET det2 = "HORAS REQUERIDAS: ", capac.horas_req USING "<<<&.&&",
+ " FECHA INICIO: ", capac.fecha_ini USING "dd/mm/yyyy"
+ ELSE
+ LET det2 = "HORAS TOMADAS: ", capac.horas_tom USING "<<<&.&&",
+ " DEL ", capac.fecha_ini USING "dd/mm/yyyy",
+ " AL ", capac.fecha_fin USING "dd/mm/yyyy"
+ END IF
+ LET det3 = "INSTITUCION/FACILITADOR: ", capac.institucion CLIPPED,
+ " COSTO: ", capac.costo USING "<<<,<<&.&&"
+ END IF
+ IF es_desvinculacion(xtipo) THEN
+ LET es_vac = 0
+ LET xnom_det = NULL
+ LET cap_sql = "SELECT desc_causa FROM adtb00061 WHERE cod_causa = ?"
+ PREPARE p_imp_desv FROM cap_sql
+ EXECUTE p_imp_desv INTO xnom_det USING desv.cod_causa
+ LET det_tit = "DESVINCULACION"
+ LET det1 = "FECHA DE SALIDA: ", desv.fecha_salida USING "dd/mm/yyyy",
+ " CAUSA: ", xnom_det CLIPPED, " (", clase_causa(desv.cod_causa) CLIPPED, ")"
+ LET det2 = "RECONTRATABLE: ", desv.recontratable
+ LET det3 = "DETALLE: ", desv.detalle CLIPPED
+ END IF
-
PRINTX acc_per.num_trx,mov_emp.desc_mto,
acc_per.fecha ,acc_per.fech_efec,apellido9,nombre9 ,
direccion,dias2,
@@ -2107,5 +2804,6 @@ ON EVERY ROW
nombre_dpto,
acc_per.cod_mto ,
mov_emp.desc_mto,
- acc_per.observacion,vacacion.*,p_companias.nombre,hoy,descrip3,descrip4,descrip5
+ acc_per.observacion,vacacion.*,p_companias.nombre,hoy,descrip3,descrip4,descrip5,
+ es_vac,det_tit,det1,det2,det3
END REPORT
diff --git a/PROYECTO/addir/adprmt017_capacitacion.sql b/PROYECTO/addir/adprmt017_capacitacion.sql
new file mode 100644
index 0000000..79cd4a1
--- /dev/null
+++ b/PROYECTO/addir/adprmt017_capacitacion.sql
@@ -0,0 +1,110 @@
+/* ------------------------------------------------------------------
+ ADPRMT017 - Accion de Personal: movimientos de CAPACITACION
+ Fecha : 2026-10-05
+ Crea : adtb00059 (catalogo de capacitaciones)
+ adtb00060 (capacitacion por empleado: requerida / tomada)
+ movimientos en adtb00009
+ vista vw_capacitacion_empleado (requeridas vs tomadas)
+ Correr en: marmotech (probar primero en .40.9)
+ Idempotente: se puede correr mas de una vez.
+------------------------------------------------------------------- */
+SET NOCOUNT ON;
+
+/* 1. Catalogo de capacitaciones */
+IF OBJECT_ID('dbo.adtb00059') IS NULL
+BEGIN
+ CREATE TABLE dbo.adtb00059 (
+ cod_cap INT IDENTITY(1,1) NOT NULL CONSTRAINT pk_adtb00059 PRIMARY KEY,
+ nom_cap VARCHAR(100) NOT NULL,
+ evento SMALLINT NULL, -- 1 Seminario 2 Curso 3 Taller 4 Conferencia (igual que adtb00022)
+ horas DECIMAL(6,2) NULL, -- horas estandar del curso
+ status_t CHAR(1) NULL,
+ us_crea VARCHAR(50) NULL,
+ fech_crea DATETIME NULL,
+ us_mod VARCHAR(50) NULL,
+ fech_mod DATETIME NULL
+ );
+ CREATE UNIQUE INDEX ux_adtb00059_nom ON dbo.adtb00059(nom_cap) WHERE status_t IS NULL;
+END
+GO
+
+/* 2. Capacitacion por empleado
+ tipo_reg 'R' = requerida (plan), 'T' = tomada (ejecutada)
+ Una 'T' puede referenciar la 'R' que cubre (id_requerida). */
+IF OBJECT_ID('dbo.adtb00060') IS NULL
+BEGIN
+ CREATE TABLE dbo.adtb00060 (
+ id_cap INT IDENTITY(1,1) NOT NULL CONSTRAINT pk_adtb00060 PRIMARY KEY,
+ num_trx INT NOT NULL, -- adtb00020.num_trx
+ num_emp INT NOT NULL,
+ tipo_reg CHAR(1) NOT NULL CONSTRAINT ck_adtb00060_tipo CHECK (tipo_reg IN ('R','T')),
+ cod_cap INT NOT NULL CONSTRAINT fk_adtb00060_cap REFERENCES dbo.adtb00059(cod_cap),
+ id_requerida INT NULL CONSTRAINT fk_adtb00060_req REFERENCES dbo.adtb00060(id_cap),
+ horas_req DECIMAL(6,2) NULL,
+ horas_tom DECIMAL(6,2) NULL,
+ fecha_ini DATE NULL,
+ fecha_fin DATE NULL,
+ institucion VARCHAR(100) NULL,
+ costo DECIMAL(12,2) NULL,
+ status_t CHAR(1) NULL, -- 'E' = anulado (junto con la accion)
+ us_crea VARCHAR(50) NULL,
+ fech_crea DATETIME NULL,
+ us_mod VARCHAR(50) NULL,
+ fech_mod DATETIME NULL
+ );
+ CREATE INDEX ix_adtb00060_emp ON dbo.adtb00060(num_emp, tipo_reg) INCLUDE (cod_cap, horas_req, horas_tom, status_t);
+ CREATE INDEX ix_adtb00060_trx ON dbo.adtb00060(num_trx);
+ CREATE INDEX ix_adtb00060_req ON dbo.adtb00060(id_requerida);
+END
+GO
+
+/* 3. Movimientos de accion de personal */
+IF NOT EXISTS (SELECT 1 FROM dbo.adtb00009 WHERE tipo_mov = 'CAPACITACION REQUERIDA')
+ INSERT INTO dbo.adtb00009 (cod_mto, desc_mto, tipo_mov, status_t, us_crea, fech_crea)
+ SELECT ISNULL(MAX(cod_mto),0) + 1, 'CAPACITACION REQUERIDA', 'CAPACITACION REQUERIDA', NULL, SUSER_SNAME(), GETDATE()
+ FROM dbo.adtb00009;
+
+IF NOT EXISTS (SELECT 1 FROM dbo.adtb00009 WHERE tipo_mov = 'CAPACITACION TOMADA')
+ INSERT INTO dbo.adtb00009 (cod_mto, desc_mto, tipo_mov, status_t, us_crea, fech_crea)
+ SELECT ISNULL(MAX(cod_mto),0) + 1, 'CAPACITACION TOMADA', 'CAPACITACION TOMADA', NULL, SUSER_SNAME(), GETDATE()
+ FROM dbo.adtb00009;
+GO
+
+/* 4. Vista: por empleado, cada capacitacion requerida con lo tomado debajo.
+ Las tomadas sin requerida asociada salen con tipo 'T' y horas_req 0. */
+IF OBJECT_ID('dbo.vw_capacitacion_empleado') IS NOT NULL
+ DROP VIEW dbo.vw_capacitacion_empleado;
+GO
+CREATE VIEW dbo.vw_capacitacion_empleado AS
+SELECT e.num_emp,
+ RTRIM(e.nom1_emp) + ' ' + RTRIM(e.apell1_emp) AS empleado,
+ e.departamento,
+ d.nom_dpto,
+ r.tipo_reg,
+ r.id_cap,
+ c.cod_cap,
+ c.nom_cap,
+ c.evento,
+ CASE c.evento WHEN 1 THEN 'SEMINARIO' WHEN 2 THEN 'CURSO'
+ WHEN 3 THEN 'TALLER' WHEN 4 THEN 'CONFERENCIA' END AS tipo_evento,
+ CASE WHEN r.tipo_reg = 'R' THEN ISNULL(r.horas_req,0) ELSE 0 END AS horas_requeridas,
+ CASE WHEN r.tipo_reg = 'R'
+ THEN ISNULL((SELECT SUM(t.horas_tom) FROM dbo.adtb00060 t
+ WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0)
+ ELSE ISNULL(r.horas_tom,0) END AS horas_tomadas,
+ CASE WHEN r.tipo_reg = 'R'
+ THEN ISNULL(r.horas_req,0) - ISNULL((SELECT SUM(t.horas_tom) FROM dbo.adtb00060 t
+ WHERE t.id_requerida = r.id_cap AND t.status_t IS NULL),0)
+ ELSE 0 END AS horas_pendientes,
+ r.fecha_ini,
+ r.fecha_fin,
+ r.institucion,
+ r.costo,
+ r.num_trx
+FROM dbo.adtb00060 r
+JOIN dbo.adtb00059 c ON c.cod_cap = r.cod_cap
+JOIN dbo.adtb00003 e ON e.num_emp = r.num_emp
+LEFT JOIN dbo.adtb00001 d ON d.departamento = e.departamento
+WHERE r.status_t IS NULL
+ AND (r.tipo_reg = 'R' OR r.id_requerida IS NULL);
+GO
diff --git a/PROYECTO/addir/adprmt017_capacitacion_LEEME.md b/PROYECTO/addir/adprmt017_capacitacion_LEEME.md
new file mode 100644
index 0000000..7ab30f6
--- /dev/null
+++ b/PROYECTO/addir/adprmt017_capacitacion_LEEME.md
@@ -0,0 +1,34 @@
+# ADPRMT017 – Movimientos de Capacitación (2026-10-05)
+
+Pedido de RRHH: indicador **Horas de Capacitación**. Por cada colaborador se registran las capacitaciones **requeridas** con sus horas y luego las **tomadas**, que cubren a las requeridas.
+
+## Backup
+`addir\backup_adprmt017_20261005\` contiene adprmt017.4gl, .rdd, adfmmt017.4fd/.per y los binarios que estaban en `addir\bin` y `PROYECTO\bin`.
+Para volver atrás: copiar `adprmt017.4gl` del backup sobre el actual, recompilar y desplegar. Las tablas nuevas no afectan a nadie si no se usan.
+
+## Qué se agregó
+| Pieza | Detalle |
+|---|---|
+| `adtb00009` | 2 movimientos nuevos: `CAPACITACION REQUERIDA`, `CAPACITACION TOMADA` (cod_mto = MAX+1) |
+| `adtb00059` | Catálogo de capacitaciones: nombre, tipo de evento (1 Seminario, 2 Curso, 3 Taller, 4 Conferencia, igual que adtb00022) y horas estándar |
+| `adtb00060` | Detalle por empleado, ligado a `adtb00020.num_trx`. `tipo_reg` R/T; una T apunta a la R que cubre (`id_requerida`) |
+| `vw_capacitacion_empleado` | Por empleado: requeridas con sus horas tomadas y pendientes, más las tomadas que no tienen requerida (para BI y Excel) |
+| `adfmwd017.per` | Ventana nueva de capacitación. Se abre igual que la de vacaciones, después del puesto |
+| `adprmt017.4gl` | Captura (`capacitacion('A')`), consulta (`'C'`), grabado dentro de la misma transacción y anulación junto con la acción |
+
+## Flujo
+1. **Nuevo**, elegir el movimiento *CAPACITACION REQUERIDA* y la ficha. Se abre la ventana: escoger la capacitación del catálogo (o usar el botón **Nuevo curso**). Las horas se toman del catálogo y se pueden editar.
+2. Cuando la persona toma el curso: **Nuevo**, elegir *CAPACITACION TOMADA* y en **Requerida a cubrir** escoger la pendiente. Se llena el curso y las horas pendientes; luego se ponen las fechas, las horas reales, la institución y el costo.
+3. El recuadro **Resumen del empleado** muestra el total de horas requeridas, tomadas y pendientes.
+4. **eLiminar** (anular) la acción también anula su detalle de capacitación.
+
+## Despliegue (pendiente)
+1. Correr `adprmt017_capacitacion.sql` en marmotech (la sintaxis se validó en .40.8 con NOEXEC; no se ejecutó nada).
+2. Compilar la forma y el programa. Ambos compilan limpio en 3.20.14 y en fgl602:
+ `fglform adfmwd017.per` → `adfmwd017.42f`; `fglcomp adprmt017.4gl` → `adprmt017.42m`.
+3. Copiar `adprmt017.42m` y `adfmwd017.42f` a `PROYECTO\bin`.
+4. No hace falta tocar `adfmmt017.4fd` ni regenerar smarmotech.sch: las tablas nuevas se usan con SQL dinámico.
+
+## Notas
+- **adprmt019 (Adiestramientos)** no se tocó. Usa `adtb00022`, que solo tiene 2 registros, no guarda horas ni distingue requerida de tomada, y tiene **usuario y clave en claro** en el MAIN (`kpolanco`). Además las acciones del menú están cruzadas: *nuevo* llama a la búsqueda y *buscar* llama a la captura. Se puede retirar o migrar después.
+- Para **Rotación**: el movimiento 4 DESVINCULAR tiene `tipo_mov = 'CANCELAR'`, pero adprmt017 marca `status_t='T'` solo si es `'TERMINO'`. Por eso las desvinculaciones no marcan al empleado como terminado y además no guardan la causa. Hay que revisarlo antes de automatizar la rotación.
diff --git a/PROYECTO/addir/adprmt017_desvinculacion.sql b/PROYECTO/addir/adprmt017_desvinculacion.sql
new file mode 100644
index 0000000..62b4bbe
--- /dev/null
+++ b/PROYECTO/addir/adprmt017_desvinculacion.sql
@@ -0,0 +1,139 @@
+/* ------------------------------------------------------------------
+ ADPRMT017 - Accion de Personal: DESVINCULAR (indicador de Rotacion)
+ Fecha : 2026-10-05
+ Crea : adtb00061 (catalogo de causas de salida)
+ adtb00062 (detalle de desvinculacion por accion)
+ vista vw_rotacion_mensual
+ La desactivacion (adtb00003.status_t = 'D') pasa a hacerse SOLO por
+ la accion de personal; noprmt016 ya no desactiva.
+ Idempotente.
+------------------------------------------------------------------- */
+SET NOCOUNT ON;
+
+/* 1. Catalogo de causas
+ clase: V = voluntaria, I = involuntaria, O = otra
+ cuenta_rotacion: 'N' para traslados dentro del grupo (no es salida real) */
+IF OBJECT_ID('dbo.adtb00061') IS NULL
+BEGIN
+ CREATE TABLE dbo.adtb00061 (
+ cod_causa SMALLINT NOT NULL CONSTRAINT pk_adtb00061 PRIMARY KEY,
+ desc_causa VARCHAR(60) NOT NULL,
+ clase CHAR(1) NOT NULL CONSTRAINT ck_adtb00061_clase CHECK (clase IN ('V','I','O')),
+ cuenta_rotacion CHAR(1) NOT NULL CONSTRAINT df_adtb00061_cuenta DEFAULT 'S',
+ status_t CHAR(1) NULL,
+ us_crea VARCHAR(50) NULL,
+ fech_crea DATETIME NULL
+ );
+
+ INSERT INTO dbo.adtb00061 (cod_causa, desc_causa, clase, cuenta_rotacion, us_crea, fech_crea) VALUES
+ ( 1, 'RENUNCIA', 'V', 'S', SUSER_SNAME(), GETDATE()),
+ ( 2, 'ABANDONO DE TRABAJO', 'V', 'S', SUSER_SNAME(), GETDATE()),
+ ( 3, 'DIMISION', 'V', 'S', SUSER_SNAME(), GETDATE()),
+ ( 4, 'DESAHUCIO', 'I', 'S', SUSER_SNAME(), GETDATE()),
+ ( 5, 'DESPIDO', 'I', 'S', SUSER_SNAME(), GETDATE()),
+ ( 6, 'CIERRE DE OPERACION / MINA', 'I', 'S', SUSER_SNAME(), GETDATE()),
+ ( 7, 'FIN DE CONTRATO / TEMPORADA', 'I', 'S', SUSER_SNAME(), GETDATE()),
+ ( 8, 'NO SUPERO PERIODO DE PRUEBA', 'I', 'S', SUSER_SNAME(), GETDATE()),
+ ( 9, 'MUTUO ACUERDO', 'O', 'S', SUSER_SNAME(), GETDATE()),
+ (10, 'PENSION / RETIRO', 'O', 'S', SUSER_SNAME(), GETDATE()),
+ (11, 'FALLECIMIENTO', 'O', 'S', SUSER_SNAME(), GETDATE()),
+ (12, 'TRASLADO A OTRA EMPRESA DEL GRUPO', 'O', 'N', SUSER_SNAME(), GETDATE()),
+ (99, 'OTRA', 'O', 'S', SUSER_SNAME(), GETDATE());
+END
+GO
+
+/* 2. Detalle de desvinculacion (una fila por accion DESVINCULAR) */
+IF OBJECT_ID('dbo.adtb00062') IS NULL
+BEGIN
+ CREATE TABLE dbo.adtb00062 (
+ id_desv INT IDENTITY(1,1) NOT NULL CONSTRAINT pk_adtb00062 PRIMARY KEY,
+ num_trx INT NULL, -- adtb00020.num_trx (NULL = historico)
+ num_emp INT NOT NULL,
+ fecha_salida DATE NOT NULL,
+ cod_causa SMALLINT NOT NULL CONSTRAINT fk_adtb00062_causa REFERENCES dbo.adtb00061(cod_causa),
+ recontratable CHAR(1) NULL, -- S / N
+ detalle VARCHAR(200) NULL,
+ departamento SMALLINT NULL, -- foto al momento de la salida
+ cod_puesto SMALLINT NULL,
+ tipo_empleado VARCHAR(20) NULL, -- NORMAL / TEMPORERO
+ fech_ingreso DATE NULL,
+ origen CHAR(1) NOT NULL CONSTRAINT df_adtb00062_origen DEFAULT 'A', -- A accion, H historico
+ status_t CHAR(1) NULL, -- 'E' anulada
+ us_crea VARCHAR(50) NULL,
+ fech_crea DATETIME NULL,
+ us_mod VARCHAR(50) NULL,
+ fech_mod DATETIME NULL
+ );
+ CREATE INDEX ix_adtb00062_fecha ON dbo.adtb00062(fecha_salida) INCLUDE (num_emp, cod_causa, departamento, tipo_empleado, status_t);
+ CREATE INDEX ix_adtb00062_emp ON dbo.adtb00062(num_emp);
+ CREATE INDEX ix_adtb00062_trx ON dbo.adtb00062(num_trx);
+END
+GO
+
+/* 3. El movimiento 4 DESVINCULAR queda con tipo_mov 'CANCELAR'
+ (adprmt017 reconoce CANCELAR, DESVINCULAR y TERMINO). No se cambia. */
+
+/* 4. Rotacion mensual por departamento y tipo de empleado.
+ salidas_rotacion excluye causas con cuenta_rotacion = 'N'.
+ Plantilla = empleados con ingreso <= inicio de mes y sin salida antes del inicio. */
+IF OBJECT_ID('dbo.vw_rotacion_mensual') IS NOT NULL
+ DROP VIEW dbo.vw_rotacion_mensual;
+GO
+CREATE VIEW dbo.vw_rotacion_mensual AS
+WITH meses AS (
+ SELECT CAST('2022-01-01' AS DATE) AS ini
+ UNION ALL
+ SELECT DATEADD(MONTH, 1, ini) FROM meses WHERE ini < DATEADD(MONTH, -1, CAST(GETDATE() AS DATE))
+),
+emp AS (
+ SELECT a.num_emp, a.departamento, ISNULL(a.tipo_empleado,'NORMAL') AS tipo_empleado,
+ a.fech_efec, a.fecha_salida
+ FROM dbo.adtb00003 a
+ WHERE a.num_emp >= 39 -- fichas < 39 no son empleados reales
+ AND (a.status_t IS NULL OR a.status_t = 'D')
+),
+sal AS (
+ SELECT d.num_emp, d.fecha_salida, d.departamento, ISNULL(d.tipo_empleado,'NORMAL') AS tipo_empleado,
+ c.clase, c.cuenta_rotacion
+ FROM dbo.adtb00062 d JOIN dbo.adtb00061 c ON c.cod_causa = d.cod_causa
+ WHERE d.status_t IS NULL
+)
+SELECT m.ini AS mes,
+ YEAR(m.ini) AS anio,
+ MONTH(m.ini) AS mes_num,
+ g.departamento,
+ dp.nom_dpto,
+ g.tipo_empleado,
+ g.plantilla_inicio,
+ ISNULL(i.ingresos,0) AS ingresos,
+ ISNULL(s.salidas,0) AS salidas,
+ ISNULL(s.salidas_rotacion,0) AS salidas_rotacion,
+ ISNULL(s.voluntarias,0) AS voluntarias,
+ ISNULL(s.involuntarias,0) AS involuntarias,
+ ISNULL(s.otras,0) AS otras,
+ CASE WHEN g.plantilla_inicio > 0
+ THEN CAST(100.0 * ISNULL(s.salidas_rotacion,0) / g.plantilla_inicio AS DECIMAL(6,2)) END AS rotacion_pct
+FROM meses m
+CROSS APPLY (
+ SELECT e.departamento, e.tipo_empleado, COUNT(*) AS plantilla_inicio
+ FROM emp e
+ WHERE e.fech_efec <= m.ini AND (e.fecha_salida IS NULL OR e.fecha_salida >= m.ini)
+ GROUP BY e.departamento, e.tipo_empleado
+) g
+OUTER APPLY (
+ SELECT COUNT(*) AS ingresos FROM emp e
+ WHERE e.departamento = g.departamento AND e.tipo_empleado = g.tipo_empleado
+ AND e.fech_efec >= m.ini AND e.fech_efec < DATEADD(MONTH,1,m.ini)
+) i
+OUTER APPLY (
+ SELECT COUNT(*) AS salidas,
+ SUM(CASE WHEN x.cuenta_rotacion = 'S' THEN 1 ELSE 0 END) AS salidas_rotacion,
+ SUM(CASE WHEN x.clase = 'V' THEN 1 ELSE 0 END) AS voluntarias,
+ SUM(CASE WHEN x.clase = 'I' THEN 1 ELSE 0 END) AS involuntarias,
+ SUM(CASE WHEN x.clase = 'O' THEN 1 ELSE 0 END) AS otras
+ FROM sal x
+ WHERE x.departamento = g.departamento AND x.tipo_empleado = g.tipo_empleado
+ AND x.fecha_salida >= m.ini AND x.fecha_salida < DATEADD(MONTH,1,m.ini)
+) s
+LEFT JOIN dbo.adtb00001 dp ON dp.departamento = g.departamento;
+GO
diff --git a/PROYECTO/addir/adprmt017_desvinculacion_LEEME.md b/PROYECTO/addir/adprmt017_desvinculacion_LEEME.md
new file mode 100644
index 0000000..14fc232
--- /dev/null
+++ b/PROYECTO/addir/adprmt017_desvinculacion_LEEME.md
@@ -0,0 +1,34 @@
+# ADPRMT017 – Desvinculación por Acción de Personal (2026-10-05)
+
+Objetivo: el indicador de **Rotación** (mes a mes y por causa). La desactivación del empleado ahora se hace **solo** por la acción de personal.
+
+## Antes
+- **noprmt016** ("Activar/Desactivar") ponía `adtb00003.status_t = 'D'` sin fecha ni causa.
+- En **noprmt003** RRHH escribía a mano la `fecha_salida` y el motivo en `observacion` (texto libre: "DESAHUCIO", "RENUNCIA 30/03/2026"...).
+- En adprmt017 el movimiento 4 DESVINCULAR (`tipo_mov = 'CANCELAR'`) solo grababa `adtb00020`. El código esperaba `'TERMINO'`, que no existe, y además ese bloque estaba fuera de la transacción.
+
+## Ahora
+| Programa | Cambio |
+|---|---|
+| adprmt017 | DESVINCULAR (tipo CANCELAR, DESVINCULAR o TERMINO) abre la ventana `adfmwd018`: fecha de salida, causa (catálogo), si es recontratable y un detalle. Dentro de la misma transacción: inserta en `adtb00062` y actualiza `adtb00003` (`status_t='D'`, `fecha_salida`, y el motivo al **inicio** de `observacion`, conservando lo que ya había detrás). Si el empleado ya está en D, no deja continuar. |
+| adprmt017 (eLiminar) | Anular una desvinculación nueva anula `adtb00062` y **reactiva** al empleado (status NULL, fecha_salida NULL) si no tiene otra salida vigente. Las acciones viejas, sin detalle, no reactivan a nadie. |
+| noprmt016 | Se quitó la opción **Desactivar**. Se dejó **Activar** (para reingresos). |
+| noprmt003 | `fecha_salida` salió de las 2 UPDATE activas y en `nofmmt003.4fd` quedó `noEntry` (compilar en GST). `observacion` sigue editable. |
+
+## Tablas y vista (ya creadas en .40.8 / marmotech)
+- `adtb00061` causas: 1 Renuncia, 2 Abandono, 3 Dimisión (V); 4 Desahucio, 5 Despido, 6 Cierre de operación, 7 Fin de contrato/temporada, 8 No superó prueba (I); 9 Mutuo acuerdo, 10 Pensión, 11 Fallecimiento, 12 Traslado dentro del grupo (`cuenta_rotacion = 'N'`), 99 Otra (O).
+- `adtb00062` detalle: guarda una foto del departamento, el puesto, `tipo_empleado` (NORMAL/TEMPORERO) y la fecha de ingreso al momento de la salida.
+- `vw_rotacion_mensual`: por mes, departamento y tipo de empleado: plantilla al inicio, ingresos, salidas, salidas que cuentan para rotación, voluntarias, involuntarias, otras y % de rotación. Usa un CTE recursivo desde 2022, que llega al límite de 100 meses en 2030.
+
+## Histórico (pendiente de aprobación)
+`adprmt017_desvinculacion_historico.sql` clasifica las salidas desde 2022 leyendo `observacion`. Vista previa (con rollback): 686 salidas → Desahucio 342, Renuncia 127, Abandono 31, Cierre 8, Fallecimiento 7, Traslado 3, Fin de contrato 2, Prueba 1, Pensión 1, **Otra 164** (sin texto o sin causa reconocible). Para deshacer: `DELETE FROM adtb00062 WHERE origen='H'`.
+
+## Temporeros
+Solo 2 empleados tienen `tipo_empleado = 'TEMPORERO'`. Para medir la entrada y salida de temporeros, RRHH tiene que marcarlos en la maestra (noprmt003). La vista ya los separa.
+
+## Backups
+- `addir\backup_adprmt017_20261005\`: original y `adprmt017_con_capacitacion.4gl`, que es la versión intermedia.
+- `nodir\backup_noprmt003_016_20261005\`: noprmt003, noprmt016, sus formas y binarios.
+
+## Despliegue
+Copiar a `PROYECTO\bin` (todo compilado con 3.20): `adprmt017.42m`, `adfmwd017.42f`, `adfmwd018.42f`, `noprmt003.42m`, `noprmt016.42m`, y el `nofmmt003.42f` que se genere en GST.
diff --git a/PROYECTO/addir/adprmt017_desvinculacion_historico.sql b/PROYECTO/addir/adprmt017_desvinculacion_historico.sql
new file mode 100644
index 0000000..0132f4b
--- /dev/null
+++ b/PROYECTO/addir/adprmt017_desvinculacion_historico.sql
@@ -0,0 +1,44 @@
+/* ------------------------------------------------------------------
+ Carga historica de salidas (2022 en adelante) en adtb00062
+ desde adtb00003 (status_t = 'D' + fecha_salida + observacion libre).
+ origen = 'H'. Para deshacer: DELETE FROM adtb00062 WHERE origen = 'H'
+ Correr DESPUES de adprmt017_desvinculacion.sql. Idempotente.
+------------------------------------------------------------------- */
+SET NOCOUNT ON;
+
+;WITH h AS (
+ SELECT a.num_emp, a.fecha_salida, a.departamento, a.cod_puesto,
+ ISNULL(a.tipo_empleado,'NORMAL') AS tipo_empleado, a.fech_efec,
+ UPPER(ISNULL(a.observacion,'')) AS obs
+ FROM dbo.adtb00003 a
+ WHERE a.status_t = 'D'
+ AND a.fecha_salida >= '2022-01-01'
+ AND a.num_emp >= 39
+ AND NOT EXISTS (SELECT 1 FROM dbo.adtb00062 d WHERE d.num_emp = a.num_emp AND d.fecha_salida = a.fecha_salida)
+)
+INSERT INTO dbo.adtb00062 (num_trx, num_emp, fecha_salida, cod_causa, recontratable, detalle,
+ departamento, cod_puesto, tipo_empleado, fech_ingreso, origen, us_crea, fech_crea)
+SELECT NULL, h.num_emp, h.fecha_salida,
+ CASE WHEN h.obs LIKE '%CAMBIO DE EMPRESA%' OR h.obs LIKE '%CAMBIO A ORDEL%'
+ OR h.obs LIKE '%CAMBIO A CARIBBEAN%' OR h.obs LIKE '%TRASLAD%' THEN 12
+ WHEN h.obs LIKE '%CIERRE%' THEN 6
+ WHEN h.obs LIKE '%DESAHUCIO%' THEN 4
+ WHEN h.obs LIKE '%DESPID%' THEN 5
+ WHEN h.obs LIKE '%RENUNCIA%' THEN 1
+ WHEN h.obs LIKE '%ABANDONO%' THEN 2
+ WHEN h.obs LIKE '%DIMISION%' THEN 3
+ WHEN h.obs LIKE '%3 MESES%' OR h.obs LIKE '%PRUEBA%' THEN 8
+ WHEN h.obs LIKE '%FIN DE CONTRATO%' OR h.obs LIKE '%TEMPORADA%' THEN 7
+ WHEN h.obs LIKE '%MUTUO%' THEN 9
+ WHEN h.obs LIKE '%PENSION%' OR h.obs LIKE '%RETIRO%' THEN 10
+ WHEN h.obs LIKE '%FALLEC%' THEN 11
+ ELSE 99 END,
+ CASE WHEN h.obs LIKE '%NO REINGRESO%' OR h.obs LIKE '%NO RECONTRAT%' THEN 'N' END,
+ LEFT(NULLIF(LTRIM(RTRIM(h.obs)),''), 200),
+ h.departamento, h.cod_puesto, h.tipo_empleado, h.fech_efec, 'H', SUSER_SNAME(), GETDATE()
+FROM h;
+
+SELECT c.desc_causa, COUNT(*) n
+FROM dbo.adtb00062 d JOIN dbo.adtb00061 c ON c.cod_causa = d.cod_causa
+WHERE d.origen = 'H'
+GROUP BY c.desc_causa ORDER BY 2 DESC;
diff --git a/PROYECTO/addir/adprrp048.4gl b/PROYECTO/addir/adprrp048.4gl
new file mode 100644
index 0000000..c7abe7d
--- /dev/null
+++ b/PROYECTO/addir/adprrp048.4gl
@@ -0,0 +1,276 @@
+{
+-------------------------------------------------------------------------------
+PROGRAMA : ADPRRP048
+OBJETIVO : Horas de capacitacion por colaborador (indicador RRHH).
+ Por colaborador: cada capacitacion REQUERIDA con sus
+ horas y, debajo, las TOMADAS que la cubren; luego las
+ tomadas no planificadas. Totales por colaborador y
+ generales con % de cumplimiento.
+ Datos: adtb00060 (detalle) / adtb00059 (catalogo),
+ registrados por ADPRMT017 (Accion de Personal).
+FECHA REALIZACION : Octubre 05, 2026
+-------------------------------------------------------------------------------
+}
+GLOBALS "adprgb000.4gl"
+
+DEFINE p RECORD
+ fecha_ini DATE,
+ fecha_fin DATE,
+ departamento SMALLINT,
+ num_emp INTEGER,
+ solo_pend CHAR(1)
+END RECORD
+DEFINE filtros VARCHAR(200)
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+ CALL ARG_VAL(3) RETURNING impresor
+
+ CONNECT TO "smarmotech" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL adprrp048()
+END MAIN
+
+FUNCTION adprrp048()
+ DEFINE x RECORD
+ num_emp INTEGER,
+ empleado VARCHAR(60),
+ nom_dpto VARCHAR(40),
+ nom_puesto VARCHAR(40),
+ fila VARCHAR(20),
+ nom_cap VARCHAR(100),
+ tipo_evento VARCHAR(15),
+ fecha_ini DATE,
+ fecha_fin DATE,
+ h_req DECIMAL(8,2),
+ h_tom DECIMAL(8,2),
+ h_pend DECIMAL(8,2),
+ h_tom_t DECIMAL(8,2),
+ institucion VARCHAR(100)
+ END RECORD
+ DEFINE cb ui.ComboBox,
+ xdep SMALLINT,
+ xnom VARCHAR(40),
+ nfilas INTEGER
+
+ OPTIONS
+ FORM LINE 8,
+ ERROR LINE 23,
+ COMMENT LINE 21
+
+ OPEN FORM adfmrp048 FROM "adfmrp048"
+ DISPLAY FORM adfmrp048
+
+ LET cb = ui.ComboBox.forName("formonly.departamento")
+ CALL cb.clear()
+ CALL cb.addItem(0, "TODOS")
+ DECLARE c_dep48 CURSOR FOR
+ SELECT a.departamento, a.nom_dpto FROM adtb00001 a
+ WHERE a.status_t IS NULL ORDER BY a.nom_dpto
+ FOREACH c_dep48 INTO xdep, xnom
+ CALL cb.addItem(xdep, xnom CLIPPED)
+ END FOREACH
+
+ LET p.fecha_ini = MDY(1, 1, YEAR(TODAY))
+ LET p.fecha_fin = MDY(12, 31, YEAR(TODAY))
+ LET p.departamento = 0
+ LET p.num_emp = NULL -- variable de modulo: arranca en 0, no en NULL
+ LET p.solo_pend = "N"
+
+ INPUT BY NAME p.* WITHOUT DEFAULTS ATTRIBUTE(UNBUFFERED)
+ AFTER INPUT
+ IF int_flag THEN
+ EXIT INPUT
+ END IF
+ IF p.fecha_ini IS NULL OR p.fecha_fin IS NULL OR p.fecha_fin < p.fecha_ini THEN
+ CALL fgl_winmessage("INFO","REVISE EL RANGO DE FECHAS","info")
+ NEXT FIELD fecha_ini
+ END IF
+ END INPUT
+ IF int_flag THEN
+ LET int_flag = FALSE
+ CALL msg(2)
+ RETURN
+ END IF
+
+ ----------------------------------------------------------------------
+ -- Filas: R (requerida, con lo tomado acumulado), T ligada (debajo de su
+ -- requerida) y T no planificada (al final). El rango de fechas se mide
+ -- sobre la fecha de inicio de la requerida (o de la tomada si no tiene).
+ ----------------------------------------------------------------------
+ LET selec =
+ "SELECT e.num_emp, ",
+ " RTRIM(e.nom1_emp)+' '+RTRIM(e.apell1_emp)+ISNULL(' '+RTRIM(e.apell2_emp),''), ",
+ " ISNULL(d.nom_dpto,''), ISNULL(pu.nom_puesto,''), ",
+ " CASE WHEN r.tipo_reg = 'R' THEN 'REQUERIDA' ",
+ " WHEN r.id_requerida IS NOT NULL THEN ' TOMADA' ",
+ " ELSE 'NO PLANIFICADA' END, ",
+ " c.nom_cap, ",
+ " CASE c.evento WHEN 1 THEN 'SEMINARIO' WHEN 2 THEN 'CURSO' ",
+ " WHEN 3 THEN 'TALLER' WHEN 4 THEN 'CONFERENCIA' ELSE '' END, ",
+ " r.fecha_ini, r.fecha_fin, ",
+ " CASE WHEN r.tipo_reg = 'R' THEN ISNULL(r.horas_req,0) END, ",
+ " CASE WHEN r.tipo_reg = 'R' THEN ISNULL(t.tom,0) ELSE ISNULL(r.horas_tom,0) END, ",
+ " CASE WHEN r.tipo_reg = 'R' THEN ",
+ " CASE WHEN ISNULL(r.horas_req,0) - ISNULL(t.tom,0) > 0 ",
+ " THEN ISNULL(r.horas_req,0) - ISNULL(t.tom,0) ELSE 0 END END, ",
+ " CASE WHEN r.tipo_reg = 'T' THEN ISNULL(r.horas_tom,0) ELSE 0 END, ",
+ " ISNULL(r.institucion,'') ",
+ "FROM adtb00060 r ",
+ " JOIN adtb00059 c ON c.cod_cap = r.cod_cap ",
+ " JOIN adtb00003 e ON e.num_emp = r.num_emp ",
+ " LEFT JOIN adtb00001 d ON d.departamento = e.departamento ",
+ " LEFT JOIN adtb00004 pu ON pu.cod_puesto = e.cod_puesto ",
+ " LEFT JOIN adtb00060 q ON q.id_cap = r.id_requerida ",
+ " LEFT JOIN (SELECT id_requerida, SUM(horas_tom) tom FROM adtb00060 ",
+ " WHERE tipo_reg = 'T' AND status_t IS NULL AND id_requerida IS NOT NULL ",
+ " GROUP BY id_requerida) t ON t.id_requerida = r.id_cap ",
+ "WHERE r.status_t IS NULL ",
+ " AND ISNULL(q.fecha_ini, r.fecha_ini) BETWEEN ? AND ? "
+
+ LET filtros = "Periodo: ", p.fecha_ini USING "dd/mm/yyyy", " al ", p.fecha_fin USING "dd/mm/yyyy"
+ IF p.departamento IS NOT NULL AND p.departamento <> 0 THEN
+ LET selec = selec, " AND e.departamento = ", p.departamento USING "<<<<&"
+ SELECT a.nom_dpto INTO xnom FROM adtb00001 a WHERE a.departamento = p.departamento
+ LET filtros = filtros CLIPPED, " Departamento: ", xnom CLIPPED
+ ELSE
+ LET filtros = filtros CLIPPED, " Departamento: TODOS"
+ END IF
+ IF p.num_emp IS NOT NULL AND p.num_emp <> 0 THEN
+ LET selec = selec, " AND e.num_emp = ", p.num_emp USING "<<<<<<&"
+ LET filtros = filtros CLIPPED, " Ficha: ", p.num_emp USING "<<<<<<&"
+ END IF
+ IF p.solo_pend = "S" THEN
+ LET selec = selec,
+ " AND EXISTS (SELECT 1 FROM adtb00060 r2 ",
+ " LEFT JOIN (SELECT id_requerida, SUM(horas_tom) tom FROM adtb00060 ",
+ " WHERE tipo_reg = 'T' AND status_t IS NULL GROUP BY id_requerida) t2 ",
+ " ON t2.id_requerida = r2.id_cap ",
+ " WHERE r2.num_emp = r.num_emp AND r2.tipo_reg = 'R' AND r2.status_t IS NULL ",
+ " AND r2.fecha_ini BETWEEN ? AND ? ",
+ " AND ISNULL(r2.horas_req,0) - ISNULL(t2.tom,0) > 0) "
+ LET filtros = filtros CLIPPED, " Solo con pendientes"
+ END IF
+ LET selec = selec,
+ " ORDER BY ISNULL(d.nom_dpto,''), 2, e.num_emp, ",
+ " CASE WHEN r.tipo_reg = 'T' AND r.id_requerida IS NULL THEN 1 ELSE 0 END, ",
+ " ISNULL(r.id_requerida, r.id_cap), ",
+ " CASE WHEN r.tipo_reg = 'R' THEN 0 ELSE 1 END, r.fecha_ini"
+
+ PREPARE p_rep48 FROM selec
+ DECLARE c_rep48 CURSOR FOR p_rep48
+
+ -- Configuracion del motor de reportes (.4rp)
+ LET r_filename = "adprrp048.4rp"
+ LET preview = TRUE
+ IF NOT fgl_report_loadCurrentSettings(r_filename) THEN
+ CALL fgl_winmessage("INFO","No se pudo cargar el diseno adprrp048.4rp","stop")
+ RETURN
+ END IF
+ CALL seleccionarSalida() RETURNING r_output
+ CALL fgl_report_selectDevice(r_output)
+ CALL fgl_report_selectPreview(preview)
+ IF r_output = "XLSX" THEN
+ CALL fgl_report_configurexlsxdevice(NULL,NULL,NULL,FALSE,FALSE,NULL,1)
+ END IF
+ LET handler = fgl_report_commitCurrentSettings()
+ IF handler IS NULL THEN
+ RETURN
+ END IF
+
+ LET nfilas = 0
+ START REPORT capacitacion TO XML HANDLER handler
+ IF p.solo_pend = "S" THEN
+ OPEN c_rep48 USING p.fecha_ini, p.fecha_fin, p.fecha_ini, p.fecha_fin
+ ELSE
+ OPEN c_rep48 USING p.fecha_ini, p.fecha_fin
+ END IF
+ WHILE TRUE
+ FETCH c_rep48 INTO x.*
+ IF STATUS = NOTFOUND THEN
+ EXIT WHILE
+ END IF
+ LET nfilas = nfilas + 1
+ OUTPUT TO REPORT capacitacion(x.*)
+ END WHILE
+ CLOSE c_rep48
+ FINISH REPORT capacitacion
+
+ IF nfilas = 0 THEN
+ CALL fgl_winmessage("INFO","No hay capacitaciones registradas con esos parametros","info")
+ END IF
+END FUNCTION
+
+FUNCTION pct48(a, b)
+ DEFINE a, b DECIMAL(10,2)
+ IF b IS NULL OR b = 0 THEN
+ RETURN 0
+ END IF
+ RETURN (a / b) * 100
+END FUNCTION
+
+REPORT capacitacion(x)
+ DEFINE x RECORD
+ num_emp INTEGER,
+ empleado VARCHAR(60),
+ nom_dpto VARCHAR(40),
+ nom_puesto VARCHAR(40),
+ fila VARCHAR(20),
+ nom_cap VARCHAR(100),
+ tipo_evento VARCHAR(15),
+ fecha_ini DATE,
+ fecha_fin DATE,
+ h_req DECIMAL(8,2),
+ h_tom DECIMAL(8,2),
+ h_pend DECIMAL(8,2),
+ h_tom_t DECIMAL(8,2),
+ institucion VARCHAR(100)
+ END RECORD
+ DEFINE fecha_rep CHAR(10),
+ hora CHAR(8),
+ fini, ffin CHAR(10),
+ g_req, g_tom, g_pend, g_cumpl DECIMAL(10,2),
+ t_req, t_tom, t_pend, t_cumpl DECIMAL(10,2),
+ t_emp INTEGER
+
+ ORDER EXTERNAL BY x.num_emp
+
+ FORMAT
+ FIRST PAGE HEADER
+ LET fecha_rep = TODAY USING "dd/mm/yyyy"
+ LET hora = CURRENT HOUR TO SECOND
+ LET t_emp = 0
+ PRINTX p_companias.nombre, fecha_rep, hora, filtros
+
+ BEFORE GROUP OF x.num_emp
+ LET t_emp = t_emp + 1
+ PRINTX x.num_emp, x.empleado, x.nom_dpto, x.nom_puesto
+
+ ON EVERY ROW
+ LET fini = x.fecha_ini USING "dd/mm/yyyy"
+ LET ffin = x.fecha_fin USING "dd/mm/yyyy"
+ PRINTX x.fila, x.nom_cap, x.tipo_evento, fini, ffin,
+ x.h_req, x.h_tom, x.h_pend, x.institucion
+
+ AFTER GROUP OF x.num_emp
+ LET g_req = GROUP SUM(x.h_req)
+ LET g_tom = GROUP SUM(x.h_tom_t)
+ LET g_pend = GROUP SUM(x.h_pend)
+ IF g_req IS NULL THEN LET g_req = 0 END IF
+ IF g_tom IS NULL THEN LET g_tom = 0 END IF
+ IF g_pend IS NULL THEN LET g_pend = 0 END IF
+ LET g_cumpl = pct48(g_req - g_pend, g_req)
+ PRINTX g_req, g_tom, g_pend, g_cumpl
+
+ ON LAST ROW
+ LET t_req = SUM(x.h_req)
+ LET t_tom = SUM(x.h_tom_t)
+ LET t_pend = SUM(x.h_pend)
+ IF t_req IS NULL THEN LET t_req = 0 END IF
+ IF t_tom IS NULL THEN LET t_tom = 0 END IF
+ IF t_pend IS NULL THEN LET t_pend = 0 END IF
+ LET t_cumpl = pct48(t_req - t_pend, t_req)
+ PRINTX t_emp, t_req, t_tom, t_pend, t_cumpl
+END REPORT
diff --git a/PROYECTO/addir/adprrp049.4gl b/PROYECTO/addir/adprrp049.4gl
new file mode 100644
index 0000000..0a8c1ef
--- /dev/null
+++ b/PROYECTO/addir/adprrp049.4gl
@@ -0,0 +1,354 @@
+{
+-------------------------------------------------------------------------------
+PROGRAMA : ADPRRP049
+OBJETIVO : Rotacion laboral (indicador RRHH).
+ R = Resumen mensual: plantilla al inicio del mes,
+ ingresos, salidas (voluntarias / involuntarias /
+ otras) y % de rotacion; total y rotacion anual.
+ D = Detalle de salidas agrupado por causa.
+ Datos: vista vw_rotacion_mensual y adtb00062/adtb00061
+ (desvinculaciones registradas por ADPRMT017; historico
+ 2022+ cargado con origen 'H').
+ Rotacion % = salidas que cuentan para rotacion /
+ plantilla al inicio (los traslados dentro del grupo
+ no cuentan). Anual = salidas del ano / plantilla
+ promedio de los meses del ano.
+FECHA REALIZACION : Octubre 05, 2026
+-------------------------------------------------------------------------------
+}
+GLOBALS "adprgb000.4gl"
+
+DEFINE p RECORD
+ ano_ini SMALLINT,
+ ano_fin SMALLINT,
+ departamento SMALLINT,
+ tipo_emp VARCHAR(10),
+ formato CHAR(1)
+END RECORD
+DEFINE filtros VARCHAR(200)
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+ CALL ARG_VAL(3) RETURNING impresor
+
+ CONNECT TO "smarmotech" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL adprrp049()
+END MAIN
+
+FUNCTION adprrp049()
+ DEFINE cb ui.ComboBox,
+ xdep SMALLINT,
+ xnom VARCHAR(40)
+
+ OPTIONS
+ FORM LINE 8,
+ ERROR LINE 23,
+ COMMENT LINE 21
+
+ OPEN FORM adfmrp049 FROM "adfmrp049"
+ DISPLAY FORM adfmrp049
+
+ LET cb = ui.ComboBox.forName("formonly.departamento")
+ CALL cb.clear()
+ CALL cb.addItem(0, "TODOS")
+ DECLARE c_dep49 CURSOR FOR
+ SELECT a.departamento, a.nom_dpto FROM adtb00001 a
+ WHERE a.status_t IS NULL ORDER BY a.nom_dpto
+ FOREACH c_dep49 INTO xdep, xnom
+ CALL cb.addItem(xdep, xnom CLIPPED)
+ END FOREACH
+
+ LET p.ano_ini = YEAR(TODAY) - 1
+ LET p.ano_fin = YEAR(TODAY)
+ LET p.departamento = 0
+ LET p.tipo_emp = "TODOS"
+ LET p.formato = "R"
+
+ INPUT BY NAME p.* WITHOUT DEFAULTS ATTRIBUTE(UNBUFFERED)
+ AFTER INPUT
+ IF int_flag THEN
+ EXIT INPUT
+ END IF
+ IF p.ano_ini IS NULL OR p.ano_fin IS NULL OR p.ano_fin < p.ano_ini
+ OR p.ano_ini < 2022 THEN
+ CALL fgl_winmessage("INFO","REVISE LOS ANOS (EL HISTORICO EMPIEZA EN 2022)","info")
+ NEXT FIELD ano_ini
+ END IF
+ END INPUT
+ IF int_flag THEN
+ LET int_flag = FALSE
+ CALL msg(2)
+ RETURN
+ END IF
+
+ LET filtros = "Anos: ", p.ano_ini USING "<<<<", " a ", p.ano_fin USING "<<<<"
+ IF p.departamento IS NOT NULL AND p.departamento <> 0 THEN
+ SELECT a.nom_dpto INTO xnom FROM adtb00001 a WHERE a.departamento = p.departamento
+ LET filtros = filtros CLIPPED, " Departamento: ", xnom CLIPPED
+ ELSE
+ LET filtros = filtros CLIPPED, " Departamento: TODOS"
+ END IF
+ LET filtros = filtros CLIPPED, " Tipo de empleado: ", p.tipo_emp CLIPPED
+
+ IF p.formato = "D" THEN
+ LET r_filename = "adprrp049d.4rp"
+ ELSE
+ LET r_filename = "adprrp049.4rp"
+ END IF
+ LET preview = TRUE
+ IF NOT fgl_report_loadCurrentSettings(r_filename) THEN
+ CALL fgl_winmessage("INFO","No se pudo cargar el diseno " || r_filename CLIPPED,"stop")
+ RETURN
+ END IF
+ CALL seleccionarSalida() RETURNING r_output
+ CALL fgl_report_selectDevice(r_output)
+ CALL fgl_report_selectPreview(preview)
+ IF r_output = "XLSX" THEN
+ CALL fgl_report_configurexlsxdevice(NULL,NULL,NULL,FALSE,FALSE,NULL,1)
+ END IF
+ LET handler = fgl_report_commitCurrentSettings()
+ IF handler IS NULL THEN
+ RETURN
+ END IF
+
+ IF p.formato = "D" THEN
+ CALL detalle_salidas()
+ ELSE
+ CALL resumen_mensual()
+ END IF
+END FUNCTION
+
+## R: UNA FILA POR MES (SUMA DE LOS DEPARTAMENTOS / TIPOS FILTRADOS)
+FUNCTION resumen_mensual()
+ DEFINE x RECORD
+ anio SMALLINT,
+ mes_num SMALLINT,
+ mes_nom VARCHAR(12),
+ plantilla INTEGER,
+ ingresos INTEGER,
+ salidas INTEGER,
+ salidas_rot INTEGER,
+ voluntarias INTEGER,
+ involuntarias INTEGER,
+ otras INTEGER,
+ rot_pct DECIMAL(8,2)
+ END RECORD
+ DEFINE n INTEGER
+
+ LET selec =
+ "SELECT anio, mes_num, SUM(plantilla_inicio), SUM(ingresos), SUM(salidas), ",
+ " SUM(salidas_rotacion), SUM(voluntarias), SUM(involuntarias), SUM(otras) ",
+ "FROM vw_rotacion_mensual WHERE anio BETWEEN ? AND ? "
+ IF p.departamento IS NOT NULL AND p.departamento <> 0 THEN
+ LET selec = selec, " AND departamento = ", p.departamento USING "<<<<&"
+ END IF
+ IF p.tipo_emp <> "TODOS" THEN
+ LET selec = selec, " AND tipo_empleado = '", p.tipo_emp CLIPPED, "'"
+ END IF
+ LET selec = selec, " GROUP BY anio, mes_num ORDER BY anio, mes_num"
+
+ PREPARE p_res49 FROM selec
+ DECLARE c_res49 CURSOR FOR p_res49
+
+ LET n = 0
+ START REPORT rotacion TO XML HANDLER handler
+ FOREACH c_res49 USING p.ano_ini, p.ano_fin
+ INTO x.anio, x.mes_num, x.plantilla, x.ingresos, x.salidas,
+ x.salidas_rot, x.voluntarias, x.involuntarias, x.otras
+ LET n = n + 1
+ LET x.mes_nom = nombre_mes(x.mes_num)
+ LET x.rot_pct = pct49(x.salidas_rot, x.plantilla)
+ OUTPUT TO REPORT rotacion(x.*)
+ END FOREACH
+ FINISH REPORT rotacion
+ IF n = 0 THEN
+ CALL fgl_winmessage("INFO","No hay datos con esos parametros","info")
+ END IF
+END FUNCTION
+
+## D: DETALLE DE SALIDAS AGRUPADO POR CAUSA
+FUNCTION detalle_salidas()
+ DEFINE y RECORD
+ clase VARCHAR(15),
+ cod_causa SMALLINT,
+ desc_causa VARCHAR(60),
+ fecha_sal DATE,
+ num_emp INTEGER,
+ empleado VARCHAR(60),
+ nom_dpto VARCHAR(40),
+ nom_puesto VARCHAR(40),
+ tipo_emp VARCHAR(20),
+ meses INTEGER,
+ recont VARCHAR(3),
+ detalle VARCHAR(200)
+ END RECORD
+ DEFINE n INTEGER
+
+ LET selec =
+ "SELECT CASE c.clase WHEN 'V' THEN 'VOLUNTARIA' WHEN 'I' THEN 'INVOLUNTARIA' ELSE 'OTRA' END, ",
+ " c.cod_causa, c.desc_causa, d.fecha_salida, d.num_emp, ",
+ " RTRIM(e.nom1_emp)+' '+RTRIM(e.apell1_emp)+ISNULL(' '+RTRIM(e.apell2_emp),''), ",
+ " ISNULL(dp.nom_dpto,''), ISNULL(pu.nom_puesto,''), ISNULL(d.tipo_empleado,'NORMAL'), ",
+ " CASE WHEN d.fech_ingreso IS NULL THEN NULL ELSE DATEDIFF(month, d.fech_ingreso, d.fecha_salida) END, ",
+ " CASE d.recontratable WHEN 'S' THEN 'SI' WHEN 'N' THEN 'NO' ELSE '' END, ",
+ " ISNULL(d.detalle,'') ",
+ "FROM adtb00062 d ",
+ " JOIN adtb00061 c ON c.cod_causa = d.cod_causa ",
+ " JOIN adtb00003 e ON e.num_emp = d.num_emp ",
+ " LEFT JOIN adtb00001 dp ON dp.departamento = d.departamento ",
+ " LEFT JOIN adtb00004 pu ON pu.cod_puesto = d.cod_puesto ",
+ "WHERE d.status_t IS NULL AND YEAR(d.fecha_salida) BETWEEN ? AND ? "
+ IF p.departamento IS NOT NULL AND p.departamento <> 0 THEN
+ LET selec = selec, " AND d.departamento = ", p.departamento USING "<<<<&"
+ END IF
+ IF p.tipo_emp <> "TODOS" THEN
+ LET selec = selec, " AND ISNULL(d.tipo_empleado,'NORMAL') = '", p.tipo_emp CLIPPED, "'"
+ END IF
+ LET selec = selec,
+ " ORDER BY CASE c.clase WHEN 'V' THEN 1 WHEN 'I' THEN 2 ELSE 3 END, c.cod_causa, d.fecha_salida"
+
+ PREPARE p_det49 FROM selec
+ DECLARE c_det49 CURSOR FOR p_det49
+
+ LET n = 0
+ START REPORT salidas TO XML HANDLER handler
+ FOREACH c_det49 USING p.ano_ini, p.ano_fin INTO y.*
+ LET n = n + 1
+ OUTPUT TO REPORT salidas(y.*)
+ END FOREACH
+ FINISH REPORT salidas
+ IF n = 0 THEN
+ CALL fgl_winmessage("INFO","No hay salidas con esos parametros","info")
+ END IF
+END FUNCTION
+
+FUNCTION nombre_mes(m)
+ DEFINE m SMALLINT
+ CASE m
+ WHEN 1 RETURN "ENERO"
+ WHEN 2 RETURN "FEBRERO"
+ WHEN 3 RETURN "MARZO"
+ WHEN 4 RETURN "ABRIL"
+ WHEN 5 RETURN "MAYO"
+ WHEN 6 RETURN "JUNIO"
+ WHEN 7 RETURN "JULIO"
+ WHEN 8 RETURN "AGOSTO"
+ WHEN 9 RETURN "SEPTIEMBRE"
+ WHEN 10 RETURN "OCTUBRE"
+ WHEN 11 RETURN "NOVIEMBRE"
+ WHEN 12 RETURN "DICIEMBRE"
+ END CASE
+ RETURN NULL
+END FUNCTION
+
+FUNCTION pct49(a, b)
+ DEFINE a, b DECIMAL(12,2)
+ IF b IS NULL OR b = 0 OR a IS NULL THEN
+ RETURN 0
+ END IF
+ RETURN (a / b) * 100
+END FUNCTION
+
+REPORT rotacion(x)
+ DEFINE x RECORD
+ anio SMALLINT,
+ mes_num SMALLINT,
+ mes_nom VARCHAR(12),
+ plantilla INTEGER,
+ ingresos INTEGER,
+ salidas INTEGER,
+ salidas_rot INTEGER,
+ voluntarias INTEGER,
+ involuntarias INTEGER,
+ otras INTEGER,
+ rot_pct DECIMAL(8,2)
+ END RECORD
+ DEFINE fecha_rep CHAR(10),
+ hora CHAR(8),
+ a_plant DECIMAL(10,2),
+ a_ing, a_sal, a_rot, a_vol, a_inv, a_otr INTEGER,
+ a_pct DECIMAL(8,2),
+ t_ing, t_sal, t_vol, t_inv, t_otr INTEGER
+
+ ORDER EXTERNAL BY x.anio
+
+ FORMAT
+ FIRST PAGE HEADER
+ LET fecha_rep = TODAY USING "dd/mm/yyyy"
+ LET hora = CURRENT HOUR TO SECOND
+ PRINTX p_companias.nombre, fecha_rep, hora, filtros
+
+ BEFORE GROUP OF x.anio
+ PRINTX x.anio
+
+ ON EVERY ROW
+ PRINTX x.mes_nom, x.plantilla, x.ingresos, x.salidas, x.voluntarias,
+ x.involuntarias, x.otras, x.rot_pct
+
+ AFTER GROUP OF x.anio
+ LET a_plant = GROUP AVG(x.plantilla)
+ LET a_ing = GROUP SUM(x.ingresos)
+ LET a_sal = GROUP SUM(x.salidas)
+ LET a_rot = GROUP SUM(x.salidas_rot)
+ LET a_vol = GROUP SUM(x.voluntarias)
+ LET a_inv = GROUP SUM(x.involuntarias)
+ LET a_otr = GROUP SUM(x.otras)
+ LET a_pct = pct49(a_rot, a_plant)
+ PRINTX a_plant, a_ing, a_sal, a_vol, a_inv, a_otr, a_pct
+
+ ON LAST ROW
+ LET t_ing = SUM(x.ingresos)
+ LET t_sal = SUM(x.salidas)
+ LET t_vol = SUM(x.voluntarias)
+ LET t_inv = SUM(x.involuntarias)
+ LET t_otr = SUM(x.otras)
+ PRINTX t_ing, t_sal, t_vol, t_inv, t_otr
+END REPORT
+
+REPORT salidas(y)
+ DEFINE y RECORD
+ clase VARCHAR(15),
+ cod_causa SMALLINT,
+ desc_causa VARCHAR(60),
+ fecha_sal DATE,
+ num_emp INTEGER,
+ empleado VARCHAR(60),
+ nom_dpto VARCHAR(40),
+ nom_puesto VARCHAR(40),
+ tipo_emp VARCHAR(20),
+ meses INTEGER,
+ recont VARCHAR(3),
+ detalle VARCHAR(200)
+ END RECORD
+ DEFINE fecha_rep CHAR(10),
+ hora CHAR(8),
+ fsal CHAR(10),
+ g_cant, t_cant INTEGER
+
+ ORDER EXTERNAL BY y.cod_causa
+
+ FORMAT
+ FIRST PAGE HEADER
+ LET fecha_rep = TODAY USING "dd/mm/yyyy"
+ LET hora = CURRENT HOUR TO SECOND
+ PRINTX p_companias.nombre, fecha_rep, hora, filtros
+
+ BEFORE GROUP OF y.cod_causa
+ PRINTX y.desc_causa, y.clase
+
+ ON EVERY ROW
+ LET fsal = y.fecha_sal USING "dd/mm/yyyy"
+ PRINTX fsal, y.num_emp, y.empleado, y.nom_dpto, y.nom_puesto,
+ y.tipo_emp, y.meses, y.recont, y.detalle
+
+ AFTER GROUP OF y.cod_causa
+ LET g_cant = GROUP COUNT(*)
+ PRINTX g_cant
+
+ ON LAST ROW
+ LET t_cant = COUNT(*)
+ PRINTX t_cant
+END REPORT
diff --git a/PROYECTO/addir/backup_adprmt017_20261005/adfmmt017.4fd b/PROYECTO/addir/backup_adprmt017_20261005/adfmmt017.4fd
new file mode 100644
index 0000000..a303cde
--- /dev/null
+++ b/PROYECTO/addir/backup_adprmt017_20261005/adfmmt017.4fd
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4gl b/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4gl
new file mode 100644
index 0000000..2baf358
--- /dev/null
+++ b/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4gl
@@ -0,0 +1,2111 @@
+{
+------------------------------------------------------------------
+ PROGRAMA : ADPRMT017
+ OBJETIVO : Capturar, Modificar, Eliminar registros de la
+ Tabla de Accion de Personal
+ PROGRAMADOR : Tadeo A. Ferreras F.
+ FECHA REALIZACION : Junio 09, 1993
+------------------------------------------------------------------
+}
+GLOBALS "adprgb000.4gl"
+DEFINE fecha1 date
+#### VARIABLES PARA MODULO DE CALCULO DE VACACIONES ##########
+DEFINE cantidad_d INTEGER,
+ realiza_vacaciones BOOLEAN ,
+ estado_accion VARCHAR(20),
+ fecha_inicial,fecha_final DATE
+DEFINE vacacion RECORD
+ fecha_sal DATE,
+ fecha_ent DATE,
+ pano SMALLINT,
+ num_nomi INT,
+ dias_tomados DEC(12,2),
+ dias_vac INTEGER,
+ cod_mov1 SMALLINT,
+ cod_mov2 SMALLINT,
+ cod_mov3 SMALLINT,
+# num_nomi_no SMALLINT,
+ valor_vacaciones DEC(12,2),
+ descrip_mov1 CHAR(50),
+ descrip_mov2 CHAR(50),
+ descrip_mov3 CHAR(50)
+ END RECORD
+ DEFINE nombre_a CHAR(31),
+ cedula1 CHAR(20),
+ tipo_sexo CHAR(9),
+ xtipo VARCHAR(25)
+
+ DEFINE fecha5 DATE
+
+ DEFINE necesario RECORD LIKE adtb00012.*
+ DEFINE personal RECORD LIKE adtb00003.*
+ DEFINE dias2,vacac,pnis,xcod_mov,xcod_mov2,xcod_mov3 INTEGER
+ DEFINE tipo_sangre,optt CHAR(3),
+ tipo_sueldo CHAR(20),
+ proporcion_vacaciones,salario_quincenal DEC(12,2)
+
+#### MODULO MENU GENERAL DE ACCION DE NOMINA #####
+
+MAIN
+ DEFER INTERRUPT
+ CALL STARTLOG("adprmt17.log")
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+ CALL ARG_VAL(3) RETURNING impresor
+ CONNECT to "smarmotech" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL adprmt017()
+END MAIN
+
+FUNCTION adprmt017()
+ CLEAR SCREEN
+ OPTIONS
+ FORM LINE 8,
+ ERROR LINE 24,
+ COMMENT LINE 23,
+ PROMPT LINE 23
+
+ OPEN FORM adfmmt017 FROM "adfmmt017"
+ DISPLAY FORM adfmmt017
+
+ DISPLAY "adprmt017" AT 4,3 ATTRIBUTE(RED)
+ DISPLAY "Accion de Personal" AT 6,34 ATTRIBUTE(BLACK)
+
+ MENU
+ ON ACTION nuevo
+
+ let int_flag = false
+ INITIALIZE emplea.* TO NULL
+ CALL adpcad017()
+ ON ACTION buscar
+ let int_flag = false
+ CALL adpcmf017()
+ ON ACTION Salir
+ EXIT MENU
+ END MENU
+END FUNCTION
+
+##### PARA INSERTAR INFORMACION ####
+
+FUNCTION adpcad017()
+ # { WHENEVER ERROR CONTINUE}
+
+## CAPTURA LOS DATOS QUE VA A CONTENER EL REGISTRO
+
+ INPUT BY NAME acc_per.*,pnis
+ BEFORE INPUT
+ LET acc_per.fecha=TODAY
+ CALL codigos_accion()
+
+## VENTANAS PARA BUSCAR LOS DEPARTAMENTOS, NIVELES, PUESTOS, EMPLEADOS
+## Y LOS MOVIMIENTOS DE LOS EMPLEADOS
+ ON KEY (CONTROL-W)
+ CASE
+ WHEN INFIELD (departamento)
+ CALL busca_depto() RETURNING req_per.depart,nombre_dpto
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD departamento
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ LET acc_per.departamento = req_per.depart
+ DISPLAY BY NAME acc_per.departamento
+ NEXT FIELD nivel_emp
+
+ WHEN INFIELD (nivel_emp)
+ CALL busca_nivel()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD nivel_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD nivel_emp
+ END IF
+
+ DISPLAY BY NAME acc_per.nivel_emp
+ NEXT FIELD cod_puesto
+
+ WHEN INFIELD (num1_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num1_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+
+ LET descrip3 = nombre
+ LET acc_per.num1_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento1 = despl_emp[curr1].departamento
+ LET acc_per.nivel1_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod1_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num1_emp,acc_per.departamento1,
+ acc_per.nivel1_emp,acc_per.cod1_puesto
+ DISPLAY BY NAME descrip3 ATTRIBUTE(blue)
+ NEXT FIELD num2_emp
+
+ WHEN INFIELD (num2_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num2_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+
+ LET descrip4 = nombre
+ LET acc_per.num2_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento2 = despl_emp[curr1].departamento
+ LET acc_per.nivel2_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod2_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto
+ DISPLAY BY NAME descrip4 ATTRIBUTE(blue)
+ NEXT FIELD num3_emp
+
+ WHEN INFIELD (num3_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num3_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+
+ LET descrip5 = nombre
+ LET acc_per.num3_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento3 = despl_emp[curr1].departamento
+ LET acc_per.nivel3_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod3_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto
+ DISPLAY BY NAME descrip5
+
+ WHEN INFIELD (cod_puesto)
+ CALL busca_puesto() RETURNING acc_per.cod_puesto,puesto.nom_puesto
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD cod_puesto
+ END IF
+
+ DISPLAY BY NAME acc_per.cod_puesto
+ DISPLAY BY NAME puesto.nom_puesto ATTRIBUTE(blue)
+ NEXT FIELD sueldo_ac
+ END CASE
+
+## NUMERACION AUTOMATICA DEL FORMULARIO DE ACCION DE PERSONAL
+
+
+ AFTER FIELD cod_mto
+ IF acc_per.cod_mto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_mto
+ END IF
+
+ SELECT a.cod_mov,a.cod_mov2,a.cod_mov3,a.tipo_mov
+ INTO xcod_mov,xcod_mov2,xcod_mov3,xtipo FROM adtb00009 a
+ WHERE a.cod_mto = acc_per.cod_mto
+
+
+
+## CHEQUEA QUE NO SE REPITA EL MOVIMIENTO DE EMPLEO PARA EL MISMO SOLICITANTE
+ AFTER FIELD cod_sol
+ IF xtipo = "INGRESO" THEN
+
+ SELECT UNIQUE j.cod_sol FROM adtb00020 j
+ WHERE j.cod_sol = acc_per.cod_sol
+
+ IF STATUS != NOTFOUND THEN
+ LET numero_msg = 12
+ CALL msg(numero_msg)
+ NEXT FIELD cod_sol
+ END IF
+
+
+## SELECCIONA LA FECHA DE INGRESO Y EL SUELDO DE LA TABLA DE CONTRATACION
+## Y SELECCION DE EMPLEADOS
+
+ SELECT UNIQUE convert(char(10),a.fech_efec,101),a.sueldo,b.cod_sol
+ INTO contra.fech_efec,contra.sueldo,parece.cod_sol
+ FROM adtb00019 a,adtb00018 b
+ WHERE a.cod_sol = b.cod_sol and b.cod_sol = acc_per.cod_sol and
+ a.status_t is null
+
+ LET acc_per.fech_efec = contra.fech_efec
+ LET acc_per.sueldo_ac = contra.sueldo
+ DISPLAY BY NAME acc_per.fech_efec,acc_per.sueldo_ac
+ END IF
+
+
+ IF xtipo <> 'INGRESO' THEN
+ LET acc_per.cod_sol = NULL
+ NEXT FIELD fecha
+ END IF
+
+## VERIFICA QUE EL SOLICITANTE EXISTE EN LA TABLA DE SOLICITANTES. SI EXISTE
+## LO PRESENTA EN PANTALLA.
+
+ SELECT cod_sol,convert(char(10),fecha,101),nom1_sol,nom2_sol,apell1_sol,
+ apell2_sol,calle,casa_num,barrio,urbanizacion,telefono,
+ cod_provincia,convert(char(10),fech_nac,101),cod_nac,estado_civil,estatura,
+ peso,cedula,licencia,tipo_sangre,cod_puesto,
+ cod_prof,sexo,status_t,us_crea,fech_crea,us_mod,fech_mod,
+ serie
+ INTO necesario.cod_sol,necesario.fecha,necesario.nom1_sol,
+ necesario.nom2_sol,necesario.apell1_sol,necesario.apell2_sol,
+ necesario.calle,necesario.casa_num,necesario.barrio,
+ necesario.urbanizacion,necesario.telefono,necesario.cod_provincia,
+ necesario.fech_nac,necesario.cod_nac,necesario.estado_civil,
+ necesario.estatura,necesario.peso,necesario.cedula,necesario.licencia,
+ necesario.tipo_sangre,necesario.cod_puesto,
+ necesario.cod_prof,necesario.sexo,necesario.status_t,
+ necesario.us_crea,necesario.fech_crea,necesario.us_mod,
+ necesario.fech_mod,necesario.serie FROM adtb00012
+ WHERE @cod_sol = acc_per.cod_sol
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD cod_sol
+ END IF
+
+ LET nombre9 = necesario.nom1_sol
+ LET nombre10 = necesario.nom2_sol
+ LET apellido9 = necesario.apell1_sol
+ LET apellido10 = necesario.apell2_sol
+ LET descrip1 = nombre9 clipped," ",nombre10 clipped
+ LET descrip2 = apellido9 clipped," ",apellido10 clipped
+ LET tipo_sangre = necesario.tipo_sangre
+ LET acc_per.tipo_sangre = tipo_sangre
+
+ DISPLAY BY NAME descrip1,descrip2 ATTRIBUTE(blue)
+ DISPLAY BY NAME acc_per.tipo_sangre
+
+## SELECCIONA LOS DATOS FAMILIARES DEL SOLICITANTE PARA INTRODUCIRLOS EN LA
+## TABLA DE ACTUALIZACION DE INFORMACION PERSONAL
+
+ AFTER FIELD fecha
+ IF acc_per.fecha IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fecha
+ END IF
+
+ AFTER FIELD fech_efec
+ IF acc_per.fech_efec IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fech_efec
+ END IF
+
+ AFTER FIELD num_emp
+ IF acc_per.num_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+ END IF
+
+## CHEQUEA QUE EL EMPLEADO EXISTA EN LA TABLA DE EMPLEADOS. SI EXISTE
+## DESPLEGA TODA LA INFORMACION REFERENTE AL EMPLEADO.
+
+ IF xtipo <> 'INGRESO' THEN
+
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,b.nom1_emp,
+ b.nom2_emp,b.apell1_emp,b.apell2_emp,b.sueldo_ac,
+ b.nomina,b.estado_civil,b.tipo_sangre,
+ b.cedula,b.cuenta_no,CONVERT(char(10),b.fech_efec,103),b.tipo_sueldo
+ INTO acc_per.departamento,acc_per.nivel_emp,acc_per.cod_puesto,
+ nombre9,nombre10,apellido9,apellido10,acc_per.sueldo_ac,
+ acc_per.nomina,acc_per.estado_civil,acc_per.tipo_sangre,
+ acc_per.cedula,personal.cuenta_no,fecha5,tipo_sueldo
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num_emp AND (b.status_t IS NULL OR
+ b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+ END IF
+
+## VERIFICA QUE EL DEPARTAMENTO EXISTA EN LA TABLA DE DEPARTAMENTOS
+
+ SELECT nom_dpto INTO nombre_dpto FROM adtb00001
+ WHERE departamento = acc_per.departamento
+
+## VERIFICA QUE EL PUESTO EXISTA EN LA TABLA DE PUESTOS
+ SELECT k.nom_puesto INTO puesto.nom_puesto FROM adtb00004 k
+ WHERE k.cod_puesto = acc_per.cod_puesto and k.status_t is null
+
+ SELECT UNIQUE a.sexo INTO acc_per.sexo FROM adtb00021 a
+ WHERE a.num_emp = acc_per.num_emp AND a.cod_par = 0 AND
+ a.sec_par = 0
+
+ SELECT a.nis INTO pnis FROM adtb00030 a
+ WHERE a.num_emp = acc_per.num_emp
+
+ LET descrip1 = nombre9 clipped," ",nombre10 clipped
+ LET descrip2 = apellido9 clipped," ",apellido10 CLIPPED
+
+ DISPLAY BY NAME acc_per.departamento,acc_per.nivel_emp,
+ acc_per.cod_puesto,acc_per.sueldo_ac,
+ acc_per.nomina,acc_per.estado_civil,
+ acc_per.tipo_sangre,descrip1,descrip2,
+ nombre_dpto,puesto.nom_puesto,pnis,
+ personal.cuenta_no,acc_per.cedula,
+ acc_per.sexo,fecha5
+ ATTRIBUTE(blue)
+
+ END IF
+
+## CHEQUEA QUE EL DEPARTAMENTO EXISTA EN LA TABLA DE DEPARTAMENTOS
+ AFTER FIELD departamento
+ IF acc_per.departamento IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ SELECT nom_dpto INTO nombre_dpto FROM adtb00001
+ WHERE departamento = acc_per.departamento
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ DISPLAY BY NAME nombre_dpto ATTRIBUTE(blue)
+
+ AFTER FIELD nivel_emp
+ IF acc_per.nivel_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nivel_emp
+ END IF
+
+## CHEQUEA QUE EL PUESTO EXISTA EN LA TABLA DE PUESTOS
+ AFTER FIELD cod_puesto
+ IF acc_per.cod_puesto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ ELSE
+ SELECT k.nom_puesto INTO puesto.nom_puesto FROM adtb00004 k
+ WHERE k.cod_puesto =acc_per.cod_puesto and k.status_t is null
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ END IF
+
+## SELECCIONA EL NOMBRE DEL EMPLEADO DE LA TABLA DE EMPLEADOS
+ IF acc_per.cod_sol IS NULL THEN
+ SELECT b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp,b.tipo_sueldo
+ INTO nombre9,nombre10,apellido9,apellido10,tipo_sueldo
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num_emp and
+ (b.status_t is null or b.status_t != "E")
+
+ IF status >= 0 THEN
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+ END IF
+ ELSE
+
+ IF bandera = 1 THEN
+ CLEAR SCREEN
+ RETURN
+ END IF
+ END IF
+ ELSE
+ LET nombre9 = necesario.nom1_sol
+ LET nombre10 = necesario.nom2_sol
+ LET apellido9 = necesario.apell1_sol
+ LET apellido10 = necesario.apell2_sol
+ END IF
+ END IF
+ LET descrip1 = nombre9 clipped," ",nombre10 clipped
+ LET descrip2 = apellido9 clipped," ",apellido10 clipped
+
+ DISPLAY BY NAME descrip1,descrip2,puesto.nom_puesto ATTRIBUTE(blue)
+
+## LLAMA LA VENTANA DE LAS VACACIONES
+ IF xtipo = "VACACIONES" THEN
+ LET vacacion.fecha_sal=acc_per.fech_efec
+ CALL vacaciones('A') RETURNING realiza_vacaciones
+ IF NOT realiza_vacaciones THEN
+ RETURN
+ END IF
+ IF vacacion.fecha_sal IS NOT NULL THEN
+ NEXT FIELD observacion
+ ELSE
+ RETURN
+ END IF
+ END IF
+
+ AFTER FIELD sueldo_ac
+ IF acc_per.sueldo_ac IS NULL OR acc_per.sueldo_ac < 0 THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sueldo_ac
+ END IF
+
+
+
+## AQUI SE INCLUYE EL EMPLEADO QUE SOLICITA LA ACCION DE PERSONAL
+ AFTER FIELD num1_emp
+ IF acc_per.num1_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp,b.tipo_sueldo
+ INTO acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,nombre1,nombre2,apellido1,apellido2,tipo_sueldo
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num1_emp AND
+ (b.status_t IS NULL or b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+
+ LET descrip3 = nombre1 clipped," ",nombre2 clipped," ",
+ apellido1 clipped," ",apellido2 clipped
+
+ DISPLAY BY NAME acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,descrip3 ATTRIBUTE(blue)
+
+## AQUI SE INCLUYE EL EMPLEADO QUE AUTORIZA LA ACCION DE PERSONAL
+ AFTER FIELD num2_emp
+ IF acc_per.num2_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp,b.tipo_sueldo
+ INTO acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,nombre3,nombre4,apellido3,apellido4,tipo_sueldo
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num2_emp AND
+ (b.status_t IS NULL OR b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+
+ LET descrip4 = nombre3 clipped," ",nombre4 clipped," ",
+ apellido3 clipped," ",apellido4 clipped
+
+ DISPLAY BY NAME acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,descrip4 ATTRIBUTE(blue)
+
+## AQUI SE INCLUYE EL EMPLEADO QUE APRUEBA LA ACCION DE PERSONAL
+ AFTER FIELD num3_emp
+ IF acc_per.num3_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp,b.tipo_sueldo
+ INTO acc_per.departamento3,acc_per.nivel3_emp,
+ acc_per.cod3_puesto,nombre5,nombre6,apellido5,apellido6,tipo_sueldo
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num3_emp AND
+ (b.status_t IS NULL or b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+
+ LET descrip5 = nombre5 clipped," ",nombre6 clipped," ",
+ apellido5 clipped," ",apellido6 clipped
+
+ DISPLAY BY NAME acc_per.departamento3,acc_per.nivel3_emp,
+ acc_per.cod3_puesto,descrip5 ATTRIBUTE(blue)
+
+ AFTER INPUT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+ IF acc_per.fecha IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fecha
+ END IF
+
+ IF acc_per.fech_efec IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fech_efec
+ END IF
+
+ IF acc_per.num_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+ END IF
+
+ IF acc_per.departamento IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ IF acc_per.nivel_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nivel_emp
+ END IF
+
+ IF acc_per.cod_puesto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ END IF
+
+ IF acc_per.sueldo_ac IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sueldo_ac
+ END IF
+
+ IF acc_per.nomina IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nomina
+ END IF
+
+ IF acc_per.estado_civil IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD estado_civil
+ END IF
+
+ IF acc_per.cod_mto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_mto
+ END IF
+
+
+ IF acc_per.num1_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+
+ IF acc_per.num2_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+
+ IF acc_per.num3_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+ END INPUT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+## SE ASEGURA DE QUE TODA LA INFORMACION ESTE CORRECTA
+ PROMPT "Informacion Correcta? (S/N).." FOR CHAR opt
+ LET opt = UPSHIFT(opt)
+
+## SI NO HA OCURRIDO NINGUN PROBLEMA SE PROCEDE A INSERTAR LA INFORMACION
+## EN LA TABLA DE ACCION DE PERSONAL
+ IF opt = "S" THEN
+ SELECT max(a.num_trx) INTO acc_per.num_trx FROM adtb00020 a
+
+ if acc_per.num_trx IS NULL OR acc_per.num_trx=0 THEN
+ LET acc_per.num_trx=0
+ END IF
+ LET acc_per.num_trx=acc_per.num_trx+1
+ DISPLAY BY NAME acc_per.num_trx
+ BEGIN WORK
+ INSERT INTO adtb00020
+ VALUES(acc_per.num_trx,acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,
+ acc_per.num_emp,acc_per.departamento,acc_per.nivel_emp,
+ acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.tipo_sangre,acc_per.cod_mto,
+ acc_per.observacion,acc_per.num1_emp,
+ acc_per.departamento1,acc_per.nivel1_emp,acc_per.cod1_puesto,
+ acc_per.num2_emp,acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,null,SUSER_SNAME (),GETDATE(),
+ null,null,acc_per.sueldo_lq)
+
+ SELECT a.num_emp
+ FROM adtb00038 a
+ WHERE a.num_emp = acc_per.num_emp
+
+ IF STATUS = NOTFOUND THEN
+ INSERT INTO adtb00038
+ VALUES (acc_per.num_emp,acc_per.cedula)
+ END IF
+
+ SELECT a.num_emp
+ FROM adtb00030 a
+ WHERE a.num_emp = acc_per.num_emp
+
+ IF STATUS = NOTFOUND THEN
+ INSERT INTO adtb00030
+ VALUES (acc_per.num_emp,acc_per.sexo,pnis)
+ END IF
+
+ IF xtipo = "VACACIONES" THEN
+
+
+ INSERT INTO adtb00032
+ (num_trx
+ ,num_emp
+ ,cod_mov
+ ,cod_mov2
+ ,fecha
+ ,num_dia
+ ,us_crea
+ ,fech_crea
+ ,fecha_sal
+ ,fecha_ent
+ ,num_nomi
+ ,num_dias_pagados
+ # ,num_nomi_no
+ ,num_dias_disfrute
+ ,periodo
+ ,valor_vacaciones,
+ proporcion_vacaciones)
+
+ VALUES (acc_per.num_trx,acc_per.num_emp,vacacion.cod_mov1,vacacion.cod_mov2,
+ acc_per.fech_efec,vacacion.dias_tomados,
+ usuarios,GETDATE(),vacacion.fecha_sal,vacacion.fecha_ent,
+ vacacion.num_nomi,dias2,
+ vacacion.dias_vac, vacacion.pano,vacacion.valor_vacaciones,proporcion_vacaciones)
+ IF vacacion.cod_mov1 IS NOT NULL AND vacacion.num_nomi IS NOT NULL THEN
+ INSERT INTO notb00007 (num_nomi,tipo_emp,num_emp,departamento,departamento_afecta,nivel_emp,cod_puesto,cod_mov,valor,us_crea,
+ fech_crea,num_trx,cod_mto)
+ VALUES (vacacion.num_nomi,acc_per.nomina,acc_per.num_emp,acc_per.departamento,acc_per.departamento,acc_per.nivel_emp,
+ acc_per.cod_puesto,vacacion.cod_mov1,proporcion_vacaciones,usuarios,getdate(),
+ acc_per.num_trx,acc_per.cod_mto)
+ END IF
+ IF vacacion.cod_mov2 IS NOT NULL AND vacacion.num_nomi IS NOT NULL THEN
+ INSERT INTO notb00007 (num_nomi,tipo_emp,num_emp,departamento,departamento_afecta,nivel_emp,cod_puesto,cod_mov,valor,us_crea,
+ fech_crea,num_trx,cod_mto)
+ VALUES (vacacion.num_nomi,acc_per.nomina,acc_per.num_emp,acc_per.departamento,acc_per.departamento,acc_per.nivel_emp,
+ acc_per.cod_puesto,vacacion.cod_mov2,salario_quincenal,usuarios,getdate(),
+ acc_per.num_trx,acc_per.cod_mto)
+ END IF
+
+ END IF
+
+################## DATOS PARA INSERTAR O MODIFICAR PETB00003 ############
+ LET personal.num_emp = acc_per.num_emp
+ LET personal.departamento = acc_per.departamento
+ LET personal.nivel_emp = acc_per.nivel_emp
+ LET personal.cod_puesto = acc_per.cod_puesto
+ LET personal.apell1_emp = necesario.apell1_sol clipped
+ LET personal.apell2_emp = necesario.apell2_sol clipped
+ LET personal.nom1_emp = necesario.nom1_sol clipped
+ LET personal.nom2_emp = necesario.nom2_sol clipped
+ LET personal.calle = necesario.calle clipped
+ LET personal.casa_num = necesario.casa_num clipped
+ LET personal.barrio = necesario.barrio clipped
+ LET personal.urbanizacion = necesario.urbanizacion clipped
+ LET personal.telefono = necesario.telefono
+ LET personal.fech_nac = necesario.fech_nac
+ LET personal.cod_nac = necesario.cod_nac
+ LET personal.estado_civil = necesario.estado_civil
+ LET personal.tipo_sangre = necesario.tipo_sangre
+ LET personal.cedula = necesario.cedula
+ LET personal.serie = necesario.serie
+ LET personal.licencia = necesario.licencia
+ LET personal.sueldo_ac = acc_per.sueldo_ac
+ LET personal.nomina = acc_per.nomina
+ LET personal.estado_civil = acc_per.estado_civil
+ LET personal.tipo_sangre = acc_per.tipo_sangre
+ LET personal.fech_efec = acc_per.fech_efec
+
+## SE SELECCIONAN LOS NOMBRES Y LAS FECHAS DE NACIMIENTO DE LOS HIJOS PARA
+## INTRODUCIRLOS EN LA TABLA DE ACTUALIZACION DE INFORMACION PERSONAL
+
+################## DATOS PARA INSERTAR PETB00021 ############
+ LET actual.apell1_emp = necesario.apell1_sol clipped
+ LET actual.apell2_emp = necesario.apell2_sol clipped
+ LET actual.nom1_emp = necesario.nom1_sol clipped
+ LET actual.nom2_emp = necesario.nom2_sol clipped
+ LET actual.telefono = necesario.telefono
+ LET actual.calle = necesario.calle clipped
+ LET actual.casa_num = necesario.casa_num clipped
+ LET actual.barrio = necesario.barrio clipped
+ LET actual.urbanizacion = necesario.urbanizacion clipped
+ LET actual.estado_civil = necesario.estado_civil
+ LET actual.licencia = necesario.licencia
+ LET actual.num_emp = acc_per.num_emp
+ LET actual.departamento = acc_per.departamento
+ LET actual.nivel_emp = acc_per.nivel_emp
+ LET actual.cod_puesto = acc_per.cod_puesto
+
+## AQUI SE INSERTA O ACTUALIZA INFORMACION EN LA TABLA DE EMPLEADOS
+ IF xtipo = "INGRESO" THEN
+ LET personal.paga_seg = "N"
+ SELECT UNIQUE num_emp FROM adtb00003
+ WHERE num_emp = acc_per.num_emp
+
+ IF STATUS = NOTFOUND THEN
+ IF personal.cuenta_no IS NULL THEN
+ LET personal.cuenta_no = 0
+ END IF
+ INSERT INTO adtb00003 VALUES(personal.*)
+ ELSE
+
+ UPDATE adtb00003 SET (departamento,nivel_emp,cod_puesto,
+ nomina,status_t,us_crea,fech_crea,
+ us_mod,fech_mod) =
+ (acc_per.departamento,acc_per.nivel_emp,
+ acc_per.cod_puesto,acc_per.nomina,
+ null,SUSER_SNAME (),GETDATE(),SUSER_SNAME (),GETDATE())
+ WHERE num_emp = personal.num_emp
+
+ END IF
+
+## AQUI SE INSERTA LA INFORMACION EN LA TABLA DE REGISTRO DE INFORMACION
+## PERSONAL
+ LET nombre_a = personal.nom1_emp CLIPPED," ",
+ personal.apell1_emp CLIPPED
+ LET cedula1 = personal.cedula USING "############","-",
+ personal.serie USING "<<<"
+
+ SELECT UNIQUE num_emp FROM adtb00021
+ WHERE num_emp = acc_per.num_emp AND cod_par = 0 AND sec_par = 0
+
+ IF STATUS = NOTFOUND THEN
+
+ DECLARE hijos CURSOR FOR
+ SELECT a.cod_par,a.sec_par,a.nombre,a.cedula,a.sexo,
+ a.fecha_nac
+ FROM adtb00013 a
+ WHERE a.cod_sol = acc_per.cod_sol and a.status_t is null
+ ORDER BY 1,2
+
+ FOREACH hijos INTO adtb13.*
+ INSERT INTO adtb00021 VALUES(acc_per.num_emp, adtb13.*,
+ NULL,SUSER_SNAME (),GETDATE(),NULL,NULL)
+ END FOREACH
+
+ END IF
+ END IF
+
+## ACTUALIZA LA INFORMACION DEL EMPLEADO EN CUANTO A LOS MOVIMIENTOS DE LOS
+## CAMBIOS DE LA ACCION DE PERSONAL
+
+ IF acc_per.cod_mto = 2 THEN
+
+ IF xtipo = "ACTUALIZACION EMPLEADO" THEN
+ UPDATE adtb00003 SET estado_civil = acc_per.estado_civil
+ WHERE num_emp = acc_per.num_emp
+ END IF
+
+ IF xtipo="ACTUALIZACION EMPLEADO" THEN
+ UPDATE adtb00003 SET nivel_emp = acc_per.nivel_emp
+ WHERE num_emp = acc_per.num_emp
+ END IF
+
+ END IF
+
+## INDICA EN LA MAESTRA DE EMPLEADOS SI EL EMPLEADO ESTA INCAPACITADO
+ IF xtipo = "ACTUALIZACION EMPLEADO" THEN
+ UPDATE adtb00003 SET status_t="I"
+ WHERE num_emp=acc_per.num_emp
+ END IF
+ COMMIT WORK
+ END IF
+
+## ACTUALIZA LA TABLA DE EMPLEADOS EN CUANTO AL MOVIMIENTO DE LAS TERMINACIONES
+## DE LA ACCION DE PERSONAL
+
+ IF xtipo = "TERMINO" THEN
+ UPDATE adtb00003 SET status_t = "T"
+ WHERE num_emp = acc_per.num_emp
+
+ UPDATE adtb00021 SET status_t = "T"
+ WHERE num_emp = acc_per.num_emp
+ END IF
+
+## ACTUALIZA LA TABLA DE SECUENCIA NUMERICA
+ UPDATE adtb00028 SET num_trx = acc_per.num_trx
+ WHERE clave = "AN"
+
+ LET numero_msg = 1
+ CALL msg(numero_msg)
+ CLEAR FORM
+ LABEL preg:
+
+ PROMPT "Desea Imprimir Este Documento (S/N)?..." FOR CHAR optt
+ LET optt = UPSHIFT(optt)
+ IF optt IS NULL OR (optt != "S" AND optt != "N") THEN
+ GOTO preg
+ END IF
+ IF optt = "S" THEN
+ CALL configureoutput("PDF") RETURNING handler
+ START REPORT imp_accion TO XML HANDLER handler
+ OUTPUT TO REPORT imp_accion()
+ FINISH REPORT imp_accion
+ RUN imprime
+ END IF
+
+END FUNCTION
+
+FUNCTION adpcmf017()
+## Aqui se prepara para la captura del criterio de seleccion
+
+# {{# WHENEVER ERROR CONTINUE}}
+ CONSTRUCT criterio ON a.num_trx,a.cod_mto,a.num_emp
+ FROM num_trx,cod_mto,num_emp
+
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+ LET selec =
+ "SELECT UNIQUE a.num_trx,a.cod_mto,a.cod_sol,convert(char(10),a.fecha,103), ",
+ " CONVERT(CHAR(10),a.fech_efec,103),a.num_emp,a.departamento,a.nivel_emp,a.cod_puesto, ",
+ " a.sueldo_ac,a.nomina,a.estado_civil,b.sexo,a.tipo_sangre, ",
+ " a.sueldo_lq,a.observacion,a.num1_emp,a.departamento1, ",
+ " a.nivel1_emp,a.cod1_puesto,a.num2_emp,a.departamento2, ",
+ " a.nivel2_emp,a.cod2_puesto,a.num3_emp,a.departamento3, ",
+ " a.nivel3_emp,a.cod3_puesto,c.cedula,a.us_crea,a.fech_crea,a.us_mod, ",
+ " a.fech_mod,CASE a.status_t WHEN 'E' THEN 'ANULADO' ELSE 'ACTIVO' END, CONVERT(CHAR(10),c.fech_nac,103) ",
+ "FROM adtb00020 a,adtb00003 c LEFT OUTER JOIN adtb00021 b ON b.num_emp = c.num_emp ",
+ "WHERE a.num_emp = c.num_emp AND ",criterio clipped,
+ " ORDER BY a.num_emp"
+
+ PREPARE busca FROM selec
+ DECLARE datos SCROLL CURSOR FOR busca
+ OPEN datos
+
+ FETCH FIRST datos INTO acc_per.num_trx,acc_per.cod_mto,
+ acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,acc_per.num_emp,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.sexo,acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,acc_per.cedula,personal.us_crea,personal.fech_crea,
+ personal.us_mod,personal.fech_mod,estado_accion,personal.fech_nac
+
+ IF status >= 0 THEN
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ RETURN
+ END IF
+ ELSE
+
+
+ IF bandera = 1 THEN
+ CLEAR SCREEN
+ RETURN
+ END IF
+ END IF
+ DISPLAY BY NAME personal.us_crea,personal.fech_crea,personal.us_mod,
+ personal.fech_mod
+ CALL desplegar()
+
+ MENU "OPCIONES "
+
+ ON ACTION imprimir
+
+ LET r_filename = 'adprmt017.4rp'
+ IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
+ LET r_output='PDF'
+ LET preview=1
+ CALL fgl_report_selectDevice(r_output) -- changing default
+ CALL fgl_report_selectPreview(preview) -- changing default
+ LET handler = fgl_report_commitCurrentSettings() -- commit changes
+ END IF
+
+ START REPORT imp_accion TO XML HANDLER handler
+ OUTPUT TO REPORT imp_accion()
+ FINISH REPORT imp_accion
+
+ COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado"
+ FETCH NEXT datos INTO acc_per.num_trx,acc_per.cod_mto,
+ acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,acc_per.num_emp,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.sexo,acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,acc_per.cedula,personal.us_crea,personal.fech_crea,
+ personal.us_mod,personal.fech_mod,estado_accion,personal.fech_nac
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+ END IF
+ DISPLAY BY NAME personal.us_crea,personal.fech_crea,personal.us_mod,
+ personal.fech_mod
+ CALL desplegar()
+
+ COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado"
+ FETCH PREVIOUS datos INTO acc_per.num_trx,acc_per.cod_mto,
+ acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,acc_per.num_emp,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.sexo,acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,acc_per.cedula,personal.us_crea,personal.fech_crea,
+ personal.us_mod,personal.fech_mod,estado_accion,personal.fech_nac
+
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+ END IF
+ DISPLAY BY NAME personal.us_crea,personal.fech_crea,personal.us_mod,
+ personal.fech_mod
+ CALL desplegar()
+
+ COMMAND "Primero" "Presenta en pantalla el primer registro encontrado"
+ FETCH FIRST datos INTO acc_per.num_trx,acc_per.cod_mto,
+ acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,acc_per.num_emp,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.sexo,acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,acc_per.cedula,personal.us_crea,personal.fech_crea,
+ personal.us_mod,personal.fech_mod,estado_accion,personal.fech_nac
+
+ CALL desplegar()
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+
+
+
+ DISPLAY BY NAME personal.us_crea,personal.fech_crea,personal.us_mod,
+ personal.fech_mod
+ CALL desplegar()
+
+ COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado"
+ FETCH LAST datos INTO acc_per.num_trx,acc_per.cod_mto,
+ acc_per.cod_sol,acc_per.fecha,acc_per.fech_efec,acc_per.num_emp,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,acc_per.nomina,
+ acc_per.estado_civil,acc_per.sexo,acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto,acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto,acc_per.cedula,personal.us_crea,personal.fech_crea,
+ personal.us_mod,personal.fech_mod,estado_accion,personal.fech_nac
+
+ CALL desplegar()
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+
+ DISPLAY BY NAME personal.us_crea,personal.fech_crea,personal.us_mod,
+ personal.fech_mod
+ CALL desplegar()
+
+ { COMMAND "Escoger" " Actualiza Registro Cancela Operacion"
+
+ INPUT BY NAME acc_per.fecha,acc_per.fech_efec,acc_per.departamento,
+ acc_per.nivel_emp,acc_per.cod_puesto,acc_per.sueldo_ac,
+ acc_per.nomina,acc_per.estado_civil,acc_per.sexo,
+ acc_per.tipo_sangre,acc_per.sueldo_lq,
+ acc_per.observacion,acc_per.num1_emp,
+ acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,acc_per.num2_emp,
+ acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,acc_per.num3_emp,
+ acc_per.departamento3,acc_per.nivel3_emp,
+ acc_per.cod3_puesto,acc_per.cedula,pnis WITHOUT DEFAULTS
+
+## VENTANAS PARA BUSCAR LOS DEPARTAMENTOS, NIVELES, PUESTOS Y EMPLEADOS
+ ON KEY (CONTROL-W)
+ CASE
+ WHEN INFIELD (departamento)
+ CALL busca_depto() RETURNING req_per.depart,nombre_dpto
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD departamento
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ LET acc_per.departamento = req_per.depart
+ DISPLAY BY NAME acc_per.departamento
+ NEXT FIELD nivel_emp
+
+ WHEN INFIELD (nivel_emp)
+ CALL busca_nivel()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD nivel_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD nivel_emp
+ END IF
+
+ DISPLAY BY NAME acc_per.nivel_emp
+ NEXT FIELD cod_puesto
+
+ WHEN INFIELD (num1_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num1_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+
+ LET descrip3 = nombre
+ LET acc_per.num1_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento1 = despl_emp[curr1].departamento
+ LET acc_per.nivel1_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod1_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num1_emp,acc_per.departamento1,
+ acc_per.nivel1_emp,acc_per.cod1_puesto
+ DISPLAY BY NAME descrip3 ATTRIBUTE(blue)
+ NEXT FIELD num2_emp
+
+ WHEN INFIELD (num2_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num2_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+
+ LET descrip4 = nombre
+ LET acc_per.num2_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento2 = despl_emp[curr1].departamento
+ LET acc_per.nivel2_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod2_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num2_emp,acc_per.departamento2,
+ acc_per.nivel2_emp,acc_per.cod2_puesto
+ DISPLAY BY NAME descrip4 ATTRIBUTE(blue)
+ NEXT FIELD num3_emp
+
+ WHEN INFIELD (num3_emp)
+ CALL busca_empleado()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD num3_emp
+ END IF
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+
+ LET descrip5 = nombre
+ LET acc_per.num3_emp = despl_emp[curr1].num_emp
+ LET acc_per.departamento3 = despl_emp[curr1].departamento
+ LET acc_per.nivel3_emp = despl_emp[curr1].nivel_emp
+ LET acc_per.cod3_puesto = despl_emp[curr1].cod_puesto
+
+ DISPLAY BY NAME acc_per.num3_emp,acc_per.departamento3,
+ acc_per.nivel3_emp,acc_per.cod3_puesto
+ DISPLAY BY NAME descrip5
+
+ WHEN INFIELD (cod_puesto)
+ CALL busca_puesto()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ NEXT FIELD cod_puesto
+ END IF
+ LET acc_per.cod_puesto = req_per.cod_puesto_r
+ SELECT k.nom_puesto INTO puesto.nom_puesto
+ FROM adtb00004 k
+ WHERE k.cod_puesto = acc_per.cod_puesto
+
+ DISPLAY BY NAME acc_per.cod_puesto
+ DISPLAY BY NAME puesto.nom_puesto ATTRIBUTE(blue)
+ NEXT FIELD sueldo_ac
+ END CASE
+
+ AFTER FIELD fecha
+ IF acc_per.fecha IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fecha
+ END IF
+
+ AFTER FIELD fech_efec
+ IF acc_per.fech_efec IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fech_efec
+ END IF
+
+ AFTER FIELD departamento
+ IF acc_per.departamento IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ ELSE
+ SELECT b.nom_dpto INTO nombre_dpto FROM adtb00001 b
+ WHERE b.departamento = acc_per.departamento and
+ b.status_t is null
+
+ DISPLAY BY NAME nombre_dpto
+ END IF
+
+ AFTER FIELD nivel_emp
+ IF acc_per.nivel_emp IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nivel_emp
+ END IF
+
+ AFTER FIELD cod_puesto
+ IF acc_per.cod_puesto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ ELSE
+ SELECT a.nom1_emp,a.nom2_emp,a.apell1_emp,a.apell2_emp
+ INTO nombre9,nombre10,apellido9,apellido10
+ FROM adtb00003 a
+ WHERE a.num_emp = acc_per.num_emp and
+ (a.status_t is null OR a.status_t != "E")
+
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ IF status >= 0 THEN
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+ ELSE
+
+ IF bandera = 1 THEN
+ CLEAR SCREEN
+ RETURN
+ END IF
+ END IF
+
+ SELECT a.nom_puesto INTO puesto.nom_puesto
+ FROM adtb00004 a
+ WHERE a.cod_puesto = acc_per.cod_puesto and
+ a.status_t is null
+
+ LET descrip1 = nombre9 clipped," ",nombre10 clipped
+ LET descrip2 = apellido9 clipped," ",apellido10 clipped
+ DISPLAY BY NAME descrip1,descrip2,puesto.nom_puesto
+ END IF
+
+ AFTER FIELD sueldo_ac
+ IF acc_per.sueldo_ac IS NULL OR acc_per.sueldo_ac < 0 THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sueldo_ac
+ END IF
+
+ AFTER FIELD nomina
+ IF acc_per.nomina IS NOT NULL THEN
+ IF acc_per.nomina = "S" THEN
+ LET descr = "SEMANAL"
+ END IF
+ IF acc_per.nomina = "Q" THEN
+ LET descr = "QUINCENAL"
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nomina
+ END IF
+ DISPLAY BY NAME descr ATTRIBUTE(blue)
+
+ AFTER FIELD sexo
+ IF acc_per.sexo IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sexo
+ END IF
+
+ IF acc_per.sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ ELSE
+ IF acc_per.sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ ELSE NEXT FIELD sexo
+ END IF
+ END IF
+ DISPLAY BY NAME tipo_sexo ATTRIBUTE(blue)
+
+ AFTER FIELD estado_civil
+ IF acc_per.estado_civil IS NOT NULL THEN
+ IF acc_per.estado_civil = "S" THEN
+ LET estado = "SOLTERO"
+ END IF
+ IF acc_per.estado_civil = "C" THEN
+ LET estado = "CASADO"
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD estado_civil
+ END IF
+ DISPLAY BY NAME estado ATTRIBUTE(blue)
+
+## AQUI SE MODIFICA EL EMPLEADO QUE SOLICITA LA ACCION DE PERSONAL
+ AFTER FIELD num1_emp
+ IF acc_per.num1_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp
+ INTO acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,nombre1,nombre2,apellido1,
+ apellido2
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num1_emp AND
+ (b.status_t IS NULL OR b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num1_emp
+ END IF
+
+ LET descrip3 = nombre1 clipped," ",nombre2 clipped," ",
+ apellido1 clipped," ",apellido2 clipped
+
+ DISPLAY BY NAME acc_per.departamento1,acc_per.nivel1_emp,
+ acc_per.cod1_puesto,descrip3
+ ATTRIBUTE(blue)
+
+ NEXT FIELD num2_emp
+
+## AQUI SE MODIFICA EL EMPLEADO QUE AUTORIZA LA ACCION DE PERSONAL
+ AFTER FIELD num2_emp
+ IF acc_per.num2_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp
+ INTO acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,nombre3,nombre4,apellido3,
+ apellido4
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num2_emp AND
+ (b.status_t IS NULL OR b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num2_emp
+ END IF
+
+ LET descrip4 = nombre3 clipped," ",nombre4 clipped," ",
+ apellido3 clipped," ",apellido4 clipped
+
+ DISPLAY BY NAME acc_per.departamento2,acc_per.nivel2_emp,
+ acc_per.cod2_puesto,descrip4
+ ATTRIBUTE(blue)
+
+ NEXT FIELD num3_emp
+
+## AQUI SE MODIFICA EL EMPLEADO QUE APRUEBA LA ACCION DE PERSONAL
+
+ AFTER FIELD num3_emp
+ IF acc_per.num3_emp IS NOT NULL THEN
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,
+ b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp
+ INTO acc_per.departamento3,acc_per.nivel3_emp,
+ acc_per.cod3_puesto,nombre5,nombre6,apellido5,
+ apellido6
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num3_emp AND
+ (b.status_t IS NULL OR b.status_t != "E")
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+ ELSE
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num3_emp
+ END IF
+ LET descrip5 = nombre5 clipped," ",nombre6 clipped," ",
+ apellido5 clipped," ",apellido6 clipped
+
+ DISPLAY BY NAME acc_per.departamento3,acc_per.nivel3_emp,
+ acc_per.cod3_puesto,descrip5
+ ATTRIBUTE(blue)
+
+ #### Verifica si el usuario presiono la tecla
+
+ END INPUT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ CLEAR FORM
+ RETURN
+ END IF
+
+ UPDATE adtb00020 SET fecha = acc_per.fecha,
+ fech_efec = acc_per.fech_efec,
+ departamento = acc_per.departamento,
+ nivel_emp = acc_per.nivel_emp,
+ cod_puesto = acc_per.cod_puesto,
+ sueldo_ac = acc_per.sueldo_ac,
+ nomina = acc_per.nomina,
+ estado_civil = acc_per.estado_civil,
+ tipo_sangre = acc_per.tipo_sangre,
+ observacion = acc_per.observacion,
+ num1_emp = acc_per.num1_emp,
+ departamento1 = acc_per.departamento1,
+ nivel1_emp = acc_per.nivel1_emp,
+ cod1_puesto = acc_per.cod1_puesto,
+ num2_emp = acc_per.num2_emp,
+ departamento2 = acc_per.departamento2,
+ nivel2_emp = acc_per.nivel2_emp,
+ cod2_puesto = acc_per.cod2_puesto,
+ num3_emp = acc_per.num3_emp,
+ departamento3 = acc_per.departamento3,
+ nivel3_emp = acc_per.nivel3_emp,
+ cod3_puesto = acc_per.cod3_puesto,
+ us_mod = SUSER_SNAME (),
+ fech_mod = GETDATE()
+ WHERE num_emp = acc_per.num_emp and num_trx = acc_per.num_trx
+
+ UPDATE adtb00038
+ SET cedula_n = acc_per.cedula
+ WHERE @num_emp = acc_per.num_emp
+
+ UPDATE adtb00030
+ SET sexo = acc_per.sexo,
+ nis = pnis
+ WHERE @num_emp = acc_per.num_emp
+
+ IF acc_per.cod_mto = 3 THEN
+
+ UPDATE adtb00032 SET (num_dia,us_mod,fech_mod)=
+ (cantidad_d,SUSER_SNAME (),GETDATE())
+ WHERE @num_trx = acc_per.num_trx AND @num_emp = acc_per.num_emp AND
+ @cod_mov = acc_per.cod_mto AND
+ @status_t IS NULL
+
+ END IF
+
+ IF acc_per.cod_mto = 1 THEN
+
+ UPDATE adtb00003 SET departamento = acc_per.departamento,
+ nivel_emp = acc_per.nivel_emp,
+ cod_puesto = acc_per.cod_puesto,
+ estado_civil = acc_per.estado_civil,
+ tipo_sangre = acc_per.tipo_sangre,
+ sueldo_ac = acc_per.sueldo_ac,
+ nomina = acc_per.nomina,
+ fech_efec = acc_per.fech_efec
+ WHERE @num_emp = acc_per.num_emp
+
+ END IF
+
+ UPDATE adtb00021 SET sexo = acc_per.sexo WHERE num_emp = acc_per.num_emp
+ AND cod_par = 0 AND sec_par=0
+ UPDATE adtb00017 SET departamento = acc_per.departamento,
+ nivel_emp = acc_per.nivel_emp,
+ cod_puesto = acc_per.cod_puesto,
+ fech_efec = acc_per.fech_efec,
+ salario = acc_per.sueldo_ac,
+ liquidacion = acc_per.sueldo_lq
+ WHERE num_emp = acc_per.num_emp and num_trx = acc_per.num_trx and
+ cod_mto = acc_per.cod_mto
+
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+ LABEL preg:
+ PROMPT "Desea Imprimir Este Documento (S/N)?..." FOR CHAR optt
+ LET optt = UPSHIFT(optt)
+ IF optt IS NULL OR (optt != "S" AND optt != "N") THEN
+ GOTO preg
+ END IF
+
+ IF optt = "S" THEN
+
+
+ CALL configureoutput('PDF') RETURNING HANDLER
+
+ START REPORT imp_accion TO XML HANDLER handler
+ OUTPUT TO REPORT imp_accion()
+ FINISH REPORT imp_accion
+
+ END IF
+}
+
+ COMMAND KEY ("L") "eLiminar"
+ IF estado_accion <> 'ANULADO' THEN
+ LET optt = fgl_winquestion("ELIMINAR","ESTA SEGURIO DE ANULAR ESTE DOCUMENTO?","NO","YES|NO","QUESTION",0)
+ IF optt = "YES" THEN
+ BEGIN WORK
+ UPDATE adtb00020 SET status_t = "E",
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE num_trx = acc_per.num_trx AND cod_mto = acc_per.cod_mto
+
+ UPDATE adtb00017 SET status_t = "E",
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE num_trx = acc_per.num_trx AND cod_mto = acc_per.cod_mto
+
+ UPDATE adtb00032 SET status_t ="E",
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE num_trx = acc_per.num_trx
+ UPDATE notb00007 SET status_t ="E",
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE num_trx = acc_per.num_trx AND cod_mto = acc_per.cod_mto
+ COMMIT WORK
+ LET numero_msg = 39
+ CALL msg(numero_msg)
+ END IF
+ ELSE
+ CALL fgl_winmessage("INFO","EL REGISTRO ESTA ANULADO, NO LO PUEDES ANULAR NUEVA VEZ","INFO")
+ CONTINUE MENU
+ END IF
+ COMMAND "Retornar" "Retorna al menu anterior"
+ CLEAR FORM
+ EXIT MENU
+ END MENU
+END FUNCTION
+
+FUNCTION desplegar()
+ SELECT a.cod_mov,a.cod_mov2,a.cod_mov3,a.tipo_mov
+ INTO xcod_mov,xcod_mov2,xcod_mov3,xtipo FROM adtb00009 a
+ WHERE a.cod_mto = acc_per.cod_mto
+
+ IF acc_per.cod_sol is not null THEN
+ SELECT nom1_sol,nom2_sol,apell1_sol,apell2_sol
+ INTO nombre9,nombre10,apellido9,apellido10
+ FROM adtb00012
+ WHERE cod_sol = acc_per.cod_sol
+ ELSE
+ SELECT b.departamento,b.nivel_emp,b.cod_puesto,b.nom1_emp,
+ b.nom2_emp,b.apell1_emp,b.apell2_emp,b.sueldo_ac,
+ b.nomina,b.estado_civil,b.tipo_sangre,
+ b.cedula,b.cuenta_no,CONVERT(char(10),b.fech_efec,103),
+ b.sueldo_ac
+ INTO acc_per.departamento,acc_per.nivel_emp,acc_per.cod_puesto,
+ nombre9,nombre10,apellido9,apellido10,acc_per.sueldo_ac,
+ acc_per.nomina,acc_per.estado_civil,acc_per.tipo_sangre,
+ acc_per.cedula,personal.cuenta_no,fecha5
+ FROM adtb00003 b
+ WHERE b.num_emp = acc_per.num_emp AND (b.status_t IS NULL OR
+ b.status_t != "E")
+
+ END IF
+
+ LET descrip1 = nombre9 clipped," ",nombre10 clipped
+ LET descrip2 = apellido9 clipped," ",apellido10 clipped
+
+ IF acc_per.nomina = "S" THEN
+ LET descr = "SEMANAL"
+ END IF
+ IF acc_per.nomina = "Q" THEN
+ LET descr = "QUINCENAL"
+ END IF
+ IF acc_per.nomina = "V" THEN
+ LET descr = "VENDEDOR"
+ END IF
+
+ IF acc_per.estado_civil = "S" THEN
+ LET estado = "SOLTERO"
+ END IF
+ IF acc_per.estado_civil = "C" THEN
+ LET estado = "CASADO"
+ END IF
+ IF acc_per.estado_civil = "U" THEN
+ LET estado = "UNION LIBRE"
+ END IF
+
+ IF acc_per.sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ END IF
+
+ IF acc_per.sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ END IF
+
+ SELECT nom_dpto INTO nombre_dpto FROM adtb00001
+ WHERE departamento = acc_per.departamento
+
+ SELECT b.nom_puesto INTO puesto.nom_puesto FROM adtb00004 b
+ WHERE b.cod_puesto = acc_per.cod_puesto
+
+ SELECT c.nom1_emp,c.nom2_emp,c.apell1_emp,c.apell2_emp
+ INTO nombre1,nombre2,apellido1,apellido2
+ FROM adtb00003 c
+ WHERE c.num_emp = acc_per.num1_emp and
+ c.departamento = acc_per.departamento1 and
+ c.nivel_emp = acc_per.nivel1_emp and
+ c.cod_puesto = acc_per.cod1_puesto
+LET descrip3 =
+nombre1 clipped," ",nombre2 clipped," ",apellido1 clipped," ",apellido2 clipped
+
+ SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp
+ INTO nombre3,nombre4,apellido3,apellido4
+ FROM adtb00003
+ WHERE num_emp = acc_per.num2_emp and
+ departamento = acc_per.departamento2 and
+ nivel_emp = acc_per.nivel2_emp and
+ cod_puesto = acc_per.cod2_puesto
+
+LET descrip4 =
+nombre3 clipped," ",nombre4 clipped," ",apellido3 clipped," ",apellido4 clipped
+
+ SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp
+ INTO nombre5,nombre6,apellido5,apellido6
+ FROM adtb00003
+ WHERE num_emp = acc_per.num3_emp and
+ departamento = acc_per.departamento3 and
+ nivel_emp = acc_per.nivel3_emp and
+ cod_puesto = acc_per.cod3_puesto
+
+LET descrip5 =
+nombre5 clipped," ",nombre6 clipped," ",apellido5 clipped," ",apellido6 clipped
+
+# Busqueda del empleado en la table historica del empleado
+ SELECT liquidacion INTO acc_per.sueldo_lq
+ FROM adtb00017
+ WHERE num_trx = acc_per.num_trx and num_emp = acc_per.num_emp
+
+ IF acc_per.sueldo_lq is null THEN
+ LET acc_per.sueldo_lq = 0
+ END IF
+ DISPLAY BY NAME acc_per.*
+ DISPLAY BY NAME descrip1,descrip2,nombre_dpto,puesto.nom_puesto,
+ acc_per.cedula,personal.cuenta_no,fecha5,estado_accion
+ ATTRIBUTE(blue)
+ ## DATOS VACACIONES
+ IF xtipo = 'VACACIONES' THEN
+ INITIALIZE vacacion.* TO NULL
+ SELECT a.cod_mov,a.cod_mov2,a.num_dias_disfrute,CONVERT(CHAR(10),a.fecha_sal,103),CONVERT(CHAR(10),a.fecha_ent,103),
+ a.num_nomi,
+ a.num_dias_disfrute,a.periodo,a.valor_vacaciones,a.num_dias_pagados,a.proporcion_vacaciones
+ INTO vacacion.cod_mov1,vacacion.cod_mov2,vacacion.dias_vac,vacacion.fecha_sal,vacacion.fecha_ent,
+ vacacion.num_nomi,vacacion.dias_tomados,vacacion.pano ,
+ vacacion.valor_vacaciones ,dias2, proporcion_vacaciones
+ FROM adtb00032 a
+ WHERE a.num_trx = acc_per.num_trx
+
+ LET vacacion.descrip_mov1 =NULL
+ IF vacacion.cod_mov1 IS NOT NULL THEN
+ SELECT a.descrip_mov INTO vacacion.descrip_mov1 FROM notb00002 a
+ WHERE a.cod_mov = vacacion.cod_mov1
+ END IF
+ IF vacacion.cod_mov2 IS NOT NULL THEN
+ SELECT a.descrip_mov INTO vacacion.descrip_mov2 FROM notb00002 a
+ WHERE a.cod_mov = vacacion.cod_mov2
+ END IF
+
+ CALL vacaciones('C') RETURNING realiza_vacaciones # CUANDO ESTA CONSULTANDO ES 'C' Y ADICIONANDO ES 'A'
+
+
+ END IF
+
+
+END FUNCTION
+
+## FUNCION PARA EL CALCULO Y REGISTRO DE LAS VACACIONES
+FUNCTION vacaciones(operacion)
+ DEFINE fecha_nom CHAR(10),
+ dias_tomados_real,balance_dias,psueldo,salario,salario_acumulado DEC(12,2),
+ pfecha,fecha_inicio,fecha_entrada_emp DATE,
+ dias_sueldo SMALLINT,
+ sale,operacion VARCHAR(1)
+ LET int_flag = FALSE
+
+ OPEN WINDOW adwindow7 AT 10,12 WITH FORM "adfmwd007"
+ ATTRIBUTE(BORDER,FORM LINE FIRST + 2)
+ DISPLAY BY NAME tipo_sueldo
+ IF operacion ='A' THEN
+ INPUT BY NAME vacacion.* WITHOUT DEFAULTS
+ BEFORE INPUT
+ LET sale = 'N'
+
+ LET vacacion.cod_mov1=xcod_mov
+ LET vacacion.cod_mov2 = NULL
+ LET vacacion.cod_mov3=xcod_mov3
+ LET vacacion.descrip_mov1=NULL
+ LET vacacion.descrip_mov2=NULL
+ LET vacacion.descrip_mov3=NULL
+
+ SELECT a.descrip_mov INTO vacacion.descrip_mov1
+ FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov1
+
+ SELECT a.descrip_mov INTO vacacion.descrip_mov2
+ FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov2
+
+ SELECT a.descrip_mov INTO vacacion.descrip_mov3
+ FROM notb00002 a WHERE a.cod_mov = vacacion.cod_mov3
+
+ LET vacacion.pano = YEAR(acc_per.fecha)
+ DISPLAY BY NAME vacacion.descrip_mov1,vacacion.cod_mov1,vacacion.pano,
+ vacacion.descrip_mov2,vacacion.descrip_mov3
+ AFTER FIELD cod_mov1
+ IF vacacion.cod_mov1 IS NOT NULL THEN
+ SELECT DISTINCT a.periodo FROM adtb00032 a WHERE a.num_emp = acc_per.num_emp AND
+ a.periodo = vacacion.pano AND a.status_t IS NULL
+ IF STATUS <> NOTFOUND THEN
+ CALL fgl_winmessage("INFO","NO PUEDES PAGARLE VACACIONES A ESTE EMPLEADO EN EL MISMO PERIODO","INFO")
+ NEXT FIELD cod_mov1
+ END IF
+
+ DISPLAY BY NAME vacacion.dias_tomados,vacacion.valor_vacaciones
+
+ END IF
+ AFTER FIELD fecha_sal
+ IF vacacion.fecha_sal IS NULL THEN
+ LET vacacion.fecha_sal = today
+ END IF
+ LET vacac = vacacion.fecha_sal - fecha5
+ IF vacac < 365 THEN
+ CALL fgl_winmessage("INFO","EMPLEADO NO TIENE EL PERIODO COMPLETO PARA EL PAGO DE VACACIONES","INFO")
+ LET sale = 'S'
+ EXIT INPUT
+
+ END IF
+ LET vacacion.fecha_ent = vacacion.fecha_sal + 14
+ DISPLAY BY NAME vacacion.fecha_ent
+ AFTER FIELD fecha_ent
+ IF vacacion.fecha_ent IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fecha_ent
+ END IF
+ IF vacacion.fecha_ent - vacacion.fecha_sal > 20 THEN
+ CALL fgl_winmessage("INFO","FECHA EXCEDE AL LIMITE DISFRUTE","INFO")
+ NEXT FIELD fecha_sal
+ END IF
+
+ ####### CALCULO DE LOS DIAS VACACIONADOS ###########
+ LET vacacion.dias_tomados = vacacion.fecha_ent - vacacion.fecha_sal
+ LET dias_tomados_real=0
+ LET pfecha = vacacion.fecha_sal
+ FOR idx= 1 TO (vacacion.dias_tomados+1)
+ IF WEEKDAY(pfecha) <> 6 THEN
+ IF WEEKDAY(pfecha) <> 0 THEN
+ LET dias_tomados_real = dias_tomados_real + 1
+ END IF
+ END IF
+ IF WEEKDAY(pfecha) = 0 THEN
+ LET dias_tomados_real =dias_tomados_real + .5
+ END IF
+
+ LET pfecha = pfecha+1
+
+ END FOR
+
+ LET vacacion.dias_vac = dias_tomados_real
+ DISPLAY BY NAME vacacion.dias_vac
+
+ AFTER FIELD pano
+ IF vacacion.pano IS NOT NULL THEN
+ SELECT SUM(a.num_dia) INTO vacacion.dias_tomados
+ FROM adtb00032 a
+ WHERE a.periodo = vacacion.pano AND
+ a.num_emp = acc_per.num_emp AND
+ a.status_t IS NULL
+ IF vacacion.dias_tomados IS NULL THEN
+ LET vacacion.dias_tomados=0
+ END IF
+ LET balance_dias = vacacion.dias_vac - vacacion.dias_tomados
+ DISPLAY BY NAME vacacion.dias_tomados,balance_Dias
+ END IF
+
+ AFTER FIELD num_nomi
+ IF vacacion.num_nomi IS NOT NULL THEN
+
+ SELECT CONVERT(CHAR(10),a.fecha_al,103) INTO fecha_nom FROM notb00010 a
+ WHERE a.tipo_emp = acc_per.nomina AND a.num_nomi = vacacion.num_nomi
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("INFO","NOMINA NO EXISTE","INFO")
+ NEXT FIELD num_nomi
+ END IF
+ # SELECT MIN(a.num_nomi) INTO vacacion.num_nomi_no
+ # FROM notb00010 a
+ # WHERE a.num_nomi > vacacion.num_nomi AND a.tipo_emp = acc_per.nomina
+
+ IF vacac < 1825 THEN
+ LET dias2=14
+ ELSE
+ LET dias2=18
+ END IF
+ LET salario_acumulado = 0
+ IF vacacion.cod_mov1 = 36 THEN
+ LET salario = 0
+ SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario
+ FROM adtb00003 a
+ WHERE a.num_emp = acc_per.num_emp
+
+ LET salario_quincenal = salario /2
+ LET dias_sueldo = fecha_nom - fecha_entrada_emp
+ DISPLAY "dias ",dias_sueldo," tipo ",tipo_sueldo
+ IF dias_sueldo > 30 AND tipo_sueldo = "VARIABLE" THEN
+
+ CALL calcula_salarios(acc_per.nomina,acc_per.num_emp,fecha_nom) RETURNING psueldo,salario_acumulado
+ DISPLAY BY NAME psueldo,salario_acumulado
+ ELSE
+ DISPLAY acc_per.sueldo_ac
+
+ LET psueldo = acc_per.sueldo_ac/23.83
+ DISPLAY "sueldo ",acc_per.sueldo_ac," dias ",dias2
+ END IF
+ DISPLAY "DATA ",psueldo," dias ",dias2," salario q ",salario_quincenal
+ LET proporcion_vacaciones=0
+ LET vacacion.valor_vacaciones = psueldo*dias2
+ LET proporcion_vacaciones = vacacion.valor_vacaciones - salario_quincenal
+
+ DISPLAY BY NAME fecha_nom,vacacion.valor_vacaciones,proporcion_vacaciones,
+ salario,salario_quincenal,psueldo,dias2
+ END IF
+ END IF
+ { AFTER FIELD num_nomi_no
+ IF vacacion.num_nomi_no IS NOT NULL THEN
+
+ SELECT CONVERT(CHAR(10),a.fecha_al,103) FROM notb00010 a
+ WHERE a.tipo_emp = acc_per.nomina AND a.num_nomi = vacacion.num_nomi_no
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("INFO","NOMINA NO EXISTE","INFO")
+ NEXT FIELD num_nomi
+ END IF
+
+ END IF
+ }
+ AFTER INPUT
+## VERIFICA QUE LA FECHA DE REGRESO DE VACACIONES NO SEA MENOR QUE LA FECHA
+## DE INICIO DE LAS VACACIONES
+ IF INT_FLAG THEN
+ INITIALIZE vacacion.* TO NULL
+ EXIT INPUT
+ END IF
+ IF vacacion.fecha_ent < vacacion.fecha_sal THEN
+ LET numero_msg = 51
+ CALL msg(numero_msg)
+ NEXT FIELD fecha_ent
+ END IF
+
+ IF vacacion.cod_mov1 IS NOT NULL THEN
+############## PROCESO PARA CALCULAR LOS DIAS QUE DEBE VACACIONAR #######
+ IF vacac < 1825 THEN
+ LET dias2=14
+ ELSE
+ LET dias2=18
+ END IF
+
+ DISPLAY BY NAME vacacion.dias_tomados
+
+ END IF
+ #CONTROLA QUE NO PUEDA REALIZAR LA ACCION DE NOMINA EN CASO QUE SE HAYA PAGADO LAS VACACIONES EN EL MISMO PERIODO
+ SELECT MIN(a.fecha_del) INTO fecha_inicial FROM notb00010 a WHERE a.ano = vacacion.pano
+ SELECT MAX(a.fecha_al) INTO fecha_final FROM notb00010 a WHERE a.ano = vacacion.pano
+
+ SELECT DISTINCT a.num_emp FROM notb00008 a WHERE a.num_emp =acc_per.num_emp AND
+ a.fecha BETWEEN fecha_inicial AND fecha_final
+ and a.cod_mov = 36
+ IF STATUS <> NOTFOUND THEN
+ CALL msg(144)
+ NEXT FIELD num_nomi
+ END IF
+ LET opt = fgl_Winquestion("INFO","TODA LA INFORMACION ESTA CORRECTA?","NO","YES|NO","QUESTION",0)
+ IF opt = 'NO' THEN
+ CONTINUE INPUT
+ END IF
+
+ END INPUT
+ ELSE
+ LET salario = 0
+ SELECT CONVERT(CHAR(10),a.fech_efec,103),a.sueldo_ac INTO fecha_entrada_emp,salario
+ FROM adtb00003 a
+ WHERE a.num_emp = acc_per.num_emp
+ LET salario_quincenal = salario /2
+ DISPLAY BY NAME proporcion_vacaciones,fecha_nom,tipo_sueldo,salario,salario_quincenal
+ INPUT BY NAME vacacion.*,dias2 WITHOUT DEFAULTS
+ END IF
+
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ INITIALIZE vacacion.* TO NULL
+ LET numero_msg = 4
+ LET int_flag = FALSE
+ CLOSE WINDOW adwindow7
+ RETURN false
+ END IF
+ CLOSE WINDOW adwindow7
+ IF sale = 'N' THEN
+
+ RETURN TRUE
+ ELSE
+ RETURN FALSE
+ END IF
+ END FUNCTION
+
+## VENTANA DE LOS NIVELES DEL LOS EMPLEADOS
+FUNCTION busca_nivel()
+ OPEN WINDOW busqueda AT 10,10 WITH FORM "adfmwd008"
+ ATTRIBUTE (BORDER,FORM LINE FIRST + 2, comment line last)
+
+ CONSTRUCT criterio ON adtb00024.nivel_emp FROM adtb00024.nivel_emp
+
+ LET selec = "SELECT nivel_emp,desc_nivel FROM adtb00024 ",
+ "WHERE status_t is null AND ",criterio clipped," ORDER BY 1 "
+
+ PREPARE busco FROM selec
+ DECLARE local CURSOR FOR busco
+
+ LET idx = 1
+ FOREACH local INTO buscar_nivel[idx].*
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ EXIT FOREACH
+ END IF
+
+ LET despl_nivel[idx].nivel_emp = buscar_nivel[idx].nivel_emp
+ LET despl_nivel[idx].desc_nivel = buscar_nivel[idx].desc_nivel clipped
+
+ LET idx = idx + 1
+ END FOREACH
+
+ CALL set_count(idx-1)
+ DISPLAY ARRAY despl_nivel TO s_nivel.*
+ LET curr = arr_curr()
+ LET acc_per.nivel_emp = despl_nivel[curr].nivel_emp
+ LET nivelar.desc_nivel = despl_nivel[curr].desc_nivel
+
+ CLOSE WINDOW busqueda
+END FUNCTION
+
+## VENTANA DE LOS MOVIMIENTOS DE LA ACCION DE PERSONAL
+FUNCTION busca_movi()
+ OPEN WINDOW busqueda1 AT 10,10 WITH FORM "adfmwd009"
+ ATTRIBUTE (BORDER,FORM LINE FIRST + 2, comment line last)
+
+ CONSTRUCT criterio ON adtb00009.cod_mto,adtb00009.sec_mto
+ FROM adtb00009.cod_mto,adtb00009.sec_mto
+
+ LET selec1 = "SELECT cod_mto,sec_mto,desc_mto FROM adtb00009 ",
+ "WHERE status_t is null AND ",criterio clipped,
+ " ORDER BY 1,2 "
+
+ PREPARE busco1 FROM selec1
+ DECLARE local1 CURSOR FOR busco1
+
+ LET idx = 1
+ FOREACH local1 INTO buscar_movi[idx].*
+ IF status = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ EXIT FOREACH
+ END IF
+
+ LET despl_movi[idx].cod_mto = buscar_movi[idx].cod_mto
+
+ LET despl_movi[idx].desc_mto = buscar_movi[idx].desc_mto clipped
+
+ LET idx = idx + 1
+ END FOREACH
+
+ CALL set_count(idx-1)
+ DISPLAY ARRAY despl_movi TO s_movi.*
+
+ LET curr = arr_curr()
+
+ LET acc_per.cod_mto = despl_movi[curr].cod_mto
+ LET mov_emp.desc_mto = despl_movi[curr].desc_mto
+
+ CLOSE WINDOW busqueda1
+ END FUNCTION
+
+REPORT imp_accion()
+DEFINE doble_of,doble_on,doble_off,negrillas_on,negrillas_off,comp_on,comp_of,
+ normal,doce CHAR(2),
+ direccion CHAR(80),
+ calle CHAR(10),
+ casa_num CHAR(10),
+ barrio CHAR(20),
+ urbanizacion,descrip CHAR(20),
+ telefono CHAR(8),
+ cedula CHAR(11),
+ depende,codigo_s,cod_provincia,codigo_n,serie SMALLINT,
+ fecha_nac DATE,
+ provincia,nombre_nac CHAR(30),
+ hoy VARCHAR(25)
+
+OUTPUT
+ TOP MARGIN 4
+ LEFT MARGIN 0
+ BOTTOM MARGIN 0
+FORMAT
+ON EVERY ROW
+ {LET doble_on = ASCII 14
+ LET doble_of = ASCII 20
+ LET negrillas_on = ASCII 27, ASCII 69
+ LET negrillas_off = ASCII 27, ASCII 70
+ LET comp_on = ASCII 15
+ LET comp_of = ASCII 18
+ LET doce = ASCII 27, ASCII 77
+ LET normal = ASCII 27, ASCII 80
+ }
+ LET hoy=CURRENT
+ LET hoy=hoy[1,16]
+# Busca Informaciones Complementarias para el documento
+ SELECT a.calle,a.casa_num,a.barrio,a.urbanizacion,a.telefono,a.cedula,
+ a.serie
+ INTO calle,casa_num,barrio,urbanizacion,telefono,cedula
+ FROM adtb00003 a
+ WHERE a.num_emp = acc_per.num_emp
+ LET direccion = calle clipped," ",casa_num clipped,",",barrio clipped," ",
+ urbanizacion clipped
+
+ SELECT UNIQUE cod_sol INTO codigo_s
+ FROM adtb00017 WHERE num_emp = acc_per.num_emp and cod_sol is not null
+
+ SELECT COUNT(*) INTO depende FROM adtb00013
+ WHERE cod_sol = codigo_s AND cod_par = 4
+
+ SELECT a.cod_provincia,CONVERT(CHAR(10),a.fech_nac,103),a.cod_nac
+ INTO cod_provincia,fecha_nac,codigo_n
+ FROM adtb00012 a
+ WHERE a.cod_sol = codigo_s
+
+ SELECT nombre_provincia INTO provincia
+ FROM vetb00020
+ WHERE @cod_provincia = cod_provincia
+
+ SELECT nom_nac INTO nombre_nac
+ FROM adtb00007
+ WHERE cod_nac = codigo_n
+
+ SELECT @desc_mto INTO mov_emp.desc_mto
+ FROM adtb00009
+ WHERE @cod_mto = acc_per.cod_mto
+
+
+ PRINTX acc_per.num_trx,mov_emp.desc_mto,
+ acc_per.fecha ,acc_per.fech_efec,apellido9,nombre9 ,
+ direccion,dias2,
+ telefono,apellido10,
+ nombre10 ,
+ direccion,
+ provincia ,
+ personal.fech_nac,
+ nombre_nac ,
+ estado,
+ depende,
+ cedula,serie,
+ acc_per.num_emp,
+ puesto.nom_puesto ,
+ acc_per.sueldo_ac,
+ descr,
+ nombre_dpto,
+ acc_per.cod_mto ,
+ mov_emp.desc_mto,
+ acc_per.observacion,vacacion.*,p_companias.nombre,hoy,descrip3,descrip4,descrip5
+END REPORT
diff --git a/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4rp b/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4rp
new file mode 100644
index 0000000..c3717c3
--- /dev/null
+++ b/PROYECTO/addir/backup_adprmt017_20261005/adprmt017.4rp
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/adprmt017.4rp b/PROYECTO/bin/adprmt017.4rp
index c3717c3..384a63c 100644
--- a/PROYECTO/bin/adprmt017.4rp
+++ b/PROYECTO/bin/adprmt017.4rp
@@ -42,7 +42,18 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -50,7 +61,7 @@
-
+
@@ -58,7 +69,7 @@
-
+
@@ -66,7 +77,7 @@
-
+
diff --git a/PROYECTO/bin/adprrp048.4rp b/PROYECTO/bin/adprrp048.4rp
new file mode 100644
index 0000000..d33e89f
--- /dev/null
+++ b/PROYECTO/bin/adprrp048.4rp
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/adprrp049.4rp b/PROYECTO/bin/adprrp049.4rp
new file mode 100644
index 0000000..4b3dcb5
--- /dev/null
+++ b/PROYECTO/bin/adprrp049.4rp
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/adprrp049d.4rp b/PROYECTO/bin/adprrp049d.4rp
new file mode 100644
index 0000000..7451996
--- /dev/null
+++ b/PROYECTO/bin/adprrp049d.4rp
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/ipprrp013.4rp b/PROYECTO/bin/ipprrp013.4rp
new file mode 100644
index 0000000..3784afc
--- /dev/null
+++ b/PROYECTO/bin/ipprrp013.4rp
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/ipprrp013r.4rp b/PROYECTO/bin/ipprrp013r.4rp
new file mode 100644
index 0000000..8d8b6af
--- /dev/null
+++ b/PROYECTO/bin/ipprrp013r.4rp
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/ipprrp053.4rp b/PROYECTO/bin/ipprrp053.4rp
new file mode 100644
index 0000000..815a3fd
--- /dev/null
+++ b/PROYECTO/bin/ipprrp053.4rp
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/bin/veprmt022.4rp b/PROYECTO/bin/veprmt022.4rp
new file mode 100644
index 0000000..2112d0d
--- /dev/null
+++ b/PROYECTO/bin/veprmt022.4rp
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/ccdir/ccprmt008.4gl b/PROYECTO/ccdir/ccprmt008.4gl
index bac1802..77efb16 100644
--- a/PROYECTO/ccdir/ccprmt008.4gl
+++ b/PROYECTO/ccdir/ccprmt008.4gl
@@ -514,19 +514,28 @@ FUNCTION req_insert()
DEFINE ultimo,numeroOrden INT
# WHENEVER ERROR CONTINUE
- SELECT a.num_req INTO ultimo FROM cctb00019 a
-
+ # 05/10/2026 - consecutivo dentro de la transaccion con bloqueo
+ # (evita num_req duplicado en cctb00025, ver requisiciondespacho.4gl)
+ BEGIN WORK
+ PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_numreq INTO ultimo
+ PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_maxreq INTO numeroOrden
+
IF ultimo IS NULL THEN
LET ultimo = 0
END IF
+ IF numeroOrden > ultimo THEN
+ LET ultimo = numeroOrden
+ END IF
+ LET numeroOrden = NULL
LET ultimo = ultimo + 1
LET requisicion.num_req = ultimo
-
- UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
-
+
+ UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
+
# GUARDA MASTER TABLE
# PREPARE s FROM "SELECT @@IDENTITY"
- BEGIN WORK
# EXECUTE s INTO requisicion.num_req
DISPLAY BY NAME requisicion.num_req
diff --git a/PROYECTO/ccdir/ccprmt008.4gl.bak20261005 b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005
new file mode 100644
index 0000000..bac1802
--- /dev/null
+++ b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005
@@ -0,0 +1,1362 @@
+{
+-----------------------------------------------------------------------------
+PROGRAMA : CCPRMT008
+OBJETIVO : Mantenimiento Requisiciones Despacho
+REALIZADO POR : JUAN SOTO
+FECHA : Enero 2010
+
+FUNCTIONES : envia_correo() Envia correo a la persona quien autoriza las ordenes
+
+-----------------------------------------------------------------------------
+}
+GLOBALS "ccprgb000.4gl"
+ DEFINE estado BOOLEAN,
+ actualiza CHAR(2),
+
+ accion CHAR(1),
+ idx2 SMALLINT,
+ resultado,total_medida_r DEC(12,5),
+ porc_itbis DYNAMIC ARRAY OF DEC(8,2),
+ rcantidad,numerotemp INT,
+
+
+ listarequisi DYNAMIC ARRAY OF RECORD
+ estado1 CHAR(20),
+ estado2 CHAR(20),
+ estado_produccion VARCHAR(20),
+ num_req1 INT,
+ fecha1 CHAR(10),
+ material CHAR(50),
+ fecha_transporte CHAR(10),
+ fecha_llegada CHAR(10),
+ num_oc1 INT,
+ cliente1 CHAR(40),
+ valor1 DEC(12,2)
+ END RECORD,
+ pcerrada CHAR(1),
+ xmonto DEC(12,2),
+
+ rdespiece DYNAMIC ARRAY OF RECORD
+ etiqueta CHAR(20),
+ cod_n ,
+ cod_grupo ,
+ cod_tipo ,
+ cod_sec SMALLINT,
+ lado_1 ,
+ lado_2 ,
+ lado_3 ,
+ cantidad ,
+ medida,
+ cantidad_r,
+ medida_r DEC(12,5)
+ END RECORD,
+ idx1,cuenta_despiece,pcondpago SMALLINT,
+ pneto DEC(12,2),
+ pcotizacion,xorden,xtipocliente,xseccliente INT,
+ pfecha_req CHAR(10)
+
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+ CALL ARG_VAL(4) RETURNING impresor
+ CALL STARTLOG("ccprmt008.txt")
+ CONNECT to "smarmotech" USER usuarios USING clave
+
+ INITIALIZE requisicion.* TO NULL
+
+ SELECT a.sec_vend,RTRIM(b.nom1_emp)||' '||b.apell1_emp,
+ a.email
+ INTO requisicion.sec_vend,requisicion.nombre_vendedor,
+ vendedorEmail
+ FROM seg0000 a,adtb00003 b
+ WHERE a.usuario = usuarios AND
+ a.sec_vend = b.num_emp
+ CALL ccprmt008()
+END MAIN
+
+FUNCTION ccprmt008()
+ OPTIONS INPUT WRAP
+ OPEN WINDOW w1 AT 10,5 WITH FORM "ccfmmt008"
+
+ CALL carga_lista()
+ LET requisicion.fecha_requisicion = TODAY
+ DISPLAY BY NAME requisicion.nombre_vendedor,
+ requisicion.sec_vend,requisicion.fecha_requisicion
+ MENU
+ ON ACTION nuevo ATTRIBUTE(TEXT="Nuevo",IMAGE="new")
+ LET actualiza = "NO"
+ LET accion = "A"
+ CALL arr_requisicion.clear()
+
+ CALL ccprad008()
+ ON ACTION buscar ATTRIBUTE(TEXT="Buscar",IMAGE="find")
+ LET accion = "M"
+ CALL ccprmf008()
+ ON ACTION refrescar ATTRIBUTE(TEXT="Refrescar",IMAGE="Refresh")
+ CALL carga_lista()
+ ON ACTION salir
+ EXIT MENU
+ END MENU
+
+ CLOSE WINDOW w1
+
+END FUNCTION
+
+FUNCTION ccprad008()
+ DEFINE remanente,unidadRemanente DEC(12,4),
+ total_cotizacion,total_requisicion DEC(12,2)
+
+ LET requisicion.fecha_requisicion = TODAY
+ LET requisicion.estado = 'NO AUTORIZADA'
+ LET requisicion.num_req = 0
+
+ DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
+ INPUT BY NAME requisicion.busca_orden ATTRIBUTES(WITHOUT DEFAULTS)
+ {AFTER FIELD sec_vend
+ SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email
+ INTO requisicion.nombre_vendedor,vendedoremail
+ FROM adtb00003 b,seg0000 a
+ WHERE b.num_emp = requisicion.sec_vend and
+ b.num_Emp = a.sec_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD sec_vend
+ END IF
+ DISPLAY BY NAME requisicion.nombre_vendedor}
+
+ AFTER FIELD busca_orden
+ LET pcerrada = null
+ SELECT a.sec_vend,a.cerrada,a.cond_pago
+ INTO requisicion.sec_vend,pcerrada,pcondpago
+ FROM prtb00012 a
+ WHERE a.num_oc = requisicion.busca_orden AND
+ a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ END IF
+ IF pcerrada = 'S' THEN
+ CALL fgl_winmessage("INFO","ORDEN ESTA CERRADA","STOP")
+ NEXT FIELD busca_orden
+ END IF
+ SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp
+ INTO requisicion.nombre_vendedor
+ FROM adtb00003 b
+ WHERE b.num_emp = requisicion.sec_vend
+
+ DISPLAY BY NAME requisicion.sec_vend,requisicion.nombre_vendedor
+ # IF pcondpago = 4 THEN
+ # CALL fgl_winmessage("INFO","ESTA ORDEN ES AL CONTADO, NO PUEDES HACER REQUISICION","INFO")
+ # NEXT FIELD busca_orden
+ # END IF
+ # ESTE CONSTRUCT SE COLOCO EN COMENTARIO PORQUE EL DIRECTOR DE VENTAS
+ # INFORMO QUE EN LA PRIMERA VERSION, EL VENDEDOR DEBE SABER QUE ORDEN
+ # VA A REQUERIR.
+ # CONSTRUCT criterio ON a.num_oc,a.fecha_oc,a.cotizacion_no
+ # FROM busca_orden,busca_fecha,busca_cotizacion
+
+ # BEFORE CONSTRUCT
+ # CALL DIALOG.setactionactive("procesa",0)
+ # CALL arr_requisicion.clear()
+
+ # ON ACTION busca_parametros
+
+ LET selec3 =
+ "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,SUM(b.cantidad),SUM(h.cantidad_1), ",
+ " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ",
+ " SUM(h.cantidad_1),SUM(b.cantidad),'0','0','0','0','0',h.id_kit,g.porc_itbi ",
+ "FROM prtb00012 a,vetb00004 c,prtb00013 b,iptb00002 d, ",
+ " vetb00050 g,prtb00023 h ",
+ "WHERE a.num_oc =",requisicion.busca_orden," AND ",
+ # " a.sec_vend = g.sec_vend AND ",
+ " a.tipo_cliente = c.tipo_cliente AND ",
+ " a.sec_cliente = c.sec_cliente AND ",
+ " a.num_oc = b.num_oc and ",
+ " a.num_oc = h.num_oc AND",
+ " b.cod_n = d.cod_n and ",
+ " b.cod_grupo = d.cod_grupo and ",
+ " b.cod_tipo = d.cod_tipo and ",
+ " b.cod_Sec = d.cod_Sec and ",
+ " b.secuencia = h.secuencia AND ",
+ " b.cod_n = h.cod_n and ",
+ " b.cod_grupo = h.cod_grupo and ",
+ " b.cod_tipo = h.cod_tipo and ",
+ " b.cod_Sec = h.cod_Sec and ",
+ " a.cotizacion_no = g.cotizacion_no AND ",
+ " a.cerrada = 'N' and a.status_t IS NULL ",
+ " GROUP BY a.fecha_oc,a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre, ",
+ " b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med,g.porc_itbi,b.area,h.id_kit "
+
+ { " UNION ",
+ "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,b.cantidad,b.cantidad, ",
+ " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ",
+ " b.cantidad,b.cantidad,'0','0','0','0','0',b.id_kit,g.porc_itbi ",
+ "FROM prtb00012 a,vetb00004 c,prtb00031 b,iptb00002 d, ",
+ " vetb00050 g ",
+ "WHERE a.num_oc =",requisicion.busca_orden," AND ",
+ " a.sec_vend = g.sec_vend AND ",
+ " a.tipo_cliente = c.tipo_cliente AND ",
+ " a.sec_cliente = c.sec_cliente AND ",
+ " a.num_oc = b.num_oc and ",
+ " b.cod_n = d.cod_n and ",
+ " b.cod_grupo = d.cod_grupo and ",
+ " b.cod_tipo = d.cod_tipo and ",
+ " b.cod_Sec = d.cod_Sec and ",
+ " a.cotizacion_no = g.cotizacion_no AND ",
+ " a.cerrada = 'N' and a.status_t IS NULL "
+
+ }
+ PREPARE comando FROM selec3
+ DECLARE busca_orden CURSOR FOR comando
+ OPEN busca_orden
+
+ LET total_cotizacion = 0
+ LET idx = 1
+ LET pcotizacion = 0
+ FOREACH busca_orden INTO arr_requisicion[idx].*,
+ porc_itbis[idx]
+ LET arr_requisicion[idx].procesa = "NO"
+
+
+ # BUSCA PRECIO
+ LET arr_requisicion[idx].precio = 0
+ IF arr_requisicion[idx].kit IS NULL THEN
+ SELECT AVG(a.precio),AVG(a.porc_Desc)
+ INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento
+ FROM vetb00051 a
+ WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND
+ a.area = arr_requisicion[idx].area AND
+ a.cod_n = arr_requisicion[idx].cod_n AND
+ a.cod_grupo = arr_requisicion[idx].cod_grupo AND
+ a.cod_tipo = arr_requisicion[idx].cod_tipo AND
+ a.cod_Sec = arr_requisicion[idx].cod_sec
+ ELSE
+ SELECT AVG(a.precio),AVG(a.porc_Desc)
+ INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento
+ FROM vetb00031 a
+ WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND
+ a.area = arr_requisicion[idx].area AND
+ a.cod_n = arr_requisicion[idx].cod_n AND
+ a.cod_grupo = arr_requisicion[idx].cod_grupo AND
+ a.cod_tipo = arr_requisicion[idx].cod_tipo AND
+ a.cod_Sec = arr_requisicion[idx].cod_sec AND
+ a.id_kit = arr_requisicion[idx].kit
+
+ END IF
+ IF arr_requisicion[idx].precio IS NULL THEN
+ LET arr_requisicion[idx].precio = 0
+ END IF
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].cantidad_ord *
+ arr_requisicion[idx].precio
+ LET arr_requisicion[idx].descvalor =
+ (arr_requisicion[idx].cantidad_ord *
+ arr_requisicion[idx].precio) *
+ (arr_requisicion[idx].descuento/100)
+
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor -
+ arr_requisicion[idx].descvalor
+
+ LET arr_requisicion[idx].valor = (arr_requisicion[idx].valor *
+ (porc_itbis[idx] /100)) +
+ arr_requisicion[idx].valor
+
+
+ CALL controles(requisicion.num_req,arr_requisicion[idx].area, arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,arr_requisicion[idx].num_oc,0,arr_requisicion[idx].cantidad_ord)
+ RETURNING estado,arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_1
+
+ LET total_cotizacion = total_cotizacion + arr_requisicion[idx].valor
+
+ IF arr_requisicion[idx].cantidad IS NULL THEN
+ LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1
+ LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_ord
+ LET arr_requisicion[idx].cantidad_pendiente = 0
+ ELSE
+
+ DISPLAY "CALCULO: CODIGO: ", arr_requisicion[idx].cod_sec," ORDEN:",arr_requisicion[idx].cantidad_ord1," CANTIDAD1: ",arr_requisicion[idx].cantidad_1
+ LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1 -
+ arr_requisicion[idx].cantidad_1
+
+ CALL factor_conv(arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,
+ arr_requisicion[idx].cantidad_1)
+ RETURNING resultado,estado
+
+ LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_1
+ DISPLAY "pendiente: ",arr_requisicion[idx].cantidad_pendiente
+ CALL factor_conv(arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,arr_requisicion[idx].cantidad_1)
+ RETURNING resultado,estado
+ IF resultado > 0 THEN
+ LET arr_requisicion[idx].cantidad = resultado
+ ELSE
+ LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_1
+ END IF
+
+ IF arr_requisicion[idx].cantidad_1 <=0 THEN
+ DISPLAY "SE DEVUELVE: ",arr_requisicion[idx].cod_sec," cantidad: ",arr_requisicion[idx].cantidad_1
+ CONTINUE FOREACH
+ END IF
+ END IF
+
+
+ LET idx = idx + 1
+ END FOREACH
+ LET estado = FALSE
+ IF idx = 1 THEN
+ CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESA CONDICION","STOP")
+ CALL arr_requisicion.clear()
+ EXIT DIALOG
+ END IF
+ DISPLAY BY NAME total_cotizacion
+ CALL set_count(idx-1)
+# AFTER CONSTRUCT
+# CALL input_data()
+ AFTER INPUT
+ SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email
+ INTO requisicion.nombre_vendedor,vendedoremail
+ FROM adtb00003 b,seg0000 a
+ WHERE b.num_emp = requisicion.sec_vend and
+ b.num_Emp = a.sec_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD busca_orden
+ END IF
+ DISPLAY BY NAME requisicion.nombre_vendedor
+
+ END INPUT
+
+
+ INPUT ARRAY arr_requisicion FROM s_requisi.* ATTRIBUTE(WITHOUT DEFAULTS)
+
+ ON ACTION desseleccion
+
+ FOR idx2 = 1 TO idx
+ IF arr_requisicion[idx2].num_oc IS NOT NULL THEN
+ LET arr_requisicion[idx2].procesa = "NO"
+
+ DISPLAY arr_requisicion[idx2].procesa TO s_requisi[scr_l].procesa
+ END IF
+ END FOR
+
+
+ ON ACTION seleccion
+
+ FOR idx2 = 1 TO arr_requisicion.getLength()
+ IF arr_requisicion[idx2].num_oc IS NOT NULL THEN
+ LET arr_requisicion[idx2].procesa = "SI"
+ LET scr_l = scr_line()
+ DISPLAY arr_requisicion[idx2].procesa TO s_requisi[idx2].procesa
+ END IF
+ END FOR
+
+ BEFORE INPUT
+ CALL DIALOG.setactionactive("procesa",1)
+ CALL DIALOG.setactionactive("insert",FALSE)
+ CALL DIALOG.setactionactive("delete",FALSE)
+ CALL DIALOG.setactionactive("append",FALSE)
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+
+ AFTER FIELD cantidad_1
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+ IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN
+ LET arr_requisicion[curr].valor = 0
+ CALL factor_conv(arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1)
+ RETURNING resultado,estado
+
+ IF estado = FALSE THEN
+ CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+
+ LET arr_requisicion[curr].cantidad = resultado
+ DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad
+ IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN
+ CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad,
+ arr_requisicion[curr].cantidad_ord)
+ RETURNING estado,remanente,unidadRemanente
+
+ IF NOT estado THEN
+ CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+
+ # CALL control_despiece(arr_requisicion[curr].area,arr_requisicion[curr].cod_n,arr_requisicion[curr].cod_grupo,
+ # arr_requisicion[curr].cod_tipo,arr_requisicion[curr].cod_sec,
+ # arr_requisicion[curr].num_oc ,arr_requisicion[curr].cantidad,accion) RETURNING estado
+
+ # IF estado = FALSE THEN
+ # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP")
+ # NEXT FIELD cantidad_1
+ # END IF
+ # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '||
+ # arr_requisicion[idx].procesa||' '||
+ # arr_requisicion[idx].cod_sec|| ' '||idx,"stop")
+
+ LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) *
+ (arr_requisicion[curr].descuento/100)
+
+ LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) -
+ arr_requisicion[curr].descvalor
+
+ LET arr_requisicion[curr].valor = arr_requisicion[curr].valor +
+ (arr_requisicion[curr].valor * (porc_itbis[curr]/100))
+ IF arr_requisicion[curr].valor < 0 THEN
+ LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio
+ END IF
+ DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor
+
+ END IF
+ AFTER INPUT
+ LET total_requisicion = 0
+ FOR idx = 1 TO arr_count()
+ # CALL control_despiece(arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ # arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_sec,
+ # arr_requisicion[idx].num_oc ,arr_requisicion[idx].cantidad,accion) RETURNING estado
+
+ # IF estado = FALSE THEN
+ # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP")
+ # NEXT FIELD cantidad_1
+ # END IF
+
+ LET total_Requisicion = total_requisicion + arr_requisicion[curr].valor
+ # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '||
+ # arr_requisicion[idx].procesa||' '||
+ # arr_requisicion[idx].cod_sec|| ' '||idx,"stop")
+
+ END FOR
+ DISPLAY BY NAME total_requisicion
+ END INPUT
+
+ ON ACTION procesa
+ LET rcantidad = arr_requisicion.getLength()
+ IF rcantidad > 0 THEN
+ CALL req_insert() RETURNING estado
+ IF estado THEN
+
+ DECLARE busca_emails CURSOR FOR
+ SELECT a.correo FROM seg0003 a
+ WHERE a.autorizacionDespacho = 'SI'
+ LET idx = 1
+ FOREACH busca_emails INTO copiacorreo[idx]
+ LET copiaemail = copiaemail CLIPPED,";",copiacorreo[idx] CLIPPED
+ LET idx = idx + 1
+ END FOREACH
+ IF idx=1 THEN
+ LET copiaemail='jsoto@marmotech.com.do'
+ END IF
+ CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP")
+ LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED
+ # CALL envia_correo(vendedorEmail,copiaemail,cuerpo_correo,
+ # subject, procedimiento )
+ SELECT a.cond_pago,a.total_neto INTO pcondpago,pneto
+ FROM vetb00050 a
+ WHERE a.cotizacion_no = arr_requisicion[1].cotizacion_no
+
+ CALL evaluaclientes(arr_requisicion[1].tipo_cliente,
+ arr_requisicion[1].sec_cliente,pcondpago,requisicion.num_req,
+ arr_requisicion[1].num_oc,
+ requisicion.sec_vend,'RQ',xmonto) RETURNING estado
+
+ IF estado THEN
+ UPDATE cctb00025 set estado = 'AUTORIZADA',
+ sec_vend_aprobado = requisicion.sec_vend,
+ fecha_autorizacion = GETDATE()
+ where num_req = requisicion.num_req
+ UPDATE cctb00026 set estado = 'AUTORIZADA',
+ us_mod = 'MBS',
+ fech_mod = GETDATE()
+ where num_req = requisicion.num_req
+
+ END IF
+ CALL entraMensaje(requisicion.num_req, pcotizacion,"A",usuarios)
+ CLEAR FORM
+ CALL arr_requisicion.clear()
+ RETURN
+
+ END IF
+ END IF
+ ON ACTION refrescar
+ CALL carga_lista()
+
+ ON ACTION CANCEL
+ CALL arr_requisicion.clear()
+ CALL msg(2)
+ DELETE FROM cctb00027 WHERE Num_req = numerotemp
+ EXIT DIALOG
+
+ END DIALOG
+END FUNCTION
+
+FUNCTION req_insert()
+DEFINE ultimo,numeroOrden INT
+
+ # WHENEVER ERROR CONTINUE
+ SELECT a.num_req INTO ultimo FROM cctb00019 a
+
+ IF ultimo IS NULL THEN
+ LET ultimo = 0
+ END IF
+ LET ultimo = ultimo + 1
+ LET requisicion.num_req = ultimo
+
+ UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
+
+ # GUARDA MASTER TABLE
+ # PREPARE s FROM "SELECT @@IDENTITY"
+ BEGIN WORK
+ # EXECUTE s INTO requisicion.num_req
+
+ DISPLAY BY NAME requisicion.num_req
+
+ LET subject = "AVISO REQUISICION DESPACHO NO. ",requisicion.num_req USING "&&&&&&"," VALOR: "
+ LET cuerpo_correo = "VENDEDOR : ",requisicion.nombre_vendedor CLIPPED
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," FECHA REQUISICION : ",requisicion.fecha_requisicion USING "DD/MM/YYYY"
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",requisicion.busca_orden USING "&&&&&&"
+ LET selec =
+ "INSERT INTO cctb00034 (id_kit,num_req,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
+ "SELECT a.id_kit,'",requisicion.num_req USING "<<<<<<","',a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
+ "FROM prtb00030 a ",
+ " WHERE a.id_kit = ? AND ",
+ " a.num_oc =?"
+
+ # PREPARE xcctb34 FROM selec
+
+ LET xmonto = 0
+ FOR idx = 1 TO arr_requisicion.getLength()
+ IF arr_requisicion[idx].num_oc is not null THEN
+ IF arr_requisicion[idx].procesa = "SI" THEN
+
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[idx].nombre CLIPPED," ",
+ " CONTIENE EL PRODUCTO ",
+ arr_requisicion[idx].unidad_med," ",
+ arr_requisicion[idx].cantidad_1," ",
+ arr_requisicion[idx].cantidad USING "<<,<<<.##",
+ arr_requisicion[idx].descripcion CLIPPED
+
+
+ LET numeroOrden = arr_requisicion[idx].num_oc
+
+
+ # IF arr_requisicion[idx].valor = 0 OR arr_requisicion[idx].valor IS NULL THEN
+ IF arr_requisicion[idx].descvalor IS NULL THEN
+ LET arr_requisicion[idx].descvalor = 0
+ END IF
+ IF arr_requisicion[idx].descuento IS NULL THEN
+ LET arr_requisicion[idx].descuento = 0
+ END IF
+
+ LET arr_requisicion[idx].valor = ((arr_requisicion[idx].cantidad * arr_requisicion[idx].precio)-
+ arr_requisicion[idx].descvalor)
+
+ DISPLAY "data1 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio,
+ " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor
+
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor +
+ (arr_requisicion[idx].valor * (porc_itbis[idx]/100))
+
+ DISPLAY "data2 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio,
+ " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor
+
+
+ # END IF
+ LET xmonto = xmonto + arr_requisicion[idx].valor
+ IF arr_requisicion[idx].cantidad IS NULL THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("INFO","CANTIDAD EN BLANCO","INFO")
+ RETURN FALSE
+ END IF
+ INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec,
+ cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio,descuento,descvalor,valor,us_crea,fech_crea,estado,
+ id_kit)
+
+ VALUES (requisicion.num_req,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no,
+ idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord,arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),requisicion.estado,arr_requisicion[idx].kit)
+
+ IF SQLSTATE > 02 THEN
+ LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION"
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",chmensaje,"STOP")
+ RETURN FALSE
+ EXIT FOR
+ END IF
+
+ END IF
+ END IF
+ END FOR
+
+
+
+ # INSERTA DESPIECE
+ FOR idx1 = 1 TO rdespiece.getLength()
+ IF rdespiece[idx1].medida> 0 THEN
+ INSERT INTO cctb00027
+ (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,
+ Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,
+ fech_crea)
+ VALUES
+ (requisicion.num_req,rdespiece[idx1].etiqueta,numeroOrden,idx,arr_requisicion[idx].area,
+ rdespiece[idx1].cod_n,
+ rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec,
+ rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3,
+ rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r,
+ rdespiece[idx1].medida_r,usuarios,GETDATE())
+
+ IF STATUS < 0 THEN
+
+ ROLLBACK WORK
+ CLOSE WINDOW w10
+
+ CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP")
+ LET estado = FALSE
+ RETURN FALSE
+ ELSE
+
+ LET estado = TRUE
+ END IF
+ END IF
+ END FOR
+
+ INSERT INTO cctb00025 (num_req,fecha,sec_vend,us_crea,fech_crea,estado,estado_despacho,monto_req)
+ VALUES (requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend,SUSER_SNAME(),GETDATE(),requisicion.estado,"NO DESPACHADA",xmonto)
+
+ IF STATUS < 0 THEN
+ LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION"
+ ROLLBACK WORK
+ CALL fgl_Winmessage("ERROR",chmensaje,"STOP")
+ RETURN FALSE
+ END IF
+ IF estado THEN
+ COMMIT WORK
+ CALL entramensaje(requisicion.num_req,pcotizacion,"A",usuarios)
+ RETURN TRUE
+ ELSE
+ ROLLBACK WORK
+ CALL fgl_winmessage("MENSAJE","NO SE INSERTARON DATOS EN REQUISICION","STOP")
+ RETURN FALSE
+ END IF
+
+END FUNCTION
+FUNCTION controles(pnumreq,parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero,cantidad_Trx,cantidadORD)
+ DEFINE unidad_ctrl,cantidad_ctrl,cantidad_trx,cantidadORD DEC(12,2),
+ pcodn,pcodgrupo,pcodtipo,pcodsec,parea SMALLINT,
+ numero,pnumreq INT,
+ chmesage CHAR(80)
+
+ SELECT ISNULL(SUM(a.cantidad),0) INTO cantidadord
+FROM prtb00013 a
+WHERE a.num_oc = numero AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.area = parea AND
+ a.status_t IS NULL
+
+# CONTROL 01 CANTIDAD REQUISICION VS CANTIDAD ORDENADA
+LET cantidad_ctrl=0
+LET unidad_ctrl=0
+SELECT ISNULL(SUM(a.cantidad),0),ISNULL(SUM(a.cantidad_1),0) INTO cantidad_ctrl,unidad_ctrl
+FROM cctb00026 a
+WHERE a.num_oc = numero AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.num_req <> pnumreq AND
+ a.area = parea AND
+ a.status_t IS NULL
+
+ IF cantidad_ctrl IS NULL THEN
+ LET cantidad_ctrl=0
+ END IF
+ #LET chmesage = " TRX "+cantidad_trx using "&&&&.####"," CTRL ",cantidad_ctrl USING "&&&.####"
+ #LET chmesage = " ORDEN "+numero USING "&&&&&&"
+ #LET chmesage = " codn ",pcodn using "&&&"," codgrupo ",pcodgrupo USING "&&&"," codtipo " ,pcodtipo using "&&&"," codsec ",pcodsec USING "&&&"
+ # CALL FGL_WINMESSAGE("W",cantidad_ctrl,"STOP")
+ # DISPLAY "cantidad ctrl ",cantidad_ctrl, "cantidad_trx,",cantidad_trx,
+ #"cantidadORD ",cantidadord," cod ",pcodsec
+ IF cantidad_trx IS NULL THEN
+ LET cantidad_Trx = 0
+ END IF
+ DISPLAY "control: ",cantidad_ctrl," cantidad trx: ",cantidad_trx," orden: ",cantidadOrd
+ IF cantidad_ctrl +cantidad_Trx > cantidadORD THEN
+ DISPLAY "resultado: ",cantidad_ctrl +cantidad_Trx," orden ",cantidadORD
+ RETURN FALSE,cantidad_ctrl,unidad_ctrl
+ ELSE
+ RETURN TRUE, cantidad_ctrl,unidad_ctrl
+ END IF
+
+END FUNCTION
+FUNCTION busca_info()
+
+ DISPLAY pfecha_req TO fecha_requisicion
+ DISPLAY requisicion.num_req,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.nombre_vendedor,requisicion.sec_vend,
+ requisicion.estado
+ TO num_req,sec_vend_a,nombre_a,nombre_vendedor,sec_vend,estado
+ CALL arr_requisicion.clear()
+ DECLARE busca_req2 CURSOR FOR
+ SELECT a.num_oc,CAST(b.fecha_oc AS CHAR(10)),a.cotizacion_no,
+ a.cantidad_1,a.cantidad,a.cantidad_ord1,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ b.tipo_cliente,b.sec_cliente,c.nombre,a.cantidad_ord,a.precio,
+ a.descuento,a.descvalor,a.valor,d.descrip_esp,a.estado,a.id_kit
+ FROM cctb00026 a,prtb00012 b,vetb00004 c,iptb00002 d
+ WHERE a.num_req = requisicion.num_req and
+ a.num_oc = b.num_oc AND
+ b.tipo_cliente = c.tipo_cliente AND
+ b.sec_cliente = c.sec_cliente AND
+ a.cod_n = d.cod_n AND
+ a.cod_grupo = d.cod_grupo AND
+ a.cod_tipo = d.cod_tipo AND
+ a.cod_Sec = d.cod_sec
+
+ LET idx = 1
+ FOREACH busca_req2 INTO arr_requisicion[idx].num_oc,arr_requisicion[idx].fecha,
+ arr_requisicion[idx].cotizacion_no,arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_ord1,
+ arr_requisicion[idx].area,
+ arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_Sec,arr_requisicion[idx].tipo_cliente,
+ arr_requisicion[idx].sec_cliente,arr_requisicion[idx].nombre,
+ arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,arr_requisicion[idx].valor,
+ arr_requisicion[idx].descripcion,arr_requisicion[idx].procesa,
+ arr_requisicion[idx].kit
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_ord - arr_requisicion[idx].cantidad
+ LET idx = idx + 1
+ END FOREACH
+ CALL set_count(idx-1)
+ DISPLAY ARRAY arr_requisicion TO s_requisi.*
+
+END FUNCTION
+#FUNCTION envia_correo()
+# IF vendedorEmail IS NULL THEN
+# LET vendedorEmail = 'jsoto@marmotech.com.do'
+# END IF
+# LET vendedorEmail = vendedorEmail CLIPPED,'rantonio@marmotech.com.do'
+
+# PREPARE smt FROM "{ call cc_avisadespacho(?,?,?) }"
+# EXECUTE smt USING cuerpo_correo IN,subject IN,vendedorEmail IN
+
+#END FUNCTION
+
+FUNCTION control_despiece(parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero_ord,pcantidad,accion)
+ DEFINE pestado BOOLEAN,
+ total_medida DEC(12,5),
+ punidad CHAR(3),accion CHAR(1),
+ pdescripcion CHAR(60),
+ numero_ord,numero_req INT,
+ parea,pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT,
+ medidactrl,pcantidad DEC(12,5)
+
+ CALL rdespiece.clear()
+ # BUSCA SI EL ARTICULO SE DESPIEZA
+
+ SELECT UNIQUE b.unidad_med,b.descrip_esp
+ INTO punidad,pdescripcion
+ FROM iptb00027 a,iptb00002 b
+ WHERE a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_Sec = pcodsec AND
+ a.cod_n = b.cod_n AND
+ a.cod_grupo = b.cod_grupo AND
+ a.cod_tipo = b.cod_tipo AND
+ a.cod_Sec = b.cod_sec
+
+ IF STATUS = NOTFOUND THEN
+ LET estado=TRUE
+ RETURN estado
+ END IF
+
+ IF accion = "A" THEN
+
+ # SELECT a.num_temp_req INTO numero_req FROM cctb00028 a
+ # IF numero_req IS NULL THEN
+ LET numero_req = 1000
+ # INSERT INTO cctb00028 (num_temp_req) VALUES (numero_req) SE COLOCO ESTAS INSTRUCCIONES EN COMENTARIO PORQUE SE CREO UNA TABLA TEMPORAL cctb00030
+ # END IF
+# LET numero_req = numero_req + 1
+ # UPDATE cctb00028 set num_temp_req = numero_req
+
+
+ DECLARE busca_despiece CURSOR FOR
+ SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3,
+ SUM(a.cantidad),SUM(a.medida),SUM(b.cantidad),SUM(b.medida)
+ FROM prtb00022 a LEFT OUTER JOIN cctb00030 b ON
+ a.num_oc = b.num_oc AND
+ a.area = b.area AND
+ a.cod_n = b.cod_n AND
+ a.cod_grupo = b.cod_grupo AND
+ a.cod_tipo = b.cod_tipo AND
+ a.cod_sec = b.cod_sec AND
+ a.lado_1 = b.lado_1 AND
+ a.lado_2 = b.lado_2 AND
+ a.lado_3 = b.lado_3 AND
+ b.us_crea = usuarios AND
+ a.etiqueta = b.etiqueta
+ WHERE
+ a.num_oc = numero_ord AND
+ a.area = parea AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec
+ GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3
+ LET idx1 = 1
+ FOREACH busca_despiece INTO rdespiece[idx1].*
+ LET rdespiece[idx1].cantidad_r = rdespiece[idx1].cantidad
+ LET rdespiece[idx1].medida_r = rdespiece[idx1].medida
+ LET idx1 = idx1 + 1
+ END FOREACH
+
+ ELSE
+ # call fgl_winmessage("w",numero_Req,"stop")
+ DECLARE busca_despiece1 CURSOR FOR
+ SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3,
+ SUM(a.cantidad),SUM(a.medida),SUM(a.cantidad),SUM(a.medida)
+ FROM cctb00027 a
+ WHERE
+ a.num_oc = numero_ord AND
+ a.area = parea AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.num_req = numero_req
+ GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3
+
+ LET idx1 = 1
+ FOREACH busca_despiece1 INTO rdespiece[idx1].*
+ LET idx1 = idx1 + 1
+ END FOREACH
+ END IF
+
+ IF idx1 = 1 THEN
+ LET pestado = FALSE
+ RETURN pestado
+ ELSE
+ LET pestado = TRUE
+ END IF
+
+ OPEN WINDOW w10 AT 5,6 WITH FORM "ccfmwd004"
+ DISPLAY pdescripcion TO descrip_esp
+ DISPLAY punidad TO unidad_med
+
+ CALL set_count(idx1-1)
+ INPUT ARRAY rdespiece WITHOUT DEFAULTS FROM sdespiece.*
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET fila = scr_line()
+
+ AFTER FIELD cantidad_r
+ IF rdespiece[curr].cantidad_r IS NOT NULL THEN
+ LET medidactrl = 0
+ SELECT SUM(a.medida_r) INTO medidaCtrl
+ FROM cctb00027 a
+ WHERE a.area = parea AND
+ a.cod_n = rdespiece[curr].cod_n AND
+ a.cod_grupo =rdespiece[curr].cod_grupo AND
+ a.cod_tipo = rdespiece[curr].cod_tipo AND
+ a.cod_sec = rdespiece[curr].cod_Sec AND
+ a.lado_1 = rdespiece[curr].lado_1 AND
+ a.lado_2 = rdespiece[curr].lado_2 AND
+ a.num_oc = numero_ord AND a.status_t IS NULL AND
+ a.num_req <> numero_req
+
+ IF medidaCtrl IS NULL THEN
+ LET medidactrl = 0
+ END IF
+
+ IF punidad= "M2" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2)
+ END IF
+
+ IF punidad= "M3" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2 * rdespiece[curr].lado_3)
+ END IF
+
+ IF punidad= "ML" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * rdespiece[curr].lado_1
+ LET rdespiece[curr].lado_2 = 0
+ END IF
+
+ IF punidad= "UD" OR punidad= "GL" THEN
+ LET rdespiece[curr].medida_r = rdespiece[curr].cantidad_r
+ END IF
+ DISPLAY rdespiece[curr].medida_r TO sdespiece[fila].medida_r
+
+ #IF medidaCtrl + rdespiece[curr].medida_r > rdespiece[curr].medida THEN
+ # LET pestado = FALSE
+
+ # EXIT INPUT LOCOLOQUE POR TIENE OTRO AFTER INPUT FECHA:14/10/11
+
+
+ # END IF
+ LET total_medida_r = 0
+ LET cuenta_despiece = arr_count()
+ LET total_medida = 0
+ FOR idx1= 1 TO cuenta_despiece
+ IF rdespiece[idx1].medida_r > 0 THEN
+ LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r
+ END IF
+ IF rdespiece[idx1].medida > 0 THEN
+ LET total_medida = total_medida + rdespiece[idx1].medida
+ END IF
+ END FOR
+ DISPLAY BY NAME total_medida,total_medida_r
+ END IF
+ AFTER INPUT
+ IF Int_flag THEN
+ LET pestado = FALSE
+ EXIT INPUT
+ END IF
+ LET total_medida_r = 0
+ LET cuenta_despiece = arr_count()
+ FOR idx1 = 1 TO cuenta_despiece
+ IF rdespiece[idx1].medida_r > 0 THEN
+ LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r
+ END IF
+ IF rdespiece[idx1].medida > 0 THEN
+ LET total_medida = total_medida + rdespiece[idx1].medida
+ END IF
+ END FOR
+ DISPLAY "T ",total_medida_r," ",pcantidad
+ IF total_medida_r <> pcantidad THEN
+
+ CONTINUE INPUT
+ END IF
+
+ DISPLAY BY NAME total_medida,total_medida_r
+ IF int_flag THEN
+ CLOSE WINDOW w10
+ RETURN FALSE
+ END IF
+ END INPUT
+ IF int_flag THEN
+ LET int_flag = FALSE
+ LET pestado = FALSE
+ END IF
+# WHENEVER ERROR CONTINUE
+ BEGIN WORK
+
+ LET numerotemp = numero_req
+ FOR idx1 = 1 TO cuenta_despiece
+ IF rdespiece[idx1].cantidad_r > 0 THEN
+ DELETE FROM cctb00030 WHERE us_crea = usuarios and num_req = numero_req and
+ area = parea AND
+ cod_n = rdespiece[idx1].cod_n and
+ cod_grupo = rdespiece[idx1].cod_grupo and
+ cod_tipo = rdespiece[idx1].cod_tipo and
+ cod_Sec = rdespiece[idx1].cod_sec
+ LET rdespiece[idx].etiqueta=idx
+ INSERT INTO cctb00030
+ (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,
+ Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,
+ fech_crea)
+ VALUES
+ (numero_req,rdespiece[idx1].etiqueta,numero_ord,idx,parea,rdespiece[idx1].cod_n,
+ rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec,
+ rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3,
+ rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r,
+ rdespiece[idx1].medida_r,usuarios,GETDATE())
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP")
+ LET pestado = FALSE
+ EXIT FOR
+ CLOSE WINDOW w10
+ ELSE
+
+ LET pestado = TRUE
+ END IF
+ END IF
+ END FOR
+ IF pestado THEN
+ COMMIT WORK
+ ELSE
+ ROLLBACK WORK
+ END IF
+
+ CLOSE WINDOW w10
+
+ RETURN pestado
+END FUNCTION
+
+FUNCTION carga_lista()
+ DEFINE busca_vend SMALLINT,
+ bnombre_vend CHAR(50)
+
+INPUT BY NAME busca_vend
+ AFTER FIELD busca_vend
+ IF busca_vend IS NOT NULL THEN
+
+ SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp
+ INTO bnombre_vend
+ FROM adtb00003 b
+ WHERE b.num_emp = busca_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD busca_vend
+ END IF
+ DISPLAY BY NAME bnombre_vend
+ END IF
+
+ AFTER INPUT
+ IF Int_flag THEN
+ LET int_flag = FALSE
+ RETURN
+ END IF
+ END INPUT
+
+ DISPLAY ARRAY listarequisi TO s_lista.*
+ BEFORE DISPLAY
+
+ CALL busca_lista(busca_vend)
+
+ IF idx = 1 THEN
+ RETURN
+ END IF
+ ON ACTION refrescar
+ CALL busca_lista(busca_vend)
+ AFTER DISPLAY
+ EXIT DISPLAY
+ END DISPLAY
+
+END FUNCTION
+
+FUNCTION busca_lista(xvend)
+ DEFINE xvend SMALLINT
+ DECLARE busca_requi20 CURSOR FOR
+ SELECT a.estado,a.estado_despacho,x.estado_produccion,a.num_req,CAST(a.fecha AS CHAR(10)),
+ e.descrip_Esp||' '||e.unidad_med,CAST(b.fecha_transporte AS CHAR(10)),CAST(b.fecha_llegada AS CHAR(10)),
+ b.num_oc,c.nombre,SUM(b.valor)
+ FROM cctb00025 a,cctb00026 b,vetb00004 c,prtb00012 d,iptb00002 e,prtb00013 x
+ WHERE a.sec_vend = xvend AND
+ a.num_req = b.num_req AND
+ b.num_oc = d.num_oc AND
+ b.num_oc = x.num_oc AND
+ d.tipo_cliente = c.tipo_cliente AND
+ d.sec_cliente = c.sec_cliente AND
+ b.area = x.area AND
+ b.cod_n = e.cod_n AND b.cod_grupo = e.cod_grupo AND
+ b.cod_tipo = e.cod_tipo AND b.cod_Sec = e.cod_sec AND
+ b.cod_n = x.cod_n AND b.cod_grupo = x.cod_grupo AND
+ b.cod_tipo = x.cod_tipo AND b.cod_Sec = x.cod_Sec AND
+ d.cerrada = 'N' AND a.status_t IS NULL AND a.estado_despacho NOT IN ('DESPACHADA')
+ GROUP BY a.estado,a.estado_despacho,a.num_req,b.num_oc,c.nombre,a.fecha, e.descrip_Esp,e.unidad_med,
+ b.fecha_transporte,b.fecha_llegada,x.estado_produccion
+ ORDER BY a.estado DESC
+ LET idx = 1
+ FOREACH busca_requi20 INTO listarequisi[idx].estado1,
+ listarequisi[idx].estado2,
+ listarequisi[idx].estado_produccion,
+ listarequisi[idx].num_req1,
+ listarequisi[idx].fecha1,
+ listarequisi[idx].material,
+ listarequisi[idx].fecha_transporte,
+ listarequisi[idx].fecha_llegada,
+ listarequisi[idx].num_oc1,
+ listarequisi[idx].cliente1,
+ listarequisi[idx].valor1
+ LET idx = idx + 1
+ END FOREACH
+ CALL set_count(idx-1)
+
+END FUNCTION
+
+FUNCTION factor_conv(pcodn,pcodgrupo,pcodtipo,pcodsec,pcantidad)
+ DEFINE pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT,
+ pcantidad,pfactor,presultado DEC(12,5),
+ pestado BOOLEAN
+
+ LET pfactor = 0
+ SELECT a.factor_conv INTO pfactor
+ FROM iptb00001 a
+ WHERE a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ LET pestado = FALSE
+ ELSE
+
+ LET presultado = pcantidad * pfactor
+
+ LET pestado = TRUE
+ END IF
+ RETURN presultado,pestado
+END FUNCTION
+
+FUNCTION input_data()
+ DEFINE remanente,unidadRemanente DEC(12,4)
+ CALL set_count(idx-1)
+
+ INPUT ARRAY arr_requisicion WITHOUT DEFAULTS FROM s_requisi.*
+
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+
+ AFTER FIELD cantidad_1
+ IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN
+ LET arr_requisicion[curr].valor = 0
+ CALL factor_conv(arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1)
+ RETURNING resultado,estado
+
+ IF estado = FALSE THEN
+ CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP")
+ NEXT FIELD cantidad
+ END IF
+
+ LET arr_requisicion[curr].cantidad = resultado
+ DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad
+ IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN
+ CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad,
+ arr_requisicion[curr].cantidad_ord)
+ RETURNING estado,remanente,unidadRemanente
+
+ IF NOT estado THEN
+ CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) *
+ (arr_requisicion[curr].descuento/100)
+ LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) -
+ arr_requisicion[curr].descvalor
+
+ LET arr_requisicion[curr].valor = arr_requisicion[curr].valor +
+ (arr_requisicion[curr].valor * (porc_itbis[curr]/100))
+
+ IF arr_requisicion[curr].valor < 0 THEN
+ LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio
+ END IF
+ DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor
+ END IF
+
+ ON ACTION procesa
+ LET rcantidad = arr_count()
+ CALL req_insert() RETURNING estado
+ IF estado = TRUE THEN
+ # CALL envia_correo()
+ DISPLAY BY NAME requisicion.num_req
+ CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP")
+ CLEAR FORM
+ CALL arr_requisicion.clear()
+ RETURN
+ END IF
+ END INPUT
+
+END FUNCTION
+
+FUNCTION ccprmf008()
+
+ DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
+ CONSTRUCT criterio ON a.num_req,c.num_oc,a.fecha FROM num_req,busca_orden,fecha_requisicion
+ ON ACTION refrescar
+ CALL carga_lista()
+ ON ACTION busca_parametros ATTRIBUTE(TEXT="Ejecuta Busqueda",IMAGE="find_all")
+
+ LET selec =
+ "SELECT DISTINCT a.num_req,CONVERT(CHAR(10),a.fecha,103),a.sec_vend_aprobado,",
+ "(SELECT RTRIM(k.nom1_emp)+' '+k.apell1_emp FROM adtb00003 k WHERE ",
+ "k.num_emp = a.sec_vend_aprobado) as nombre_aprobado,",
+ "a.sec_vend,ISNULL(RTRIM(b.nom1_emp),' ') +' '+ISNULL(b.apell1_emp,' '),a.estado ",
+ " FROM cctb00025 a,adtb00003 b,cctb00026 c ",
+ " WHERE ",criterio CLIPPED," AND a.num_req = c.num_req ",
+ " AND a.sec_vend = b.num_emp AND a.status_t is null ",
+ " ORDER BY a.num_req"
+
+ PREPARE comando2 FROM selec
+ DECLARE busca_req SCROLL CURSOR FOR comando2
+ OPEN busca_req
+
+
+ FETCH FIRST busca_req INTO requisicion.num_req,pfecha_req,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESTE CRITERIO DE BUSQUEDA","STOP")
+ EXIT DIALOG
+ ELSE
+ CALL busca_info()
+
+ MENU
+ ON ACTION mensaje
+ CALL entraMensaje(requisicion.num_req,pcotizacion,"M",usuarios)
+
+ ON ACTION siguiente
+ FETCH NEXT busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION primero
+ FETCH FIRST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION ultimo
+ FETCH LAST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ CALL fgl_winmessage("MENSAJE","ULTIMO REGISTRO","STOP")
+ ON ACTION anterior
+ FETCH PREVIOUS busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION anular
+
+ # CONTROL REQUISICION DESPACHADA
+ SELECT UNIQUE a.num_req FROM iptb00006 a
+ WHERE a.num_req = requisicion.num_req AND a.status_t IS null
+
+ IF STATUS <> NOTFOUND THEN
+ CALL fgl_winmessage("ERR0R","REQUISICION TIENE DESPACHO NO PUEDE ANULAR","INFO")
+ CONTINUE DIALOG
+ END IF
+ LET respuesta= fgl_winquestion("ATENCION","ESTA SEGURO DE ANULAR ESTA REQUISICION?","no","yes|no","question",0)
+ IF respuesta = "yes" THEN
+ LET pcotizacion = NULL
+ LET xorden = NULL
+ LET xtipocliente=NULL
+ LET xseccliente = NULL
+ LET requisicion.estado=NULL
+
+ SELECT DISTINCT a.cotizacion_no,a.num_oc,b.tipo_cliente,b.sec_cliente,c.monto_req,c.estado
+ INTO pcotizacion, xorden,xtipocliente,xseccliente,xmonto,requisicion.estado
+ FROM cctb00026 a,prtb00012 b,cctb00025 c
+ WHERE a.num_req = requisicion.num_req AND a.num_req = c.num_req AND a.cotizacion_no = b.cotizacion_no AND
+ b.status_t IS NULL AND c.status_t IS null
+ BEGIN WORK
+ UPDATE cctb00025 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate(),
+ estado = 'ANULADA'
+ WHERE num_req = requisicion.num_req
+ UPDATE cctb00026 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate()
+
+ WHERE num_req = requisicion.num_req
+ UPDATE cctb00027 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate()
+
+ WHERE num_req = requisicion.num_req
+
+ #INSERTA EN TABLA LOG
+ INSERT INTO cctb00031
+ (fecha,us_crea,sec_vend,nombrevendedor,tipo_cliente,sec_cliente,num_oc,descrip_estado,
+ num_req,tipo_doc_ref,cotizacion_no )
+ VALUES (getdate(),usuarios,requisicion.sec_vend,requisicion.nombre_vendedor,
+ xtipocliente,xseccliente,xorden,
+ 'ESTA REQUISICION FUE ANULADA',requisicion.num_req,'RQ',pcotizacion)
+ COMMIT WORK
+ END IF
+ CLEAR FORM
+{ ON ACTION actualizar
+
+ IF requisicion.sec_vend_a IS NULL THEN
+ CALL input_data()
+ FOR idx = 1 TO arr_count()
+ IF arr_requisicion[idx].cantidad > 0 THEN
+ IF arr_requisicion[idx].procesa = "SI" THEN
+ UPDATE cctb00026 SET cantidad = arr_requisicion[idx].cantidad,
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE cod_n = arr_requisicion[idx].cod_n AND
+ cod_n = arr_requisicion[idx].cod_n AND
+ cod_grupo = arr_requisicion[idx].cod_grupo AND
+ cod_tipo = arr_requisicion[idx].cod_tipo AND
+ cod_sec = arr_requisicion[idx].cod_sec AND
+ num_req = requisicion.num_req
+ END IF
+ END IF
+ END FOR
+ ELSE
+ CALL fgl_winmessage("ERROR","NO PUEDE ACTUALIZAR REQUISICION, YA ESTA APROBADA","STOP")
+ END IF
+ }
+
+
+ ON ACTION sale
+ EXIT DIALOG
+ END MENU
+ END IF
+
+ END CONSTRUCT
+
+ ON ACTION cancel
+ CALL arr_requisicion.clear()
+ CALL msg(2)
+ EXIT DIALOG
+
+ END DIALOG
+END FUNCTION
+
diff --git a/PROYECTO/ipdir/ipprrp013.4gl b/PROYECTO/ipdir/ipprrp013.4gl
index f193a07..9bc72e3 100644
--- a/PROYECTO/ipdir/ipprrp013.4gl
+++ b/PROYECTO/ipdir/ipprrp013.4gl
@@ -629,7 +629,7 @@ REPORT estadistica(x,dias2,c_dias)
FORMAT
FIRST PAGE HEADER
LET hora = time
- LET fecha = today
+ LET fecha = today
LET total_registros = 0
LET tcantidad = 0
LET fecha_v = NULL
@@ -653,14 +653,14 @@ REPORT estadistica(x,dias2,c_dias)
# BUSCA ULTIMA FECHA DE COMPRA Y VENTA DEL PRODUCTO
LET fecha_v = NULL
- SELECT convert(char(10),MAX(a.fecha_factura),103) INTO fecha_v
+ SELECT MAX(a.fecha_factura) INTO fecha_v
FROM vetb00003 d,vetb00002 a
WHERE d.factura = a.factura AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND
a.status_t is NULL
LET fecha_oc = NULL
- SELECT ISNULL(convert(char(10),MAX(a.fech_oc),103)," ") INTO fecha_oc
+ SELECT MAX(a.fech_oc) INTO fecha_oc
FROM cotb00015 d,cotb00014 a
WHERE d.num_oc = a.num_oc AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
diff --git a/PROYECTO/ipdir/ipprrp013.4rp b/PROYECTO/ipdir/ipprrp013.4rp
index cf4e3e4..3784afc 100644
--- a/PROYECTO/ipdir/ipprrp013.4rp
+++ b/PROYECTO/ipdir/ipprrp013.4rp
@@ -1,5 +1,5 @@
-
+
@@ -8,22 +8,26 @@
+
-
-
+
+
-
+
+
-
-
+
+
+
+
@@ -43,35 +47,33 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/PROYECTO/ipdir/ipprrp053.4gl b/PROYECTO/ipdir/ipprrp053.4gl
index d0bc967..793407e 100644
--- a/PROYECTO/ipdir/ipprrp053.4gl
+++ b/PROYECTO/ipdir/ipprrp053.4gl
@@ -43,6 +43,7 @@ FUNCTION ipprrp053()
OPEN FORM ipfmrp053 FROM "ipfmrp053"
DISPLAY FORM ipfmrp053
+ CALL ui.Window.getCurrent().setText("Informe Transacciones Inventarios")
INPUT BY NAME fecha1, fecha2
@@ -112,7 +113,7 @@ FUNCTION ipprrp053()
LET r_filename = "ipprrp053.4rp"
IF fgl_report_loadCurrentSettings(r_filename) THEN
LET preview = 1
- CALL selectoutput() RETURNING r_output
+ CALL selectOutputSimple() RETURNING r_output
CALL fgl_report_selectDevice(r_output)
CALL fgl_report_selectPreview(preview)
LET handler = fgl_report_commitCurrentSettings()
diff --git a/PROYECTO/ipdir/ipprrp053.4rp b/PROYECTO/ipdir/ipprrp053.4rp
new file mode 100644
index 0000000..815a3fd
--- /dev/null
+++ b/PROYECTO/ipdir/ipprrp053.4rp
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw
index 0e40bf5..483f089 100644
--- a/PROYECTO/mbsERP.4pw
+++ b/PROYECTO/mbsERP.4pw
@@ -630,11 +630,13 @@
+
-
+
+
@@ -745,6 +747,7 @@
+
@@ -888,6 +891,7 @@
+
@@ -942,6 +946,8 @@
+
+
@@ -961,9 +967,15 @@
-
+
+
+
+
+
+
+
diff --git a/PROYECTO/nodir/backup_noprmt003_016_20261005/nofmmt003.4fd b/PROYECTO/nodir/backup_noprmt003_016_20261005/nofmmt003.4fd
new file mode 100644
index 0000000..85880c8
--- /dev/null
+++ b/PROYECTO/nodir/backup_noprmt003_016_20261005/nofmmt003.4fd
@@ -0,0 +1,360 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt003.4gl b/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt003.4gl
new file mode 100644
index 0000000..3c14e6e
--- /dev/null
+++ b/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt003.4gl
@@ -0,0 +1,1205 @@
+{
+----------------------------------------------------------------------------
+ PROGRAMA : NOPRMT003
+ OBJETIVO : Modificar y Eliminar registros de la
+ Tabla de Maestra de Empleados
+ PROGRAMADOR : JUAN SOTO
+ FECHA REALIZACION : FEBRERO 18, 1998.
+----------------------------------------------------------------------------
+}
+IMPORT os
+
+GLOBALS "noprgb000.4gl"
+DEFINE tipo_sexo CHAR(9),
+ operacion CHAR(1),
+ descrip_st CHAR(20),
+ descripcion_cuenta,imagenom,filepath,filedestino CHAR(100),
+ sec_vend_supervisor SMALLINT,
+ num_emp_supervisor INT,
+ nombre_out,nombre_supervisor,nombre_super VARCHAR(60),
+ actualiza_datos STRING,
+ nombre_empleado_out VARCHAR(100),
+ imagen_emp BYTE
+
+DEFINE p_sexo CHAR(1)
+DEFINE herramientas DYNAMIC ARRAY OF RECORD
+ codigo VARCHAR(20),
+ descripcion VARCHAR(80),
+ fecha DATE,
+ documento VARCHAR(20),
+ cantidad DECIMAL(12,5)
+ END RECORD
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+
+ -- La conexion a Informix (marmotech/IFMX) ya no existe; el sistema
+ -- fue migrado completo a SQL Server (smarmotech/MSSQL). Dejarla
+ -- activa colgaba el programa al inicio intentando conectar.
+ CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL noprmt003()
+END MAIN
+
+FUNCTION noprmt003()
+
+ CLEAR SCREEN
+ OPTIONS
+ FORM LINE 9,
+ ERROR LINE 24,
+ COMMENT LINE 23
+
+ OPEN FORM nofmmt003 FROM "nofmmt003"
+ DISPLAY FORM nofmmt003
+ LET selec = "SELECT a.deptname FROM facial.dbo.departments a WHERE a.code = ? "
+ PREPARE BUSCA_DEPTO FROM selec
+
+ MENU
+ ON ACTION nuevo
+ SET CONNECTION "MSSQL"
+ SELECT a.usuario FROM seg0001 a,seg0005 b
+ WHERE a.usuario =usuarios AND
+ a.cod_perfil = b.cod_perfil AND
+ b.programa = 'noprmt003.nuevo'
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","USTED NO TIENE PERMISOS PARA UTILIZAR OPCION","INFO")
+ CONTINUE MENU
+ END IF
+
+ let int_flag = false
+ LET operacion = "A"
+ INITIALIZE emplea.* TO NULL
+ LOCATE emplea.foto_empleado IN MEMORY
+ CALL adpcmf022()
+ ON ACTION buscar
+ SET CONNECTION "MSSQL"
+ let int_flag = false
+ LET operacion = "M"
+ CALL adpcmf022()
+ ON ACTION Salir
+ EXIT MENU
+ END MENU
+END FUNCTION
+
+FUNCTION adpcmf022()
+## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA CONSULTA Y
+## MODIFICACION DE REGISTROS
+
+ IF operacion = "M" THEN
+ CONSTRUCT criterio ON a.num_emp,a.departamento,a.nom1_emp,a.apell1_emp,a.nom2_emp,a.apell2_emp,a.cedula,a.alias
+ FROM num_emp,departamento,nom1_emp,apell1_emp,nom2_emp,apell2_emp,cedula,alias
+ BEFORE CONSTRUCT
+ CALL departamentos()
+ END CONSTRUCT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+ LET SELEC =
+ "SELECT a.num_emp,a.departamento,a.nivel_emp,
+ a.cod_puesto,a.nom1_emp,a.nom2_emp,
+ a.apell1_emp,a.apell2_emp,a.tipo_empleado,
+ a.fecha_termino_c,a.calle,a.casa_num,a.barrio,
+ a.urbanizacion,a.credito,a.telefono,a.telefonoCorporativo,a.numeroOficina,a.extension,
+ a.fech_nac,a.cod_nac,
+ a.estado_civil,a.tipo_sangre,a.cedula,a.serie,
+ a.licencia,a.sueldo_ac,a.nomina, a.fech_efec,
+ a.fecha_salida,a.paga_seg,a.cod_seg1,a.cod_seg2,",
+ "a.cod_seg3,a.tipocuenta,a.cuenta_no,a.status_t,a.us_crea,
+ a.fech_crea,a.us_mod,a.fech_mod,a.foto_empleado,a.sucid,",
+ "a.monto_seg_med,a.monto_seg_int,a.monto_care,",
+ "a.fecha_ultimo_aumento,a.moneda,a.codbancodestino,",
+ "a.digiverbancodestino,a.tipo_sueldo,a.email,a.email_corporativo, a.instalador,a.cuenta_aux,a.cuenta_out,
+ a.fecha_suspension,
+ a.codigo_retiro_bco,a.retiro_comercial,a.estado_legal,a.genera_file_bco,a.observacion,
+ a.tipo_documento,a.gerentemarcas,a.enviar_encuesta,a.enviar_volante
+ FROM adtb00003 a ",
+ "WHERE (a.status_t is null OR a.status_t NOT IN('T','E')) AND ",
+ criterio clipped," ORDER BY a.num_emp "
+
+ PREPARE busca FROM selec
+ DECLARE datos SCROLL CURSOR FOR busca
+ OPEN datos
+ LOCATE emplea.foto_empleado IN MEMORY
+ FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+
+
+
+
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ RETURN
+ END IF
+
+ CALL selecta1()
+
+ MENU "OPCION"
+ COMMAND "Siguiente"
+ "Presenta en pantalla el proximo registro encontrado"
+ FETCH NEXT datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+ END IF
+
+ LET tipo_sexo = " "
+ CALL selecta1()
+
+ COMMAND "Anterior"
+ "Presenta en pantalla el registro anterior encontrado"
+ FETCH PREVIOUS datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+ END IF
+
+ LET tipo_sexo = " "
+ CALL selecta1()
+
+ COMMAND "Primero"
+ "Presenta en pantalla el primer registro encontrado"
+ FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ CALL selecta1()
+
+ LET tipo_sexo = " "
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+
+ COMMAND "Ultimo"
+ "Presenta en pantalla el ultimo registro encontrado"
+ FETCH LAST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ CALL selecta1()
+
+ LET tipo_sexo = " "
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+
+ COMMAND "Escoger" " Actualiza Registro Cancela Operacion"
+ SET CONNECTION "MSSQL"
+ SELECT a.usuario FROM seg0001 a,seg0005 b
+ WHERE a.usuario =usuarios AND
+ a.cod_perfil = b.cod_perfil AND
+ b.programa = 'noprmt003.modifica'
+
+ IF STATUS = NOTFOUND THEN
+ CALL acepta1()
+ ELSE
+ CALL acepta()
+ END IF
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ EXIT MENU
+ END IF
+
+ SET CONNECTION "MSSQL"
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ CONTINUE MENU
+ END IF
+## AQUI SE ACTUALIZA EL REGISTRO
+ IF operacion = "M" THEN
+ UPDATE adtb00003 SET
+ (nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,codbancodestino,
+ digiverbancodestino,tipo_sueldo,email,email_corporativo,instalador,cuenta_aux,num_emp_supervisor,
+ retiro_comercial,estado_legal,genera_file_bco,observacion,gerentemarcas,enviar_encuesta,enviar_volante)=
+
+ (emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,emplea.telefonoCorporativo,emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,SUSER_SNAME(),GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
+ localidad,emplea.credito,emplea.fecha_ultimo_aumento,emplea.codbancodestino,emplea.digiverbancodestino,emplea.tipo_sueldo,
+ emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,emplea.retiro_comercial,
+ emplea.estado_legal,emplea.genera_file_bco,emplea.observacion,
+ emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante)
+ WHERE @num_emp = emplea.num_emp
+ SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00021 SET sexo = p_sexo
+ WHERE num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ END IF
+ {
+ LET actualiza_Datos =
+ "UPDATE cooperativa.dbo.adtb00003 SET
+ departamento= ",emplea.departamento,",",
+ "cod_puesto=",emplea.cod_puesto,",",
+ "nivel_emp=", emplea.nivel_emp,",",
+ "nom1_emp='",emplea.nom1_emp CLIPPED,"',",
+ "nom2_emp='",emplea.nom2_emp CLIPPED,"',",
+ "apell1_emp='",emplea.apell1_emp CLIPPED,"',",
+ "apell2_emp='",emplea.apell2_emp CLIPPED,"',",
+ "calle='",emplea.calle CLIPPED,"',",
+ "casa_num='",emplea.casa_num CLIPPED,"',",
+ "barrio='",emplea.barrio CLIPPED,"',",
+ "fech_efec='",emplea.fech_efec,"',",
+ "fech_nac='",emplea.fech_nac,"',",
+ " urbanizacion='",emplea.urbanizacion CLIPPED,"',",
+ " telefono='",emplea.telefono CLIPPED,"',",
+ " cedula='",emplea.cedula,"',",
+ " serie='",emplea.serie,"',",
+ " cod_nac=",emplea.cod_nac,",",
+ " estado_civil='",emplea.estado_civil,"',",
+ " tipo_sangre='",emplea.tipo_sangre,"',",
+ " sueldo_ac=",emplea.sueldo_ac,",",
+ " nomina='",emplea.nomina,"',",
+ " paga_seg='",emplea.paga_seg,"',",
+ " fecha_salida='",emplea.fecha_salida,"',",
+ " cuenta_no='",emplea.cuenta_no,"',",
+ " us_mod='",usuarios CLIPPED,"',",
+ " fech_mod=getdate(),",
+ " licencia='",emplea.licencia,"',",
+ " cod_seg1='",emplea.cod_seg1,"',",
+ " cod_seg3='",emplea.cod_seg3,"',",
+
+ " sucid=",emplea.sucid,",",
+ " credito='",emplea.credito CLIPPED,"',",
+ " fecha_ultimo_aumento='",emplea.fecha_ultimo_aumento,"',",
+ " codbancodestino='",emplea.codbancodestino,"',",
+ " digiverbancodestino='",emplea.digiverbancodestino,"',",
+ " tipo_sueldo='",emplea.tipo_sueldo,"',",
+ " email='", emplea.email CLIPPED,"',",
+ " instalador='",emplea.instalador,"',",
+ " cuenta_aux='",emplea.cuenta_aux,"' ",
+ " retiro_comercial='",emplea.retiro_comercial,"' ",
+" WHERE num_emp =", emplea.num_emp
+
+ PREPARE comando_up FROM actualiza_datos
+ EXECUTE comando_up
+ }
+ { SET CONNECTION "IFMX"
+ SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,getdate(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
+
+ WHERE @num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,getdate(),
+ emplea.licencia,emplea.cod_seg3)
+
+
+
+ END IF
+ }
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+ END IF
+
+
+ IF status < 0 THEN
+ CALL integridad()
+ END IF
+
+## AQUI SE ELIMINAN LOS REGISTROS
+ { COMMAND KEY ("L") "eLiminar"
+ PROMPT "Esta Seguro de Eliminar Este Empleado? " FOR CHAR opt5
+ IF opt5 = "S" THEN
+ update adtb00003 set status_t = "E",us_mod = USER_SNAME(),fech_mod = GETDATE()
+ WHERE num_emp = emplea.num_emp
+ END IF
+
+ LET numero_msg = 39
+ CALL msg(numero_msg)
+} ON ACTION carnet ATTRIBUTE(TEXT="Carnet",IMAGE="fa-print")
+ CALL cardnet(emplea.num_emp)
+
+ COMMAND "Retornar" "Retorna al menu anterior"
+ CLEAR FORM
+ EXIT MENU
+ END MENU
+ ELSE
+ CALL acepta()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+END IF
+END FUNCTION
+
+FUNCTION selecta1()
+ SELECT a.fecha_suspension INTO emplea.fecha_suspension FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT a.sexo INTO p_sexo FROM adtb00021 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
+ WHERE departamento = emplea.departamento
+
+ SELECT @nom_puesto INTO puesto.nom_puesto FROM adtb00004
+ WHERE @cod_puesto = emplea.cod_puesto
+
+ IF p_sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ END IF
+ IF p_sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ END IF
+
+ IF emplea.nomina = "Q" THEN
+ LET descrip = "QUINCENAL"
+ END IF
+ IF emplea.nomina = "S" THEN
+ LET descrip = "SEMANAL"
+ END IF
+
+ IF emplea.status_t = "D" THEN
+ LET descrip_st = "DESACTIVADO"
+ END IF
+ IF emplea.status_t = "E" THEN
+ LET descrip_st = "ELIMINADO"
+ END IF
+ IF emplea.status_t IS NULL THEN
+ LET descrip_st = "ACTIVADO"
+ END IF
+ DISPLAY BY NAME descrip_st ATTRIBUTE(REVERSE,RED)
+
+ SELECT a.licencia INTO emplea.licencia
+ FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
+ WHERE cod_nac = emplea.cod_nac
+
+ CALL departamentos()
+ CALL puestos()
+ LET plocalidad = ui.ComboBox.forName("formonly.localidad")
+ CALL nolocalidades()
+
+ LET localidad = emplea.sucid
+ SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
+ WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
+ CALL nivel_educacion()
+ DISPLAY BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.calle,
+ emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.cedula,
+ emplea.serie,emplea.fech_nac,emplea.cod_nac,
+ emplea.licencia,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina, emplea.extension,emplea.estado_civil,
+ emplea.tipo_sangre,emplea.sueldo_ac,emplea.nomina,
+ emplea.fech_efec,descrip,nacion.nom_nac,
+ depto.nom_dpto,puesto.nom_puesto,p_sexo,tipo_sexo,
+ emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.cuenta_no,emplea.fecha_salida,
+ localidad,emplea.credito,emplea.fecha_ultimo_aumento,
+ emplea.tipocuenta,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,
+ emplea.email_corporativo,
+ emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,nombre_super,
+ emplea.fecha_suspension,emplea.codigo_retiro_bco,
+ emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.cuenta_out,emplea.observacion,emplea.moneda,
+ emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+ IF emplea.foto_empleado IS NOT NULL THEN
+ LET filepath = ".\\IMAGENES\\tmpfile.jpg"
+
+ CALL emplea.foto_empleado.writeFile(filepath)
+ DISPLAY filepath TO fotos
+ ELSE
+ -- Limpia la foto del empleado anterior cuando el actual no
+ -- tiene una; sin esto, Siguiente/Anterior dejaban la imagen
+ -- vieja en pantalla.
+ LET filepath = NULL
+ DISPLAY filepath TO fotos
+ END IF
+
+ CALL carga_herramientas()
+
+END FUNCTION
+
+FUNCTION acepta()
+ DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
+ INPUT BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.gerentemarcas,
+ emplea.enviar_volante,emplea.enviar_encuesta,
+ localidad,
+ num_emp_supervisor,
+ emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.tipo_documento, emplea.cedula,
+ emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.fech_nac,emplea.cod_nac,emplea.licencia,emplea.alias,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,emplea.moneda,
+ emplea.nomina,emplea.fech_efec,emplea.fecha_salida,emplea.paga_seg,
+ emplea.cod_seg1,
+ emplea.cod_seg2,emplea.cod_seg3,emplea.tipocuenta, emplea.codbancodestino,
+ emplea.digiverbancodestino,
+ emplea.cuenta_no,emplea.genera_file_bco, p_sexo,emplea.fecha_ultimo_aumento,sec_vend_supervisor,
+ emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
+ emplea.retiro_comercial,emplea.estado_legal,
+ emplea.observacion
+ ATTRIBUTE(WITHOUT DEFAULTS)
+ AFTER FIELD cod_nac
+ IF emplea.cod_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cod_nac
+ END IF
+
+ SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
+ WHERE cod_nac = emplea.cod_nac
+ DISPLAY BY NAME nacion.nom_nac
+
+ BEFORE FIELD cedula
+
+ IF operacion = "M" AND emplea.tipo_documento = 'CEDULA' THEN
+ NEXT FIELD telefono
+ END IF
+ AFTER FIELD num_emp_supervisor
+ IF num_emp_supervisor IS NOT NULL THEN
+ SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
+ WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD num_emp_supervisor
+ END IF
+ DISPLAY BY NAME nombre_super
+ END IF
+ AFTER FIELD cedula
+ IF emplea.cedula IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cedula
+ END IF
+ DISPLAY "tipo ",emplea.tipo_documento
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ SELECT UNIQUE a.cedula FROM adtb00003 a WHERE a.cedula = emplea.cedula AND a.status_t IS NULL
+ IF STATUS <> NOTFOUND THEN
+ CALL msg(12)
+ NEXT FIELD cedula
+ END IF
+ END IF
+
+ AFTER FIELD cuenta_aux
+ IF emplea.cuenta_aux IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cuenta_aux
+ END IF
+ SELECT a.descripcion INTO descripcion_cuenta FROM cgtb00001 a
+ WHERE a.cuenta_no = emplea.cuenta_aux AND a.status_t IS NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD cuenta_aux
+ END IF
+ DISPLAY BY NAME descripcion_cuenta
+ ON ACTION busca_foto
+ LET imagenom = "*.jpg *.png *.jpeg"
+ CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
+ IF filepath IS NOT NULL THEN
+ LET filedestino = FGL_GETENV("IMAGENNOMINA")
+ #LET filedestino = "F:\\FOURJS\\GAS22006\\pic\\NOMINA\\"
+ LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
+ LET emplea.url_foto = filedestino
+ # CALL FGL_WINMESSAGE("W",filedestino,"stop")
+ # CALL fgl_getfile(filepath,filedestino)
+
+ LOCATE imagen_emp IN MEMORY
+
+# LET filedestino = "./IMAGENES/", os.path.basename(filepath)
+ # CALL fgl_winmessage("info",filedestino,"info")
+ CALL fgl_getfile(filepath,filedestino)
+
+ CALL imagen_emp.readFile(filedestino)
+ LET emplea.foto_empleado = imagen_emp
+# LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
+ LET filepath=filedestino
+ DISPLAY filepath TO fotos
+
+ END IF
+
+## VERIFICA QUE LOS CAMPOS MODIFICABLES NO ESTEN EN BLANCO
+ BEFORE INPUT
+ CALL departamentos()
+ CALL puestos()
+ CALL nivel_educacion()
+ IF operacion = "A" THEN
+ SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
+ WHERE a.num_emp < 9999
+ IF emplea.num_emp IS NULL THEN
+ LET emplea.num_emp = 0
+ END IF
+ LET emplea.num_emp = emplea.num_emp+1
+ DISPLAY BY NAME emplea.num_emp
+ END IF
+ CALL comisiones_adicionales.clear()
+ CALL comisiones.clear()
+
+ IF operacion <> "M" THEN
+ LET emplea.credito = "SI"
+ DISPLAY BY NAME emplea.credito
+ END IF
+ LET plocalidad = ui.ComboBox.forName("formonly.localidad")
+ CALL nolocalidades()
+
+ IF operacion = "M" THEN
+ NEXT FIELD calle
+ END IF
+ AFTER FIELD sec_Vend_supervisor
+ IF sec_Vend_supervisor IS NOT NULL THEN
+ SELECT a.nom1_emp||' '||a.apell1_Emp INTO nombre_supervisor
+ FROM adtb0003 a
+ WHERE a.num_Emp = sec_vend_supervisor
+ IF STATUS = NOTFOUND THEN
+ CALL FGL_WINMESSAGE("ERROR","EMPLEADO NO EXISTE","info")
+ NEXT FIELD sec_Vend_supervisor
+ END IF
+ END IF
+ AFTER FIELD num_emp
+ SELECT a.nom1_emp INTO emplea.nom1_emp FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ IF STATUS != NOTFOUND THEN
+ IF operacion = "A" THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ DISPLAY BY NAME emplea.nom1_emp
+ NEXT FIELD num_emp
+ END IF
+ END IF
+ AFTER FIELD localidad
+ SELECT sucid FROM sucursales WHERE sucid = localidad AND sucid_sirla IS NOT NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(16)
+ NEXT FIELD localidad
+ END IF
+ LET emplea.sucid = localidad
+ BEFORE FIELD departamento
+ IF operacion = "M" THEN
+ NEXT FIELD nivel_emp
+ END IF
+ AFTER FIELD departamento
+
+ IF emplea.departamento IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
+ WHERE departamento = emplea.departamento
+
+ DISPLAY BY NAME depto.nom_dpto
+ EXECUTE BUSCA_DEPTO INTO nombre_out USING depto.departamento_out
+ DISPLAY BY NAME nombre_out
+
+ AFTER FIELD cod_puesto
+
+ IF emplea.cod_puesto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ END IF
+
+ SELECT a.nom_puesto INTO puesto.nom_puesto FROM adtb00004 a
+ WHERE a.cod_puesto = emplea.cod_puesto AND a.cod_puesto_sirla IS NOT null
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("INFO","PUESTO NO EXISTE","INFO")
+ NEXT FIELD cod_puesto
+ END IF
+ DISPLAY BY NAME puesto.nom_puesto
+
+ AFTER FIELD sueldo_ac
+
+ IF emplea.sueldo_ac IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sueldo_ac
+ END IF
+
+ AFTER FIELD fech_nac
+
+ IF emplea.fech_nac IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fech_nac
+ END IF
+
+ IF YEAR(emplea.fech_nac) >= YEAR(today) THEN
+ ERROR "FECHA INCORRECTA"
+ NEXT FIELD fech_nac
+ END IF
+
+ AFTER FIELD nomina
+ IF emplea.nomina IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nomina
+ END IF
+
+ IF emplea.nomina = "Q" THEN
+ LET descrip = "QUINCENAL"
+ END IF
+ IF emplea.nomina = "S" THEN
+ LET descrip = "SEMANAL"
+ END IF
+ IF emplea.nomina = "V" THEN
+ LET descrip = "VENDEDOR"
+ END IF
+ DISPLAY BY NAME descrip
+
+ AFTER FIELD p_sexo
+ IF p_sexo IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD p_sexo
+ END IF
+
+ IF p_sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ ELSE
+ IF p_sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ END IF
+ END IF
+ DISPLAY BY NAME tipo_sexo
+ #### Verifica si el usuario presiono la tecla
+
+ AFTER INPUT
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD nivel_emp
+ END IF
+ IF emplea.cod_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cod_nac
+ END IF
+ IF emplea.estado_civil IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD estado_civil
+ END IF
+ DECLARE busca_comision CURSOR FOR
+ SELECT a.sec_vend_a,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' ')),a.porc_cobros,a.porc_cobros_a
+ FROM vetb00075 a,adtb00003 b
+ WHERE a.sec_vend_a = emplea.num_emp AND
+ a.sec_vend_a = b.num_emp
+
+
+ LET idx = 1
+ FOREACH busca_comision INTO comisiones[idx].*
+ LET idx = idx + 1
+ END FOREACH
+ DECLARE comision_adicional CURSOR FOR
+ SELECT a.sec_vend,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' ')),a.cod_n,c.producto,a.porc_vendedor,a.porc_supervisor
+ FROM vetb00076 a,adtb00003 b,iptb00020 c
+ WHERE a.sec_vend = emplea.num_emp AND
+ a.sec_vend = b.num_emp AND
+ a.cod_n = c.cod_n
+
+
+ LET idx = 1
+ FOREACH comision_adicional INTO comisiones_adicionales[idx].*
+ LET idx = idx + 1
+ END FOREACH
+ IF emplea.cuenta_aux IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cuenta_aux
+ END IF
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ END IF
+ END INPUT
+
+ INPUT ARRAY comisiones FROM s_comisiones.* ATTRIBUTE(WITHOUT DEFAULTS)
+ AFTER FIELD sec_vend
+ LET idx = arr_curr()
+ LET scr_l = scr_line()
+
+ SELECT RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' '))
+ FROM adtb00003 b
+ WHERE b.num_emp = comisiones[idx].sec_vend_a
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","EMPLEADO NO EXISTE","INFO")
+ NEXT FIELD num_emp
+ END IF
+ DISPLAY comisiones[idx].nombre_vend TO s_comisiones[scr_l].nombre_Vend
+ END INPUT
+ INPUT ARRAY comisiones_adicionales FROM s_adicionales.* ATTRIBUTE (WITHOUT DEFAULTS)
+ AFTER FIELD cod_n
+ IF comisiones_adicionales[arr_curr()].cod_n IS NOT NULL THEN
+ SELECT a.descrip_Esp INTO comisiones_adicionales[arr_curr()].descripcion
+ FROM iptb00020 a
+ WHERE a.cod_n = comisiones_adicionales[arr_curr()].cod_n AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","REGISTRO NO EXISTE","INFO")
+ NEXT FIELD cod_n
+ END IF
+ DISPLAY comisiones_adicionales[arr_curr()].descripcion TO s_adicionales[scr_line()].descripcion
+
+
+
+ END IF
+ END INPUT
+
+ ON ACTION CANCEL
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ CLEAR FORM
+ LET INT_FLAG = true
+ RETURN
+ ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD nivel_emp
+ END IF
+ IF emplea.fech_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD fech_nac
+ END IF
+
+ IF emplea.fech_efec IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD fech_efec
+ END IF
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ END IF
+ IF localidad IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD localidad
+ END IF
+## AQUI SE ACTUALIZA EL REGISTRO
+ IF operacion = "M" THEN
+ SET CONNECTION "MSSQL"
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,tipocuenta,
+ codbancodestino,digiverbancodestino,tipo_sueldo,email,email_corporativo,cuenta_aux,cuenta_out,departamento_out,
+ num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,moneda,tipo_documento,
+ gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
+ localidad,emplea.credito,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
+ emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.cuenta_aux,emplea.cuenta_out,emplea.departamento_out,
+ num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.moneda,emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
+ WHERE @num_emp = emplea.num_emp
+
+ SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00021 SET sexo = p_sexo
+ WHERE num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ END IF
+
+ { SET CONNECTION "IFMX"
+ SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
+
+ IF STATUS <> NOTFOUND THEN
+
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
+ WHERE @num_emp = emplea.num_emp
+
+ ELSE
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3,moneda)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3,emplea.moneda)
+
+ END IF
+ }
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+
+ END IF
+ IF operacion = "A" THEN
+ SET CONNECTION "MSSQL"
+ SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
+ WHERE a.num_emp < 9999
+ IF emplea.num_emp IS NULL THEN
+ LET emplea.num_emp = 0
+ END IF
+ LET emplea.num_emp = emplea.num_emp+1
+ DISPLAY BY NAME emplea.num_emp
+
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,tipocuenta,
+ codbancodestino,digiverbancodestino,email,email_corporativo,instalador,cuenta_aux,cuenta_out,
+ departamento_out,num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,tipo_documento,
+ gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3,emplea.foto_empleado,emplea.sucid,emplea.credito,
+ emplea.fecha_ultimo_aumento,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
+ emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
+ emplea.departamento_out,num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,
+ emplea.genera_file_bco,emplea.observacion,emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
+
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ { LET actualiza_datos =
+ "INSERT INTO cooperativa.dbo.adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,getdate(),?,?)"
+
+ PREPARE command_ins FROM actualiza_datos
+ EXECUTE command_ins USING
+ emplea.num_emp, emplea.departamento,
+ emplea.cod_puesto, emplea.nivel_emp,
+ emplea.nom1_emp, emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp, emplea.calle,emplea.casa_num,
+ emplea.barrio, emplea.urbanizacion,emplea.telefono,
+ emplea.cedula, emplea.serie,emplea.cod_nac,
+ emplea.estado_civil, emplea.fech_efec, emplea.fecha_salida, emplea.fech_nac,
+ emplea.tipo_sangre, emplea.sueldo_ac,
+ emplea.nomina, emplea.paga_seg, emplea.cuenta_no,
+ usuarios,
+ emplea.licencia, emplea.cod_seg3
+}
+ -- Informix (IFMX) ya no existe; el sistema fue migrado completo
+ -- a SQL Server. Este INSERT duplicado hacia la vieja base queda
+ -- deshabilitado (ver nota en MAIN).
+ {
+ SET CONNECTION "IFMX"
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3)
+ }
+
+ LET numero_msg = 1
+ CALL msg(numero_msg)
+
+ END IF
+ RETURN
+ END DIALOG
+END FUNCTION
+FUNCTION acepta1()
+ MENU
+ ON ACTION busca_foto
+ LET imagenom = "*.jpg *.png *.jpeg"
+ CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
+ IF filepath IS NOT NULL THEN
+ LET filedestino = FGL_GETENV("IMAGENNOMINA")
+
+ LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
+ LET emplea.url_foto = filedestino
+ # CALL FGL_WINMESSAGE("W",filedestino,"stop")
+ # CALL fgl_getfile(filepath,filedestino)
+
+ LOCATE imagen_emp IN MEMORY
+
+ # LET filedestino = "./IMAGENES/", os.path.basename(filepath)
+ # CALL fgl_winmessage("info",filedestino,"info")
+ CALL fgl_getfile(filepath,filedestino)
+
+ CALL imagen_emp.readFile(filedestino)
+ LET emplea.foto_empleado = imagen_emp
+ # LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
+ LET filepath=filedestino
+ DISPLAY filepath TO fotos
+
+ END IF
+
+ ON ACTION CANCEL
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ CLEAR FORM
+ LET INT_FLAG = true
+ RETURN
+ ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
+ SET CONNECTION "MSSQL"
+ UPDATE adtb00003 SET
+ foto_empleado = emplea.foto_empleado,
+ us_mod = usuarios,
+ fech_mod = getdate()
+
+ WHERE @num_emp = emplea.num_emp
+
+
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+
+
+ END MENU
+END FUNCTION
+
+FUNCTION carga_herramientas()
+ DEFINE i INTEGER
+ SET CONNECTION "MSSQL"
+ CALL herramientas.clear()
+
+ DECLARE cur_herr CURSOR FOR
+ SELECT a.codigo,
+ RTRIM(ISNULL(b.descrip_esp,'')),
+ a.fecha,
+ a.documento,
+ a.cantidad
+ FROM adtb00057 a
+ LEFT JOIN irtb00002 b
+ ON CAST(b.cod_n AS VARCHAR(10)) + '-' +
+ CAST(b.cod_grupo AS VARCHAR(10)) + '-' +
+ CAST(b.cod_tipo AS VARCHAR(10)) + '-' +
+ CAST(b.cod_sec AS VARCHAR(10)) = a.codigo
+ WHERE a.num_emp = emplea.num_emp
+ ORDER BY a.codigo
+
+ LET i = 1
+ FOREACH cur_herr INTO herramientas[i].*
+ LET i = i + 1
+ END FOREACH
+ IF i > 1 THEN
+ CALL herramientas.deleteElement(i) -- quita el slot vac�o final
+ END IF
+
+ CALL muestra_herramientas()
+END FUNCTION
+
+FUNCTION muestra_herramientas()
+ DEFINE i, tope INTEGER
+ CLEAR s_herramientas.*
+ LET tope = herramientas.getLength()
+ IF tope > 12 THEN LET tope = 12 END IF
+ FOR i = 1 TO tope
+ DISPLAY herramientas[i].codigo,
+ herramientas[i].descripcion,
+ herramientas[i].fecha,
+ herramientas[i].documento,
+ herramientas[i].cantidad
+ TO s_herramientas[i].*
+ END FOR
+END FUNCTION
diff --git a/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt016.4gl b/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt016.4gl
new file mode 100644
index 0000000..fbcb67e
--- /dev/null
+++ b/PROYECTO/nodir/backup_noprmt003_016_20261005/noprmt016.4gl
@@ -0,0 +1,160 @@
+{
+----------------------------------------------------------------------------
+PROGRAMA : NOPRMT016
+OBEJTIVO : Activar / Desactivar empleados para la nomina
+PROGRAMADOR : Ing. Juan Soto
+FECHA : Enero 17, 1993.
+----------------------------------------------------------------------------
+}
+GLOBALS
+ "noprgb000.4gl"
+DEFINE p_datos RECORD
+ num_emp SMALLINT,
+ tipo_emp CHAR(1),
+ nombre_t CHAR(15),
+ nombre CHAR(30)
+END RECORD
+DEFINE nomb1,nomb2 CHAR(30)
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+
+ #LET usuarios = 'jsoto'
+ #LET clave = 'lmmjvsd2009'
+
+ CONNECT to "smarmotech" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL noprmt016()
+END MAIN
+
+FUNCTION noprmt016()
+ OPTIONS
+ FORM LINE 8,
+ ERROR LINE 24
+ CLEAR SCREEN
+
+
+ OPEN FORM nofmmt016 FROM "nofmmt016"
+ DISPLAY FORM nofmmt016
+
+ MENU "OPCION"
+ COMMAND "Activar"
+ " Cancela operacion"
+ CALL activo()
+ COMMAND "Desactivar"
+ " Cancela Operacion"
+ CALL desactivo()
+ COMMAND "Salir"
+ EXIT MENU
+ END MENU
+END FUNCTION
+
+FUNCTION activo()
+ INITIALIZE p_datos.* TO NULL
+ INPUT BY NAME p_datos.*
+
+ AFTER FIELD num_emp
+ IF p_datos.num_emp is null THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+END IF
+SELECT nom1_emp,apell1_emp,nomina INTO nomb1,nomb2,p_datos.tipo_emp
+FROM adtb00003
+WHERE num_emp = p_datos.num_emp
+
+IF status = notfound THEN
+ LET numero_msg = 12
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+END IF
+CASE
+ WHEN p_datos.tipo_emp = "Q"
+ LET p_datos.nombre_t = "QUINCENAL"
+ EXIT CASE
+ WHEN p_datos.tipo_emp = "S"
+ LET p_datos.nombre_t = "SEMANAL"
+ EXIT CASE
+ WHEN p_datos.tipo_emp = "V"
+ LET p_datos.nombre_t = "VENDEDOR"
+ EXIT CASE
+ OTHERWISE
+ LET p_datos.nombre_t = "NO EXISTE"
+ EXIT CASE
+END CASE
+LET p_datos.nombre = nomb1 clipped," ",nomb2 clipped
+DISPLAY BY NAME p_datos.nombre,p_datos.nombre_t ATTRIBUTE (BOLD)
+AFTER INPUT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = false
+ RETURN
+ END IF
+ EXIT INPUT
+ END INPUT
+
+UPDATE adtb00003 set status_t = null,
+ us_mod = suser_sname(),
+ fech_mod = GETDATE()
+ WHERE num_emp = p_datos.num_emp
+
+LET numero_msg = 190
+CALL msg(numero_msg)
+END FUNCTION
+
+FUNCTION desactivo()
+ INITIALIZE p_datos.* TO NULL
+ INPUT BY NAME p_datos.*
+
+ AFTER FIELD num_emp
+ IF p_datos.num_emp is null THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+END IF
+SELECT nom1_emp,apell1_emp,nomina INTO nomb1,nomb2,p_datos.tipo_emp
+FROM adtb00003
+WHERE num_emp = p_datos.num_emp
+
+IF status = notfound THEN
+ LET numero_msg = 12
+ CALL msg(numero_msg)
+ NEXT FIELD num_emp
+END IF
+
+CASE
+ WHEN p_datos.tipo_emp = "Q"
+ LET p_datos.nombre_t = "QUINCENAL"
+ EXIT CASE
+ WHEN p_datos.tipo_emp = "S"
+ LET p_datos.nombre_t = "SEMANAL"
+ EXIT CASE
+ WHEN p_datos.tipo_emp = "V"
+ LET p_datos.nombre_t = "VENDEDOR"
+ EXIT CASE
+ OTHERWISE
+ LET p_datos.nombre_t = "NO EXISTE"
+ EXIT CASE
+END CASE
+LET p_datos.nombre = nomb1 clipped," ",nomb2 clipped
+DISPLAY BY NAME p_datos.nombre,p_datos.nombre_t ATTRIBUTE (BOLD)
+AFTER INPUT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = false
+ RETURN
+ END IF
+ EXIT INPUT
+ END INPUT
+
+UPDATE adtb00003 set status_t = "D" ,
+ us_mod = suser_sname(),
+ fech_mod = GETDATE()
+ WHERE num_emp = p_datos.num_emp
+
+LET numero_msg = 191
+CALL msg(numero_msg)
+END FUNCTION
diff --git a/PROYECTO/nodir/nofmmt003.4fd b/PROYECTO/nodir/nofmmt003.4fd
index 85880c8..5375b70 100644
--- a/PROYECTO/nodir/nofmmt003.4fd
+++ b/PROYECTO/nodir/nofmmt003.4fd
@@ -172,7 +172,7 @@
-
+
diff --git a/PROYECTO/nodir/noprmt003.4gl b/PROYECTO/nodir/noprmt003.4gl
index 3c14e6e..0d8a7d6 100644
--- a/PROYECTO/nodir/noprmt003.4gl
+++ b/PROYECTO/nodir/noprmt003.4gl
@@ -1,1205 +1,1207 @@
-{
-----------------------------------------------------------------------------
- PROGRAMA : NOPRMT003
- OBJETIVO : Modificar y Eliminar registros de la
- Tabla de Maestra de Empleados
- PROGRAMADOR : JUAN SOTO
- FECHA REALIZACION : FEBRERO 18, 1998.
-----------------------------------------------------------------------------
-}
-IMPORT os
-
-GLOBALS "noprgb000.4gl"
-DEFINE tipo_sexo CHAR(9),
- operacion CHAR(1),
- descrip_st CHAR(20),
- descripcion_cuenta,imagenom,filepath,filedestino CHAR(100),
- sec_vend_supervisor SMALLINT,
- num_emp_supervisor INT,
- nombre_out,nombre_supervisor,nombre_super VARCHAR(60),
- actualiza_datos STRING,
- nombre_empleado_out VARCHAR(100),
- imagen_emp BYTE
-
-DEFINE p_sexo CHAR(1)
-DEFINE herramientas DYNAMIC ARRAY OF RECORD
- codigo VARCHAR(20),
- descripcion VARCHAR(80),
- fecha DATE,
- documento VARCHAR(20),
- cantidad DECIMAL(12,5)
- END RECORD
-
-MAIN
- DEFER INTERRUPT
- CALL ARG_VAL(1) RETURNING usuarios
- CALL ARG_VAL(2) RETURNING clave
-
- -- La conexion a Informix (marmotech/IFMX) ya no existe; el sistema
- -- fue migrado completo a SQL Server (smarmotech/MSSQL). Dejarla
- -- activa colgaba el programa al inicio intentando conectar.
- CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave
- SELECT a.* INTO p_companias.* FROM companias a
- CALL noprmt003()
-END MAIN
-
-FUNCTION noprmt003()
-
- CLEAR SCREEN
- OPTIONS
- FORM LINE 9,
- ERROR LINE 24,
- COMMENT LINE 23
-
- OPEN FORM nofmmt003 FROM "nofmmt003"
- DISPLAY FORM nofmmt003
- LET selec = "SELECT a.deptname FROM facial.dbo.departments a WHERE a.code = ? "
- PREPARE BUSCA_DEPTO FROM selec
-
- MENU
- ON ACTION nuevo
- SET CONNECTION "MSSQL"
- SELECT a.usuario FROM seg0001 a,seg0005 b
- WHERE a.usuario =usuarios AND
- a.cod_perfil = b.cod_perfil AND
- b.programa = 'noprmt003.nuevo'
-
- IF STATUS = NOTFOUND THEN
- CALL fgl_winmessage("ERROR","USTED NO TIENE PERMISOS PARA UTILIZAR OPCION","INFO")
- CONTINUE MENU
- END IF
-
- let int_flag = false
- LET operacion = "A"
- INITIALIZE emplea.* TO NULL
- LOCATE emplea.foto_empleado IN MEMORY
- CALL adpcmf022()
- ON ACTION buscar
- SET CONNECTION "MSSQL"
- let int_flag = false
- LET operacion = "M"
- CALL adpcmf022()
- ON ACTION Salir
- EXIT MENU
- END MENU
-END FUNCTION
-
-FUNCTION adpcmf022()
-## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA CONSULTA Y
-## MODIFICACION DE REGISTROS
-
- IF operacion = "M" THEN
- CONSTRUCT criterio ON a.num_emp,a.departamento,a.nom1_emp,a.apell1_emp,a.nom2_emp,a.apell2_emp,a.cedula,a.alias
- FROM num_emp,departamento,nom1_emp,apell1_emp,nom2_emp,apell2_emp,cedula,alias
- BEFORE CONSTRUCT
- CALL departamentos()
- END CONSTRUCT
- IF int_flag THEN
- LET numero_msg = 2
- CALL msg(numero_msg)
- LET int_flag = FALSE
- RETURN
- END IF
-
- LET SELEC =
- "SELECT a.num_emp,a.departamento,a.nivel_emp,
- a.cod_puesto,a.nom1_emp,a.nom2_emp,
- a.apell1_emp,a.apell2_emp,a.tipo_empleado,
- a.fecha_termino_c,a.calle,a.casa_num,a.barrio,
- a.urbanizacion,a.credito,a.telefono,a.telefonoCorporativo,a.numeroOficina,a.extension,
- a.fech_nac,a.cod_nac,
- a.estado_civil,a.tipo_sangre,a.cedula,a.serie,
- a.licencia,a.sueldo_ac,a.nomina, a.fech_efec,
- a.fecha_salida,a.paga_seg,a.cod_seg1,a.cod_seg2,",
- "a.cod_seg3,a.tipocuenta,a.cuenta_no,a.status_t,a.us_crea,
- a.fech_crea,a.us_mod,a.fech_mod,a.foto_empleado,a.sucid,",
- "a.monto_seg_med,a.monto_seg_int,a.monto_care,",
- "a.fecha_ultimo_aumento,a.moneda,a.codbancodestino,",
- "a.digiverbancodestino,a.tipo_sueldo,a.email,a.email_corporativo, a.instalador,a.cuenta_aux,a.cuenta_out,
- a.fecha_suspension,
- a.codigo_retiro_bco,a.retiro_comercial,a.estado_legal,a.genera_file_bco,a.observacion,
- a.tipo_documento,a.gerentemarcas,a.enviar_encuesta,a.enviar_volante
- FROM adtb00003 a ",
- "WHERE (a.status_t is null OR a.status_t NOT IN('T','E')) AND ",
- criterio clipped," ORDER BY a.num_emp "
-
- PREPARE busca FROM selec
- DECLARE datos SCROLL CURSOR FOR busca
- OPEN datos
- LOCATE emplea.foto_empleado IN MEMORY
- FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
- emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
- emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
- emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
- emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
- emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
- emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
- emplea.cuenta_out,emplea.fecha_suspension,
- emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
-
-
-
-
-
-
- IF STATUS = NOTFOUND THEN
- LET numero_msg = 3
- CALL msg(numero_msg)
- RETURN
- END IF
-
- CALL selecta1()
-
- MENU "OPCION"
- COMMAND "Siguiente"
- "Presenta en pantalla el proximo registro encontrado"
- FETCH NEXT datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
- emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
- emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
- emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
- emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
- emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
- emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
- emplea.cuenta_out,emplea.fecha_suspension,
- emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
-
- IF STATUS = NOTFOUND THEN
- LET numero_msg = 4
- CALL msg(numero_msg)
- END IF
-
- LET tipo_sexo = " "
- CALL selecta1()
-
- COMMAND "Anterior"
- "Presenta en pantalla el registro anterior encontrado"
- FETCH PREVIOUS datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
- emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
- emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
- emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
- emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
- emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
- emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
- emplea.cuenta_out,emplea.fecha_suspension,
- emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
-
- IF STATUS = NOTFOUND THEN
- LET numero_msg = 5
- CALL msg(numero_msg)
- END IF
-
- LET tipo_sexo = " "
- CALL selecta1()
-
- COMMAND "Primero"
- "Presenta en pantalla el primer registro encontrado"
- FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
- emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
- emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
- emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
- emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
- emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
- emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
- emplea.cuenta_out,emplea.fecha_suspension,
- emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
-
- CALL selecta1()
-
- LET tipo_sexo = " "
- LET numero_msg = 5
- CALL msg(numero_msg)
-
- COMMAND "Ultimo"
- "Presenta en pantalla el ultimo registro encontrado"
- FETCH LAST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
- emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
- emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
- emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
- emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
- emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
- emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
- emplea.cuenta_out,emplea.fecha_suspension,
- emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
-
- CALL selecta1()
-
- LET tipo_sexo = " "
- LET numero_msg = 4
- CALL msg(numero_msg)
-
- COMMAND "Escoger" " Actualiza Registro Cancela Operacion"
- SET CONNECTION "MSSQL"
- SELECT a.usuario FROM seg0001 a,seg0005 b
- WHERE a.usuario =usuarios AND
- a.cod_perfil = b.cod_perfil AND
- b.programa = 'noprmt003.modifica'
-
- IF STATUS = NOTFOUND THEN
- CALL acepta1()
- ELSE
- CALL acepta()
- END IF
- IF int_flag THEN
- LET numero_msg = 2
- CALL msg(numero_msg)
- LET int_flag = FALSE
- EXIT MENU
- END IF
-
- SET CONNECTION "MSSQL"
- IF emplea.nivel_emp IS NULL THEN
- CALL msg(16)
- CONTINUE MENU
- END IF
+{
+----------------------------------------------------------------------------
+ PROGRAMA : NOPRMT003
+ OBJETIVO : Modificar y Eliminar registros de la
+ Tabla de Maestra de Empleados
+ PROGRAMADOR : JUAN SOTO
+ FECHA REALIZACION : FEBRERO 18, 1998.
+----------------------------------------------------------------------------
+}
+IMPORT os
+
+GLOBALS "noprgb000.4gl"
+DEFINE tipo_sexo CHAR(9),
+ operacion CHAR(1),
+ descrip_st CHAR(20),
+ descripcion_cuenta,imagenom,filepath,filedestino CHAR(100),
+ sec_vend_supervisor SMALLINT,
+ num_emp_supervisor INT,
+ nombre_out,nombre_supervisor,nombre_super VARCHAR(60),
+ actualiza_datos STRING,
+ nombre_empleado_out VARCHAR(100),
+ imagen_emp BYTE
+
+DEFINE p_sexo CHAR(1)
+DEFINE herramientas DYNAMIC ARRAY OF RECORD
+ codigo VARCHAR(20),
+ descripcion VARCHAR(80),
+ fecha DATE,
+ documento VARCHAR(20),
+ cantidad DECIMAL(12,5)
+ END RECORD
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+
+ -- La conexion a Informix (marmotech/IFMX) ya no existe; el sistema
+ -- fue migrado completo a SQL Server (smarmotech/MSSQL). Dejarla
+ -- activa colgaba el programa al inicio intentando conectar.
+ CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave
+ SELECT a.* INTO p_companias.* FROM companias a
+ CALL noprmt003()
+END MAIN
+
+FUNCTION noprmt003()
+
+ CLEAR SCREEN
+ OPTIONS
+ FORM LINE 9,
+ ERROR LINE 24,
+ COMMENT LINE 23
+
+ OPEN FORM nofmmt003 FROM "nofmmt003"
+ DISPLAY FORM nofmmt003
+ LET selec = "SELECT a.deptname FROM facial.dbo.departments a WHERE a.code = ? "
+ PREPARE BUSCA_DEPTO FROM selec
+
+ MENU
+ ON ACTION nuevo
+ SET CONNECTION "MSSQL"
+ SELECT a.usuario FROM seg0001 a,seg0005 b
+ WHERE a.usuario =usuarios AND
+ a.cod_perfil = b.cod_perfil AND
+ b.programa = 'noprmt003.nuevo'
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","USTED NO TIENE PERMISOS PARA UTILIZAR OPCION","INFO")
+ CONTINUE MENU
+ END IF
+
+ let int_flag = false
+ LET operacion = "A"
+ INITIALIZE emplea.* TO NULL
+ LOCATE emplea.foto_empleado IN MEMORY
+ CALL adpcmf022()
+ ON ACTION buscar
+ SET CONNECTION "MSSQL"
+ let int_flag = false
+ LET operacion = "M"
+ CALL adpcmf022()
+ ON ACTION Salir
+ EXIT MENU
+ END MENU
+END FUNCTION
+
+FUNCTION adpcmf022()
+## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA CONSULTA Y
+## MODIFICACION DE REGISTROS
+
+ IF operacion = "M" THEN
+ CONSTRUCT criterio ON a.num_emp,a.departamento,a.nom1_emp,a.apell1_emp,a.nom2_emp,a.apell2_emp,a.cedula,a.alias
+ FROM num_emp,departamento,nom1_emp,apell1_emp,nom2_emp,apell2_emp,cedula,alias
+ BEFORE CONSTRUCT
+ CALL departamentos()
+ END CONSTRUCT
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+ LET SELEC =
+ "SELECT a.num_emp,a.departamento,a.nivel_emp,
+ a.cod_puesto,a.nom1_emp,a.nom2_emp,
+ a.apell1_emp,a.apell2_emp,a.tipo_empleado,
+ a.fecha_termino_c,a.calle,a.casa_num,a.barrio,
+ a.urbanizacion,a.credito,a.telefono,a.telefonoCorporativo,a.numeroOficina,a.extension,
+ a.fech_nac,a.cod_nac,
+ a.estado_civil,a.tipo_sangre,a.cedula,a.serie,
+ a.licencia,a.sueldo_ac,a.nomina, a.fech_efec,
+ a.fecha_salida,a.paga_seg,a.cod_seg1,a.cod_seg2,",
+ "a.cod_seg3,a.tipocuenta,a.cuenta_no,a.status_t,a.us_crea,
+ a.fech_crea,a.us_mod,a.fech_mod,a.foto_empleado,a.sucid,",
+ "a.monto_seg_med,a.monto_seg_int,a.monto_care,",
+ "a.fecha_ultimo_aumento,a.moneda,a.codbancodestino,",
+ "a.digiverbancodestino,a.tipo_sueldo,a.email,a.email_corporativo, a.instalador,a.cuenta_aux,a.cuenta_out,
+ a.fecha_suspension,
+ a.codigo_retiro_bco,a.retiro_comercial,a.estado_legal,a.genera_file_bco,a.observacion,
+ a.tipo_documento,a.gerentemarcas,a.enviar_encuesta,a.enviar_volante
+ FROM adtb00003 a ",
+ "WHERE (a.status_t is null OR a.status_t NOT IN('T','E')) AND ",
+ criterio clipped," ORDER BY a.num_emp "
+
+ PREPARE busca FROM selec
+ DECLARE datos SCROLL CURSOR FOR busca
+ OPEN datos
+ LOCATE emplea.foto_empleado IN MEMORY
+ FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+
+
+
+
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ RETURN
+ END IF
+
+ CALL selecta1()
+
+ MENU "OPCION"
+ COMMAND "Siguiente"
+ "Presenta en pantalla el proximo registro encontrado"
+ FETCH NEXT datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+ END IF
+
+ LET tipo_sexo = " "
+ CALL selecta1()
+
+ COMMAND "Anterior"
+ "Presenta en pantalla el registro anterior encontrado"
+ FETCH PREVIOUS datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ IF STATUS = NOTFOUND THEN
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+ END IF
+
+ LET tipo_sexo = " "
+ CALL selecta1()
+
+ COMMAND "Primero"
+ "Presenta en pantalla el primer registro encontrado"
+ FETCH FIRST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ CALL selecta1()
+
+ LET tipo_sexo = " "
+ LET numero_msg = 5
+ CALL msg(numero_msg)
+
+ COMMAND "Ultimo"
+ "Presenta en pantalla el ultimo registro encontrado"
+ FETCH LAST datos INTO emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.tipo_empleado,
+ emplea.fecha_termino_c,emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina,emplea.extension,emplea.fech_nac,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.cedula,emplea.serie,
+ emplea.licencia,emplea.sueldo_ac,emplea.nomina,emplea.fech_efec,
+ emplea.fecha_salida,emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.tipocuenta,emplea.cuenta_no,emplea.status_t,emplea.us_crea,
+ emplea.fech_crea,emplea.us_mod,emplea.fech_mod,emplea.foto_empleado,emplea.sucid,
+ emplea.monto_seg_med,emplea.monto_seg_int,emplea.monto_care,
+ emplea.fecha_ultimo_aumento,emplea.moneda,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,
+ emplea.cuenta_out,emplea.fecha_suspension,
+ emplea.codigo_retiro_bco,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.tipo_documento,emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+
+ CALL selecta1()
+
+ LET tipo_sexo = " "
+ LET numero_msg = 4
+ CALL msg(numero_msg)
+
+ COMMAND "Escoger" " Actualiza Registro Cancela Operacion"
+ SET CONNECTION "MSSQL"
+ SELECT a.usuario FROM seg0001 a,seg0005 b
+ WHERE a.usuario =usuarios AND
+ a.cod_perfil = b.cod_perfil AND
+ b.programa = 'noprmt003.modifica'
+
+ IF STATUS = NOTFOUND THEN
+ CALL acepta1()
+ ELSE
+ CALL acepta()
+ END IF
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ EXIT MENU
+ END IF
+
+ SET CONNECTION "MSSQL"
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ CONTINUE MENU
+ END IF
## AQUI SE ACTUALIZA EL REGISTRO
- IF operacion = "M" THEN
- UPDATE adtb00003 SET
- (nom1_emp,nom2_emp,
- apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
- fech_nac,
- urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
- tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
- licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,codbancodestino,
- digiverbancodestino,tipo_sueldo,email,email_corporativo,instalador,cuenta_aux,num_emp_supervisor,
- retiro_comercial,estado_legal,genera_file_bco,observacion,gerentemarcas,enviar_encuesta,enviar_volante)=
-
- (emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.fech_efec,emplea.fech_nac,
- emplea.urbanizacion,
- emplea.telefono,emplea.telefonoCorporativo,emplea.numeroOficina, emplea.extension,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,SUSER_SNAME(),GETDATE(),
- emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
- localidad,emplea.credito,emplea.fecha_ultimo_aumento,emplea.codbancodestino,emplea.digiverbancodestino,emplea.tipo_sueldo,
- emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,emplea.retiro_comercial,
- emplea.estado_legal,emplea.genera_file_bco,emplea.observacion,
- emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante)
- WHERE @num_emp = emplea.num_emp
- SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
- IF STATUS <> NOTFOUND THEN
- UPDATE adtb00021 SET sexo = p_sexo
- WHERE num_emp = emplea.num_emp
- ELSE
-
- INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
- emplea.cedula,p_sexo,emplea.fech_nac,null,
- SUSER_SNAME(),GETDATE(),null,null)
- END IF
- {
- LET actualiza_Datos =
- "UPDATE cooperativa.dbo.adtb00003 SET
- departamento= ",emplea.departamento,",",
- "cod_puesto=",emplea.cod_puesto,",",
- "nivel_emp=", emplea.nivel_emp,",",
- "nom1_emp='",emplea.nom1_emp CLIPPED,"',",
- "nom2_emp='",emplea.nom2_emp CLIPPED,"',",
- "apell1_emp='",emplea.apell1_emp CLIPPED,"',",
- "apell2_emp='",emplea.apell2_emp CLIPPED,"',",
- "calle='",emplea.calle CLIPPED,"',",
- "casa_num='",emplea.casa_num CLIPPED,"',",
- "barrio='",emplea.barrio CLIPPED,"',",
- "fech_efec='",emplea.fech_efec,"',",
- "fech_nac='",emplea.fech_nac,"',",
- " urbanizacion='",emplea.urbanizacion CLIPPED,"',",
- " telefono='",emplea.telefono CLIPPED,"',",
- " cedula='",emplea.cedula,"',",
- " serie='",emplea.serie,"',",
- " cod_nac=",emplea.cod_nac,",",
- " estado_civil='",emplea.estado_civil,"',",
- " tipo_sangre='",emplea.tipo_sangre,"',",
- " sueldo_ac=",emplea.sueldo_ac,",",
- " nomina='",emplea.nomina,"',",
- " paga_seg='",emplea.paga_seg,"',",
- " fecha_salida='",emplea.fecha_salida,"',",
- " cuenta_no='",emplea.cuenta_no,"',",
- " us_mod='",usuarios CLIPPED,"',",
- " fech_mod=getdate(),",
- " licencia='",emplea.licencia,"',",
- " cod_seg1='",emplea.cod_seg1,"',",
- " cod_seg3='",emplea.cod_seg3,"',",
-
- " sucid=",emplea.sucid,",",
- " credito='",emplea.credito CLIPPED,"',",
- " fecha_ultimo_aumento='",emplea.fecha_ultimo_aumento,"',",
- " codbancodestino='",emplea.codbancodestino,"',",
- " digiverbancodestino='",emplea.digiverbancodestino,"',",
- " tipo_sueldo='",emplea.tipo_sueldo,"',",
- " email='", emplea.email CLIPPED,"',",
- " instalador='",emplea.instalador,"',",
- " cuenta_aux='",emplea.cuenta_aux,"' ",
- " retiro_comercial='",emplea.retiro_comercial,"' ",
-" WHERE num_emp =", emplea.num_emp
-
- PREPARE comando_up FROM actualiza_datos
- EXECUTE comando_up
- }
- { SET CONNECTION "IFMX"
- SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
- IF STATUS <> NOTFOUND THEN
- UPDATE adtb00003 SET
- (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
- apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
- fech_nac,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
- licencia,cod_seg1,cod_seg3)=
-
- (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.fech_efec,emplea.fech_nac,
- emplea.urbanizacion,
- emplea.telefono,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,getdate(),
- emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
-
- WHERE @num_emp = emplea.num_emp
- ELSE
-
- INSERT INTO adtb00003
- (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
- nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- fech_efec,fecha_salida,fech_nac,
- tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
- fech_crea,licencia,cod_Seg3)
- VALUES
- (emplea.num_emp,emplea.departamento,
- emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.urbanizacion,emplea.telefono,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
- emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,getdate(),
- emplea.licencia,emplea.cod_seg3)
-
-
-
- END IF
- }
- LET numero_msg = 13
- CALL msg(numero_msg)
- END IF
-
-
- IF status < 0 THEN
- CALL integridad()
- END IF
-
-## AQUI SE ELIMINAN LOS REGISTROS
- { COMMAND KEY ("L") "eLiminar"
- PROMPT "Esta Seguro de Eliminar Este Empleado? " FOR CHAR opt5
- IF opt5 = "S" THEN
- update adtb00003 set status_t = "E",us_mod = USER_SNAME(),fech_mod = GETDATE()
- WHERE num_emp = emplea.num_emp
- END IF
-
- LET numero_msg = 39
- CALL msg(numero_msg)
-} ON ACTION carnet ATTRIBUTE(TEXT="Carnet",IMAGE="fa-print")
- CALL cardnet(emplea.num_emp)
-
- COMMAND "Retornar" "Retorna al menu anterior"
- CLEAR FORM
- EXIT MENU
- END MENU
- ELSE
- CALL acepta()
- IF int_flag THEN
- LET numero_msg = 2
- CALL msg(numero_msg)
- LET int_flag = FALSE
- RETURN
- END IF
-
-END IF
-END FUNCTION
-
-FUNCTION selecta1()
- SELECT a.fecha_suspension INTO emplea.fecha_suspension FROM adtb00003 a
- WHERE a.num_emp = emplea.num_emp
-
- SELECT a.sexo INTO p_sexo FROM adtb00021 a
- WHERE a.num_emp = emplea.num_emp
-
- SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
- WHERE departamento = emplea.departamento
-
- SELECT @nom_puesto INTO puesto.nom_puesto FROM adtb00004
- WHERE @cod_puesto = emplea.cod_puesto
-
- IF p_sexo = "M" THEN
- LET tipo_sexo = "MASCULINO"
- END IF
- IF p_sexo = "F" THEN
- LET tipo_sexo = "FEMENINO"
- END IF
-
- IF emplea.nomina = "Q" THEN
- LET descrip = "QUINCENAL"
- END IF
- IF emplea.nomina = "S" THEN
- LET descrip = "SEMANAL"
- END IF
-
- IF emplea.status_t = "D" THEN
- LET descrip_st = "DESACTIVADO"
- END IF
- IF emplea.status_t = "E" THEN
- LET descrip_st = "ELIMINADO"
- END IF
- IF emplea.status_t IS NULL THEN
- LET descrip_st = "ACTIVADO"
- END IF
- DISPLAY BY NAME descrip_st ATTRIBUTE(REVERSE,RED)
-
- SELECT a.licencia INTO emplea.licencia
- FROM adtb00003 a
- WHERE a.num_emp = emplea.num_emp
-
- SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
- WHERE cod_nac = emplea.cod_nac
-
- CALL departamentos()
- CALL puestos()
- LET plocalidad = ui.ComboBox.forName("formonly.localidad")
- CALL nolocalidades()
-
- LET localidad = emplea.sucid
- SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
- WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
- CALL nivel_educacion()
- DISPLAY BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.calle,
- emplea.casa_num,
- emplea.barrio,emplea.urbanizacion,emplea.cedula,
- emplea.serie,emplea.fech_nac,emplea.cod_nac,
- emplea.licencia,emplea.telefono,emplea.telefonoCorporativo,
- emplea.numeroOficina, emplea.extension,emplea.estado_civil,
- emplea.tipo_sangre,emplea.sueldo_ac,emplea.nomina,
- emplea.fech_efec,descrip,nacion.nom_nac,
- depto.nom_dpto,puesto.nom_puesto,p_sexo,tipo_sexo,
- emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
- emplea.cod_seg3,emplea.cuenta_no,emplea.fecha_salida,
- localidad,emplea.credito,emplea.fecha_ultimo_aumento,
- emplea.tipocuenta,emplea.codbancodestino,
- emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,
- emplea.email_corporativo,
- emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,nombre_super,
- emplea.fecha_suspension,emplea.codigo_retiro_bco,
- emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.cuenta_out,emplea.observacion,emplea.moneda,
- emplea.tipo_documento,
- emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
- IF emplea.foto_empleado IS NOT NULL THEN
- LET filepath = ".\\IMAGENES\\tmpfile.jpg"
-
- CALL emplea.foto_empleado.writeFile(filepath)
- DISPLAY filepath TO fotos
- ELSE
- -- Limpia la foto del empleado anterior cuando el actual no
- -- tiene una; sin esto, Siguiente/Anterior dejaban la imagen
- -- vieja en pantalla.
- LET filepath = NULL
- DISPLAY filepath TO fotos
- END IF
-
- CALL carga_herramientas()
-
-END FUNCTION
-
-FUNCTION acepta()
- DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
- INPUT BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
- emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
- emplea.apell1_emp,emplea.apell2_emp,emplea.gerentemarcas,
- emplea.enviar_volante,emplea.enviar_encuesta,
- localidad,
- num_emp_supervisor,
- emplea.calle,emplea.casa_num,emplea.barrio,
- emplea.urbanizacion,emplea.credito,emplea.tipo_documento, emplea.cedula,
- emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
- emplea.fech_nac,emplea.cod_nac,emplea.licencia,emplea.alias,
- emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,emplea.moneda,
- emplea.nomina,emplea.fech_efec,emplea.fecha_salida,emplea.paga_seg,
- emplea.cod_seg1,
- emplea.cod_seg2,emplea.cod_seg3,emplea.tipocuenta, emplea.codbancodestino,
- emplea.digiverbancodestino,
- emplea.cuenta_no,emplea.genera_file_bco, p_sexo,emplea.fecha_ultimo_aumento,sec_vend_supervisor,
- emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
- emplea.retiro_comercial,emplea.estado_legal,
- emplea.observacion
- ATTRIBUTE(WITHOUT DEFAULTS)
- AFTER FIELD cod_nac
- IF emplea.cod_nac IS NULL THEN
- CALL msg(16)
- NEXT FIELD cod_nac
- END IF
-
- SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
- WHERE cod_nac = emplea.cod_nac
- DISPLAY BY NAME nacion.nom_nac
-
- BEFORE FIELD cedula
-
- IF operacion = "M" AND emplea.tipo_documento = 'CEDULA' THEN
- NEXT FIELD telefono
- END IF
- AFTER FIELD num_emp_supervisor
- IF num_emp_supervisor IS NOT NULL THEN
- SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
- WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
- IF STATUS = NOTFOUND THEN
- CALL msg(3)
- NEXT FIELD num_emp_supervisor
- END IF
- DISPLAY BY NAME nombre_super
- END IF
- AFTER FIELD cedula
- IF emplea.cedula IS NULL THEN
- CALL msg(16)
- NEXT FIELD cedula
- END IF
- DISPLAY "tipo ",emplea.tipo_documento
- IF emplea.tipo_documento = 'CEDULA' THEN
- IF LENGTH(emplea.cedula) <> 11 THEN
- CALL msg(77)
- NEXT FIELD cedula
- END IF
- SELECT UNIQUE a.cedula FROM adtb00003 a WHERE a.cedula = emplea.cedula AND a.status_t IS NULL
- IF STATUS <> NOTFOUND THEN
- CALL msg(12)
- NEXT FIELD cedula
- END IF
- END IF
-
- AFTER FIELD cuenta_aux
- IF emplea.cuenta_aux IS NULL THEN
- CALL msg(16)
- NEXT FIELD cuenta_aux
- END IF
- SELECT a.descripcion INTO descripcion_cuenta FROM cgtb00001 a
- WHERE a.cuenta_no = emplea.cuenta_aux AND a.status_t IS NULL
- IF STATUS = NOTFOUND THEN
- CALL msg(3)
- NEXT FIELD cuenta_aux
- END IF
- DISPLAY BY NAME descripcion_cuenta
- ON ACTION busca_foto
- LET imagenom = "*.jpg *.png *.jpeg"
- CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
- IF filepath IS NOT NULL THEN
- LET filedestino = FGL_GETENV("IMAGENNOMINA")
- #LET filedestino = "F:\\FOURJS\\GAS22006\\pic\\NOMINA\\"
- LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
- LET emplea.url_foto = filedestino
- # CALL FGL_WINMESSAGE("W",filedestino,"stop")
- # CALL fgl_getfile(filepath,filedestino)
-
- LOCATE imagen_emp IN MEMORY
-
-# LET filedestino = "./IMAGENES/", os.path.basename(filepath)
- # CALL fgl_winmessage("info",filedestino,"info")
- CALL fgl_getfile(filepath,filedestino)
-
- CALL imagen_emp.readFile(filedestino)
- LET emplea.foto_empleado = imagen_emp
-# LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
- LET filepath=filedestino
- DISPLAY filepath TO fotos
-
- END IF
-
-## VERIFICA QUE LOS CAMPOS MODIFICABLES NO ESTEN EN BLANCO
- BEFORE INPUT
- CALL departamentos()
- CALL puestos()
- CALL nivel_educacion()
- IF operacion = "A" THEN
- SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
- WHERE a.num_emp < 9999
- IF emplea.num_emp IS NULL THEN
- LET emplea.num_emp = 0
- END IF
- LET emplea.num_emp = emplea.num_emp+1
- DISPLAY BY NAME emplea.num_emp
- END IF
- CALL comisiones_adicionales.clear()
- CALL comisiones.clear()
-
- IF operacion <> "M" THEN
- LET emplea.credito = "SI"
- DISPLAY BY NAME emplea.credito
- END IF
- LET plocalidad = ui.ComboBox.forName("formonly.localidad")
- CALL nolocalidades()
-
- IF operacion = "M" THEN
- NEXT FIELD calle
- END IF
- AFTER FIELD sec_Vend_supervisor
- IF sec_Vend_supervisor IS NOT NULL THEN
- SELECT a.nom1_emp||' '||a.apell1_Emp INTO nombre_supervisor
- FROM adtb0003 a
- WHERE a.num_Emp = sec_vend_supervisor
- IF STATUS = NOTFOUND THEN
- CALL FGL_WINMESSAGE("ERROR","EMPLEADO NO EXISTE","info")
- NEXT FIELD sec_Vend_supervisor
- END IF
- END IF
- AFTER FIELD num_emp
- SELECT a.nom1_emp INTO emplea.nom1_emp FROM adtb00003 a
- WHERE a.num_emp = emplea.num_emp
-
- IF STATUS != NOTFOUND THEN
- IF operacion = "A" THEN
- LET numero_msg = 3
- CALL msg(numero_msg)
- DISPLAY BY NAME emplea.nom1_emp
- NEXT FIELD num_emp
- END IF
- END IF
- AFTER FIELD localidad
- SELECT sucid FROM sucursales WHERE sucid = localidad AND sucid_sirla IS NOT NULL
- IF STATUS = NOTFOUND THEN
- CALL msg(16)
- NEXT FIELD localidad
- END IF
- LET emplea.sucid = localidad
- BEFORE FIELD departamento
- IF operacion = "M" THEN
- NEXT FIELD nivel_emp
- END IF
- AFTER FIELD departamento
-
- IF emplea.departamento IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD departamento
- END IF
-
- SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
- WHERE departamento = emplea.departamento
-
- DISPLAY BY NAME depto.nom_dpto
- EXECUTE BUSCA_DEPTO INTO nombre_out USING depto.departamento_out
- DISPLAY BY NAME nombre_out
-
- AFTER FIELD cod_puesto
-
- IF emplea.cod_puesto IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD cod_puesto
- END IF
-
- SELECT a.nom_puesto INTO puesto.nom_puesto FROM adtb00004 a
- WHERE a.cod_puesto = emplea.cod_puesto AND a.cod_puesto_sirla IS NOT null
- IF STATUS = NOTFOUND THEN
- CALL fgl_winmessage("INFO","PUESTO NO EXISTE","INFO")
- NEXT FIELD cod_puesto
- END IF
- DISPLAY BY NAME puesto.nom_puesto
-
- AFTER FIELD sueldo_ac
-
- IF emplea.sueldo_ac IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD sueldo_ac
- END IF
-
- AFTER FIELD fech_nac
-
- IF emplea.fech_nac IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD fech_nac
- END IF
-
- IF YEAR(emplea.fech_nac) >= YEAR(today) THEN
- ERROR "FECHA INCORRECTA"
- NEXT FIELD fech_nac
- END IF
-
- AFTER FIELD nomina
- IF emplea.nomina IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD nomina
- END IF
-
- IF emplea.nomina = "Q" THEN
- LET descrip = "QUINCENAL"
- END IF
- IF emplea.nomina = "S" THEN
- LET descrip = "SEMANAL"
- END IF
- IF emplea.nomina = "V" THEN
- LET descrip = "VENDEDOR"
- END IF
- DISPLAY BY NAME descrip
-
- AFTER FIELD p_sexo
- IF p_sexo IS NULL THEN
- LET numero_msg = 16
- CALL msg(numero_msg)
- NEXT FIELD p_sexo
- END IF
-
- IF p_sexo = "M" THEN
- LET tipo_sexo = "MASCULINO"
- ELSE
- IF p_sexo = "F" THEN
- LET tipo_sexo = "FEMENINO"
- END IF
- END IF
- DISPLAY BY NAME tipo_sexo
- #### Verifica si el usuario presiono la tecla
-
- AFTER INPUT
- IF emplea.nivel_emp IS NULL THEN
- CALL msg(16)
- NEXT FIELD nivel_emp
- END IF
- IF emplea.cod_nac IS NULL THEN
- CALL msg(16)
- NEXT FIELD cod_nac
- END IF
- IF emplea.estado_civil IS NULL THEN
- CALL msg(16)
- NEXT FIELD estado_civil
- END IF
- DECLARE busca_comision CURSOR FOR
- SELECT a.sec_vend_a,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
- RTRIM(ISNULL(b.apell1_emp,' ')),a.porc_cobros,a.porc_cobros_a
- FROM vetb00075 a,adtb00003 b
- WHERE a.sec_vend_a = emplea.num_emp AND
- a.sec_vend_a = b.num_emp
-
-
- LET idx = 1
- FOREACH busca_comision INTO comisiones[idx].*
- LET idx = idx + 1
- END FOREACH
- DECLARE comision_adicional CURSOR FOR
- SELECT a.sec_vend,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
- RTRIM(ISNULL(b.apell1_emp,' ')),a.cod_n,c.producto,a.porc_vendedor,a.porc_supervisor
- FROM vetb00076 a,adtb00003 b,iptb00020 c
- WHERE a.sec_vend = emplea.num_emp AND
- a.sec_vend = b.num_emp AND
- a.cod_n = c.cod_n
-
-
- LET idx = 1
- FOREACH comision_adicional INTO comisiones_adicionales[idx].*
- LET idx = idx + 1
- END FOREACH
- IF emplea.cuenta_aux IS NULL THEN
- CALL msg(16)
- NEXT FIELD cuenta_aux
- END IF
- IF emplea.tipo_documento = 'CEDULA' THEN
- IF LENGTH(emplea.cedula) <> 11 THEN
- CALL msg(77)
- NEXT FIELD cedula
- END IF
- END IF
- END INPUT
-
- INPUT ARRAY comisiones FROM s_comisiones.* ATTRIBUTE(WITHOUT DEFAULTS)
- AFTER FIELD sec_vend
- LET idx = arr_curr()
- LET scr_l = scr_line()
-
- SELECT RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
- RTRIM(ISNULL(b.apell1_emp,' '))
- FROM adtb00003 b
- WHERE b.num_emp = comisiones[idx].sec_vend_a
-
- IF STATUS = NOTFOUND THEN
- CALL fgl_winmessage("ERROR","EMPLEADO NO EXISTE","INFO")
- NEXT FIELD num_emp
- END IF
- DISPLAY comisiones[idx].nombre_vend TO s_comisiones[scr_l].nombre_Vend
- END INPUT
- INPUT ARRAY comisiones_adicionales FROM s_adicionales.* ATTRIBUTE (WITHOUT DEFAULTS)
- AFTER FIELD cod_n
- IF comisiones_adicionales[arr_curr()].cod_n IS NOT NULL THEN
- SELECT a.descrip_Esp INTO comisiones_adicionales[arr_curr()].descripcion
- FROM iptb00020 a
- WHERE a.cod_n = comisiones_adicionales[arr_curr()].cod_n AND a.status_t IS NULL
-
- IF STATUS = NOTFOUND THEN
- CALL fgl_winmessage("ERROR","REGISTRO NO EXISTE","INFO")
- NEXT FIELD cod_n
- END IF
- DISPLAY comisiones_adicionales[arr_curr()].descripcion TO s_adicionales[scr_line()].descripcion
-
-
-
- END IF
- END INPUT
-
- ON ACTION CANCEL
- LET numero_msg = 2
- CALL msg(numero_msg)
- CLEAR FORM
- LET INT_FLAG = true
- RETURN
- ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
- IF emplea.nivel_emp IS NULL THEN
- CALL msg(16)
- NEXT FIELD nivel_emp
- END IF
- IF emplea.fech_nac IS NULL THEN
- CALL msg(16)
- NEXT FIELD fech_nac
- END IF
-
- IF emplea.fech_efec IS NULL THEN
- CALL msg(16)
- NEXT FIELD fech_efec
- END IF
- IF emplea.tipo_documento = 'CEDULA' THEN
- IF LENGTH(emplea.cedula) <> 11 THEN
- CALL msg(77)
- NEXT FIELD cedula
- END IF
- END IF
- IF localidad IS NULL THEN
- CALL msg(16)
- NEXT FIELD localidad
- END IF
+## 2026-10-05: fecha_salida ya no se modifica aqui; la pone ADPRMT017 (DESVINCULAR)
+ IF operacion = "M" THEN
+ UPDATE adtb00003 SET
+ (nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,codbancodestino,
+ digiverbancodestino,tipo_sueldo,email,email_corporativo,instalador,cuenta_aux,num_emp_supervisor,
+ retiro_comercial,estado_legal,genera_file_bco,observacion,gerentemarcas,enviar_encuesta,enviar_volante)=
+
+ (emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,emplea.telefonoCorporativo,emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,SUSER_SNAME(),GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
+ localidad,emplea.credito,emplea.fecha_ultimo_aumento,emplea.codbancodestino,emplea.digiverbancodestino,emplea.tipo_sueldo,
+ emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,emplea.retiro_comercial,
+ emplea.estado_legal,emplea.genera_file_bco,emplea.observacion,
+ emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante)
+ WHERE @num_emp = emplea.num_emp
+ SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00021 SET sexo = p_sexo
+ WHERE num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ END IF
+ {
+ LET actualiza_Datos =
+ "UPDATE cooperativa.dbo.adtb00003 SET
+ departamento= ",emplea.departamento,",",
+ "cod_puesto=",emplea.cod_puesto,",",
+ "nivel_emp=", emplea.nivel_emp,",",
+ "nom1_emp='",emplea.nom1_emp CLIPPED,"',",
+ "nom2_emp='",emplea.nom2_emp CLIPPED,"',",
+ "apell1_emp='",emplea.apell1_emp CLIPPED,"',",
+ "apell2_emp='",emplea.apell2_emp CLIPPED,"',",
+ "calle='",emplea.calle CLIPPED,"',",
+ "casa_num='",emplea.casa_num CLIPPED,"',",
+ "barrio='",emplea.barrio CLIPPED,"',",
+ "fech_efec='",emplea.fech_efec,"',",
+ "fech_nac='",emplea.fech_nac,"',",
+ " urbanizacion='",emplea.urbanizacion CLIPPED,"',",
+ " telefono='",emplea.telefono CLIPPED,"',",
+ " cedula='",emplea.cedula,"',",
+ " serie='",emplea.serie,"',",
+ " cod_nac=",emplea.cod_nac,",",
+ " estado_civil='",emplea.estado_civil,"',",
+ " tipo_sangre='",emplea.tipo_sangre,"',",
+ " sueldo_ac=",emplea.sueldo_ac,",",
+ " nomina='",emplea.nomina,"',",
+ " paga_seg='",emplea.paga_seg,"',",
+ " fecha_salida='",emplea.fecha_salida,"',",
+ " cuenta_no='",emplea.cuenta_no,"',",
+ " us_mod='",usuarios CLIPPED,"',",
+ " fech_mod=getdate(),",
+ " licencia='",emplea.licencia,"',",
+ " cod_seg1='",emplea.cod_seg1,"',",
+ " cod_seg3='",emplea.cod_seg3,"',",
+
+ " sucid=",emplea.sucid,",",
+ " credito='",emplea.credito CLIPPED,"',",
+ " fecha_ultimo_aumento='",emplea.fecha_ultimo_aumento,"',",
+ " codbancodestino='",emplea.codbancodestino,"',",
+ " digiverbancodestino='",emplea.digiverbancodestino,"',",
+ " tipo_sueldo='",emplea.tipo_sueldo,"',",
+ " email='", emplea.email CLIPPED,"',",
+ " instalador='",emplea.instalador,"',",
+ " cuenta_aux='",emplea.cuenta_aux,"' ",
+ " retiro_comercial='",emplea.retiro_comercial,"' ",
+" WHERE num_emp =", emplea.num_emp
+
+ PREPARE comando_up FROM actualiza_datos
+ EXECUTE comando_up
+ }
+ { SET CONNECTION "IFMX"
+ SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,getdate(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
+
+ WHERE @num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,getdate(),
+ emplea.licencia,emplea.cod_seg3)
+
+
+
+ END IF
+ }
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+ END IF
+
+
+ IF status < 0 THEN
+ CALL integridad()
+ END IF
+
+## AQUI SE ELIMINAN LOS REGISTROS
+ { COMMAND KEY ("L") "eLiminar"
+ PROMPT "Esta Seguro de Eliminar Este Empleado? " FOR CHAR opt5
+ IF opt5 = "S" THEN
+ update adtb00003 set status_t = "E",us_mod = USER_SNAME(),fech_mod = GETDATE()
+ WHERE num_emp = emplea.num_emp
+ END IF
+
+ LET numero_msg = 39
+ CALL msg(numero_msg)
+} ON ACTION carnet ATTRIBUTE(TEXT="Carnet",IMAGE="fa-print")
+ CALL cardnet(emplea.num_emp)
+
+ COMMAND "Retornar" "Retorna al menu anterior"
+ CLEAR FORM
+ EXIT MENU
+ END MENU
+ ELSE
+ CALL acepta()
+ IF int_flag THEN
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ LET int_flag = FALSE
+ RETURN
+ END IF
+
+END IF
+END FUNCTION
+
+FUNCTION selecta1()
+ SELECT a.fecha_suspension INTO emplea.fecha_suspension FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT a.sexo INTO p_sexo FROM adtb00021 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
+ WHERE departamento = emplea.departamento
+
+ SELECT @nom_puesto INTO puesto.nom_puesto FROM adtb00004
+ WHERE @cod_puesto = emplea.cod_puesto
+
+ IF p_sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ END IF
+ IF p_sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ END IF
+
+ IF emplea.nomina = "Q" THEN
+ LET descrip = "QUINCENAL"
+ END IF
+ IF emplea.nomina = "S" THEN
+ LET descrip = "SEMANAL"
+ END IF
+
+ IF emplea.status_t = "D" THEN
+ LET descrip_st = "DESACTIVADO"
+ END IF
+ IF emplea.status_t = "E" THEN
+ LET descrip_st = "ELIMINADO"
+ END IF
+ IF emplea.status_t IS NULL THEN
+ LET descrip_st = "ACTIVADO"
+ END IF
+ DISPLAY BY NAME descrip_st ATTRIBUTE(REVERSE,RED)
+
+ SELECT a.licencia INTO emplea.licencia
+ FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
+ WHERE cod_nac = emplea.cod_nac
+
+ CALL departamentos()
+ CALL puestos()
+ LET plocalidad = ui.ComboBox.forName("formonly.localidad")
+ CALL nolocalidades()
+
+ LET localidad = emplea.sucid
+ SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
+ WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
+ CALL nivel_educacion()
+ DISPLAY BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.calle,
+ emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.cedula,
+ emplea.serie,emplea.fech_nac,emplea.cod_nac,
+ emplea.licencia,emplea.telefono,emplea.telefonoCorporativo,
+ emplea.numeroOficina, emplea.extension,emplea.estado_civil,
+ emplea.tipo_sangre,emplea.sueldo_ac,emplea.nomina,
+ emplea.fech_efec,descrip,nacion.nom_nac,
+ depto.nom_dpto,puesto.nom_puesto,p_sexo,tipo_sexo,
+ emplea.paga_seg,emplea.cod_seg1,emplea.cod_seg2,
+ emplea.cod_seg3,emplea.cuenta_no,emplea.fecha_salida,
+ localidad,emplea.credito,emplea.fecha_ultimo_aumento,
+ emplea.tipocuenta,emplea.codbancodestino,
+ emplea.digiverbancodestino,emplea.tipo_sueldo,emplea.email,
+ emplea.email_corporativo,
+ emplea.instalador,emplea.cuenta_aux,num_emp_supervisor,nombre_super,
+ emplea.fecha_suspension,emplea.codigo_retiro_bco,
+ emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.cuenta_out,emplea.observacion,emplea.moneda,
+ emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.enviar_encuesta,emplea.enviar_volante
+ IF emplea.foto_empleado IS NOT NULL THEN
+ LET filepath = ".\\IMAGENES\\tmpfile.jpg"
+
+ CALL emplea.foto_empleado.writeFile(filepath)
+ DISPLAY filepath TO fotos
+ ELSE
+ -- Limpia la foto del empleado anterior cuando el actual no
+ -- tiene una; sin esto, Siguiente/Anterior dejaban la imagen
+ -- vieja en pantalla.
+ LET filepath = NULL
+ DISPLAY filepath TO fotos
+ END IF
+
+ CALL carga_herramientas()
+
+END FUNCTION
+
+FUNCTION acepta()
+ DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
+ INPUT BY NAME emplea.num_emp,emplea.departamento,emplea.nivel_emp,
+ emplea.cod_puesto,emplea.nom1_emp,emplea.nom2_emp,
+ emplea.apell1_emp,emplea.apell2_emp,emplea.gerentemarcas,
+ emplea.enviar_volante,emplea.enviar_encuesta,
+ localidad,
+ num_emp_supervisor,
+ emplea.calle,emplea.casa_num,emplea.barrio,
+ emplea.urbanizacion,emplea.credito,emplea.tipo_documento, emplea.cedula,
+ emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.fech_nac,emplea.cod_nac,emplea.licencia,emplea.alias,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,emplea.moneda,
+ emplea.nomina,emplea.fech_efec,emplea.fecha_salida,emplea.paga_seg,
+ emplea.cod_seg1,
+ emplea.cod_seg2,emplea.cod_seg3,emplea.tipocuenta, emplea.codbancodestino,
+ emplea.digiverbancodestino,
+ emplea.cuenta_no,emplea.genera_file_bco, p_sexo,emplea.fecha_ultimo_aumento,sec_vend_supervisor,
+ emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
+ emplea.retiro_comercial,emplea.estado_legal,
+ emplea.observacion
+ ATTRIBUTE(WITHOUT DEFAULTS)
+ AFTER FIELD cod_nac
+ IF emplea.cod_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cod_nac
+ END IF
+
+ SELECT nom_nac INTO nacion.nom_nac FROM adtb00007
+ WHERE cod_nac = emplea.cod_nac
+ DISPLAY BY NAME nacion.nom_nac
+
+ BEFORE FIELD cedula
+
+ IF operacion = "M" AND emplea.tipo_documento = 'CEDULA' THEN
+ NEXT FIELD telefono
+ END IF
+ AFTER FIELD num_emp_supervisor
+ IF num_emp_supervisor IS NOT NULL THEN
+ SELECT RTRIM(a.nom1_emp)||' '||a.apell1_Emp INTO nombre_super FROM adtb00003 a
+ WHERE a.num_emp = num_emp_supervisor AND a.status_t IS NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD num_emp_supervisor
+ END IF
+ DISPLAY BY NAME nombre_super
+ END IF
+ AFTER FIELD cedula
+ IF emplea.cedula IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cedula
+ END IF
+ DISPLAY "tipo ",emplea.tipo_documento
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ SELECT UNIQUE a.cedula FROM adtb00003 a WHERE a.cedula = emplea.cedula AND a.status_t IS NULL
+ IF STATUS <> NOTFOUND THEN
+ CALL msg(12)
+ NEXT FIELD cedula
+ END IF
+ END IF
+
+ AFTER FIELD cuenta_aux
+ IF emplea.cuenta_aux IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cuenta_aux
+ END IF
+ SELECT a.descripcion INTO descripcion_cuenta FROM cgtb00001 a
+ WHERE a.cuenta_no = emplea.cuenta_aux AND a.status_t IS NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD cuenta_aux
+ END IF
+ DISPLAY BY NAME descripcion_cuenta
+ ON ACTION busca_foto
+ LET imagenom = "*.jpg *.png *.jpeg"
+ CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
+ IF filepath IS NOT NULL THEN
+ LET filedestino = FGL_GETENV("IMAGENNOMINA")
+ #LET filedestino = "F:\\FOURJS\\GAS22006\\pic\\NOMINA\\"
+ LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
+ LET emplea.url_foto = filedestino
+ # CALL FGL_WINMESSAGE("W",filedestino,"stop")
+ # CALL fgl_getfile(filepath,filedestino)
+
+ LOCATE imagen_emp IN MEMORY
+
+# LET filedestino = "./IMAGENES/", os.path.basename(filepath)
+ # CALL fgl_winmessage("info",filedestino,"info")
+ CALL fgl_getfile(filepath,filedestino)
+
+ CALL imagen_emp.readFile(filedestino)
+ LET emplea.foto_empleado = imagen_emp
+# LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
+ LET filepath=filedestino
+ DISPLAY filepath TO fotos
+
+ END IF
+
+## VERIFICA QUE LOS CAMPOS MODIFICABLES NO ESTEN EN BLANCO
+ BEFORE INPUT
+ CALL departamentos()
+ CALL puestos()
+ CALL nivel_educacion()
+ IF operacion = "A" THEN
+ SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
+ WHERE a.num_emp < 9999
+ IF emplea.num_emp IS NULL THEN
+ LET emplea.num_emp = 0
+ END IF
+ LET emplea.num_emp = emplea.num_emp+1
+ DISPLAY BY NAME emplea.num_emp
+ END IF
+ CALL comisiones_adicionales.clear()
+ CALL comisiones.clear()
+
+ IF operacion <> "M" THEN
+ LET emplea.credito = "SI"
+ DISPLAY BY NAME emplea.credito
+ END IF
+ LET plocalidad = ui.ComboBox.forName("formonly.localidad")
+ CALL nolocalidades()
+
+ IF operacion = "M" THEN
+ NEXT FIELD calle
+ END IF
+ AFTER FIELD sec_Vend_supervisor
+ IF sec_Vend_supervisor IS NOT NULL THEN
+ SELECT a.nom1_emp||' '||a.apell1_Emp INTO nombre_supervisor
+ FROM adtb0003 a
+ WHERE a.num_Emp = sec_vend_supervisor
+ IF STATUS = NOTFOUND THEN
+ CALL FGL_WINMESSAGE("ERROR","EMPLEADO NO EXISTE","info")
+ NEXT FIELD sec_Vend_supervisor
+ END IF
+ END IF
+ AFTER FIELD num_emp
+ SELECT a.nom1_emp INTO emplea.nom1_emp FROM adtb00003 a
+ WHERE a.num_emp = emplea.num_emp
+
+ IF STATUS != NOTFOUND THEN
+ IF operacion = "A" THEN
+ LET numero_msg = 3
+ CALL msg(numero_msg)
+ DISPLAY BY NAME emplea.nom1_emp
+ NEXT FIELD num_emp
+ END IF
+ END IF
+ AFTER FIELD localidad
+ SELECT sucid FROM sucursales WHERE sucid = localidad AND sucid_sirla IS NOT NULL
+ IF STATUS = NOTFOUND THEN
+ CALL msg(16)
+ NEXT FIELD localidad
+ END IF
+ LET emplea.sucid = localidad
+ BEFORE FIELD departamento
+ IF operacion = "M" THEN
+ NEXT FIELD nivel_emp
+ END IF
+ AFTER FIELD departamento
+
+ IF emplea.departamento IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD departamento
+ END IF
+
+ SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001
+ WHERE departamento = emplea.departamento
+
+ DISPLAY BY NAME depto.nom_dpto
+ EXECUTE BUSCA_DEPTO INTO nombre_out USING depto.departamento_out
+ DISPLAY BY NAME nombre_out
+
+ AFTER FIELD cod_puesto
+
+ IF emplea.cod_puesto IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD cod_puesto
+ END IF
+
+ SELECT a.nom_puesto INTO puesto.nom_puesto FROM adtb00004 a
+ WHERE a.cod_puesto = emplea.cod_puesto AND a.cod_puesto_sirla IS NOT null
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("INFO","PUESTO NO EXISTE","INFO")
+ NEXT FIELD cod_puesto
+ END IF
+ DISPLAY BY NAME puesto.nom_puesto
+
+ AFTER FIELD sueldo_ac
+
+ IF emplea.sueldo_ac IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD sueldo_ac
+ END IF
+
+ AFTER FIELD fech_nac
+
+ IF emplea.fech_nac IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD fech_nac
+ END IF
+
+ IF YEAR(emplea.fech_nac) >= YEAR(today) THEN
+ ERROR "FECHA INCORRECTA"
+ NEXT FIELD fech_nac
+ END IF
+
+ AFTER FIELD nomina
+ IF emplea.nomina IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD nomina
+ END IF
+
+ IF emplea.nomina = "Q" THEN
+ LET descrip = "QUINCENAL"
+ END IF
+ IF emplea.nomina = "S" THEN
+ LET descrip = "SEMANAL"
+ END IF
+ IF emplea.nomina = "V" THEN
+ LET descrip = "VENDEDOR"
+ END IF
+ DISPLAY BY NAME descrip
+
+ AFTER FIELD p_sexo
+ IF p_sexo IS NULL THEN
+ LET numero_msg = 16
+ CALL msg(numero_msg)
+ NEXT FIELD p_sexo
+ END IF
+
+ IF p_sexo = "M" THEN
+ LET tipo_sexo = "MASCULINO"
+ ELSE
+ IF p_sexo = "F" THEN
+ LET tipo_sexo = "FEMENINO"
+ END IF
+ END IF
+ DISPLAY BY NAME tipo_sexo
+ #### Verifica si el usuario presiono la tecla
+
+ AFTER INPUT
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD nivel_emp
+ END IF
+ IF emplea.cod_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cod_nac
+ END IF
+ IF emplea.estado_civil IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD estado_civil
+ END IF
+ DECLARE busca_comision CURSOR FOR
+ SELECT a.sec_vend_a,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' ')),a.porc_cobros,a.porc_cobros_a
+ FROM vetb00075 a,adtb00003 b
+ WHERE a.sec_vend_a = emplea.num_emp AND
+ a.sec_vend_a = b.num_emp
+
+
+ LET idx = 1
+ FOREACH busca_comision INTO comisiones[idx].*
+ LET idx = idx + 1
+ END FOREACH
+ DECLARE comision_adicional CURSOR FOR
+ SELECT a.sec_vend,RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' ')),a.cod_n,c.producto,a.porc_vendedor,a.porc_supervisor
+ FROM vetb00076 a,adtb00003 b,iptb00020 c
+ WHERE a.sec_vend = emplea.num_emp AND
+ a.sec_vend = b.num_emp AND
+ a.cod_n = c.cod_n
+
+
+ LET idx = 1
+ FOREACH comision_adicional INTO comisiones_adicionales[idx].*
+ LET idx = idx + 1
+ END FOREACH
+ IF emplea.cuenta_aux IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD cuenta_aux
+ END IF
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ END IF
+ END INPUT
+
+ INPUT ARRAY comisiones FROM s_comisiones.* ATTRIBUTE(WITHOUT DEFAULTS)
+ AFTER FIELD sec_vend
+ LET idx = arr_curr()
+ LET scr_l = scr_line()
+
+ SELECT RTRIM(b.nom1_emp) || " "||RTRIM(ISNULL(b.nom2_emp,' '))||" "||
+ RTRIM(ISNULL(b.apell1_emp,' '))
+ FROM adtb00003 b
+ WHERE b.num_emp = comisiones[idx].sec_vend_a
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","EMPLEADO NO EXISTE","INFO")
+ NEXT FIELD num_emp
+ END IF
+ DISPLAY comisiones[idx].nombre_vend TO s_comisiones[scr_l].nombre_Vend
+ END INPUT
+ INPUT ARRAY comisiones_adicionales FROM s_adicionales.* ATTRIBUTE (WITHOUT DEFAULTS)
+ AFTER FIELD cod_n
+ IF comisiones_adicionales[arr_curr()].cod_n IS NOT NULL THEN
+ SELECT a.descrip_Esp INTO comisiones_adicionales[arr_curr()].descripcion
+ FROM iptb00020 a
+ WHERE a.cod_n = comisiones_adicionales[arr_curr()].cod_n AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","REGISTRO NO EXISTE","INFO")
+ NEXT FIELD cod_n
+ END IF
+ DISPLAY comisiones_adicionales[arr_curr()].descripcion TO s_adicionales[scr_line()].descripcion
+
+
+
+ END IF
+ END INPUT
+
+ ON ACTION CANCEL
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ CLEAR FORM
+ LET INT_FLAG = true
+ RETURN
+ ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
+ IF emplea.nivel_emp IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD nivel_emp
+ END IF
+ IF emplea.fech_nac IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD fech_nac
+ END IF
+
+ IF emplea.fech_efec IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD fech_efec
+ END IF
+ IF emplea.tipo_documento = 'CEDULA' THEN
+ IF LENGTH(emplea.cedula) <> 11 THEN
+ CALL msg(77)
+ NEXT FIELD cedula
+ END IF
+ END IF
+ IF localidad IS NULL THEN
+ CALL msg(16)
+ NEXT FIELD localidad
+ END IF
## AQUI SE ACTUALIZA EL REGISTRO
- IF operacion = "M" THEN
- SET CONNECTION "MSSQL"
- UPDATE adtb00003 SET
- (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
- apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
- fech_nac,
- urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
- tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
- licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,tipocuenta,
- codbancodestino,digiverbancodestino,tipo_sueldo,email,email_corporativo,cuenta_aux,cuenta_out,departamento_out,
- num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,moneda,tipo_documento,
- gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)=
-
- (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.fech_efec,emplea.fech_nac,
- emplea.urbanizacion,
- emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,GETDATE(),
- emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
- localidad,emplea.credito,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
- emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.cuenta_aux,emplea.cuenta_out,emplea.departamento_out,
- num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
- emplea.observacion,emplea.moneda,emplea.tipo_documento,
- emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
- WHERE @num_emp = emplea.num_emp
-
- SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
- IF STATUS <> NOTFOUND THEN
- UPDATE adtb00021 SET sexo = p_sexo
- WHERE num_emp = emplea.num_emp
- ELSE
-
- INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
- emplea.cedula,p_sexo,emplea.fech_nac,null,
- SUSER_SNAME(),GETDATE(),null,null)
- END IF
-
- { SET CONNECTION "IFMX"
- SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
-
- IF STATUS <> NOTFOUND THEN
-
- UPDATE adtb00003 SET
- (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
- apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
- fech_nac,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
- licencia,cod_seg1,cod_seg3)=
-
- (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.fech_efec,emplea.fech_nac,
- emplea.urbanizacion,
- emplea.telefono,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,GETDATE(),
- emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
- WHERE @num_emp = emplea.num_emp
-
- ELSE
- INSERT INTO adtb00003
- (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
- nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- fech_efec,fecha_salida,fech_nac,
- tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
- fech_crea,licencia,cod_Seg3,moneda)
- VALUES
- (emplea.num_emp,emplea.departamento,
- emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.urbanizacion,emplea.telefono,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
- emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
- emplea.licencia,emplea.cod_seg3,emplea.moneda)
-
- END IF
- }
- LET numero_msg = 13
- CALL msg(numero_msg)
-
- END IF
- IF operacion = "A" THEN
- SET CONNECTION "MSSQL"
- SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
- WHERE a.num_emp < 9999
- IF emplea.num_emp IS NULL THEN
- LET emplea.num_emp = 0
- END IF
- LET emplea.num_emp = emplea.num_emp+1
- DISPLAY BY NAME emplea.num_emp
-
- INSERT INTO adtb00003
- (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
- nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
- urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
- fech_efec,fecha_salida,fech_nac,
- tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
- fech_crea,licencia,cod_Seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,tipocuenta,
- codbancodestino,digiverbancodestino,email,email_corporativo,instalador,cuenta_aux,cuenta_out,
- departamento_out,num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,tipo_documento,
- gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)
- VALUES
- (emplea.num_emp,emplea.departamento,
- emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.urbanizacion,emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
- emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
- emplea.licencia,emplea.cod_seg3,emplea.foto_empleado,emplea.sucid,emplea.credito,
- emplea.fecha_ultimo_aumento,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
- emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
- emplea.departamento_out,num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,
- emplea.genera_file_bco,emplea.observacion,emplea.tipo_documento,
- emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
-
-
- INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
- emplea.cedula,p_sexo,emplea.fech_nac,null,
- SUSER_SNAME(),GETDATE(),null,null)
- { LET actualiza_datos =
- "INSERT INTO cooperativa.dbo.adtb00003
- (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
- nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- fech_efec,fecha_salida,fech_nac,
- tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
- fech_crea,licencia,cod_Seg3)
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,getdate(),?,?)"
-
- PREPARE command_ins FROM actualiza_datos
- EXECUTE command_ins USING
- emplea.num_emp, emplea.departamento,
- emplea.cod_puesto, emplea.nivel_emp,
- emplea.nom1_emp, emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp, emplea.calle,emplea.casa_num,
- emplea.barrio, emplea.urbanizacion,emplea.telefono,
- emplea.cedula, emplea.serie,emplea.cod_nac,
- emplea.estado_civil, emplea.fech_efec, emplea.fecha_salida, emplea.fech_nac,
- emplea.tipo_sangre, emplea.sueldo_ac,
- emplea.nomina, emplea.paga_seg, emplea.cuenta_no,
- usuarios,
- emplea.licencia, emplea.cod_seg3
-}
- -- Informix (IFMX) ya no existe; el sistema fue migrado completo
- -- a SQL Server. Este INSERT duplicado hacia la vieja base queda
- -- deshabilitado (ver nota en MAIN).
- {
- SET CONNECTION "IFMX"
- INSERT INTO adtb00003
- (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
- nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
- urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
- fech_efec,fecha_salida,fech_nac,
- tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
- fech_crea,licencia,cod_Seg3)
- VALUES
- (emplea.num_emp,emplea.departamento,
- emplea.cod_puesto,emplea.nivel_emp,
- emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
- emplea.apell2_emp,emplea.calle,emplea.casa_num,
- emplea.barrio,emplea.urbanizacion,emplea.telefono,
- emplea.cedula,emplea.serie,emplea.cod_nac,
- emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
- emplea.tipo_sangre,emplea.sueldo_ac,
- emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
- emplea.licencia,emplea.cod_seg3)
- }
-
- LET numero_msg = 1
- CALL msg(numero_msg)
-
- END IF
- RETURN
- END DIALOG
-END FUNCTION
-FUNCTION acepta1()
- MENU
- ON ACTION busca_foto
- LET imagenom = "*.jpg *.png *.jpeg"
- CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
- IF filepath IS NOT NULL THEN
- LET filedestino = FGL_GETENV("IMAGENNOMINA")
-
- LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
- LET emplea.url_foto = filedestino
- # CALL FGL_WINMESSAGE("W",filedestino,"stop")
- # CALL fgl_getfile(filepath,filedestino)
-
- LOCATE imagen_emp IN MEMORY
-
- # LET filedestino = "./IMAGENES/", os.path.basename(filepath)
- # CALL fgl_winmessage("info",filedestino,"info")
- CALL fgl_getfile(filepath,filedestino)
-
- CALL imagen_emp.readFile(filedestino)
- LET emplea.foto_empleado = imagen_emp
- # LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
- LET filepath=filedestino
- DISPLAY filepath TO fotos
-
- END IF
-
- ON ACTION CANCEL
- LET numero_msg = 2
- CALL msg(numero_msg)
- CLEAR FORM
- LET INT_FLAG = true
- RETURN
- ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
- SET CONNECTION "MSSQL"
- UPDATE adtb00003 SET
- foto_empleado = emplea.foto_empleado,
- us_mod = usuarios,
- fech_mod = getdate()
-
- WHERE @num_emp = emplea.num_emp
-
-
- LET numero_msg = 13
- CALL msg(numero_msg)
-
-
- END MENU
-END FUNCTION
-
-FUNCTION carga_herramientas()
- DEFINE i INTEGER
- SET CONNECTION "MSSQL"
- CALL herramientas.clear()
-
- DECLARE cur_herr CURSOR FOR
- SELECT a.codigo,
- RTRIM(ISNULL(b.descrip_esp,'')),
- a.fecha,
- a.documento,
- a.cantidad
- FROM adtb00057 a
- LEFT JOIN irtb00002 b
- ON CAST(b.cod_n AS VARCHAR(10)) + '-' +
- CAST(b.cod_grupo AS VARCHAR(10)) + '-' +
- CAST(b.cod_tipo AS VARCHAR(10)) + '-' +
- CAST(b.cod_sec AS VARCHAR(10)) = a.codigo
- WHERE a.num_emp = emplea.num_emp
- ORDER BY a.codigo
-
- LET i = 1
- FOREACH cur_herr INTO herramientas[i].*
- LET i = i + 1
- END FOREACH
- IF i > 1 THEN
- CALL herramientas.deleteElement(i) -- quita el slot vac�o final
- END IF
-
- CALL muestra_herramientas()
-END FUNCTION
-
-FUNCTION muestra_herramientas()
- DEFINE i, tope INTEGER
- CLEAR s_herramientas.*
- LET tope = herramientas.getLength()
- IF tope > 12 THEN LET tope = 12 END IF
- FOR i = 1 TO tope
- DISPLAY herramientas[i].codigo,
- herramientas[i].descripcion,
- herramientas[i].fecha,
- herramientas[i].documento,
- herramientas[i].cantidad
- TO s_herramientas[i].*
- END FOR
-END FUNCTION
+## 2026-10-05: fecha_salida ya no se modifica aqui; la pone ADPRMT017 (DESVINCULAR)
+ IF operacion = "M" THEN
+ SET CONNECTION "MSSQL"
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3,foto_empleado,sucid,credito,tipocuenta,
+ codbancodestino,digiverbancodestino,tipo_sueldo,email,email_corporativo,cuenta_aux,cuenta_out,departamento_out,
+ num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,moneda,tipo_documento,
+ gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3,emplea.foto_empleado,
+ localidad,emplea.credito,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
+ emplea.tipo_sueldo,emplea.email,emplea.email_corporativo,emplea.cuenta_aux,emplea.cuenta_out,emplea.departamento_out,
+ num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,emplea.genera_file_bco,
+ emplea.observacion,emplea.moneda,emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
+ WHERE @num_emp = emplea.num_emp
+
+ SELECT a.num_emp FROM adtb00021 a WHERE a.num_emp = emplea.num_emp
+ IF STATUS <> NOTFOUND THEN
+ UPDATE adtb00021 SET sexo = p_sexo
+ WHERE num_emp = emplea.num_emp
+ ELSE
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ END IF
+
+ { SET CONNECTION "IFMX"
+ SELECT a.num_emp FROM adtb00003 a WHERE a.num_emp = emplea.num_emp
+
+ IF STATUS <> NOTFOUND THEN
+
+ UPDATE adtb00003 SET
+ (departamento,cod_puesto,nivel_emp,nom1_emp,nom2_emp,
+ apell1_emp,apell2_emp,calle,casa_num,barrio,fech_efec,
+ fech_nac,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, fecha_salida,cuenta_no, us_mod,fech_mod,
+ licencia,cod_seg1,cod_seg3)=
+
+ (emplea.departamento,emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.fech_efec,emplea.fech_nac,
+ emplea.urbanizacion,
+ emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.fecha_salida,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg1,emplea.cod_seg3)
+ WHERE @num_emp = emplea.num_emp
+
+ ELSE
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3,moneda)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3,emplea.moneda)
+
+ END IF
+ }
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+
+ END IF
+ IF operacion = "A" THEN
+ SET CONNECTION "MSSQL"
+ SELECT MAX(a.num_emp) INTO emplea.num_emp FROM adtb00003 a
+ WHERE a.num_emp < 9999
+ IF emplea.num_emp IS NULL THEN
+ LET emplea.num_emp = 0
+ END IF
+ LET emplea.num_emp = emplea.num_emp+1
+ DISPLAY BY NAME emplea.num_emp
+
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,telefonoCorporativo,numeroOficina,extension,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3,foto_empleado,sucid,credito,fecha_ultimo_aumento,tipocuenta,
+ codbancodestino,digiverbancodestino,email,email_corporativo,instalador,cuenta_aux,cuenta_out,
+ departamento_out,num_emp_supervisor,retiro_comercial,estado_legal,genera_file_bco,observacion,tipo_documento,
+ gerentemarcas,alias,url_foto,enviar_encuesta,enviar_volante)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,emplea.telefonoCorporativo, emplea.numeroOficina, emplea.extension,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3,emplea.foto_empleado,emplea.sucid,emplea.credito,
+ emplea.fecha_ultimo_aumento,emplea.tipocuenta,emplea.codbancodestino,emplea.digiverbancodestino,
+ emplea.email,emplea.email_corporativo,emplea.instalador,emplea.cuenta_aux,emplea.cuenta_out,
+ emplea.departamento_out,num_emp_supervisor,emplea.retiro_comercial,emplea.estado_legal,
+ emplea.genera_file_bco,emplea.observacion,emplea.tipo_documento,
+ emplea.gerentemarcas,emplea.alias,emplea.url_foto,emplea.enviar_encuesta,emplea.enviar_volante)
+
+
+ INSERT INTO adtb00021 VALUES (emplea.num_emp,null,null,emplea.nom1_emp,
+ emplea.cedula,p_sexo,emplea.fech_nac,null,
+ SUSER_SNAME(),GETDATE(),null,null)
+ { LET actualiza_datos =
+ "INSERT INTO cooperativa.dbo.adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,getdate(),?,?)"
+
+ PREPARE command_ins FROM actualiza_datos
+ EXECUTE command_ins USING
+ emplea.num_emp, emplea.departamento,
+ emplea.cod_puesto, emplea.nivel_emp,
+ emplea.nom1_emp, emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp, emplea.calle,emplea.casa_num,
+ emplea.barrio, emplea.urbanizacion,emplea.telefono,
+ emplea.cedula, emplea.serie,emplea.cod_nac,
+ emplea.estado_civil, emplea.fech_efec, emplea.fecha_salida, emplea.fech_nac,
+ emplea.tipo_sangre, emplea.sueldo_ac,
+ emplea.nomina, emplea.paga_seg, emplea.cuenta_no,
+ usuarios,
+ emplea.licencia, emplea.cod_seg3
+}
+ -- Informix (IFMX) ya no existe; el sistema fue migrado completo
+ -- a SQL Server. Este INSERT duplicado hacia la vieja base queda
+ -- deshabilitado (ver nota en MAIN).
+ {
+ SET CONNECTION "IFMX"
+ INSERT INTO adtb00003
+ (num_emp,departamento,cod_puesto,nivel_emp,nom1_emp,
+ nom2_emp, apell1_emp,apell2_emp,calle,casa_num,barrio,
+ urbanizacion,telefono,cedula,serie,cod_nac,estado_civil,
+ fech_efec,fecha_salida,fech_nac,
+ tipo_sangre,sueldo_ac,nomina,paga_seg, cuenta_no,us_crea,
+ fech_crea,licencia,cod_Seg3)
+ VALUES
+ (emplea.num_emp,emplea.departamento,
+ emplea.cod_puesto,emplea.nivel_emp,
+ emplea.nom1_emp,emplea.nom2_emp,emplea.apell1_emp,
+ emplea.apell2_emp,emplea.calle,emplea.casa_num,
+ emplea.barrio,emplea.urbanizacion,emplea.telefono,
+ emplea.cedula,emplea.serie,emplea.cod_nac,
+ emplea.estado_civil,emplea.fech_efec,emplea.fecha_salida,emplea.fech_nac,
+ emplea.tipo_sangre,emplea.sueldo_ac,
+ emplea.nomina,emplea.paga_seg,emplea.cuenta_no,usuarios,GETDATE(),
+ emplea.licencia,emplea.cod_seg3)
+ }
+
+ LET numero_msg = 1
+ CALL msg(numero_msg)
+
+ END IF
+ RETURN
+ END DIALOG
+END FUNCTION
+FUNCTION acepta1()
+ MENU
+ ON ACTION busca_foto
+ LET imagenom = "*.jpg *.png *.jpeg"
+ CALL ui.interface.frontcall("standard","openfile",[imagenom,"jpg","png jpg bmp gif","Busca Imagen"],filepath)
+ IF filepath IS NOT NULL THEN
+ LET filedestino = FGL_GETENV("IMAGENNOMINA")
+
+ LET filedestino = filedestino CLIPPED,"\\",emplea.num_emp USING "&&&&&",".jpg"
+ LET emplea.url_foto = filedestino
+ # CALL FGL_WINMESSAGE("W",filedestino,"stop")
+ # CALL fgl_getfile(filepath,filedestino)
+
+ LOCATE imagen_emp IN MEMORY
+
+ # LET filedestino = "./IMAGENES/", os.path.basename(filepath)
+ # CALL fgl_winmessage("info",filedestino,"info")
+ CALL fgl_getfile(filepath,filedestino)
+
+ CALL imagen_emp.readFile(filedestino)
+ LET emplea.foto_empleado = imagen_emp
+ # LET filedestino="F:\\MASTER\\IMAGENES\\NOMINA\\tmp.jpg"
+ LET filepath=filedestino
+ DISPLAY filepath TO fotos
+
+ END IF
+
+ ON ACTION CANCEL
+ LET numero_msg = 2
+ CALL msg(numero_msg)
+ CLEAR FORM
+ LET INT_FLAG = true
+ RETURN
+ ON ACTION guardar ATTRIBUTE(TEXT="Guardar",IMAGE="filesave")
+ SET CONNECTION "MSSQL"
+ UPDATE adtb00003 SET
+ foto_empleado = emplea.foto_empleado,
+ us_mod = usuarios,
+ fech_mod = getdate()
+
+ WHERE @num_emp = emplea.num_emp
+
+
+ LET numero_msg = 13
+ CALL msg(numero_msg)
+
+
+ END MENU
+END FUNCTION
+
+FUNCTION carga_herramientas()
+ DEFINE i INTEGER
+ SET CONNECTION "MSSQL"
+ CALL herramientas.clear()
+
+ DECLARE cur_herr CURSOR FOR
+ SELECT a.codigo,
+ RTRIM(ISNULL(b.descrip_esp,'')),
+ a.fecha,
+ a.documento,
+ a.cantidad
+ FROM adtb00057 a
+ LEFT JOIN irtb00002 b
+ ON CAST(b.cod_n AS VARCHAR(10)) + '-' +
+ CAST(b.cod_grupo AS VARCHAR(10)) + '-' +
+ CAST(b.cod_tipo AS VARCHAR(10)) + '-' +
+ CAST(b.cod_sec AS VARCHAR(10)) = a.codigo
+ WHERE a.num_emp = emplea.num_emp
+ ORDER BY a.codigo
+
+ LET i = 1
+ FOREACH cur_herr INTO herramientas[i].*
+ LET i = i + 1
+ END FOREACH
+ IF i > 1 THEN
+ CALL herramientas.deleteElement(i) -- quita el slot vac�o final
+ END IF
+
+ CALL muestra_herramientas()
+END FUNCTION
+
+FUNCTION muestra_herramientas()
+ DEFINE i, tope INTEGER
+ CLEAR s_herramientas.*
+ LET tope = herramientas.getLength()
+ IF tope > 12 THEN LET tope = 12 END IF
+ FOR i = 1 TO tope
+ DISPLAY herramientas[i].codigo,
+ herramientas[i].descripcion,
+ herramientas[i].fecha,
+ herramientas[i].documento,
+ herramientas[i].cantidad
+ TO s_herramientas[i].*
+ END FOR
+END FUNCTION
diff --git a/PROYECTO/nodir/noprmt016.4gl b/PROYECTO/nodir/noprmt016.4gl
index fbcb67e..6d1d320 100644
--- a/PROYECTO/nodir/noprmt016.4gl
+++ b/PROYECTO/nodir/noprmt016.4gl
@@ -42,9 +42,9 @@ FUNCTION noprmt016()
COMMAND "Activar"
" Cancela operacion"
CALL activo()
- COMMAND "Desactivar"
- " Cancela Operacion"
- CALL desactivo()
+ # 2026-10-05: la desactivacion se hace por la Accion de Personal
+ # (ADPRMT017, movimiento DESVINCULAR) para registrar fecha y causa
+ # de salida (indicador de rotacion). desactivo() queda sin uso.
COMMAND "Salir"
EXIT MENU
END MENU
diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl b/PROYECTO/otrodir/autorizacioncontado.4gl
index 3ec80be..2d38dfe 100644
--- a/PROYECTO/otrodir/autorizacioncontado.4gl
+++ b/PROYECTO/otrodir/autorizacioncontado.4gl
@@ -39,7 +39,7 @@ FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_a
xfecha_oc,psecvend,usuarios)
RETURNING xnum_req,valor_requisicion
END IF
- IF xnum_req IS NULL THEN
+ IF xnum_req IS NULL OR xnum_req = 0 THEN
SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
AND a.status_t IS NULL
END IF
diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005
new file mode 100644
index 0000000..3ec80be
--- /dev/null
+++ b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005
@@ -0,0 +1,90 @@
+FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_avance,xnum_doc,xtipo_doc,xnombre_cliente)
+ DEFINE pcotizacion,xnum_oc,pcondpago,ptipocliente,psecliente,xnum_req,psecvend,xnum_doc INT,
+ xfecha_oc,xtipo_Doc CHAR(10),
+ usuarios,xestado VARCHAR(50),
+ valor_cotizado,xmonto_avance,pagado,valor_requisicion DEC(12,2),
+ descripcion_estado,nombre_ven,xnombre_cliente,estado VARCHAR(100)
+
+
+ SELECT a.num_oc,a.tipo_cliente,a.sec_cliente,a.cond_pago,a.sec_vend, CONVERT(CHAR(10),a.fecha_oc,103)
+ INTO xnum_oc,ptipocliente,psecliente,pcondpago,psecvend,xfecha_oc
+ FROM prtb00012 a WHERE a.cotizacion_no = pcotizacion AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' NO AUTORIZADA POR SISTEMA, LA COTIZACION NO TIENE ORDEN, CONDICION AL CONTADO'
+ LET xestado = 'NO AUTORIZADA'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ RETURN
+ END IF
+
+ SELECT RTRIM(a.nom1_emp)+ISNULL(a.apell1_Emp,'') INTO nombre_ven
+ FROM adtb00003 a WHERE a.num_emp = psecvend
+
+ SELECT DISTINCT a.cotizacion_no FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
+ AND a.status_t IS NULL
+## CUANDO NO TIENE LA REQUISICION DE DESPACHOS
+ IF STATUS = NOTFOUND THEN
+ CALL requisiciondespacho(xnum_oc,ptipocliente,psecliente,Pcondpago,valor_cotizado,
+ xfecha_oc,psecvend,usuarios)
+ RETURNING xnum_req,valor_requisicion
+ END IF
+ IF xnum_req IS NULL THEN
+ SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
+ AND a.status_t IS NULL
+ END IF
+ LET estado ="LA REQUISICION ",xnum_req USING "<<<<<<<<", " NO AUTORIZADA"
+ UPDATE cctb00001 SET num_req = xnum_req
+ WHERE tipo_doc =xtipo_Doc AND num_doc = xnum_doc AND
+ tipo_cliente =ptipocliente AND
+ sec_cliente = psecliente
+
+
+ IF xmonto_avance +pagado >= valor_cotizado THEN
+ LET xestado = 'AUTORIZADA'
+
+ UPDATE cctb00025 SET estado =xestado,us_mod = 'MBS',fech_mod = getdate()
+ WHERE num_req = xnum_req
+
+
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ ELSE
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' NO AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO'
+ LET xestado = 'NO AUTORIZADA'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ END IF
+ RETURN estado
+END FUNCTION
\ No newline at end of file
diff --git a/PROYECTO/otrodir/autorizarequisicion.4gl b/PROYECTO/otrodir/autorizarequisicion.4gl
index 003128c..cc9dd56 100644
--- a/PROYECTO/otrodir/autorizarequisicion.4gl
+++ b/PROYECTO/otrodir/autorizarequisicion.4gl
@@ -6,13 +6,24 @@
ACTUALIZA LA REQUISICION DE DESPACHO
}
-FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura)
- DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total DEC(12,2),
+FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura,ztipocliente)
+ DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total,tasa,
+ monto_control DEC(12,2),
string_estado STRING,
tienefactura VARCHAR(2),
autoriza BOOLEAN,
- factura INT
+ factura,ztipocliente INT
+
+ # BUSCA TASA
+ SELECT a.ultima_tasa INTO tasa FROM vetb00060 a
+ WHERE a.tipo_cliente = ztipocliente
+ IF tasa > 1 THEN
+ LET monto_control = 1.60 * tasa
+ ELSE
+ LET monto_control = 100
+ END IF
+
LET valor_total = monto_req_autorizadas+monto_actual_req
IF tienefactura = "SI" THEN
LET string_estado = "ESTA REQUISICION NO FUE AUTORIZADA, TIENE FACTURAS VENCIDAS EL CLIENTE, UNA DE LAS FACTURAS ES ",factura USING "<<<<<<<<"
@@ -23,7 +34,7 @@ FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, li
#CUANDO EL CLIENTE TIENE SALDO A FAVOR
IF balance < 0 THEN
- IF ((balance * -1)) >=valor_total THEN
+ IF ((balance * -1))+monto_control >=valor_total THEN
LET autoriza = TRUE
LET string_estado = "ESTA REQUISICION ESTA AUTORIZADA, PORQUE EL BALANCE DE ",balance USING "##,###,###.##",
diff --git a/PROYECTO/otrodir/evaluaclientes.4gl b/PROYECTO/otrodir/evaluaclientes.4gl
index 8ce17e5..4dd0362 100644
--- a/PROYECTO/otrodir/evaluaclientes.4gl
+++ b/PROYECTO/otrodir/evaluaclientes.4gl
@@ -146,15 +146,15 @@ FUNCTION evaluaclientes
FOREACH busca_vencido INTO xaplicacion,xpendiente
IF xpendiente > 0 THEN
- SELECT MAX( a.tipo_doc),MAX(a.fecha_ven)
- INTO Xtipodoc,Xfechavence
- FROM cctb00001 a
- WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND
+ SELECT MAX( a.tipo_doc),MAX(a.fecha_ven)
+ INTO Xtipodoc,Xfechavence
+ FROM cctb00001 a
+ WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND
a.num_doc=xaplicacion AND
- a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and
- a.tipo_cliente=xtipocliente AND
+ a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and
+ a.tipo_cliente=xtipocliente AND
a.sec_cliente=xseccliente
-
+
LET dias = 0
IF xfechavence IS NULL THEN
CONTINUE FOREACH
@@ -174,8 +174,8 @@ FUNCTION evaluaclientes
EXIT FOREACH
END IF
END IF
- END IF
- # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias)
+ END IF
+ # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias)
END FOREACH
END IF
@@ -188,7 +188,7 @@ FUNCTION evaluaclientes
LET monto_cotizacion = 0
END IF
#FUNCTION PARAMETROS AUTORIZACIONES DESPACHO
- CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas) RETURNING autoriza,string_estado
+ CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas,xtipocliente) RETURNING autoriza,string_estado
SELECT a.correo INTO emailto FROM seg0003 a,seg0000 b
WHERE b.sec_vend = xsec_vend AND
diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl b/PROYECTO/otrodir/requisiciondespacho.4gl
index 37253d9..0106c47 100644
--- a/PROYECTO/otrodir/requisiciondespacho.4gl
+++ b/PROYECTO/otrodir/requisiciondespacho.4gl
@@ -18,37 +18,38 @@
pusuarios CHAR(50),
selec STRING,
txtmensaje VARCHAR(200),
- pubicacion VARCHAR(170)
+ pubicacion VARCHAR(170),
+ idx_max INT
- DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
- procesa CHAR(3),
- num_oc INT,
- fecha CHAR(10),
- cotizacion_no INT,
- tipo_cliente SMALLINT,
- sec_cliente INT,
- nombre CHAR(30),
- cantidad_1 DEC(12,5),
+ DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
+ procesa CHAR(3),
+ num_oc INT,
+ fecha CHAR(10),
+ cotizacion_no INT,
+ tipo_cliente SMALLINT,
+ sec_cliente INT,
+ nombre CHAR(30),
+ cantidad_1 DEC(12,5),
cantidad DEC(12,5),
- area SMALLINT,
- cod_n SMALLINT,
- cod_grupo SMALLINT,
- cod_tipo SMALLINT,
- cod_sec SMALLINT,
- descripcion CHAR(30),
- unidad_med CHAR(3),
- cantidad_ord1 DEC(12,5),
- cantidad_ord DEC(12,5),
- cantidad_pendiente DEC(12,5),
- precio DEC(12,2),
- descuento DEC(12,2),
- descvalor DEC(12,2),
- valor DEC(12,2)
+ area SMALLINT,
+ cod_n SMALLINT,
+ cod_grupo SMALLINT,
+ cod_tipo SMALLINT,
+ cod_sec SMALLINT,
+ descripcion CHAR(30),
+ unidad_med CHAR(3),
+ cantidad_ord1 DEC(12,5),
+ cantidad_ord DEC(12,5),
+ cantidad_pendiente DEC(12,5),
+ precio DEC(12,2),
+ descuento DEC(12,2),
+ descvalor DEC(12,2),
+ valor DEC(12,2)
END RECORD,
pitbis,xmonto,monto_cotizacion DEC(12,2),
estado_req varchar(30),
cuenta smallint
-
+
SET CONNECTION "MSSQL"
LET monto_cotizacion = xmonto
@@ -61,16 +62,37 @@
# PREPARE s FROM "SELECT @@IDENTITY"
- SELECT a.num_req INTO xnumreq FROM cctb00019 a
- IF xnumreq IS NULL THEN
- LET xnumreq = 0
- END IF
- LET xnumreq = xnumreq + 1
-
+ # 05/10/2026 - Error -268 PK_cctb00025 duplicada: el consecutivo se leia
+ # fuera de la transaccion y sin bloqueo (con RCSI dos usuarios leen el mismo
+ # num_req). Ahora se lee DENTRO de BEGIN WORK con UPDLOCK,HOLDLOCK y se
+ # compara contra MAX(cctb00025) por si el contador quedo atrasado.
+ WHENEVER ERROR CONTINUE
BEGIN WORK
+ PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_numreq INTO xnumreq
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
+ END IF
+ PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_maxreq INTO idx_max
+ IF xnumreq IS NULL THEN
+ LET xnumreq = 0
+ END IF
+ IF idx_max > xnumreq THEN
+ LET xnumreq = idx_max
+ END IF
+ LET xnumreq = xnumreq + 1
+
UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate()
# EXECUTE s INTO xnumreq
-
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
+ END IF
+
LET selec =
"INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
"SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
@@ -82,8 +104,8 @@ BEGIN WORK
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
LET estado_req = 'NO AUTORIZADA'
@@ -169,8 +191,8 @@ BEGIN WORK
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
@@ -208,8 +230,8 @@ BEGIN WORK
EXECUTE comando
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
@@ -221,8 +243,8 @@ BEGIN WORK
"NO DESPACHADA",xmonto)
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
COMMIT WORK
@@ -246,5 +268,6 @@ BEGIN WORK
# subject, procedimiento )
# CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP")
+ WHENEVER ERROR STOP
RETURN xnumreq,xmonto
END FUNCTION
diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005
new file mode 100644
index 0000000..37253d9
--- /dev/null
+++ b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005
@@ -0,0 +1,250 @@
+{
+ FUNCION : requisiciondespacho()
+ OBJETIVO : hacer la requisicion de despacho automatica
+ FECHA : 27/08/2011
+ DESARROLLADO POR : Ing. Juan Soto
+ }
+ SCHEMA smarmotech
+ FUNCTION requisiciondespacho(xnum_oc,xtipo_cliente,xsec_cliente,xcondpago,xmonto,xfecha_oc,
+ xsec_vend,pusuarios)
+
+ DEFINE xnum_oc INT,
+ xfecha_oc DATE,
+ xsec_vend,xkit INT,
+ xnumreq,xtipo_cliente,xsec_cliente,pcotizacion INT,
+ idx,xcondpago smallint,
+ chmensaje,procedimiento,cuerpo_correo,subject STRING,
+ vendedorEmail,nombre_vendedor CHAR(60),
+ pusuarios CHAR(50),
+ selec STRING,
+ txtmensaje VARCHAR(200),
+ pubicacion VARCHAR(170)
+
+ DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
+ procesa CHAR(3),
+ num_oc INT,
+ fecha CHAR(10),
+ cotizacion_no INT,
+ tipo_cliente SMALLINT,
+ sec_cliente INT,
+ nombre CHAR(30),
+ cantidad_1 DEC(12,5),
+ cantidad DEC(12,5),
+ area SMALLINT,
+ cod_n SMALLINT,
+ cod_grupo SMALLINT,
+ cod_tipo SMALLINT,
+ cod_sec SMALLINT,
+ descripcion CHAR(30),
+ unidad_med CHAR(3),
+ cantidad_ord1 DEC(12,5),
+ cantidad_ord DEC(12,5),
+ cantidad_pendiente DEC(12,5),
+ precio DEC(12,2),
+ descuento DEC(12,2),
+ descvalor DEC(12,2),
+ valor DEC(12,2)
+ END RECORD,
+ pitbis,xmonto,monto_cotizacion DEC(12,2),
+ estado_req varchar(30),
+ cuenta smallint
+
+ SET CONNECTION "MSSQL"
+
+ LET monto_cotizacion = xmonto
+
+ SELECT b.nom1_emp || ' '||b.apell1_emp,a.email
+ INTO nombre_vendedor,vendedorEmail
+ FROM seg0000 a,adtb00003 b
+ WHERE a.sec_vend = xsec_vend and
+ a.sec_vend = b.num_emp
+
+# PREPARE s FROM "SELECT @@IDENTITY"
+
+ SELECT a.num_req INTO xnumreq FROM cctb00019 a
+ IF xnumreq IS NULL THEN
+ LET xnumreq = 0
+ END IF
+ LET xnumreq = xnumreq + 1
+
+BEGIN WORK
+ UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate()
+ # EXECUTE s INTO xnumreq
+
+ LET selec =
+ "INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
+ "SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
+ "FROM prtb00031 a ",
+ " WHERE ",
+ " a.num_oc ='", xnum_oc USING "<<<<<<","'"
+ PREPARE xcctb34 FROM selec
+ EXECUTE xcctb34
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+ END IF
+
+ LET estado_req = 'NO AUTORIZADA'
+ DECLARE insertaReq CURSOR FOR
+ SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo,
+ b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio,
+ c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente,
+ d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto
+ FROM prtb00012 a,prtb00023 b,vetb00051 c,vetb00050 d
+ WHERE a.num_oc = b.num_oc and
+ a.cotizacion_no = c.cotizacion_no and
+ a.cotizacion_no = d.cotizacion_no and
+ a.num_oc = xnum_oc and
+ b.cod_n = c.cod_n and
+ b.cod_grupo = c.cod_grupo and
+ b.cod_tipo = c.cod_tipo and
+ b.cod_sec = c.cod_sec AND
+ b.area = c.area
+ UNION
+ SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo,
+ b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio,
+ c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente,
+ d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto
+ FROM prtb00012 a,prtb00023 b,vetb00031 c,vetb00050 d
+ WHERE a.num_oc = b.num_oc and
+ a.cotizacion_no = c.cotizacion_no and
+ a.cotizacion_no = d.cotizacion_no and
+ a.num_oc = xnum_oc and
+ b.cod_n = c.cod_n and
+ b.cod_grupo = c.cod_grupo and
+ b.cod_tipo = c.cod_tipo and
+ b.cod_sec = c.cod_sec AND
+ b.area = c.area
+
+
+ LET idx = 1
+ LET pcotizacion = 0
+ LET xmonto = 0
+ # DISPLAY " ESTOY EN ESTO ",xnum_oc
+ FOREACH insertareq INTO arr_requisicion[idx].num_oc,
+ arr_requisicion[idx].cotizacion_no,
+ idx,
+ arr_requisicion[idx].area,
+ arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].cantidad_ord1,
+ arr_requisicion[idx].precio,
+ arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].tipo_cliente,
+ arr_requisicion[idx].sec_cliente,
+ arr_requisicion[idx].nombre,
+ pitbis,xkit,
+ pubicacion
+
+ #DISPLAY " VOY PARA LA 26, en el foreach cantidad ",arr_requisicion[idx].cantidad_ord
+ IF arr_requisicion[idx].cantidad_ord IS NOT NULL THEN
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ IF arr_requisicion[idx].descvalor IS NULL THEN
+ LET arr_requisicion[idx].descvalor=0
+ END IF
+ LET arr_requisicion[idx].valor = (arr_requisicion[idx].cantidad *arr_requisicion[idx].precio) -
+ arr_requisicion[idx].descvalor
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor + (arr_requisicion[idx].valor * (pitbis/100))
+ LET xmonto = arr_requisicion[idx].valor + xmonto
+ INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec,
+ cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio,
+ descuento,descvalor,valor,us_crea,fech_crea,estado,id_kit)
+ VALUES (xnumreq,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no,
+ idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),estado_req,xkit)
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+
+ # EXECUTE xcctb34 USING xkit
+ # IF STATUS < 0 THEN
+ # ROLLBACK WORK
+ # RETURN xnumreq,xmonto
+ # END IF
+
+ END IF
+ LET idx = idx +1
+ END FOREACH
+
+ # CONTROL MONTO REQUISION
+ { IF xmonto > monto_cotizacion THEN
+ # ROLLBACK WORK
+
+ LET xnumreq = 0
+ LET xmonto=0
+ RETURN xnumreq,xmonto
+ END IF
+ }
+ IF pcotizacion IS NOT NULL THEN
+ SELECT DISTINCT a.cotizacion_no FROM vetb00022 a WHERE a.cotizacion_no = pcotizacion
+ IF STATUS <> NOTFOUND THEN
+ LET selec =
+ "INSERT INTO cctb00027 (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec, ",
+ "Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,",
+ "fech_crea)",
+ " SELECT '",xnumreq,"',etiqueta,'",xnum_oc,"',secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,lado_1,lado_2,lado_3,",
+ "ISNULL(cantidad,0),medida,ISNULL(cantidad,0),medida,'",pusuarios CLIPPED,"',getdate() FROM vetb00022 WHERE cotizacion_no= ",
+ pcotizacion USING "<<<<<<<<"
+
+ PREPARE comando FROM selec
+ EXECUTE comando
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+
+ END IF
+ END IF
+ INSERT INTO cctb00025 (num_req,fecha,sec_vend,sec_vend_aprobado,us_crea,fech_crea,
+ estado,fecha_autorizacion,estado_despacho,monto_req)
+ VALUES (xnumreq,today,xsec_vend,null,SUSER_NAME(),GETDATE(),estado_req,getdate(),
+ "NO DESPACHADA",xmonto)
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+ COMMIT WORK
+
+
+ IF xcondpago <> 4 and xcondpago<> 10 THEN
+ CALL entramensaje(xnumreq,pcotizacion,"A",pusuarios)
+ END IF
+ IF xcondpago = 4 OR xcondpago = 10 THEN
+ INSERT INTO cctb00029 (num_req,mensaje,us_crea,fech_crea) VALUES (xnumreq,pubicacion,pusuarios,getdate())
+ END IF
+ LET chmensaje = "NUMERO DE REQUISICION: ",xnumreq USING "<<<<<<"
+ LET subject = "AVISO REQUISICION DESPACHO NO. ",xnumreq USING "&&&&&&"
+ LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED
+ LET cuerpo_correo = "VENDEDOR : ",nombre_vendedor CLIPPED
+ LET cuerpo_correo = cuerpo_correo CLIPPED," FECHA REQUISICION : ",xfecha_oc USING "DD/MM/YYYY"
+ LET cuerpo_correo = cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",xnum_oc USING "&&&&&&"
+ LET cuerpo_correo = cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[1].nombre
+
+ # CALL envia_correo('rantonio@marmotech.com.do;jsantelises@marmotech.com.do',vendedorEmail,cuerpo_correo,
+ # subject, procedimiento )
+
+ # CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP")
+ RETURN xnumreq,xmonto
+END FUNCTION
diff --git a/PROYECTO/vedir/veconvierteorden.4gl b/PROYECTO/vedir/veconvierteorden.4gl
index ea4753d..3e9a5f4 100644
--- a/PROYECTO/vedir/veconvierteorden.4gl
+++ b/PROYECTO/vedir/veconvierteorden.4gl
@@ -55,6 +55,7 @@ FUNCTION convierteorden(
pprecio, monto_cotizacion DEC(12, 2),
pdesc DEC(8, 2),
pkit INT,
+ existe_oc INT,
pfecha_compromiso DATE
CALL STARTLOG("veconvierte.txt")
@@ -71,11 +72,8 @@ FUNCTION convierteorden(
LET pcantidad = 0
LET pcantidad1 = 0
- SELECT num_oc INTO ult_numero FROM prtb00020
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
+ # El consecutivo num_oc se toma DENTRO de la transaccion (ver BEGIN WORK)
+ LET ult_numero = 0
LET xsecvend_a = NULL
SELECT a.tipo_cliente,
@@ -122,8 +120,20 @@ FUNCTION convierteorden(
WHENEVER ANY ERROR STOP
BEGIN WORK
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada)
UPDATE prtb00020
- SET num_oc = ult_numero, us_crea = xusuario, fech_crea = GETDATE()
+ SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE()
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012
+ # (otro programa creo ordenes sin avanzarlo), salta al siguiente libre
+ LET existe_oc = 0
+ SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
IF xsecvend_a IS NULL OR xsecvend_a = 0 THEN
diff --git a/WEBSERVICES/orden_e.4gl b/WEBSERVICES/orden_e.4gl
index 62376e0..7456328 100644
--- a/WEBSERVICES/orden_e.4gl
+++ b/WEBSERVICES/orden_e.4gl
@@ -43,7 +43,7 @@ FUNCTION orden_e(sorden)
tipo_cliente INT
END RECORD,
s,url, selec,ret,res STRING,
- ult_numero,vendedor,i,ultimo_req INT,
+ ult_numero,vendedor,i,ultimo_req,existe_oc INT,
pprima,pitbis,valor_orden DEC(12,2),
puser,pfecha_crea VARCHAR(50),
cmd,r_cmd t_sync_cmd,
@@ -108,8 +108,15 @@ FUNCTION orden_e(sorden)
SELECT num_oc FROM marmotech.dbo.prtb00020"
PREPARE ordencmd FROM selec
- LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?,us_crea='ECOMMERCE',fech_crea = getdate()"
+ # Incremento atomico (bloquea la fila hasta el COMMIT); ver BEGIN WORK
+ LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ISNULL(num_oc,0)+1,us_crea='ECOMMERCE',fech_crea = getdate()"
PREPARE updateprtb20 FROM selec
+ LET selec = "SELECT COUNT(*) FROM marmotech.dbo.prtb00012 WHERE num_oc = ?"
+ PREPARE existeprtb12 FROM selec
+ LET selec = "SELECT MAX(num_oc) + 1 FROM marmotech.dbo.prtb00012"
+ PREPARE maxprtb12 FROM selec
+ LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?"
+ PREPARE fijaprtb20 FROM selec
LET selec = "SELECT cod_n,cod_grupo,cod_tipo,cod_sec FROM marmotech.dbo.iptb00002 WHERE codid = ?"
PREPARE buscaprod FROM selec
@@ -136,7 +143,8 @@ FUNCTION orden_e(sorden)
PREPARE buscacot FROM selec
- LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ?"
+ # Incremento atomico del consecutivo de cotizacion (bloquea la fila hasta el COMMIT)
+ LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ISNULL(cotizacion_no,0)+1"
PREPARE actualizacot FROM selec
@@ -179,22 +187,20 @@ FUNCTION orden_e(sorden)
BEGIN WORK
+ # CONSECUTIVOS ATOMICOS: primero se incrementa (UPDATE bloquea la fila hasta
+ # el COMMIT) y despues se lee; antes se leia y luego se escribia -> duplicados
+ EXECUTE actualizacot
EXECUTE buscacot INTO orden.encabezado.cotizacion_no
- IF orden.encabezado.cotizacion_no IS NULL THEN
- LET orden.encabezado.cotizacion_no = 0
- END IF
- LET orden.encabezado.cotizacion_no = orden.encabezado.cotizacion_no + 1
- EXECUTE actualizacot USING orden.encabezado.cotizacion_no
-
+ EXECUTE updateprtb20
EXECUTE ordencmd INTO ult_numero
-
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
-
- EXECUTE updateprtb20 USING ult_numero
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre
+ LET existe_oc = 0
+ EXECUTE existeprtb12 USING ult_numero INTO existe_oc
+ IF existe_oc > 0 THEN
+ EXECUTE maxprtb12 INTO ult_numero
+ EXECUTE fijaprtb20 USING ult_numero
+ END IF
LET orden.encabezado.num_oc = ult_numero
LET orden.encabezado.fecha_orden = TODAY
diff --git a/WEBSERVICES/tiendaonline/apiorden.4gl b/WEBSERVICES/tiendaonline/apiorden.4gl
index fa1daaa..720c90f 100644
--- a/WEBSERVICES/tiendaonline/apiorden.4gl
+++ b/WEBSERVICES/tiendaonline/apiorden.4gl
@@ -63,14 +63,16 @@ FUNCTION ordenApi(xorden)
CALL crearcliente(cliente.*) RETURNING xtipocliente,xseccliente
- SELECT ISNULL(a.num_oc,0) INTO ult_numero FROM prtb00020
-
- IF ult_numero = 0 THEN
- INSERT INTO prtb00020 (num_oc,us_crea) VALUES (ult_numero,orden.credenciales.usuario)
-
+ # CONSECUTIVO ATOMICO: incrementa prtb00020 (antes nunca lo avanzaba y solo
+ # leia +1 -> el contador quedaba atrasado y se duplicaba PK_prtb00012)
+ BEGIN WORK
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc,0) + 1, us_crea = orden.credenciales.usuario, fech_crea = GETDATE()
+ IF SQLCA.SQLERRD[3] = 0 THEN
+ INSERT INTO prtb00020 (num_oc,us_crea) VALUES (1,orden.credenciales.usuario)
END IF
- LET ult_numero = ult_numero + 1
-
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ COMMIT WORK
+
INSERT INTO prtb00012 (ventas,tipo_orden,num_oc,fecha,tipo_cliente,sec_cliente,telefono,direccion,ubicacion,
cerrada,cond_pago,itbis, valor_bruto,monto_desc,sub_total,neto,us_crea,fech_crea,num_oc_r)
VALUES ('1','ECOMMERCE',ult_numero,orden.encabezado.fecha_orden,xtipocliente,xseccliente,
diff --git a/WEBSERVICES/veconvierteorden.4gl b/WEBSERVICES/veconvierteorden.4gl
index cd57455..7eff0f2 100644
--- a/WEBSERVICES/veconvierteorden.4gl
+++ b/WEBSERVICES/veconvierteorden.4gl
@@ -37,6 +37,7 @@ END GLOBALS
FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,xtipo_orden,xcomentario,xnosolicitud,archivos)
DEFINE xcotizacion_no,xsecvend_a INT,
+ existe_oc INT,
actualizar STRING,
psolicitud_sql STRING,
sb_sol base.StringBuffer,
@@ -130,16 +131,21 @@ FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,x
xcotizacion_no)
RETURN 0,false
END IF
- SELECT num_oc INTO ult_numero FROM prtb00020
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
-
BEGIN WORK
- UPDATE prtb00020 set num_oc = ult_numero,
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada)
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1,
us_crea = xusuario,
fech_crea = GETDATE()
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre
+ LET existe_oc = 0
+ SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
DISPLAY "ACTUALICE ULTIMO NUMERO: ",ult_numero USING "<<<<<<<"," ",CURRENT
LET p_prtb14.observacion = xcomentario CLIPPED