Skip to content

Commit

Permalink
Merge pull request #171 from CRLibre/dev
Browse files Browse the repository at this point in the history
Sync master with latest dev working version.
  • Loading branch information
JeanCarlosChavarriaHughes authored Nov 29, 2024
2 parents c215b0b + 3f0855f commit 3d5aa15
Show file tree
Hide file tree
Showing 32 changed files with 4,809 additions and 262 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ De forma complementaria al proyecto de este API creamos dos repositorios relacio
* Archivos y recursos comunes para cualquier proyecto https://github.com/CRLibre/fe-hacienda-cr-misc

### ¿Por qué un API para conectarse a los del Ministerio de Hacienda?
Para la [implementación de la Factura Electrónica](https://www.hacienda.go.cr/contenido/14350-factura-electronica), el Ministerio de Hacienda puso a disposición [documentación técnica e interfaces de programación sofisticados](https://www.hacienda.go.cr/ATV/ComprobanteElectronico/frmAnexosyEstructuras.aspx) que muchos programadores encuentran difíciles de comprender y utilizar. Nuestro objetivo es crear un software que simplifique el proceso a desarrolladores de cumplir con las [resoluciones del Ministerio](http://web.archive.org/web/20191219053048if_/https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/Resoluci%C3%B3n_General_sobre_disposiciones_t%C3%A9cnicas_comprobantes_electr%C3%B3nicos_para_efectos_tributarios.pdf), de forma más ágil, desde cualquier lenguaje de programación y sin depender de intermediarios al poder instalar esta pieza de [software libre](https://es.wikipedia.org/wiki/Software_libre) en un servidor propio manteniendo control de sus datos sensibles.
Para la [implementación de la Factura Electrónica](https://www.hacienda.go.cr/docs/N2ComprobantesElectronicos.pdf), el Ministerio de Hacienda puso a disposición [documentación técnica e interfaces de programación sofisticados](https://atv.hacienda.go.cr/ATV/ComprobanteElectronico/frmAnexosyEstructuras.aspx) que muchos programadores encuentran difíciles de comprender y utilizar. Nuestro objetivo es crear un software que simplifique el proceso a desarrolladores de cumplir con las [resoluciones del Ministerio](https://atv.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/Resoluci%C3%B3n_General_sobre_disposiciones_t%C3%A9cnicas_comprobantes_electr%C3%B3nicos_para_efectos_tributarios.pdf), de forma más ágil, desde cualquier lenguaje de programación y sin depender de intermediarios al poder instalar esta pieza de [software libre](https://es.wikipedia.org/wiki/Software_libre) en un servidor propio manteniendo control de sus datos sensibles.


## Cómo colaborar
Expand All @@ -31,7 +31,7 @@ Para la [implementación de la Factura Electrónica](https://www.hacienda.go.cr/

## Sobre este API

**Trabajo en proceso [lo estamos creando en conjunto](CONTRIBUTING.md)**
**Trabajo en proceso [lo estamos creando en conjunto](THANKS.md)**

Esta es una API en PHP, la idea de esto es poder realizar módulos sobre una base que maneja ya diferentes aspectos como la conexión a bases de datos y usuarios, está basado en [CalaAPI](https://github.com/CRLibre/CalaAPI)

Expand Down
10 changes: 8 additions & 2 deletions api/contrib/check/check.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ function libxml_display_errors()
}

$tipoDoc = params_get('tipoDocumento');
$tipos = array("FE", "ND", "NC", "TE", "CCE", "CPCE", "RCE");
$tipos = array("FE", "ND", "NC", "TE", "CCE", "CPCE", "RCE","FEC, FEE");

grace_debug($tipoDoc);
if (in_array($tipoDoc, $tipos))
Expand All @@ -69,7 +69,7 @@ function libxml_display_errors()
{
case 'FE': //Factura Electronica
{
// Enable user error handling
// Enable user error handling
libxml_use_internal_errors(true);

$xml = new DOMDocument();
Expand Down Expand Up @@ -100,6 +100,12 @@ function libxml_display_errors()
case 'RCE': // Rechazo Comprobante Electronico
$tipoDocumento = "07";
break;
case 'FEC': // Factura Electronica de Compra
$tipoDocumento = "08";
break;
case 'FEE': // Factura Electronica de Exportación
$tipoDocumento = "09";
break;
default:
break;
}
Expand Down
8 changes: 7 additions & 1 deletion api/contrib/clave/clave.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ function getClave($tipoDocumento = "", $tipoCedula = "", $cedula = "", $situacio
}

$tipoDoc = params_get('tipoDocumento');
$tipos = array("FE", "ND", "NC", "TE", "CCE", "CPCE", "RCE");
$tipos = array("FE", "ND", "NC", "TE", "CCE", "CPCE", "RCE","FEC", "FEE");
grace_debug($tipoDoc);
if (in_array($tipoDoc, $tipos))
{
Expand All @@ -174,6 +174,12 @@ function getClave($tipoDocumento = "", $tipoCedula = "", $cedula = "", $situacio
case 'RCE': // Rechazo Comprobante Electronico
$tipoDocumento = "07";
break;
case 'FEC': // Factura Electronica de Compra
$tipoDocumento = "08";
break;
case 'FEE': // Factura Electronica de Exportación
$tipoDocumento = "09";
break;
default:
break;
}
Expand Down
40 changes: 36 additions & 4 deletions api/contrib/firmarXML/xmlseclibs/src/XMLSecurityDSig.php
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ public function setSignPolicy(){
case (strpos($xmlns, 'v4.3') !== false):
$this->signPolicy = [
"name" => "",
"url" => "https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/Resoluci%C3%B3n_General_sobre_disposiciones_t%C3%A9cnicas_comprobantes_electr%C3%B3nicos_para_efectos_tributarios.pdf",
"url" => "https://atv.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/Resoluci%C3%B3n_General_sobre_disposiciones_t%C3%A9cnicas_comprobantes_electr%C3%B3nicos_para_efectos_tributarios.pdf",
"digest" => "0h7Q3dFHhu0bHbcZEgVc07cEcDlquUeG08HG6Iototo=" // Base64_Encode(Hash_File(SHA_256))
];
break;
Expand Down Expand Up @@ -822,6 +822,26 @@ public function addObject($data, $mimetype=null, $encoding=null)
return $objNode;
}

// Allows converting large hexadecimal string to large decimal string
// without precision issues or requiring PHP extensions like BC Math or GMP
public function stringHex2StringDec($hex) {
$dec = [];
$hexLen = strlen($hex);
for ($h = 0; $h < $hexLen; ++$h) {
$carry = hexdec($hex[$h]);
for ($i = 0; $i < count($dec); ++$i) {
$val = $dec[$i] * 16 + $carry;
$dec[$i] = $val % 10;
$carry = (int) ($val / 10);
}
while ($carry > 0) {
$dec[] = $carry % 10;
$carry = (int) ($carry / 10);
}
}
return join("", array_reverse($dec));
}

/**
* @param null|DOMNode $node
* @return null|XMLSecurityKey
Expand Down Expand Up @@ -1134,7 +1154,13 @@ public static function staticAdd509Cert($parentRef, $cert, $isPEMFormat=true, $i
$x509SubjectNode = $baseDoc->createElementNS(self::XMLDSIGNS, $dsig_pfx.'X509SubjectName', $subjectNameValue);
$x509DataNode->appendChild($x509SubjectNode);
}
if ($issuerSerial && ! empty($certData['issuer']) && ! empty($certData['serialNumber'])) {
if (strpos($certData['serialNumber'], "0x") === false) {
// https://bugs.php.net/bug.php?id=77411
$serialNumber = $certData['serialNumber'];
} else {
$serialNumber = stringHex2StringDec($certData['serialNumber']);
}
if ($issuerSerial && ! empty($certData['issuer']) && ! empty($serialNumber)) {
if (is_array($certData['issuer'])) {
$parts = array();
foreach ($certData['issuer'] AS $key => $value) {
Expand All @@ -1150,7 +1176,7 @@ public static function staticAdd509Cert($parentRef, $cert, $isPEMFormat=true, $i

$x509Node = $baseDoc->createElementNS(self::XMLDSIGNS, $dsig_pfx.'X509IssuerName', $issuerName);
$x509IssuerNode->appendChild($x509Node);
$x509Node = $baseDoc->createElementNS(self::XMLDSIGNS, $dsig_pfx.'X509SerialNumber', $certData['serialNumber']);
$x509Node = $baseDoc->createElementNS(self::XMLDSIGNS, $dsig_pfx.'X509SerialNumber', $serialNumber);
$x509IssuerNode->appendChild($x509Node);
}
}
Expand Down Expand Up @@ -1346,14 +1372,20 @@ public function appendXades($certInfo){
$digestValueNode = $this->createNewSignNode('DigestValue', $digestValue);
$certDigestNode->appendChild($digestValueNode);
$certData = openssl_x509_parse($certInfo["publicKey"]);
if (strpos($certData['serialNumber'], "0x") === false) {
// https://bugs.php.net/bug.php?id=77411
$serialNumber = $certData['serialNumber'];
} else {
$serialNumber = stringHex2StringDec($certData['serialNumber']);
}
$certIssuer = [];
foreach ($certData['issuer'] as $item => $value) {
$certIssuer[] = $item . '=' . $value;
}
$certIssuer = implode(', ', array_reverse($certIssuer));
$X509IssuerNameNode = $this->createNewSignNode('X509IssuerName', $certIssuer);
$issuerSerialNode->appendChild($X509IssuerNameNode);
$X509SerialNumber = $this->createNewSignNode('X509SerialNumber', $certData['serialNumber']);
$X509SerialNumber = $this->createNewSignNode('X509SerialNumber', $serialNumber);
$issuerSerialNode->appendChild($X509SerialNumber);
$signaturePolicyIdentifierNode = $this->createNewXadesNode('SignaturePolicyIdentifier');
$signedSignaturePropertiesNode->appendChild($signaturePolicyIdentifierNode);
Expand Down
Loading

0 comments on commit 3d5aa15

Please sign in to comment.