osodreamer-sri-xml-signer
Version:
Genera, firma, valida y autoriza comprobantes electrónicos XML para el SRI de Ecuador con certificados digitales (.p12) y estándar XAdES-BES.
1,340 lines (1,295 loc) • 102 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __decoratorStart = (base) => {
var _a;
return [, , , __create((_a = base == null ? void 0 : base[__knownSymbol("metadata")]) != null ? _a : null)];
};
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
var __runInitializers = (array, flags, self, value) => {
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
return value;
};
var __decorateElement = (array, flags, name, decorators, target, extra) => {
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
return __privateGet(this, extra);
}, set [name](x) {
return __privateSet(this, extra, x);
} }, name));
k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
for (var i = decorators.length - 1; i >= 0; i--) {
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
if (k) {
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
}
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
else if (typeof it !== "object" || it === null) __typeError("Object expected");
else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
}
return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
};
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
// src/index.ts
var index_exports = {};
__export(index_exports, {
BaseSRIError: () => BaseSRIError,
CODIGO_RETENCION_ENUM: () => CODIGO_RETENCION_ENUM,
CONTRIBUYENTE_RIMPE_ENUM: () => CONTRIBUYENTE_RIMPE_ENUM,
CampoAdicionalModel: () => CampoAdicionalModel,
CodigoPais: () => CodigoPais,
ComprobanteModel: () => ComprobanteModel,
DetAdicionalModel: () => DetAdicionalModel,
DetalleModel: () => DetalleModel,
DetallesAdicionalesModel: () => DetallesAdicionalesModel,
DetallesModel: () => DetallesModel,
ENV_ENUM: () => ENV_ENUM,
IDENTIFICATION_CODE_ENUM: () => IDENTIFICATION_CODE_ENUM,
IMPUESTO_A_RETENER_ENUM: () => IMPUESTO_A_RETENER_ENUM,
IVA_PERCENTAGE_CODE_ENUM: () => IVA_PERCENTAGE_CODE_ENUM,
ImpuestoDetalleModel: () => ImpuestoDetalleModel,
ImpuestosModel: () => ImpuestosModel,
InfoAdicionalModel: () => InfoAdicionalModel,
InfoFacturaModel: () => InfoFacturaModel,
InfoTributariaModel: () => InfoTributariaModel,
OBLIGADO_CONTABILIDAD_ENUM: () => OBLIGADO_CONTABILIDAD_ENUM,
PAYMENT_METHOD_CODE_ENUM: () => PAYMENT_METHOD_CODE_ENUM,
PagoModel: () => PagoModel,
PagosModel: () => PagosModel,
Retencion: () => Retencion,
RetencionModel: () => RetencionModel,
Retenciones: () => Retenciones,
RetencionesModel: () => RetencionesModel,
SRIAutorizacionError: () => SRIAutorizacionError,
SRIError: () => SRIError,
SRIRejectedError: () => SRIRejectedError,
SRIUnauthorizedError: () => SRIUnauthorizedError,
SRI_URLS: () => SRI_URLS,
TAX_CODE_ENUM: () => TAX_CODE_ENUM,
TotalConImpuestosModel: () => TotalConImpuestosModel,
TotalImpuestoModel: () => TotalImpuestoModel,
authorizeXml: () => authorizeXml,
generateXmlInvoice: () => generateXmlInvoice,
signXml: () => signXml,
validateXml: () => validateXml
});
module.exports = __toCommonJS(index_exports);
// src/sign-xml/common/utils/crypto.util.ts
var forge = __toESM(require("node-forge"));
var CryptoUtils = class {
hexToBase64(str) {
let hex = ("00" + str).slice(0 - str.length - str.length % 2);
const binary = hex.replace(/\r|\n/g, "").replace(
/([\da-fA-F]{2}) ?/g,
(match) => String.fromCharCode(parseInt(match, 16))
);
return forge.util.encode64(binary);
}
bigint3base64(bigint) {
const hex = bigint.toString(16).padStart(2, "0");
const binary = hex.match(/\w{2}/g).map((a) => String.fromCharCode(parseInt(a, 16))).join("");
const base64 = forge.util.encode64(binary);
return base64.match(/.{1,76}/g).join("\n");
}
p_obtener_aleatorio() {
const arr = new Uint32Array(1);
crypto.getRandomValues(arr);
return 1e5 + arr[0] % 99e5;
}
};
// src/sign-xml/infrastructure/errors/infrastructure.error.ts
var InfrastructureError = class extends Error {
constructor(message) {
super(message);
this.name = "InfrastructureError";
}
};
var UnknownSignStrategyError = class extends InfrastructureError {
constructor(friendlyName) {
super(`No existe estrategia para el certificado: ${friendlyName}`);
this.name = "UnknownSignStrategyError";
}
};
var SignStrategyError = class extends InfrastructureError {
constructor(message) {
super(message);
this.name = "SignStrategyError";
}
};
var SigningKeyNotFoundError = class extends SignStrategyError {
constructor(friendlyName) {
super(
`No se encontr\xF3 la clave de firma para el certificado: ${friendlyName}`
);
this.name = "SigningKeyNotFoundError";
}
};
var PrivateKeyExtractionError = class extends SignStrategyError {
constructor(sourceLabel = "archivo P12") {
super(`No se pudo extraer la clave privada desde ${sourceLabel}.`);
this.name = "PrivateKeyExtractionError";
}
};
var UanatacaCertificateNotFoundError = class extends SignStrategyError {
constructor() {
super("No se encontr\xF3 el certificado para UANATACA.");
this.name = "UanatacaCertificateNotFoundError";
}
};
var InvalidP12StructureError = class extends Error {
constructor() {
super("El archivo no es un archivo PKCS#12 (P12) v\xE1lido.");
this.name = "InvalidP12StructureError";
Object.setPrototypeOf(this, new.target.prototype);
}
};
var InvalidP12PasswordError = class extends Error {
constructor() {
super("El archivo P12 es v\xE1lido, pero la contrase\xF1a es incorrecta.");
this.name = "InvalidP12PasswordError";
Object.setPrototypeOf(this, new.target.prototype);
}
};
var InvalidXmlStructureError = class extends Error {
constructor(message = "El archivo proporcionado no es un XML v\xE1lido.") {
super(message);
this.name = "InvalidXmlStructureError";
Object.setPrototypeOf(this, new.target.prototype);
}
};
// src/sign-xml/infrastructure/certificate/strategies/banco-central.strategy.ts
var forge2 = __toESM(require("node-forge"));
var BancoCentralStrategy = class {
supports(friendlyName) {
return /BANCO CENTRAL/i.test(friendlyName);
}
getPrivateKey(bags) {
const item = bags.find(
(bag) => {
var _a, _b;
return /Signing Key/i.test((_b = (_a = bag.attributes) == null ? void 0 : _a.friendlyName) == null ? void 0 : _b[0]);
}
);
if (!item) throw new SigningKeyNotFoundError("BANCO CENTRAL");
if (item == null ? void 0 : item.key) {
return item.key;
} else if (item == null ? void 0 : item.asn1) {
return forge2.pki.privateKeyFromAsn1(item.asn1);
} else {
throw new PrivateKeyExtractionError();
}
}
overrideIssuerName(certBags) {
const cert = certBags[forge2.pki.oids.certBag][0].cert;
return cert.issuer.attributes.reverse().map((attr) => `${attr.shortName}=${attr.value}`).join(",");
}
};
// src/sign-xml/infrastructure/certificate/strategies/security-data.strategy.ts
var forge3 = __toESM(require("node-forge"));
var SecurityDataStrategy = class {
supports(friendlyName) {
return /SECURITY DATA/i.test(friendlyName);
}
getPrivateKey(bags) {
const item = bags[0];
if (!item) throw new SigningKeyNotFoundError("SECURITY DATAL");
if (item == null ? void 0 : item.key) {
return item.key;
} else if (item == null ? void 0 : item.asn1) {
return forge3.pki.privateKeyFromAsn1(item.asn1);
} else {
throw new PrivateKeyExtractionError();
}
}
overrideIssuerName(certBags) {
const cert = certBags[forge3.pki.oids.certBag][0].cert;
return cert.issuer.attributes.reverse().map((attr) => `${attr.shortName}=${attr.value}`).join(",");
}
};
// src/sign-xml/infrastructure/certificate/strategies/uanataca.strategy.ts
var forge4 = __toESM(require("node-forge"));
var UanatacaStrategy = class {
supports(friendlyName) {
return /UANATACA/i.test(friendlyName);
}
getPrivateKey(bags) {
const item = bags[0];
if (!item) throw new SigningKeyNotFoundError("UANATACA");
if (item == null ? void 0 : item.key) {
return item.key;
} else if (item == null ? void 0 : item.asn1) {
return forge4.pki.privateKeyFromAsn1(item.asn1);
} else {
throw new PrivateKeyExtractionError();
}
}
overrideIssuerName(certBags) {
const certItems = certBags[forge4.pki.oids.certBag];
if (!certItems || !certItems.length) {
throw new UanatacaCertificateNotFoundError();
}
const cert = certItems[0].cert;
return this.getX509IssuerName(cert);
}
getX509IssuerName(cert) {
const issuerName = cert.issuer.attributes.reverse().filter((attr) => attr.shortName || attr.type).map((attr) => {
if (attr.shortName) {
return `${attr.shortName}=${attr.value}`;
} else {
return `${attr.type}=${this.hexEncodeUtf8(attr.value)}`;
}
}).join(",");
return issuerName;
}
hexEncodeUtf8(value) {
const utf8Bytes = forge4.util.encodeUtf8(value);
const hex = forge4.util.bytesToHex(utf8Bytes);
return `#0c${utf8Bytes.length.toString(16).padStart(2, "0")}${hex}`;
}
};
// src/sign-xml/infrastructure/certificate/factories/sign-strategy.factory.ts
var SignStrategyFactory = class {
constructor() {
this.strategies = [
new BancoCentralStrategy(),
new SecurityDataStrategy(),
new UanatacaStrategy()
];
}
getStrategy(friendlyName) {
const strategy = this.strategies.find((s) => s.supports(friendlyName));
if (!strategy) {
throw new UnknownSignStrategyError(friendlyName);
}
return strategy;
}
};
// src/sign-xml/infrastructure/certificate/certificate-provider.implement.ts
var forge5 = __toESM(require("node-forge"));
var CertificateProviderImplement = class {
constructor(p12Buffer, password, strategyFactory, crypto2) {
this.p12Buffer = p12Buffer;
this.password = password;
this.strategyFactory = strategyFactory;
this.crypto = crypto2;
}
async getCertificateData() {
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
const uint8Array = new Uint8Array(this.p12Buffer);
const p12Base64 = forge5.util.binary.base64.encode(uint8Array);
const p12Decoded = forge5.util.decode64(p12Base64);
const p12Asn1 = forge5.asn1.fromDer(p12Decoded);
const p12 = forge5.pkcs12.pkcs12FromAsn1(p12Asn1, this.password);
const keyBags = p12.getBags({
bagType: forge5.pki.oids.pkcs8ShroudedKeyBag
});
const certBags = p12.getBags({ bagType: forge5.pki.oids.certBag });
const certificates = certBags[forge5.oids.certBag];
const friendlyName = (_i = (_c = (_b = (_a = certificates == null ? void 0 : certificates[1]) == null ? void 0 : _a.attributes) == null ? void 0 : _b.friendlyName) == null ? void 0 : _c[0]) != null ? _i : (_h = (_g = (_f = (_e = (_d = certificates == null ? void 0 : certificates[0]) == null ? void 0 : _d.cert) == null ? void 0 : _e.issuer) == null ? void 0 : _f.attributes) == null ? void 0 : _g[2]) == null ? void 0 : _h.value;
const strategy = this.strategyFactory.getStrategy(friendlyName);
const privateKey = strategy.getPrivateKey(
keyBags[forge5.oids.pkcs8ShroudedKeyBag]
);
const issuerName = strategy.overrideIssuerName(certBags);
const mainCertificate = certificates.reduce((prev, current) => {
return current.cert.extensions.length > prev.cert.extensions.length ? current : prev;
});
const certificate = mainCertificate.cert;
const certificateX509_asn1 = forge5.pki.certificateToAsn1(certificate);
const certificateX509_der = forge5.asn1.toDer(certificateX509_asn1);
const certificateX509_der_hash = forge5.util.encode64(
forge5.sha1.create().update(certificateX509_der.bytes()).digest().bytes()
);
const X509SerialNumber = new forge5.jsbn.BigInteger(
Array.from(Buffer.from(certificate.serialNumber, "hex"))
).toString();
const certificateX509 = forge5.util.encode64(certificateX509_der.bytes());
const exponent = this.crypto.hexToBase64(privateKey.e.data[0].toString(16));
const modulus = this.crypto.bigint3base64(privateKey.n);
return {
certificate,
certificateX509,
privateKey,
issuerName,
serialNumber: X509SerialNumber,
base64Der: certificateX509_der_hash,
publicKey: {
modulus,
exponent
}
};
}
};
// src/sign-xml/application/use-cases.ts
var SignXmlUseCase = class {
constructor(signerService, injector) {
this.signerService = signerService;
this.injector = injector;
}
async execute(input) {
const { xmlToSign, certData } = input;
const signatureXml = await this.signerService.sign({
xmlToSign,
certData
});
const finalXml = this.injector.insertSignature(signatureXml.xadesBes);
return finalXml;
}
};
// src/sign-xml/domain/enums/xml-namespaces.enum.ts
var XMLNS_ATTRIBUTE = `xmlns:ds="${"http://www.w3.org/2000/09/xmldsig#" /* DS */}" xmlns:etsi="${"http://uri.etsi.org/01903/v1.3.2#" /* ETSI */}"`;
// src/sign-xml/domain/builders/keyInfo.builder.ts
var KeyInfoBuilder = class {
build(params) {
const { certificateNumber, certificateX509, modulus, exponent } = params;
return [
`<ds:KeyInfo ${XMLNS_ATTRIBUTE} Id="Certificate${certificateNumber}">`,
"\n<ds:X509Data>",
"\n<ds:X509Certificate>\n",
certificateX509,
"\n</ds:X509Certificate>",
"\n</ds:X509Data>",
"\n<ds:KeyValue>",
"\n<ds:RSAKeyValue>",
"\n<ds:Modulus>\n",
modulus,
"\n</ds:Modulus>",
"\n<ds:Exponent>",
exponent,
"</ds:Exponent>",
"\n</ds:RSAKeyValue>",
"\n</ds:KeyValue>",
"\n</ds:KeyInfo>"
].join("");
}
};
// src/sign-xml/domain/builders/signed-info.builder.ts
var SignedInfoBuilder = class {
build(params) {
const { ids, sha1_SignedProperties, sha1_certificado, sha1_comprobante } = params;
return [
`<ds:SignedInfo ${XMLNS_ATTRIBUTE} Id="Signature-SignedInfo${ids.signedInfoNumber}">`,
`
<ds:CanonicalizationMethod Algorithm="${"http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /* XML_C14N_20010315 */}">`,
"</ds:CanonicalizationMethod>",
`
<ds:SignatureMethod Algorithm="${"http://www.w3.org/2000/09/xmldsig#rsa-sha1" /* RSA_SHA1 */}">`,
"</ds:SignatureMethod>",
`
<ds:Reference Id="SignedPropertiesID${ids.signedPropertiesIdNumber}" Type="${"http://uri.etsi.org/01903#SignedProperties" /* SIGNED_PROPERTIES */}" URI="#Signature${ids.signatureNumber}-SignedProperties${ids.signedPropertiesNumber}">`,
`
<ds:DigestMethod Algorithm="${"http://www.w3.org/2000/09/xmldsig#sha1" /* SHA1 */}">`,
"</ds:DigestMethod>",
"\n<ds:DigestValue>",
sha1_SignedProperties,
"</ds:DigestValue>",
"\n</ds:Reference>",
`
<ds:Reference URI="#Certificate${ids.certificateNumber}">`,
`
<ds:DigestMethod Algorithm="${"http://www.w3.org/2000/09/xmldsig#sha1" /* SHA1 */}">`,
"</ds:DigestMethod>",
"\n<ds:DigestValue>",
sha1_certificado,
"</ds:DigestValue>",
"\n</ds:Reference>",
`
<ds:Reference Id="Reference-ID-${ids.referenceIdNumber}" URI="#comprobante">`,
"\n<ds:Transforms>",
`
<ds:Transform Algorithm="${"http://www.w3.org/2000/09/xmldsig#enveloped-signature" /* ENVELOPED_SIGNATURE */}">`,
"</ds:Transform>",
"\n</ds:Transforms>",
`
<ds:DigestMethod Algorithm="${"http://www.w3.org/2000/09/xmldsig#sha1" /* SHA1 */}">`,
"</ds:DigestMethod>",
"\n<ds:DigestValue>",
sha1_comprobante,
"</ds:DigestValue>",
"\n</ds:Reference>",
"\n</ds:SignedInfo>"
].join("");
}
};
// src/sign-xml/domain/builders/signed-properties.builder.ts
var SignedPropertiesBuilder = class {
constructor(clock) {
this.clock = clock;
}
build(params) {
const {
signatureNumber,
signedPropertiesNumber,
certificateX509_der_hash,
issuerName,
X509SerialNumber,
referenceIdNumber
} = params;
const timestamp = this.clock.nowISO();
return [
`<etsi:SignedProperties ${XMLNS_ATTRIBUTE} Id="Signature${signatureNumber}-SignedProperties${signedPropertiesNumber}">`,
"<etsi:SignedSignatureProperties>",
"<etsi:SigningTime>",
timestamp,
"</etsi:SigningTime>",
"<etsi:SigningCertificate>",
"<etsi:Cert>",
"<etsi:CertDigest>",
`<ds:DigestMethod Algorithm="${"http://www.w3.org/2000/09/xmldsig#sha1" /* SHA1 */}">`,
"</ds:DigestMethod>",
"<ds:DigestValue>",
certificateX509_der_hash,
"</ds:DigestValue>",
"</etsi:CertDigest>",
"<etsi:IssuerSerial>",
"<ds:X509IssuerName>",
issuerName,
"</ds:X509IssuerName>",
"<ds:X509SerialNumber>",
X509SerialNumber,
"</ds:X509SerialNumber>",
"</etsi:IssuerSerial>",
"</etsi:Cert>",
"</etsi:SigningCertificate>",
"</etsi:SignedSignatureProperties>",
"<etsi:SignedDataObjectProperties>",
`<etsi:DataObjectFormat ObjectReference="#Reference-ID-${referenceIdNumber}">`,
"<etsi:Description>contenido comprobante</etsi:Description>",
"<etsi:MimeType>text/xml</etsi:MimeType>",
"</etsi:DataObjectFormat>",
"</etsi:SignedDataObjectProperties>",
"</etsi:SignedProperties>"
].join("");
}
};
// src/sign-xml/domain/assemblers/xades-document.assembler.ts
var XadesDocumentAssembler = class {
build(params) {
const { KeyInfo, SignedInfo, SignedProperties, ids, signature } = params;
return [
`<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature${ids.signatureNumber}">`,
"\n" + SignedInfo,
`
<ds:SignatureValue Id="SignatureValue${ids.signatureValueNumber}">
`,
signature,
"\n</ds:SignatureValue>",
"\n" + KeyInfo,
`
<ds:Object Id="Signature${ids.signatureNumber}-Object${ids.ObjectNumber}">`,
`<etsi:QualifyingProperties Target="#Signature${ids.signatureNumber}">`,
SignedProperties,
"</etsi:QualifyingProperties>",
"</ds:Object>",
"</ds:Signature>"
].join("");
}
};
// src/utils/date-utils.ts
function formatDDMMYYYY(date) {
const d = String(date.getDate()).padStart(2, "0");
const m = String(date.getMonth() + 1).padStart(2, "0");
const y = date.getFullYear();
return `${d}${m}${y}`;
}
function formatDDMM(date) {
const d = String(date.getDate()).padStart(2, "0");
const m = String(date.getMonth() + 1).padStart(2, "0");
return `${d}${m}`;
}
// src/utils/utf8.util.ts
function utf8Encode(str) {
if (str == null) throw new TypeError("Invalid input");
const encoder = new TextEncoder();
const bytes = encoder.encode(str);
return String.fromCharCode(...bytes);
}
// src/utils/xml.util.ts
function uint8ArrayToBase64(bytes) {
let binary = "";
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
// src/sign-xml/domain/xades-signature.service.ts
var XadesSignatureService = class {
constructor(clock, canonicalizer, hasher, idGenerator, signer) {
this.clock = clock;
this.canonicalizer = canonicalizer;
this.hasher = hasher;
this.idGenerator = idGenerator;
this.signer = signer;
}
async sign(data) {
const ids = this.idGenerator.generateAll();
const { certData, xmlToSign } = data;
const { issuerName } = certData;
const canonicalizedXml = await this.canonicalizer.canonicalize(xmlToSign);
const digestXml = this.hasher.sha1Base64(utf8Encode(canonicalizedXml));
const certDigest = certData.base64Der;
const serialNumber = certData.serialNumber;
const certificateX509 = certData.certificateX509;
const modulus = certData.publicKey.modulus;
const exponent = certData.publicKey.exponent;
const signedPropsBuilder = new SignedPropertiesBuilder(this.clock);
const SignedProperties = signedPropsBuilder.build({
signatureNumber: ids.signatureNumber,
signedPropertiesNumber: ids.signedPropertiesNumber,
certificateX509_der_hash: certDigest,
issuerName,
X509SerialNumber: serialNumber,
referenceIdNumber: ids.referenceIdNumber
});
const sha1_SignedProperties = this.hasher.sha1Base64(
utf8Encode(SignedProperties)
);
const KeyInfo = new KeyInfoBuilder().build({
certificateNumber: ids.certificateNumber.toString(),
certificateX509,
modulus,
exponent
});
const sha1_certificado = this.hasher.sha1Base64(KeyInfo);
const SignedInfo = new SignedInfoBuilder().build({
ids,
sha1_SignedProperties,
sha1_certificado,
sha1_comprobante: digestXml
});
const signatureValue = this.signer.signSha1RsaBase64(SignedInfo);
const xadesBes = new XadesDocumentAssembler().build({
ids,
SignedInfo,
signature: signatureValue,
KeyInfo,
SignedProperties
});
return { xadesBes };
}
};
// src/sign-xml/infrastructure/canonicalizer/exclusive-canonicalization-ts/Algorithm.ts
var Algorithm = class {
constructor(options) {
this.options = options;
}
name() {
return null;
}
/**
* Canonicaliza un nodo XML.
* @param node Nodo XML a procesar.
* @returns Una promesa que se resuelve con el resultado canonicalizado.
*/
async canonicalise(node) {
throw new Error("not implemented");
}
};
// src/sign-xml/infrastructure/canonicalizer/exclusive-canonicalization-ts/escape.ts
var entities = {
"&": "&",
'"': """,
"<": "<",
">": ">",
" ": "	",
"\n": "
",
"\r": "
"
};
function escapeAttributeEntities(input) {
return input.replace(/([&<"\t\n\r])/g, (char) => entities[char]);
}
function escapeTextEntities(input) {
return input.replace(/([&<>\r])/g, (char) => entities[char]);
}
// src/sign-xml/infrastructure/canonicalizer/exclusive-canonicalization-ts/ExclusiveCanonicalization.ts
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE = 8;
var ExclusiveCanonicalisation = class extends Algorithm {
constructor(options = {}) {
super(options);
this.includeComments = !!options.includeComments;
this.inclusiveNamespaces = options.inclusiveNamespaces || [];
}
name() {
return "http://www.w3.org/2001/10/xml-exc-c14n#" + (this.includeComments ? "WithComments" : "");
}
getIncludeComments() {
return this.includeComments;
}
setIncludeComments(include) {
this.includeComments = !!include;
}
getInclusiveNamespaces() {
return [...this.inclusiveNamespaces];
}
setInclusiveNamespaces(namespaces) {
this.inclusiveNamespaces = [...namespaces];
return this;
}
addInclusiveNamespace(ns) {
this.inclusiveNamespaces.push(ns);
return this;
}
async canonicalise(node) {
return this._processInner(node);
}
_compareAttributes(a, b) {
if (!a.prefix && b.prefix) return -1;
if (!b.prefix && a.prefix) return 1;
return a.name.localeCompare(b.name);
}
_compareNamespaces(a, b) {
const attr1 = a.prefix + a.namespaceURI;
const attr2 = b.prefix + b.namespaceURI;
return attr1.localeCompare(attr2);
}
_renderAttributes(node) {
return Array.from(node.attributes || []).filter((attr) => !attr.name.startsWith("xmlns")).sort(this._compareAttributes).map((attr) => ` ${attr.name}="${escapeAttributeEntities(attr.value)}"`).join("");
}
_renderNamespace(node, prefixesInScope, defaultNamespace) {
let res = "";
let newDefaultNamespace = defaultNamespace;
const newPrefixesInScope = [...prefixesInScope];
const nsListToRender = [];
const currentNamespace = node.namespaceURI || "";
if (node.prefix) {
const existing = newPrefixesInScope.find((e) => e.prefix === node.prefix);
if (!existing || existing.namespaceURI !== node.namespaceURI) {
newPrefixesInScope.filter((e) => e.prefix !== node.prefix);
nsListToRender.push({
prefix: node.prefix,
namespaceURI: node.namespaceURI
});
newPrefixesInScope.push({
prefix: node.prefix,
namespaceURI: node.namespaceURI
});
}
} else if (defaultNamespace !== currentNamespace) {
newDefaultNamespace = currentNamespace;
res += ` xmlns="${escapeAttributeEntities(newDefaultNamespace)}"`;
}
for (const attr of Array.from(node.attributes || [])) {
if (attr.prefix && attr.prefix !== "xmlns") {
const existing = newPrefixesInScope.find(
(e) => e.prefix === attr.prefix
);
if (!existing || existing.namespaceURI !== attr.namespaceURI) {
newPrefixesInScope.filter((e) => e.prefix !== attr.prefix);
nsListToRender.push({
prefix: attr.prefix,
namespaceURI: attr.namespaceURI
});
newPrefixesInScope.push({
prefix: attr.prefix,
namespaceURI: attr.namespaceURI
});
}
} else if (attr.prefix === "xmlns" && this.inclusiveNamespaces.includes(attr.localName)) {
nsListToRender.push({
prefix: attr.localName,
namespaceURI: attr.nodeValue
});
}
}
nsListToRender.sort(this._compareNamespaces);
for (const ns of nsListToRender) {
res += ` xmlns:${ns.prefix}="${escapeAttributeEntities(ns.namespaceURI)}"`;
}
return { rendered: res, newPrefixesInScope, newDefaultNamespace };
}
_renderComment(node) {
return `<!--${escapeTextEntities(node.data)}-->`;
}
_renderProcessingInstruction(node) {
return `<?${node.target}${node.data ? " " + escapeTextEntities(node.data) : ""}?>`;
}
_processInner(node, prefixesInScope = [], defaultNamespace = "") {
switch (node.nodeType) {
case TEXT_NODE:
return escapeTextEntities(node.data);
case COMMENT_NODE:
return this.includeComments ? this._renderComment(node) : "";
case PROCESSING_INSTRUCTION_NODE:
return this._renderProcessingInstruction(node);
case ELEMENT_NODE: {
const el = node;
const ns = this._renderNamespace(el, prefixesInScope, defaultNamespace);
const attrs = this._renderAttributes(el);
const children = Array.from(el.childNodes).map(
(child) => this._processInner(
child,
ns.newPrefixesInScope,
ns.newDefaultNamespace
)
).join("");
return `<${el.tagName}${ns.rendered}${attrs}>${children}</${el.tagName}>`;
}
default:
return "";
}
}
};
// src/sign-xml/infrastructure/canonicalizer/canonicalizer.implement.ts
var CanonicalizerImplement = class {
constructor(context) {
this.context = context;
}
async canonicalize() {
const targetNode = this.context.getRootNode();
const canonicalizer = new ExclusiveCanonicalisation({
includeComments: false,
inclusiveNamespaces: []
});
return await canonicalizer.canonicalise(targetNode);
}
};
// src/sign-xml/infrastructure/clock/clock.implement.ts
var ClockImplement = class {
nowISO() {
const date = /* @__PURE__ */ new Date();
const localOffset = date.getTimezoneOffset();
const desiredOffset = 300;
const targetDate = localOffset === desiredOffset ? date : new Date(date.getTime() + (desiredOffset - localOffset) * 6e4);
const y = targetDate.getFullYear();
const mo = String(targetDate.getMonth() + 1).padStart(2, "0");
const d = String(targetDate.getDate()).padStart(2, "0");
const h = String(targetDate.getHours()).padStart(2, "0");
const mi = String(targetDate.getMinutes()).padStart(2, "0");
const s = String(targetDate.getSeconds()).padStart(2, "0");
return `${y}-${mo}-${d}T${h}:${mi}:${s}-05:00`;
}
};
// src/sign-xml/infrastructure/forge-rsa-sha1-signer.implementation.ts
var forge6 = __toESM(require("node-forge"));
var ForgeRsaSha1Signer = class {
constructor(privateKey) {
this.privateKey = privateKey;
}
signSha1RsaBase64(input) {
var _a, _b;
const md3 = forge6.md.sha1.create();
md3.update(input, "utf8");
const rawSignature = this.privateKey.sign(md3);
const base64Signature = forge6.util.encode64(rawSignature);
return (_b = (_a = base64Signature.match(/.{1,76}/g)) == null ? void 0 : _a.join("\n")) != null ? _b : base64Signature;
}
};
// src/sign-xml/infrastructure/hash/hash-provider.implement.ts
var forge7 = __toESM(require("node-forge"));
var HashProviderImplement = class {
sha1Base64(input) {
const md3 = forge7.md.sha1.create();
md3.update(input);
const digestHex = md3.digest().toHex();
const digestBytes = forge7.util.hexToBytes(digestHex);
return forge7.util.encode64(digestBytes);
}
sha1RawBase64(input) {
throw new Error("Method not implemented.");
}
};
// src/sign-xml/infrastructure/signature-generation/signature-id-generator.implement.ts
var SignatureIdGeneratorImplement = class {
generateAll() {
return {
certificateNumber: this.p_obtener_aleatorio(),
signatureNumber: this.p_obtener_aleatorio(),
signedPropertiesNumber: this.p_obtener_aleatorio(),
signedInfoNumber: this.p_obtener_aleatorio(),
signedPropertiesIdNumber: this.p_obtener_aleatorio(),
referenceIdNumber: this.p_obtener_aleatorio(),
signatureValueNumber: this.p_obtener_aleatorio(),
ObjectNumber: this.p_obtener_aleatorio()
};
}
p_obtener_aleatorio() {
const arr = new Uint32Array(1);
crypto.getRandomValues(arr);
return (1e5 + arr[0] % 99e5).toString();
}
};
// src/sign-xml/infrastructure/XmlSignatureInjector.ts
var import_xmldom = require("@xmldom/xmldom");
var XmlSignatureInjector = class {
constructor(context) {
this.context = context;
}
insertSignature(signatureXml) {
const parser = new import_xmldom.DOMParser();
const serializer = new import_xmldom.XMLSerializer();
const doc = this.context.getDocument();
const signatureNode = parser.parseFromString(
signatureXml,
"application/xml"
).documentElement;
const imported = doc.importNode(signatureNode, true);
doc.documentElement.appendChild(imported);
return serializer.serializeToString(doc);
}
};
// src/sign-xml/infrastructure/composition/buildSignXmlUseCase.ts
function buildSignXmlUseCase(privateKey, context) {
const clock = new ClockImplement();
const canonicalizer = new CanonicalizerImplement(context);
const hasher = new HashProviderImplement();
const idGenerator = new SignatureIdGeneratorImplement();
const signer = new ForgeRsaSha1Signer(privateKey);
const injector = new XmlSignatureInjector(context);
const xadesService = new XadesSignatureService(
clock,
canonicalizer,
hasher,
idGenerator,
signer
);
return new SignXmlUseCase(xadesService, injector);
}
// src/sign-xml/infrastructure/handlers/error.handle.ts
var ErrorHandler = class {
static handle(error) {
if (error instanceof UanatacaCertificateNotFoundError) {
return {
code: "UANATACA_CERT_NOT_FOUND",
message: error.message,
original: error
};
}
if (error instanceof SigningKeyNotFoundError) {
return {
code: "SIGNING_KEY_NOT_FOUND",
message: error.message,
original: error
};
}
if (error instanceof PrivateKeyExtractionError) {
return {
code: "PRIVATE_KEY_EXTRACTION_ERROR",
message: error.message,
original: error
};
}
if (error instanceof UnknownSignStrategyError) {
return {
code: "UNKNOWN_SIGN_STRATEGY",
message: error.message,
original: error
};
}
if (error instanceof SignStrategyError) {
return {
code: "SIGN_STRATEGY_ERROR",
message: error.message,
original: error
};
}
if (error instanceof InvalidXmlStructureError) {
return {
code: "XML_STRUCTURE_ERROR",
message: error.message,
original: error
};
}
if (error instanceof InvalidP12PasswordError) {
return {
code: "P12_PASSWORD_ERROR",
message: error.message,
original: error
};
}
if (error instanceof InvalidP12StructureError) {
return {
code: "P12_STRUCTURE_ERROR",
message: error.message,
original: error
};
}
if (error instanceof InfrastructureError) {
return {
code: "INFRASTRUCTURE_ERROR",
message: error.message,
original: error
};
}
if (error instanceof Error) {
return {
code: "UNHANDLED_ERROR",
message: error.message,
original: error
};
}
return {
code: "UNKNOWN_ERROR",
message: "Ha ocurrido un error desconocido",
original: new Error(String(error))
};
}
};
// src/sign-xml/infrastructure/validations/p12.validation.ts
var forge8 = __toESM(require("node-forge"));
function assertIsValidP12OrThrow(buffer, password) {
const binaryStr = Array.from(buffer).map((b) => String.fromCharCode(b)).join("");
let asn13;
try {
asn13 = forge8.asn1.fromDer(forge8.util.createBuffer(binaryStr, "binary"));
} catch {
throw new InvalidP12StructureError();
}
try {
forge8.pkcs12.pkcs12FromAsn1(asn13, password);
} catch {
throw new InvalidP12PasswordError();
}
}
// src/sign-xml/infrastructure/xml-dom-context/xml-dom.context.ts
var import_xmldom2 = require("@xmldom/xmldom");
var XmlDomContext = class {
constructor(xmlString) {
try {
const dom = new import_xmldom2.DOMParser({
errorHandler: () => {
}
}).parseFromString(xmlString, "text/xml");
this.dom = dom;
} catch (err) {
throw new InvalidXmlStructureError();
}
}
getDocument() {
return this.dom;
}
getRootNode() {
return this.dom.documentElement;
}
};
// src/sign-xml/sign-xml.ts
async function signXml(cmd) {
try {
assertIsValidP12OrThrow(cmd.p12Buffer, cmd.password);
const certProvider = new CertificateProviderImplement(
cmd.p12Buffer,
cmd.password,
new SignStrategyFactory(),
new CryptoUtils()
);
const certData = await certProvider.getCertificateData();
const xmlToSign = new TextDecoder("utf-8").decode(cmd.xmlBuffer);
const context = new XmlDomContext(xmlToSign);
const signXmlUseCase = buildSignXmlUseCase(certData.privateKey, context);
const finalXml = await signXmlUseCase.execute({
xmlToSign,
certData
});
return finalXml;
} catch (error) {
const handled = ErrorHandler.handle(error);
console.error(`[${handled.code}] ${handled.message}`);
throw handled.original;
}
}
// src/generator/const/document-types.const.ts
var documentTypeCodes = {
factura: 1,
comprobanteRetencion: 7,
guiaRemision: 6,
notaCredito: 4,
notaDebito: 5,
liquidacionCompra: 3
};
var documentTypeName = {
1: "factura",
7: "comprobanteRetencion",
6: "guiaRemision",
4: "notaCredito",
5: "notaDebito",
3: "liquidacionCompra"
};
// src/generator/enums/iva-percent-code.enum.ts
var IVA_PERCENTAGE_CODE_ENUM = /* @__PURE__ */ ((IVA_PERCENTAGE_CODE_ENUM2) => {
IVA_PERCENTAGE_CODE_ENUM2["IVA_0"] = "0";
IVA_PERCENTAGE_CODE_ENUM2["IVA_12"] = "2";
IVA_PERCENTAGE_CODE_ENUM2["IVA_14"] = "3";
IVA_PERCENTAGE_CODE_ENUM2["IVA_15"] = "4";
IVA_PERCENTAGE_CODE_ENUM2["IVA_5"] = "5";
IVA_PERCENTAGE_CODE_ENUM2["NO_OBJETO_IVA"] = "6";
IVA_PERCENTAGE_CODE_ENUM2["EXENTO_IVA"] = "7";
IVA_PERCENTAGE_CODE_ENUM2["IVA_DIFERENCIADO"] = "8";
IVA_PERCENTAGE_CODE_ENUM2["IVA_13"] = "10";
return IVA_PERCENTAGE_CODE_ENUM2;
})(IVA_PERCENTAGE_CODE_ENUM || {});
// src/generator/const/iva-percent-label-const.ts
var IVA_PERCENTAGE_LABELS = {
["0" /* IVA_0 */]: "0 (0%)",
["2" /* IVA_12 */]: "2 (12%)",
["3" /* IVA_14 */]: "3 (14%)",
["4" /* IVA_15 */]: "4 (15%)",
["5" /* IVA_5 */]: "5 (5%)",
["6" /* NO_OBJETO_IVA */]: "6 (No objeto de IVA)",
["7" /* EXENTO_IVA */]: "7 (Exento de IVA)",
["8" /* IVA_DIFERENCIADO */]: "8 (IVA diferenciado)",
["10" /* IVA_13 */]: "10 (13%)"
};
// src/generator/enums/codigo-pais.enum.ts
var CodigoPais = /* @__PURE__ */ ((CodigoPais2) => {
CodigoPais2["AMERICAN_SAMOA"] = "016";
CodigoPais2["BOUVET_ISLAND"] = "074";
CodigoPais2["ARGENTINA"] = "101";
CodigoPais2["BOLIVIA"] = "102";
CodigoPais2["BRASIL"] = "103";
CodigoPais2["CANAD"] = "104";
CodigoPais2["COLOMBIA"] = "105";
CodigoPais2["COSTA_RICA"] = "106";
CodigoPais2["CUBA"] = "107";
CodigoPais2["CHILE"] = "108";
CodigoPais2["ANGUILA"] = "109";
CodigoPais2["ESTADOS_UNIDOS"] = "110";
CodigoPais2["GUATEMALA"] = "111";
CodigoPais2["HAIT"] = "112";
CodigoPais2["HONDURAS"] = "113";
CodigoPais2["JAMAICA"] = "114";
CodigoPais2["MALVINAS_ISLAS"] = "115";
CodigoPais2["MXICO"] = "116";
CodigoPais2["NICARAGUA"] = "117";
CodigoPais2["PANAM"] = "118";
CodigoPais2["PARAGUAY"] = "119";
CodigoPais2["PER"] = "120";
CodigoPais2["PUERTO_RICO"] = "121";
CodigoPais2["REPBLICA_DOMINICANA"] = "122";
CodigoPais2["EL_SALVADOR"] = "123";
CodigoPais2["TRINIDAD_Y_TOBAGO"] = "124";
CodigoPais2["URUGUAY"] = "125";
CodigoPais2["VENEZUELA"] = "126";
CodigoPais2["CURAZAO"] = "127";
CodigoPais2["BAHAMAS"] = "129";
CodigoPais2["BARBADOS"] = "130";
CodigoPais2["GRANADA"] = "131";
CodigoPais2["GUYANA"] = "132";
CodigoPais2["SURINAM"] = "133";
CodigoPais2["ANTIGUA_Y_BARBUDA"] = "134";
CodigoPais2["BELICE"] = "135";
CodigoPais2["DOMINICA"] = "136";
CodigoPais2["SAN_CRISTOBAL_Y_NEVIS"] = "137";
CodigoPais2["SANTA_LUCA"] = "138";
CodigoPais2["SAN_VICENTE_Y_LAS_GRANAD"] = "139";
CodigoPais2["ANTILLAS_HOLANDESAS"] = "140";
CodigoPais2["ARUBA"] = "141";
CodigoPais2["BERMUDA"] = "142";
CodigoPais2["GUADALUPE"] = "143";
CodigoPais2["GUYANA_FRANCESA"] = "144";
CodigoPais2["ISLAS_CAIMN"] = "145";
CodigoPais2["ISLAS_VIRGENES_BRITANICAS"] = "146";
CodigoPais2["JOHNSTON_ISLA"] = "147";
CodigoPais2["MARTINICA"] = "148";
CodigoPais2["MONTSERRAT_ISLA"] = "149";
CodigoPais2["TURCAS_Y_CAICOS_ISLAS"] = "151";
CodigoPais2["VIRGENES_ISLAS_NORTAMER"] = "152";
CodigoPais2["ALBANIA"] = "201";
CodigoPais2["ALEMANIA"] = "202";
CodigoPais2["AUSTRIA"] = "203";
CodigoPais2["BLGICA"] = "204";
CodigoPais2["BULGARIA"] = "205";
CodigoPais2["ALBORAN_Y_PEREJIL"] = "207";
CodigoPais2["DINAMARCA"] = "208";
CodigoPais2["ESPAA"] = "209";
CodigoPais2["FRANCIA"] = "211";
CodigoPais2["FINLANDIA"] = "212";
CodigoPais2["REINO_UNIDO"] = "213";
CodigoPais2["GRECIA"] = "214";
CodigoPais2["PAISES_BAJOS_HOLANDA"] = "215";
CodigoPais2["HUNGRA"] = "216";
CodigoPais2["IRLANDA"] = "217";
CodigoPais2["ISLANDIA"] = "218";
CodigoPais2["ITALIA"] = "219";
CodigoPais2["LUXEMBURGO"] = "220";
CodigoPais2["MALTA"] = "221";
CodigoPais2["NORUEGA"] = "222";
CodigoPais2["POLONIA"] = "223";
CodigoPais2["PORTUGAL"] = "224";
CodigoPais2["RUMANIA"] = "225";
CodigoPais2["SUECIA"] = "226";
CodigoPais2["SUIZA"] = "227";
CodigoPais2["CANARIAS_ISLAS"] = "228";
CodigoPais2["UCRANIA"] = "229";
CodigoPais2["RUSIA"] = "230";
CodigoPais2["YUGOSLAVIA"] = "231";
CodigoPais2["ANDORRA"] = "233";
CodigoPais2["LIECHTENSTEIN"] = "234";
CodigoPais2["MNACO"] = "235";
CodigoPais2["SAN_MARINO"] = "237";
CodigoPais2["VATICANO_SANTA_SEDE"] = "238";
CodigoPais2["GIBRALTAR"] = "239";
CodigoPais2["BELARUS"] = "241";
CodigoPais2["BOSNIA_Y_HERZEGOVINA"] = "242";
CodigoPais2["CROACIA"] = "243";
CodigoPais2["ESLOVENIA"] = "244";
CodigoPais2["ESTONIA"] = "245";
CodigoPais2["GEORGIA"] = "246";
CodigoPais2["GROENLANDIA"] = "247";
CodigoPais2["LETONIA"] = "248";
CodigoPais2["LITUANIA"] = "249";
CodigoPais2["MOLDOVA"] = "250";
CodigoPais2["MACEDONIA"] = "251";
CodigoPais2["ESLOVAQUIA"] = "252";
CodigoPais2["ISLAS_FAROE"] = "253";
CodigoPais2["FRENCH_SOUTHERN_TERRITORIES"] = "260";
CodigoPais2["AFGANISTAN"] = "301";
CodigoPais2["ARABIA_SAUDITA"] = "302";
CodigoPais2["MYANMAR_BURMA"] = "303";
CodigoPais2["CAMBOYA"] = "304";
CodigoPais2["COREA_NORTE"] = "306";
CodigoPais2["TAIWAN_CHINA"] = "307";
CodigoPais2["FILIPINAS"] = "308";
CodigoPais2["INDIA"] = "309";
CodigoPais2["INDONESIA"] = "310";
CodigoPais2["IRAK"] = "311";
CodigoPais2["IRN_REPBLICA_ISLMICA"] = "312";
CodigoPais2["ISRAEL"] = "313";
CodigoPais2["JAPN"] = "314";
CodigoPais2["JORDANIA"] = "315";
CodigoPais2["KUWAIT"] = "316";
CodigoPais2["LAOS_REP_POP_DEMOC"] = "317";
CodigoPais2["LIBANO"] = "318";
CodigoPais2["MALASIA"] = "319";
CodigoPais2["MONGOLIA_MANCHURIA"] = "321";
CodigoPais2["PAKISTN"] = "322";
CodigoPais2["SIRIA"] = "323";
CodigoPais2["TAILANDIA"] = "325";
CodigoPais2["BAHREIN"] = "327";
CodigoPais2["BANGLADESH"] = "328";
CodigoPais2["BUTN"] = "329";
CodigoPais2["COREA_DEL_SUR"] = "330";
CodigoPais2["CHINA_POPULAR"] = "331";
CodigoPais2["CHIPRE"] = "332";
CodigoPais2["EMIRATOS_ARABES_UNIDOS"] = "333";
return CodigoPais2;
})(CodigoPais || {});
// src/generator/enums/codigo-retencion.enum.ts
var CODIGO_RETENCION_ENUM = /* @__PURE__ */ ((CODIGO_RETENCION_ENUM2) => {
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["IVA_CIENTO_POR_CIENTO_RESOLUCION"] = 3] = "IVA_CIENTO_POR_CIENTO_RESOLUCION";
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["IVA_DOCE_POR_CIENTO_PRESUNTIVO_EDITORES"] = 4] = "IVA_DOCE_POR_CIENTO_PRESUNTIVO_EDITORES";
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["IVA_CIENTO_POR_CIENTO_DISTRIBUIDORES"] = 5] = "IVA_CIENTO_POR_CIENTO_DISTRIBUIDORES";
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["IVA_CIENTO_POR_CIENTO_VOCEADORES"] = 6] = "IVA_CIENTO_POR_CIENTO_VOCEADORES";
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["RENTA_DOS_POR_MIL"] = 327] = "RENTA_DOS_POR_MIL";
CODIGO_RETENCION_ENUM2[CODIGO_RETENCION_ENUM2["RENTA_TRES_POR_MIL"] = 328] = "RENTA_TRES_POR_MIL";
return CODIGO_RETENCION_ENUM2;
})(CODIGO_RETENCION_ENUM || {});
// src/generator/enums/contribuyente-rimpe.enum.ts
var CONTRIBUYENTE_RIMPE_ENUM = /* @__PURE__ */ ((CONTRIBUYENTE_RIMPE_ENUM2) => {
CONTRIBUYENTE_RIMPE_ENUM2["RIMPE_GENERAL"] = "CONTRIBUYENTE R\xC9GIMEN RIMPE";
CONTRIBUYENTE_RIMPE_ENUM2["RIMPE_POPULAR"] = "CONTRIBUYENTE NEGOCIO POPULAR - R\xC9GIMEN RIMPE";
return CONTRIBUYENTE_RIMPE_ENUM2;
})(CONTRIBUYENTE_RIMPE_ENUM || {});
// src/generator/enums/env.enum.ts
var ENV_ENUM = /* @__PURE__ */ ((ENV_ENUM2) => {
ENV_ENUM2[ENV_ENUM2["TEST"] = 1] = "TEST";
ENV_ENUM2[ENV_ENUM2["PROD"] = 2] = "PROD";
return ENV_ENUM2;
})(ENV_ENUM || {});
// src/generator/enums/identification-code.enum.ts
var IDENTIFICATION_CODE_ENUM = /* @__PURE__ */ ((IDENTIFICATION_CODE_ENUM2) => {
IDENTIFICATION_CODE_ENUM2["RUC"] = "04";
IDENTIFICATION_CODE_ENUM2["CEDULA"] = "05";
IDENTIFICATION_CODE_ENUM2["PASAPORTE"] = "06";
IDENTIFICATION_CODE_ENUM2["CONSUMIDOR_FINAL"] = "07";
IDENTIFICATION_CODE_ENUM2["EXTERIOR"] = "08";
return IDENTIFICATION_CODE_ENUM2;
})(IDENTIFICATION_CODE_ENUM || {});
// src/generator/enums/impuesto-retener.enum.ts
var IMPUESTO_A_RETENER_ENUM = /* @__PURE__ */ ((IMPUESTO_A_RETENER_ENUM2) => {
IMPUESTO_A_RETENER_ENUM2[IMPUESTO_A_RETENER_ENUM2["IVA_PRESUNTIVO_Y_RENTA"] = 4] = "IVA_PRESUNTIVO_Y_RENTA";
return IMPUESTO_A_RETENER_ENUM2;
})(IMPUESTO_A_RETENER_ENUM || {});
// src/generator/enums/obligado-contabilidad.enum.ts
var OBLIGADO_CONTABILIDAD_ENUM = /* @__PURE__ */ ((OBLIGADO_CONTABILIDAD_ENUM2) => {
OBLIGADO_CONTABILIDAD_ENUM2["SI"] = "SI";
OBLIGADO_CONTABILIDAD_ENUM2["NO"] = "NO";
return OBLIGADO_CONTABILIDAD_ENUM2;
})(OBLIGADO_CONTABILIDAD_ENUM || {});
// src/generator/enums/payment-method-code.enu,.ts
var PAYMENT_METHOD_CODE_ENUM = /* @__PURE__ */ ((PAYMENT_METHOD_CODE_ENUM2) => {
PAYMENT_METHOD_CODE_ENUM2["SIN_UTILIZACION_DEL_SISTEMA_FINANCIERO"] = "01";
PAYMENT_METHOD_CODE_ENUM2["COMPENSACION_DE_DEUDAS"] = "15";
PAYMENT_METHOD_CODE_ENUM2["TARJETA_DE_DEBITO"] = "16";
PAYMENT_METHOD_CODE_ENUM2["DINERO_ELECTRONICO"] = "17";
PAYMENT_METHOD_CODE_ENUM2["TARJETA_PREPAGO"] = "18";
PAYMENT_METHOD_CODE_ENUM2["TARJETA_DE_CREDITO"] = "19";
PAYMENT_METHOD_CODE_ENUM2["OTROS_CON_SISTEMA_FINANCIERO"] = "20";
PAYMENT_METHOD_CODE_ENUM2["ENDOSO_DE_TITULOS"] = "21";
return PAYMENT_METHOD_CODE_ENUM2;
})(PAYMENT_METHOD_CODE_ENUM || {});
// src/generator/enums/tax-code.enum.ts
var TAX_CODE_ENUM = /* @__PURE__ */ ((TAX_CODE_ENUM2) => {
TAX_CODE_ENUM2[TAX_CODE_ENUM2["VAT"] = 2] = "VAT";
TAX_CODE_ENUM2[TAX_CODE_ENUM2["ICE"] = 3] = "ICE";
TAX_CODE_ENUM2[TAX_CODE_ENUM2["IRBPNR"] = 5] = "IRBPNR";
return TAX_CODE_ENUM2;
})(TAX_CODE_ENUM || {});
// src/generator/invoice/utils/clave-acceso.util.ts
function p_obtener_codigo_autorizacion(fechaEmision = /* @__PURE__ */ new Date(), tipoComprobante = "factura", ruc = "9999999999999", ambiente = 1 /* TEST */, estab = 1, ptoEmi = 1, secuencial, codigo, tipoEmision = 1) {
var _a;
const formattedDate = formatDDMMYYYY(fechaEmision);
const tipoDoc = (_a = documentTypeCodes[tipoComprobante]) != null ? _a : "01";
if (!secuencial) throw new Error("El secuencial es obligatorio");
codigo = codigo != null ? codigo : formatDDMM(fechaEmision) + pad(secuencial, 4).slice(-3) + p_calcular_digito_modulo11(
formatDDMM(fechaEmision) + pad(secuencial, 3).slice(-3)
);
const codigo_autorizacion = formattedDate + pad(tipoDoc, 2) + pad(ruc, 13) + pad(ambiente, 1) + pad(estab, 3) + pad(ptoEmi, 3) + pad(secuencial, 9) + pad(codigo, 8) + pad(tipoEmision, 1);
const digito_calculado = p_calcular_digito_modulo11(codigo_autorizacion);
return digito_calculado > -1 ? codigo_autorizacion + digito_calculado : "";
}
function pad(n, width, z = "0") {
return n.toString().padStart(width, z);
}
function p_calcular_digito_modulo11(numero) {
if (!/^\d+$/.test(numero)) return -1;
const digitos = numero.split("").map(Number);
let suma = digitos.reduce(
(total, valor, i) => total + valor * (7 - i % 6),
0
);
let digito = 11 - sum