Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c1e735d
Se actualiza versión
FerCarrilloM Aug 13, 2025
4e83e31
Se agrega XSLT para sellado.
FerCarrilloM Aug 13, 2025
1e8a138
Se agrega método de Stamp Retention
FerCarrilloM Aug 13, 2025
89c5169
Se agregan UT.
FerCarrilloM Aug 13, 2025
70fdab2
Se agregan los xslt restantes
FerCarrilloM Aug 13, 2025
1a385ba
Se actualiza README
FerCarrilloM Aug 26, 2025
c915f10
Merge pull request #107 from lunasoft/bugfix/DEVOPS-721
SwAeyrton Aug 26, 2025
0763870
fix README
FerCarrilloM Aug 26, 2025
2836b0b
Se ajusta función de sellado
FerCarrilloM Aug 26, 2025
f3c3fd6
Merge remote-tracking branch 'origin/develop' into feature/retencione…
FerCarrilloM Aug 26, 2025
4a963f0
fix UT
FerCarrilloM Aug 26, 2025
24d0b4f
prueba de UT
FerCarrilloM Aug 26, 2025
5ef2d4e
ajuste UT
FerCarrilloM Aug 26, 2025
77c529c
Merge pull request #109 from lunasoft/feature/retencionesRest
FerCarrilloM Aug 27, 2025
da9cbb7
Feature(SS-858): Se agregan metodos de cancelación de retenciones
martinfnsw Aug 31, 2025
563f71b
Fix variables
martinfnsw Sep 1, 2025
b017d3c
Feature(SS-858): add readme
martinfnsw Sep 1, 2025
a87a535
Merge pull request #110 from lunasoft/feature/SS-858
martinfnsw Sep 1, 2025
4867426
Merge branch 'bugfix/DEVOPS-721' into develop
martinfnsw Sep 3, 2025
9f6ffd8
Feature(SS-838): Fix Sign retention
martinfnsw Sep 5, 2025
3af5e1c
Feature(SS-838): remove xslt
martinfnsw Sep 5, 2025
207a428
javadoc
martinfnsw Sep 5, 2025
62ea121
add UT 401
martinfnsw Sep 5, 2025
544a626
Merge pull request #114 from lunasoft/feature/SS-838
martinfnsw Sep 5, 2025
b3d348e
update nexusurl
alinerz01 Sep 5, 2025
a263217
Feature(SS-881): Se agrega obtener saldo por Id
martinfnsw Dec 5, 2025
48c07ce
Merge pull request #117 from lunasoft/feature/SS-881
martinfnsw Dec 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
407 changes: 405 additions & 2 deletions README.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
</properties>
<artifactId>SW-JAVA</artifactId>
<version>1.0.21.3</version>
<version>1.0.25.1</version>
<packaging>jar</packaging>
<scm>
<url>https://github.com/lunasoft/sw-sdk-java</url>
Expand Down Expand Up @@ -212,7 +212,7 @@
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@

import java.io.IOException;
import java.util.UUID;

import Exceptions.AuthException;
import Exceptions.GeneralException;
import Services.SWService;
import Utils.Helpers.EnumBalanceStamp.AccountBalanceAction;
import Utils.Requests.BalanceAccount.BalanceAcctOptionsRequest;
import Utils.Requests.BalanceAccount.BalanceAcctRequest;
import Utils.Helpers.EnumBalanceStamp.AccountBalanceAction;
import Utils.Responses.IResponse;

/**
Expand Down Expand Up @@ -59,6 +60,22 @@ public IResponse GetBalanceAccount() throws AuthException, GeneralException, IOE
return BalanceAcctRequest.createBalanceAcctRequest(settings);
}

/**
* Obtiene el saldo de la cuenta de un usuario específico.
*
* @param idUser ID del usuario del cual se desea obtener el saldo.
* @return IResponse con el resultado de la operación.
* @throws AuthException Si la autenticación falla.
* @throws GeneralException Si ocurre un error general.
* @throws IOException Si hay un error de entrada/salida.
*/
public IResponse GetUserBalanceAccount(UUID idUser) throws AuthException, GeneralException, IOException {
BalanceAcctOptionsRequest settings = BalanceAcctOptionsRequest.getUserBalanceRequest(getToken(),
getURIAPI() == null ? getURI() : getURIAPI(), idUser,
getProxyHost(), getProxyPort());
return BalanceAcctRequest.createUserBalanceRequest(settings);
}

