Automation Tests

To create autamation tests is necessary the Katalon Studio tool. The tests need to be performed in PC and Chrome or Firefox driver is required

Installation

Create Project

  • Select “File>New>Project
Image 1 – Create Project
Image 2 – Project Settings

Create new test

  • Start recording
Image 3 – Demo Start Recording
  • Insert URL e click Record
Image 4 – Demo
  • Perform test
  • Save Script
Image 5 – Save script

Execute Test

To execute a test is required a installed browser (Chrome or Firefox)

Image 6 – Test Execution Options

Testing on server

To run the tests on the server you will need to place the project folder on the server.

The project has the following structure:

  • Data Files (Where test parameters are defined).
  • Object Repository (Where are the objects that the test recorder writes).
  • Profiles (User profiles are used to change setting according to user).
  • Reports (Katalon Studio automatically generates logs with information about the tests).
    • Note: Tos not load the server with unnecessary logs, you can add the following command to the script that runs the tests:
      • rm -rf [path]/SistemaTestes/Reports/202*
  • Script (Where test scripts are stored).
  • Test Cases.
  • Test Suites (Test set).

Command Line

To execute tests on server is necessary to run the following command: ./katalon {options}

Example:

./katalon -noSplash -runMode=console -projectPath=[project path] -retry=1 -retryStrategy=immediately -testSuitePath=”Test Suites/[test name]” -browserType=”Chrome (headless)” -executionProfile=”default” -apiKey=”********-****-****-****-************” –config -proxy.auth.option=NO_PROXY -proxy.system.option=NO_PROXY -proxy.system.applyToDesiredCapabilities=true

  • -runMode=console
    • Run on command line
  • -projectPath
    • Path to the project
  • -retry=1
    • Tests tries after fail
  • -retryStrategy:
    • In case of a test fail, indicates what is the strategy
      • Immediately:
        • After test fail execute immediately same test.
      • allExecutions:
        • Execute all tests.
      • failedExecutions:
        • Execute all tests, then execute failed ones
    • testSuitePath:
      • Path to the test suite
    • browserType:
      • Browser where test will be executed
    • executionProfile
      • Execution profile

You can find other command options in: https://docs.katalon.com/docs/katalon-runtime-engine/command-syntax-command-lineconsole-mode-execution

Sugestion

To simplify the execution of the katalon command we suggest to create a executable file containing the command.

vi [script name].sh

// Add katalon command

./katalon {options}

// To delete generated logs

rm -rf [path]/SistemaTestes/Reports/202*

And compile: chmod +x [script name].sh

To execute:

./[script name].sh

Important Considerations

As Katalon in server is in version 6 it’s important to have in mind some changes.

  • Change window size to 929×879
    • Create file “com.kms.katalon.core.webui.chrome (headless).properties” in folder “[Project Path]/settings/internal/”
    • Insert “{“HEADLESS_DRIVER”:{“args”:[“-window-size\u003d929,879″]}}”
  • Do to browser headless execution being faster sometimes elements are not visible at execution time, so the sugestion is to add the following command:
    • WebUI.delay(1)
  • Do not forget to change fields with data to the current data, use the function to get current date.
  • In case the command WebUI.setText(…) doens’t work, a set of alternative commands can be used:
    • WebUI.sendKeys(findTestObject(…), Keys.chord(Keys.CONTROL,’a’))
    • WebUI.sendKeys(findTestObject(…), Keys.chord(Keys.DELETE))
    • WebUI.sendKeys(findTestObject(…), texto)

Restricted content

Aqui ... só depois do login!

Jobs Queues – Best Practices

Objectives

This document reflects Isretail’s suggestions for the determination of work queues and the need that some jobs have to run in the same queue. This way we can avoid error situations, such as database locks, etc..

Determinação das filas de trabalho

The determination of the work queues is carried out in the transaction IG018:

Global → Instalattion → Base → Jobq Determination

Let’s segment what kind of jobs should run in the same queues. Priority information will be indicated in the summary table.

Queue A – Expedition

Objects->methods for which it is opportune to determine the dispatch queue:

  • FAPLOG102_dispatchContainers
  • FAPLOG201_closeProcDoc
  • FAPLOG510_checkDifQuant
  • FAPLOG520_createTravelDoc2Trans
  • FAPLOG520_createTravelDocBatch
  • FAPLOG520_printTravelDocBatch
  • FAPLOG520_printTravelDocument
  • FAPLOG940_dispatchVolumes
  • FAPLOG940_transferTourLeftovers

Queue B – Others

