From: <dai...@us...> - 2012-04-29 03:46:05
|
Revision: 5294 http://web-erp.svn.sourceforge.net/web-erp/?rev=5294&view=rev Author: daintree Date: 2012-04-29 03:45:59 +0000 (Sun, 29 Apr 2012) Log Message: ----------- David Shorts EDI work Modified Paths: -------------- trunk/Labels.php trunk/PDFPrintLabel.php trunk/doc/Change.log trunk/includes/PDFStarter.php Added Paths: ----------- trunk/EDISendInvoices_Reece.php Added: trunk/EDISendInvoices_Reece.php =================================================================== --- trunk/EDISendInvoices_Reece.php (rev 0) +++ trunk/EDISendInvoices_Reece.php 2012-04-29 03:45:59 UTC (rev 5294) @@ -0,0 +1,359 @@ +<?php + +/* $Revision: 1.9 $ */ + +$PageSecurity =15; + +include ('includes/session.inc'); +include ('includes/header.inc'); +include('includes/SQL_CommonFunctions.inc'); //need for EDITransNo +include('includes/htmlMimeMail.php'); // need for sending email attachments + +//Important: Default value for EDIsent in debtortrans should probably be 1 for non EDI customers +//updated to 0 only for EDI enabled customers. As it stands run some sql to update all existing +//transactions to EDISent = 1 for newly enabled EDI customers. If you don't do this and try to run +//this code you will create a very large number of EDI invoices. + +/*Get the Customers who are enabled for EDI invoicing */ +$sql = 'SELECT debtorno, + edireference, + editransport, + ediaddress, + ediserveruser, + ediserverpwd, + daysbeforedue, + dayinfollowingmonth + FROM debtorsmaster INNER JOIN paymentterms ON debtorsmaster.paymentterms=paymentterms.termsindicator + WHERE ediinvoices=1'; + +$EDIInvCusts = DB_query($sql,$db); + +if (DB_num_rows($EDIInvCusts)==0){ + exit; +} + +while ($CustDetails = DB_fetch_array($EDIInvCusts)){ + + /*Figure out if there are any unset invoices or credits for the customer */ + + $sql = "SELECT debtortrans.id, + transno, + type, + order_, + trandate, + ovgst, + ovamount, + ovfreight, + ovdiscount, + debtortrans.branchcode, + custbranchcode, + invtext, + shipvia, + rate, + brname, + braddress1, + braddress2, + braddress3, + braddress4, + braddress5 + FROM debtortrans INNER JOIN custbranch ON custbranch.debtorno = debtortrans.debtorno + AND custbranch.branchcode = debtortrans.branchcode + WHERE (type=10 or type=11) + AND edisent=0 + AND debtortrans.debtorno='" . $CustDetails['debtorno'] . "'"; + + $ErrMsg = _('There was a problem retrieving the customer transactions because'); + $TransHeaders = DB_query($sql,$db,$ErrMsg); + + + if (DB_num_rows($TransHeaders)==0){ + break; /*move on to the next EDI customer */ + } + + /*Setup the variable from the DebtorsMaster required for the message */ + $CompanyEDIReference = '0' . strval($_SESSION['EDIReference']); //very annoying, but had to add leading 0 + //because our GLN had leading 0 and GetConfig.php looks for numbers and text fields, saw GLN as number and skipped 0 + $CustEDIReference = $CustDetails['edireference']; + $TaxAuthorityRef = $_SESSION['CompanyRecord']['gstno']; + + while ($TransDetails = DB_fetch_array($TransHeaders)){ + +/*Set up the variables that will be needed in construction of the EDI message */ + if ($TransDetails['type']==10){ /* its an invoice */ + $InvOrCrd = 388; + } else { /* its a credit note */ + $InvOrCrd = 381; + } + $TransNo = $TransDetails['transno']; + /*Always an original in this script since only non-sent transactions being processed */ + $OrigOrDup = 9; + //$TranDate = SQLDateToEDI($TransDetails['trandate']); + $TranDate = date('Ymd'); //probably should use the date edi was created not the date filed in our system + $TranDateTime = date('Ymd:hi'); + $OrderNo = $TransDetails['order_']; + $CustBranchCode = $TransDetails['branchcode']; + $BranchName = $TransDetails['brname']; + $BranchStreet =$TransDetails['braddress1']; + $BranchSuburb = $TransDetails['braddress2']; + $BranchState = $TransDetails['braddress3']; + $BranchZip = $TransDetails['braddress4']; + $BranchCountry = $TransDetails['braddress5']; + $ExchRate = $TransDetails['rate']; + $TaxTotal = number_format($TransDetails['ovgst'],2, '.', ''); + $ShipToFreight = number_format(round($TransDetails['ovfreight'],2),2, '.', ''); + $SegCount = 1; + + + $DatePaymentDue = ConvertToEDIDate(CalcDueDate(ConvertSQLDate($TransDetails['trandate']),$CustDetails['dayinfollowingmonth'], $CustDetails['daysbeforedue'])); + + $TotalAmountExclTax = number_format(($TransDetails['ovamount']+ $TransDetails['ovfreight'] + $TransDetails['ovdiscount']),2, '.', ''); + $TotalAmountInclTax = number_format(($TransDetails['ovamount']+ $TransDetails['ovfreight'] + $TransDetails['ovdiscount'] + $TransDetails['ovgst']),2, '.', ''); + + //**************Need to get delivery address as may be diff from branch address + + $sql = "SELECT deliverto, + deladd1, + deladd2, + deladd3, + deladd4, + deladd5, + deladd6, + salesorders.customerref + FROM debtortrans INNER JOIN salesorders ON debtortrans.order_ = salesorders.orderno + WHERE order_ = '" . $OrderNo . "'"; + + $ErrMsg = _('There was a problem retrieving the ship to details because'); + $ShipToLines = DB_query($sql,$db,$ErrMsg); + + While ($ShipTo = DB_fetch_array($ShipToLines)){ + $ShipToName = $ShipTo[0]; + $ShipToStreet = $ShipTo[1]; + $ShipToSuburb = $ShipTo[2]; + $ShipToState = $ShipTo[3]; + $ShipToZip = $ShipTo[4]; + $ShipToCountry = $ShipTo[5]; + $CustOrderNo = $ShipTo[7]; + + } + + //**************Need to get delivery address as may be diff from branch address + + //**************Reece needs NAD ST in every invoice, sometimes freeform text, so no real code + + if($ShipToName === $BranchName){ + $ShipToCode = $CustBranchCode; + } Else { + $ShipToCode = $ShipToName; + } + + //**************Reece needs NAD ST in every invoice, sometimes freeform text, so no real code + + //**************Taxrate, need to find + + $sql = "SELECT stockmovestaxes.taxrate + FROM stockmoves, + stockmovestaxes + WHERE stockmoves.stkmoveno = stockmovestaxes.stkmoveno + AND stockmoves.transno=" . $TransNo . " + AND stockmoves.show_on_inv_crds=1 + LIMIT 0,1"; + + $ResultTax = DB_query($sql,$db); + + $TaxRate = 100 * (mysql_result($ResultTax, 0)); + + //**************Taxrate, need to find + + //**************Check to see if freight was added, probably specific to Reece and some other OZ hardware stores + + if($ShipToFreight > 0){ + $FreightTax = number_format(round(($ShipToFreight * $TaxRate/100),2),2, '.', ''); + $Freight_YN = "ALC+C" . "'" . "MOA+64:" .$ShipToFreight. "'" . "TAX+7+GST+++:::" .$TaxRate. "'". "MOA+124:" .$FreightTax."'"; + $SegCount = $SegCount + 3; + } else { + $Freight_YN = ""; + } + + //**************Check to see if freight was added could do this in Substitution, skip if 0 freight + + + + //Get the message lines, replace variable names with data, write the output to a file one line at a time + + $sql = "SELECT section, linetext FROM edimessageformat WHERE partnercode='" . $CustDetails['debtorno'] . "' AND messagetype='INVOIC' ORDER BY sequenceno"; + $ErrMsg = _('An error occurred in getting the EDI format template for') . ' ' . $CustDetails['debtorno'] . ' ' . _('because'); + $MessageLinesResult = DB_query($sql, $db,$ErrMsg); + + + if (DB_num_rows($MessageLinesResult)>0){ + + + $DetailLines = array(); + $ArrayCounter =0; + While ($MessageLine = DB_fetch_array($MessageLinesResult)){ + if ($MessageLine['section']=='Detail'){ + $DetailLines[$ArrayCounter]=$MessageLine['linetext']; + $ArrayCounter++; + } + } + DB_data_seek($MessageLinesResult,0); + + $EDITransNo = GetNextTransNo(99,$db); + $fp = fopen('EDI_INV_' . $TransNo . '.txt', 'w'); + + while ($LineDetails = DB_fetch_array($MessageLinesResult)){ + + if ($LineDetails['section']=='Heading'){ + $MsgLineText = $LineDetails['linetext']; + include ('includes/EDIVariableSubstitution.inc'); + $LastLine ='Heading'; + } + + if ($LineDetails['section']=='Detail' AND $LastLine=='Heading') { + /*This must be the detail section + need to get the line details for the invoice or credit note + for creating the detail lines */ + + + if ($TransDetails['type']==10){ /*its an invoice */ + $sql = "SELECT stockmoves.stockid, + stockmaster.description, + -stockmoves.qty as quantity, + stockmoves.discountpercent, + ((1 - stockmoves.discountpercent) * stockmoves.price * " . $ExchRate . " * -stockmoves.qty) AS fxnet, + (stockmoves.price * " . $ExchRate . ") AS fxprice, + stockmaster.units + FROM stockmoves, + stockmaster + WHERE stockmoves.stockid = stockmaster.stockid + AND stockmoves.type=10 + AND stockmoves.transno=" . $TransNo . " + AND stockmoves.show_on_inv_crds=1"; + + } else { + /* credit note */ + $sql = "SELECT stockmoves.stockid, + stockmaster.description, + stockmoves.qty as quantity, + stockmoves.discountpercent, + ((1 - stockmoves.discountpercent) * stockmoves.price * " . $ExchRate . " * stockmoves.qty) as fxnet, + (stockmoves.price * " . $ExchRate . ") AS fxprice, + stockmaster.units + FROM stockmoves, + stockmaster + WHERE stockmoves.stockid = stockmaster.stockid + AND stockmoves.type=11 and stockmoves.transno=" . $TransNo . " + AND stockmoves.show_on_inv_crds=1"; + } + $TransLinesResult = DB_query($sql,$db); + + $LineNumber = 0; + while ($TransLines = DB_fetch_array($TransLinesResult)){ + /*now set up the variable values */ + + $LineNumber++; + $StockID = $TransLines['stockid']; + $sql = "SELECT partnerstockid + FROM ediitemmapping + WHERE supporcust='CUST' + AND partnercode ='" . $CustDetails['debtorno'] . "' + AND stockid='" . $TransLines['stockid'] . "'"; + + $CustStkResult = DB_query($sql,$db); + if (DB_num_rows($CustStkResult)==1){ + $CustStkIDRow = DB_fetch_row($CustStkResult); + $CustStockID = $CustStkIDRow[0]; + } else { + $CustStockID = 'Not_Known'; + } + $ItemDescription = $TransLines['description']; + $QtyInvoiced = $TransLines['quantity']; + $LineTotalExclTax = number_format(round($TransLines['fxnet'],3),2, '.', ''); + $UnitPriceExclTax = number_format(round( $TransLines['fxnet'] / $TransLines['quantity'], 3),2, '.', ''); + $LineTaxAmount = number_format(round($TaxRate/100 * $TransLines['fxnet'],3),2, '.', ''); + $LineTotalInclTax = number_format(round((1+$TaxRate/100) * $LineTotalExclTax,3),2, '.', ''); + $UnitPriceInclTax = number_format(round((1+$TaxRate/100) * $UnitPriceExclTax,2),2, '.', ''); + + /*now work through the detail line segments */ + foreach ($DetailLines as $DetailLineText) { + $MsgLineText = $DetailLineText; + include ('includes/EDIVariableSubstitution.inc'); + } + + + } + + + $LastLine ='Detail'; + $NoLines = $LineNumber; + } + + if($LineDetails['section']=='Summary' AND $LastLine=='Detail'){ + $MsgLineText = $LineDetails['linetext']; + include ('includes/EDIVariableSubstitution.inc'); + } + } /*end while there are message lines to parse and substitute vbles for */ + fclose($fp); /*close the file at the end of each transaction */ + DB_query("UPDATE debtortrans SET EDISent=1 WHERE ID=" . $TransDetails['id'],$db); + /*Now send the file using the customer transport */ + if ($CustDetails['editransport']=='email'){ + + $mail = new htmlMimeMail(); + $attachment = $mail->getFile( "EDI_INV_" . $TransNo .".txt"); + $mail->SetSubject('EDI Invoice/Credit Note ' . $TransNo); + $mail->addAttachment($attachment, 'EDI_INV_' . $TransNo . '.txt', 'application/txt'); + $mail->setFrom($_SESSION['CompanyRecord']['coyname'] . '<' . $_SESSION['CompanyRecord']['email'] . '>'); + $MessageSent = $mail->send(array($CustDetails['ediaddress'])); + + if ($MessageSent==True){ + echo '<BR><BR>'; + prnMsg(_('EDI Message') . ' ' . $TransNo . ' ' . _('was sucessfully emailed'),'success'); + } else { + echo '<BR><BR>'; + prnMsg(_('EDI Message') . ' ' . $TransNo . _('could not be emailed to') . ' ' . $CustDetails['ediaddress'],'error'); + } + } else { /*it must be ftp transport */ + + //Godaddy limitations make it impossible to sftp using ssl or curl, so save to EDI_Sent file and 'rsynch' back to sftp server + + /* set up basic connection + $conn_id = ftp_connect($CustDetails['ediaddress']); // login with username and password + $login_result = ftp_login($conn_id, $CustDetails['ediserveruser'], $CustDetails['ediserverpwd']); // check connection + if ((!$conn_id) || (!$login_result)) { + prnMsg( _('Ftp connection has failed'). '<BR>' . _('Attempted to connect to') . ' ' . $CustDetails['ediaddress'] . ' ' ._('for user') . ' ' . $CustDetails['ediserveruser'],'error'); + include('includes/footer.inc'); + exit; + } + $MessageSent = ftp_put($conn_id, $_SESSION['EDI_MsgPending'] . '/EDI_INV_' . $EDITransNo, 'EDI_INV_' . $EDITransNo, FTP_ASCII); // check upload status + if (!$MessageSent) { + echo '<BR><BR>'; + prnMsg(_('EDI Message') . ' ' . $EDITransNo . ' ' . _('could not be sent via ftp to') .' ' . $CustDetails['ediaddress'],'error'); + } else { + echo '<BR><BR>'; + prnMsg( _('Successfully uploaded EDI_INV_') . $EDITransNo . ' ' . _('via ftp to') . ' ' . $CustDetails['ediaddress'],'success'); + } // close the FTP stream + ftp_quit($conn_id); + */ + } + + + if ($MessageSent==True){ /*the email was sent sucessfully */ + /* move the sent file to sent directory */ + $source = 'EDI_INV_' . $TransNo . '.txt'; + $destination = 'EDI_Sent/EDI_INV_' . $TransNo . '.txt'; + rename($source, $destination); + + } + + } else { + + prnMsg( _('Cannot create EDI message since there is no EDI INVOIC message template set up for') . ' ' . $CustDetails['debtorno'],'error'); + } /*End if there is a message template defined for the customer invoic*/ + + + } /* loop around all the customer transactions to be sent */ + +} /*loop around all the customers enabled for EDI Invoices */ + +include ('includes/footer.inc'); +?> Modified: trunk/Labels.php =================================================================== --- trunk/Labels.php 2012-04-28 19:41:43 UTC (rev 5293) +++ trunk/Labels.php 2012-04-29 03:45:59 UTC (rev 5294) @@ -16,7 +16,8 @@ 'Letter', 'Letter_Landscape', 'Legal', - 'Legal_Landscape'); + 'Legal_Landscape', + '28mm_x_45mm_label'); echo '<p class="page_title_text"> @@ -414,9 +415,10 @@ } //END WHILE LIST LOOP $i--; //last increment needs to be wound back - echo '<input type="hidden" name="NoOfFieldsDefined" value="' . $i . '" />'; + } //end if there are label definitions to show - + echo '<input type="hidden" name="NoOfFieldsDefined" value="' . $i . '" />'; + echo '<tr> <td><select name="FieldName"> <option value="itemcode">' . _('Item Code') . '</option> Modified: trunk/PDFPrintLabel.php =================================================================== --- trunk/PDFPrintLabel.php 2012-04-28 19:41:43 UTC (rev 5293) +++ trunk/PDFPrintLabel.php 2012-04-29 03:45:59 UTC (rev 5294) @@ -3,7 +3,7 @@ include('includes/session.inc'); -$PtsPerMM = 2.83465; //pdf millimetres to points +$PtsPerMM = 2.83465; //pdf points per mm if (isset($_POST['ShowLabels']) @@ -163,25 +163,26 @@ for ($i=0;$i <= $_POST['NoOfLabels'];$i++){ if ($_POST['PrintLabel'.$i]=='on'){ - if ($Field['FieldValue']== 'price'){ - $Value = $_POST['Price' . $i]; - } elseif ($Field['FieldValue']== 'stockid'){ - $Value = $_POST['StockID' . $i]; - } elseif ($Field['FieldValue']== 'description'){ - $Value = $_POST['Description' . $i]; - } elseif ($Field['FieldValue']== 'barcode'){ - $Value = $_POST['Barcode' . $i]; - } foreach ($LabelFields as $Field){ - + //print_r($Field); + + if ($Field['FieldValue']== 'price'){ + $Value = $_POST['Price' . $i]; + } elseif ($Field['FieldValue']== 'stockid'){ + $Value = $_POST['StockID' . $i]; + } elseif ($Field['FieldValue']== 'description'){ + $Value = $_POST['Description' . $i]; + } elseif ($Field['FieldValue']== 'barcode'){ + $Value = $_POST['Barcode' . $i]; + } if ($Field['FieldValue'] == 'price'){ //need to format for the number of decimal places $LeftOvers = $pdf->addTextWrap($XPos+$Field['HPos'],$YPos-$LabelDimensions['label_height']+$Field['VPos'],$LabelDimensions['label_width']-$Field['HPos'],$Field['FontSize'],$_POST['Price' . $i],'center'); } elseif($Field['Barcode']==1) { - + /* write1DBarcode($code, $type, $x='', $y='', $w='', $h='', $xres='', $style='', $align='') * Note that the YPos for this function is based on the opposite origin for the Y axis i.e from the bottom not from the top! */ - + $pdf->write1DBarcode(str_replace('_','',$Value), 'C128',$XPos+$Field['HPos'],$Page_Height - $YPos+$LabelDimensions['label_height']-$Field['VPos']-$Field['FontSize'],$LabelDimensions['label_width']-$Field['HPos'], $Field['FontSize'], 0.4, $style, 'N'); } else { $LeftOvers = $pdf->addTextWrap($XPos+$Field['HPos'],$YPos-$LabelDimensions['label_height']+$Field['VPos'],$LabelDimensions['label_width']-$Field['HPos']-20,$Field['FontSize'],$Value); @@ -213,7 +214,7 @@ } //this label is set to print } //loop through labels selected to print - + $FileName=$_SESSION['DatabaseName']. '_' . _('Price_Labels') . '_' . date('Y-m-d').'.pdf'; ob_clean(); $pdf->OutputD($FileName); Modified: trunk/doc/Change.log =================================================================== --- trunk/doc/Change.log 2012-04-28 19:41:43 UTC (rev 5293) +++ trunk/doc/Change.log 2012-04-29 03:45:59 UTC (rev 5294) @@ -1,4 +1,5 @@ webERP Change Log +29/4/12 David Short: Added EDISendInvoices_Reece.php to send Reece format EDI invoices - approved by Reece (Australian Plumbing retailer) 28/4/2012 Exson: Fixed bugs in MRPCalendar.php which caused working days cannot be calculated correctly. 06/4/2012 Exson: Fixed PO header that does not display user's default warehous when iusse a new PO in PO_Header.php. 25/4/12 Phil: Complete rewrite of PDFPrintLabels.php and Labels.php in webERP style - half the code and maintainable with templates stored with all the other data in the database. The new labels also allow fields to be printed as barcodes too. Modified: trunk/includes/PDFStarter.php =================================================================== --- trunk/includes/PDFStarter.php 2012-04-28 19:41:43 UTC (rev 5293) +++ trunk/includes/PDFStarter.php 2012-04-29 03:45:59 UTC (rev 5294) @@ -128,7 +128,8 @@ case 'legal': - $DocumentPaper = 'LEGAL'; $DocumentOrientation ='P'; + $DocumentPaper = 'LEGAL'; + $DocumentOrientation ='P'; $Page_Width=612; $Page_Height=1008; @@ -140,7 +141,8 @@ case 'legal_landscape': - $DocumentPaper = 'LEGAL'; $DocumentOrientation ='L'; + $DocumentPaper = 'LEGAL'; + $DocumentOrientation ='L'; $Page_Width=1008; $Page_Height=612; @@ -149,6 +151,19 @@ $Left_Margin=30; $Right_Margin=25; break; + + case '28mm_x_45mm_label': + //$DocumentPaper can be an array or width/height of paper size + //as an alternative to the string ISO paper size required by tcpdf + $DocumentPaper = array(127.6,79.4); + $DocumentOrientation='L'; + $Page_Width=127.6; + $Page_Height=79.4; + $Top_Margin=0; + $Bottom_Margin=0; + $Left_Margin=0; + $Right_Margin=0; + break; } // Javier: I correct the call to the constructor to match TCPDF (and FPDF ;-) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |