diff --git a/class/actions_autoverifactu.class.php b/class/actions_autoverifactu.class.php index 3197b13..e0a6f89 100644 --- a/class/actions_autoverifactu.class.php +++ b/class/actions_autoverifactu.class.php @@ -103,9 +103,9 @@ public function doActions($parameters, &$object, &$action) } elseif ($result < 0) { $this->errors[] = $langs->trans('InconsistentInvoiceData'); } - //url de verificacion en casp de test ou production + $testMode = (bool) getDolGlobalString('AUTOVERIFACTU_TEST_MODE'); - $base_url = $testMode ? VERIFACTU_TEST_VERIFICACION_BASE_URL : VERIFACTU_BASE_URL; + $base_url = $testMode ? VERIFACTU_TEST_BASE_URL : VERIFACTU_BASE_URL; $endpoint = '/wlpl/TIKE-CONT/ValidarQR'; $query = http_build_query(array( 'nif' => $mysoc->idprof1, @@ -129,7 +129,6 @@ public function doActions($parameters, &$object, &$action) $res = curl_exec($ch); - if ($res === false) { $this->errors[] = $langs->trans('CollationRequestError'); } else { @@ -141,9 +140,7 @@ public function doActions($parameters, &$object, &$action) if ($data->mensaje) { $this->errors[] = $data->mensaje; } - } elseif ( !($data->mensaje === 'Factura encontrada' || - $data->mensaje ==="Encontrada" ) - ) { + } elseif ($data->mensaje !== 'Factura encontrada') { $this->errors[] = $langs->trans('NotPubliclyRegistered'); } } @@ -238,12 +235,7 @@ public function printUnderHeaderPDFline($parameters, &$pdfhandler) ) { $pdf = &$parameters['pdf']; - //url de verificacion en casp de test ou production - $testMode = (bool) getDolGlobalString('AUTOVERIFACTU_TEST_MODE'); - - $base_url = $testMode ? VERIFACTU_TEST_VERIFICACION_BASE_URL : VERIFACTU_BASE_URL; - - + $base_url = VERIFACTU_BASE_URL; $endpoint = '/wlpl/TIKE-CONT/ValidarQR'; $query = http_build_query(array( 'nif' => $mysoc->idprof1, diff --git a/core/modules/modAutoverifactu.class.php b/core/modules/modAutoverifactu.class.php index 060cedd..51479a8 100644 --- a/core/modules/modAutoverifactu.class.php +++ b/core/modules/modAutoverifactu.class.php @@ -78,7 +78,7 @@ public function __construct($db) $this->editor_squarred_logo = 'logo-codec.png@autoverifactu'; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@autoverifactu' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' - $this->version = '0.0.11'; + $this->version = '0.0.10'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; @@ -362,86 +362,6 @@ public function init($options = '') 'autoverifactu@autoverifactu', 'isModEnabled("autoverifactu")', ); - //nuevos campos - // tipo de impuesto - $extrafields->addExtraField( - 'verifactu_Tax_Type', - 'VerifactuTaxType', - 'select', - 1, - 2, - 'facturedet', - 0, - 0, - 'S1', - array( - 'options' => array( - 'S1' => 'Operación Sujeta y No exenta - Sin inversión del sujeto pasivo.', - 'S2' => 'Operación Sujeta y No exenta - Con Inversión del sujeto pasivo.', - 'N1' => 'Operación No Sujeta artículo 7, 14, otros.', - 'N2' => 'Operación No Sujeta por Reglas de localización.', - ), - ), - 0, - '', - '3', - 'Se corresponde con el valor del campo CalificacionOperacion y es la clave de la operación sujeta y no exenta o de la operación no sujeta. Los valores que puede tener están relacionados con los de la lista L9', - '', - '', - 'autoverifactu@autoverifactu', - 'isModEnabled("autoverifactu")', - ); - //Tipos de exención - $extrafields->addExtraField( - 'verifactu_Tax_Exception', - 'VerifactuTaxException', - 'select', - 1, - 2, - 'facturedet', - 0, - 0, - '', - array( - 'options' => array( - 'E1' => 'Exenta por el artículo 20.', - 'E2' => 'Exenta por el artículo 21.', - 'E3' => 'Exenta por el artículo 22.', - 'E4' => 'Exenta por los artículos 23 y 24.', - 'E5' => 'Exenta por el artículo 25.', - 'E6' => 'Exenta por otros.', - ), - ), - 0, - '', - '3', - 'Se corresponde con el valor del campo CalificacionOperacion y es la clave de la operación sujeta y no exenta o de la operación no sujeta. Los valores que puede tener están relacionados con los de la lista L9', - '', - '', - 'autoverifactu@autoverifactu', - 'isModEnabled("autoverifactu")', - ); - // Fecha de operación - $extrafields->addExtraField( - 'verifactu_date_operation', - 'VerifactuDateOperation', - 'date', - 1, - 2, - 'facture', - 0, - 0, - '', - '', - 0, - '', - '3', - 'Es la fecha en la que se produce el devengo del impuesto', - '', - '', - 'autoverifactu@autoverifactu', - 'isModEnabled("autoverifactu")', - ); // Permissions $this->remove($options); diff --git a/langs/es_ES/autoverifactu.lang b/langs/es_ES/autoverifactu.lang index 49b0334..4094253 100644 --- a/langs/es_ES/autoverifactu.lang +++ b/langs/es_ES/autoverifactu.lang @@ -64,7 +64,7 @@ AutoverifactuAboutPage = Pagina de información sobre Auto-Veri*Factu # AutoVerifactuNotEnabled = Auto-Veri*Factu está instalado, pero no habilitado InvoicesNotSent = Tus facturas no seran remitidas al sistema Veri*Factu -AutoVerifactuInTestMode = Auto-Veri*Factu està en modo de pruebas +AutoVerifactuInTestMode = Auto-Veri*Factu està en modo de pruebsa # # Messages diff --git a/lib/validate.lib.php b/lib/validate.lib.php deleted file mode 100644 index cad9f3b..0000000 --- a/lib/validate.lib.php +++ /dev/null @@ -1,357 +0,0 @@ -format('d-m-Y') === $date; -} -/** -* Valida el tipo de especificación de factura -* -* @param string $type especificación de factura (L2). -* -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateVerifactuInvoice($type){ - return ( - $type ==="F1" || - $type ==="F2" || - $type ==="F3" || - $type ==="R1" || - $type ==="R2" || - $type ==="R3" || - $type ==="R4" || - $type ==="R5" ); -} - -/** -* Valida el tipo de especificación de factura rectificativa -* -* @param string $type especificación de factura (L2). -* @param boolean obliagtorio. -* -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateVerifactuInvoiceRectificative ($type,$requerido){ - if(!$requerido && $type ===''){ - return 1; - } - return ( - $type ==="R1" || - $type ==="R2" || - $type ==="R3" || - $type ==="R4" || - $type ==="R5" ); -} -/** -* Valida de tipo alfanumerico. -* -* @param string cadena facture. -* @param int numero de caracteres -* -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateAlphaNumber($string, $length) { - $actualLength = mb_strlen($string, 'UTF-8'); - if ($actualLength > (int)$length || $actualLength === 0) { - return 0; - } - $pattern = "/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚüÜ ]+$/u"; - if (!preg_match($pattern, $string)) { - return 0; - } - return 1; -} - -/** -* Valida de tipo alfanumerico + guion para la ref. -* -* @param string cadena facture. -* @param int numero de caracteres -* -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateAlphaNumberScript($string, $length) { - $actualLength = mb_strlen($string, 'UTF-8'); - if ($actualLength > (int)$length || $actualLength === 0) { - return 0; - } - $pattern = "/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚüÜ\- ]+$/u"; - if (!preg_match($pattern, $string)) { - return 0; - } - return 1; -} - -/** -* Valida de tipo number decimal (numberCount,numberDecimal). -*@param float number validate -* @param int numberCount epresenta el número total de dígitos -*@param int numberDecimal Representa cuántos de esos numberCount dígitos están reservados para la parte decimal -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateNumber($number,$numberCount,$numberDecimal){ - if (!is_numeric($number)) { - return 0; - } - $absoluteNumber = ltrim($number, '-'); - $parts = explode('.', $absoluteNumber); - $integers = $parts[0]; - $decimals = isset($parts[1]) ? $parts[1] : ''; - $maxIntegersAllowed = $numberCount - $numberDecimal; - $actualIntegersCount = strlen($integers); - $actualDecimalsCount = strlen($decimals); - if ($actualIntegersCount > $maxIntegersAllowed) { - return 0; - } - if ($actualDecimalsCount > $numberDecimal) { - return 0; - } - if (($actualIntegersCount + $actualDecimalsCount) > $numberCount) { - return 0; - } - return 1; -} - -/** - * Verifica que el tipo de impuesto tiene un valor correcto - * @param string tipo de impuesto - * @param boolean obligatorio. - * @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateTaxType($taxType){ - return ($taxType==='01' || - $taxType==='02' || - $taxType==='03' || - $taxType==='05' - ); -} - -/** - * Verifica que el tipo de regimen tiene un valor correcto - * @param string tipo de regimen - * @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateRegimeTypeIva($regimeType){ - return ($regimeType==='01' || - $regimeType==='02' || - $regimeType==='03' || - $regimeType==='04' || - $regimeType==='05' || - $regimeType==='06' || - $regimeType==='07' || - $regimeType==='08' || - $regimeType==='09' || - $regimeType==='10' || - $regimeType==='11' || - $regimeType==='14' || - $regimeType==='15' || - $regimeType==='17' || - $regimeType==='18' || - $regimeType==='19' || - $regimeType==='20' - ); -} - -/** - * Verifica que el tipo de regimen tiene un valor correcto - * @param string tipo de regimen - * @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateRegimeTypeOther($regimeType){ - return ($regimeType==='01' || - $regimeType==='02' || - $regimeType==='03' || - $regimeType==='04' || - $regimeType==='05' || - $regimeType==='06' || - $regimeType==='07' || - $regimeType==='08' || - $regimeType==='09' || - $regimeType==='10' || - $regimeType==='11' || - $regimeType==='14' || - $regimeType==='15' || - $regimeType==='17' || - $regimeType==='18' || - $regimeType==='19' - ); -} - -/** - * Verifica que el tipo de operacion tiene un valor correcto - * @param string tipo de operacion - * @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateOperationType($operationType){ - return ($operationType==='S1' || - $operationType==='S2' || - $operationType==='N1' || - $operationType==='N2' || - $operationType==='validate' - ); -} - -/** - * Verifica que el codigo de error tiene un valor correcto - * @param string tipo codigo de error - * @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateExemptionCode($errorCode){ - return ($errorCode==='E1' || - $errorCode==='E2' || - $errorCode==='E3' || - $errorCode==='E4' || - $errorCode==='E5' || - $errorCode==='E6'|| - $errorCode==='0' - ); -} - -/** -* Valida si el nif es correcto y corresponde con el nombre -* atraves de la API de la Agencia Tributaria. -* -* @param string $nif nif -* @param string $name nombre -* -* @return boolean 1 correct or 0 incorrect -*/ -function autoverifactuValidateNifName($nif,$name) -{ - - $envelope = autoverifactuSoapEnvelopeNIF( - $nif, - $name - ); - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, 'https://www1.agenciatributaria.gob.es/wlpl/BURT-JDIT/ws/VNifV2SOAP'); - - - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_FAILONERROR, 1); - - curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'P12'); - $certPath = DOL_DATA_ROOT . '/' . getDolGlobalString('AUTOVERIFACTU_CERT'); - curl_setopt($ch, CURLOPT_SSLCERT, $certPath); - $certPass = getDolGlobalString('AUTOVERIFACTU_PASSWORD'); - curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $certPass); - - curl_setopt( - $ch, - CURLOPT_HTTPHEADER, - array( - 'Content-Type: text/xml', - 'User-Agent: Mozilla/5.0 (compatible; Módulo Auto-Veri*Factu de Dolibarr/0.0.1', - ), - ); - - // --- INSERTA ESTO PARA VER LA RESPUESTA --- - curl_setopt($ch, CURLOPT_VERBOSE, true); // Activa modo detallado - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Asegura que devuelve la respuesta - - - curl_setopt($ch, CURLOPT_POSTFIELDS, $envelope); - - $res = curl_exec($ch); - - error_log('# RESPUESTA VALIDACIÓN NIF Y NOMBRE'); - curl_close($ch); - // var_dump(htmlspecialchars($res)); - - - try { - - $xml = new SimpleXMLElement($res); - $xml->registerXPathNamespace('valida', 'http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Sal.xsd'); - $resultado = $xml->xpath('//valida:Resultado'); - - - if($resultado[0]=='IDENTIFICADO'){ - return 1; - }else if($resultado[0]=='NO PROCESADO'){ - return 0; - // return "Se excede del número de contribuyentes a identificar"; - }else if((string) $resultado[0]=='IDENTIFICADO-REVOCADO'){ - return 1; - //return 0; - //Si el contribuyente se identifica con el NIF aportado, y está en estado baja - }else if((string) $resultado[0][0]=='IDENTIFICADO-BAJA'){ - return 0; - //Si el contribuyente se identifica con el NIF aportado y está en estado baja por revocación del NIF. - }else{ - return 0; - //return "El nombre del usuario no concuerda con el DNI"; - } - - } catch (Exception $e) { - return "Error al procesar el XML: " . $e->getMessage(); - } -} - -/** -* funcion "privada" que genera el xml de la validacion nif -* -* @param string $nif nif -* @param string $name nombre -* -* @return string xml de la validacion nif -*/ -function autoverifactuSoapEnvelopeNIF($nif,$name){ - - $xml = new DOMDocument('1.0', 'UTF-8'); - - // 1. Creamos el Envelope - $envelope = $xml->createElement('soapenv:Envelope'); - - // 2. CORRECCIÓN: Definir cada namespace por separado - $envelope->setAttribute('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'); - $envelope->setAttribute('xmlns:vnif', 'http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Ent.xsd'); - - // 3. Estructura normal - $headerEl = $xml->createElement('soapenv:Header'); - $envelope->appendChild($headerEl); - - $body = $xml->createElement('soapenv:Body'); - $root = $xml->createElement('vnif:VNifV1Ent'); - $regContriEl = $xml->createElement('vnif:Contribuyente'); - // Asegúrate de que $nif esté en mayúsculas - $regNifEl = $xml->createElement('vnif:Nif', strtoupper($nif)); - $regContriEl->appendChild($regNifEl); - - $regNameEl = $xml->createElement('vnif:Nombre', $name); - $regContriEl->appendChild($regNameEl); - - $root->appendChild($regContriEl); - $body->appendChild($root); - $envelope->appendChild($body); - $xml->appendChild($envelope); - - // Usamos saveXML() sobre todo el documento para que incluya la cabecera XML si es necesario - return $xml->saveXML(); -} \ No newline at end of file diff --git a/lib/validation.lib.php b/lib/validation.lib.php index a3159f4..975fe9c 100644 --- a/lib/validation.lib.php +++ b/lib/validation.lib.php @@ -33,10 +33,6 @@ require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; require_once __DIR__ . '/verifactu.lib.php'; -require_once __DIR__ . '/validate.lib.php'; - - - /** * Compare the invoice record hash with the hash of the record from the immutable log. @@ -47,13 +43,8 @@ */ function autoverifactuIntegrityCheck($invoice) { - - - - $blockedlog = autoverifactuFetchBlockedLog($invoice); - if (!$blockedlog) { return 0; } @@ -63,14 +54,9 @@ function autoverifactuIntegrityCheck($invoice) return -1; } - - $record = autoverifactuInvoiceToRecord($invoice); - - $immutable = autoverifactuRecordFromLog($blockedlog); - if (!$record || !$immutable) { return -1; } @@ -262,39 +248,28 @@ function autoverifactuGetSourceInvoice($invoice) function autoverifactuRecordFromLog($blockedlog, $recordType = 'alta') { global $db; - + $objectdata = $blockedlog->object_data; $blocked = new Facture($db); $blocked->fetch($blockedlog->fk_object); - - $blocked->status = 1; $blocked->type = $objectdata->type; $blocked->ref = $objectdata->ref; $lines = array(); - - $extrafields = new ExtraFields($db); - $extralabels = $extrafields->fetch_name_optionals_label('facturedet'); - - - - - foreach ($objectdata->invoiceline as $indice => $linedata) { + foreach ($objectdata->invoiceline as $linedata) { $line = new FactureLigne($db); $line->tva_tx = $linedata->tva_tx; $line->total_ht = $linedata->total_ht; $line->total_tva = $linedata->total_tva; - $line->array_options["options_verifactu_Tax_Type"] = "validate"; $lines[] = $line; } $blocked->lines = $lines; - - if (isset($objectdata->thirdparty) && $objectdata->thirdparty) { + if ($objectdata->thirdparty) { $blocked->thirdparty = new Societe($db); $blocked->thirdparty->nom = $objectdata->thirdparty->name; $blocked->thirdparty->idprof1 = $objectdata->thirdparty->idprof1u ?? null; @@ -389,18 +364,6 @@ function autoverifactuEnabled() */ function autoverifactuValidateRecord($record) { - - //validacion de todos los datos de la factura - $isCorrect=autoverifactuValidateValuesRecord($record); - - if(!$isCorrect){ - return 0; - } - //validamos que el total de la factura coincida con el total calculado - if($record->factureTotalAmount!==$record->factureTtc){ - return 0; - } - if (!isset($record->breakdown, $record->totalTaxAmount, $record->totalAmount)) { return 0; } @@ -521,176 +484,3 @@ function autoverifactuIsPosInvoice($invoice) return $invoice->module_source === 'takepos'; } - -/* Validates the values ​​of an invoice record. - * - * @param stdClass $record Target record. - * - * @return int 0 if validatio fail, 1 if succeed - */ -function autoverifactuValidateValuesRecord($record){ - - $isValidType =autoverifactuValidateTypeInvoice($record->type); - if(!$isValidType){ - return 0; - } - $isValidDateOperation=autoverifactuValidateDate($record->dateOperation,false); - - if(!$isValidDateOperation){ - return 0; - } - - - $isValidVerifactuInvoice=autoverifactuValidateVerifactuInvoice($record->invoiceType); - - if(!$isValidVerifactuInvoice){ - return 0; - } - - $isValidDescription=autoverifactuValidateAlphaNumber($record->description,500); - if(!$isValidDescription){ - return 0; - } - - - $isValidRef=autoverifactuValidateAlphaNumberScript($record->invoiceId->invoiceNumber,60); - if(!$isValidRef){ - return 0; - } - - $isValidTotalAmount=autoverifactuValidateNumber($record->factureTtc,12,2); - if(!$isValidTotalAmount){ - return 0; - } - - $isValidTtc=autoverifactuValidateNumber($record->factureTtc,12,2); - if(!$isValidTtc){ - return 0; - } - - for ($i=0; $i < count($record->recipients); $i++) { - $isValidNif=autoverifactuValidateNifName($record->recipients[$i]->nif,$record->recipients[$i]->name); - - if(!$isValidNif){ - return 0; - } - } - - - if($record->correctiveType){ - $isValidCorrectiveType=autoverifactuValidateVerifactuInvoiceRectificative($record->correctiveType,false); - if(!$isValidCorrectiveType){ - return 0; - } - } - - for ($i=0; $i < count($record->correctedInvoices); $i++) { - # añadir logica - } - - if($record->correctedBaseAmount){ - $isValidCorrectedBaseAmount=autoverifactuValidateNumber($record->correctedBaseAmount,12,2); - if(!$isValidCorrectedBaseAmount){ - return 0; - } - } - if($record->correctedTaxAmount){ - $isValidCorrectedTaxAmount=autoverifactuValidateNumber($record->correctedTaxAmount,12,2); - if(!$isValidCorrectedTaxAmount){ - return 0; - } - } - - for ($i=0; $i < count($record->replacedInvoices); $i++) { - # añadir logica - } - - for ($i=0; $i < count($record->breakdown); $i++) { - - - - $isValidTotalTaxType=autoverifactuValidateTaxType($record->breakdown[0]->taxType); - if(!$isValidTotalTaxType){ - return 0; - } - if($record->breakdown[0]->taxType === '01'){ - $isValidRegimeType=autoverifactuValidateRegimeTypeIva($record->breakdown[0]->regimeType); - if(!$isValidRegimeType){ - return 0; - } - }else{ - $isValidRegimeType=autoverifactuValidateRegimeTypeOther($record->breakdown[0]->regimeType); - if(!$isValidRegimeType){ - return 0; - } - } - - $isValidOperationType=autoverifactuValidateOperationType($record->breakdown[0]->operationType); - if(!$isValidOperationType){ - return 0; - } - - $isValidTotalTaxRate=autoverifactuValidateNumber($record->breakdown[0]->taxRate,4,2); - if(!$isValidTotalTaxRate){ - return 0; - } - - $isValidBaseAmount=autoverifactuValidateNumber($record->breakdown[0]->baseAmount,12,2); - if(!$isValidBaseAmount){ - return 0; - } - - $isValidTaxAmount=autoverifactuValidateNumber($record->breakdown[0]->taxAmount,12,2); - if(!$isValidTaxAmount){ - return 0; - } - - if(isset($record->breakdown[0]->exemptionCode)){ - $isValidTexemptionCode=autoverifactuValidateExemptionCode($record->breakdown[0]->exemptionCode,12,2); - } - - return 1; - - if(!$isValidTexemptionCode){ - return 0; - } - - } - - - $isValidTotalTaxAmount=autoverifactuValidateNumber($record->totalTaxAmount,12,2); - if(!$isValidTotalTaxAmount){ - return 0; - } - - $isValidTotalAmount=autoverifactuValidateNumber($record->totalAmount,12,2); - if(!$isValidTotalAmount){ - return 0; - } - - - return 1; -} - - - -/** - * Validates the issuer data for a Veri*Factu record. - * - * @param array $issuer The issuer data to validate. - * - * @return int 1 if valid, 0 otherwise. - */ -function autoverifactuValidateIssuer($issuer){ - if (!$issuer || !$issuer['idprof1'] || !$issuer['name']) { - return 0; - } - - $isValidNifName=autoverifactuValidateNifName($issuer['idprof1'],$issuer['name'] ); - - if(!$isValidNifName){ - return 0; - } - - return 1; -} \ No newline at end of file diff --git a/lib/verifactu.lib.php b/lib/verifactu.lib.php index 7268832..977c28f 100644 --- a/lib/verifactu.lib.php +++ b/lib/verifactu.lib.php @@ -29,10 +29,9 @@ require_once __DIR__ . '/validation.lib.php'; /* Veri*Factu API URLs */ - define('VERIFACTU_BASE_URL', 'https://www1.agenciatributaria.gob.es'); // Production environment define('VERIFACTU_TEST_BASE_URL', 'https://prewww1.aeat.es'); // Test environment -define('VERIFACTU_TEST_VERIFICACION_BASE_URL', 'https://prewww2.aeat.es'); //url para la verificación de registros en entorno de pruebas + /* XML namespaces */ define('AUTOVERIFACTU_SOAPENV_NS', 'http://schemas.xmlsoap.org/soap/envelope/'); define( @@ -196,8 +195,6 @@ function autoverifactuRegisterInvoice($invoice, $action) ); } } catch (Error | Exception $e) { - var_dump($e); - if (isset($xml) && $xml) { file_put_contents($file, $xml); } @@ -222,8 +219,6 @@ function autoverifactuRegisterInvoice($invoice, $action) */ function autoverifactuSendInvoice($invoice, $action, &$xml) { - - if (!autoverifactuSystemCheck()) { dol_syslog('Veri*Factu bridge does not pass system checks'); return; @@ -274,20 +269,12 @@ function autoverifactuSendInvoice($invoice, $action, &$xml) } global $mysoc; - - $issuer = array( - 'name' => $mysoc->nom, - 'idprof1' => $mysoc->idprof1, - ); - - $issuerIsValid = autoverifactuValidateIssuer($issuer); - - if (!$issuerIsValid) { - throw new Exception('Inconsistent issuer data'); - } $envelope = autoverifactuSoapEnvelope( $record, - $issuer + array( + 'name' => $mysoc->nom, + 'idprof1' => $mysoc->idprof1, + ), ); $testMode = (bool) getDolGlobalString('AUTOVERIFACTU_TEST_MODE'); @@ -434,8 +421,6 @@ function autoverifactuSoapEnvelope($record, $issuer, $representative = null) */ function autoverifactuInvoiceToRecord($invoice, $recordType = 'alta') { - - global $mysoc; $now = dol_now(); @@ -445,8 +430,6 @@ function autoverifactuInvoiceToRecord($invoice, $recordType = 'alta') $invoice->fetch_thirdparty(); $thirdparty = $invoice->thirdparty; - - switch ($invoice->type) { case Facture::TYPE_STANDARD: case Facture::TYPE_DEPOSIT: @@ -486,20 +469,9 @@ function autoverifactuInvoiceToRecord($invoice, $recordType = 'alta') $record = new stdClass(); $record->type = $recordType; - if($invoice->array_options["options_verifactu_date_operation"]!==""){ - $record->dateOperation= new DateTimeImmutable( - date('Y-m-d H:i:s', $invoice->array_options["options_verifactu_date_operation"]), - new DateTimeZone('Europe/Madrid'), - );; - }else{ - $record->dateOperation= $invoice->array_options["options_verifactu_date_operation"]; - } - $record->issuerName = trim($mysoc->nom); $record->invoiceType = $invoiceType; - //elimino caracteres no permitidos en la descripción, ya que pueden causar el rechazo del registro por parte de la AEAT - $record->description = 'Factura ' . preg_replace('/[^a-zA-Z0-9ñÑáéíóúÁÉÍÓÚüÜ]/u', ' ', $invoiceRef); - + $record->description = 'Factura ' . $invoiceRef; $record->invoiceId = new stdClass(); $record->invoiceId->issuerId = trim($mysoc->idprof1); @@ -509,10 +481,6 @@ function autoverifactuInvoiceToRecord($invoice, $recordType = 'alta') new DateTimeZone('Europe/Madrid'), ); - //calculo el total y obtengo el total (para más tarde validar que son correctos) - $record->factureTotalAmount= number_format($invoice->total_ht + $invoice->total_tva + $invoice->total_localtax1, 2, '.', ''); - $record->factureTtc=number_format($invoice->total_ttc, 2, '.', ''); - $record->recipients = array(); // If is not simplified, add third party data to the record @@ -660,7 +628,6 @@ function autoverifactuInvoiceToRecord($invoice, $recordType = 'alta') } if (autoverifactuValidateRecord($record)) { - return $record; } } @@ -704,10 +671,6 @@ function autoverifactuRecordToXML($record, $xml = null) $recordEl->appendChild($xml->createElement('sum1:NombreRazonEmisor', htmlspecialchars($record->issuerName))); $recordEl->appendChild($xml->createElement('sum1:TipoFactura', $record->invoiceType)); - // Añado la etiqueta Fecha de Operación, que no es obligatoria, - if( $record->dateOperation !==""){ - $recordEl->appendChild($xml->createElement('sum1:FechaOperacion', $record->dateOperation->format('d-m-Y'))); - } if (($record->correctiveType ?? null) !== null) { $recordEl->appendChild($xml->createElement('sum1:TipoRectificativa', $record->correctiveType)); @@ -790,36 +753,13 @@ function autoverifactuRecordToXML($record, $xml = null) $breakdown->appendChild($dEl); $dEl->appendChild($xml->createElement('sum1:Impuesto', $details->taxType)); - - // Si el tipo de impuesto es 01 o 03, se debe incluir el régimen aplicable. if (in_array($details->taxType, array('01', '03'), true)) { $dEl->appendChild($xml->createElement('sum1:ClaveRegimen', $details->regimeType)); } - // Si el código de exención es E1, E2, E3, E4, E5 o E6, se indicará el código de exención. - if(in_array($details->exemptionCode, array('E1', 'E2','E3','E4','E5','E6'), true)){ - $dEl->appendChild($xml->createElement('sum1:OperacionExenta', $details->exemptionCode)); - } - //se indicará la calificación de la operación en caso de no existir código de exención. - if(!in_array($details->exemptionCode, array('E1', 'E2','E3','E4','E5','E6'), true)){ - $dEl->appendChild($xml->createElement('sum1:CalificacionOperacion', $details->operationType)); - } - // Se indicará el tipo impositivo, si no existe código de exención o la calificación de la operación no es N1. - if(!(in_array($details->exemptionCode, array('E1', 'E2','E3','E4','E5','E6'), true) || $details->operationType === 'N1' )){ - - $dEl->appendChild($xml->createElement('sum1:TipoImpositivo', $details->taxRate)); - } - + $dEl->appendChild($xml->createElement('sum1:CalificacionOperacion', $details->operationType)); + $dEl->appendChild($xml->createElement('sum1:TipoImpositivo', $details->taxRate)); $dEl->appendChild($xml->createElement('sum1:BaseImponibleOimporteNoSujeto', $details->baseAmount)); - - // Se indicará el cantidad impositiva, si no existe código de exención o la calificación de la operación no es N1. - if(!(in_array($details->exemptionCode, array('E1', 'E2','E3','E4','E5','E6'), true) || $details->operationType === 'N1' ) ){ - $dEl->appendChild($xml->createElement('sum1:CuotaRepercutida', $details->taxAmount)); - } - // Se indicará el recargo de equivalencia y el tipo en caso de existir - if(isset($details->EquivalenceSurchargeType ) && isset($details->EquivalenceSurcharge)){ - $dEl->appendChild($xml->createElement('sum1:TipoRecargoEquivalencia', $details->EquivalenceSurchargeType)); - $dEl->appendChild($xml->createElement('sum1:CuotaRecargoEquivalencia', $details->EquivalenceSurcharge)); - } + $dEl->appendChild($xml->createElement('sum1:CuotaRepercutida', $details->taxAmount)); } $recordEl->appendChild($xml->createElement('sum1:CuotaTotal', $record->totalTaxAmount)); @@ -905,60 +845,11 @@ function autoverifactuLinesToBreakdown($invoice) // TODO: Handle operation types (S1, S2, S3, S4) // NOTE: At this moment, autoverifactu only supports S1 operations (Operaciones sujetas y no exentas) // NOTE: To modify this constant autoverifactu offers the `autoverifactu` hook. - - //añado los diferentes tipos de operación según el código seleccionado en la línea - - - - - switch ($line->array_options["options_verifactu_Tax_Type"]) { - case 'S1': - - // Operaciones sujetas y no exentas - $details->operationType = 'S1'; - $details->taxRate = number_format((float) $line->tva_tx, 2, '.', ''); - $details->baseAmount = number_format((float) $line->total_ht, 2, '.', ''); - $details->taxAmount = number_format((float) $line->total_tva, 2, '.', ''); - $details->exemptionCode=$line->array_options["options_verifactu_Tax_Exception"]; - - if( $details->regimeType =="18"){ - $details->tax_type=$line->localtax1_type; - $details->EquivalenceSurchargeType =number_format((float) $line->localtax1_tx, 2, '.', '') ; - $details->EquivalenceSurcharge=number_format((float) $line->total_localtax1, 2, '.', ''); - } - $breakdown[] = $details; - break; - case 'S2': - //Sujetas a Inversión del Sujeto Pasivo - $details->operationType = 'S2'; - $details->taxRate = number_format((float) $line->tva_tx, 2, '.', ''); - $details->baseAmount = number_format((float) $line->total_ht, 2, '.', ''); - $details->taxAmount = number_format((float) $line->total_tva, 2, '.', ''); - $breakdown[] = $details; - break; - case 'N1': - //No Sujetas a IVA por reglas de localización - $details->operationType = 'N1'; - $details->taxRate = number_format((float) $line->tva_tx, 2, '.', ''); - $details->baseAmount = number_format((float) $line->total_ht, 2, '.', ''); - $details->taxAmount = number_format((float) $line->total_tva, 2, '.', ''); - - $breakdown[] = $details; - break; - case 'N2': - //el código N2 se refiere a operaciones "No Sujetas por otros motivos" - $details->operationType = 'N2'; - $breakdown[] = $details; - break; - case 'validate': - //Solo se utilizara en caso de envair la factura para vadidarla. - $details->operationType = 'validate'; - $details->taxRate = number_format((float) $line->tva_tx, 2, '.', ''); - $details->baseAmount = number_format((float) $line->total_ht, 2, '.', ''); - $details->taxAmount = number_format((float) $line->total_tva, 2, '.', ''); - $breakdown[] = $details; - break; - } + $details->operationType = 'S1'; + $details->taxRate = number_format((float) $line->tva_tx, 2, '.', ''); + $details->baseAmount = number_format((float) $line->total_ht, 2, '.', ''); + $details->taxAmount = number_format((float) $line->total_tva, 2, '.', ''); + $breakdown[] = $details; } return $breakdown;