Objects->methods for which it is appropriate to determine a generic queue:

  • FAPLOG290_switchWarehouseStatistics
  • FAPLOG230_createArticleInvDocument
  • FAPLOG230_createArticleZeroDocument
  • FINADM03_timesJobsExtractor
  • FAPLOG290_loadContainerDiary
  • FAPLOG290_warehouseCostSpaceAnalisy
  • FINADM02_garbageCollection
  • FAPLOG290_warehouseMovementCostAnalisy
  • FINADM01_auxInterfaceIn
  • FAPLOG510_rePrintTransportationNote

Queue C – Processing

Objects->methods for which it is opportune to determine the processing queue:

  • FAPLOG220_completRequestProcessing
  • FAPLOG230_createDefiniteDocBatch
  • FAPLOG510_createTripBookBatch
  • FAPLOG401_autoPickProcRec
  • FAPLOG940_genExplodedRoutesBatch

Queue D – Posting

Objects->methods for which it is appropriate to determine the posting queue:

  • FAPLOG101_putAwayInRec
  • FAPLOG701_postGoodsDelivery
  • FAPLOG701_postGoodsReturn
  • FAPLOG701_postOtherMovements
  • FAPLOG910_confirmInventoryDocument
  • FAPLOG950_preInvPosting
  • FAPRFS002_closePhisicRecRF
  • FAPLOG601_putawayBySteps
  • FAPLOG310_autoAdminRec
  • FAPLOG101_closeIntMovement
  • FAPLOG410_recAdminBatch
  • FAPLOG103_resetRFqtt
  • FAPLOG701_postExternalDoc
  • FAPLOG101_closeExtMovement
  • FAPLOG401_endPhisicReceiving
  • FAPLOG910_prepareStock2Inventory

Resume

Below is the summary table with the queue and the suggested priority:

Object/Method JobQueuePriority
mandatory
Priority
suggested
FAPLOG102_dispatchContainersA90
FAPLOG201_closeProcDocA50
FAPLOG510_checkDifQuantA10
FAPLOG520_createTravelDoc2TransA90
FAPLOG520_createTravelDocBatchA50
FAPLOG520_printTravelDocBatchA50
FAPLOG520_printTravelDocumentA50
FAPLOG940_dispatchVolumesA90
FAPLOG940_transferTourLeftoversA90
FAPLOG290_switchWarehouseStatisticsB50
FAPLOG230_createArticleInvDocumentB50
FAPLOG230_createArticleZeroDocumentB50
FINADM03_timesJobsExtractorB50
FAPLOG290_loadContainerDiaryB50
FAPLOG290_warehouseCostSpaceAnalisyB50
FINADM02_garbageCollectionB50
FAPLOG290_warehouseMovementCostAnal
isy
B50
FINADM01_auxInterfaceInB50
FAPLOG510_rePrintTransportationNoteB50
FAPLOG220_completRequestProcessingC50
FAPLOG230_createDefiniteDocBatchC50
FAPLOG510_createTripBookBatchC50
FAPLOG401_autoPickProcRecC50
FAPLOG940_genExplodedRoutesBatchC50
FAPLOG101_putAwayInRecD50
FAPLOG701_postGoodsDeliveryD50
FAPLOG701_postGoodsReturnD50
FAPLOG701_postOtherMovementsD50
FAPLOG910_confirmInventoryDocumentD50
FAPLOG950_preInvPostingD50
FAPRFS002_closePhisicRecRFD50
FAPLOG601_putawayByStepsD50
FAPLOG310_autoAdminRecD50
FAPLOG101_closeIntMovementD50
FAPLOG410_recAdminBatchD50
FAPLOG103_resetRFqttD50
FAPLOG701_postExternalDocD50
FAPLOG101_closeExtMovementD50
FAPLOG401_endPhisicReceivingD50
FAPLOG910_prepareStock2InventoryD50

Create the flow classification

Instructions

1 – Create a new classification object in AG005.

The classification definition can be as desired; the other parameters should be configured like in the image.

2 – Next, create the classification groups. To do this, click on the button

In the image are the classification groups that were created in our system: JIT and STOCK.


3 – Afterwards, go to the AL101 to add a classification to the flows.

After selecting the flow or flows needed, choose the option shown in the image in yellow.

At last, link the flow with the classification.

Server: Rey

Hardware

Case ATXCooler Master MasterBox 5 Black – MCY-B5S1-KWYN-04Chiptec
FonteKolink KL-700MV2 700W Modular 80PLUS BronzeChiptec
MotherboardAsus Prime B450-Plus AMD B450 SKAM4Chiptec
CPUAMD Ryzen 7 3700X Octa-Core 3.6GHz c/ Turbo 4.4GHz SktAM4Castro Electronica
RAM2 x KINGSTON 32GB DDR4 2666Mhz CL16 HyperX FURY BlackChip7
Storage4 x Samsung 860 EVO Basic SSD 2TB SATA3Chip7
GraphicsPLACA GRAFICA NVIDIA GT 210 1GB DDR3 D-SUB DVI HDMI PCIE2Chip7
NetworkPLACA DE REDE 2X GIGABIT PCIE X1 TXA030, CHIPSET 82576Chip7

