Purpose
Report Classes and their Reports:
- Customer
- 101 - Customer Balances
- Forum Post: Select Show Balance to be like GL without Allocations, otherwise only fixed allocations will be used.
- Forum Post: Rounding off SUM Errors when converted from other currencies - Comparison Screenshot
- Forum Post: Allocate Bank Payment to Customer Credit Note on goods returned on originally allocated Sales Invoice
- 102 - Aged Customer Analysis
- Forum Post: Select Show also allocated to get correct GL result, otherwise only fixed allocations will be used.
- Forum Post: "All currency" customers are presented in company currency together with customers in the same currency as the company. Only when a customer is selected that customers currency is presented.
- 103 - Customer Detail Listing
- 104 - Price Listing
- 105 - Order Status Listing
- 106 - Salesman Listing
- 107 - Print Invoices | Condensed Format and it's Modified Code
- 108 - Print Statements
- 109 - Print Sales Orders - Change Line Spacing
- 110 - Print Deliveries - Also handles Packing Lists. | Bin Locations in Packing List
- 111 - Print Sales Quotations
- 112 - Print Receipts
- 113 - Print Credit Notes
- 114 - Customer Sales Summary Report
- 115 - Customer Trial Balance Report
- 101 - Customer Balances
- Supplier
- 201 - Supplier Balances- Forum Post: Select Show Balance to be like GL without Allocations, otherwise only fixed allocations will be used.
- 202 - Aged Supplier Analyses
- Forum Post: Select Show also allocated to get correct GL result, otherwise only fixed allocations will be used.
- Forum Post: "All currency" suppliers are presented in company currency together with suppliers in the same currency as the company. Only when a supplier is selected that suppliers currency is presented.
- 203 - Payment Report
- 204 - Outstanding GRNs Report
- 205 - Supplier Detail Listing
- 206 - Supplier Trial Balance Report
- 209 - Print Purchase Orders
- 210 - Print Remittances
- Inventory
- 301 - Inventory Valuation Report
- 302 - Inventory Planning Report
- Forum Post: See line 175 - First the maximum of the last 4 months is calculated. Then this maximum is multiplied with 3 to get a 3 months estimate. This is based on known methods to know the needed stock in advance and to eliminate the risk for one-time sales.
- 303 - Stock Check Sheets
- 304 - Inventory Sales Report
- 305 - GRN Valuation Report
- 306 - Inventory Purchasing Report - as of v2.3.13 Build 3133
- 307 - Inventory Movement Report - as of v2.3.14 Build 3159
- 308 - Costed Inventory Movement Report - as of v2.3.15+ Build 3224
- 309 - Item Sales Summary Report - as of v2.3.15 Build 3231 and as an extension for prior builds
- 310 - Inventory Purchasing - Transaction Based Report - as of v2.4.3+ Build 20171215
- Manufacturing
- 401 - Bill of Material Listing
- 402 - Work Order Listing
- 409 - Print Work Orders
- Fixed Assets
- 451 - Fixed Assets Valuation
- Dimensions
- 501 - Dimension Summary
- Banking
- 601 - Bank Statement | Forum Post: Mod to show Person / Item if not Supplier / Customer - Mod Commit
- 602 - Bank Statement w/ Reconcile
- General Ledger
- 701 - Chart of Accounts - Page 1 | Page 2
- 702 - List of Journal Entries
- 703 - GL Account Group Summary (Absent)
- 704 - GL Account Transactions
- 705 - Annual Expense Breakdown
- 706 - Balance Sheet
- 707 - Profit and Loss Statement | Period Y-1
- 708 - Trial Balance
- 709 - Tax Report
- 710 - Audit Trail
Reports 107 to 113 do not have Destination to Excel available.
Procedure
- If the EMail Report option is chosen, make sure the real_name field in the users table for the logged in user is filled. Otherwise the sender's name will be blank.
- Forum Post - Linking Reports.
reporting/includes/reporting.inc
line 128,function print_link()
shows how to make a link to the core report you want andmanufacturing/workorder_entry.php
line 64 shows how to build a report link.
Report Extensions
- Inventory
- General Ledger
Fixes needed for these extensions are here and here (both needed for both).
- Cash Flow Statement - It uses an existing security code - 'SA_BANKREP'. Make sure Bank reports and inquiries is checked in the required role.
Hiding unauthorised report links
- Forum Post - this is an extension of the original wish list for menu options visibility discussed here.
- In reporting/includes/reports_classes.inc in the class Report add a class property $access
- Modify the class constructor in it as:
function __construct($id, $name, $ar_params = null, $access = null) { $this->id = $id; $this->name = $name; if ($ar_params) $this->set_controls($ar_params); $this->access = $access; }
- Just before listing the report links, ie., just before:
foreach($this->ar_reports[$class_id] as $rep_id => $report)
insert the following
if($report->access != null && !$_SESSION["wa_current_user"]->can_access($report->access) && $_SESSION["wa_current_user"]->hide_inaccessible_menu_items()) continue;
- Modify the add_report() method to use the $access property:
function addReport($class, $id, $rep_name, $params=null,$access=null) { unset($this->ar_reports[$class][$id]); // unset std report if any $this->ar_reports[$class][$id] = new Report($id, $rep_name, $params, $access); }
- Finally modify each $reports->addReport call in reporting/reports_main.php to include the $access variable, like for example, Customer Balances report (here the $access value is 'SA_CUSTPAYMREP'):
$reports->addReport(RC_CUSTOMER, 101, _('Customer &Balances'), array( _('Start Date') => 'DATEBEGIN', _('End Date') => 'DATEENDM', _('Customer') => 'CUSTOMERS_NO_FILTER', _('Show Balance') => 'YES_NO', _('Currency Filter') => 'CURRENCY', _('Suppress Zeros') => 'YES_NO', _('Comments') => 'TEXTBOX', _('Orientation') => 'ORIENTATION', _('Destination') => 'DESTINATION'),'SA_CUSTPAYMREP');
Watermarking
Yes, indeed, there is possibility to insert watermark, or even whole externally designed blueprint in documents generated in FA.
The blueprint have to be designed as PDF-1.4 file (other pdf formats may also be supported), and you will have to put the designed watermark page in /reporting/forms folder.
Out of the box two blueprints are supported for two basic document layouts:
- Header2.pdf - for reports 107-113, 209,210 and 409
- Header.pdf - for all other documents
If you want to test this feature, just put attached file in the forms folder and generate Sales Invoice. In real design some small changes in repxxx.php files can be necessary.
Of course this feature does not address directly the problem of ad-hoc per document watermarks, but is ready to use if e.g. you plan to hire artist to design your invoices ;).
Third Party Reports
- Customer Account Statement - Forum Post
- Customer Ledger Report with Areas and Salesmen filters based on rep101 - Forum Post | Screenshots - Form, Report
- Item Sales Summary Report | Screenshot - Report
- Item Sales Type Summary | Screenshot - Report | Forum Post
- This report is based on rep309 (Item Sales Summary Report).
- It adds the ability to filter on sales type.
- It collapses price (one line per item rather than one line per item/price) and sorts by item description rather than item number.
- Both reports should always have the same total.
- Use the original rep309 if you are interested in seeing sales by price breakdown.
- Use Sales Type Summary if you are interested in seeing sales by sales type.
- This is useful if you have defined several sales types (wholesale, retail, ...) and need to report these sales separately on government reports.
- Reporting sales by tax group would also be useful).
- Enhanced Customer Sales Statement | Screenshot - Report
- Reportico - Open Source freestyle reporting
Large Excel Reports
- Forum Post - Fix for Excel reports to show over 65535 rows
Adjusting Column Widths in Reports
- Forum Post: FA v2.3 column widths for reports can be adjusted by backporting the changes in this commit in FA 2.4 when transaction numbers exceed 3 digits.
Auto Printing with no Profile
If the Printer is connected to the same computer that runs the POS, to send print directly to printer at a POS Location without going to browser preview by adding this code to line 954 of pdf_report.inc in the function End() just after the globals:
$this->IncludeJS("print();"); // force to open print dialog
EMailing parameters in Batch Files
The links like the following can be used in batch files to email reports:
http://example.com/fa/reporting/prn_redirect.php?PARAM_0=1-10&PARAM_1=1-10&PARAM_2=&PARAM_3=1&PARAM_4=&PARAM_5=&PARAM_6=&PARAM_7=0&REP_ID=107
or just the parameters needed like:
http://example.com/reporting/prn_redirect.php?PARAM_0=1-10&PARAM_1=1-10&PARAM_3=1&PARAM_7=0&REP_ID=107
The following reports in FA can be emailed directly from the reports page form choices:
email_Customers
- 107 - Invoices (From 0, To 1, EMail 3)
- 113 - Credit Notes
- 110 - Deliveries
- 108 - Statements
- 109 - Sales Orders
- 111 - Sales Quotations
- 112 - Receipts
Email Suppliers
- 209 - Purchase Orders
- 210 - Remittances
EMail Locations
- 409 - Work Orders
Watermarking and background / logo merging in reports
- Another page on Watermarking circa 2013.
- Forum Post: Per company, per Template report watermarking is available in FrontAccounting.
- Background / Watermark merge PDF file for Company # to be located in the folder: company/#/reporting/forms
- The merge PDF file should be of Acrobat Reader format v5.0 (PDF format v1.4) or lower since FA uses the free FPDI v1.2.1 library released on 2008-09-11
- Sample OpenWriter Watermark/logo file for customization is here courtesy Joe Hunt.
- Watermark / logo PDFs can be created in MS Word 2007 => Page Layout => Watermark => Custom Watermark => File => Save As => PDF or XPS are of PDF Format v1.5 and above and needs to be printed in some virtual printer like PDFCreator or doPDF. PDFCreator generates small PDF files and is free but may try to install some nagware (optional) in the later versions.
- Choosing standard fonts like Arial will result in non embedding of fonts in the resultant PDF making it small in size.
- On New page creation in reports, the function setSourceFile() in reporting/includes/fpdi/fpdi.php is called and returns the number of pages in the above Header2.pdf file.
- On New page creation in reports another possibility is to place a Header2.php file in reporting/forms folder (possibly in the company folder) as well.
- If the Header2.pdf / Header.pdf files have more than one page, then each one is used in succession for the report and the last one is used for the remaining pages of the report.
- Use Cases:
- Company logo at the top of the Header.pdf.
- Stamp underneath the existing report, such as confidential data across the page in a vague / subdued color.
- setSourceFile() loads an existing pdf as a "background", onto which all output is "printed".
- Incorporate a company letterhead.
Header2.php file in Watermarking and background of reports
- The Template (eg., Header2) function is executed only at the very end of the NewPage() method in reporting/includes/pdf_report.inc.
- The company/#/reporting/Header2.php if present will provide overrides for properties not defined in
- the Newpage() method
- doctext.inc
- header2.inc
- It will also provide values in cases where pre-defined properties in the above are not overridden (like $this->formData['br_name']).
- Any variables (need to global them) and properties referred to in the header2.inc and doctext.inc files that are not part of the core can be provided in the Header2.php file and assigned in header2.inc and doctext.inc only if absent.
- Example of Header2.php usage and it's effect is here.
- The mere presence of the file company/#/reporting/includes/header2.inc does not ensure that it will be used in reports. It is necessary for the appropriate company/#/reporting/repXXX.php file to be present for it to apply to it.
Show Company Logo on Reports
Excel Reports in RTL Languages
- This issue is discussed here.
- A possible fix to install glibc-common and / or php-iconv
- Also try php5-intl and php-mbstring
Tips and Tricks
RTL Fonts
Suppressing Page number display
- Forum Post: Comment out the lines 144-147 in reporting/includes/header2.inc
// $this->NewLine(2); // // if ($this->pageNumber > 1) // $this->Text($mcol + 180, _("Page") . ' ' . $this->pageNumber);
PDF Failure
- Symptom: PDF reports has stopped working, reports to Excel/LibreOffice works.
- Fix: On some newer internet explorer releases, you will have to set the compatibility mode. If you cannot solve this you may use another browser like Firefox or another.
- Fix: On recent Firefox browsers, the PDF Application Viewer is set to internal preview pdfjs feature that does not yet have full Adobe PDF functionality. See Forum Post and view Article.
- Fix: The php.ini setting of the variable max_input_vars may be increased from the default value of 1000 (even if not present in some php versions). See Forum Post.
dejavu.php missing - TCPDF Font Failure
- Download dejavu.php
- Extract contents to reporting/fonts folder
- This is the default unicode font when none are defined
- Can change this font at around line 161 in reporting/includes/class.pdf.inc
PHP < v5.3 PDF Failure
The commit on 2014-11-07 was made to accomodate PHP 5.3's preg_replace_callback() function but for those on earlier PHP versions like v5.2.17, this non existent function caused PDF failure. It's reversion for these older PHP versions will solve this issue.
Charge To / deliver To
- Create customer: Mark
- Create branch DD Towing under customer Mark
- Sales quote or Order pdf will display DD Towing in Charge to and Deliver to field
- In FA v2.3.6 (Circa 2011) it would have displayed Mark in Charge to field and DD Towing in Deliver to field
- This was changed to make possible having branches charged directly
- To revert to old FA v2.3.6 functionality, set the name and billing address for the branch the same as for customer (keep branch short name unique to easily recognise branches in selectors). If this is still a problem (e.g. you have big database with mostly multibranch customers) you can fix the charge data in reporting/includes/doctext.inc file about line 18-20 (the code should be self explanatory). Lines 44 and 61 can be changed from
_("Customer's Reference") => $this->formData["customer_ref"],
to
_("Customer's Reference") => $this->formData["name"],
- If there is no Branch billing address, then the Customer address is used.
Report Signature
Do one of the following:
- In Comment or Memo field
- If this info is for all customers - add signature in the file reporting/includes/header2.inc
- For only SALES QUOTATIONS, add the info in the file reporting/rep111.php.
if ($this->formData['doctype'] == ST_SALESQUOTE) { $txt = "test"; $this->TextWrapLines($ccol, $this->row, $right - $ccol, $txt, 'C') }
Extra Message Lines in Delivery Note Report
Insert the following lines after line 216 in file reporting/rep110.php.
$rep->NewLine(2); $rep->TextCol(1, 4, "_______________________________________________", -2); $rep->NewLine(1); $rep->TextCol(1,4, " Signature, Company Stamp & Date", -2);
You may need to adjust the underline and text a bit. Try it on the Training Co. first. Please make a backup of the file, in case you get an update. You will then have to insert these lines again.
Extra Parameters in Reports taken from formatted notes field
Include the following function into any report or it's includes:
/* // Purpose: Function to parse a string into parameters // Release Date: 2014-12-26 // Author: ApMuthu <apmuthu@usa.net> // Usage: $str = "PPFrt#2000 CID#6378465 TaxEx#2345-038 abcde ertrgdert COD#4253 jdegtd PIN#6473654"; $p = parse_notes_params($str); echo print_r($p, true); */ function parse_notes_params($str, $sep=" ", $delim="#") { $str_params = explode($sep, $str); $param_array=Array('notes' => ''); foreach ($str_params AS $str_param) { $param_set=explode($delim, trim($str_param)); $key = (array_key_exists(0, $param_set) ? trim($param_set[0]) : ''); $val = (array_key_exists(1, $param_set) ? trim($param_set[1]) : ''); if (strlen($key) > 0 && strlen($val) > 0) { $param_array[$key]=$val; } else { // stop at first missing parameter set // break; // Collect the rest into notes $param_array['notes'] .= (" " . $str_param); } } $param_array['notes'] = trim($param_array['notes']); return $param_array; }
An example of usage will be in the reporting/rep110.php file at near the end just before the last $rep-Font();
statement:
$notes_params = parse_notes_params($branch['notes']); if ($packing_slip == 0 && array_key_exists('CID', $notes_params)) { $rep->NewLine(1); $rep->TextCol(1, 7, "Old Customer# : " . $notes_params['CID'], - 2); }
PDF Page Numbering
Site-wide report page numbering (useful particularly for multi page invoices) can be enabled by commenting out line 142 in reporting/includes/header2.inc:
// if ($this->pageNumber > 1 && !strstr($this->filename, "Bulk"))
EMail Templating in FA v2.4 only - Current Fix for FA v2.3.x
Change line 1006 in reporting/includes/pdf_report.inc:
$msg = _("Dear") . " " . $contact['name2'] . ",\n\n"
to
$msg = _("Dear") . " " . $contact['name'].' '.$contact['name2'] . ",\n\n"
PDF Font Change
- Put the 3 font files in reporting/fonts : tuffy.php, tuffy.z and tuffy.afm
- On Linux
apt-get install ttf-tuffy ln -s /usr/share/fonts/truetype/ttf-tuffy/* reporting/fonts
- Edit reporting/includes/class.pdf.inc around Line 119:
// Was helvetica, now tuffy. $this->FontFamily = 'tuffy'; $this->FontStyle = ''; $this->FontSizePt = 12;
Add Page to Report
- Forum Post for PHP >= 7
- Example to add a page to rep109.php (Sales Order Report), say Tax Invoice not yet made:
// START my modification $rep->SetHeaderType(''); $rep->NewPage(); /* here i want to write predefined html report here */ // END my modification if ($ email == 1) { $ rep-> End ($ email); } } if ($ email == 0) $ rep-> End ();
Salesman Wise reports
BarCode inclusion
Audit Trail User-wise
When there are multiple users of a single role like Administrator, we track their individual actions (like who entered an order or who received cash) by using the Audit Trail report.
Old PDF Reports auto deletion time / retention
- Raise the time from 3 minutes (180 secs) to a different value before a report is considered stale and deleted
- Comment out the lines below to prevent it's deletion and retain it indefinitely.
Lines 1082-1085 in reporting/includes/pdf_report.inc:
// seems 3 min is enough for any report download, isn't it? if (time()-$ftime > 180){ unlink($dir.'/'.$file); }