/**
* Realiza un movimiento de agregar saldo en la cuenta.
*
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/Services/Cancelation/SWCancelationService.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,25 @@ public SWCancelationService(String token, String URI, String proxyHost, int prox
}

public IResponse Cancelation(String uuid, String password, String rfc, String b64Cer, String b64Key, String motivo, String folioSustitucion) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc, b64Cer, b64Key, motivo, folioSustitucion, getProxyHost(), getProxyPort());
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc, b64Cer, b64Key, motivo, folioSustitucion, false, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequest(settings);
}

public IResponse Cancelation(String xml) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), xml, getProxyHost(), getProxyPort());
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), xml, false, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequestXml(settings, true);
}

public IResponse Cancelation(String uuid, String password, String rfc, String b64Pfx, String motivo, String folioSustitucion) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc, b64Pfx, motivo, folioSustitucion, getProxyHost(), getProxyPort());
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc, b64Pfx, motivo, folioSustitucion, false, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequestPfx(settings);
}

public IResponse Cancelation(String uuid, String rfc, String motivo, String folioSustitucion) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, rfc, motivo, folioSustitucion, getProxyHost(), getProxyPort());
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, rfc, motivo, folioSustitucion, false, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequestUuid(settings);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package Services.CancelationRetention;

import java.io.IOException;
import Exceptions.AuthException;
import Exceptions.GeneralException;
import Services.SWService;
import Utils.Requests.Cancelation.CancelationOptionsRequest;
import Utils.Requests.Cancelation.CancelationRequest;
import Utils.Responses.IResponse;

/**
* Servicio para implementaci�n de cancelaci�n de retenciones.
*/
public class SWCancelationRetentionService extends SWService {

public SWCancelationRetentionService(String user, String password, String URI) throws AuthException {
super(user, password, URI);
}

public SWCancelationRetentionService(String token, String URI) {
super(token, URI);
}

public SWCancelationRetentionService(String user, String password, String URI, String proxyHost, int proxyPort)
throws AuthException {
super(user, password, URI, proxyHost, proxyPort);
}

public SWCancelationRetentionService(String token, String URI, String proxyHost, int proxyPort) {
super(token, URI, proxyHost, proxyPort);
}

/**
* Realiza la cancelaci�n de retenciones utilizando el certificado CSD.
*
* @param uuid uuid factura.
* @param password password de llave privada.
* @param rfc rfc emisor.
* @param csd String base64 del certificado.
* @param key String base64 de llave privada.
* @param motivo motivo de cancelacion.
* @param folioSustitucion uuid factura que sustituye.
* @throws AuthException Si ocurre un error de autenticaci�n.
* @throws GeneralException Si ocurre un error general en el proceso.
* @throws IOException Si ocurre un error de entrada/salida.
* @return {@link IResponse} La respuesta del servicio de cancelaci�n.
*/
public IResponse Cancelation(String uuid, String password, String rfc, String b64Cer, String b64Key, String motivo,
String folioSustitucion) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc,
b64Cer, b64Key, motivo, folioSustitucion, true, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequest(settings);
}

/**
* Realiza la cancelaci�n de retenciones mediante PFX.
*
* @param uuid uuid factura.
* @param password password de llave privada.
* @param rfc rfc emisor.
* @param b64Pfx El archivo PFX del contribuyente codificado en
* Base64.
* @param motivo motivo de cancelacion.
* @param folioSustitucion uuid factura que sustituye.
* @throws AuthException Si ocurre un error de autenticaci�n.
* @throws GeneralException Si ocurre un error general en el proceso.
* @throws IOException Si ocurre un error de entrada/salida.
* @return {@link IResponse} La respuesta del servicio de cancelaci�n.
*/
public IResponse Cancelation(String uuid, String password, String rfc, String b64Pfx, String motivo,
String folioSustitucion) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), uuid, password, rfc,
b64Pfx, motivo, folioSustitucion, true, getProxyHost(), getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequestPfx(settings);
}