Software

15th June 2020:

  • Operative System: CentOs 7.8 (Release: centos-release-7-8.2003.0.el7.centos.x86_64)
  • Qemu

Installation Log

15th June 2020:

  • Centos minimal installation
  • yum update
  • yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils dejavu-lgc-sans-fonts
  • echo “net.ipv4.ip_forward = 1” | tee /etc/sysctl.conf
  • systemctl start libvirtd (or status to check if already active)
  • cp /etc/sysconfig/network-scripts/ifcfg-enp3s0 /etc/sysconfig/network-scripts/ifcfg-br0
  • in “ifcfg-enp3s0” just leave the follow:
    • TYPE=”Ethernet”
    • NAME=”enp3s0″
    • UUID=”<the uuid>”
    • DEVICE=”enp3s0″
    • ONBOOT=”yes”
    • BRIDGE=br0
    • BOOTPROTO=”static”
    • ZONE=public
  • in “ifcfg-br0” that is the bridge interface:
    • TYPE=”Bridge”
    • PROXY_METHOD=”none”
    • BROWSER_ONLY=”no”
    • BOOTPROTO=”static”
    • DEFROUTE=”yes”
    • IPV4_FAILURE_FATAL=”no”
    • IPV6INIT=”yes”
    • IPV6_AUTOCONF=”yes”
    • IPV6_DEFROUTE=”yes”
    • IPV6_FAILURE_FATAL=”no”
    • IPV6_ADDR_GEN_MODE=”stable-privacy”
    • DEVICE=”br0″
    • ONBOOT=”yes”
    • IPV6_PRIVACY=”no”
    • IPADDR=”192.168.45.230″
    • PREFIX=”24″
    • GATEWAY=”192.168.45.253″
    • DNS1=”1.1.1.1″
    • DNS2=”1.0.0.1″
    • ZONE=public
    • NETMASK=255.255.255.0
  • systemctl restart NetworkManager
  • to export vm definition: virsh dumpxml [domain] > [domain].xml
  • to import vm definition: virsh define [domain].xml
  • to adapt vm definition: virsh edit [domain]
  • to export vm:
    • qemu-img convert -O qcow2 [domain].qcow2 /root/[domain].qcow2
    • scp …
  • yum install wget

18th June 2020:

  • yum install usbutils

Oracle Server Installation

This document describe the installation process of Oracle Server 19c in a Linux Red Hat Advance Server 7.8 or CentOS 7.8 host.

This release of Oracle can be installed via RPM and so it’s much different – some how simpler – that it used to be.

Consider that, in this case, we choose as SID the code “EVE” and the server name is “dev.myisretail.eu”.

Steps to install

To performe Oracle Server installation the following steps must be performed:

  • wget https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
  • yum -y localinstall oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
  • download oracle-database-ee-19c-1.0-1.x86_64.rpm from oracle site
  • yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm

Create a database

A database can be created manually or via Oracle Database Assistant; since this tool is graphic we need to install the XWindows system.

To install the XWindows: yum groupinstall “X Window System” -y

To run Oracle Database Assistant it’s important to connect via ssh with the option “-X” or in putty with the flag “Enable X11 forwarding”: /opt/oracle/product/19c/dbhome_1/bin/dbca

Next
For specific parameters “Advance configuration” is the way to go. Since the specific part that we need is about datafile and are too many to be defined here: we choose typical. Password like “isretail” or too simples may rise a warning.
Complete.

Insert into .bash_profile of root and oracle user:

  • export TMP=/tmp
  • export TMPDIR=$TMP
  • export ORACLE_HOSTNAME=dev.myisretail.eu
  • export ORACLE_UNQNAME=EVE
  • export ORACLE_BASE=/opt/oracle
  • export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1
  • export ORACLE_SID=EVE
  • export PATH=/usr/sbin:$PATH
  • export PATH=$ORACLE_HOME/bin:$PATH
  • export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
  • export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
  • export NLS_LANG=american_america.utf8
  • export NLS_COMP=LINGUISTIC
  • export NLS_SORT=GENERIC_M_AI

Arrange configuration files:

listener.ora

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = EVE)
(ORACLE_HOME =/opt/oracle/product/19c/dbhome_1 )
(PROGRAM = extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=EVE)
(ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 )
(SID_NAME=EVE)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.45.223)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

