Skip to content

Commit 8872ea1

Browse files
committed
Add new XML test cases for DespatchAdvice and update summary documents
- Created multiple XML test cases for DespatchAdvice under GRETransportistaCasuisticasTest, including: - vehiculoM1L.xml - transportistaBasico.xml - transportistaComercioExterior.xml - transportistaConCarreta.xml - transportistaMultiplesConductores.xml - Updated summaryDocuments.xml and summaryDocuments_anularBoletaExonerada.xml to include TaxPercent elements for tax subtotals. Signed-off-by: Edwin Luis Barboza Pinedo <ibarboza27498@gmail.com>
1 parent 9b0af74 commit 8872ea1

52 files changed

Lines changed: 6255 additions & 821 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

examples/springbot/src/main/java/io/github/project/openubl/quickstart/xbuilder/springboot/XBuilderController.java

Lines changed: 491 additions & 395 deletions
Large diffs are not rendered by default.

xbuilder/core/src/main/java/io/github/project/openubl/xbuilder/content/catalogs/Catalog20.java

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,104 @@
1+
/*
2+
* Catálogo 20 - Motivo de traslado
3+
*
4+
* Fuente normativa: Anexo N.° 8 de la RS 000123-2022/SUNAT,
5+
* actualizado por RS 000240-2024/SUNAT.
6+
*/
17
package io.github.project.openubl.xbuilder.content.catalogs;
28

