Subscribe to continue reading
Subscribe to get access to the rest of this post and other subscriber-only content.
Subscribe to get access to the rest of this post and other subscriber-only content.
Al momento de realizar cualquier proyecto, ya sea desarrollo de software, construcción , administración de servicios de taller de automóviles, o actividades del día a día es necesario saber administrarnos y desde antes tener el estimado de las horas e insumos que vamos a consumir en las tareas a realizarse.

También es necesario verificar a través de los diferentes reportes el avance de las actividades del proyecto, así como quien es el responsable de cada actividad.
Posteriormente podremos ver el rendimiento por empleado y ver las horas trabajadas en un periodo de tiempo seleccionado
Con este sistema podremos crear un proyecto, separarlo por etapas, conceptos y actividades, asignarle a la actividad a un empleado, un tiempo o cantidad estimada y conforme se avanza en la actividad se va registrando el tiempo o la cantidad real, se le asigna costo ligando a un producto.

Una vez registrada las actividades podemos imprimir en PDF un presupuesto en la que nos muestra primeramente un resumen del costo por etapa en la primera hoja y en las siguientes nos mostrará todo el proyecto desglosado


También tenemos una tabla dinámica para poder leer la información y organizarla de manera que más cómoda al lector, por ejemplo, en la siguiente imagen vemos el avance por proyecto separado por concepto

Ahora lo importante, como ejecutar la consulta personalizada para leer la información
Hacer la siguiente petición y entre paréntesis ponemos el código de la consulta
https://localhost:50000/b1s/v1/SQLQueries('sql02')/ListEn el body ponemos el JSON con los parámetros
{
"ParamList": "listaPrecios=6"
}
Quedando de la siguiente forma

Como no todo queda a la primera o se tenga que modificar por cualquier razón la consulta personalizada, les dejo el ejemplo básico de como modificar una consulta personalizada
Para modificar la consulta creada anteriormente hacemos la siguiente petición de tipo PATH
https://localhost:50000/b1s/v1/SQLQueries('sql02')En el body metemos el JSON ya modificado
{
"SqlCode":"sql02",
"SqlName":"listPrices",
"SqlText":"select a.ItemCode
,a.PriceList
,a.Price
,b.ListName
,z.[ItemName]
from [ITM1] a
, [OPLN] b
, [OITM] z
where a.[PriceList] =:listaPrecios
and a.[Price] <>0
AND a.[PriceList] = b.[ListNum]
AND a.[ItemCode] = z.[ItemCode]
",
"ParamList" : "listaPrecios"
}Quedaría de la siguiente forma

En el service layer también tenemos la forma para crear nuestras consultas personalizadas, aunque tiene algunas limitaciones pero nos pueden ser muy útiles.
Para ello utilizaremos SQLQueries y el ejemplo básico seria de la siguiente manera
Hacemos la petición POST
https://localhost:50000/b1s/v1/SQLQueriesEn el body le metemos el contenido JSON
{
"SqlCode":"sql02",
"SqlName":"listPrices",
"SqlText":"select ItemCode,PriceList
from [ITM1]
where [PriceList] =:listaPrecios ",
"ParamList" : "listaPrecios"
}Al final quedaría de la siguiente forma

Para traer la el catalogo de listas de precios usaremos la siguiente URL en GET
https://localhost:50000/b1s/v1/PriceLists?$select=PriceListNo,PriceListName&$filter=Active eq 'tYES' and substringof('TRIT',PriceListNo) or substringof('TRIT',PriceListName)Como pueden observar usamos la funcion substringof como el equivalente al like de SQL
Quedaría mas o menos de esta forma