sqlnet.ora

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

tnsnames.ora

EVE=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = dev.myisretail.eu)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = EVE)
)
)

Create tablespaces

In EVE it’s possible, via definition in action IG014 or “Parameters for tables creation”, choose specific settings for tables and indexed per table.

So if DBA decides, for example, that tables for entities should go in a specific tablespace:

To create the tablespaces that we need run the following statements:

CREATE TABLESPACE ADINDX DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rad_indx01.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_indx02.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_indx03.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_indx04.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE ADTABLE DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rad_table01.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table02.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table03.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table04.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table05.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table06.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rad_table07.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 640M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE MIINDX DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rmi_indx01.dbf’ SIZE 21G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rmi_indx02.dbf’ SIZE 30G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE MITABLE DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rmi_table01.dbf’ SIZE 13G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE TBS_I0011_LOB_16KB DATAFILE ‘/opt/oracle/oradata/EVE/datafile/tbs_i0011_16kb_lob_01.dbf’ SIZE 2048M AUTOEXTEND ON NEXT 128M MAXSIZE 32740M LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE TTINDX DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rtt_indx01.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rtt_indx02.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 32M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

CREATE TABLESPACE TTTABLE DATAFILE ‘/opt/oracle/oradata/EVE/datafile/rtt_table01.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rtt_table02.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rtt_table03.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED, ‘/opt/oracle/oradata/EVE/datafile/rtt_table04.dbf’ SIZE 32000M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING ONLINE EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64M BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO FLASHBACK ON;

Run Oracle configuration scripts

Important: the following scripts should never run in a database with running application and user logged in.

@$ORACLE_HOME/rdbms/admin/catalog.sql

@$ORACLE_HOME/rdbms/admin/catproc.sql

@$ORACLE_HOME/rdbms/admin/utlrp.sql

Create EVE user

We choose the password “eve2020” but you can obviously decide for anything.

CREATE USER eve IDENTIFIED BY eve2020;

GRANT IMP_FULL_DATABASE TO eve;

ALTER USER eve QUOTA UNLIMITED ON USERS;
ALTER USER eve QUOTA UNLIMITED ON MITABLE;
ALTER USER eve QUOTA UNLIMITED ON ADINDX;
ALTER USER eve QUOTA UNLIMITED ON ADTABLE;
ALTER USER eve QUOTA UNLIMITED ON MIINDX;
ALTER USER eve QUOTA UNLIMITED ON MITABLE;
ALTER USER eve QUOTA UNLIMITED ON TBS_I0011_LOB_16KB;
ALTER USER eve QUOTA UNLIMITED ON TTINDX;
ALTER USER eve QUOTA UNLIMITED ON TTTABLE;

EVE Installation Manual

This release of the manual describe the installation process in a Linux Red Hat Advance Server or CentOS versions 7.8 for:

  • Apache 2.4.58
  • PHP 7.0.33
  • Oracle 19.6
  • CouchBase 6.5.1

We assume that the media to install the OS was “minimal install” type.

Create OS user

To clearly identify our processes we are going to create a group and an user:

  • groupadd isretail
  • useradd -g isretail eve
  • passwd eve

Network

To avoid problems during installation or while running the system we suggest check the following configuration files:

  • /etc/hostname where you should be defined the server name
  • /etc/sysconfig/network-scripts/ifcfg-eth0/1/… where IP address is defined
  • /etc/hosts where can be defined the address for servers name when no complex DNS services are uses

These files are also to be remembered when a clone of a VM is the base of a new installation.

Firewall rules are also important if you prefer to mantain the firewall service active:

  • check in which zone we are (normally public) with firewall-cmd –get-active-zones
  • list the services with firewall-cmd –zone=public –list-services
  • add the services we need: firewall-cmd –zone=public –add-service=http
  • and make it permanent: firewall-cmd –zone=public –add-service=http –permanent

You may want to do the same for https service and other ports; for example if you need to open port 1235: firewall-cmd –zone=public –add-port=1235/tcp. Remeber to use “–permanent” for definition that must exist after reboot.

Update and Install packages

OS must be up to date and the following packages must be installed:

  • yum update
  • yum groupinstall “Development Tools” -y
  • yum install pcre-devel -y
  • yum install openssl-devel -y
  • yum install libxml2-devel -y
  • yum install libcurl-devel -y
  • yum install libjpeg-devel -y
  • yum install libpng-devel -y
  • yum install freetype-devel -y
  • yum install memcached -y
  • yum install pkgconfig -y
  • yum install openssl098e -y
  • yum install epel-release -y
  • yum install libmcrypt libmcrypt-devel -y
  • yum install mcrypt -y
  • yum install mhash -y
  • yum install wget -y

