|
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.
|