/**
* Realiza la cancelaci�n de retenciones mediante XML.
*
* @param xml String XML de cancelaci�n de retenciones.
* @throws AuthException Si ocurre un error de autenticaci�n.
* @throws GeneralException Si ocurre un error general en el proceso.
* @throws IOException Si ocurre un error de entrada/salida.
* @return {@link IResponse} respuesta del servicio de cancelaci�n.
*/
public IResponse Cancelation(String xml) throws AuthException, GeneralException, IOException {
CancelationOptionsRequest settings = new CancelationOptionsRequest(getToken(), getURI(), xml, true, getProxyHost(),
getProxyPort());
CancelationRequest req = new CancelationRequest();
return req.sendRequestXml(settings, true);
}
}
128 changes: 128 additions & 0 deletions src/main/java/Services/StampRetention/SWStampRetentionService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package Services.StampRetention;
import java.io.IOException;
import java.nio.charset.Charset;

import Exceptions.AuthException;
import Exceptions.GeneralException;
import Services.SWService;
import Utils.Requests.StampRetention.StampRetentionOptionsRequest;
import Utils.Requests.StampRetention.StampRetentionRequest;
import Utils.Responses.IResponse;

public class SWStampRetentionService extends SWService {

public SWStampRetentionService(String user, String password, String URI) throws AuthException {
super(user, password, URI);
}

public SWStampRetentionService(String token, String URI) {
super(token, URI);
}

public SWStampRetentionService(String user, String password, String URI, String proxyHost, int proxyPort)
throws AuthException {
super(user, password, URI, proxyHost, proxyPort);
}

public SWStampRetentionService(String token, String URI, String proxyHost, int proxyPort) {
super(token, URI, proxyHost, proxyPort);
}

/**
* Servicio para timbrar un CFDI de retenciones en formato XML.
*
* Realiza el timbrado de un CFDI de retenciones en formato XML.
*
* @param xml String del CFDI en formato XML.
* @param version Versión del servicio.
* @return Respuesta del servicio.
* @throws AuthException Excepción de autenticación.
* @throws GeneralException Excepción general.
* @throws IOException Excepción de entrada/salida.
*/
public IResponse StampRetention(String xml, String version) throws AuthException, GeneralException, IOException{
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xml, version, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}

/**
* Servicio para timbrar un CFDI de retenciones en formato XML o Base64 dependiendo de la
* bandera isb64.
*
* Realiza el timbrado de un CFDI de retenciones en formato XML.
*
* @param xml String del CFDI en formato XML.
* @param version Versión del servicio.
* @param isb64 Bandera que indica si el XML está en formato Base64.
* @return Respuesta del servicio.
* @throws AuthException Excepción de autenticación.
* @throws GeneralException Excepción general.
* @throws IOException Excepción de entrada/salida.
*/
public IResponse StampRetention(String xml, String version, boolean isb64) throws AuthException, GeneralException, IOException{
if (isb64){
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xml, version, isb64, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}
else{
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xml, version, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}
}

/**
* Servicio para timbrar un CFDI de retenciones en formato XML a partir de un archivo byte[]
*
* Realiza el timbrado de un CFDI de retenciones en formato XML.
*
* @param xmlFile Arreglo de bytes que representa el archivo XML o Base64 del CFDI de retención.
* @param version Versión del servicio.
* @return Respuesta del servicio.
* @throws AuthException Excepción de autenticación.
* @throws GeneralException Excepción general.
* @throws IOException Excepción de entrada/salida.
*/
public IResponse StampRetention(byte[] xmlFile, String version) throws AuthException, GeneralException, IOException{
String xmlProcess = new String(xmlFile, Charset.forName("UTF-8"));
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xmlProcess, version, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}

/**
* Servicio para timbrar un CFDI de retenciones en formato XML a partir de un archivo byte[] o
* Base64.
*
* Realiza el timbrado de un CFDI de retenciones en formato XML.
*
* @param xmlFile Arreglo de bytes que representa el archivo XML o Base64 del CFDI de retención.
* @param version Versión del servicio.
* @param isb64 Bandera que indica si el XML está en formato Base64.
* @return Respuesta del servicio.
* @throws AuthException Excepción de autenticación.
* @throws GeneralException Excepción general.
* @throws IOException Excepción de entrada/salida.
*/
public IResponse StampRetention(byte[] xmlFile, String version, boolean isb64) throws AuthException, GeneralException, IOException{
String xmlProcess = new String(xmlFile, Charset.forName("UTF-8"));
if (isb64){
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xmlProcess, version, isb64, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}
else{
StampRetentionOptionsRequest settings = new StampRetentionOptionsRequest(getToken(), getURI(), xmlProcess, version, getProxyHost(),
getProxyPort());
StampRetentionRequest req = new StampRetentionRequest();
return req.sendRequest(settings);
}
}
}
4 changes: 4 additions & 0 deletions src/main/java/Utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public class Constants {
public static String BASE_PATH = "https://services.test.sw.com.mx";
public static String AUTH_PATH_V2 = "/v2/security/authenticate";
public static String STAMP_PATH = "/cfdi33/stamp/";
public static String STAMP_RETENTION_PATH = "/retencion/stamp/";
public static String STAMP_ZIP_PATH = "/cfdi/stamp/v1/zip/";
public static String STAMP_V2_PATH = "/cfdi33/v2/stamp/";
public static String ISSUE_JSON_PATH = "/v3/cfdi33/issue/json/";
Expand All @@ -15,6 +16,9 @@ public class Constants {
public static String CANCELATION_CSD_PATH = "/cfdi33/cancel/csd";
public static String CANCELATION_XML_PATH = "/cfdi33/cancel/xml";
public static String CANCELATION_PFX_PATH = "/cfdi33/cancel/pfx";
public static String CANCELATION_RET_CSD_PATH = "/retencion/cancel/csd";
public static String CANCELATION_RET_XML_PATH = "/retencion/cancel/xml";
public static String CANCELATION_RET_PFX_PATH = "/retencion/cancel/pfx";
public static String CANCELATION_UUID_PATH = "/cfdi33/cancel/";
public static String BALANCE_ACCOUNT_PATH = "/account/balance/";
public static String BALANCE_ACCOUNT_MANAGEMENT_PATH = "/management/api/balance/";
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/Utils/Helpers/BuildRetentionResponseV3.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package Utils.Helpers;
import org.json.JSONObject;
import Utils.Responses.IResponse;
import Utils.Responses.StampRetention.SuccessV3Response;

public class BuildRetentionResponseV3 extends ResponseStamp {
public IResponse getResponse(){
if(!response.trim().isEmpty() && status < 500){
JSONObject body = new JSONObject(response);
if(status == 200){
JSONObject data = body.getJSONObject("data");
return new SuccessV3Response(status, body.getString("status"), data.getString("retencion"), "OK", "OK");
}
else{
String messageDetail = "";
if (!body.isNull("messageDetail")){
messageDetail = body.getString("messageDetail");
}
if(body.getString("message").equals("307. El comprobante contiene un timbre previo.")) {
if(!body.isNull("data")) {
JSONObject data = body.getJSONObject("data");
return new SuccessV3Response(status, body.getString("status"), data.getString("retencion"), body.getString("message"), messageDetail);
}
}
return new SuccessV3Response(status, body.getString("status"), "", body.getString("message"), messageDetail);
}
}
else {
return new SuccessV3Response(status, "error", "","Error con código "+status+": "+reason.getReasonPhrase(), response);
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/Utils/Helpers/ResponseStampRetentionBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package Utils.Helpers;

public class ResponseStampRetentionBuilder {
public static ResponseStamp StampedRetention(char version){
switch(version){
case '3': return new BuildRetentionResponseV3();
default: return null;
}
}
}
Loading
Loading