After this:

  • mkdir -p /root/install
  • cd /root/install

Apache installation

Please run the following commands from console:

  • wget –no-check-certificate https://dlcdn.apache.org/httpd/httpd-2.4.58.tar.gz
  • wget –no-check-certificate https://dlcdn.apache.org/apr/apr-1.7.4.tar.gz
  • wget –no-check-certificate https://dlcdn.apache.org/apr/apr-util-1.6.3.tar.gz
  • wget –no-check-certificate https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-2.5.0.tar.gz
  • tar -zxvf httpd-2.4.58.tar.gz
  • tar -zxvf apr-1.7.4.tar.gz
  • tar -zxvf apr-util-1.6.3.tar.gz
  • tar -zxvf expat-2.5.0.tar.gz
  • mv apr-1.7.4 httpd-2.4.58/srclib/apr
  • mv apr-util-1.6.3 httpd-2.4.58/srclib/apr-util
  • cd /root/install/expat-2.5.0
  • ./configure
  • make
  • make install
  • cd /root/install/httpd-2.4.58
  • ./configure –prefix=/www –with-mpm=prefork –enable-so –enable-rewrite –enable-vhosts-alias –enable-ssl –enable-modules=’unique-id’ –with-included-apr –with-expat=/usr/local
  • make
  • make install
  • vi /www/conf/httpd.conf to set some parameters:
    • Listen 192.168.45.223:80
    • Listen 192.168.45.223:1235 (if you need for voice)
    • LoadModule deflate_module modules/mod_deflate.so
    • LoadModule expires_module modules/mod_expires.so
    • LoadModule proxy_module modules/mod_proxy.so
    • LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
    • LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
    • LoadModule rewrite_module modules/mod_rewrite.so
    • User eve
    • Group isretail
    • ServerName [hostname]
    • before DocumentRoot “/www/htdocs”
      • <FilesMatch \.php$>
      • SetHandler “proxy:fcgi://127.0.0.1:9000”
      • </FilesMatch>
    • inside directory “/www/htdocs”
      • AllowOverride All
    • end of file:
        • ExpiresActive On
        • ExpiresByType image/x-icon “access plus 15 days”
        • ExpiresByType image/gif “access plus 15 days”
        • ExpiresByType image/png “access plus 15 days”
        • ExpiresByType image/jpg “access plus 15 days”
        • ExpiresByType image/jpeg “access plus 15 days”
        • ExpiresByType text/css “access plus 15 days”
        • ExpiresByType application/javascript “access plus 15 days”
      • </IfModule>
        • SetOutputFilter DEFLATE
        • DeflateCompressionLevel 9
        • BrowserMatch ^Mozilla/4 gzip-only-text/html
        • BrowserMatch ^Mozilla/4.0[678] no-gzip
        • BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        • SetEnvIfNoCase Request_URI (?:gif|jpe?g|png|swf)$ no-gzip dont-vary
      • </IfModule>
        • ProxySet timeout=600000
        • ProxyPassMatch ^/(..php(/.)?)$ fcgi://127.0.0.1:9000/www/htdocs/$1
        • ProxyPassMatch ^/(status?)$ fcgi://127.0.0.1:9000/www/htdocs/$1
        • SetEnvIf Authorization “(.)” HTTP_AUTHORIZATION=$1
        • SetEnvIf Content-Type “(.)” HTTP_CONTENT_TYPE=$1
        • SetEnvIf Accept “(.*)” HTTP_ACCEPT=$1
      • </IfModule>
      • ExtendedStatus On
        • SetHandler server-status
        • Order Deny,Allow
        • Deny from all
        • Allow from all
      • </Location>
      • AddDefaultCharset Off

Database connections

Before install PHP engine we need to get a client for the database we are going to access.

Oracle client

This step is necessary if you want to access an Oracle Database Server installed in a different machine. If database and application servers are the same you don’t need to.

First obtain from Oracle site the client and the development libraries, then install.

  • wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm
  • wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-devel-19.6.0.0.0-1.x86_64.rpm
  • rpm -ivh oracle-instantclient19.6*
  • create a tnsnames.ora file in /usr/lib/oracle/19.6/client64/network/admin

MySQL client

Since PHP 5.4 there is no need to install MySQL client libraries since the MySQL native driver is embedded in the PHP extension.

PHP and modules

The version we are going to install is 7.0.33

Some changes to the configure command suggested may be needed; for example:

  • –with-oci8=instantclient,/usr/lib/oracle/19.6/client64/lib if you are using the instant client from oracle
  • –with-mysqli instead of –with-oci8 if you are using MySQL instead of Oracle

