Skip to content

Add anticipos for invoices #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import io.github.project.openubl.xmlbuilderlib.models.input.standard.note.debitNote.DebitNoteInputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.common.FormaPagoOutputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.*;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.invoice.AnticipoOutputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.invoice.InvoiceOutputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.note.NoteOutputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.note.creditNote.CreditNoteOutputModel;
Expand Down Expand Up @@ -72,6 +73,33 @@ public static InvoiceOutputModel getInvoiceOutput(InvoiceInputModel input, Confi
input.getCuotasDePago(), tmpOutput.getTotales(), systemClock.getTimeZone()
));

// Anticipos
builder.withAnticipos(input.getAnticipos() != null ?
input.getAnticipos().stream()
.map(anticipoInput -> {
AnticipoOutputModel anticipoOutput = new AnticipoOutputModel();
anticipoOutput.setSerieNumero(anticipoInput.getSerieNumero());
anticipoOutput.setTipoDocumento(Catalog.valueOfCode(Catalog12.class, anticipoInput.getTipoDocumento()).orElseThrow(Catalog.invalidCatalogValue));
anticipoOutput.setMontoTotal(anticipoInput.getMontoTotal());
return anticipoOutput;
})
.collect(Collectors.toList())
: Collections.emptyList()
);

InvoiceOutputModel tempOut = builder.build();
BigDecimal anticiposTotal = tempOut.getAnticipos().stream().map(AnticipoOutputModel::getMontoTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
if (anticiposTotal.compareTo(BigDecimal.ZERO) > 0) {
builder.withTotales(
DocumentMonetaryTotalOutputModel.Builder.aDocumentMonetaryTotalOutputModel()
.withValorVentaSinImpuestos(tempOut.getTotales().getValorVentaSinImpuestos())
.withValorVentaConImpuestos(tempOut.getTotales().getValorVentaConImpuestos())
.withAnticiposTotal(anticiposTotal)
.withImporteTotal(tempOut.getTotales().getImporteTotal().subtract(anticiposTotal))
.build()
);
}

return builder.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* Copyright 2019 Project OpenUBL, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Eclipse Public License - v 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.eclipse.org/legal/epl-2.0/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.project.openubl.xmlbuilderlib.models.catalogs;

public enum Catalog12_Anticipo implements Catalog {
FACTURA_EMITIDA_POR_ANTICIPOS("02"),
BOLETA_DE_VENTA_EMITIDA_POR_ANTICIPOS("03");


private final String code;

Catalog12_Anticipo(String code) {
this.code = code;
}

@Override
public String getCode() {
return code;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,74 @@
*/
package io.github.project.openubl.xmlbuilderlib.models.input.standard.invoice;

import io.github.project.openubl.xmlbuilderlib.models.catalogs.Catalog12_Anticipo;
import io.github.project.openubl.xmlbuilderlib.models.catalogs.constraints.CatalogConstraint;
import io.github.project.openubl.xmlbuilderlib.models.input.standard.DocTribRelacionadoInputModel;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

public class AnticipoInputModel extends DocTribRelacionadoInputModel {

@NotBlank
private String ruc;
@CatalogConstraint(value = Catalog12_Anticipo.class)
protected String tipoDocumento;

public String getRuc() {
return ruc;
@Min(0)
@NotNull
private BigDecimal montoTotal;

@Override
public String getTipoDocumento() {
return tipoDocumento;
}

@Override
public void setTipoDocumento(String tipoDocumento) {
this.tipoDocumento = tipoDocumento;
}

public void setRuc(String ruc) {
this.ruc = ruc;
public BigDecimal getMontoTotal() {
return montoTotal;
}

public void setMontoTotal(BigDecimal montoTotal) {
this.montoTotal = montoTotal;
}

public static final class Builder {
protected String serieNumero;
protected String tipoDocumento;
private BigDecimal montoTotal;

private Builder() {
}

public static Builder anAnticipoInputModel() {
return new Builder();
}

public Builder withSerieNumero(String serieNumero) {
this.serieNumero = serieNumero;
return this;
}

public Builder withTipoDocumento(String tipoDocumento) {
this.tipoDocumento = tipoDocumento;
return this;
}

public Builder withMontoTotal(BigDecimal montoTotal) {
this.montoTotal = montoTotal;
return this;
}

public AnticipoInputModel build() {
AnticipoInputModel anticipoInputModel = new AnticipoInputModel();
anticipoInputModel.setSerieNumero(serieNumero);
anticipoInputModel.setTipoDocumento(tipoDocumento);
anticipoInputModel.setMontoTotal(montoTotal);
return anticipoInputModel;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public class InvoiceInputModel extends DocumentInputModel {
@Valid
private List<DocTribRelacionadoInputModel_Invoice> otrosDocumentosTributariosRelacionados;

@Valid
private List<AnticipoInputModel> anticipos;

public List<CuotaDePagoInputModel> getCuotasDePago() {
return cuotasDePago;
}
Expand All @@ -55,6 +58,14 @@ public void setOtrosDocumentosTributariosRelacionados(List<DocTribRelacionadoInp
this.otrosDocumentosTributariosRelacionados = otrosDocumentosTributariosRelacionados;
}

public List<AnticipoInputModel> getAnticipos() {
return anticipos;
}

public void setAnticipos(List<AnticipoInputModel> anticipos) {
this.anticipos = anticipos;
}

public static final class Builder {
protected String serie;
private Integer numero;
Expand All @@ -63,9 +74,10 @@ public static final class Builder {
private ProveedorInputModel proveedor;
private FirmanteInputModel firmante;
private List<DocumentLineInputModel> detalle;
private List<CuotaDePagoInputModel> cuotasDePago;
private List<GuiaRemisionRelacionadaInputModel> guiasRemisionRelacionadas;
private List<CuotaDePagoInputModel> cuotasDePago;
private List<DocTribRelacionadoInputModel_Invoice> otrosDocumentosTributariosRelacionados;
private List<AnticipoInputModel> anticipos;

private Builder() {
}
Expand Down Expand Up @@ -109,13 +121,13 @@ public Builder withDetalle(List<DocumentLineInputModel> detalle) {
return this;
}

public Builder withCuotasDePago(List<CuotaDePagoInputModel> cuotasDePago) {
this.cuotasDePago = cuotasDePago;
public Builder withGuiasRemisionRelacionadas(List<GuiaRemisionRelacionadaInputModel> guiasRemisionRelacionadas) {
this.guiasRemisionRelacionadas = guiasRemisionRelacionadas;
return this;
}

public Builder withGuiasRemisionRelacionadas(List<GuiaRemisionRelacionadaInputModel> guiasRemisionRelacionadas) {
this.guiasRemisionRelacionadas = guiasRemisionRelacionadas;
public Builder withCuotasDePago(List<CuotaDePagoInputModel> cuotasDePago) {
this.cuotasDePago = cuotasDePago;
return this;
}

Expand All @@ -124,6 +136,11 @@ public Builder withOtrosDocumentosTributariosRelacionados(List<DocTribRelacionad
return this;
}

public Builder withAnticipos(List<AnticipoInputModel> anticipos) {
this.anticipos = anticipos;
return this;
}

public InvoiceInputModel build() {
InvoiceInputModel invoiceInputModel = new InvoiceInputModel();
invoiceInputModel.setSerie(serie);
Expand All @@ -133,9 +150,10 @@ public InvoiceInputModel build() {
invoiceInputModel.setProveedor(proveedor);
invoiceInputModel.setFirmante(firmante);
invoiceInputModel.setDetalle(detalle);
invoiceInputModel.setCuotasDePago(cuotasDePago);
invoiceInputModel.setGuiasRemisionRelacionadas(guiasRemisionRelacionadas);
invoiceInputModel.setCuotasDePago(cuotasDePago);
invoiceInputModel.setOtrosDocumentosTributariosRelacionados(otrosDocumentosTributariosRelacionados);
invoiceInputModel.setAnticipos(anticipos);
return invoiceInputModel;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ public class DocumentMonetaryTotalOutputModel {
@Digits(integer = 100, fraction = 2)
private BigDecimal importeTotal;

@Min(0)
@Digits(integer = 100, fraction = 2)
private BigDecimal anticiposTotal;

public BigDecimal getValorVentaSinImpuestos() {
return valorVentaSinImpuestos;
}
Expand All @@ -62,10 +66,19 @@ public void setImporteTotal(BigDecimal importeTotal) {
this.importeTotal = importeTotal;
}

public BigDecimal getAnticiposTotal() {
return anticiposTotal;
}

public void setAnticiposTotal(BigDecimal anticiposTotal) {
this.anticiposTotal = anticiposTotal;
}

public static final class Builder {
private BigDecimal valorVentaSinImpuestos;
private BigDecimal valorVentaConImpuestos;
private BigDecimal importeTotal;
private BigDecimal anticiposTotal;

private Builder() {
}
Expand All @@ -89,11 +102,17 @@ public Builder withImporteTotal(BigDecimal importeTotal) {
return this;
}

public Builder withAnticiposTotal(BigDecimal anticiposTotal) {
this.anticiposTotal = anticiposTotal;
return this;
}

public DocumentMonetaryTotalOutputModel build() {
DocumentMonetaryTotalOutputModel documentMonetaryTotalOutputModel = new DocumentMonetaryTotalOutputModel();
documentMonetaryTotalOutputModel.setValorVentaSinImpuestos(valorVentaSinImpuestos);
documentMonetaryTotalOutputModel.setValorVentaConImpuestos(valorVentaConImpuestos);
documentMonetaryTotalOutputModel.setImporteTotal(importeTotal);
documentMonetaryTotalOutputModel.setAnticiposTotal(anticiposTotal);
return documentMonetaryTotalOutputModel;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,22 @@

import io.github.project.openubl.xmlbuilderlib.models.output.standard.DocumentoTributarioRelacionadoOutputModel;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

public class AnticipoOutputModel extends DocumentoTributarioRelacionadoOutputModel {

@NotBlank
private String ruc;
@Min(0)
@NotNull
private BigDecimal montoTotal;

public String getRuc() {
return ruc;
public BigDecimal getMontoTotal() {
return montoTotal;
}

public void setRuc(String ruc) {
this.ruc = ruc;
public void setMontoTotal(BigDecimal montoTotal) {
this.montoTotal = montoTotal;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,21 @@

import io.github.project.openubl.xmlbuilderlib.models.catalogs.Catalog1;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.DocumentOutputModel;
import io.github.project.openubl.xmlbuilderlib.models.output.standard.DocumentoTributarioRelacionadoOutputModel;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;

public class InvoiceOutputModel extends DocumentOutputModel {

@NotNull
private Catalog1 tipoInvoice;

@NotNull
@Valid
private List<AnticipoOutputModel> anticipos;

public Catalog1 getTipoInvoice() {
return tipoInvoice;
}
Expand All @@ -34,8 +41,17 @@ public void setTipoInvoice(Catalog1 tipoInvoice) {
this.tipoInvoice = tipoInvoice;
}

public List<AnticipoOutputModel> getAnticipos() {
return anticipos;
}

public void setAnticipos(List<AnticipoOutputModel> anticipos) {
this.anticipos = anticipos;
}

public static final class Builder extends DocumentOutputModel.Builder {
private Catalog1 tipoInvoice;
private List<AnticipoOutputModel> anticipos;

private Builder() {
}
Expand All @@ -49,6 +65,11 @@ public Builder withTipoInvoice(Catalog1 tipoInvoice) {
return this;
}

public Builder withAnticipos(List<AnticipoOutputModel> anticipos) {
this.anticipos = anticipos;
return this;
}

public InvoiceOutputModel build() {
InvoiceOutputModel invoiceOutputModel = new InvoiceOutputModel();
invoiceOutputModel.setMoneda(moneda);
Expand All @@ -65,6 +86,7 @@ public InvoiceOutputModel build() {
invoiceOutputModel.setFormaPago(formaPago);
invoiceOutputModel.setGuiasRemisionRelacionadas(guiasRemisionRelacionadas);
invoiceOutputModel.setOtrosDocumentosTributariosRelacionados(otrosDocumentosTributariosRelacionados);
invoiceOutputModel.setAnticipos(anticipos);
return invoiceOutputModel;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
<#--parte de la operación que se factura, es decir no forman parte del(os) valor(es) de ventas-->
<#--señaladas anteriormente, pero sí forman parte del importe total de la Venta (Ejemplo:-->
<#--propinas, garantías para devolución de envases, etc.)-->
<#-- <#if totalOtrosCargos??><cbc:ChargeTotalAmount currencyID="${moneda}">${totalOtrosCargos}</cbc:ChargeTotalAmount></#if>-->
<#-- <#if totalOtrosCargos??><cbc:PrepaidAmount currencyID="${moneda}">${totalAnticipos}</cbc:PrepaidAmount></#if>-->
<#if totales.anticiposTotal??><cbc:PrepaidAmount currencyID="${moneda}">${totales.anticiposTotal}</cbc:PrepaidAmount></#if>
<#---------->
<#--PUNTO5-->
<#---------->
Expand Down
Loading