21.11.2008, 16:34 | #1 |
Участник
|
InventTransIdReturn и Закрытие склада
Доброго времени суток!
Axapta 3.0 sp 5 Наткнулся на баг в закрытии склада в случае заполнения номера возвращенного лота (InventTransIdReturn) в приходной проводке НЕ по заказу. В этом случае себестоимость приходной проводки не корректируется. В классе InventCostItemDim есть 2 основных метода, которые отвечают за коррекцию приходной возвратной проводки: Этот метод корректируе все приходные проводки по заказам с заполненным лотом возврата перед выполнением закрытия по номенклатуре X++: void updateItemReturnAdjustments(ItemId _itemId = inventCostList.ItemId) { InventTrans inventTrans; InventTrans issue; Price costPrice; CostAmount adjustment; ; while select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from inventTrans index hint StatusItemIdx group by inventTransId, inventTransIdReturn where inventTrans.ItemId == _itemId && inventTrans.ValueOpen == inventTransOpen::Yes && inventTrans.StatusReceipt == StatusReceipt::Purchased && inventTrans.StatusIssue == StatusIssue::None && inventTrans.TransType == InventTransType::Sales && inventTrans.DateStatus <= inventClosing.TransDate && inventTrans.PackingSlipReturned == 0 && inventTrans.InventTransIdReturn != '' { select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from issue index hint TransIdIdx where issue.InventTransId == inventTrans.inventTransIdReturn && issue.StatusReceipt == StatusReceipt::None && issue.StatusIssue == StatusIssue::Sold && issue.PackingSlipReturned == 0 && issue.InventTransIdReturn == inventTrans.inventTransId; if (issue.Qty) { costPrice = (issue.costAmountPosted + issue.costAmountAdjustment) / issue.Qty; adjustment = Currency::amount(inventTrans.Qty * costPrice - inventTrans.costAmountPosted - inventTrans.costAmountAdjustment); if (abs(adjustment) >= inventClosing.minTransferValue && !InventAdj::isOnhandAdjusted(inventTrans.InventTransId, inventTrans.InventTransIdReturn, '')) this.updateTransIdReturnReceipt(inventTrans.InventTransId, inventTrans.InventTransIdReturn, costPrice); } } } Второй метод "протаскивает" возвратную проводку на следующий уровень расчета, но опять-таки только проводку по заказу: X++: protected void updateTrans( InventTrans inventTrans, CostAmount adjustment ) { if (adjustment) { switch (inventTrans.transType) { case InventTransType::QuarantineOrder: this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'',inventTrans.voucher); break; case InventTransType::InventTransfer: case InventTransType::WMSTransport: this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'',''); break; case InventTransType::ProdLine : this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'',''); break; case InventTransType::BOMLine : this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'',''); break; default: if (inventTrans.inventTransIdReturn && inventTrans.qty < 0 && inventTrans.transType == InventTransType::Sales) this.addkeyAdjustment(true,inventTrans.inventTransIdReturn,adjustment,inventTrans.inventTransId,''); } inventAdj::updateModule(inventTrans,adjustment,inventClosing); } } Если из методов убрать условие inventTrans.transType == InventTransType::Sales то закрытие корректирует себестоимость возврата как мне и нужно. У кого есть опыт подобной модификации, просьба откликнуться... |
|
Теги |
закрытие склада, коррекция себестоимости, себестоимость, склад |
|
|