Ahora la función quedaría de la siguiente forma
/* =============================================
MOSTRAR
============================================= */
static public function ctrMostrar($cookie, $filtro) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "50000",
CURLOPT_URL => "https://localhost:50000/b1s/v1/PriceLists?%24select=PriceListNo%2CPriceListName&%24filter=Active%20eq%20'tYES'%20%20and%20substringof('$filtro'%2CPriceListNo)%20or%20substringof('$filtro'%2CPriceListName)",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_COOKIE => $cookie,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Accept: */*",
"User-Agent: Thunder Client (https://www.thunderclient.com)"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return "cURL Error #:" . $err;
} else {
return json_decode($response);
}
$response = json_decode($response);
return $response;
}Y bien saben el resto es historia
Lo que haremos en esta ocasión en hacer la consulta al service layer para usarlo en un Select2 vía AJAX y PHP primera mente usaremos la siguiente petición de tipo GET URL
https://localhost:50000/b1s/v1/Users?$select=InternalKey,UserCode,Group,UserName&$filter=Group eq 'ug_Regular' and substringof('Julio',UserName) or substringof('Julio',UserCode)&$orderby=InternalKeyComo ven usamos la función substringof que seria el equivalente en SQL al like ‘%%’
Quedando mas o menos asi

Ahora transformamos la petición a una función de PHP en la que recibimos la cookie y el filtro para buscar los usuarios
/* =============================================
MOSTRAR
============================================= */
static public function ctrMostrar($cookie, $filtro) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "50000",
CURLOPT_URL => "https://localhost:50000/b1s/v1/Users?%24select=InternalKey%2CUserCode%2CGroup%2CUserName&%24filter=Group%20eq%20'ug_Regular'%20%20and%20substringof('$filtro'%2CUserName)%20%20or%20substringof('$filtro'%2CUserCode)&%24orderby=InternalKey",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_COOKIE => $cookie,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Accept: */*",
"User-Agent: Thunder Client (https://www.thunderclient.com)"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return "cURL Error #:" . $err;
} else {
return json_decode($response);
}
$response = json_decode($response);
return $response;
}
Ahora en el archivo de consulta se usaría de la siguiente forma, hacemos el Login, consultamos, hacemos el Logout, y formamos la cadena JSON de la siguiente forma
$busqueda = $_POST["searchTerm"];
$conexionSAP = ServiceLayer::login();
$cookie = "B1SESSION=" . $conexionSAP->SessionId . "; ROUTEID=.node1";
$usuariosSAP = ControladorUsuariosSAP::ctrMostrar($cookie, $busqueda);
$usuariosSAPLista = $usuariosSAP->value;
$usuariosSAP = ServiceLayer::logout($cookie);
$jsonVariable = ' { "results": [';
foreach ($usuariosSAPLista as $keyUsuarios1 => $valueUsuarios1) {
$jsonVariable .= ' {
"id": "' . $valueUsuarios1->UserCode . '",
"text": "' . utf8_encode($valueUsuarios1->UserCode . " - " . $valueUsuarios1->UserName) . '"
},';
}
$jsonVariable = substr($jsonVariable, 0, -1);
$jsonVariable .= ' ]
}';
echo ($jsonVariable);Y listo ya esto obtenemos los datos requeridos
Bien ahora vamos a mostrar como hacer el logout, es decir, cerrar la sesión, vamos hacer la petición tipo GET con la siguiente URL
https://localhost:50000/b1s/v1/LogoutQuedando de la siguiente forma

La función en PHP seria la siguiente
static public function logout($cookie) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "50000",
CURLOPT_URL => "https://hanagusa:50000/b1s/v1/Logout",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_COOKIE => $cookie,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Accept: */*",
"User-Agent: Gisa Web Client (https://www.thunderclient.com)"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return "cURL Error #:" . $err;
} else {
return $response;
}
}Ya al momento de usarlo en PHP desde el Login has ta el Logout seria de la siguiente forma
$conexionSAP = ServiceLayer::login();
// Construimos la cookie
$cookie = "B1SESSION=" . $conexionSAP->SessionId . "; ROUTEID=.node1";
$sucursalesSAP = ControladorSucursalSAP::ctrMostrar($cookie);
$sucursalesSAP = $sucursalesSAP->value;
// Cerramos la session enviando la Cookie
$conexionSAP = ServiceLayer::logout($cookie);
A continuación pondremos a su disposición algunos ejemplos de peticiones al Service Layer del SAP así como el código en PHP
El primer paso para comenzar usar el service layer es lógicamente hacer el login para posteriormente hacer las consultas necesarias
En la extensión Thunder Client abrimos la petición de tipo POST y ponemos la siguiente URL
https://localhost:50000/b1s/v1/LoginLógicamente en donde dice localhost va la IP de su servidor
En la sección de Body elegimos el contenido JSON y le ponemos el siguiente código con los datos de inicio de sesión
{
"CompanyDB": "TEST_GUSA",
"Password": "sap123",
"UserName": "LMPROGRAM"
}

Quedaría tal y como se ve en la imagen de arriba
Como resultado dará el código que se muestra abajo
{
"odata.metadata": "https://localhost:50000/b1s/v1/$metadata#B1Sessions/@Element",
"SessionId": "1d66ff02-6169-11ef-c000-000c2949cf9d-139784632008704-3563",
"Version": "1000201",
"SessionTimeout": 30
}
Ahora creamos nuestra función para hacer esa petición desde el código PHP
static public function login() {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "50000",
CURLOPT_URL => "https://localhost:50000/b1s/v1/Login",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\n \"CompanyDB\": \"BASE DE DATOS PRUEBA\",\n \"Password\": \"PASWORD\",\n \"UserName\": \"NOMBREUSUARIO\"\n}\n",
CURLOPT_HTTPHEADER => [
"Accept: */*",
"Content-Type: application/json",
"User-Agent: (https://www.thunderclient.com)"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return "cURL Error #:" . $err;
} else {
return json_decode($response);
}
}Y listo ya con eso iniciamos sesión desde PHP, y nos regresa las variables necesarias para crear la cookie
Creado con WordPress & Tema de Anders Norén