Skip to content

Commit

Permalink
- push products to alberta - next steps
Browse files Browse the repository at this point in the history
refs: #10818
  • Loading branch information
cp-ps committed Mar 20, 2021
1 parent 4f4f21d commit 9cca0e3
Show file tree
Hide file tree
Showing 22 changed files with 581 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import de.metas.uom.UomId;
import de.metas.util.Check;
import de.metas.vertical.healthcare.alberta.service.AlbertaCompositeProductInfo;
import de.metas.vertical.healthcare.alberta.service.AlbertaPackagingUnit;
import de.metas.vertical.healthcare.alberta.service.AlbertaProductService;
import de.metas.vertical.healthcare.alberta.service.GetAlbertaProductsInfoRequest;
import lombok.Builder;
Expand Down Expand Up @@ -259,14 +260,11 @@ private JsonAlbertaProductInfo mapToJsonAlbertaProductInfo(@NonNull final Albert
? null
: albertaCompositeProductInfo.getAlbertaPackagingUnitList()
.stream()
.map(albertaPackagingUnit ->
JsonAlbertaPackagingUnit.builder()
.quantity(albertaPackagingUnit.getQuantity())
.unit(albertaPackagingUnit.getUnit())
.build())
.map(this::mapToJsonAlbertaPackagingUnit)
.collect(ImmutableList.toImmutableList());

return JsonAlbertaProductInfo.builder()
.albertaProductId(albertaCompositeProductInfo.getAlbertaArticleId())
.additionalDescription(albertaCompositeProductInfo.getAdditionalDescription())
.assortmentType(albertaCompositeProductInfo.getAssortmentType())
.inventoryType(albertaCompositeProductInfo.getInventoryType())
Expand Down Expand Up @@ -330,4 +328,13 @@ private PriceListId getPharmacyPriceListIdOrNull()
.map(ExternalSystemAlbertaConfig::getPharmacyPriceListId)
.orElse(null);
}

