From d265f80a3efa9f5cdb07a88c9376599a1122d793 Mon Sep 17 00:00:00 2001 From: pdenzler Date: Wed, 11 Dec 2024 16:20:51 +0100 Subject: [PATCH] [26808] stockService - add stock to article return & disposal method --- .../elexis/core/services/BillingService.java | 8 ++--- .../ch/elexis/core/services/StockService.java | 26 ++++++++-------- .../elexis/core/services/IStockService.java | 10 +++++-- .../core/services/IStockServiceTest.java | 30 +++++++++++++++++++ 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/bundles/ch.elexis.core.services/src/ch/elexis/core/services/BillingService.java b/bundles/ch.elexis.core.services/src/ch/elexis/core/services/BillingService.java index f8d5225181..5128f0dc4c 100644 --- a/bundles/ch.elexis.core.services/src/ch/elexis/core/services/BillingService.java +++ b/bundles/ch.elexis.core.services/src/ch/elexis/core/services/BillingService.java @@ -166,7 +166,7 @@ public Result bill(IBillable billable, IEncounter encounter, double amo if (billable instanceof IArticle) { IStatus status = stockService.performSingleDisposal((IArticle) billable, doubleToInt(amount), - contextService.getActiveMandator().map(m -> m.getId()).orElse(null)); + contextService.getActiveMandator().map(m -> m.getId()).orElse(null), null); if (!status.isOK()) { StatusUtil.logStatus(logger, status, true); } @@ -247,7 +247,7 @@ public Result removeBilled(IBilled billed, IEncounter encounter) { // TODO stock return via event IArticle article = (IArticle) billable; String mandatorId = contextService.getActiveMandator().map(m -> m.getId()).orElse(null); - stockService.performSingleReturn(article, (int) billed.getAmount(), mandatorId); + stockService.performSingleReturn(article, (int) billed.getAmount(), mandatorId, null); // TODO prescription via event Object prescId = billed.getExtInfo(Constants.FLD_EXT_PRESC_ID); @@ -369,10 +369,10 @@ public void changeAmount(IBilled billed, double newAmount) { String mandatorId = contextService.getActiveMandator().map(m -> m.getId()).orElse(null); double difference = newAmount - oldAmount; if (difference > 0) { - stockService.performSingleDisposal(art, (int) difference, mandatorId); + stockService.performSingleDisposal(art, (int) difference, mandatorId, null); } else if (difference < 0) { difference *= -1; - stockService.performSingleReturn(art, (int) difference, mandatorId); + stockService.performSingleReturn(art, (int) difference, mandatorId, null); } } } diff --git a/bundles/ch.elexis.core.services/src/ch/elexis/core/services/StockService.java b/bundles/ch.elexis.core.services/src/ch/elexis/core/services/StockService.java index ccf9ad3ffa..4b5294c5b9 100644 --- a/bundles/ch.elexis.core.services/src/ch/elexis/core/services/StockService.java +++ b/bundles/ch.elexis.core.services/src/ch/elexis/core/services/StockService.java @@ -64,20 +64,21 @@ public Long getCumulatedStockForArticle(IArticle article) { public void performSingleDisposal(IArticle article, int count) { Optional mandator = ContextServiceHolder.get().getActiveMandator(); - performSingleDisposal(article, count, (mandator.isPresent()) ? mandator.get().getId() : null); + performSingleDisposal(article, count, (mandator.isPresent()) ? mandator.get().getId() : null, null); } @Override - public IStatus performSingleDisposal(IArticle article, int count, String mandatorId) { + public IStatus performSingleDisposal(IArticle article, int count, String mandatorId, IStock stock) { if (count < 0) { throw new IllegalArgumentException(); } if (article == null) { return new Status(Status.ERROR, "ch.elexis.core.services", "Article is null"); } - - IStockEntry se = findPreferredStockEntryForArticle(StoreToStringServiceHolder.getStoreToString(article), - mandatorId); + + IStockEntry se = (stock == null) + ? findPreferredStockEntryForArticle(StoreToStringServiceHolder.getStoreToString(article), mandatorId) + : this.findStockEntryForArticleInStock(stock, article); if (se == null) { return new Status(Status.WARNING, "ch.elexis.core.services", "No stock entry for article found"); } @@ -141,7 +142,7 @@ public IStatus performSingleDisposal(IArticle article, int count, String mandato } @Override - public IStatus performSingleReturn(IArticle article, int count, String mandatorId) { + public IStatus performSingleReturn(IArticle article, int count, String mandatorId, IStock stock) { if (count < 0) { throw new IllegalArgumentException(); } @@ -149,12 +150,9 @@ public IStatus performSingleReturn(IArticle article, int count, String mandatorI return new Status(Status.ERROR, "ch.elexis.core.services", "Article is null"); } - IStockEntry se = findPreferredStockEntryForArticle(StoreToStringServiceHolder.getStoreToString(article), - mandatorId); - if (se == null) { - return new Status(Status.WARNING, "ch.elexis.core.services", "No stock entry for article found"); - } - + IStockEntry se = (stock == null) + ? findPreferredStockEntryForArticle(StoreToStringServiceHolder.getStoreToString(article), mandatorId) + : this.findStockEntryForArticleInStock(stock, article); if (se.getStock().isCommissioningSystem()) { // updates must happen via manual inputs in the machine return Status.OK_STATUS; @@ -412,7 +410,7 @@ public List findAllStockEntriesForStock(IStock stock) { public IStatus performSingleDisposal(String articleStoreToString, int count, String mandatorId) { Optional article = StoreToStringServiceHolder.get().loadFromString(articleStoreToString); if (article.isPresent()) { - return performSingleDisposal((IArticle) article.get(), count, mandatorId); + return performSingleDisposal((IArticle) article.get(), count, mandatorId, null); } return new Status(Status.WARNING, "ch.elexis.core.services", "No article found [" + articleStoreToString + "]"); } @@ -421,7 +419,7 @@ public IStatus performSingleDisposal(String articleStoreToString, int count, Str public IStatus performSingleReturn(String articleStoreToString, int count, String mandatorId) { Optional article = StoreToStringServiceHolder.get().loadFromString(articleStoreToString); if (article.isPresent()) { - return performSingleReturn((IArticle) article.get(), count, mandatorId); + return performSingleReturn((IArticle) article.get(), count, mandatorId, null); } return new Status(Status.WARNING, "ch.elexis.core.services", "No article found [" + articleStoreToString + "]"); } diff --git a/bundles/ch.elexis.core/src/ch/elexis/core/services/IStockService.java b/bundles/ch.elexis.core/src/ch/elexis/core/services/IStockService.java index 67386538b3..6303165548 100644 --- a/bundles/ch.elexis.core/src/ch/elexis/core/services/IStockService.java +++ b/bundles/ch.elexis.core/src/ch/elexis/core/services/IStockService.java @@ -5,6 +5,7 @@ import org.eclipse.core.runtime.IStatus; +import ch.elexis.core.jdt.Nullable; import ch.elexis.core.model.IArticle; import ch.elexis.core.model.IPatient; import ch.elexis.core.model.IStock; @@ -131,14 +132,16 @@ public enum Availability { /** * Perform a single disposal of an article. The article will be withdrawn from - * the Stock with the highest priority owning this article (if multiple). + * the Stock with the highest priority owning this article (if multiple) or from + * the given stock. * * @param article * @param mandatorId may be null to not consider the mandator * @param count + * @param stock * @return */ - public IStatus performSingleDisposal(IArticle article, int count, String mandatorId); + public IStatus performSingleDisposal(IArticle article, int count, String mandatorId, @Nullable IStock stock); /** * Perform a single disposal of an article. Use this method if only the store to @@ -159,9 +162,10 @@ public enum Availability { * @param article * @param count * @param mandatorId + * @param stock * @return */ - public IStatus performSingleReturn(IArticle article, int count, String mandatorId); + public IStatus performSingleReturn(IArticle article, int count, String mandatorId, @Nullable IStock stock); /** * Perform a single return of an article. Use this method if only the store to diff --git a/tests/ch.elexis.core.services.test/src/ch/elexis/core/services/IStockServiceTest.java b/tests/ch.elexis.core.services.test/src/ch/elexis/core/services/IStockServiceTest.java index f5fba284c3..02241fe567 100644 --- a/tests/ch.elexis.core.services.test/src/ch/elexis/core/services/IStockServiceTest.java +++ b/tests/ch.elexis.core.services.test/src/ch/elexis/core/services/IStockServiceTest.java @@ -14,6 +14,7 @@ import ch.elexis.core.model.IArticle; import ch.elexis.core.model.IPatient; +import ch.elexis.core.model.IPerson; import ch.elexis.core.model.IStock; import ch.elexis.core.model.IStockEntry; import ch.elexis.core.model.builder.IArticleBuilder; @@ -22,6 +23,7 @@ import ch.elexis.core.types.ArticleTyp; import ch.elexis.core.types.Gender; import ch.elexis.core.utils.OsgiServiceUtil; +import ch.rgw.tools.TimeTool; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class IStockServiceTest extends AbstractServiceTest { @@ -30,14 +32,18 @@ public class IStockServiceTest extends AbstractServiceTest { private static IStockService service; private static IPatient patient; private static IArticle article; + private static IPerson person; @BeforeClass public static void beforeClass() { + TimeTool timeTool = new TimeTool(); service = OsgiServiceUtil.getService(IStockService.class).get(); patient = new IContactBuilder.PatientBuilder(coreModelService, "test", "patient", LocalDate.of(2000, 1, 1), Gender.MALE).buildAndSave(); article = new IArticleBuilder(coreModelService, "test medication article", "1234567", ArticleTyp.ARTIKELSTAMM) .buildAndSave(); + person = new IContactBuilder.PersonBuilder(coreModelService, "mandator1 " + timeTool.toString(), + "Anton" + timeTool.toString(), timeTool.toLocalDate(), Gender.MALE).mandator().buildAndSave(); } @Test @@ -72,4 +78,28 @@ public void b_deletePatientStock() { List entries = service.findAllStockEntriesForStock(patientStock); assertTrue(entries.isEmpty()); } + + @Test + public void performSingleDisposalWithProvidedStock() { + IStock stock = coreModelService.create(IStock.class); + stock.setOwner(person); + IStockEntry stockEntry = service.storeArticleInStock(stock, article); + stockEntry.setCurrentStock(2); + coreModelService.save(stockEntry); + + service.performSingleDisposal(article, 1, person.getId(), null); + assertEquals(1, service.findStockEntryForArticleInStock(stock, article).getCurrentStock()); + } + + @Test + public void performSingleReturn() { + IStock stock = coreModelService.create(IStock.class); + IStockEntry stockEntry = service.storeArticleInStock(stock, article); + stockEntry.setCurrentStock(1); + coreModelService.save(stockEntry); + + service.performSingleReturn(article, 1, person.getId(), stock); + assertEquals(2, service.findStockEntryForArticleInStock(stock, article).getCurrentStock()); + + } }