Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd5e9de3

Browse files
authored
OBPIH-7544 Create backend for expiration history report (list endpoin… (#5581)
1 parent1f94f80 commitd5e9de3

File tree

7 files changed

+136
-1
lines changed

7 files changed

+136
-1
lines changed

‎grails-app/controllers/org/pih/warehouse/UrlMappings.groovy‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,15 @@ class UrlMappings {
10921092
action= [POST:"saveRecordStock"]
10931093
}
10941094

1095+
/**
1096+
* Inventory API endpoints
1097+
*/
1098+
1099+
"/api/inventories/expirationHistoryReport" {
1100+
controller= {"inventoryApi" }
1101+
action= [GET:"getExpirationHistoryReport"]
1102+
}
1103+
10951104
// Error handling
10961105

10971106
"401"(controller:"errors",action:"handleUnauthorized")

‎grails-app/controllers/org/pih/warehouse/api/InventoryApiController.groovy‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,25 @@ package org.pih.warehouse.api
22

33
importgrails.converters.JSON
44
importgrails.validation.ValidationException
5+
importorg.pih.warehouse.PaginatedList
56
importorg.pih.warehouse.auth.AuthService
67
importorg.pih.warehouse.core.DashboardService
78
importorg.pih.warehouse.core.Location
89
importorg.pih.warehouse.importer.CSVUtils
910
importorg.pih.warehouse.importer.ImportDataCommand
1011
importorg.pih.warehouse.importer.InventoryImportDataService
12+
importorg.pih.warehouse.inventory.ExpirationHistoryReportFilterCommand
13+
importorg.pih.warehouse.inventory.ExpirationHistoryReportRow
14+
importorg.pih.warehouse.inventory.InventoryService
1115
importorg.pih.warehouse.inventory.ReorderReportFilterCommand
1216
importorg.pih.warehouse.inventory.ReorderReportItemDto
17+
importorg.pih.warehouse.inventory.TransactionEntry
1318

1419
classInventoryApiController {
1520

1621
InventoryImportDataService inventoryImportDataService
1722
DashboardService dashboardService
23+
InventoryService inventoryService
1824

1925
defimportCsv() {
2026
String fileData= request.inputStream.text
@@ -59,4 +65,24 @@ class InventoryApiController {
5965
}
6066
}
6167
}
68+
69+
defgetExpirationHistoryReport(ExpirationHistoryReportFilterCommandcommand) {
70+
if (command.hasErrors()) {
71+
thrownewValidationException("Invalid filters", command.errors)
72+
}
73+
withFormat {
74+
"csv" {
75+
String csv= inventoryService.getExpirationHistoryReportCsv(command)
76+
response.contentType="text/csv"
77+
String filename="Expiration history report -${AuthService.currentLocation?.name}.csv"
78+
response.setHeader("Content-disposition","attachment; filename=\"${filename}\"")
79+
render(csv)
80+
return
81+
}
82+
"*" {
83+
PaginatedList<ExpirationHistoryReportRow> entries= inventoryService.getExpirationHistoryReport(command)
84+
render([data: entries,totalCount: entries.totalCount]asJSON)
85+
}
86+
}
87+
}
6288
}

‎grails-app/i18n/messages.properties‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,10 @@ putawayOrder.putAwayBin.label=Putaway Bin
23072307
reorderReportFilterCommand.additionalLocations.invalid.locations=Every additional location has to support Manage Inventory activity
23082308
reorderReport.noMaxQtySet.label=No Max qty set - review based on monthly demand
23092309

2310+
# Expiration history report messages
2311+
expirationHistoryReport.quantityLostToExpiry.label=Quantity Lost to Expiry
2312+
expirationHistoryReport.valueLostToExpiry.label=Value Lost to Expiry
2313+
23102314
# Receipt messages
23112315
receipts.label=Receipts
23122316
receipt.actualDeliveryDate.invalid.mustOccurOnOrAfterActualShippingDate=Must occur on or after Actual Shipping Date

‎grails-app/services/org/pih/warehouse/inventory/InventoryService.groovy‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,20 @@
1010
packageorg.pih.warehouse.inventory
1111

1212
importgrails.gorm.transactions.Transactional
13+
importgrails.plugins.csv.CSVWriter
1314
importgrails.validation.ValidationException
1415
importorg.hibernate.criterion.CriteriaSpecification
1516

1617
importorg.pih.warehouse.PaginatedList
1718
importorg.pih.warehouse.api.AvailableItem
19+
importorg.pih.warehouse.auth.AuthService
1820
importorg.pih.warehouse.core.ConfigService
1921
importorg.pih.warehouse.core.Constants
2022
importorg.pih.warehouse.core.Location
2123
importorg.pih.warehouse.core.Tag
2224
importorg.pih.warehouse.core.User
25+
importorg.pih.warehouse.core.localization.MessageLocalizer
26+
importorg.pih.warehouse.importer.CSVUtils
2327
importorg.pih.warehouse.importer.ImportDataCommand
2428
importorg.pih.warehouse.importer.ImporterUtil
2529
importorg.pih.warehouse.inventory.product.availability.AvailableItemKey
@@ -48,6 +52,7 @@ class InventoryService implements ApplicationContextAware {
4852
RecordStockProductInventoryTransactionService recordStockProductInventoryTransactionService
4953
ProductAvailabilityService productAvailabilityService
5054
ConfigService configService
55+
MessageLocalizer messageLocalizer
5156

5257
def authService
5358
def dataService
@@ -3449,4 +3454,49 @@ class InventoryService implements ApplicationContextAware {
34493454
]
34503455
}
34513456
}
3457+
3458+
PaginatedList<ExpirationHistoryReportRow>getExpirationHistoryReport(ExpirationHistoryReportFilterCommandcommand) {
3459+
List<TransactionEntry> entries=TransactionEntry.createCriteria().list(offset: command.paginationParams.offset,max: command.paginationParams.max) {
3460+
transaction {
3461+
// Expired transaction type is hardcoded with id = "4"
3462+
eq("transactionType",TransactionType.read(Constants.EXPIRATION_TRANSACTION_TYPE_ID))
3463+
eq("inventory",AuthService.currentLocation.inventory)
3464+
between("transactionDate", command.startDate, command.endDate)
3465+
order("transactionDate","desc")
3466+
}
3467+
}
3468+
returnnewPaginatedList<ExpirationHistoryReportRow>(entries.collect {ExpirationHistoryReportRow.fromTransactionEntry(it) }, entries.totalCount)
3469+
}
3470+
3471+
StringgetExpirationHistoryReportCsv(ExpirationHistoryReportFilterCommandcommand) {
3472+
PaginatedList<ExpirationHistoryReportRow> expirationHistoryReport= getExpirationHistoryReport(command)
3473+
StringWriter sw=newStringWriter()
3474+
CSVWriter csv=newCSVWriter(sw, {
3475+
"${messageLocalizer.localize("transaction.transactionNumber.label")}" { it?.transactionNumber }
3476+
"${messageLocalizer.localize("transaction.date.label")}" { it?.transactionDate }
3477+
"${messageLocalizer.localize("product.productCode.label")}" { it?.productCode }
3478+
"${messageLocalizer.localize("import.productName.label" )}" { it?.productName }
3479+
"${messageLocalizer.localize("category.label")}" { it?.category }
3480+
"${messageLocalizer.localize("inventory.lotNumber.label")}" { it?.lotNumber }
3481+
"${messageLocalizer.localize("inventoryItem.expirationDate.label")}" { it?.expirationDate }
3482+
"${messageLocalizer.localize("expirationHistoryReport.quantityLostToExpiry.label")}" { it?.quantityLostToExpiry }
3483+
"${messageLocalizer.localize("product.unitPrice.label")}" { it?.unitPrice }
3484+
"${messageLocalizer.localize("expirationHistoryReport.valueLostToExpiry.label")}" { it?.valueLostToExpiry }
3485+
})
3486+
expirationHistoryReport.list.each {ExpirationHistoryReportRowrow->
3487+
csv<< [
3488+
transactionNumber: row.transactionNumber,
3489+
transactionDate: row.transactionDate,
3490+
productCode: row.productCode,
3491+
productName: row.productName,
3492+
category: row.category?:"",
3493+
lotNumber: row.lotNumber?:"",
3494+
expirationDate: row.expirationDate?:"",
3495+
quantityLostToExpiry: row.quantityLostToExpiry,
3496+
unitPrice: row.unitPrice?:"",
3497+
valueLostToExpiry: row.valueLostToExpiry?:"",
3498+
]
3499+
}
3500+
returnCSVUtils.prependBomToCsvString(csv.writer.toString())
3501+
}
34523502
}

