Skip to content

Commit

Permalink
Merge pull request #295 from micromata/Release-8.1-SNAPSHOT
Browse files Browse the repository at this point in the history
ForecastExport: bugfix for planning dates.
OrderbookSnapshotSanityCheck: bugfix on empty db snapshots.
  • Loading branch information
kreinhard authored Feb 12, 2025
2 parents d7b8097 + 8645b0a commit 40d52fe
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,10 @@ open class ForecastExport { // open needed by Wicket.
val closestSnapshotDate = getClosestSnapshotDate(snapshotDate, scriptLogger, "snapshot")
val msgSB = StringBuilder("Exporting forecast script with start date ${startDate.isoString}")
if (closestPlanningDate != null) {
msgSB.append(" with planningDate ${closestPlanningDate}")
msgSB.append(" with planningDate $closestPlanningDate")
}
if (closestSnapshotDate != null) {
msgSB.append(" with snapshotDate ${closestSnapshotDate}")
msgSB.append(" with snapshotDate $closestSnapshotDate")
}
if (!filter.searchString.isNullOrBlank()) {
msgSB.append(" with filter: str='${filter.searchString}'")
Expand All @@ -140,7 +140,7 @@ open class ForecastExport { // open needed by Wicket.
if (!filter.projectList.isNullOrEmpty()) {
log.info {
"$msgSB, projects=${
filter.projectList?.sortedBy { it.name }?.joinToString() { it.name ?: "???" }
filter.projectList?.sortedBy { it.name }?.joinToString { it.name ?: "???" }
}"
}
}
Expand Down Expand Up @@ -305,7 +305,7 @@ open class ForecastExport { // open needed by Wicket.
snapshotDate?.let { infoSheet.setDateValue(2, 1, it, ctx.excelDateFormat) }
log.debug { "info sheet: $infoSheet" }

analyzeOrderPositions(orderList, ctx, useAuftragsCache)
analyzeOrderPositions(orderList, ctx, planningData = false)
analyzePlanningForecast(planningDate, auftragFilter, ctx)
forecastExportInvoices.fillInvoices(ctx)
val orderPositionsFound =
Expand Down Expand Up @@ -337,7 +337,7 @@ open class ForecastExport { // open needed by Wicket.
ExcelUtils.setAutoFilter(planningSheet, FORECAST_HEAD_ROW, 0, FORECAST_NUMBER_OF_COLS_AUTOFILTER)
planningInvoicesSheet.setAutoFilter()

fillPlanningForecast(planningDate, auftragFilter, ctx)
fillPlanningForecast(planningDate, ctx)
workbook.pOIWorkbook.creationHelper.createFormulaEvaluator().evaluateAll()
return workbook.asByteArrayOutputStream.toByteArray()
}
Expand All @@ -346,14 +346,24 @@ open class ForecastExport { // open needed by Wicket.
private fun analyzeOrderPositions(
orderList: Collection<AuftragDO>,
ctx: Context,
useAuftragsCache: Boolean,
planningData: Boolean,
) {
for (auftragDO in orderList) {
auftragDO.projekt?.id?.let { projektId ->
ctx.projectIds.add(projektId)
}
val orderInfo = if (useAuftragsCache) ordersCache.getOrderInfo(auftragDO) else auftragDO.info
auftragDO.id?.let { ctx.orderMap[it] = orderInfo }
val orderInfo = if (planningData) {
auftragDO.info // Can't load planning data from cache (it's read from snapshots).
} else {
ordersCache.getOrderInfo(auftragDO)
}
auftragDO.id?.let { id ->
if (planningData) {
ctx.planningOrderMap[id] = orderInfo
} else {
ctx.orderMap[id] = orderInfo
}
}
orderInfo.infoPositions?.forEach { pos ->
pos.id?.let {
ctx.orderPositionMap[it] = pos // Register all order positions for invoice handling.
Expand All @@ -366,7 +376,7 @@ open class ForecastExport { // open needed by Wicket.
private fun analyzePlanningForecast(planningDate: LocalDate?, auftragFilter: AuftragFilter, ctx: Context) {
planningDate ?: return
val orderList = readSnapshot(planningDate, auftragFilter)
analyzeOrderPositions(orderList, ctx, useAuftragsCache = false)
analyzeOrderPositions(orderList, ctx, planningData = true)
ctx.planningOrderList = orderList
}

Expand All @@ -386,13 +396,18 @@ open class ForecastExport { // open needed by Wicket.
baseDate: LocalDate?,
useAuftragsCache: Boolean,
): Boolean {
val planning = (sheet == ctx.planningSheet)
// Set the date in the upper left corner (red and bold) for showing date of snapshot/orderbook.
sheet.getCell(1, 0)?.setCellValue(baseDate ?: ctx.baseDate.localDate)
sheet.getRow(FORECAST_HEAD_ROW)
var currentRow = FORECAST_FISRT_ORDER_ROW
var orderPositionFound = false
for (auftragDO in orderList) {
val orderInfo = ctx.orderMap[auftragDO.id] // Must be set by analyzeOrderPositions.
val orderInfo = if (planning) {
ctx.planningOrderMap[auftragDO.id] // Must be set by analyzeOrderPositions.
} else {
ctx.orderMap[auftragDO.id] // Must be set by analyzeOrderPositions.
}
if (orderInfo == null) {
log.error { "Shouldn't occur: orderInfo not found for order: $auftragDO" }
continue
Expand Down Expand Up @@ -448,7 +463,7 @@ open class ForecastExport { // open needed by Wicket.
return orderPositionFound
}

private fun fillPlanningForecast(planningDate: LocalDate?, auftragFilter: AuftragFilter, ctx: Context) {
private fun fillPlanningForecast(planningDate: LocalDate?, ctx: Context) {
planningDate ?: return
val orderList = ctx.planningOrderList ?: return
fillOrderPositions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ internal class ForecastExportContext(

val orderMap = mutableMapOf<Long, OrderInfo>()

val planningOrderMap = mutableMapOf<Long, OrderInfo>()

// All projects of the user used in the orders to show also invoices without order, but with assigned project:
val projectIds = mutableSetOf<Long>()
// All projects for which invoices have been issued.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,13 @@ class OrderbookSnapshotsSanityCheck(val orderbookSnapshotsService: OrderbookSnap
}
try {
val orders = orderbookSnapshotsService.readSnapshot(date)
val lastUpdate = orders?.maxOf { it.lastUpdate ?: Date(0L) }
val highestOrderNumber = orders?.maxOf { it.nummer ?: -1 }
jobExecutionContext.addMessage("Snapshot for date $date (${it.size.formatBytes()}) is readable: ${orders?.size?.format()} orders, highest order number=${highestOrderNumber.format()}, last update of any order=${lastUpdate.isoString()}.")
if (orders.isNullOrEmpty()) {
jobExecutionContext.addMessage("Snapshot for date $date (${it.size.formatBytes()}) has no entries (orders).")
} else {
val lastUpdate = orders?.maxOf { it.lastUpdate ?: Date(0L) }
val highestOrderNumber = orders?.maxOf { it.nummer ?: -1 }
jobExecutionContext.addMessage("Snapshot for date $date (${it.size.formatBytes()}) is readable: ${orders?.size?.format()} orders, highest order number=${highestOrderNumber.format()}, last update of any order=${lastUpdate.isoString()}.")
}
} catch (e: Exception) {
jobExecutionContext.addError("Error reading snapshot for date $date: $e")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import { connect } from 'react-redux';
import { Col, Collapse, Container, Row, UncontrolledTooltip } from '../../../../components/design';
import DiffText from '../../../../components/design/DiffText';
import { getTranslation } from '../../../../utilities/layout';
import style from './History.module.scss';
// import { DynamicLayoutContext } from '../../../../components/base/dynamicLayout/context';
// import { evalServiceURL } from '../../../../utilities/rest';

function getTypeSymbol(type) {
switch (type) {
Expand Down Expand Up @@ -40,26 +37,6 @@ function HistoryEntry(
const [active, setActive] = React.useState(false);
const diffSummary = {};

/*
const { callAction } = React.useContext(DynamicLayoutContext);
const editComment = () => callAction({
responseAction: {
targetType: 'TARGET',
url: evalServiceURL(`/react/historyEntries/edit/${masterId}`),
},
});
<Button
type="button"
className={style.editComment}
onClick={() => editComment()}
>
{getTranslation('history.userComment.edit', translations)}
</Button>
*/

attributes.forEach(({ operation, operationType }) => {
let diff = diffSummary[operationType];

Expand Down Expand Up @@ -219,4 +196,4 @@ HistoryEntry.defaultProps = {
translations: undefined,
};

export default connect()(HistoryEntry);
export default HistoryEntry;

0 comments on commit 40d52fe

Please sign in to comment.