Skip to content

Commit fe36e79

Browse files
Add forma pago with porcentaje (#24)
* Add forma pago with porcentaje * Remove 0 value constraints * CoutaDePagoInputModel_Porcentaje100CollectionValidatorTest null values are valid
1 parent 7dcb698 commit fe36e79

23 files changed

+743
-24
lines changed

src/main/java/io/github/project/openubl/xmlbuilderlib/facade/DocumentManager.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.facade;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.clock.SystemClockSingleton;
2021
import io.github.project.openubl.xmlbuilderlib.config.Config;
2122
import io.github.project.openubl.xmlbuilderlib.freemarker.FreemarkerExecutor;
@@ -36,9 +37,10 @@
3637
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.SummaryDocumentOutputModel;
3738
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.VoidedDocumentOutputModel;
3839
import io.github.project.openubl.xmlbuilderlib.utils.InputToOutput;
39-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
4040

41-
import javax.validation.*;
41+
import javax.validation.ConstraintViolation;
42+
import javax.validation.ConstraintViolationException;
43+
import javax.validation.Validator;
4244
import java.util.Set;
4345

4446
public class DocumentManager {

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/DocumentLineOutputModelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.factory;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.config.Config;
2021
import io.github.project.openubl.xmlbuilderlib.models.catalogs.*;
2122
import io.github.project.openubl.xmlbuilderlib.models.input.standard.DocumentLineInputModel;
2223
import io.github.project.openubl.xmlbuilderlib.models.output.standard.*;
23-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
2424

2525
import java.math.BigDecimal;
2626
import java.math.RoundingMode;

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/InvoiceAndNoteOutputModelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.factory;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.config.Config;
2021
import io.github.project.openubl.xmlbuilderlib.factory.common.ClienteOutputModelFactory;
2122
import io.github.project.openubl.xmlbuilderlib.factory.common.FirmanteOutputModelFactory;
@@ -34,7 +35,6 @@
3435
import io.github.project.openubl.xmlbuilderlib.models.output.standard.note.NoteOutputModel;
3536
import io.github.project.openubl.xmlbuilderlib.models.output.standard.note.creditNote.CreditNoteOutputModel;
3637
import io.github.project.openubl.xmlbuilderlib.models.output.standard.note.debitNote.DebitNoteOutputModel;
37-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
3838

3939
import java.math.BigDecimal;
4040
import java.util.List;

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/PerceptionRetentionOutputModelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.factory;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.config.Config;
2021
import io.github.project.openubl.xmlbuilderlib.factory.common.ClienteOutputModelFactory;
2122
import io.github.project.openubl.xmlbuilderlib.factory.common.FirmanteOutputModelFactory;
@@ -28,7 +29,6 @@
2829
import io.github.project.openubl.xmlbuilderlib.models.input.sunat.PerceptionRetentionInputModel;
2930
import io.github.project.openubl.xmlbuilderlib.models.input.sunat.RetentionInputModel;
3031
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.*;
31-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
3232

3333
import java.math.BigDecimal;
3434
import java.math.RoundingMode;

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/SummaryDocumentOutputModelFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.factory;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.config.Config;
2021
import io.github.project.openubl.xmlbuilderlib.factory.common.ClienteOutputModelFactory;
2122
import io.github.project.openubl.xmlbuilderlib.factory.common.FirmanteOutputModelFactory;
2223
import io.github.project.openubl.xmlbuilderlib.factory.common.ProveedorOutputModelFactory;
2324
import io.github.project.openubl.xmlbuilderlib.models.catalogs.*;
2425
import io.github.project.openubl.xmlbuilderlib.models.input.sunat.*;
2526
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.*;
26-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
2727

2828
import java.text.MessageFormat;
29-
import java.util.function.Function;
3029
import java.util.stream.Collectors;
3130

3231
import static io.github.project.openubl.xmlbuilderlib.utils.DateUtils.toGregorianCalendarDate;

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/VoidedDocumentOutputModelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.factory;
1818

19+
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
1920
import io.github.project.openubl.xmlbuilderlib.config.Config;
2021
import io.github.project.openubl.xmlbuilderlib.factory.common.FirmanteOutputModelFactory;
2122
import io.github.project.openubl.xmlbuilderlib.factory.common.ProveedorOutputModelFactory;
@@ -25,7 +26,6 @@
2526
import io.github.project.openubl.xmlbuilderlib.models.input.sunat.VoidedDocumentLineInputModel;
2627
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.VoidedDocumentLineOutputModel;
2728
import io.github.project.openubl.xmlbuilderlib.models.output.sunat.VoidedDocumentOutputModel;
28-
import io.github.project.openubl.xmlbuilderlib.clock.SystemClock;
2929

3030
import java.text.MessageFormat;
3131

src/main/java/io/github/project/openubl/xmlbuilderlib/factory/common/FormaPagoOutputModelFactory.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
import io.github.project.openubl.xmlbuilderlib.models.output.common.FormaPagoOutputModel;
2525

2626
import java.math.BigDecimal;
27-
import java.util.*;
28-
import java.util.stream.Collectors;
27+
import java.math.RoundingMode;
28+
import java.util.ArrayList;
29+
import java.util.Collections;
30+
import java.util.List;
31+
import java.util.TimeZone;
2932

3033
import static io.github.project.openubl.xmlbuilderlib.utils.DateUtils.toGregorianCalendarDate;
3134

@@ -64,12 +67,28 @@ public static FormaPagoOutputModel getFormaPago(List<CuotaDePagoInputModel> cuot
6467
.withTipo(FormaPagoOutputModel.Tipo.Credito)
6568
.withCuotas(cuotasOutput);
6669

70+
BigDecimal subtotal = BigDecimal.ZERO;
6771
for (int i = 0; i < cuotasDePago.size(); i++) {
6872
CuotaDePagoInputModel item = cuotasDePago.get(i);
6973

74+
BigDecimal monto;
75+
if (item.getMonto() != null) {
76+
monto = item.getMonto();
77+
} else if (item.getPorcentaje() != null) {
78+
if (i != cuotasDePago.size() - 1) {
79+
monto = montoTotal.multiply(item.getPorcentaje()).divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
80+
} else {
81+
monto = montoTotal.subtract(subtotal);
82+
}
83+
} else {
84+
throw new IllegalStateException("Monto or porcentaje must be present");
85+
}
86+
87+
subtotal = subtotal.add(monto);
88+
7089
FormaPagoCuotaOutputModel output = FormaPagoCuotaOutputModel.Builder.aFormaPagoCuotaOutputModel()
7190
.withId(String.format("%03d", i))
72-
.withMonto(item.getMonto())
91+
.withMonto(monto)
7392
.withFechaPago(toGregorianCalendarDate(item.getFechaPago(), timeZone))
7493
.build();
7594

src/main/java/io/github/project/openubl/xmlbuilderlib/models/input/common/CuotaDePagoInputModel.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,25 @@
1616
*/
1717
package io.github.project.openubl.xmlbuilderlib.models.input.common;
1818

19+
import io.github.project.openubl.xmlbuilderlib.models.input.constraints.CuotaDePagoInputModel_MontoPorcentajeConstraint;
20+
import io.github.project.openubl.xmlbuilderlib.models.input.constraints.HighLevelGroupValidation;
21+
22+
import javax.validation.constraints.Max;
23+
import javax.validation.constraints.Min;
1924
import javax.validation.constraints.NotNull;
25+
import javax.validation.constraints.Positive;
2026
import java.math.BigDecimal;
21-
import java.util.Date;
2227

28+
@CuotaDePagoInputModel_MontoPorcentajeConstraint(groups = HighLevelGroupValidation.class)
2329
public class CuotaDePagoInputModel {
2430

25-
@NotNull
31+
@Positive
2632
private BigDecimal monto;
2733

34+
@Positive
35+
@Max(100)
36+
private BigDecimal porcentaje;
37+
2838
@NotNull
2939
private Long fechaPago;
3040

@@ -36,6 +46,14 @@ public void setMonto(BigDecimal monto) {
3646
this.monto = monto;
3747
}
3848

49+
public BigDecimal getPorcentaje() {
50+
return porcentaje;
51+
}
52+
53+
public void setPorcentaje(BigDecimal porcentaje) {
54+
this.porcentaje = porcentaje;
55+
}
56+
3957
public Long getFechaPago() {
4058
return fechaPago;
4159
}
@@ -46,6 +64,7 @@ public void setFechaPago(Long fechaPago) {
4664

4765
public static final class Builder {
4866
private BigDecimal monto;
67+
private BigDecimal porcentaje;
4968
private Long fechaPago;
5069

5170
private Builder() {
@@ -60,6 +79,11 @@ public Builder withMonto(BigDecimal monto) {
6079
return this;
6180
}
6281

82+
public Builder withPorcentaje(BigDecimal porcentaje) {
83+
this.porcentaje = porcentaje;
84+
return this;
85+
}
86+
6387
public Builder withFechaPago(Long fechaPago) {
6488
this.fechaPago = fechaPago;
6589
return this;
@@ -68,6 +92,7 @@ public Builder withFechaPago(Long fechaPago) {
6892
public CuotaDePagoInputModel build() {
6993
CuotaDePagoInputModel cuotaDePagoInputModel = new CuotaDePagoInputModel();
7094
cuotaDePagoInputModel.setMonto(monto);
95+
cuotaDePagoInputModel.setPorcentaje(porcentaje);
7196
cuotaDePagoInputModel.setFechaPago(fechaPago);
7297
return cuotaDePagoInputModel;
7398
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Copyright 2019 Project OpenUBL, Inc. and/or its affiliates
3+
* and other contributors as indicated by the @author tags.
4+
*
5+
* Licensed under the Eclipse Public License - v 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* https://www.eclipse.org/legal/epl-2.0/
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package io.github.project.openubl.xmlbuilderlib.models.input.constraints;
18+
19+
import io.github.project.openubl.xmlbuilderlib.models.input.common.CuotaDePagoInputModel;
20+
21+
import javax.validation.ConstraintValidator;
22+
import javax.validation.ConstraintValidatorContext;
23+
24+
public class CoutaDePagoInputModel_MontoPorcentajeValidator implements ConstraintValidator<CuotaDePagoInputModel_MontoPorcentajeConstraint, CuotaDePagoInputModel> {
25+
26+
public static final String message = "Se requiere monto o porcentaje";
27+
28+
@Override
29+
public void initialize(CuotaDePagoInputModel_MontoPorcentajeConstraint constraintAnnotation) {
30+
}
31+
32+
@Override
33+
public boolean isValid(CuotaDePagoInputModel value, ConstraintValidatorContext context) {
34+
boolean isValid = (value.getMonto() != null || value.getPorcentaje() != null)
35+
&& (value.getMonto() == null || value.getPorcentaje() == null);
36+
37+
if (!isValid) {
38+
context.disableDefaultConstraintViolation();
39+
context.buildConstraintViolationWithTemplate(message)
40+
.addConstraintViolation();
41+
}
42+
43+
return isValid;
44+
}
45+
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* Copyright 2019 Project OpenUBL, Inc. and/or its affiliates
3+
* and other contributors as indicated by the @author tags.
4+
*
5+
* Licensed under the Eclipse Public License - v 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* https://www.eclipse.org/legal/epl-2.0/
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package io.github.project.openubl.xmlbuilderlib.models.input.constraints;
18+
19+
import io.github.project.openubl.xmlbuilderlib.models.input.common.CuotaDePagoInputModel;
20+
21+
import javax.validation.ConstraintValidator;
22+
import javax.validation.ConstraintValidatorContext;
23+
import java.math.BigDecimal;
24+
import java.util.Collection;
25+
26+
public class CoutaDePagoInputModel_Porcentaje100CollectionValidator implements ConstraintValidator<CuotaDePagoInputModel_Porcentaje100CollectionConstraint, Collection<CuotaDePagoInputModel>> {
27+
28+
public static final String message = "Sumatoria de porcentajes debe de ser 100";
29+
30+
@Override
31+
public void initialize(CuotaDePagoInputModel_Porcentaje100CollectionConstraint constraintAnnotation) {
32+
}
33+
34+
@Override
35+
public boolean isValid(Collection<CuotaDePagoInputModel> value, ConstraintValidatorContext context) {
36+
if (value == null) {
37+
return true;
38+
}
39+
40+
BigDecimal total = value.stream()
41+
.map(f -> f.getPorcentaje() != null ? f.getPorcentaje() : BigDecimal.ZERO)
42+
.reduce(BigDecimal.ZERO, BigDecimal::add);
43+
boolean isValid = total.compareTo(new BigDecimal(100)) == 0 || total.compareTo(BigDecimal.ZERO) == 0;
44+
45+
if (!isValid) {
46+
context.disableDefaultConstraintViolation();
47+
context.buildConstraintViolationWithTemplate(message)
48+
.addConstraintViolation();
49+
}
50+
51+
return isValid;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)