Skip to content
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

Days of supply #15

Merged
merged 11 commits into from
Jun 11, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ public class DataInjectionCommandLineRunner implements CommandLineRunner {

@Autowired
private VariablesService variablesService;

@Autowired
private ErpAdapterRequestService erpAdapterRequestService;

Expand Down Expand Up @@ -490,5 +489,4 @@ private Material getNewCentralControlUnitMaterial() {
material.setName("Central Control Unit");
return material;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
"/planned-production/**",
"/material-demand/**",
"/delivery-information/**",
"/supply/**",
"/edc/**",
"/erp-adapter/**",
"/parttypeinformation/**"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ public List<DeliveryDto> getAllDeliveries(String ownMaterialNumber, Optional<Str
if (material == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Material does not exist.");
}
var reportedDeliveries = reportedDeliveryService.findAllByFilters(Optional.of(ownMaterialNumber), bpns, bpnl)
var reportedDeliveries = reportedDeliveryService.findAllByFilters(Optional.of(ownMaterialNumber), bpns, bpnl, Optional.empty(), Optional.empty())
.stream().map(this::convertToDto).collect(Collectors.toList());
var ownDeliveries = ownDeliveryService.findAllByFilters(Optional.of(ownMaterialNumber), bpns, bpnl)
var ownDeliveries = ownDeliveryService.findAllByFilters(Optional.of(ownMaterialNumber), bpns, bpnl, Optional.empty(), Optional.empty())
.stream().map(this::convertToDto).collect(Collectors.toList());
return List.of(reportedDeliveries, ownDeliveries).stream().flatMap(List::stream).toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@
import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DeliveryRepository extends JpaRepository<OwnDelivery, UUID> {
public interface OwnDeliveryRepository extends JpaRepository<OwnDelivery, UUID> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public DeliveryInformation handleDeliverySubmodelRequest(String bpnl, String mat
return null;
}

var currentDeliveries = ownDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl()));
var currentDeliveries = ownDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl()), Optional.empty(), Optional.empty());
return sammMapper.ownDeliveryToSamm(currentDeliveries, partner, material);
}

