From: <dai...@us...> - 2011-06-27 10:30:26
|
Revision: 4608 http://web-erp.svn.sourceforge.net/web-erp/?rev=4608&view=rev Author: daintree Date: 2011-06-27 10:30:19 +0000 (Mon, 27 Jun 2011) Log Message: ----------- MRP fix per Exson Modified Paths: -------------- trunk/MRP.php trunk/doc/Change.log Modified: trunk/MRP.php =================================================================== --- trunk/MRP.php 2011-06-26 01:21:26 UTC (rev 4607) +++ trunk/MRP.php 2011-06-27 10:30:19 UTC (rev 4608) @@ -588,7 +588,7 @@ -function LevelNetting(&$db,$part,$eoq,$pansize,$shrinkfactor) { +function LevelNetting(&$db,$part,$eoq,$PanSize,$ShrinkFactor) { // Create an array of mrprequirements and an array of mrpsupplies, then read through // them seeing if all requirements are covered by supplies. Create a planned order // for any unmet requirements. Change dates if necessary for the supplies. @@ -600,13 +600,13 @@ $myrow=DB_fetch_row($result); $DecimalPlaces = $myrow[0]; - // Load mrprequirements into $requirements array + // Load mrprequirements into $Requirements array $sql = "SELECT * FROM mrprequirements WHERE part = '" .$part. "' ORDER BY daterequired"; $result = DB_query($sql,$db); - $requirements = array(); + $Requirements = array(); $i = 0; while ($myrow=DB_fetch_array($result)) { - array_push($requirements,$myrow); + array_push($Requirements,$myrow); $i++; } //end of while loop @@ -621,32 +621,32 @@ } //end of while loop // Go through all requirements and check if have supplies to cover them - $requirementcount = count($requirements); + $Requirementcount = count($Requirements); $supplycount = count($supplies); $reqi = 0; //Index for requirements $supi = 0; // index for supplies $totalrequirement = 0; $totalsupply = 0; - if ($requirementcount > 0 && $supplycount > 0) { - $totalrequirement += $requirements[$reqi]['quantity']; + if ($Requirementcount > 0 && $supplycount > 0) { + $totalrequirement += $Requirements[$reqi]['quantity']; $totalsupply += $supplies[$supi]['supplyquantity']; while ($totalrequirement > 0 && $totalsupply > 0) { $supplies[$supi]['updateflag'] = 1; // ******** Put leeway calculation in here ******** $duedate = ConvertSQLDate($supplies[$supi]['duedate']); - $reqdate = ConvertSQLDate($requirements[$reqi]['daterequired']); + $reqdate = ConvertSQLDate($Requirements[$reqi]['daterequired']); $datediff = DateDiff($duedate,$reqdate,'d'); - //if ($supplies[$supi]['duedate'] > $requirements[$reqi]['daterequired']) { + //if ($supplies[$supi]['duedate'] > $Requirements[$reqi]['daterequired']) { if ($datediff > abs($_POST['Leeway'])) { - $sql = "UPDATE mrpsupplies SET mrpdate = '" . $requirements[$reqi]['daterequired'] . + $sql = "UPDATE mrpsupplies SET mrpdate = '" . $Requirements[$reqi]['daterequired'] . "' WHERE id = '" . $supplies[$supi]['id'] . "' AND duedate = mrpdate"; $result = DB_query($sql,$db); } if ($totalrequirement > $totalsupply) { $totalrequirement -= $totalsupply; - $requirements[$reqi]['quantity'] -= $totalsupply; + $Requirements[$reqi]['quantity'] -= $totalsupply; $totalsupply = 0; $supplies[$supi]['supplyquantity'] = 0; $supi++; @@ -657,10 +657,10 @@ $totalsupply -= $totalrequirement; $supplies[$supi]['supplyquantity'] -= $totalrequirement; $totalrequirement = 0; - $requirements[$reqi]['quantity'] = 0; + $Requirements[$reqi]['quantity'] = 0; $reqi++; - if ($requirementcount > $reqi) { - $totalrequirement += $requirements[$reqi]['quantity']; + if ($Requirementcount > $reqi) { + $totalrequirement += $Requirements[$reqi]['quantity']; } } // End of if $totalrequirement > $totalsupply } // End of while @@ -676,39 +676,39 @@ // would be an excess of 3; if there was another requirement for 3 or less, the excess // would cover it, so no planned order would have to be created for the second requirement. $excessqty = 0; - foreach ($requirements as $key => $row) { - $daterequired[$key] = $row['daterequired']; + foreach ($Requirements as $key => $row) { + $DateRequired[$key] = $row['daterequired']; } - if (count($requirements)) { - array_multisort($daterequired, SORT_ASC, $requirements); + if (count($Requirements)) { + array_multisort($DateRequired, SORT_ASC, $Requirements); } - foreach($requirements as $requirement) { + foreach($Requirements as $Requirement) { // First, inflate requirement if there is a shrinkage factor // Should the quantity be rounded? - if ($_POST['shrinkageflag'] == 'y' and $shrinkfactor > 0) { - $requirement['quantity'] = ($requirement['quantity'] * 100) / (100 - $shrinkfactor); - $requirement['quantity'] = round($requirement['quantity'],$DecimalPlaces); + if ($_POST['shrinkageflag'] == 'y' AND $ShrinkFactor > 0) { + $Requirement['quantity'] = ($Requirement['quantity'] * 100) / (100 - $ShrinkFactor); + $Requirement['quantity'] = round($Requirement['quantity'],$DecimalPlaces); } - if ($excessqty >= $requirement['quantity']) { - $plannedqty = 0; - $excessqty -= $requirement['quantity']; + if ($excessqty >= $Requirement['quantity']) { + $PlannedQty = 0; + $excessqty -= $Requirement['quantity']; } else { - $plannedqty = $requirement['quantity'] - $excessqty; + $PlannedQty = $Requirement['quantity'] - $excessqty; $excessqty = 0; } - if ($plannedqty > 0) { - if ($_POST['eoqflag'] == 'y' and $eoq > $plannedqty) { - $excessqty = $eoq - $plannedqty; - $plannedqty = $eoq; + if ($PlannedQty > 0) { + if ($_POST['eoqflag'] == 'y' AND $eoq > $PlannedQty) { + $excessqty = $eoq - $PlannedQty; + $PlannedQty = $eoq; } // Pansize calculation here - // if $plannedqty not evenly divisible by $pansize, calculate as $plannedqty - // divided by $pansize and rounded up to the next highest integer and then + // if $PlannedQty not evenly divisible by $PanSize, calculate as $PlannedQty + // divided by $PanSize and rounded up to the next highest integer and then // multiplied by the pansize. For instance, with a planned qty of 17 with a pansize // of 5, divide 17 by 5 to get 3 with a remainder of 2, which is rounded up to 4 // and then multiplied by 5 - the pansize - to get 20 - if ($_POST['pansizeflag'] == 'y' and $pansize != 0 and $plannedqty % $pansize != 0) { - $plannedqty = ceil($plannedqty / $pansize) * $pansize; + if ($_POST['pansizeflag'] == 'y' AND $PanSize != 0 AND $PlannedQty != 0) { + $PlannedQty = ceil($PlannedQty / $PanSize) * $PanSize; } $sql = "INSERT INTO mrpplannedorders (id, part, @@ -719,27 +719,27 @@ mrpdate, updateflag) VALUES (NULL, - '" . $requirement['part'] . "', - '" . $requirement['daterequired'] . "', - '" . $plannedqty . "', - '" . $requirement['mrpdemandtype'] . "', - '" . $requirement['orderno'] . "', - '" . $requirement['daterequired'] . "', + '" . $Requirement['part'] . "', + '" . $Requirement['daterequired'] . "', + '" . $PlannedQty . "', + '" . $Requirement['mrpdemandtype'] . "', + '" . $Requirement['orderno'] . "', + '" . $Requirement['daterequired'] . "', '0')"; $result = DB_query($sql,$db); // If part has lower level components, create requirements for them $sql = "SELECT COUNT(*) FROM bom - WHERE parent ='" . $requirement['part'] . "' + WHERE parent ='" . $Requirement['part'] . "' GROUP BY parent"; $result = DB_query($sql,$db); $myrow = DB_fetch_row($result); if ($myrow[0] > 0) { - CreateLowerLevelRequirement($db,$requirement['part'],$requirement['daterequired'], - $plannedqty,$requirement['mrpdemandtype'],$requirement['orderno'], - $requirement['whererequired']); + CreateLowerLevelRequirement($db,$Requirement['part'],$Requirement['daterequired'], + $PlannedQty,$Requirement['mrpdemandtype'],$Requirement['orderno'], + $Requirement['whererequired']); } - } // End of if $plannedqty > 0 - } // End of foreach $requirements + } // End of if $PlannedQty > 0 + } // End of foreach $Requirements // If there are any supplies not used and updateflag is zero, those supplies are not // necessary, so change date @@ -756,12 +756,12 @@ } // End of LevelNetting ------------------------------------------------------- function CreateLowerLevelRequirement(&$db, - $toppart, - $topdate, + $TopPart, + $TopDate, $topquantity, - $topmrpdemandtype, - $toporderno, - $whererequired) { + $TopMRPDemandType, + $TopOrderNo, + $WhereRequired) { // Creates an mrprequirement based on the net requirement from the part above it in the bom $sql = "SELECT bom.component, bom.quantity, @@ -770,43 +770,43 @@ FROM bom LEFT JOIN levels ON bom.component = levels.part - WHERE bom.parent = '".$toppart."' + WHERE bom.parent = '".$TopPart."' AND effectiveafter <= now() AND effectiveto >= now()"; - $resultbom = DB_query($sql,$db); - while ($myrow=DB_fetch_array($resultbom)) { + $ResultBOM = DB_query($sql,$db); + while ($myrow=DB_fetch_array($ResultBOM)) { // Calculate required date by subtracting leadtime from top part's required date - $leadtime = $myrow['leadtime']; + $LeadTime = $myrow['leadtime']; // Following sql finds daynumber for the top part's required date, subtracts leadtime, and finds // a valid manufacturing date for the daynumber. There is only one valid manufacturing date // for each daynumber, but there could be several non-manufacturing dates for the // same daynumber. MRPCalendar.php maintains the manufacturing calendar. - $calendarsql = "SELECT COUNT(*),cal2.calendardate + $CalendarSQL = "SELECT COUNT(*),cal2.calendardate FROM mrpcalendar LEFT JOIN mrpcalendar as cal2 - ON (mrpcalendar.daynumber - '".$leadtime."') = cal2.daynumber - WHERE mrpcalendar.calendardate = '".$topdate."' + ON (mrpcalendar.daynumber - '".$LeadTime."') = cal2.daynumber + WHERE mrpcalendar.calendardate = '".$TopDate."' AND cal2.manufacturingflag='1' GROUP BY cal2.calendardate"; - $resultdate = DB_query($calendarsql,$db); - $myrowdate=DB_fetch_array($resultdate); - $newdate = $myrowdate[1]; - // If can't find date based on manufacturing calendar, use $topdate + $ResultDate = DB_query($CalendarSQL,$db); + $myrowdate=DB_fetch_array($ResultDate); + $NewDate = $myrowdate[1]; + // If can't find date based on manufacturing calendar, use $TopDate if ($myrowdate[0] == 0){ - // Convert $topdate from mysql format to system date format, use that to subtract leadtime + // Convert $TopDate from mysql format to system date format, use that to subtract leadtime // from it using DateAdd, convert that date back to mysql format - $convertdate = ConvertSQLDate($topdate); - $dateadd = DateAdd($convertdate,"d",($leadtime * -1)); - $newdate = FormatDateForSQL($dateadd); + $ConvertDate = ConvertSQLDate($TopDate); + $DateAdd = DateAdd($ConvertDate,'d',($LeadTime * -1)); + $NewDate = FormatDateForSQL($DateAdd); } - $component = $myrow['component']; - $extendedquantity = $myrow['quantity'] * $topquantity; + $Component = $myrow['component']; + $ExtendedQuantity = $myrow['quantity'] * $topquantity; // Commented out the following lines 8/15/09 because the eoq should be considered in the // LevelNetting() function where $excessqty is calculated -// if ($myrow['eoq'] > $extendedquantity) { -// $extendedquantity = $myrow['eoq']; +// if ($myrow['eoq'] > $ExtendedQuantity) { +// $ExtendedQuantity = $myrow['eoq']; // } $sql = "INSERT INTO mrprequirements (part, @@ -816,13 +816,13 @@ orderno, directdemand, whererequired) - VALUES ('".$component."', - '".$newdate."', - '".$extendedquantity."', - '".$topmrpdemandtype."', - '".$toporderno."', + VALUES ('".$Component."', + '".$NewDate."', + '".$ExtendedQuantity."', + '".$TopMRPDemandType."', + '".$TopOrderNo."', '0', - '".$whererequired."')"; + '".$WhereRequired."')"; $result = DB_query($sql,$db); } //end of while loop Modified: trunk/doc/Change.log =================================================================== --- trunk/doc/Change.log 2011-06-26 01:21:26 UTC (rev 4607) +++ trunk/doc/Change.log 2011-06-27 10:30:19 UTC (rev 4608) @@ -1,5 +1,6 @@ webERP Change Log +27/6/11 Exson: MRP>php fixed modulus arithmetic that prevented suggesting production quantities where the quantity was less than 1 - the calculation using PanSize should round up to the nearest whole unit to manufacture 26/6/11 Phil: Fixed reference to $_POST['StockID'] in WorkOrderCosting.php when updating the new weighted average cost 26/6/11 Phil: Went back to no number_formatting on PurchData.php 26/6/11 Phil: Went back to no number_formatting on PO_Items.php price and quantity - Brian May still reporting issues This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |