public class W_ProductionOrderCreationAndPostingService
{
public W_ProductionOrderCreationAndPostingResponseContract processReport(
W_ProductionOrderCreationAndPostingHeaderRequestContract ProductionBookingContract)
{
W_ProductionOrderCreationAndPostingResponseContract
contract;
W_ProductionOrderCreationAndPostingLinesRequestContract linecontract;
ProdStatusType ProdStatusType;
ProjId existProjid, newProdID;
ProdJournalBOM JournalBOM;
UnitQty UnitQty;
JournalId journalid;
List Pickinglist = ProductionBookingContract.parmProdLines();;
ListEnumerator PickingListEnumerator = Pickinglist.getEnumerator();
ListEnumerator PickingListEnumeratorItems = Pickinglist.getEnumerator();
W_ProductionOrderCreationAndPostingResponseContract response
= new W_ProductionOrderCreationAndPostingResponseContract();
try
{
//ttsbegin;
changecompany(ProductionBookingContract.parmDataAreaId())
{
if(this.checkOnholdQty(ProductionBookingContract.parmLocation(),ProductionBookingContract.parmsite(),ProductionBookingContract.parmItemID(),ProductionBookingContract.parmWarehourse(),ProductionBookingContract.parmStartQty()))
{
throw Error(strFmt("%1 Item not avaliable with quantity
%2",ProductionBookingContract.parmItemID(),ProductionBookingContract.parmStartQty()));
}
ExistProjid = this.existProjid(ProductionBookingContract.parmsite(),ProductionBookingContract.parmItemID(),ProductionBookingContract.parmpool(),ProductionBookingContract.parmStartQty(),ProductionBookingContract.parmWarehourse(),ProductionBookingContract.parmLocation(),ProductionBookingContract.parmDateLoc());
response.parmPONumber(ExistProjid);
if(ExistProjid)
{
//while(PickingListEnumeratorItems.moveNext())
//{
// linecontract = PickingListEnumeratorItems.current();
//
if(this.checkOnholdQty(linecontract.parmLocation(),ProductionBookingContract.parmsite(),linecontract.parmItemID(),linecontract.parmWarehourse(),linecontract.parmQuantity()))
// {
// throw Error(strFmt("%1 Item
not avaliable with quantity %2",linecontract.parmItemID(),linecontract.parmQuantity()));
// }
//}
ProdJournalTable ProdJournalTable;
response.parmPONumber(ExistProjid);
ExistProjid = this.ProdStartUP(ExistProjid,ProductionBookingContract.parmStartQty());
ttsbegin;
select forupdate ProdJournalTable
order by ProdJournalTable.CreatedDateTime desc
where ProdJournalTable.ProdId == ExistProjid
&& ProdJournalTable.JournalType == ProdJournalType::Picklist;
if(ProdJournalTable.RecId)
{
ProdJournalTable.selectForUpdate(true);
ProdJournalTable.
WStartUpQty =ProductionBookingContract.parmStartQty();
ProdJournalTable.update();
}
ttscommit;
if(ProdJournalTable.RecId)
{
while(PickingListEnumerator.moveNext())
{
linecontract = PickingListEnumerator.current();
ttsbegin;
select forupdate JournalBOM where JournalBOM.ItemId ==linecontract.parmItemID()
&& JournalBOM.JournalId == ProdJournalTable.journalid;
if(JournalBOM.RecId)
{
JournalBOM.selectForUpdate(true);
// JournalBOM.InventDimId = this.createInventDim(linecontract.parmLocation(),ProductionBookingContract.parmsite(),linecontract.parmItemID(),linecontract.parmWarehourse());
JournalBOM.
WWeighingQty = linecontract.parmQuantity();
prodJournalBOM::pickingListJournalLineValues(JournalBOM);
JournalBOM.
WFeedMoisture = linecontract.parmFeedMositure();
prodJournalBOM::pickingListJournalLineValues(JournalBOM);
UnitQty =this.prodJournalBOMWriteen(JournalBOM);
if( UnitQty)
{
JournalBOM.
WWeighedAvgFeedMoisture = UnitQty;
}
JournalBOM.InventConsump = linecontract.parmQuantity();
JournalBOM.update();
}
ttscommit;
}
response.parmPlNumberr(ProdJournalTable.JournalId);
this.checkPostProdJournalTablePickingList(ProdJournalTable.JournalId);
if(!ProdTable::find(ExistProjid). WPackingOrder)
{
this.prodReportFinished(ExistProjid);
select JournalId,JournalType from ProdJournalTable
where ProdJournalTable.ProdId == ExistProjid
&& ProdJournalTable.JournalType == ProdJournalType::ReportFinished;
if(ProdJournalTable.JournalType == ProdJournalType::ReportFinished && ProdJournalTable.RecId)
{
response.parmRAFnumber(ProdJournalTable.JournalId);
}
}
}
response.parmErrorMessage('Success');
}
else
{
NewProdID = this.CreateProductionOrder( ProductionBookingContract.parmProdQty(), ProductionBookingContract.parmItemID(), ProductionBookingContract.parmLocation(), ProductionBookingContract.parmsite(),
ProductionBookingContract.parmBOMNumber(), ProductionBookingContract.parmRouteNumber(), ProductionBookingContract.parmpool(), ProductionBookingContract.parmWarehourse(),
ProductionBookingContract.parmCostcenter(), ProductionBookingContract.parmCostCenterGroup(), ProductionBookingContract.parmDepartment(), ProductionBookingContract.parmIspackingOrder(),
ProductionBookingContract.parmDateLoc());
response.parmPONumber(NewProdID);
while(PickingListEnumeratorItems.moveNext())
{
linecontract = PickingListEnumeratorItems.current();
if(this.checkOnholdQty(linecontract.parmLocation(),ProductionBookingContract.parmsite(),linecontract.parmItemID(),linecontract.parmWarehourse(),linecontract.parmQuantity()))
{
throw Error(strFmt("%1 Item not avaliable with quantity
%2",linecontract.parmItemID(),linecontract.parmQuantity()));
}
}
ProdJournalTable ProdJournalTable;
NewProdID = this.ProdStartUP(NewProdID, ProductionBookingContract.parmStartQty());
ttsbegin;
select forupdate ProdJournalTable
order by ProdJournalTable.CreatedDateTime desc
where ProdJournalTable.ProdId == NewProdID
&& ProdJournalTable.JournalType == ProdJournalType::Picklist;
if(ProdJournalTable.RecId)
{
ProdJournalTable.selectForUpdate(true);
ProdJournalTable.
WStartUpQty =ProductionBookingContract.parmStartQty();
ProdJournalTable.update();
}
ttscommit;
if(ProdJournalTable.RecId)
{
while(PickingListEnumerator.moveNext())
{
ttsbegin;
linecontract = PickingListEnumerator.current();
select forupdate JournalBOM where JournalBOM.ItemId ==linecontract.parmItemID()
&& JournalBOM.JournalId == ProdJournalTable.JournalId;
if(JournalBOM.RecId)
{
JournalBOM.selectForUpdate(true);
JournalBOM.InventDimId = this.createInventDim(linecontract.parmLocation(),ProductionBookingContract.parmsite(),linecontract.parmItemID(),linecontract.parmWarehourse());
JournalBOM.
WWeighingQty = linecontract.parmQuantity();
prodJournalBOM::pickingListJournalLineValues(JournalBOM);
JournalBOM.
WFeedMoisture = linecontract.parmFeedMositure();
prodJournalBOM::pickingListJournalLineValues(JournalBOM);
UnitQty =this.prodJournalBOMWriteen(JournalBOM);
if( UnitQty)
{
JournalBOM.
WWeighedAvgFeedMoisture = UnitQty;
}
JournalBOM.update();
}
ttscommit;
}
response.parmPlNumberr(ProdJournalTable.JournalId);
ttsbegin;
this.checkPostProdJournalTablePickingList(ProdJournalTable.JournalId);
ttscommit;
if(!ProdTable::find(newProdID). WPackingOrder)
{
this.prodReportFinished(newProdID);
select JournalId, JournalType from ProdJournalTable
where ProdJournalTable.ProdId == newProdID
&& ProdJournalTable.JournalType == ProdJournalType::ReportFinished;
if(ProdJournalTable.JournalType == ProdJournalType::ReportFinished && ProdJournalTable.RecId)
{
response.parmRAFnumber(ProdJournalTable.JournalId);
}
}
}
response.parmErrorMessage('Success');
}
}
//ttscommit;
}
catch(Exception::Error)
{
response.parmErrorMessage(this.ErrorMsg());
}
catch(Exception::Deadlock)
{
response.parmErrorMessage(this.ErrorMsg());
}
catch(Exception::UpdateConflict)
{
response.parmErrorMessage(this.ErrorMsg());
}
catch(Exception::DuplicateKeyException)
{
response.parmErrorMessage(this.ErrorMsg());
}
catch(Exception::CLRError)
{
System.Exception
ex = CLRInterop::getLastException();
response.parmErrorMessage(ex.Message);
}
catch(Exception::ViewDataSourceValidation)
{
response.parmErrorMessage(this.ErrorMsg());
}
return
response;
}
public boolean checkOnholdQty(str
_LocationId,str _Site,str _Item,str _Warehouse, InventQty _qty)
{
InventDim inventDim;
InventDimParm inventDimParm;
InventOnhand inventOnhand;
InventQty
qty;;
boolean ret;
select firstonly inventDim
where inventDim.InventLocationId == _Warehouse
&& inventDim.InventSiteId ==_Site
&& inventDim.wMSLocationId ==_LocationId;
inventDim = InventDim::findOrCreate(inventDim);
inventDimParm.initFromInventDim(inventDim);
inventOnhand = InventOnhand::newParameters(_Item, inventDim, inventDimParm);
qty
= inventOnhand.availPhysical();
if(qty<_qty)
{
ret =true;
}
return ret;
}
public ProjId existProjid(str
_site,str _itemId,str _PoolId,real _qty,str _Warehouse ,str
_LocationId,Transdate _date)
{
ProdTable prodTable;
InventDim inventDim,inventDimloc;
ProdId ProdId;
InventDimId InventDimId;
int month,year, sysmonth,sysyear;
select firstonly inventDim
where inventDim.InventLocationId == _Warehouse
&& inventDim.InventSiteId ==_Site
&& inventDim.wMSLocationId ==_LocationId;
InventDimId = inventDim.inventDimId;
while
select firstonly prodTable
order
by prodTable.createdDateTime desc,prodTable.ProdId asc
where prodTable.InventDimId == InventDimId
&& prodTable.ItemId ==_itemId
&& prodTable.ProdPoolId == _PoolId
&& (prodTable.ProdStatus ==ProdStatus::Created
|| prodTable.ProdStatus ==ProdStatus::StartedUp)
&& (prodTable.QtySched -prodTable.QtyStUp) > _qty
{
month = DateTimeUtil::month(prodTable.DlvDate);
year =DateTimeUtil::year(prodTable.DlvDate);
sysmonth =DateTimeUtil::month(_date);
sysyear = DateTimeUtil::year(_date);
if(month == sysmonth && year== sysyear)
{
ProdId = prodTable.ProdId;
}
}
return ProdId;
}
public ProdId CreateProductionOrder(real
_ProdQty,ItemId _item,str _locationId,str _site,str _BOM,str _RouteId,str _poolId,str _Warehouse,
str _costCenter, str _CostCenterGroup, str _Department, NoYes _IspackingOrder, transdate _TransDate)
{
ProdId prodId;
ProdTable prodTableLoc;
InventDim inventDim;
ProdQtySched productionQty =_ProdQty;
ItemId productionItem =
_item;
select firstonly inventDim
where inventDim.wMSLocationId == _locationId
&& inventDim.InventSiteId ==_site
&& inventDim.InventLocationId ==_Warehouse;
InventDimParm inventDimParm;
InventTable inventTable;
inventDim.initValue();
inventTable = InventTable::find(productionItem);
//Initialise the base values
ttsbegin;
prodTableLoc.clear();
prodTableLoc.initValue();
prodTableLoc.ItemId = inventTable.ItemId;
prodTableLoc.initFromInventTable(inventTable);
prodTableLoc.DlvDate =DateStartMth(_TransDate);
prodTableLoc.QtySched = productionQty;
prodTableLoc.RemainInventPhysical = prodTableLoc.QtySched;
//Set the
active bom and route
prodTableLoc.BOMId =_BOM
;
prodTableLoc.RouteId =
_RouteId;
prodTableLoc.ProdPoolId =_poolId;
prodTableLoc.
WPackingOrder=_IspackingOrder;
prodTableLoc.DefaultDimension = this.createDefaultDimension(_site,_CostCenterGroup,_costCenter,_Department);
prodTableLoc.initRouteVersion();
prodTableLoc.initBOMVersion();
prodTableLoc.InventDimId = inventDim.inventDimId;
/* prodtable.BOMId = BOMVersion::findActive(prodtable.ItemId,
prodtable.BOMDate,
prodtable.QtySched,
inventDim).BOMId;
prodtable.RouteId = RouteVersion::findActive(prodtable.ItemId,
prodtable.BOMDate,
prodtable.QtySched,
inventDim).RouteId;*/
prodTableLoc.insert();
ttscommit;
ProdId = prodTableLoc.ProdId;
return ProdId;
}
public DimensionDefault createDefaultDimension(str _BusinessUnit, str
_CostCenterGroup, str _costCenter,str _Department)
{
DimensionAttributeValueSetStorage valueSetStorage =
new DimensionAttributeValueSetStorage();
DimensionDefault
result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
container conAttr =
["BusinessUnit", "CostCenterGroup",
"costCenter","Department"];
container conValue =
[_BusinessUnit, _CostCenterGroup, _costCenter,_Department];
str dimValue;
for (i =
1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
dimensionAttributeValue = dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,true);
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result
= valueSetStorage.save();
//It reutrns the value of type DimensionDefault
return
result;
}
public
str ProdStartUP(ProdId _prodId, Qty _qty)
{
ProdParmStartUp ProdParmStartUp;
prodTable prodTable;
str prodId =_prodId ;
ProdMultiStartUp prodMultiStartUp =
new prodMultiStartUp();
ProdStatusType ProdStatusType;
ProdPurch prodPurch = ProdPurch::newProd();
ttsbegin;
prodTable = ProdTable::find(prodId);
prodMultiStartUp =
ProdMultiStartUp::construct(new Args());
RunBaseMultiParm::initParm(prodMultiStartUp);
prodMultiStartUp.insert(prodTable, prodMultiStartUp.defaultParmBuffer());
select forupdate ProdParmStartUp where ProdParmStartUp.ProdId == prodId;
if(ProdParmStartUp.RecId)
{
prodParmStartUp.StartUpQty
= _qty;
prodParmStartUp.PostNowBOM
= NoYes::No;
prodParmStartUp.PostNowRoute
= NoYes::No;
prodParmStartUp.StartUpProduction
= NoYes::Yes;
prodParmStartUp.JournalShowInfo
= NoYes::Yes;
ProdParmStartUp.update();
}
prodTable.status().runStartUp(ProdParmStartUp);
ttscommit;
return prodId;
}
public
void checkPostProdJournalTablePickingList(JournalId _journalID)
{
ProdJournalCheckPost ProdJournalCheckPost;
ProdJournalTable prodJournalTable = ProdJournalTable::find(_journalID,
true);
// Check/Post
journal
ProdJournalCheckPost = ProdJournalCheckPostBOM::newJournalCheckPost(true,
true,
JournalCheckPostType::Post,
prodJournalTable.TableId,
prodJournalTable.JournalId);
ProdJournalCheckPost.run();
}
public
void prodReportFinished(ProjId _proid)
{
ProdJournalTable prodJournalTable;
ProdJournalBOM prodJournalBOM;
BOM bom;
ProdBOM prodBOM;
InventQty totalDryQty;
Args Args;
ProdMultiReportFinished ProdMultiReportFinished;
prodParmreportFinished prodParmreportFinished,prodParmreportFinishedUPD;
Boolean RAF,Ended;
ProdTable ProdTable = ProdTable::find(_proid);
ttsbegin;
Args =
new Args();
Args.parmEnum(0);
Args.record(prodTable);
ProdMultiReportFinished = ProdMultiReportFinished::construct(Args);
RunBaseMultiParm::initParm(ProdMultiReportFinished);
prodParmreportFinished = ProdMultiReportFinished.defaultParmBuffer();
ProdMultiReportFinished.insert(prodTable,prodParmreportFinished);
prodParmreportFinishedUPD = prodParmreportFinished::find(prodParmreportFinished.ParmId,prodParmreportFinished.ProdId,True);
if(prodParmreportFinishedUPD)
{
prodParmreportFinishedUPD.selectForUpdate(true);
while select prodJournalBOM
join prodJournalTable
join prodBOM
join bom
where prodJournalBOM.JournalId == prodJournalTable.JournalId &&
prodJournalTable.JournalType == ProdJournalType::Picklist
&&
prodJournalTable.Posted == NoYes::Yes
&&
prodJournalBOM.
WRAFStatus == NoYes::No &&
prodJournalBOM.ProdId == ProdTable.ProdId &&
prodJournalBOM.InventTransId == prodBOM.InventTransId &&
prodbom.BOMRefRecId == bom.RecId
{
if (bom. WNotInclude == NoYes::No)
{
if (bom. WInFactor)
{
totalDryQty += prodJournalBOM.
WWeighingQty/bom. WInFactor;
}
else
{
totalDryQty += prodJournalBOM.
WDryQty;
}
}
}
prodParmreportFinishedUPD.QtyGood
= totalDryQty;
prodParmreportFinishedUPD.RouteAutoConsump = RouteAutoConsump::Never;
prodParmreportFinishedUPD.BOMAutoConsump
= BomAutoConsump::Never;
prodParmreportFinishedUPD.AcceptError =
Noyes::Yes;
prodParmreportFinishedUPD.ReportFinishProd = NoYes::Yes;
prodParmreportFinishedUPD.JournalShowInfo
= NoYes::Yes;
prodParmreportFinishedUPD.update();
}
ttscommit;
ProdMultiReportFinished.run();
//ProdTable prodTable;
//ProdMultiReportFinished prodMultiReportFinished;
//prodTable = ProdTable::find(_proid);
//prodMultiReportFinished = ProdMultiReportFinished::construct(new Args());
//RunBaseMultiParm::initParm(prodMultiReportFinished);
//prodMultiReportFinished.insert(prodTable, prodMultiReportFinished.defaultParmBuffer());
//prodMultiReportFinished.run();
}
public Log ErrorMsg()
{
Log errorMessage;
SysInfologEnumerator sysInfologEnumerator;
sysInfologEnumerator = SysInfologEnumerator::newData(infolog.infologData());
errorMessage ="";
While(sysInfologEnumerator.moveNext())
{
errorMessage += sysInfologEnumerator.currentMessage();
}
return errorMessage;
}
public UnitQty prodJournalBOMWriteen(ProdJournalBOM
_ProdJournalBOMtable)
{
InventQualityOrderTable inventQualityOrderTable;
InventQualityOrderLine inventQualityOrderLine;
InventDim inventDimQO, inventDimBOM;
boolean isPassQOAvailable;
real WTFMPercentage;
prodJournalBOM prodJournalBOM,prodJournalBOMUpd;
prodJournalBOM =
_ProdJournalBOMtable;
if(prodJournalBOM.InventTransChildType == InventTransChildType::ProdJournalBOM)
{
while
select ItemId,OrderStatus,OrderStatus,QualityOrderId,InventDimId from inventQualityOrderTable
order by VALIDATEDDATETIME desc
where inventQualityOrderTable.ItemId
== prodJournalBOM.ItemId
&& inventQualityOrderTable.OrderStatus
== InventTestOrderStatus::Pass
&&
(inventQualityOrderTable.ReferenceType == InventTestReferenceType::Purch
|| inventQualityOrderTable.ReferenceType == InventTestReferenceType::Inventory)
{
inventDimQO
= InventDim::find(inventQualityOrderTable.InventDimId);
inventDimBOM
= InventDim::find(prodJournalBOM.InventDimId);
if( inventDimQO.InventSiteId
== inventDimBOM.InventSiteId
&& inventDimQO.InventLocationId
== inventDimBOM.InventLocationId
&& inventDimQO.wMSLocationId
== inventDimBOM.wMSLocationId)
{
isPassQOAvailable
= true;
break;
}
else
{
continue;
}
}
if(isPassQOAvailable)
{
select QualityOrderId,TestId, WWeightedAvgFeedMoisture from inventQualityOrderLine
where inventQualityOrderLine.QualityOrderId == inventQualityOrderTable.QualityOrderId
&&
(inventQualityOrderLine.TestId ==
"Moisture"
|| inventQualityOrderLine.TestId
== "PFM");
if(inventQualityOrderLine)
{
if(inventQualityOrderLine. WWeightedAvgFeedMoisture != prodJournalBOM.
WWeighedAvgFeedMoisture)
{
return inventQualityOrderLine. WWeightedAvgFeedMoisture;
}
}
}
}
Return inventQualityOrderLine. WWeightedAvgFeedMoisture;
}
public JournalId createPickListJournal(ProjId _projid,
real _qty, transdate _dlvDate)
{
ProdJournalCreateBOM prodJournalCreateBOM;
ProdJournalTable ProdJournalTable;
ProdJournalBOM ProdJournalBOM;
prodJournalCreateBOM = ProdJournalCreateBOM::construct();
prodJournalCreateBOM.parmProdId(_projid);
prodJournalCreateBOM.parmJournalNameId(ProdJournalName::standardJournalName(ProdJournalType::Picklist, prodJournalCreateBOM.parmProdId()));
prodJournalCreateBOM.parmTransDate(_dlvDate);
prodJournalCreateBOM.parmBOMAutoConsump(BOMAutoConsump::Never);
prodJournalCreateBOM.parmProposalAsConsump(NoYes::No);
prodJournalCreateBOM.parmQtyCalc(_qty);
prodJournalCreateBOM.parmConsumpProposal(ProdBOMConsumpProposal::Qty);
prodJournalCreateBOM.run();
ttsbegin;
select forupdate ProdJournalTable
order by JournalId desc
where ProdJournalTable.ProdId == _projid;
if(ProdJournalTable.RecId)
{ ProdJournalTable.selectForUpdate(true);
ProdJournalTable.
WStartUpQty = _qty;
ProdJournalTable.write();
}
ttscommit;
return ProdJournalTable.JournalId;
}
/// <summary>
///
/// </summary>
public InventDimId createInventDim(str
_LocationId,str _Site,str _Item,str _Warehouse)
{
InventDim inventDim;
select firstonly inventDim
where inventDim.InventLocationId == _Warehouse
&& inventDim.InventSiteId ==_Site
&& inventDim.wMSLocationId ==_LocationId;
inventDim = InventDim::findOrCreate(inventDim);
return inventDim.inventDimId;
}
}
No comments:
Post a Comment