In our case we have Oracle Server in the same machine; so:

PHP

  • wget https://www.php.net/distributions/php-7.0.33.tar.gz
  • tar -zxvf php-7.0.33.tar.gz
  • cd php-7.0.33
  • ./configure –prefix=/usr/local –with-libdir=/lib64 –enable-fpm –with-xmlrpc –with-iconv –enable-sockets –enable-mbstring –with-curl –with-gd –enable-soap –with-freetype-dir=/usr/local/lib –with-openssl –enable-pcntl –enable-posix –enable-shmop –enable-sysvsem –enable-sysvshm –enable-sysvmsg –enable-sigchild –enable-zip –enable-opcache –with-jpeg-dir=/usr/local/lib –with-png-dir=/usr/local/lib64 –with-zlib-dir=/usr/local/lib64 [–with-oci8=$ORACLE_HOME]
  • make && make install
  • cp php.ini-development /usr/local/lib/php.ini and adapt; about usefull settings:
    • max_execution_time = 300
    • max_input_vars = 10000
    • memory_limit = 256M
    • error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE
    • display_errors = Off
    • ignore_repeated_errors = On
    • error_log = /www/logs/php_errors.log
    • upload_max_filesize = 4M
    • session.gc_maxlifetime = 3600 (very important since it is used in EVE to decide after how much inactivity an user should re-login)
    • output_buffering = Off
  • cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
  • chmod +x /etc/init.d/php-fpm
  • cp ./sapi/fpm/status.html /www/htdocs/
  • chown eve.isretail -R /www/htdocs/
  • chkconfig php-fpm on
  • cd /usr/local/etc/
  • cp php-fpm.conf.default php-fpm.conf
  • vi php-fpm.conf and adapt; some settings that can be useful:
    • error_log = log/php-fpm.log
    • log_level = notice
    • process.max = 128
  • cd /usr/local/etc/php-fpm.d
  • cp www.conf.default www.conf
  • vi www.conf; some settings that can be useful:
    • user = eve
    • group = isretail
    • pm.max_children = 35
    • pm.start_servers = 5
    • pm.max_requests = 100
    • pm.status_path = /status
    • slowlog = /tmp/$pool.log.slow
    • request_slowlog_timeout = 3s
    • env[HOSTNAME] = $HOSTNAME
    • env[PATH] = /usr/local/bin:/usr/bin:/bin
    • env[TMP] = /tmp
    • env[TMPDIR] = /tmp
    • env[TEMP] = /tmp
    • env[ORACLE_HOME] = /opt/oracle/product/19c/dbhome_1
    • env[LD_LIBRARY_PATH] = /opt/oracle/product/19c/dbhome_1/lib:/lib:/usr/lib
    • env[NLS_LANG] = american_america.UTF8
    • env[NLS_COMP] = LINGUISTIC
    • env[NLS_SORT] = GENERIC_M_AI
    • env[DOCUMENT_ROOT] = /www/htdocs

At this point if we start php-fpm and we use a phpinfo.php page … it should works.

To start php-fpm: systemctl start php-fpm.service

To restart php-fpm: systemctl restart php-fpm.service

To stop php-fpm: systemctl stop php-fpm.service

opcache

In production environment remember to enable opcache from php.ini.

echo zend_extension=opcache.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i | grep opcache and some output should appear:

opcache.blacklist_filename => no value => no value
opcache.consistency_checks => 0 => 0
opcache.dups_fix => Off => Off
opcache.enable => On => On
opcache.enable_cli => Off => Off
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.fast_shutdown => 0 => 0
opcache.file_cache => no value => no value

igbinary

  • cd /root/install
  • wget https://pecl.php.net/get/igbinary-3.1.2.tgz
  • tar -zxvf igbinary-3.1.2.tgz
  • cd igbinary-3.1.2
  • phpize
  • ./configure CFLAGS=”-O2 -g” –enable-igbinary –with-php-config=/usr/local/bin/php-config
  • make && make install
  • echo extension=igbinary.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep igbinary and the output should be:

igbinary
igbinary support => enabled
igbinary version => 3.1.2
igbinary APCu serializer ABI => no
igbinary session support => yes
igbinary.compact_strings => On => On
Registered serializer handlers => php_serialize php php_binary igbinary

memcache

  • cd /root/install
  • wget https://pecl.php.net/get/memcache-4.0.5.2.tgz
  • tar -zxvf memcache-4.0.5.2.tgz
  • cd memcache-4.0.5.2
  • phpize
  • ./configure
  • make && make install
  • echo extension=memcache.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep memcache and the output should be:

memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 32768 => 32768
memcache.compress_threshold => 20000 => 20000
memcache.default_port => 11211 => 11211
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => consistent => consistent
memcache.lock_timeout => 15 => 15
memcache.max_failover_attempts => 20 => 20
memcache.prefix_host_key => 0 => 0
memcache.prefix_host_key_remove_subdomain => 0 => 0
memcache.prefix_host_key_remove_www => 1 => 1
memcache.prefix_static_key => no value => no value
memcache.protocol => ascii => ascii
memcache.redundancy => 1 => 1
memcache.session_prefix_host_key => 0 => 0
memcache.session_prefix_host_key_remove_subdomain => 0 => 0
memcache.session_prefix_host_key_remove_www => 1 => 1
memcache.session_prefix_static_key => no value => no value
memcache.session_redundancy => 2 => 2
memcache.session_save_path => no value => no value

xdebug

Warning! This extension must always be declared after opcache when enabled.

  • cd /root/install
  • wget https://xdebug.org/files/xdebug-2.7.2.tgz
  • tar -zxvf xdebug-2.7.2.tgz
  • cd xdebug-2.7.2
  • phpize
  • ./configure –enable-xdebug
  • make && make install
  • echo zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep xdebug and the output should be:

xdebug
xdebug support => enabled
xdebug.auto_trace => Off => Off
xdebug.cli_color => 0 => 0
xdebug.collect_assignments => Off => Off
xdebug.collect_includes => On => On
xdebug.collect_params => 0 => 0
xdebug.collect_return => Off => Off
xdebug.collect_vars => Off => Off
xdebug.coverage_enable => On => On
xdebug.default_enable => On => On
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.extended_info => On => On
xdebug …

xls2csv – catdoc

To import xls files we need the catdoc package:

  • yum install catdoc -y

Couchbase

With EVE we are going to use more and more NoSQL databases: the immediate purpose is performance; but in the future we cannot exclude some advantages of this kind of approach: geographical distribution, smaller DB server and upgrade on running environments.

The community edition is enough to work with; since we are in a development environment and we can legally install the enterprise edition that give some tools about query analysis and monitoring we will use this one.

  • wget https://packages.couchbase.com/releases/6.5.1/couchbase-server-enterprise-6.5.1-centos7.x86_64.rpm
  • yum install couchbase-server-enterprise-6.5.1-centos7.x86_64.rpm -y
  • firewall-cmd –zone=public –add-port=8091-8092/tcp –permanent
  • firewall-cmd –zone=public –add-port=4396/tcp –permanent
  • firewall-cmd –zone=public –add-port=21100-21199/tcp –permanent
  • firewall-cmd –zone=public –add-port=11209-11211/tcp –permanent
  • firewall-cmd –reload
  • in the browser go to: http://192.168.45.223:8091/ui/index.html
Setup New Cluster
Choose a cluster name and a password: for example “EVE” and “isretail”
Accept terms and go to “Configure Disk…”
Example of configuration 1. Don’t use 127.0.0.1 but the host name or the ip address.
Example of configuration 2

After this step you can add the user “eve” from the dashboard and assign a password.

Now the php client:

  • vi /etc/yum.repos.d/couchbase-Base.repo

[couchbase-server]
name=Couchbase Server
baseurl=http://packages.couchbase.com/releases/couchbase-server/enterprise/rpm/$releasever/$basearch/
enabled=1
s3_enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

[couchbase-server-community]
name=Couchbase Server (Community Edition)
baseurl=http://packages.couchbase.com/releases/couchbase-server/community/rpm/$releasever/$basearch/
enabled=1
s3_enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

[couchbase-sdk]
name = Couchbase SDK package repository
baseurl = http://packages.couchbase.com/rpm/$releasever/$basearch
enabled = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/GPG-KEY-COUCHBASE-1.0

  • yum update
  • cd /root/install
  • yum install libcouchbase-devel libcouchbase2-libevent -y
  • wget https://pecl.php.net/get/couchbase-2.6.2.tgz
  • tar -zxvf couchbase-2.6.2.tgz
  • cd couchbase-2.6.2
  • phpize
  • ./configure
  • make && make install
  • echo extension=couchbase.so >> /usr/local/lib/php.ini

After restart, to verify if ok, execute the command php -i |grep couchbase and the output should be:

couchbase
couchbase support => enabled
libcouchbase runtime version => 2.10.6 (git: 61e274aae48b6edeecb081afec843dbe31d72790)
libcouchbase headers version => 2.10.6 (git: 61e274aae48b6edeecb081afec843dbe31d72790)
couchbase.decoder.json_arrays => 0 => 0
couchbase.encoder.compression => off => off
couchbase.encoder.compression_factor => 0.0 => 0.0
couchbase.encoder.compression_threshold => 0 => 0
couchbase.encoder.format => json => json
couchbase.log_level => WARN => WARN
couchbase.pool.max_idle_time_sec => 60 => 60