‎src/main/groovy/org/pih/warehouse/core/PaginationParams.groovy‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.pih.warehouse.core
22

33
importgrails.validation.Validateable
44

5-
abstractclassPaginationParamsimplementsValidateable {
5+
classPaginationParamsimplementsValidateable {
66

77
Integer max
88

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
packageorg.pih.warehouse.inventory
2+
3+
importgrails.validation.Validateable
4+
importorg.pih.warehouse.core.Location
5+
importorg.pih.warehouse.core.PaginationParams
6+
7+
classExpirationHistoryReportFilterCommandimplementsValidateable {
8+
// Pagination params have to be preinitialized to be properly bound when sent as query string
9+
PaginationParams paginationParams=newPaginationParams()
10+
Date startDate
11+
Date endDate
12+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
packageorg.pih.warehouse.inventory
2+
3+
importorg.pih.warehouse.product.Category
4+
importorg.pih.warehouse.product.Product
5+
6+
7+
classExpirationHistoryReportRow {
8+
String transactionNumber
9+
Date transactionDate
10+
String productCode
11+
String productName
12+
Category category
13+
String lotNumber
14+
Date expirationDate
15+
Integer quantityLostToExpiry
16+
BigDecimal unitPrice
17+
BigDecimal valueLostToExpiry
18+
19+
staticfromTransactionEntry(TransactionEntrytransactionEntry) {
20+
Product product= transactionEntry.inventoryItem.product
21+
returnnewExpirationHistoryReportRow(
22+
transactionNumber: transactionEntry.transaction.transactionNumber,
23+
transactionDate: transactionEntry.transaction.transactionDate,
24+
productCode: product.productCode,
25+
productName: product.displayNameOrDefaultName,
26+
category: product.category,
27+
lotNumber: transactionEntry.inventoryItem.lotNumber,
28+
expirationDate: transactionEntry.inventoryItem.expirationDate,
29+
quantityLostToExpiry: transactionEntry.quantity,
30+
unitPrice: product.pricePerUnit,
31+
valueLostToExpiry: product.pricePerUnit? product.pricePerUnit* transactionEntry.quantity:null,
32+
)
33+
}
34+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp