Skip to content

Commit

Permalink
Extend Invoice reversal API to return affected ICs
Browse files Browse the repository at this point in the history
  • Loading branch information
pvpurcarcosmin committed Jun 11, 2020
1 parent 0fd9f89 commit 33ed086
Show file tree
Hide file tree
Showing 8 changed files with 280 additions and 201 deletions.
Expand Up @@ -4,6 +4,12 @@
import de.metas.document.engine.IDocumentBL;
import de.metas.invoice.InvoiceId;
import de.metas.invoice.service.IInvoiceDAO;
import de.metas.invoicecandidate.api.IInvoiceCandDAO;
import de.metas.invoicecandidate.model.I_C_Invoice_Candidate;
import de.metas.rest_api.common.JsonExternalId;
import de.metas.rest_api.common.MetasfreshId;
import de.metas.rest_api.invoicecandidates.response.JsonInvoiceCandidatesResponseItem;
import de.metas.rest_api.invoicecandidates.response.JsonReverseInvoiceResponse;
import de.metas.util.Check;
import de.metas.util.Services;
import lombok.NonNull;
Expand All @@ -13,7 +19,6 @@
import org.compiere.model.I_AD_Archive;
import org.compiere.model.I_C_Invoice;
import org.compiere.util.Env;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;
Expand Down Expand Up @@ -44,9 +49,11 @@
@Service
public class InvoiceService
{
final IInvoiceDAO invoiceDAO = Services.get(IInvoiceDAO.class);
final IArchiveDAO archiveDAO = Services.get(IArchiveDAO.class);
final IArchiveBL archiveBL = Services.get(IArchiveBL.class);
private final IInvoiceDAO invoiceDAO = Services.get(IInvoiceDAO.class);
private final IArchiveDAO archiveDAO = Services.get(IArchiveDAO.class);
private final IArchiveBL archiveBL = Services.get(IArchiveBL.class);
private final IDocumentBL documentBL = Services.get(IDocumentBL.class);
private final IInvoiceCandDAO invoiceCandDAO = Services.get(IInvoiceCandDAO.class);

public Optional<byte[]> getInvoicePDF(@NonNull final InvoiceId invoiceId)
{
Expand Down Expand Up @@ -76,24 +83,36 @@ private Optional<I_AD_Archive> getLastArchive(@NonNull final InvoiceId invoiceId
return Optional.of(lastArchive.get(0));
}

public ResponseEntity<Object> reverseInvoice(@NonNull final InvoiceId invoiceId)
@NonNull
public Optional<JsonReverseInvoiceResponse> reverseInvoice(@NonNull final InvoiceId invoiceId)
{
final I_C_Invoice documentRecord = Services.get(IInvoiceDAO.class).getByIdInTrx(invoiceId);
if (documentRecord == null)
{
return ResponseEntity.notFound().build();
return Optional.empty();
}

try
{
Services.get(IDocumentBL.class).processEx(documentRecord, IDocument.ACTION_Reverse_Correct, IDocument.STATUS_Reversed);
}
catch (final Exception e)
{
return ResponseEntity.unprocessableEntity().body(e.getLocalizedMessage());
}
documentBL.processEx(documentRecord, IDocument.ACTION_Reverse_Correct, IDocument.STATUS_Reversed);

return ResponseEntity.ok().build();
final JsonReverseInvoiceResponse.JsonReverseInvoiceResponseBuilder responseBuilder = JsonReverseInvoiceResponse.builder();

invoiceCandDAO
.retrieveInvoiceCandidates(invoiceId)
.stream()
.map(this::buildJSONItem)
.forEach(responseBuilder::affectedInvoiceCandidate);

return Optional.of(responseBuilder.build());
}

private JsonInvoiceCandidatesResponseItem buildJSONItem(@NonNull final I_C_Invoice_Candidate invoiceCandidate)
{
return JsonInvoiceCandidatesResponseItem
.builder()
.externalHeaderId(JsonExternalId.ofOrNull(invoiceCandidate.getExternalHeaderId()))
.externalLineId(JsonExternalId.ofOrNull(invoiceCandidate.getExternalLineId()))
.metasfreshId(MetasfreshId.of(invoiceCandidate.getC_Invoice_Candidate_ID()))
.build();
}

}
@@ -1,27 +1,8 @@
package de.metas.rest_api.invoicecandidates.impl;

import static de.metas.util.Check.isEmpty;
import static de.metas.util.lang.CoalesceUtil.coalesce;
import static java.math.BigDecimal.ZERO;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import javax.annotation.Nullable;

import de.metas.invoicecandidate.externallyreferenced.*;
import org.adempiere.exceptions.AdempiereException;
import org.apache.commons.collections4.CollectionUtils;
import org.compiere.util.Env;
import org.springframework.stereotype.Service;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import de.metas.bpartner.composite.BPartnerComposite;
import de.metas.bpartner.composite.BPartnerContact;
import de.metas.bpartner.composite.BPartnerLocation;
Expand All @@ -31,6 +12,12 @@
import de.metas.bpartner.service.BPartnerQuery;
import de.metas.i18n.TranslatableStrings;
import de.metas.invoicecandidate.InvoiceCandidateId;
import de.metas.invoicecandidate.externallyreferenced.ExternallyReferencedCandidate;
import de.metas.invoicecandidate.externallyreferenced.ExternallyReferencedCandidateRepository;
import de.metas.invoicecandidate.externallyreferenced.InvoiceCandidateLookupKey;
import de.metas.invoicecandidate.externallyreferenced.InvoiceDetailItem;
import de.metas.invoicecandidate.externallyreferenced.ManualCandidateService;
import de.metas.invoicecandidate.externallyreferenced.NewManualInvoiceCandidate;
import de.metas.invoicecandidate.externallyreferenced.NewManualInvoiceCandidate.NewManualInvoiceCandidateBuilder;
import de.metas.lang.SOTrx;
import de.metas.money.CurrencyId;
Expand Down Expand Up @@ -62,7 +49,7 @@
import de.metas.rest_api.invoicecandidates.request.JsonCreateInvoiceCandidatesRequestItem;
import de.metas.rest_api.invoicecandidates.response.JsonCreateInvoiceCandidatesResponse;
import de.metas.rest_api.invoicecandidates.response.JsonCreateInvoiceCandidatesResponse.JsonCreateInvoiceCandidatesResponseBuilder;
import de.metas.rest_api.invoicecandidates.response.JsonCreateInvoiceCandidatesResponseItem;
import de.metas.rest_api.invoicecandidates.response.JsonInvoiceCandidatesResponseItem;
import de.metas.rest_api.utils.BPartnerCompositeLookupKey;
import de.metas.rest_api.utils.BPartnerQueryService;
import de.metas.rest_api.utils.CurrencyService;
Expand All @@ -75,6 +62,21 @@
import de.metas.util.Services;
import de.metas.util.lang.Percent;
import lombok.NonNull;
import org.adempiere.exceptions.AdempiereException;
import org.apache.commons.collections4.CollectionUtils;
import org.compiere.util.Env;
import org.springframework.stereotype.Service;

import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import static de.metas.util.Check.isEmpty;
import static de.metas.util.lang.CoalesceUtil.coalesce;
import static java.math.BigDecimal.ZERO;

/*
* #%L
Expand Down Expand Up @@ -156,7 +158,7 @@ public JsonCreateInvoiceCandidatesResponse createInvoiceCandidates(@NonNull fina

final InvoiceCandidateId candidateId = externallyReferencedCandidateRepository.save(manualCandidateService.createInvoiceCandidate(candidateToSave));

final JsonCreateInvoiceCandidatesResponseItem responseItem = JsonCreateInvoiceCandidatesResponseItem.builder()
final JsonInvoiceCandidatesResponseItem responseItem = JsonInvoiceCandidatesResponseItem.builder()
.externalHeaderId(headerId)
.externalLineId(lineId)
.metasfreshId(MetasfreshId.of(candidateId))
Expand Down
@@ -1,18 +1,5 @@
package de.metas.rest_api.invoicecandidates.impl;

import java.util.Optional;

import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import de.metas.Profiles;
import de.metas.invoice.InvoiceId;
import de.metas.rest_api.invoice.impl.InvoiceService;
Expand All @@ -25,11 +12,24 @@
import de.metas.rest_api.invoicecandidates.response.JsonCloseInvoiceCandidatesResponse;
import de.metas.rest_api.invoicecandidates.response.JsonCreateInvoiceCandidatesResponse;
import de.metas.rest_api.invoicecandidates.response.JsonEnqueueForInvoicingResponse;
import de.metas.rest_api.invoicecandidates.response.JsonReverseInvoiceResponse;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.NonNull;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

/*
* #%L
Expand Down Expand Up @@ -168,6 +168,17 @@ public ResponseEntity<?> revertInvoice(
return ResponseEntity.notFound().build();
}

return invoiceService.reverseInvoice(invoiceId);
try
{
final Optional<JsonReverseInvoiceResponse> response = invoiceService.reverseInvoice(invoiceId);

return response.isPresent()
? ResponseEntity.ok(response.get())
: ResponseEntity.notFound().build();
}
catch (final Exception e)
{
return ResponseEntity.unprocessableEntity().body(e.getLocalizedMessage());
}
}
}
@@ -1,12 +1,12 @@
package de.metas.rest_api.invoicecandidates.response;

import java.util.List;

import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Singular;
import lombok.Value;

import java.util.List;

/*
* #%L
* de.metas.business.rest-api
Expand Down Expand Up @@ -35,5 +35,5 @@ public class JsonCreateInvoiceCandidatesResponse
{
@ApiModelProperty(position = 10)
@Singular
List<JsonCreateInvoiceCandidatesResponseItem> responseItems;
List<JsonInvoiceCandidatesResponseItem> responseItems;
}
Expand Up @@ -31,7 +31,7 @@

@Value
@Builder
public class JsonCreateInvoiceCandidatesResponseItem
public class JsonInvoiceCandidatesResponseItem
{
@ApiModelProperty(position = 10, dataType = "java.lang.String")
JsonExternalId externalHeaderId;
Expand Down
@@ -0,0 +1,39 @@
/*
* #%L
* de.metas.business.rest-api
* %%
* Copyright (C) 2020 metas GmbH
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/

package de.metas.rest_api.invoicecandidates.response;

import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Singular;
import lombok.Value;

import java.util.List;

@Value
@Builder
public class JsonReverseInvoiceResponse
{
@ApiModelProperty(position = 10)
@Singular
List<JsonInvoiceCandidatesResponseItem> affectedInvoiceCandidates;
}
Expand Up @@ -21,31 +21,11 @@
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.annotation.Nullable;

import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.lang.IContextAware;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.model.IQuery;
import org.compiere.model.I_C_BPartner;
import org.compiere.model.I_C_InvoiceLine;
import org.compiere.model.I_C_InvoiceSchedule;
import org.compiere.model.I_M_InOut;
import org.compiere.model.I_M_InOutLine;

import de.metas.adempiere.model.I_C_Invoice;
import de.metas.aggregation.model.I_C_Aggregation;
import de.metas.bpartner.BPartnerId;
import de.metas.invoice.InvoiceId;
import de.metas.invoicecandidate.InvoiceCandidateId;
import de.metas.invoicecandidate.model.I_C_InvoiceCandidate_InOutLine;
import de.metas.invoicecandidate.model.I_C_Invoice_Candidate;
Expand All @@ -59,6 +39,26 @@
import de.metas.util.ISingletonService;
import lombok.NonNull;
import lombok.Value;
import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.lang.IContextAware;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.model.IQuery;
import org.compiere.model.I_C_BPartner;
import org.compiere.model.I_C_InvoiceLine;
import org.compiere.model.I_C_InvoiceSchedule;
import org.compiere.model.I_M_InOut;
import org.compiere.model.I_M_InOutLine;

import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public interface IInvoiceCandDAO extends ISingletonService
{
Expand All @@ -85,6 +85,8 @@ public interface IInvoiceCandDAO extends ISingletonService

List<I_C_Invoice_Candidate> retrieveIcForIl(I_C_InvoiceLine invoiceLine);

List<I_C_Invoice_Candidate> retrieveInvoiceCandidates(@NonNull final InvoiceId invoiceId);

/**
* Returns those invoice candidates that have been tagged to be recomputed/updated by the given <code>recomputeTag</code>.
*
Expand Down

0 comments on commit 33ed086

Please sign in to comment.