Automation tests

  • yum install java-1.8.0-openjdk
  • wget https://github.com/katalon-studio/katalon-studio/releases/tag/v6.3.2
  • tar -xf Katalon_Studio_Linux_64-6.3.2.tar.gz
  • wget wget http://www.isretail.eu/wp-content/uploads/download-manager-files/google-chrome-stable-76.0.3809.132-1.x86_64.rpm
  • yum install google-chrome-stable-76.0.3809.132-1.x86_64.rpm

Extras

Usefull staff.

syntax highlight in vi

  • yum -y install vim-enhanced
  • echo alias vi=vim >> /etc/profile.d/vi.sh

Analyze Picking Zeros

Purpose

Analyze the picking zeros given by the operators during normal picking, i.e., stock and JIT, including complete containers picking.

During picking, when an operator gives a zero, i.e., when not all merchandise is picked by the requested quantity, WPMS logs that information, so it can be analyzed on a new report located on

Application → Warehouse Managment → Goods Issue → Inquery → Analysis Picking Zeros (AL382).

This new report should display several info’s such as the article, quantity requested, quantity not picked, picked quantity, operator, final site, container, work unit (if available), etc.

Picking Complete Containers

On the following image there is a traditional report to pick a complete container. In this case the operator will give a zero, so the WPMS will log that zero, so it can be analyzed afterwards on the new report.

The action is registered and it can be seen and analyzed on the new report.

Application → Warehouse Managment → Goods Issue → Inquery → Analysis Picking Zeros (AL382)

Normal Picking

In the following example on normal picking, when the article is picked with partial quantities (if it is defined on work unit type to allow partial quantities), that will not be registered as a given zero and the remaining quantity will be requested on a new report action, as usual.

Only at this point, if the operator gives a zero, then the action is registered as a given zero, and it can be analyzed immediately on AL382.

Back Picking

This new log will also work on back picking work units, because the main reason to register this type of situation is to pick less than requested, so this feature also predicts back picking zeros.

In the example above, the operator decide to pick the article in teh end of the work unit, so he chooses back picking feature. After all articles picked, the article chosen to be in the back picking pops up.

Once again only at this point, if the operator gives a zero, then the action is registered as a given zero, and it can be analyzed immediately on AL382.

Password recovery

The password recovery module works by sending an email to the user with a recovery code, so that his identity can be validated: for this is necessary that the address is defined in the user’s own contacts.

The creation or modification of a user’s contact is possible in:

Application → Installation → Security → Users [IS001]

After selecting the desired user, it is possible to list, create or modify the user’s contacts in the User Contacts button. For this module to work correctly, it is necessary that there is a contact type “General” with the Email field filled with a valid email address.

This is the necessary conditions for the password recovery module work correctly.

Picking flow JIT

Objectives

The goal of this guide is to provide a detailed view of the new development about reception picking flow JIT.

Setup the environment

Add use type

Global → Global Application → Application → Master Data → Tailoring → Spaces → Spaces → ​ Use Types [AD027]

Add a new use type with the definitions below:

Add space

Global → Global Application → Application → Warehouse Management → Spaces → Spaces Definitions [AD003]

Add a new space with the definitions below:

Add store station determination

Global → Global Application → Application → Tailoring → Determinations Operational Definitions → Store Station Determination [AL175]

Select By Warehouse, Flow

And add a new with definitions below:

Add space assigned permanently to sites

Global → Global Application → Application → Warehouse Management → Operational Definitions → ​ Spaces Assigned Permanently to Sites [AL075]

Add a new space assigned permanently to sites with definitions below:

Add work unit type determination

Global → Global Application → Application → Warehouse Management → Operational Definitions → Determinations → ​ Work Unit Type Determination [AL092]

Select the option below:

And add a new with the definitions below:

Add a new work unit

Global → Global Application → Application → Warehouse Management → Tailoring → Actions and Working Units → ​ Work Unit Management [AL118]

Add a new work unit with definitions below:

Work Unit

Declare the Containers to Distribute: Declare labels to select containers.

Container Contents List: Press “CONF” to continue

Distribute and Confirm with Target Label: Choose the label and the quantities and press “conf”.

Declaration of container type: The suggested container type is the best fit. Select the container and press “conf”. ​Note:​ the container selection only appears if the label declared is new.

Required Declaration of AT’s: Select the AT Base and press “CONF”.

Check residual quantity: If everything’s ok, introduce 1, press “CONF” and the work unit is done.