9+
import java.util.Optional;
10+
import java.util.stream.Stream;
11+
12+
/**
13+
* Catálogo N.° 20 - Motivo de traslado.
14+
* <p>
15+
* Vigente según RS 000123-2022/SUNAT y RS 000240-2024/SUNAT.
16+
* Aplicable tanto a GRE-Remitente (09) como GRE-Transportista (31).
17+
*/
318
public enum Catalog20 implements Catalog {
19+
20+
/** 01 - Venta */
421
VENTA("01"),
5-
VENTA_SUJETA_A_CONFIRMACION_DEL_COMPRADOR("14"),
22+
23+
/** 02 - Compra */
624
COMPRA("02"),
7-
TRASLADO_ENTRE_ESTABLECIMIENTOS_DE_LA_MISMA_EMPRESA("04"),
8-
TRASLADO_EMISOR_ITINERANTE_CP("18"),
25+
26+
/** 03 - Venta con entrega a terceros (consignación) */
27+
CONSIGNACION("03"),
28+
29+
/** 04 - Traslado entre establecimientos de la misma empresa */
30+
TRASLADO_ENTRE_ESTABLECIMIENTOS("04"),
31+
32+
/** 05 - Devolución */
33+
DEVOLUCION("05"),
34+
35+
/** 06 - Traslado de bienes para transformación */
36+
TRASLADO_TRANSFORMACION("06"),
37+
38+
/** 07 - Recojo de bienes transformados */
39+
RECOJO_BIENES_TRANSFORMADOS("07"),
40+
41+
/** 08 - Importación */
942
IMPORTACION("08"),
43+
44+
/** 09 - Exportación */
1045
EXPORTACION("09"),
11-
TRASLADO_A_ZONA_PRIMARIA("19"),
12-
OTROS("13");
46+
47+
/**
48+
* 10 - Importación: traslado de bienes con DAM/DS con levante.
49+
* <p>
50+
* Aplica cuando la mercancía tiene levante autorizado.
51+
* Incorporado por RS 000240-2024/SUNAT para trazabilidad de comercio exterior.
52+
* Vigente desde 14-nov-2024; uso como motivo mandatorio pospuesto al
53+
* 01-jul-2026.
54+
*/
55+
IMPORTACION_CON_DAM("10"),
56+
57+
/** 11 - Importación temporal */
58+
IMPORTACION_TEMPORAL("11"),
59+
60+
/** 13 - Otros */
61+
OTROS("13"),
62+
63+
/** 14 - Venta sujeta a confirmación del comprador */
64+
VENTA_SUJETA_A_CONFIRMACION("14"),
65+
66+
/**
67+
* 15 - Traslado de bienes zona IVAP.
68+
* <p>
69+
* Aplica para traslados de bienes gravados con IVAP (arroz).
70+
*/
71+
TRASLADO_ZONA_IVAP("15"),
72+
73+
/** 16 - Exportación temporal (admisión temporal) */
74+
EXPORTACION_TEMPORAL("16"),
75+
76+
/** 17 - Reexportación */
77+
REEXPORTACION("17"),
78+
79+
/** 18 - Traslado emisor itinerante de comprobantes de pago */
80+
TRASLADO_EMISOR_ITINERANTE_CP("18"),
81+
82+
/**
83+
* 19 - Traslado de mercancía extranjera (zona primaria a depósito temporal).
84+
* <p>
85+
* Uso obligatorio a partir del 01-jul-2026 para traslado de mercancía
86+
* extranjera sin destinación aduanera o sin levante, en reemplazo del ticket de
87+
* salida.
88+
* Vigencia de la derogación del ticket pospuesta por RS 000133-2025/SUNAT.
89+
*/
90+
TRASLADO_MERCANCIA_EXTRANJERA("19");
1391

1492
private final String code;
1593

1694
Catalog20(String code) {
1795
this.code = code;
1896
}
1997

98+
public static Optional<Catalog20> valueOfCode(String code) {
99+
return Stream.of(Catalog20.values()).filter(p -> p.code.equals(code)).findFirst();
100+
}
101+
20102
@Override
21103
public String getCode() {
22104
return code;

xbuilder/core/src/main/java/io/github/project/openubl/xbuilder/content/catalogs/Catalog21.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,64 @@
11
package io.github.project.openubl.xbuilder.content.catalogs;
22

3+
import java.util.Optional;
4+
import java.util.stream.Stream;
5+
6+
/**
7+
* Catálogo N.° 21 - Tipo de documento relacionado a la Guía de Remisión
8+
* Electrónica.
9+
* <p>
10+
* Fuente: Anexo N.° 8 de la RS 000123-2022/SUNAT.
11+
* Se utiliza en {@code cac:AdditionalDocumentReference / cbc:DocumentTypeCode}.
12+
*/
313
public enum Catalog21 implements Catalog {
14+
/** 01 - Numeración DAM (Declaración Aduanera de Mercancías) */
415
NUMERACION_DAM("01"),
16+
17+
/** 02 - Número de orden de entrega */
518
NUMERO_DE_ORDEN_DE_ENTREGA("02"),
19+
20+
/** 03 - Número SCOP */
621
NUMERO_SCOP("03"),
22+
23+
/** 04 - Número de manifiesto de carga */
724
NUMERO_DE_MANIFIESTO_DE_CARGA("04"),
25+
26+
/** 05 - Número de constancia de detracción */
827
NUMERO_DE_CONSTANCIA_DE_DETRACCION("05"),
9-
OTROS("06");
28+
29+
/** 06 - Otros */
30+
OTROS("06"),
31+
32+
/** 09 - Guía de remisión remitente */
33+
GUIA_REMISION_REMITENTE("09"),
34+
35+
/** 12 - Declaración Simplificada (DS) */
36+
DECLARACION_SIMPLIFICADA("12"),
37+
38+
/** 31 - Guía de remisión transportista */
39+
GUIA_REMISION_TRANSPORTISTA("31"),
40+
41+
/**
42+
* 49 - Ticket de salida ENAPU.
43+
* <p>
44+
* Vigente condicionalmente: la derogación del ticket de salida ha sido
45+
* pospuesta al 01-jul-2026 por RS 000133-2025/SUNAT.
46+
*/
47+
TICKET_SALIDA("49"),
48+
49+
/** 50 - Código de autorización emitido por SUNAT */
50+
CODIGO_AUTORIZACION_SUNAT("50");
1051

1152
private final String code;
1253

1354
Catalog21(String code) {
1455
this.code = code;
1556
}
1657

58+
public static Optional<Catalog21> valueOfCode(String code) {
59+
return Stream.of(Catalog21.values()).filter(p -> p.code.equals(code)).findFirst();
60+
}
61+
1762
@Override
1863
public String getCode() {
1964
return code;
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Catálogo 61 - Tipo de documento adicional relacionado al transporte
3+
*
4+
* Fuente normativa: Anexo N.° 8, Catálogo N.° 61 de la RS 000123-2022/SUNAT.
5+
* Estos documentos se consignan en cac:AdditionalDocumentReference de la GRE
6+
* con un DocumentTypeCode basado en este catálogo.
7+
*/
8+
package io.github.project.openubl.xbuilder.content.catalogs;
9+
10+
import java.util.Optional;
11+
import java.util.stream.Stream;
12+
13+
/**
14+
* Catálogo N.° 61 - Tipo de documento adicional relacionado al transporte.
15+
* <p>
16+
* Aplicable a los campos {@code cac:AdditionalDocumentReference} de la GRE
17+
* correspondientes a documentos del ámbito de transporte y comercio exterior.
18+
*/
19+
public enum Catalog61 implements Catalog {
20+
21+
/** 01 - Factura */
22+
FACTURA("01"),
23+
24+
/** 02 - Boleta de venta */
25+
BOLETA_VENTA("02"),
26+
27+
/** 03 - Liquidación de compra */
28+
LIQUIDACION_COMPRA("03"),
29+
30+
/** 04 - Guía de remisión remitente */
31+
GUIA_REMISION_REMITENTE("04"),
32+
33+
/** 05 - Guía de remisión transportista */
34+
GUIA_REMISION_TRANSPORTISTA("05"),
35+
36+
/** 06 - Carta de porte aéreo */
37+
CARTA_PORTE_AEREO("06"),
38+
39+
/** 07 - Póliza de adjudicación */
40+
POLIZA_ADJUDICACION("07"),
41+
42+
/** 09 - Guía de remisión remitente complementaria */
43+
GUIA_REMISION_REMITENTE_COMP("09"),
44+
45+
/** 10 - Guía de remisión transportista complementaria */
46+
GUIA_REMISION_TRANSPORTISTA_COMP("10"),
47+
48+
/** 50 - DAM (Declaración Aduanera de Mercancías) */
49+
DAM("50"),
50+
51+
/** 52 - Declaración Simplificada de Importación/Exportación */
52+
DECLARACION_SIMPLIFICADA("52");
53+
54+
private final String code;
55+
56+
Catalog61(String code) {
57+
this.code = code;
58+
}
59+
60+
public static Optional<Catalog61> valueOfCode(String code) {
61+
return Stream.of(Catalog61.values()).filter(p -> p.code.equals(code)).findFirst();
62+
}
63+
64+
@Override
65+
public String getCode() {
66+
return code;
67+
}
68+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Catálogo 62 - Bienes normalizados sujetos a SPOT/IVAP
3+
*
4+
* Fuente normativa: Anexo N.° 8, Catálogo N.° 62 de la RS 000123-2022/SUNAT.
5+
*
6+
* Nota SUNAT FAQ #25: Se consideran bienes normalizados los bienes detallados
7+
* en este catálogo CUANDO se encuentran sujetos al SPOT o IVAP. Si no están
8+
* sujetos, no califican como bien normalizado y no se marca el indicador.
9+
*/
10+
package io.github.project.openubl.xbuilder.content.catalogs;
11+
12+
import java.util.Optional;
13+
import java.util.stream.Stream;
14+
15+
/**
16+
* Catálogo N.° 62 - Bienes normalizados sujetos a detracción (SPOT) o IVAP.
17+
* <p>
18+
* Se utiliza para marcar el indicador SUNAT_Envio_IndicadorBienNormalizado
19+
* en el XML de la GRE cuando se transportan estos bienes y están sujetos
20+
* a SPOT/IVAP.
21+
*/
22+
public enum Catalog62 implements Catalog {
23+
24+
/** Azúcar - sujeto a SPOT */
25+
AZUCAR("01"),
26+
27+
/** Arroz - sujeto a IVAP */
28+
ARROZ("02"),
29+
30+
/** Alcohol etílico - sujeto a SPOT */
31+
ALCOHOL_ETILICO("03"),
32+
33+
/** Cemento (zonas de control de IQBF) */
34+
CEMENTO("04");
35+
36+
private final String code;
37+
38+
Catalog62(String code) {
39+
this.code = code;
40+
}
41+
42+
public static Optional<Catalog62> valueOfCode(String code) {
43+
return Stream.of(Catalog62.values()).filter(p -> p.code.equals(code)).findFirst();
44+
}
45+
46+
@Override
47+
public String getCode() {
48+
return code;
49+
}
50+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Catálogo 63 - Puertos
3+
*
4+
* Fuente normativa: Anexo N.° 8, Catálogo N.° 63 de la RS 000123-2022/SUNAT.
5+
* Se utiliza como código de ubicación en FirstArrivalPortLocation con LocationTypeCode=1.
6+
*
7+
* Nota: Los puertos mencionados explícitamente en el RCP art. 21 numeral 3.2.9
8+
* son Callao, Paita, Salaverry, Chimbote, Pisco, Ilo, Matarani y Chancay
9+
* (este último agregado por RS 000240-2024/SUNAT).
10+
*/
11+
package io.github.project.openubl.xbuilder.content.catalogs;
12+
13+
import java.util.Optional;
14+
import java.util.stream.Stream;
15+
16+
/**
17+
* Catálogo N.° 63 - Puertos nacionales.
18+
* <p>
19+
* Utilizado en {@code cac:FirstArrivalPortLocation / cbc:ID} con
20+
* {@code cbc:LocationTypeCode = 1} para indicar puerto de embarque/desembarque.
21+
*/
22+
public enum Catalog63 implements Catalog {
23+
24+
CALLAO("CALLAO", "Puerto del Callao"),
25+
PAITA("PAITA", "Puerto de Paita"),
26+
SALAVERRY("SALAVERRY", "Puerto de Salaverry"),
27+
CHIMBOTE("CHIMBOTE", "Puerto de Chimbote"),
28+
PISCO("PISCO", "Puerto de Pisco"),
29+
ILO("ILO", "Puerto de Ilo"),
30+
MATARANI("MATARANI", "Puerto de Matarani"),
31+
32+
/**
33+
* Puerto de Chancay - agregado por RS 000240-2024/SUNAT para comercio exterior.
34+
* Vigente desde 14-nov-2024.
35+
*/
36+
CHANCAY("CHANCAY", "Puerto de Chancay");
37+
38+
private final String code;
39+
private final String description;
40+
41+
Catalog63(String code, String description) {
42+
this.code = code;
43+
this.description = description;
44+
}
45+
46+
public String getDescription() {
47+
return description;
48+
}
49+
50+
public static Optional<Catalog63> valueOfCode(String code) {
51+
return Stream.of(Catalog63.values())
52+
.filter(p -> p.code.equalsIgnoreCase(code))
53+
.findFirst();
54+
}
55+
56+
@Override
57+
public String getCode() {
58+
return code;
59+
}
60+
}

0 commit comments

Comments
 (0)