@NonNull
private JsonAlbertaPackagingUnit mapToJsonAlbertaPackagingUnit(@NonNull final AlbertaPackagingUnit albertaPackagingUnit)
{
return JsonAlbertaPackagingUnit.builder()
.quantity(albertaPackagingUnit.getQuantity())
.unit(albertaPackagingUnit.getUnit())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ public void init()
Env.setLoggedUserId(Env.getCtx(), UserId.METASFRESH);

final ProductsServicesFacade productsServicesFacade = new ProductsServicesFacade();
final AlbertaProductService albertaProductService = new AlbertaProductService(new AlbertaProductDAO());

final ExternalSystemService externalSystemService = new ExternalSystemService(new ExternalSystemConfigRepo(), new ExternalSystemExportAuditRepo());
final ProductRepository productRepository = new ProductRepository();
Expand All @@ -105,6 +104,7 @@ public void init()

final ExternalReferenceRestControllerService externalReferenceRestControllerService =
new ExternalReferenceRestControllerService(externalReferenceRepository, new ExternalSystems(), new ExternalReferenceTypes());
final AlbertaProductService albertaProductService = new AlbertaProductService(new AlbertaProductDAO(), externalReferenceRepository);

final ProductRestService productRestService = new ProductRestService(productRepository, externalReferenceRestControllerService);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public Integer getReferencedRecordIdOrNullBy(final @NonNull ExternalReferenceQue

public ExternalReferenceId save(@NonNull final ExternalReference externalReference)
{
final I_S_ExternalReference record = InterfaceWrapperHelper.newInstance(I_S_ExternalReference.class);
final I_S_ExternalReference record = InterfaceWrapperHelper.loadOrNew(externalReference.getExternalReferenceId(), I_S_ExternalReference.class);

record.setAD_Org_ID(externalReference.getOrgId().getRepoId());
record.setExternalReference(externalReference.getExternalReference());
Expand Down Expand Up @@ -152,6 +152,19 @@ public ImmutableMap<ExternalReferenceQuery, ExternalReference> getExternalRefere
return result.build();
}

@NonNull
public Optional<ExternalReference> getExternalReferenceByMFReference(@NonNull final GetExternalReferenceByRecordIdReq request)
{
return queryBL.createQueryBuilder(I_S_ExternalReference.class)
.addOnlyActiveRecordsFilter()
.addEqualsFilter(I_S_ExternalReference.COLUMNNAME_Record_ID, request.getRecordId())
.addEqualsFilter(I_S_ExternalReference.COLUMNNAME_Type, request.getExternalReferenceType().getCode())
.addEqualsFilter(I_S_ExternalReference.COLUMNNAME_ExternalSystem, request.getExternalSystem().getCode())
.create()
.firstOnlyOptional(I_S_ExternalReference.class)
.map(this::buildExternalReference);
}

private ExternalReferenceQuery buildExternalReferenceQuery(final I_S_ExternalReference record)
{
final IExternalReferenceType type = extractType(record);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* #%L
* de.metas.externalreference
* %%
* Copyright (C) 2021 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.externalreference;

import lombok.Builder;
import lombok.NonNull;
import lombok.Value;

@Value
@Builder
public class GetExternalReferenceByRecordIdReq
{
@NonNull
Integer recordId;
@NonNull
IExternalReferenceType externalReferenceType;
@NonNull
IExternalSystem externalSystem;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
package de.metas.externalreference.rest;

import de.metas.Profiles;
import de.metas.util.web.MetasfreshRestAPIConstants;
import de.metas.common.externalreference.JsonExternalReferenceCreateRequest;
import de.metas.common.externalreference.JsonExternalReferenceLookupRequest;
import de.metas.common.externalreference.JsonExternalReferenceLookupResponse;
import de.metas.common.externalreference.JsonExternalReferenceCreateRequest;
import de.metas.common.externalreference.JsonRequestExternalReferenceUpsert;
import de.metas.util.web.MetasfreshRestAPIConstants;
import io.swagger.annotations.ApiParam;
import lombok.NonNull;
import org.springframework.context.annotation.Profile;
Expand All @@ -38,6 +39,8 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Nullable;

@RequestMapping(value = {
MetasfreshRestAPIConstants.ENDPOINT_API_DEPRECATED + "/externalRef",
MetasfreshRestAPIConstants.ENDPOINT_API_V1 + "/externalRef",
Expand Down Expand Up @@ -82,5 +85,17 @@ public ResponseEntity<?> insert(
return ResponseEntity.ok().build();
}

@PutMapping("/upsert/{orgCode}")
public ResponseEntity<?> upsert(
@ApiParam(required = true, value = "`AD_Org.Value` of the external references we are upserting") //
@PathVariable("orgCode") //
@Nullable final String orgCode,

@RequestBody @NonNull final JsonRequestExternalReferenceUpsert request)
{
externalReferenceRestControllerService.performUpsert(request, orgCode);

return ResponseEntity.ok().build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import de.metas.common.externalreference.JsonExternalReferenceLookupItem;
import de.metas.common.externalreference.JsonExternalReferenceLookupRequest;
import de.metas.common.externalreference.JsonExternalReferenceLookupResponse;
import de.metas.common.externalreference.JsonRequestExternalReferenceUpsert;
import de.metas.common.externalreference.JsonSingleExternalReferenceCreateReq;
import de.metas.common.externalsystem.JsonExternalSystemName;
import de.metas.common.rest_api.JsonMetasfreshId;
Expand All @@ -39,11 +40,12 @@
import de.metas.externalreference.ExternalReferenceRepository;
import de.metas.externalreference.ExternalReferenceTypes;
import de.metas.externalreference.ExternalSystems;
import de.metas.externalreference.GetExternalReferenceByRecordIdReq;
import de.metas.externalreference.IExternalReferenceType;
import de.metas.externalreference.IExternalSystem;
import de.metas.logging.LogManager;
import de.metas.organization.OrgId;
import de.metas.organization.impl.OrgDAO;
import de.metas.util.Check;
import de.metas.util.web.exception.InvalidIdentifierException;
import lombok.NonNull;
import org.slf4j.Logger;
Expand All @@ -55,6 +57,8 @@
import java.util.Objects;
import java.util.Optional;

import static de.metas.RestUtils.retrieveOrgIdOrDefault;

@Component
public class ExternalReferenceRestControllerService
{
Expand All @@ -78,7 +82,7 @@ public JsonExternalReferenceLookupResponse performLookup(
@Nullable final String orgCode,
@NonNull final JsonExternalReferenceLookupRequest request)
{
final OrgId orgId = RestUtils.retrieveOrgIdOrDefault(orgCode);
final OrgId orgId = retrieveOrgIdOrDefault(orgCode);

final IExternalSystem externalSystem = externalSystems.ofCode(request.getSystemName().getName())
.orElseThrow(() -> new InvalidIdentifierException("systemName", request));
Expand Down Expand Up @@ -211,7 +215,6 @@ public void performInsertIfMissing(
performInsert(orgCode, jsonExternalReferenceCreateRequest);
}


@NonNull
public Optional<JsonMetasfreshId> getJsonMetasfreshIdFromExternalReference(
@NonNull final String orgCode,
Expand All @@ -235,4 +238,61 @@ public Optional<JsonMetasfreshId> getJsonMetasfreshIdFromExternalReference(
.filter(Objects::nonNull)
.findFirst();
}

public void performUpsert(@NonNull final JsonRequestExternalReferenceUpsert request, @Nullable final String orgCode)
{
final OrgId orgId = retrieveOrgIdOrDefault(orgCode);
final ExternalReference externalReferenceCandidate = mapJsonToExternalReference(request, orgId);

final GetExternalReferenceByRecordIdReq getExternalRefRequest = GetExternalReferenceByRecordIdReq.builder()
.externalReferenceType(externalReferenceCandidate.getExternalReferenceType())
.externalSystem(externalReferenceCandidate.getExternalSystem())
.recordId(externalReferenceCandidate.getRecordId())
.build();

final ExternalReference externalReferenceToUpsert = externalReferenceRepository.getExternalReferenceByMFReference(getExternalRefRequest)
.map(existingRecord -> syncCandidateWithExisting(externalReferenceCandidate, existingRecord))
.orElse(externalReferenceCandidate);

externalReferenceRepository.save(externalReferenceToUpsert);
}

@NonNull
private ExternalReference mapJsonToExternalReference(@NonNull final JsonRequestExternalReferenceUpsert request, @NonNull final OrgId orgId)
{
Check.assumeNotNull(request.getExternalReferenceItem().getMetasfreshId(), "MetasfreshId cannot be null at this stage!");

final IExternalReferenceType externalReferenceType = externalReferenceTypes.ofCode(request.getExternalReferenceItem().getLookupItem().getType())
.orElseThrow(() -> new InvalidIdentifierException("type", request.getExternalReferenceItem().getLookupItem().getType()));

final IExternalSystem externalSystem = externalSystems.ofCode(request.getSystemName().getName())
.orElseThrow(() -> new InvalidIdentifierException("externalSystem", request.getSystemName().getName()));

return ExternalReference.builder()
.orgId(orgId)
.externalSystem(externalSystem)
.externalReferenceType(externalReferenceType)
.externalReference(request.getExternalReferenceItem().getLookupItem().getId())
.recordId(request.getExternalReferenceItem().getMetasfreshId().getValue())
.version(request.getExternalReferenceItem().getVersion())
.build();
}

@NonNull
private ExternalReference syncCandidateWithExisting(
@NonNull final ExternalReference candidate,
@NonNull final ExternalReference existingReference)
{
return ExternalReference.builder()
//existing
.externalReferenceId(existingReference.getExternalReferenceId())
//candidate
.orgId(candidate.getOrgId())
.externalSystem(candidate.getExternalSystem())
.externalReferenceType(candidate.getExternalReferenceType())
.externalReference(candidate.getExternalReference())
.recordId(candidate.getRecordId())
.version(candidate.getVersion())
.build();
}
}
15 changes: 14 additions & 1 deletion backend/de.metas.vertical.healthcare.alberta/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<properties>
<migration-sql-basedir/>
<metasfresh.version>10.0.0</metasfresh.version>
<metasfresh-common.version>10.0.0</metasfresh-common.version>
</properties>

<dependencies>
Expand All @@ -42,7 +43,19 @@
<version>${metasfresh.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependency>
<groupId>de.metas.common.externalreference</groupId>
<artifactId>de-metas-common-externalreference</artifactId>
<version>${metasfresh-common.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>de.metas.externalreference</groupId>
<artifactId>de.metas.externalreference</artifactId>
<version>${metasfresh.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ public class AlbertaCompositeProductInfo
@NonNull
ProductId productId;

@Nullable
String albertaArticleId;

@NonNull
Instant lastUpdated;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ public class AlbertaCompositeProductProducer
@NonNull
Map<ProductId, I_M_ProductPrice> productId2ProductPrice;

@NonNull
Function<ProductId, Optional<String>> getAlbertaArticleIdSupplier;

@NonNull
public ImmutableMap<ProductId, AlbertaCompositeProductInfo> getAlbertaInfoByProductId()
{
Expand All @@ -80,7 +83,9 @@ public ImmutableMap<ProductId, AlbertaCompositeProductInfo> getAlbertaInfoByProd
private AlbertaCompositeProductInfo getProductCompositeInfoFor(@NonNull final ProductId productId)
{
final AlbertaCompositeProductInfo.AlbertaCompositeProductInfoBuilder compositeProductBuilder = AlbertaCompositeProductInfo.builder();
compositeProductBuilder.productId(productId);
compositeProductBuilder
.productId(productId)
.albertaArticleId(getAlbertaArticleIdSupplier.apply(productId).orElse(null));

final Optional<List<I_M_Product_AlbertaPackagingUnit>> packagingUnitRecords = Optional.ofNullable(product2PackagingUnits.get(productId));
packagingUnitRecords.map(records -> records.stream()
Expand Down Expand Up @@ -161,7 +166,6 @@ private Instant getLastUpdate(
.map(Timestamp::toInstant)
.ifPresent(updateTimestamps::add);


Optional.ofNullable(productPrice)
.map(I_M_ProductPrice::getUpdated)
.map(Timestamp::toInstant)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
package de.metas.vertical.healthcare.alberta.service;

import com.google.common.collect.ImmutableMap;
import de.metas.externalreference.AlbertaExternalSystem;
import de.metas.externalreference.ExternalReference;
import de.metas.externalreference.ExternalReferenceRepository;
import de.metas.externalreference.GetExternalReferenceByRecordIdReq;
import de.metas.externalreference.product.ProductExternalReferenceType;
import de.metas.pricing.PriceListId;
import de.metas.pricing.PriceListVersionId;
import de.metas.pricing.service.IPriceListDAO;
Expand All @@ -45,10 +50,12 @@ public class AlbertaProductService
{
private final AlbertaProductDAO albertaProductDAO;
private final IPriceListDAO priceListDAO = Services.get(IPriceListDAO.class);
private final ExternalReferenceRepository externalReferenceRepository;

public AlbertaProductService(final AlbertaProductDAO albertaProductDAO)
public AlbertaProductService(final AlbertaProductDAO albertaProductDAO, final ExternalReferenceRepository externalReferenceRepository)
{
this.albertaProductDAO = albertaProductDAO;
this.externalReferenceRepository = externalReferenceRepository;
}

@NonNull
Expand Down Expand Up @@ -86,6 +93,20 @@ private AlbertaCompositeProductProducer buildAlbertaCompositeProductProducer(
.product2BillableTherapies(albertaProductDAO.getBillableTherapies(dataQuery))
.product2Therapies(albertaProductDAO.getTherapies(dataQuery))
.product2PackagingUnits(albertaProductDAO.getPackagingUnits(dataQuery))
.getAlbertaArticleIdSupplier(this::getAlbertaArticleIdByProductId)
.build();
}

@NonNull
private Optional<String> getAlbertaArticleIdByProductId(@NonNull final ProductId productId)
{
final GetExternalReferenceByRecordIdReq getExternalReferenceByRecordIdReq = GetExternalReferenceByRecordIdReq.builder()
.recordId(productId.getRepoId())
.externalSystem(AlbertaExternalSystem.ALBERTA)
.externalReferenceType(ProductExternalReferenceType.PRODUCT)
.build();

return externalReferenceRepository.getExternalReferenceByMFReference(getExternalReferenceByRecordIdReq)
.map(ExternalReference::getExternalReference);
}
}

0 comments on commit 9cca0e3

Please sign in to comment.