Expand All @@ -114,7 +114,7 @@ public void doReportedDeliveryRequest(Partner partner, Material material) {
}
}
// delete older data:
var oldDeliveries = reportedDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl()));
var oldDeliveries = reportedDeliveryService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.empty(), Optional.of(partner.getBpnl()), Optional.empty(), Optional.empty());
for (var oldDelivery : oldDeliveries) {
reportedDeliveryService.delete(oldDelivery.getUuid());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@

package org.eclipse.tractusx.puris.backend.delivery.logic.service;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
Expand All @@ -31,22 +36,23 @@

import org.eclipse.tractusx.puris.backend.delivery.domain.model.EventTypeEnumeration;
import org.eclipse.tractusx.puris.backend.delivery.domain.model.OwnDelivery;
import org.eclipse.tractusx.puris.backend.delivery.domain.repository.DeliveryRepository;
import org.eclipse.tractusx.puris.backend.delivery.domain.repository.OwnDeliveryRepository;
import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner;
import org.eclipse.tractusx.puris.backend.masterdata.logic.service.PartnerService;
import org.eclipse.tractusx.puris.backend.stock.logic.dto.itemstocksamm.DirectionCharacteristic;
import org.springframework.stereotype.Service;

@Service
public class OwnDeliveryService {
public final DeliveryRepository repository;
private final OwnDeliveryRepository repository;

private final PartnerService partnerService;

protected final Function<OwnDelivery, Boolean> validator;

private Partner ownPartnerEntity;

public OwnDeliveryService(DeliveryRepository repository, PartnerService partnerService) {
public OwnDeliveryService(OwnDeliveryRepository repository, PartnerService partnerService) {
this.repository = repository;
this.partnerService = partnerService;
this.validator = this::validate;
Expand All @@ -66,7 +72,12 @@ public final List<OwnDelivery> findAllByOwnMaterialNumber(String ownMaterialNumb
.toList();
}

public final List<OwnDelivery> findAllByFilters(Optional<String> ownMaterialNumber, Optional<String> bpns, Optional<String> bpnl) {
public final List<OwnDelivery> findAllByFilters(
Optional<String> ownMaterialNumber,
Optional<String> bpns,
Optional<String> bpnl,
Optional<Date> day,
Optional<DirectionCharacteristic> direction) {
Stream<OwnDelivery> stream = repository.findAll().stream();
if (ownMaterialNumber.isPresent()) {
stream = stream.filter(delivery -> delivery.getMaterial().getOwnMaterialNumber().equals(ownMaterialNumber.get()));
Expand All @@ -77,13 +88,57 @@ public final List<OwnDelivery> findAllByFilters(Optional<String> ownMaterialNumb
if (bpnl.isPresent()) {
stream = stream.filter(delivery -> delivery.getPartner().getBpnl().equals(bpnl.get()));
}
if (day.isPresent()) {
LocalDate localDayDate = Instant.ofEpochMilli(day.get().getTime())
.atOffset(ZoneOffset.UTC)
.toLocalDate();
stream = stream.filter(delivery -> {
long time = direction.get() == DirectionCharacteristic.INBOUND
? delivery.getDateOfArrival().getTime()
: delivery.getDateOfDeparture().getTime();
LocalDate deliveryDayDate = Instant.ofEpochMilli(time)
.atOffset(ZoneOffset.UTC)
.toLocalDate();
return deliveryDayDate.getDayOfMonth() == localDayDate.getDayOfMonth();
});
}
if (direction.isPresent()) {
if (direction.get() == DirectionCharacteristic.INBOUND) {
stream = stream.filter(delivery -> delivery.getDestinationBpns().equals(bpns.get()));
} else {
stream = stream.filter(delivery -> delivery.getOriginBpns().equals(bpns.get()));
}
}
return stream.toList();
}

public final OwnDelivery findById(UUID id) {
return repository.findById(id).orElse(null);
}

public final double getSumOfQuantities(List<OwnDelivery> deliveries) {
double sum = 0;
for (OwnDelivery delivery : deliveries) {
sum += delivery.getQuantity();
}
return sum;
}

public final List<Double> getQuantityForDays(String material, String partnerBpnl, String siteBpns, DirectionCharacteristic direction, int numberOfDays) {
List<Double> deliveryQtys = new ArrayList<>();
LocalDate localDate = LocalDate.now();

for (int i = 0; i < numberOfDays; i++) {
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
List<OwnDelivery> deliveries = findAllByFilters(Optional.of(material), Optional.of(siteBpns), Optional.of(partnerBpnl), Optional.of(date), Optional.of(direction));
double deliveryQuantity = getSumOfQuantities(deliveries);
deliveryQtys.add(deliveryQuantity);

localDate = localDate.plusDays(1);
}
return deliveryQtys;
}

public final OwnDelivery create(OwnDelivery delivery) {
if (!validator.apply(delivery)) {
throw new IllegalArgumentException("Invalid delivery");
Expand Down Expand Up @@ -121,7 +176,7 @@ public boolean validate(OwnDelivery delivery) {
ownPartnerEntity = partnerService.getOwnPartnerEntity();
}
return
delivery.getQuantity() > 0 &&
delivery.getQuantity() >= 0 &&
delivery.getMeasurementUnit() != null &&
delivery.getMaterial() != null &&
delivery.getPartner() != null &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@

package org.eclipse.tractusx.puris.backend.delivery.logic.service;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
Expand All @@ -32,11 +37,12 @@
import org.eclipse.tractusx.puris.backend.delivery.domain.repository.ReportedDeliveryRepository;
import org.eclipse.tractusx.puris.backend.masterdata.domain.model.Partner;
import org.eclipse.tractusx.puris.backend.masterdata.logic.service.PartnerService;
import org.eclipse.tractusx.puris.backend.stock.logic.dto.itemstocksamm.DirectionCharacteristic;
import org.springframework.stereotype.Service;

@Service
public class ReportedDeliveryService {
public final ReportedDeliveryRepository repository;
private final ReportedDeliveryRepository repository;

private final PartnerService partnerService;

Expand All @@ -63,7 +69,12 @@ public final ReportedDelivery findById(UUID id) {
return repository.findById(id).orElse(null);
}

public final List<ReportedDelivery> findAllByFilters(Optional<String> ownMaterialNumber, Optional<String> bpns, Optional<String> bpnl) {
public final List<ReportedDelivery> findAllByFilters(
Optional<String> ownMaterialNumber,
Optional<String> bpns,
Optional<String> bpnl,
Optional<Date> day,
Optional<DirectionCharacteristic> direction) {
Stream<ReportedDelivery> stream = repository.findAll().stream();
if (ownMaterialNumber.isPresent()) {
stream = stream.filter(delivery -> delivery.getMaterial().getOwnMaterialNumber().equals(ownMaterialNumber.get()));
Expand All @@ -74,9 +85,53 @@ public final List<ReportedDelivery> findAllByFilters(Optional<String> ownMateria
if (bpnl.isPresent()) {
stream = stream.filter(delivery -> delivery.getPartner().getBpnl().equals(bpnl.get()));
}
if (day.isPresent()) {
LocalDate localDayDate = Instant.ofEpochMilli(day.get().getTime())
.atOffset(ZoneOffset.UTC)
.toLocalDate();
stream = stream.filter(delivery -> {
long time = direction.get() == DirectionCharacteristic.INBOUND
? delivery.getDateOfArrival().getTime()
: delivery.getDateOfDeparture().getTime();
LocalDate deliveryDayDate = Instant.ofEpochMilli(time)
.atOffset(ZoneOffset.UTC)
.toLocalDate();
return deliveryDayDate.getDayOfMonth() == localDayDate.getDayOfMonth();
});
}
if (direction.isPresent()) {
if (direction.get() == DirectionCharacteristic.INBOUND) {
stream = stream.filter(delivery -> delivery.getDestinationBpns().equals(bpns.get()));
} else {
stream = stream.filter(delivery -> delivery.getOriginBpns().equals(bpns.get()));
}
}
return stream.toList();
}

public final double getSumOfQuantities(List<ReportedDelivery> deliveries) {
double sum = 0;
for (ReportedDelivery delivery : deliveries) {
sum += delivery.getQuantity();
}
return sum;
}

public final List<Double> getQuantityForDays(String material, String partnerBpnl, String siteBpns, DirectionCharacteristic direction, int numberOfDays) {
List<Double> deliveryQtys = new ArrayList<>();
LocalDate localDate = LocalDate.now();

for (int i = 0; i < numberOfDays; i++) {
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
List<ReportedDelivery> deliveries = findAllByFilters(Optional.of(material), Optional.of(siteBpns), Optional.of(partnerBpnl), Optional.of(date), Optional.of(direction));
double deliveryQuantity = getSumOfQuantities(deliveries);
deliveryQtys.add(deliveryQuantity);

localDate = localDate.plusDays(1);
}
return deliveryQtys;
}

public final ReportedDelivery create(ReportedDelivery delivery) {
if (delivery.getUuid() != null && repository.findById(delivery.getUuid()).isPresent()) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public class DemandController {
@ResponseBody
@Operation(summary = "Get all own demands for the given Material", description = "Get all own demands for the given material number. Optionally the demanding site can be filtered by its bpns.")
public List<DemandDto> getAllDemands(String ownMaterialNumber, Optional<String> site) {
return ownDemandService.findAllByFilters(Optional.of(ownMaterialNumber), Optional.empty(), site)
return ownDemandService.findAllByFilters(Optional.of(ownMaterialNumber), Optional.empty(), site, Optional.empty())
.stream().map(this::convertToDto).collect(Collectors.toList());
}

Expand Down Expand Up @@ -171,7 +171,7 @@ public void deleteDemand(@PathVariable UUID id) {
)
public List<DemandDto> getAllDemandsForPartner(String ownMaterialNumber, Optional<String> bpnl,
Optional<String> site) {
return reportedDemandService.findAllByFilters(Optional.of(ownMaterialNumber), bpnl, site)
return reportedDemandService.findAllByFilters(Optional.of(ownMaterialNumber), bpnl, site, Optional.empty())
.stream().map(this::convertToDto).collect(Collectors.toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public ShortTermMaterialDemand handleDemandSubmodelRequest(String bpnl, String m
return null;
}

var currentDemands = ownDemandService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.of(partner.getBpnl()), Optional.empty());
var currentDemands = ownDemandService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.of(partner.getBpnl()), Optional.empty(), Optional.empty());
return sammMapper.ownDemandToSamm(currentDemands, partner, material);
}

Expand All @@ -109,7 +109,7 @@ public void doReportedDemandRequest(Partner partner, Material material) {
}
}
// delete older data:
var oldDemands = reportedDemandService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.of(partner.getBpnl()), Optional.empty());
var oldDemands = reportedDemandService.findAllByFilters(Optional.of(material.getOwnMaterialNumber()), Optional.of(partner.getBpnl()), Optional.empty(), Optional.empty());
for (var oldDemand : oldDemands) {
reportedDemandService.delete(oldDemand.getUuid());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ See the NOTICE file(s) distributed with this work for additional
*/
package org.eclipse.tractusx.puris.backend.demand.logic.services;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
Expand Down Expand Up @@ -63,7 +67,11 @@ public final List<TEntity> findAllByOwnMaterialNumber(String ownMaterialNumber)
.toList();
}

public final List<TEntity> findAllByFilters(Optional<String> ownMaterialNumber, Optional<String> bpnl, Optional<String> demandLocationBpns) {
public final List<TEntity> findAllByFilters(
Optional<String> ownMaterialNumber,
Optional<String> bpnl,
Optional<String> demandLocationBpns,
Optional<Date> day) {
var stream = repository.findAll().stream();
if (ownMaterialNumber.isPresent()) {
stream = stream.filter(demand -> demand.getMaterial().getOwnMaterialNumber().equals(ownMaterialNumber.get()));
Expand All @@ -74,6 +82,17 @@ public final List<TEntity> findAllByFilters(Optional<String> ownMaterialNumber,
if (demandLocationBpns.isPresent()) {
stream = stream.filter(demand -> demand.getDemandLocationBpns().equals(demandLocationBpns.get()));
}
if (day.isPresent()) {
LocalDate localDayDate = Instant.ofEpochMilli(day.get().getTime())
.atOffset(ZoneOffset.UTC)
.toLocalDate();
stream = stream.filter(demand -> {
LocalDate demandDayDate = Instant.ofEpochMilli(demand.getDay().getTime())
.atOffset(ZoneOffset.UTC)
.toLocalDate();
return demandDayDate.getDayOfMonth() == localDayDate.getDayOfMonth();
});
}
return stream.toList();
}

Expand Down
Loading