-10 (= 10.5.0-1ubuntu1~20.04) Priority: extra Section: universe/devel Source: gcc-10-cross (6ubuntu6) Origin: Ubuntu Maintainer: Ubuntu Core developers Original-Maintainer: Debian GCC Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1263 Provides: libsfstdc++6-armhf-dcv1 Depends: gcc-10-cross-base (>= 10.5.0-1ubuntu1~20.04), libsfgcc-s1-armhf-cross (>= 10.5.0-1ubuntu1~20.04cross1), libc6-armel-cross (>= 2.31) Filename: pool/universe/g/gcc-10-cross/libsfstdc++6-armhf-cross_10.5.0-1ubuntu1~20.04cross1_all.deb Size: 399556 MD5sum: a16a382147413354656f46e68fcf942e SHA1: b1f05fd4741aeeadc8b34582cb1d5792980d8c61 SHA256: 97b9bec8cf9492c51f0e097fee7345891451de7a61540903b512ea967d1b74ce SHA512: 050c8491c2c60a3db54cfa0acdf79f4795a4af91d3c7d4c32ea53365a99d625db7cc537ce5565fda9b5139ab175192a4547e935f32862c62de74cd534ad43310 Homepage: http://gcc.gnu.org/ Description: GNU Standard C++ Library v3 (armhf) (soft float ABI) Description-md5: cbcdd63090fed9d6de18cfb8ee01882e Package: libsfubsan1-armhf-cross Architecture: all Version: 10.5.0-1ubuntu1~20.04cross1 Built-Using: gcc-10 (= 10.5.0-1ubuntu1~20.04) Priority: optional Section: universe/devel Source: gcc-10-cross (6ubuntu6) Origin: Ubuntu Maintainer: Ubuntu Core developers Original-Maintainer: Debian GCC Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2396 Depends: gcc-10-cross-base (>= 10.5.0-1ubuntu1~20.04), libc6-armel-armhf-cross (>= 2.13-0ubuntu6) | libc6-armel-armhf-cross, libc6-armel-cross (>= 2.31), libsfgcc-s1-armhf-cross (>= 4.3), libsfstdc++6-armhf-cross Filename: pool/universe/g/gcc-10-cross/libsfubsan1-armhf-cross_10.5.0-1ubuntu1~20.04cross1_all.deb Size: 756644 MD5sum: a8cd135b69a97fb83b82f4694944b8fd SHA1: 7166925a68ecc13f41a3b036cd4d27195b32c57b SHA256: bcfc348d1a5803c738e637f63682060c1543e7bf2d5c71ca033869564844c949 SHA512: 0d00ec442306a560f4fd1d4a8840f7b0dfb843707151eb12c384c7ced87b40c1917b0776664f5730d8c01a7f530d61f5e98e7940e28c2dbfbab9795017c9fce0 Homepage: http://gcc.gnu.org/ Description: UBSan -- undefined behaviour sanitizer (soft float ABI) Description-md5: 21e3ad59d7b6ceb56cee1f74de7efd95 Package: libshibsp-dev Architecture: amd64 Version: 3.0.4+dfsg1-1ubuntu0.2 Multi-Arch: same Priority: extra Section: universe/libdevel Source: shibboleth-sp Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Shib Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 366 Depends: libsaml-dev (>= 3~), libshibsp8 (= 3.0.4+dfsg1-1ubuntu0.2), libxerces-c-dev, libxmltooling-dev (>= 3~) Suggests: libshibsp-doc Filename: pool/universe/s/shibboleth-sp/libshibsp-dev_3.0.4+dfsg1-1ubuntu0.2_amd64.deb Size: 47256 MD5sum: 938538c5796a7e14d1886009c15ad09b SHA1: 9e3f86d131fe3cd78da3d5e41bae1fcd8b15bc0e SHA256: 68784026c4466a4c998819793fd9a2f3eb9f52db825bca4e82e9a478adfc0c9b SHA512: 844307fb599f835dfc1f2226ecbab9cb4308add819a7bcdca2b3e51a489fff33dc8263243896e43572bd17d1345a131b3231999fb038ef4b5a3f1ac6b87325a8 Homepage: http://shibboleth.net/ Description: Federated web single sign-on system (development) Description-md5: f612d11de8626099119eee5b70ca1fc4 Package: libshibsp-doc Architecture: all Version: 3.0.4+dfsg1-1ubuntu0.2 Multi-Arch: foreign Priority: extra Section: universe/doc Source: shibboleth-sp Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Shib Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 7786 Filename: pool/universe/s/shibboleth-sp/libshibsp-doc_3.0.4+dfsg1-1ubuntu0.2_all.deb Size: 3342668 MD5sum: bffdf19ddb89ca835b7c585053c82a68 SHA1: d814e2409b8b86c49290588ebfafc0fc50dec794 SHA256: f13d2bcfd81225705bb013998a0bbddad6cb43b758cf2b1b3bfc669e1c598ef8 SHA512: 47acd5e9b474861b15df879ef520555391c074fb0c834e2f0db48af9b7d96a32facfae03569018036d9d245995ff9089b15c29d15269b2db7522f33d91b8858d Homepage: http://shibboleth.net/ Description: Federated web single sign-on system (API docs) Description-md5: e5190deaad2efa125069ffa3d52e1ab3 Package: libshibsp-plugins Architecture: amd64 Version: 3.0.4+dfsg1-1ubuntu0.2 Multi-Arch: same Priority: extra Section: universe/libs Source: shibboleth-sp Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Shib Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 859 Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.0), libgssapi-krb5-2 (>= 1.17), libmemcached11, libodbc1 (>= 2.3.1), libsaml10, libshibsp8 (>= 3.0.4+dfsg1), libstdc++6 (>= 5.2), libxerces-c3.2, libxmltooling8 (>= 3.0.5) Filename: pool/universe/s/shibboleth-sp/libshibsp-plugins_3.0.4+dfsg1-1ubuntu0.2_amd64.deb Size: 174280 MD5sum: 2f34841e5aed3921c09da06b500edafe SHA1: 5b75dc12a11b256556c6effb2a15f698f502204d SHA256: 79283684eeb045c9393895e0a2d62b07ca7af5c57c036cd8adf767bad43e04af SHA512: f2d99dae544a25c557b68f9d7016f39ef3c98ff45b7f5c26c3e88830845f1b90011dcfc9da90e7e43b9df3433e23c77fabbfb06618f6eae3e096a09b4f40146f Homepage: http://shibboleth.net/ Description: Federated web single sign-on system (plugins) Description-md5: e01dde1bfa43896467e844bce7843f95 Package: libshibsp8 Architecture: amd64 Version: 3.0.4+dfsg1-1ubuntu0.2 Multi-Arch: same Priority: optional Section: universe/libs Source: shibboleth-sp Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Shib Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 4413 Depends: opensaml-schemas (>= 3~), shibboleth-sp-common (= 3.0.4+dfsg1-1ubuntu0.2), xmltooling-schemas (>= 3~), libc6 (>= 2.15), libgcc-s1 (>= 3.0), libgssapi-krb5-2 (>= 1.17), liblog4shib2, libsaml10, libstdc++6 (>= 9), libxerces-c3.2, libxml-security-c20, libxmltooling8 (>= 3.0.5) Filename: pool/universe/s/shibboleth-sp/libshibsp8_3.0.4+dfsg1-1ubuntu0.2_amd64.deb Size: 955484 MD5sum: f001aee914d07f9d67a9b403748b0ad8 SHA1: 2b6b7a77de5240f5f53ad5ebf838301ccf153ee6 SHA256: ab015d5176c58a236ad231402006e679558789324e42cc5c00e0c5cbd937838c SHA512: 6ba65e71f43ca5736be43b6a8b25073da773defb9478eca3f2e7817ee65b78498ee13815872b812400011a374cea668fc802c99f65674dd2efb0af36a4a0ea19 Homepage: http://shibboleth.net/ Description: Federated web single sign-on system (runtime) Description-md5: 71a15e0a1ae8eed4743cb31280b20e20 Package: libshiro-java Architecture: all Version: 1.3.2-4ubuntu0.2 Priority: optional Section: universe/java Source: shiro Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Java Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 841 Depends: libcommons-beanutils-java, libslf4j-java Suggests: libaspectj-java, libcommons-cli-java, libehcache-java, libquartz-java, libspring-context-java, libtaglibs-standard-spec-java Filename: pool/universe/s/shiro/libshiro-java_1.3.2-4ubuntu0.2_all.deb Size: 564840 MD5sum: 7fc3669e23a865bb160ed9f5bcbd4973 SHA1: d615a18f93782a02f6d776742b1ead6c98f57c70 SHA256: bf1dd94f9a170bd4c3590993702f76c525d6f8f2645bceb160ebe40dd37112c5 SHA512: 1f1230040964b0892d26f78ae1c2c82bf0d5c6b288e34896102c93ac3d4e0205b7ebdd0834f81fd40c7713c6ddbc6a08306b5d863995f30da7989e0e413dc4e0 Homepage: http://shiro.apache.org Description: Apache Shiro - Java Security Framework Description-md5: 62642f43d7bbb47f76cecf9c433ab3bd Package: libsignon-extension1 Architecture: amd64 Version: 8.59+17.10.20170606-0ubuntu2.20.04.1 Multi-Arch: same Priority: optional Section: universe/libs Source: signon Origin: Ubuntu Maintainer: Ubuntu Desktop Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 95 Depends: libc6 (>= 2.14), libqt5core5a (>= 5.12.2), libqt5dbus5 (>= 5.0.2), libstdc++6 (>= 4.1.1) Filename: pool/universe/s/signon/libshis.output||this.level<1||this.output.appendLine(`${this.timestamp} ${r??""}${this.toLoggableParams(!1,i)}${null!=e?` ${String(e)}`:""}`)}}log(e,...t){let i;(!(this.level<3)||this.isDebugging)&&("string"==typeof e?i=e:(i=t.shift(),null!=e&&(i=`${e.prefix} ${i??""}`)),this.isDebugging&&console.log(`[${(0,n.mF)(this.provider.name,13)}]`,this.timestamp,i??"",...t),null==this.output||this.level<3||this.output.appendLine(`${this.timestamp} ${i??""}${this.toLoggableParams(!1,t)}`))}warn(e,...t){let i;(!(this.level<2)||this.isDebugging)&&("string"==typeof e?i=e:(i=t.shift(),null!=e&&(i=`${e.prefix} ${i??""}`)),this.isDebugging&&console.warn(this.timestamp,`[${this.provider.name}]`,i??"",...t),null==this.output||this.level<2||this.output.appendLine(`${this.timestamp} ${i??""}${this.toLoggableParams(!1,t)}`))}showOutputChannel(e){this.output?.show?.(e)}toLoggable(e,t){if("object"!=typeof e)return String(e);if(t??=this.provider.sanitize??l,Array.isArray(e))return`[${e.map(e=>this.toLoggable(e,t)).join(", ")}]`;let i=this.provider.toLoggable?.(e);if(null!=i)return i;try{return JSON.stringify(e,t)}catch{return""}}toLoggableParams(e,t){if(0===t.length||e&&this.level<4&&!this.isDebugging)return"";let i=t.map(e=>this.toLoggable(e)).join(", ");return 0!==i.length?` \u2014 ${i}`:""}};let BufferedLogChannel=class BufferedLogChannel{constructor(e,t=500){this.channel=e,this.interval=t}buffer=[];bufferTimer;dispose(){clearInterval(this.bufferTimer),this.bufferTimer=void 0,this.channel.dispose()}get name(){return this.channel.name}appendLine(e){this.buffer.push(e),this.bufferTimer??=setInterval(()=>this.flush(),this.interval)}show(e){this.channel.show?.(e)}_emptyCounter=0;flush(){if(this.buffer.length){this._emptyCounter=0;let e=this.buffer.join("\n");this.buffer.length=0,this.channel.append(e)}else this._emptyCounter++,this._emptyCounter>10&&(clearInterval(this.bufferTimer),this.bufferTimer=void 0,this._emptyCounter=0)}};function h(e){switch(e){case"off":default:return 0;case"error":return 1;case"warn":return 2;case"info":return 3;case"debug":return 4}}function u(e){let t;if("function"==typeof e){if(e.prototype?.constructor==null)return e.name;t=e.prototype.constructor}else t=e.constructor;let i=t?.name??"",r=i.indexOf("_");return i=-1===r?i:i.substring(r+1),t?.[s.z1]!=null&&(i=t[s.z1](e,i)),i}let d={enabled:e=>c.enabled(e)||c.isDebugging,log:(e,t,i,...r)=>{switch(e){case"error":c.error(void 0,t,i,...r);break;case"warn":c.warn(t,i,...r);break;case"info":c.log(t,i,...r);break;default:c.debug(t,i,...r)}}}},8480:(e,t,i)=>{i.d(t,{FV:()=>c,e8:()=>h});let r=/[\\*_{}[\]()#+\-.!]/g,s=/\\([\\`*_{}[\]()#+\-.!])/g,n=/^===/gm,o=/^\u200b===/gm,a=/\r?\n/g,l=/`/g;function c(e,t={}){return(e=e.replace(r,"\\$&").replace(n,"​==="),e=t.inlineBackticks?function(e){let t="\\`\\`\\`",i="",r=!0,s=!1,n="";for(let o=0;o "):e}function h(e){return e.replace(s,"$1").replace(o,"===")}},2838:(e,t,i)=>{function r(e,t){if(e===t)return!0;if(null==e||null==t)return!1;let i=typeof e;return(i!==typeof t||"string"!==i&&"number"!==i&&"boolean"!==i)&&JSON.stringify(e)===JSON.stringify(t)}function s(e,t,i){let r=i?.joinArrays??!1,s=i?.skipPaths?.length?t?i.skipPaths.map(e=>`${t}.${e}`):i.skipPaths:void 0,n=Object.create(null);return!function e(t,i,n){if(!s?.includes(i)){if(Object(n)!==n)null!=n&&(t[i]="string"==typeof n?n:"number"==typeof n||"boolean"==typeof n?n:JSON.stringify(n));else if(Array.isArray(n)){let s=n.length;if(0===s)return;if(r)t[i]=n.join(",");else for(let r=0;rs,Y8:()=>n,t7:()=>r})},4437:(e,t,i)=>{i.d(t,{t:()=>PageableResult});let PageableResult=class PageableResult{constructor(e){this.fetch=e}cached;async *values(){if(null!=this.cached)for(let e of this.cached.values)yield e;let e=this.cached;for(;null==e||e.paging?.more;)for(let t of(e=await this.fetch(e?.paging),null==this.cached?this.cached=e:(this.cached.values.push(...e.values),this.cached.paging=e.paging),e.values))yield t}}},8230:(e,t,i)=>{i.d(t,{Fd:()=>p,HS:()=>r.join,LC:()=>r.extname,Np:()=>u,P8:()=>r.basename,bm:()=>d,my:()=>c,oP:()=>h,pD:()=>r.dirname,vO:()=>l});var r=i(2101),s=i(2341);let n=/(?<=^\/?)([A-Z])(?=:\/)/,o=/^([a-zA-Z][\w+.-]+):/,a=/\\/g;function l(e,t,i,r){let n;if(0===e.length||0===t.length)return 0;(r??!s.j9)&&(e=e.toLowerCase(),t=t.toLowerCase());let o=0;for(let r=0;r "302", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Anio de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($mes == "") { $j_array = array('code' => "303", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Mes de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($organi_id_Analytics == "") { $j_array = array('code' => "304", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Organization ID de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($RFC == "") { $j_array = array('code' => "305", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el RFC"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($idWorkspace == "") { $j_array = array('code' => "306", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el ID del workspace"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($idView == "") { $j_array = array('code' => "307", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Organization ID de la vista"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } $dirBase = realpath("../"); ### DEFINICIÓN DE CONSTANTES ################################################### $SendaPEM = "archs_pem/"; $SendaXML = "archs_xml/"; $SendaZIP = "archs_zip/"; #---------------------------------------------------------------- #== Llamado para generar el token para donatello #---------------------------------------------------------------- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://donatello.aptuslegal.app/oauth/token/'.$organi_id_Analytics, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'Authorization: Token e68d5a079f937ea29ad2ec5a5b105b75491a0e0c' ), )); $response = curl_exec($curl); curl_close($curl); // Decodificamos la respuesta JSON $data = json_decode($response, true); // Accedemos al valor de 'access_token de donatello' $access_token = $data['access_token']; #---------------------------------------------------------------- #== Hacemos el llamado para generar la obtención de los datos en la operación Bulk y obtenemos el Job ID. #---------------------------------------------------------------- $curl = curl_init(); $dia = obtenerDiasDelMes($mes); if($dia == "Formato de mes inválido."){ $j_array = array('code' => "309", "message" => "ERROR - [wsPolizasAnalytics] El formato del parámetro del mes no es valido"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } curl_setopt_array($curl, array( CURLOPT_URL => 'https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/'.$idWorkspace.'/views/'.$idView.'/data?CONFIG=%7B%22criteria%22%3A%22%5C%22Fecha%20de%20transaccion%5C%22%20between%20%27'.$anio.'-'.$mes.'-01%27%20and%20%27'.$anio.'-'.$mes.'-'.$dia.'%27%22%2C%20%22responseFormat%22%3A%22json%22%7D', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token, 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); $responseData = json_decode($response, true); // Acceder al 'jobId' $jobId = $responseData['data']['jobId']; #---------------------------------------------------------------- #== Obtenemos el status del JobId para saber si se puede descargar la respuesta #---------------------------------------------------------------- $jobStatus = "JOB IN PROGRESS"; while ($jobStatus === "JOB IN PROGRESS") { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/'.$idWorkspace.'/exportjobs/'.$jobId, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token ), )); $response = curl_exec($curl); // Decodificar la respuesta JSON $responseData = json_decode($response, true); // Verificar el status del trabajo if (isset($responseData['data']['jobStatus'])) { $jobStatus = $responseData['data']['jobStatus']; } else { // Si no se encuentra jobStatus en la respuesta, salir del ciclo $j_array = array('code' => "311", "message" => "ERROR - [wsPolizasAnalytics] Error al esperar el Status de JobId de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } // Esperar 5 segundos antes de volver a consultar sleep(5); } //Si se obtiene un status diferente al esperado lo interpreta como error if($jobStatus != "JOB COMPLETED"){ $j_array = array('code' => "312", "message" => "ERROR - [wsPolizasAnalytics] Error el Status del JobId inesperado"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if (isset($responseData['data']['downloadUrl'])) { $downloadUrl = $responseData['data']['downloadUrl']; // echo "Download URL: " . $downloadUrl; } else { $j_array = array('code' => "313", "message" => "ERROR - [wsPolizasAnalytics] Error al obtener el downloadUrl de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } #---------------------------------------------------------------- #== Llamado para la obtención de los datos en formato JSON de la vista de Analytics. #---------------------------------------------------------------- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $downloadUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token ), )); $response = curl_exec($curl); curl_close($curl); echo $response; #---------------------------------------------------------------- #== Creación de la variable de tipo DOM, aquí se conforma el XML a timbrar posteriormente. #---------------------------------------------------------------- ### FUNCIONES DEL MÓDULO ######################################################### # Función que integra los nodos al archivo .XML function cargaAttNodo(&$nodo, $attr){ global $xmldoc; foreach ($attr as $key => $val){ $val = preg_replace('/\s\s+/', ' ', $val); $val = trim($val); if (strlen($val)>0){ $val = utf8_encode(str_replace("|","/",$val)); $nodo->setAttribute($key,$val); } } } function obtenerDiasDelMes($mes) { // Validar que el parámetro sea una cadena con dos dígitos if (!preg_match('/^\d{2}$/', $mes)) { return "Formato de mes inválido."; } // Obtener el año actual $anio = date("Y"); // Usar la función `cal_days_in_month` para obtener la cantidad de días del mes $dias = cal_days_in_month(CAL_GREGORIAN, intval($mes), $anio); return $dias; }