From da8311619dd73feae101d246a1957b972e00cbd2 Mon Sep 17 00:00:00 2001 From: Joe Hunt Date: Thu, 12 Apr 2007 22:54:20 +0000 Subject: [PATCH] *** empty log message *** --- access/index.php | 3 + access/login.php | 136 + access/logout.php | 47 + admin/backup/index.php | 3 + admin/backups.php | 274 + admin/company_preferences.php | 117 + admin/create_coy.php | 294 + admin/db/company_db.inc | 163 + admin/db/index.php | 3 + admin/db/maintenance_db.inc | 623 ++ admin/db/users_db.inc | 110 + admin/db/v_banktrans.inc | 42 + admin/db/voiding_db.inc | 112 + admin/display_prefs.php | 97 + admin/fiscalyears.php | 223 + admin/forms_setup.php | 53 + admin/gl_setup.php | 199 + admin/index.php | 3 + admin/inst_lang.php | 349 + admin/payment_terms.php | 223 + admin/shipping_companies.php | 162 + admin/users.php | 207 + admin/view_print_transaction.php | 158 + admin/void_transaction.php | 130 + applications/application.php | 118 + applications/customers.php | 37 + applications/dimensions.php | 25 + applications/generalledger.php | 38 + applications/index.php | 3 + applications/inventory.php | 35 + applications/manufacturing.php | 26 + applications/setup.php | 35 + applications/suppliers.php | 32 + config.php | 138 + config_db.php | 36 + dimensions/dimension_entry.php | 259 + dimensions/includes/dimensions_db.inc | 140 + dimensions/includes/dimensions_ui.inc | 60 + dimensions/includes/index.php | 3 + dimensions/index.php | 3 + dimensions/inquiry/index.php | 3 + dimensions/inquiry/search_dimensions.php | 166 + dimensions/view/index.php | 3 + dimensions/view/view_dimension.php | 62 + frontaccounting.php | 49 + gl/bank_transfer.php | 174 + gl/gl_deposit.php | 256 + gl/gl_journal.php | 288 + gl/gl_payment.php | 257 + gl/includes/db/gl_db_account_types.inc | 104 + gl/includes/db/gl_db_accounts.inc | 92 + gl/includes/db/gl_db_bank_accounts.inc | 51 + gl/includes/db/gl_db_bank_trans.inc | 112 + gl/includes/db/gl_db_bank_trans_types.inc | 40 + gl/includes/db/gl_db_banking.inc | 161 + gl/includes/db/gl_db_currencies.inc | 55 + gl/includes/db/gl_db_rates.inc | 120 + gl/includes/db/gl_db_trans.inc | 266 + gl/includes/db/index.php | 3 + gl/includes/gl_db.inc | 20 + gl/includes/gl_ui.inc | 5 + gl/includes/index.php | 3 + gl/includes/ui/gl_deposit_ui.inc | 249 + gl/includes/ui/gl_journal_ui.inc | 196 + gl/includes/ui/gl_payment_ui.inc | 246 + gl/includes/ui/index.php | 3 + gl/index.php | 3 + gl/inquiry/bank_inquiry.php | 116 + gl/inquiry/gl_account_inquiry.php | 164 + gl/inquiry/gl_trial_balance.php | 129 + gl/inquiry/index.php | 3 + gl/manage/bank_accounts.php | 169 + gl/manage/bank_trans_types.php | 142 + gl/manage/currencies.php | 257 + gl/manage/exchange_rates.php | 228 + gl/manage/gl_account_classes.php | 165 + gl/manage/gl_account_types.php | 181 + gl/manage/gl_accounts.php | 248 + gl/manage/index.php | 3 + gl/view/bank_transfer_view.php | 85 + gl/view/gl_deposit_view.php | 119 + gl/view/gl_payment_view.php | 119 + gl/view/gl_trans_view.php | 99 + gl/view/index.php | 3 + includes/banking.inc | 143 + includes/current_user.inc | 201 + includes/data_checks.inc | 432 + includes/date_functions.inc | 404 + includes/db/comments_db.inc | 54 + includes/db/connect_db.inc | 102 + includes/db/index.php | 3 + includes/db/inventory_db.inc | 151 + includes/db/manufacturing_db.inc | 42 + includes/db/references_db.inc | 63 + includes/db/sql_functions.inc | 20 + includes/errors.inc | 66 + includes/index.php | 3 + includes/lang/gettext.php | 668 ++ includes/lang/index.php | 3 + includes/lang/language.php | 127 + includes/main.inc | 41 + includes/manufacturing.inc | 28 + includes/page/footer.inc | 45 + includes/page/header.inc | 70 + includes/page/index.php | 3 + includes/prefs/index.php | 3 + includes/prefs/sysprefs.inc | 55 + includes/prefs/userprefs.inc | 143 + includes/references.inc | 83 + includes/reserved.inc | 49 + includes/session.inc | 117 + includes/systypes.inc | 63 + includes/types.inc | 288 + includes/ui.inc | 10 + includes/ui/allocation_cart.inc | 113 + includes/ui/index.php | 3 + includes/ui/items_cart.inc | 308 + includes/ui/ui_controls.inc | 177 + includes/ui/ui_globals.inc | 60 + includes/ui/ui_input.inc | 348 + includes/ui/ui_lists.inc | 1968 ++++ includes/ui/ui_msgs.inc | 63 + includes/ui/ui_view.inc | 646 ++ index.php | 11 + install.html | 307 + install/index.php | 307 + install/save.php | 366 + install/stylesheet.css | 71 + inventory/adjustments.php | 237 + inventory/cost_update.php | 117 + inventory/includes/db/index.php | 3 + inventory/includes/db/items_adjust_db.inc | 83 + inventory/includes/db/items_category_db.inc | 48 + inventory/includes/db/items_db.inc | 82 + inventory/includes/db/items_locations_db.inc | 76 + inventory/includes/db/items_prices_db.inc | 46 + inventory/includes/db/items_trans_db.inc | 57 + inventory/includes/db/items_transfer_db.inc | 90 + inventory/includes/db/movement_types_db.inc | 42 + inventory/includes/index.php | 3 + inventory/includes/inventory_db.inc | 16 + inventory/includes/item_adjustments_ui.inc | 185 + inventory/includes/stock_transfers_ui.inc | 169 + inventory/index.php | 3 + inventory/inquiry/index.php | 3 + inventory/inquiry/stock_movements.php | 177 + inventory/inquiry/stock_status.php | 139 + inventory/manage/image/0/102.jpg | Bin 0 -> 14949 bytes inventory/manage/image/0/103.jpg | Bin 0 -> 14412 bytes inventory/manage/image/0/104.jpg | Bin 0 -> 11055 bytes inventory/manage/index.php | 3 + inventory/manage/item_categories.php | 125 + inventory/manage/items.php | 386 + inventory/manage/locations.php | 185 + inventory/manage/movement_types.php | 138 + inventory/prices.php | 169 + inventory/purchasing_data.php | 234 + inventory/reorder_level.php | 83 + inventory/transfers.php | 246 + inventory/view/index.php | 3 + inventory/view/view_adjustment.php | 66 + inventory/view/view_transfer.php | 71 + lang/en_US/LC_MESSAGES/en_US.mo | Bin 0 -> 596 bytes lang/en_US/stylesheet.css | 17 + lang/index.php | 3 + lang/installed_languages.inc | 17 + .../LC_MESSAGES/empty.po | 8374 +++++++++++++++++ lang/new_language_template/stylesheet.css | 17 + manufacturing/includes/db/index.php | 3 + manufacturing/includes/db/work_centres_db.inc | 42 + .../includes/db/work_order_issues_db.inc | 128 + .../db/work_order_produce_items_db.inc | 106 + .../db/work_order_requirements_db.inc | 69 + manufacturing/includes/db/work_orders_db.inc | 212 + .../includes/db/work_orders_quick_db.inc | 108 + manufacturing/includes/index.php | 3 + manufacturing/includes/manufacturing_db.inc | 10 + manufacturing/includes/manufacturing_ui.inc | 352 + .../includes/work_order_issue_ui.inc | 165 + manufacturing/index.php | 3 + manufacturing/inquiry/bom_cost_inquiry.php | 39 + manufacturing/inquiry/index.php | 3 + manufacturing/inquiry/where_used_inquiry.php | 78 + manufacturing/manage/bom_edit.php | 286 + manufacturing/manage/index.php | 3 + manufacturing/manage/work_centres.php | 148 + manufacturing/search_work_orders.php | 165 + manufacturing/view/index.php | 3 + manufacturing/view/wo_issue_view.php | 116 + manufacturing/view/wo_production_view.php | 66 + manufacturing/view/work_order_view.php | 69 + manufacturing/work_order_add_finished.php | 166 + manufacturing/work_order_entry.php | 403 + manufacturing/work_order_issue.php | 207 + manufacturing/work_order_release.php | 97 + purchasing/allocations/index.php | 3 + purchasing/allocations/supplier_allocate.php | 277 + .../allocations/supplier_allocation_main.php | 117 + purchasing/includes/db/grn_db.inc | 269 + purchasing/includes/db/index.php | 3 + purchasing/includes/db/invoice_db.inc | 328 + purchasing/includes/db/invoice_items_db.inc | 85 + purchasing/includes/db/po_db.inc | 212 + purchasing/includes/db/supp_payment_db.inc | 73 + purchasing/includes/db/supp_trans_db.inc | 163 + purchasing/includes/db/suppalloc_db.inc | 123 + purchasing/includes/db/suppliers_db.inc | 161 + purchasing/includes/index.php | 3 + purchasing/includes/po_class.inc | 147 + purchasing/includes/purchasing_db.inc | 59 + purchasing/includes/purchasing_ui.inc | 17 + purchasing/includes/supp_trans_class.inc | 207 + purchasing/includes/ui/grn_ui.inc | 58 + purchasing/includes/ui/index.php | 3 + purchasing/includes/ui/invoice_ui.inc | 374 + purchasing/includes/ui/po_ui.inc | 334 + purchasing/index.php | 3 + purchasing/inquiry/index.php | 3 + purchasing/inquiry/po_search.php | 163 + purchasing/inquiry/po_search_completed.php | 139 + .../inquiry/supplier_allocation_inquiry.php | 201 + purchasing/inquiry/supplier_inquiry.php | 224 + purchasing/manage/index.php | 3 + purchasing/manage/suppliers.php | 242 + purchasing/po_entry_items.php | 428 + purchasing/po_receive_items.php | 302 + purchasing/supplier_credit.php | 167 + purchasing/supplier_credit_grns.php | 194 + purchasing/supplier_invoice.php | 177 + purchasing/supplier_invoice_grns.php | 236 + purchasing/supplier_payment.php | 211 + purchasing/supplier_trans_gl.php | 130 + purchasing/view/index.php | 3 + purchasing/view/view_grn.php | 65 + purchasing/view/view_po.php | 144 + purchasing/view/view_supp_credit.php | 69 + purchasing/view/view_supp_invoice.php | 72 + purchasing/view/view_supp_payment.php | 76 + reporting/fonts/Helvetica-Bold.afm | 2827 ++++++ reporting/fonts/Helvetica-BoldOblique.afm | 2827 ++++++ reporting/fonts/Helvetica-Oblique.afm | 3051 ++++++ reporting/fonts/Helvetica.afm | 3051 ++++++ reporting/fonts/Vera.afm | 1818 ++++ reporting/fonts/Vera.ttf | Bin 0 -> 65932 bytes reporting/fonts/iqraa.afm | 238 + reporting/fonts/iqraa.ttf | Bin 0 -> 59840 bytes reporting/includes/class.graphic.inc | 965 ++ reporting/includes/class.mail.inc | 124 + reporting/includes/class.pdf.inc | 3076 ++++++ reporting/includes/doctext.inc | 83 + reporting/includes/doctext2.inc | 83 + reporting/includes/form_types.inc | 134 + reporting/includes/index.php | 3 + reporting/includes/pdf_report.inc | 693 ++ reporting/includes/reporting.inc | 42 + reporting/includes/reports_classes.inc | 394 + reporting/index.php | 3 + reporting/pdf_files/index.php | 3 + reporting/rep101.php | 163 + reporting/rep102.php | 269 + reporting/rep103.php | 214 + reporting/rep104.php | 166 + reporting/rep105.php | 169 + reporting/rep107.php | 191 + reporting/rep108.php | 169 + reporting/rep109.php | 160 + reporting/rep201.php | 167 + reporting/rep202.php | 284 + reporting/rep203.php | 157 + reporting/rep204.php | 139 + reporting/rep209.php | 162 + reporting/rep301.php | 160 + reporting/rep302.php | 232 + reporting/rep303.php | 185 + reporting/rep401.php | 102 + reporting/rep501.php | 112 + reporting/rep701.php | 97 + reporting/rep702.php | 99 + reporting/rep704.php | 167 + reporting/rep705.php | 302 + reporting/rep706.php | 275 + reporting/rep707.php | 311 + reporting/rep708.php | 140 + reporting/rep709.php | 365 + reporting/reports_main.php | 283 + sales/allocations/customer_allocate.php | 265 + .../allocations/customer_allocation_main.php | 121 + sales/allocations/index.php | 3 + sales/credit_note_entry.php | 281 + sales/customer_credit_invoice.php | 396 + sales/customer_invoice.php | 488 + sales/customer_payments.php | 229 + sales/includes/cart_class.inc | 274 + sales/includes/db/branches_db.inc | 37 + sales/includes/db/credit_status_db.inc | 42 + sales/includes/db/cust_trans_db.inc | 210 + sales/includes/db/cust_trans_details_db.inc | 114 + sales/includes/db/custalloc_db.inc | 120 + sales/includes/db/customers_db.inc | 173 + sales/includes/db/index.php | 3 + sales/includes/db/payment_db.inc | 79 + sales/includes/db/sales_credit_db.inc | 296 + sales/includes/db/sales_invoice_db.inc | 188 + sales/includes/db/sales_order_db.inc | 258 + sales/includes/db/sales_types_db.inc | 52 + sales/includes/index.php | 3 + sales/includes/sales_db.inc | 79 + sales/includes/sales_ui.inc | 8 + sales/includes/ui/sales_credit_ui.inc | 256 + sales/includes/ui/sales_order_ui.inc | 386 + sales/index.php | 3 + sales/inquiry/customer_allocation_inquiry.php | 211 + sales/inquiry/customer_inquiry.php | 254 + sales/inquiry/index.php | 3 + sales/inquiry/sales_orders_view.php | 195 + sales/manage/credit_status.php | 150 + sales/manage/customer_branches.php | 323 + sales/manage/customers.php | 331 + sales/manage/index.php | 3 + sales/manage/sales_areas.php | 126 + sales/manage/sales_people.php | 148 + sales/manage/sales_types.php | 137 + sales/sales_order_entry.php | 516 + sales/view/index.php | 3 + sales/view/view_credit.php | 148 + sales/view/view_invoice.php | 157 + sales/view/view_receipt.php | 50 + sales/view/view_sales_order.php | 177 + sql/basic.sql | 1220 +++ sql/en_US-demo.sql | 925 ++ sql/en_US-new.sql | 206 + sql/index.php | 3 + taxes/db/index.php | 3 + taxes/db/item_tax_types_db.inc | 98 + taxes/db/tax_groups_db.inc | 109 + taxes/db/tax_types_db.inc | 84 + taxes/index.php | 3 + taxes/item_tax_types.php | 201 + taxes/tax_calc.inc | 163 + taxes/tax_groups.php | 245 + taxes/tax_types.php | 165 + themes/aqua/default.css | 332 + themes/aqua/index.php | 3 + themes/aqua/renderer.php | 66 + themes/cool/default.css | 337 + themes/cool/index.php | 3 + themes/cool/renderer.php | 67 + themes/default/default.css | 332 + .../default/images/logo_frontaccounting.jpg | Bin 0 -> 6467 bytes .../default/images/logo_frontaccounting.png | Bin 0 -> 10792 bytes themes/default/images/spacer.png | Bin 0 -> 1136 bytes themes/default/index.php | 3 + themes/default/login.css | 45 + themes/default/renderer.php | 66 + 354 files changed, 75825 insertions(+) create mode 100644 access/index.php create mode 100644 access/login.php create mode 100644 access/logout.php create mode 100644 admin/backup/index.php create mode 100644 admin/backups.php create mode 100644 admin/company_preferences.php create mode 100644 admin/create_coy.php create mode 100644 admin/db/company_db.inc create mode 100644 admin/db/index.php create mode 100644 admin/db/maintenance_db.inc create mode 100644 admin/db/users_db.inc create mode 100644 admin/db/v_banktrans.inc create mode 100644 admin/db/voiding_db.inc create mode 100644 admin/display_prefs.php create mode 100644 admin/fiscalyears.php create mode 100644 admin/forms_setup.php create mode 100644 admin/gl_setup.php create mode 100644 admin/index.php create mode 100644 admin/inst_lang.php create mode 100644 admin/payment_terms.php create mode 100644 admin/shipping_companies.php create mode 100644 admin/users.php create mode 100644 admin/view_print_transaction.php create mode 100644 admin/void_transaction.php create mode 100644 applications/application.php create mode 100644 applications/customers.php create mode 100644 applications/dimensions.php create mode 100644 applications/generalledger.php create mode 100644 applications/index.php create mode 100644 applications/inventory.php create mode 100644 applications/manufacturing.php create mode 100644 applications/setup.php create mode 100644 applications/suppliers.php create mode 100644 config.php create mode 100644 config_db.php create mode 100644 dimensions/dimension_entry.php create mode 100644 dimensions/includes/dimensions_db.inc create mode 100644 dimensions/includes/dimensions_ui.inc create mode 100644 dimensions/includes/index.php create mode 100644 dimensions/index.php create mode 100644 dimensions/inquiry/index.php create mode 100644 dimensions/inquiry/search_dimensions.php create mode 100644 dimensions/view/index.php create mode 100644 dimensions/view/view_dimension.php create mode 100644 frontaccounting.php create mode 100644 gl/bank_transfer.php create mode 100644 gl/gl_deposit.php create mode 100644 gl/gl_journal.php create mode 100644 gl/gl_payment.php create mode 100644 gl/includes/db/gl_db_account_types.inc create mode 100644 gl/includes/db/gl_db_accounts.inc create mode 100644 gl/includes/db/gl_db_bank_accounts.inc create mode 100644 gl/includes/db/gl_db_bank_trans.inc create mode 100644 gl/includes/db/gl_db_bank_trans_types.inc create mode 100644 gl/includes/db/gl_db_banking.inc create mode 100644 gl/includes/db/gl_db_currencies.inc create mode 100644 gl/includes/db/gl_db_rates.inc create mode 100644 gl/includes/db/gl_db_trans.inc create mode 100644 gl/includes/db/index.php create mode 100644 gl/includes/gl_db.inc create mode 100644 gl/includes/gl_ui.inc create mode 100644 gl/includes/index.php create mode 100644 gl/includes/ui/gl_deposit_ui.inc create mode 100644 gl/includes/ui/gl_journal_ui.inc create mode 100644 gl/includes/ui/gl_payment_ui.inc create mode 100644 gl/includes/ui/index.php create mode 100644 gl/index.php create mode 100644 gl/inquiry/bank_inquiry.php create mode 100644 gl/inquiry/gl_account_inquiry.php create mode 100644 gl/inquiry/gl_trial_balance.php create mode 100644 gl/inquiry/index.php create mode 100644 gl/manage/bank_accounts.php create mode 100644 gl/manage/bank_trans_types.php create mode 100644 gl/manage/currencies.php create mode 100644 gl/manage/exchange_rates.php create mode 100644 gl/manage/gl_account_classes.php create mode 100644 gl/manage/gl_account_types.php create mode 100644 gl/manage/gl_accounts.php create mode 100644 gl/manage/index.php create mode 100644 gl/view/bank_transfer_view.php create mode 100644 gl/view/gl_deposit_view.php create mode 100644 gl/view/gl_payment_view.php create mode 100644 gl/view/gl_trans_view.php create mode 100644 gl/view/index.php create mode 100644 includes/banking.inc create mode 100644 includes/current_user.inc create mode 100644 includes/data_checks.inc create mode 100644 includes/date_functions.inc create mode 100644 includes/db/comments_db.inc create mode 100644 includes/db/connect_db.inc create mode 100644 includes/db/index.php create mode 100644 includes/db/inventory_db.inc create mode 100644 includes/db/manufacturing_db.inc create mode 100644 includes/db/references_db.inc create mode 100644 includes/db/sql_functions.inc create mode 100644 includes/errors.inc create mode 100644 includes/index.php create mode 100644 includes/lang/gettext.php create mode 100644 includes/lang/index.php create mode 100644 includes/lang/language.php create mode 100644 includes/main.inc create mode 100644 includes/manufacturing.inc create mode 100644 includes/page/footer.inc create mode 100644 includes/page/header.inc create mode 100644 includes/page/index.php create mode 100644 includes/prefs/index.php create mode 100644 includes/prefs/sysprefs.inc create mode 100644 includes/prefs/userprefs.inc create mode 100644 includes/references.inc create mode 100644 includes/reserved.inc create mode 100644 includes/session.inc create mode 100644 includes/systypes.inc create mode 100644 includes/types.inc create mode 100644 includes/ui.inc create mode 100644 includes/ui/allocation_cart.inc create mode 100644 includes/ui/index.php create mode 100644 includes/ui/items_cart.inc create mode 100644 includes/ui/ui_controls.inc create mode 100644 includes/ui/ui_globals.inc create mode 100644 includes/ui/ui_input.inc create mode 100644 includes/ui/ui_lists.inc create mode 100644 includes/ui/ui_msgs.inc create mode 100644 includes/ui/ui_view.inc create mode 100644 index.php create mode 100644 install.html create mode 100644 install/index.php create mode 100644 install/save.php create mode 100644 install/stylesheet.css create mode 100644 inventory/adjustments.php create mode 100644 inventory/cost_update.php create mode 100644 inventory/includes/db/index.php create mode 100644 inventory/includes/db/items_adjust_db.inc create mode 100644 inventory/includes/db/items_category_db.inc create mode 100644 inventory/includes/db/items_db.inc create mode 100644 inventory/includes/db/items_locations_db.inc create mode 100644 inventory/includes/db/items_prices_db.inc create mode 100644 inventory/includes/db/items_trans_db.inc create mode 100644 inventory/includes/db/items_transfer_db.inc create mode 100644 inventory/includes/db/movement_types_db.inc create mode 100644 inventory/includes/index.php create mode 100644 inventory/includes/inventory_db.inc create mode 100644 inventory/includes/item_adjustments_ui.inc create mode 100644 inventory/includes/stock_transfers_ui.inc create mode 100644 inventory/index.php create mode 100644 inventory/inquiry/index.php create mode 100644 inventory/inquiry/stock_movements.php create mode 100644 inventory/inquiry/stock_status.php create mode 100644 inventory/manage/image/0/102.jpg create mode 100644 inventory/manage/image/0/103.jpg create mode 100644 inventory/manage/image/0/104.jpg create mode 100644 inventory/manage/index.php create mode 100644 inventory/manage/item_categories.php create mode 100644 inventory/manage/items.php create mode 100644 inventory/manage/locations.php create mode 100644 inventory/manage/movement_types.php create mode 100644 inventory/prices.php create mode 100644 inventory/purchasing_data.php create mode 100644 inventory/reorder_level.php create mode 100644 inventory/transfers.php create mode 100644 inventory/view/index.php create mode 100644 inventory/view/view_adjustment.php create mode 100644 inventory/view/view_transfer.php create mode 100644 lang/en_US/LC_MESSAGES/en_US.mo create mode 100644 lang/en_US/stylesheet.css create mode 100644 lang/index.php create mode 100644 lang/installed_languages.inc create mode 100644 lang/new_language_template/LC_MESSAGES/empty.po create mode 100644 lang/new_language_template/stylesheet.css create mode 100644 manufacturing/includes/db/index.php create mode 100644 manufacturing/includes/db/work_centres_db.inc create mode 100644 manufacturing/includes/db/work_order_issues_db.inc create mode 100644 manufacturing/includes/db/work_order_produce_items_db.inc create mode 100644 manufacturing/includes/db/work_order_requirements_db.inc create mode 100644 manufacturing/includes/db/work_orders_db.inc create mode 100644 manufacturing/includes/db/work_orders_quick_db.inc create mode 100644 manufacturing/includes/index.php create mode 100644 manufacturing/includes/manufacturing_db.inc create mode 100644 manufacturing/includes/manufacturing_ui.inc create mode 100644 manufacturing/includes/work_order_issue_ui.inc create mode 100644 manufacturing/index.php create mode 100644 manufacturing/inquiry/bom_cost_inquiry.php create mode 100644 manufacturing/inquiry/index.php create mode 100644 manufacturing/inquiry/where_used_inquiry.php create mode 100644 manufacturing/manage/bom_edit.php create mode 100644 manufacturing/manage/index.php create mode 100644 manufacturing/manage/work_centres.php create mode 100644 manufacturing/search_work_orders.php create mode 100644 manufacturing/view/index.php create mode 100644 manufacturing/view/wo_issue_view.php create mode 100644 manufacturing/view/wo_production_view.php create mode 100644 manufacturing/view/work_order_view.php create mode 100644 manufacturing/work_order_add_finished.php create mode 100644 manufacturing/work_order_entry.php create mode 100644 manufacturing/work_order_issue.php create mode 100644 manufacturing/work_order_release.php create mode 100644 purchasing/allocations/index.php create mode 100644 purchasing/allocations/supplier_allocate.php create mode 100644 purchasing/allocations/supplier_allocation_main.php create mode 100644 purchasing/includes/db/grn_db.inc create mode 100644 purchasing/includes/db/index.php create mode 100644 purchasing/includes/db/invoice_db.inc create mode 100644 purchasing/includes/db/invoice_items_db.inc create mode 100644 purchasing/includes/db/po_db.inc create mode 100644 purchasing/includes/db/supp_payment_db.inc create mode 100644 purchasing/includes/db/supp_trans_db.inc create mode 100644 purchasing/includes/db/suppalloc_db.inc create mode 100644 purchasing/includes/db/suppliers_db.inc create mode 100644 purchasing/includes/index.php create mode 100644 purchasing/includes/po_class.inc create mode 100644 purchasing/includes/purchasing_db.inc create mode 100644 purchasing/includes/purchasing_ui.inc create mode 100644 purchasing/includes/supp_trans_class.inc create mode 100644 purchasing/includes/ui/grn_ui.inc create mode 100644 purchasing/includes/ui/index.php create mode 100644 purchasing/includes/ui/invoice_ui.inc create mode 100644 purchasing/includes/ui/po_ui.inc create mode 100644 purchasing/index.php create mode 100644 purchasing/inquiry/index.php create mode 100644 purchasing/inquiry/po_search.php create mode 100644 purchasing/inquiry/po_search_completed.php create mode 100644 purchasing/inquiry/supplier_allocation_inquiry.php create mode 100644 purchasing/inquiry/supplier_inquiry.php create mode 100644 purchasing/manage/index.php create mode 100644 purchasing/manage/suppliers.php create mode 100644 purchasing/po_entry_items.php create mode 100644 purchasing/po_receive_items.php create mode 100644 purchasing/supplier_credit.php create mode 100644 purchasing/supplier_credit_grns.php create mode 100644 purchasing/supplier_invoice.php create mode 100644 purchasing/supplier_invoice_grns.php create mode 100644 purchasing/supplier_payment.php create mode 100644 purchasing/supplier_trans_gl.php create mode 100644 purchasing/view/index.php create mode 100644 purchasing/view/view_grn.php create mode 100644 purchasing/view/view_po.php create mode 100644 purchasing/view/view_supp_credit.php create mode 100644 purchasing/view/view_supp_invoice.php create mode 100644 purchasing/view/view_supp_payment.php create mode 100644 reporting/fonts/Helvetica-Bold.afm create mode 100644 reporting/fonts/Helvetica-BoldOblique.afm create mode 100644 reporting/fonts/Helvetica-Oblique.afm create mode 100644 reporting/fonts/Helvetica.afm create mode 100644 reporting/fonts/Vera.afm create mode 100644 reporting/fonts/Vera.ttf create mode 100644 reporting/fonts/iqraa.afm create mode 100644 reporting/fonts/iqraa.ttf create mode 100644 reporting/includes/class.graphic.inc create mode 100644 reporting/includes/class.mail.inc create mode 100644 reporting/includes/class.pdf.inc create mode 100644 reporting/includes/doctext.inc create mode 100644 reporting/includes/doctext2.inc create mode 100644 reporting/includes/form_types.inc create mode 100644 reporting/includes/index.php create mode 100644 reporting/includes/pdf_report.inc create mode 100644 reporting/includes/reporting.inc create mode 100644 reporting/includes/reports_classes.inc create mode 100644 reporting/index.php create mode 100644 reporting/pdf_files/index.php create mode 100644 reporting/rep101.php create mode 100644 reporting/rep102.php create mode 100644 reporting/rep103.php create mode 100644 reporting/rep104.php create mode 100644 reporting/rep105.php create mode 100644 reporting/rep107.php create mode 100644 reporting/rep108.php create mode 100644 reporting/rep109.php create mode 100644 reporting/rep201.php create mode 100644 reporting/rep202.php create mode 100644 reporting/rep203.php create mode 100644 reporting/rep204.php create mode 100644 reporting/rep209.php create mode 100644 reporting/rep301.php create mode 100644 reporting/rep302.php create mode 100644 reporting/rep303.php create mode 100644 reporting/rep401.php create mode 100644 reporting/rep501.php create mode 100644 reporting/rep701.php create mode 100644 reporting/rep702.php create mode 100644 reporting/rep704.php create mode 100644 reporting/rep705.php create mode 100644 reporting/rep706.php create mode 100644 reporting/rep707.php create mode 100644 reporting/rep708.php create mode 100644 reporting/rep709.php create mode 100644 reporting/reports_main.php create mode 100644 sales/allocations/customer_allocate.php create mode 100644 sales/allocations/customer_allocation_main.php create mode 100644 sales/allocations/index.php create mode 100644 sales/credit_note_entry.php create mode 100644 sales/customer_credit_invoice.php create mode 100644 sales/customer_invoice.php create mode 100644 sales/customer_payments.php create mode 100644 sales/includes/cart_class.inc create mode 100644 sales/includes/db/branches_db.inc create mode 100644 sales/includes/db/credit_status_db.inc create mode 100644 sales/includes/db/cust_trans_db.inc create mode 100644 sales/includes/db/cust_trans_details_db.inc create mode 100644 sales/includes/db/custalloc_db.inc create mode 100644 sales/includes/db/customers_db.inc create mode 100644 sales/includes/db/index.php create mode 100644 sales/includes/db/payment_db.inc create mode 100644 sales/includes/db/sales_credit_db.inc create mode 100644 sales/includes/db/sales_invoice_db.inc create mode 100644 sales/includes/db/sales_order_db.inc create mode 100644 sales/includes/db/sales_types_db.inc create mode 100644 sales/includes/index.php create mode 100644 sales/includes/sales_db.inc create mode 100644 sales/includes/sales_ui.inc create mode 100644 sales/includes/ui/sales_credit_ui.inc create mode 100644 sales/includes/ui/sales_order_ui.inc create mode 100644 sales/index.php create mode 100644 sales/inquiry/customer_allocation_inquiry.php create mode 100644 sales/inquiry/customer_inquiry.php create mode 100644 sales/inquiry/index.php create mode 100644 sales/inquiry/sales_orders_view.php create mode 100644 sales/manage/credit_status.php create mode 100644 sales/manage/customer_branches.php create mode 100644 sales/manage/customers.php create mode 100644 sales/manage/index.php create mode 100644 sales/manage/sales_areas.php create mode 100644 sales/manage/sales_people.php create mode 100644 sales/manage/sales_types.php create mode 100644 sales/sales_order_entry.php create mode 100644 sales/view/index.php create mode 100644 sales/view/view_credit.php create mode 100644 sales/view/view_invoice.php create mode 100644 sales/view/view_receipt.php create mode 100644 sales/view/view_sales_order.php create mode 100644 sql/basic.sql create mode 100644 sql/en_US-demo.sql create mode 100644 sql/en_US-new.sql create mode 100644 sql/index.php create mode 100644 taxes/db/index.php create mode 100644 taxes/db/item_tax_types_db.inc create mode 100644 taxes/db/tax_groups_db.inc create mode 100644 taxes/db/tax_types_db.inc create mode 100644 taxes/index.php create mode 100644 taxes/item_tax_types.php create mode 100644 taxes/tax_calc.inc create mode 100644 taxes/tax_groups.php create mode 100644 taxes/tax_types.php create mode 100644 themes/aqua/default.css create mode 100644 themes/aqua/index.php create mode 100644 themes/aqua/renderer.php create mode 100644 themes/cool/default.css create mode 100644 themes/cool/index.php create mode 100644 themes/cool/renderer.php create mode 100644 themes/default/default.css create mode 100644 themes/default/images/logo_frontaccounting.jpg create mode 100644 themes/default/images/logo_frontaccounting.png create mode 100644 themes/default/images/spacer.png create mode 100644 themes/default/index.php create mode 100644 themes/default/login.css create mode 100644 themes/default/renderer.php diff --git a/access/index.php b/access/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/access/index.php @@ -0,0 +1,3 @@ + diff --git a/access/login.php b/access/login.php new file mode 100644 index 00000000..3f9a04af --- /dev/null +++ b/access/login.php @@ -0,0 +1,136 @@ + + + + + + <?php echo $app_title . " " . $version;?> + + + + + + + + + + + + + +
FrontAccounting
+ + + + + + + + + + + + + + + + + + + + + + + +


+ + + + + + + + + + + + + + + + + + + + +
+
 
+ +
+ + + diff --git a/access/logout.php b/access/logout.php new file mode 100644 index 00000000..f548aa97 --- /dev/null +++ b/access/logout.php @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + +
" alt="FrontAccounting" width="250" height="50" onload="fixPNG(this)">
 
+$app_title $version"; +?> +
 
+ " . _("Click here to Login Again.") . ""; +?> +
+
+ + + diff --git a/admin/backup/index.php b/admin/backup/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/admin/backup/index.php @@ -0,0 +1,3 @@ + diff --git a/admin/backups.php b/admin/backups.php new file mode 100644 index 00000000..dd73be6d --- /dev/null +++ b/admin/backups.php @@ -0,0 +1,274 @@ +" .$valid_paths); + end_page(); + exit; +} + +$db_name = $_SESSION["wa_current_user"]->company; +$msg = handle_form($db_connections[$db_name]); + +page(_("Backup and Restore Database")); + +//------------------------------------------------------------------------------- +start_form(true, true); + +$cmb = get_backup_file_combo(); +$compr = get_compr_combo(); + +echo " + +
+ + + + + + + + + + + + + + + + +
$msg 
" . _("Backup scripts") . "
$cmb + + + + + + + + + +
" . _("Compression") . "  $compr
 
 
 
 
+
" . _("Comments") . " (" . _("Create Backup") . ")
"; + +end_form(); + +//------------------------------------------------------------------------------------------------- + +end_page(); + + +function handle_form($conn) +{ + global $path_to_root; + //Generate Only + if (isset($_GET['c'])) + { + if ($_GET['c']=='g') + { + $filename = generate_backup($conn, $_GET['comp'], $_GET['comm']); + header("Location: backups.php?c=gs&fn=" . urlencode($filename)); + return ""; + } + //Generate and download + if ($_GET['c']=='gd') + { + $filename = generate_backup($conn); + header("Location: backups.php?c=ds&fn=" . urlencode($filename)); + return ""; + } + //Download the file + if ($_GET['c']=='d') + { + download_file($path_to_root . BACKUP_PATH . $_GET['fn']); + exit; + } + //Delete the file + if ($_GET['c']=='df') + { + $filename = $_GET['fn']; + @unlink($path_to_root . BACKUP_PATH . $filename); + header("Location: backups.php?c=dff&fn=" . urlencode($filename)); + return ""; + } + if ($_GET['c']=='dff') + { + $msg = _("File successfully deleted.")."   "; + $msg .= _("Filename") . " = " . $_GET['fn']; + return $msg; + } + //Write JS script to open download window + if ($_GET['c']=='ds') + { + $filename = urlencode($_GET['fn']); + $msg = _("Backup is being downloaded..."); + $msg .= ""; + return $msg; + } + //Print backup success message + if ($_GET['c']=='gs') + { + $msg = _("Backup successfully generated.")."   "; + $msg .= _("Filename") . " = " . $_GET['fn']; + return $msg; + } + //Restore backup + if ($_GET['c']=='r') + { + $filename=$_GET['fn']; + restore_backup($path_to_root . BACKUP_PATH . $filename, $conn); + header("Location: backups.php?c=rs&fn=" . urlencode($filename)); + return ""; + } + //Print restore success message + if ($_GET['c']=='rs') + { + $msg = _("Restore backup completed.")."   "; + return $msg; + } + + if ($_GET['c']=='u') + { + $filename = $_FILES['uploadfile']['tmp_name']; + if (is_uploaded_file ($filename)) + { + restore_backup($filename, $conn); + $msg = _("Uploaded file has been restored."); + } + else + { + $msg = _("Backup was not uploaded into the system."); + } + return $msg; + } + } + return ""; +} + +function generate_backup($conn, $ext='no', $comm='') +{ + if ($conn['tbpref'] != "") + $filename = $conn['dbname'] . "_" . $conn['tbpref'] . date("Ymd_Hi") . ".sql"; + else + $filename = $conn['dbname'] . "_" . date("Ymd_Hi") . ".sql"; + + $filename = db_export($conn, $filename, $ext, $comm); + + return $filename; +} + +function restore_backup($filename, $conn) +{ + return db_import($filename, $conn); +} + +function get_backup_file_combo() +{ + global $path_to_root; + $ar_files = array(); + + $dh = opendir($path_to_root . BACKUP_PATH); + while (($file = readdir($dh)) !== false) + $ar_files[] = $file; + closedir($dh); + + rsort($ar_files); + $opt_files = ""; + foreach ($ar_files as $file) + if (strpos($file, ".sql") || strpos($file, ".sql")) + $opt_files .= ""; + + return ""; +} + +function get_compr_combo() +{ + $ar_comps = array(); + + $ar_comps[] = _("No"); + if (function_exists("gzcompress")) + $ar_comps[] = "zip"; + if (function_exists("gzopen")) + $ar_comps[] = "gzip"; + $opt_comps = ""; + foreach ($ar_comps as $file) + $opt_comps .= ""; + + return ""; +} + +function download_file($filename) +{ + if (empty($filename) || !file_exists($filename)) + { + return FALSE; + } + $saveasname = basename($filename); + header('Content-type: application/octet-stream'); + header('Content-Length: '.filesize($filename)); + header('Content-Disposition: attachment; filename="'.$saveasname.'"'); + readfile($filename); + return true; +} + +function valid_paths() +{ + global $path_to_root; + + $st = ""; + if (!file_exists($path_to_root . BACKUP_PATH)) + $st .= "   - " . _("cannot find backup directory") . " - " . $path_to_root . BACKUP_PATH . "
"; + return $st; +} + +?> \ No newline at end of file diff --git a/admin/company_preferences.php b/admin/company_preferences.php new file mode 100644 index 00000000..b4c98781 --- /dev/null +++ b/admin/company_preferences.php @@ -0,0 +1,117 @@ + diff --git a/admin/create_coy.php b/admin/create_coy.php new file mode 100644 index 00000000..ed557b6d --- /dev/null +++ b/admin/create_coy.php @@ -0,0 +1,294 @@ +company; + + echo " + "; + start_table($table_style); + + $th = array(_("Company"), _("Database Host"), _("Database User"), + _("Database Name"), _("Table Pref"), _("Default"), "", ""); + table_header($th); + + $k=0; + $conn = $db_connections; + $n = count($conn); + for ($i = 0; $i < $n; $i++) + { + if ($i == $def_coy) + $what = _("Yes"); + else + $what = _("No"); + if ($i == $coyno) + start_row("class='stockmankobg'"); + else + alt_table_row_color($k); + + label_cell($conn[$i]['name']); + label_cell($conn[$i]['host']); + label_cell($conn[$i]['dbuser']); + label_cell($conn[$i]['dbname']); + label_cell($conn[$i]['tbpref']); + label_cell($what); + label_cell("" . _("Edit") . ""); + if ($i != $coyno) + label_cell("" . _("Delete") . ""); + end_row(); + } + + end_table(); + display_note(_("The marked company is the current company which cannot be deleted."), 0, 0, "class='currentfg'"); +} + +//--------------------------------------------------------------------------------------------- + +function display_company_edit($selected_id) +{ + global $def_coy, $db_connections, $tb_pref_counter, $table_style2; + + if ($selected_id != -1) + $n = $selected_id; + else + $n = count($db_connections); + + start_form(true, true); + + echo " + "; + + start_table($table_style2); + + if ($selected_id != -1) + { + $conn = $db_connections[$selected_id]; + $_POST['name'] = $conn['name']; + $_POST['host'] = $conn['host']; + $_POST['dbuser'] = $conn['dbuser']; + $_POST['dbpassword'] = $conn['dbpassword']; + $_POST['dbname'] = $conn['dbname']; + $_POST['tbpref'] = $conn['tbpref']; + if ($selected_id == $def_coy) + $_POST['def'] = true; + else + $_POST['def'] = false; + $_POST['dbcreate'] = false; + hidden('selected_id', $selected_id); + hidden('tbpref', $_POST['tbpref']); + hidden('dbpassword', $_POST['dbpassword']); + } + else + $_POST['tbpref'] = $tb_pref_counter."_"; + text_row_ex(_("Company"), 'name', 20); + text_row_ex(_("Host"), 'host', 20); + text_row_ex(_("Database User"), 'dbuser', 20); + if ($selected_id == -1) + text_row_ex(_("Database Password"), 'dbpassword', 20); + text_row_ex(_("Database Name"), 'dbname', 20); + if ($selected_id == -1) + yesno_list_row(_("Table Pref"), 'tbpref', 1, $_POST['tbpref'], _("None"), false); + else + label_row(_("Table Pref"), $_POST['tbpref']); + yesno_list_row(_("Default"), 'def', null, "", "", false); + + start_row(); + label_cell(_("Database Script")); + label_cell(""); + end_row(); + + text_row_ex(_("New script Admin Password"), 'admpassword', 20); + + end_table(); + display_note(_("Choose from Database scripts in SQL folder. No Datase is created without a script."), 0, 1); + echo "
"; + + + end_form(); +} + + +//--------------------------------------------------------------------------------------------- + +if (isset($_GET['c']) && $_GET['c'] == 'df') +{ + + handle_delete(); +} + +if (isset($_GET['c']) && $_GET['c'] == 'u') +{ + if (handle_submit()) + { + meta_forward($_SERVER['PHP_SELF']); + } +} + + +//--------------------------------------------------------------------------------------------- + +display_companies(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("Create a new company")); + +display_company_edit($selected_id); + +//--------------------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/admin/db/company_db.inc b/admin/db/company_db.inc new file mode 100644 index 00000000..ff04a3f3 --- /dev/null +++ b/admin/db/company_db.inc @@ -0,0 +1,163 @@ + \ No newline at end of file diff --git a/admin/db/index.php b/admin/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/admin/db/index.php @@ -0,0 +1,3 @@ + diff --git a/admin/db/maintenance_db.inc b/admin/db/maintenance_db.inc new file mode 100644 index 00000000..c525f900 --- /dev/null +++ b/admin/db/maintenance_db.inc @@ -0,0 +1,623 @@ + "; + for ($i = 0; $i < $n; $i++) + { + if ($i > 0) + $msg .= "\tarray "; + else + $msg .= "array "; + $msg .= "('name' => '" . $db_connections[$i]['name'] . "',\n"; + $msg .= "\t\t'host' => '" . $db_connections[$i]['host'] . "',\n"; + $msg .= "\t\t'dbuser' => '" . $db_connections[$i]['dbuser'] . "',\n"; + $msg .= "\t\t'dbpassword' => '" . $db_connections[$i]['dbpassword'] . "',\n"; + $msg .= "\t\t'dbname' => '" . $db_connections[$i]['dbname'] . "',\n"; + $msg .= "\t\t'tbpref' => '" . $db_connections[$i]['tbpref'] . "')"; + if ($i != $n - 1) + $msg .= ","; + $msg .= "\n\n"; + } + $msg .= "\t);\n?>"; + + $filename = $path_to_root . "/config_db.php"; + // Check if the file exists and is writable first. + if (file_exists($filename) && is_writable($filename)) + { + if (!$zp = fopen($filename, 'w')) + { + return -1; + } + else + { + if (!fwrite($zp, $msg)) + { + fclose($zp); + return -2; + } + // Close file + fclose($zp); + } + } + else + { + return -3; + } + return 0; +} + +function db_create_db($connection) +{ + $db = mysql_connect($connection["host"] , + $connection["dbuser"], $connection["dbpassword"]); + if (!mysql_select_db($connection["dbname"], $db)) + { + $sql = "CREATE DATABASE " . $connection["dbname"] . ""; + if (!mysql_query($sql)) + return 0; + mysql_select_db($connection["dbname"], $db); + } + return $db; +} + +function db_drop_db($connection) +{ + if ($connection["tbpref"] == "") + { + $sql = "DROP DATABASE " . $connection["dbname"] . ""; + return mysql_query($sql); + } + else + { + $res = db_query("show table status"); + $all_tables = array(); + while($row = db_fetch($res)) + $all_tables[] = $row; + // get table structures + foreach ($all_tables as $table) + { + if (strpos($table['Name'], $connection["tbpref"]) !== false) + db_query("DROP TABLE `".$table['Name'] . "`"); + } + //deleting the tables, how?? + return true; + } +} + +function db_import($filename, $connection) +{ + $data_queries = array(); + $drop_queries = array(); + $table_queries = array(); + + // uncrompress gziped backup files + if (strpos($filename, ".gzip") || strpos($filename, ".GZIP")) + $lines = db_ungzip("lines", $filename); + elseif (strpos($filename, ".zip") || strpos($filename, ".ZIP")) + $lines = db_unzip("lines", $filename); + else + $lines = file("". $filename); + + // divide insert and create sql queries + // $table is set to TRUE if the next line belongs to a create sql query + $table = false; + foreach($lines as $line) + { + $line = trim($line); + + $line = str_replace("0_", $connection["tbpref"], $line); + // the last line did not belong to a 'create' sql query + if (!$table) + { + + // this line does not, too + if (strtolower(substr($line,0,6)) == "insert") + { + $data_queries[] = substr($line, 0, strlen($line) - 1); + + // this line does not, too + } + elseif (strtolower(substr($line, 0, 20)) == "drop table if exists") + { + $drop_queries[] = substr($line, 0, strlen($line) - 1); + + // this line does! + } + elseif (strtolower(substr($line, 0, 6)) == "create") + { + $table = true; + $table_queries[] = $line . "\n"; + } + + // the current line belongs to a create sql query + } + else + { + + // create sql query ending in this line + if (strtolower(substr($line, 0, 1)) == ")") + $table = false; + $table_queries[count($table_queries) - 1] .= $line . "\n"; + } + } + + $sql_error = false; + + // execute drop tables if exists queries + if (is_array($drop_queries)) + { + foreach($drop_queries as $drop_query) + { + $sql_error = false; + if (!db_query($drop_query)) + { + $sql_error = true; + //if ($CONF['import_error']) echo nl2br($drop_query)."\n
".mysql_error()."

\n"; + } + } + } + + // execute create tables queries + if (is_array($table_queries)) + { + foreach($table_queries as $table_query) + { + $sql_error = false; + if (!db_query($table_query)) + { + $sql_error = true; + //if ($CONF['import_error']) echo nl2br($table_query)."\n
".mysql_error()."

\n"; + } + } + } + + // execute insert data queries + if (is_array($data_queries)) + { + foreach($data_queries as $data_query) + { + $sql_error = false; + if (!db_query($data_query)) + { + //if ($CONF['import_error']) echo $data_query."\n
".mysql_error()."

\n"; + $sql_error = true; + } + } + } + + // show number successful executed querys or if an error did occur + if ($sql_error == 1) + return false; + //echo "
".IM_ERROR.".
\n"; + else + return true; + //echo "
".IM_SUCCESS." ".count($table_queries)." ".IM_TABLES." ".count($data_queries)." ".IM_ROWS." (".$import_file.")
\n"; + //$shell_command = C_MYSQL_PATH . " -h $host -u $user -p{$password} $dbname < $filename"; + //shell_exec($shell_command); +} + +// returns the content of the gziped $path backup file. use of $mode see below +function db_ungzip($mode, $path) +{ + $file_data = gzfile($path); + // returns one string or an array of lines + if ($mode != "lines") + return implode("",$file_data); + else + return $file_data; +} + +// returns the content of the ziped $path backup file. use of $mode see below +function db_unzip($mode, $path) +{ + $all = false; + $all = implode("", file($path)); + + // convert path to name of ziped file + $filename = ereg_replace(".*/", "", $path); + $filename = substr($filename, 0, strlen($filename) - 4); + + // compare filname in zip and filename from $_GET + if (substr($all, 30, strlen($filename)) != $filename) + { + return ''; + // exit if names differ + //echo F_WRONG_FILE."."; + //exit; + } + else + { + // get the suffix of the filename in hex + $crc_bugfix = substr(substr($filename, 0, strlen($filename) - 4), strlen($filename) - 12 - 4); + $suffix = false; + + // convert hex to ascii + for ($i=0; $i < 12; ) + $suffix .= chr($crc_bugfix[$i++] . $crc_bugfix[$i++] . $crc_bugfix[$i++]); + + // remove central directory information (we have always just one ziped file) + $comp = substr($all, -(strlen($all) - 30 - strlen($filename))); + $comp = substr($comp, 0, (strlen($comp) - 80 - strlen($filename))); + + // fix the crc bugfix (see function save_to_file) + $comp = "xœ" . $comp . $suffix; + $file_data = gzuncompress($comp); + } + + // returns one string or an array of lines + if ($mode != "lines") + return $file_data; + else + return explode("\n", $file_data); +} + +// generates a dump of $db database +// $drop and $zip tell if to include the drop table statement or dry to pack +function db_export($conn, $filename, $zip='no', $comment='') +{ + + global $app_title, $version, $power_url, $path_to_root; + + $error = false; + + // set max string size before writing to file + $max_size = 1048576 * 2; // 2 MB + // changes max size if value can be retrieved + if (ini_get("memory_limit")) + $max_size = 900000 * ini_get("memory_limit"); + + // set backupfile name + if ($zip == "gzip") + $backupfile = $filename . ".gz"; + elseif ($zip == "zip") + $backupfile = $filename . ".zip"; + else + $backupfile = $filename; + $company = get_company_pref('coy_name'); + //create comment + $out="# MySQL dump of database '".$conn["dbname"]."' on host '".$conn["host"]."'\n"; + $out.="# Backup Date and Time: ".date("Y-m-d H:i")."\n"; + $out.="# Built by " . $app_title . " " . $version ."\n"; + $out.="# ".$power_url."\n"; + $out.="# Company: ".$company."\n"; + $out.="# User: ".$_SESSION["wa_current_user"]->name."\n\n"; + + // write users comment + if ($comment) + { + $out .= "# Comment:\n"; + $comment=preg_replace("'\n'","\n# ","# ".$comment); + //$comment=str_replace("\n", "\n# ", $comment); + foreach(explode("\n",$comment) as $line) + $out .= $line."\n"; + $out.="\n"; + } + + //$out.="use ".$db.";\n"; we don't use this option. + + // get auto_increment values and names of all tables + $res = db_query("show table status"); + $all_tables = array(); + while($row = db_fetch($res)) + { + if ($conn["tbpref"] == "" || strpos($row['Name'], $conn["tbpref"]) !== false) + $all_tables[] = $row; + } + // get table structures + foreach ($all_tables as $table) + { + $res1 = db_query("SHOW CREATE TABLE `" . $table['Name'] . "`"); + $tmp = db_fetch($res1); + $table_sql[$table['Name']] = $tmp["Create Table"]; + } + + // find foreign keys + $fks = array(); + if (isset($table_sql)) + { + foreach($table_sql as $tablenme=>$table) + { + $tmp_table=$table; + // save all tables, needed for creating this table in $fks + while (($ref_pos = strpos($tmp_table, " REFERENCES ")) > 0) + { + $tmp_table = substr($tmp_table, $ref_pos + 12); + $ref_pos = strpos($tmp_table, "("); + $fks[$tablenme][] = substr($tmp_table, 0, $ref_pos); + } + } + } + // order $all_tables + $all_tables = order_sql_tables($all_tables, $fks); + + // as long as no error occurred + if (!$error) + { + //while($row=@mysql_fetch_array($res)) + foreach ($all_tables as $row) + { + $tablename = $row['Name']; + $auto_incr[$tablename] = $row['Auto_increment']; + + $out.="\n\n"; + // export tables + $out.="### Structure of table `".$tablename."` ###\n\n"; + + $out.="DROP TABLE IF EXISTS `".$tablename."`;\n\n"; + $out.=$table_sql[$tablename]; + + // add auto_increment value + if ($auto_incr[$tablename]) + $out.=" AUTO_INCREMENT=".$auto_incr[$tablename]; + $out.=" ;"; + $out.="\n\n\n"; + + // export data + if (!$error) + { + $out.="### Data of table `".$tablename."` ###\n\n"; + + // check if field types are NULL or NOT NULL + $res3 = db_query("SHOW COLUMNS FROM `" . $tablename . "`"); + + $field_type = array(); + for ($j = 0; $j < db_num_rows($res3); $j++) + { + $row3 = db_fetch($res3); + $field_type[] = $row3[2]; + } + + $res2 = db_query("SELECT * FROM `" . $tablename . "`"); + for ($j = 0; $j < db_num_rows($res2); $j++) + { + $out .= "INSERT INTO `" . $tablename . "` VALUES ("; + $row2 = db_fetch_row($res2); + // run through each field + for ($k = 0; $k < $nf = db_num_fields($res2); $k++) + { + // identify null values and save them as null instead of '' + if ($field_type[$k] != "" && $row2[$k] == "") + $out .= "NULL"; + else + $out .= "'" . db_escape($row2[$k]) . "'"; + if ($k < ($nf - 1)) + $out .= ", "; + } + $out .= ");\n"; + + // if saving is successful, then empty $out, else set error flag + if (strlen($out) > $max_size && $zip != "zip") + { + if (save_to_file($backupfile, $zip, $out)) + $out = ""; + else + $error = true; + } + } + + // an error occurred! Try to delete file and return error status + } + elseif ($error) + { + @unlink($path_to_root . BACKUP_PATH . $backupfile); + return false; + } + + // if saving is successful, then empty $out, else set error flag + if (strlen($out) > $max_size && $zip != "zip") + { + if (save_to_file($backupfile, $zip, $out)) + $out= ""; + else + $error = true; + } + } + + // an error occurred! Try to delete file and return error status + } + else + { + @unlink($path_to_root . BACKUP_PATH . $backupfile); + return false; + } + + // if (mysql_error()) return "DB_ERROR"; + //@mysql_close($con); + + //if ($zip == "zip") + // $zip = $time; + if (save_to_file($backupfile, $zip, $out)) + { + $out = ""; + } + else + { + @unlink($path_to_root . BACKUP_PATH . $backupfile); + return false; + } + return $backupfile; +} + +// orders the tables in $tables according to the constraints in $fks +// $fks musst be filled like this: $fks[tablename][0]=needed_table1; $fks[tablename][1]=needed_table2; ... +function order_sql_tables($tables, $fks) +{ + // do not order if no contraints exist + if (!count($fks)) + return $tables; + + // order + $new_tables = array(); + $existing = array(); + $modified = true; + while (count($tables) && $modified == true) + { + $modified = false; + foreach ($tables as $key=>$row) + { + // delete from $tables and add to $new_tables + if (isset($fks[$row['Name']])) + { + foreach($fks[$row['Name']] as $needed) + { + // go to next table if not all needed tables exist in $existing + if (!in_array($needed,$existing)) + continue 2; + } + } + // delete from $tables and add to $new_tables + $existing[] = $row['Name']; + $new_tables[] = $row; + prev($tables); + unset($tables[$key]); + $modified = true; + + } + } + + if (count($tables)) + { + // probably there are 'circles' in the constraints, bacause of that no proper backups can be created yet + // TODO: this will be fixed sometime later through using 'alter table' commands to add the constraints after generating the tables + // until now, just add the lasting tables to $new_tables, return them and print a warning + foreach($tables as $row) + $new_tables[] = $row; + echo "
THIS DATABASE SEEMS TO CONTAIN 'RING CONSTRAINTS'. WA DOES NOT SUPPORT THEM. PROBABLY THE FOLOWING BACKUP IS DEFECT!
"; + } + return $new_tables; +} + +// saves the string in $fileData to the file $backupfile as gz file or not ($zip) +// returns backup file name if name has changed (zip), else TRUE. If saving failed, return value is FALSE +function save_to_file($backupfile, $zip, $fileData) +{ + global $path_to_root; + + if ($zip == "gzip") + { + if ($zp = @gzopen($path_to_root . BACKUP_PATH . $backupfile, "a9")) + { + @gzwrite($zp, $fileData); + @gzclose($zp); + return true; + } + else + { + return false; + } + + // $zip contains the timestamp + } + elseif ($zip == "zip") + { + // based on zip.lib.php 2.2 from phpMyBackupAdmin + // offical zip format: http://www.pkware.com/appnote.txt + + // End of central directory record + $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; + + // "local file header" segment + $unc_len = strlen($fileData); + $crc = crc32($fileData); + $zdata = gzcompress($fileData); + + // string needed for decoding (because of crc bug) + //$name_suffix = substr($zdata, -4, 4); + //$name_suffix2 = "_"; + //for ($i = 0; $i < 4; $i++) + // $name_suffix2 .= sprintf("%03d", ord($name_suffix[$i])); + //$backupfile = substr($backupfile, 0, strlen($backupfile) - 8) . $name_suffix2 . ".sql.zip"; + $name = substr($backupfile, 0, strlen($backupfile) -4); + + // fix crc bug + $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); + $c_len = strlen($zdata); + + // dos time + $timearray = getdate($zip); + $dostime = (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | + ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); + $dtime = dechex($dostime); + $hexdtime = "\x" . $dtime[6] . $dtime[7] . "\x" . $dtime[4].$dtime[5] . "\x" . $dtime[2] . $dtime[3] . "\x" . $dtime[0] . $dtime[1]; + eval('$hexdtime="' . $hexdtime . '";'); + + // ver needed to extract, gen purpose bit flag, compression method, last mod time and date + $sub1 = "\x14\x00" . "\x00\x00" . "\x08\x00" . $hexdtime; + + // crc32, compressed filesize, uncompressed filesize + $sub2 = pack('V', $crc) . pack('V', $c_len) . pack('V', $unc_len); + + $fr = "\x50\x4b\x03\x04" . $sub1. $sub2; + + // length of filename, extra field length + $fr .= pack('v', strlen($name)) . pack('v', 0); + $fr .= $name; + + // "file data" segment and "data descriptor" segment (optional but necessary if archive is not served as file) + $fr .= $zdata . $sub2; + + // now add to central directory record + $cdrec = "\x50\x4b\x01\x02"; + $cdrec .= "\x00\x00"; // version made by + $cdrec .= $sub1 . $sub2; + + // length of filename, extra field length, file comment length, disk number start, internal file attributes, external file attributes - 'archive' bit set, offset + $cdrec .= pack('v', strlen($name)) . pack('v', 0) . pack('v', 0) . pack('v', 0) . pack('v', 0) . pack('V', 32) . pack('V',0); + $cdrec .= $name; + + // combine data + $fileData = $fr . $cdrec . $eof_ctrl_dir; + + // total # of entries "on this disk", total # of entries overall, size of central dir, offset to start of central dir, .zip file comment length + $fileData .= pack('v', 1) . pack('v', 1) . pack('V', strlen($cdrec)) . pack('V', strlen($fr)) . "\x00\x00"; + + if ($zp = @fopen($path_to_root . BACKUP_PATH . $backupfile, "a")) + { + @fwrite($zp, $fileData); + @fclose($zp); + return true; + } + else + { + return false; + } + + // uncompressed + } + else + { + if ($zp = @fopen($path_to_root . BACKUP_PATH . $backupfile, "a")) + { + @fwrite($zp, $fileData); + @fclose($zp); + return true; + } + else + { + return false; + } + } +} + + +?> \ No newline at end of file diff --git a/admin/db/users_db.inc b/admin/db/users_db.inc new file mode 100644 index 00000000..694b49d7 --- /dev/null +++ b/admin/db/users_db.inc @@ -0,0 +1,110 @@ + \ No newline at end of file diff --git a/admin/db/v_banktrans.inc b/admin/db/v_banktrans.inc new file mode 100644 index 00000000..9b254e83 --- /dev/null +++ b/admin/db/v_banktrans.inc @@ -0,0 +1,42 @@ +Checking bank transactions........."); + + // check that the account in the trans is actually a P/L account + $sql = "SELECT * FROM ".TB_PREF."bank_trans,".TB_PREF."chart_master, ".TB_PREF."chart_types + WHERE ".TB_PREF."bank_trans.bank_act=".TB_PREF."chart_master.account_code + AND ".TB_PREF."chart_master.account_type=".TB_PREF."chart_types.id + AND (".TB_PREF."chart_types.class_id = 1 OR ".TB_PREF."chart_types.class_id = 2)"; + + $result = db_query($sql); + if (db_num_rows($result) > 0) + { + dump_msg("There are bank transactions with accounts that are not Profit&Loss"); + } + + $sql = "SELECT * FROM ".TB_PREF."bank_trans"; + $result = db_query($sql); + while ($banktrans = db_fetch($result)) + { + // make sure bank_act is valid + $get = get_gl_account($banktrans["bank_act"]); + if ($get == null) + dump_msg("Invalid Bank Account for bank trans " . $banktrans["id"]); + + // make sure the type is valid + $get = get_bank_trans_type($banktrans["bank_trans_type_id"]); + if ($get == null) + dump_msg("Invalid bank_trans_type_id (" . $banktrans["bank_trans_type_id"] . ") for bank_trans " . $banktrans["id"]); + + if ($banktrans["type"] != 1 && $banktrans["type"] != 2 && $banktrans["type"] != 4 + && $banktrans["type"] != 22 && $banktrans["type"] != 12) + dump_msg("Invalid type for bank_trans " . $banktrans["id"]); + } +} + + +?> \ No newline at end of file diff --git a/admin/db/voiding_db.inc b/admin/db/voiding_db.inc new file mode 100644 index 00000000..5aef438d --- /dev/null +++ b/admin/db/voiding_db.inc @@ -0,0 +1,112 @@ + \ No newline at end of file diff --git a/admin/display_prefs.php b/admin/display_prefs.php new file mode 100644 index 00000000..01ee7b68 --- /dev/null +++ b/admin/display_prefs.php @@ -0,0 +1,97 @@ +code; + +languages_list_row(_("Language:"), 'language', $_POST['language']); + +end_table(1); + +submit_center('setprefs', _("Update")); + +end_form(2); + +//------------------------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/admin/fiscalyears.php b/admin/fiscalyears.php new file mode 100644 index 00000000..3701369a --- /dev/null +++ b/admin/fiscalyears.php @@ -0,0 +1,223 @@ += '$from' AND tran_date <= '$to'"; + $result = db_query($sql, "could not query gl_trans master"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this fiscal year because items have been created referring to it.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------- + +function handle_delete($todate) +{ + global $selected_id; + + if (!check_can_delete($todate)) + return; + //only delete if used in neither customer or supplier, comp prefs, bank trans accounts + + delete_fiscalyear($selected_id); + + meta_forward($_SERVER['PHP_SELF']); +} + +//--------------------------------------------------------------------------------------------- + +function display_fiscalyears() +{ + global $table_style; + + $company_year = get_company_pref('f_year'); + + $result = get_all_fiscalyears(); + + start_table($table_style); + + $th = array(_("Fiscal Year Begin"), _("Fiscal Year End"), _("Closed"), "", ""); + table_header($th); + + $k=0; + while ($myrow=db_fetch($result)) + { + if ($myrow['id'] == $company_year) + { + start_row("class='stockmankobg'"); + } + else + alt_table_row_color($k); + + $from = sql2date($myrow["begin"]); + $to = sql2date($myrow["end"]); + if ($myrow["closed"] == 0) + { + $closed_text = _("No"); + } + else + { + $closed_text = _("Yes"); + } + label_cell($from); + label_cell($to); + label_cell($closed_text); + edit_link_cell("selected_id=" . urlencode($from)); + if ($myrow["id"] != $company_year) + delete_link_cell("selected_id=" . urlencode($from) . "&to_date=" . urlencode($to) . "&delete=1"); + end_row(); + } + + end_table();; + display_note(_("The marked fiscal year is the current fiscal year which cannot be deleted."), 0, 0, "class='currentfg'"); +} + +//--------------------------------------------------------------------------------------------- + +function display_fiscalyear_edit($selected_id) +{ + global $table_style2; + + start_form(); + start_table($table_style2); + + if ($selected_id) + { + $myrow = get_fiscalyear($selected_id); + + $_POST['from_date'] = sql2date($myrow["begin"]); + $_POST['to_date'] = sql2date($myrow["end"]); + $_POST['closed'] = $myrow["closed"]; + hidden('selected_id', $selected_id); + hidden('from_date', $_POST['from_date']); + hidden('to_date', $_POST['to_date']); + label_row(_("Fiscal Year Begin:"), $_POST['from_date']); + label_row(_("Fiscal Year End:"), $_POST['to_date']); + } + else + { + text_row(_("Fiscal Year Begin:"), 'from_date', null, 15, 10); + text_row(_("Fiscal Year End:"), 'to_date', null, 15, 10); + } + + yesno_list_row(_("Is Closed:"), 'closed', null, "", "", false); + + end_table(1); + + submit_add_or_update_center(!isset($selected_id)); + + end_form(); +} + +//--------------------------------------------------------------------------------------------- + +if (isset($_POST['ADD_ITEM']) || isset($_POST['UPDATE_ITEM'])) +{ + if (handle_submit()) + { + meta_forward($_SERVER['PHP_SELF']); + } +} + +//--------------------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + handle_delete($_GET['to_date']); +} + +//--------------------------------------------------------------------------------------------- + +display_fiscalyears(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("Enter a New Fiscal Year")); + +display_fiscalyear_edit($selected_id); + +//--------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/admin/forms_setup.php b/admin/forms_setup.php new file mode 100644 index 00000000..66e54a38 --- /dev/null +++ b/admin/forms_setup.php @@ -0,0 +1,53 @@ + \ No newline at end of file diff --git a/admin/gl_setup.php b/admin/gl_setup.php new file mode 100644 index 00000000..16188854 --- /dev/null +++ b/admin/gl_setup.php @@ -0,0 +1,199 @@ + 100)) + { + display_error(_("The delivery over-receive allowance must be between 0 and 100.")); + return false; + } + + if (!is_numeric($_POST['po_over_charge']) || ($_POST['po_over_charge'] < 0) + || ($_POST['po_over_charge'] > 100)) + { + display_error(_("The invoice over-charge allowance must be between 0 and 100.")); + return false; + } + + if (!is_numeric($_POST['past_due_days']) || ($_POST['past_due_days'] < 0) + || ($_POST['past_due_days'] > 100)) + { + display_error(_("The past due days interval allowance must be between 0 and 100.")); + return false; + } + return true; +} + +//------------------------------------------------------------------------------------------------- + +if (isset($_POST['submit']) && can_process()) +{ + update_company_gl_setup($_POST['debtors_act'], $_POST['pyt_discount_act'], + $_POST['creditors_act'], $_POST['grn_act'], + $_POST['exchange_diff_act'], $_POST['purch_exchange_diff_act'], + $_POST['retained_earnings_act'], $_POST['freight_act'], + $_POST['default_sales_act'], + $_POST['default_sales_discount_act'], + $_POST['default_prompt_payment_act'], + $_POST['default_inventory_act'], + $_POST['default_cogs_act'], + $_POST['default_adj_act'], + $_POST['default_inv_sales_act'], + $_POST['default_assembly_act'], $_POST['payroll_act'], + check_value('allow_negative_stock'), + $_POST['po_over_receive'], + $_POST['po_over_charge'], + $_POST['past_due_days'], + $_POST['default_credit_limit'], + $_POST['default_workorder_required'], + $_POST['default_dim_required']); + + display_notification(_("The general GL setup has been updated.")); + +} /* end of if submit */ + +//------------------------------------------------------------------------------------------------- + +start_form(); +start_table("class='tablestyle'"); + +$myrow = get_company_prefs(); + +$_POST['debtors_act'] = $myrow["debtors_act"]; +$_POST['creditors_act'] = $myrow["creditors_act"]; +$_POST['grn_act'] = $myrow["grn_act"]; +$_POST['retained_earnings_act'] = $myrow["retained_earnings_act"]; +$_POST['freight_act'] = $myrow["freight_act"]; +$_POST['exchange_diff_act'] = $myrow["exchange_diff_act"]; + +$_POST['purch_exchange_diff_act'] = $myrow["purch_exchange_diff_act"]; +$_POST['pyt_discount_act'] = $myrow["pyt_discount_act"]; + +$_POST['default_sales_act'] = $myrow["default_sales_act"]; +$_POST['default_sales_discount_act'] = $myrow["default_sales_discount_act"]; +$_POST['default_prompt_payment_act'] = $myrow["default_prompt_payment_act"]; + +$_POST['default_inventory_act'] = $myrow["default_inventory_act"]; +$_POST['default_cogs_act'] = $myrow["default_cogs_act"]; +$_POST['default_adj_act'] = $myrow["default_adj_act"]; +$_POST['default_inv_sales_act'] = $myrow['default_inv_sales_act']; +$_POST['default_assembly_act'] = $myrow['default_assembly_act']; +$_POST['payroll_act'] = $myrow['payroll_act']; + +$_POST['allow_negative_stock'] = $myrow['allow_negative_stock']; + +$_POST['po_over_receive'] = $myrow['po_over_receive']; +$_POST['po_over_charge'] = $myrow['po_over_charge']; +$_POST['past_due_days'] = $myrow['past_due_days']; + +$_POST['default_credit_limit'] = $myrow['default_credit_limit']; + +$_POST['default_workorder_required'] = $myrow['default_workorder_required']; +$_POST['default_dim_required'] = $myrow['default_dim_required']; + +//echo ""; + +//--------------- + + +table_section_title(_("General GL")); + +gl_all_accounts_list_row(_("Retained Earning Clearing Account:"), 'retained_earnings_act', $_POST['retained_earnings_act']); +gl_all_accounts_list_row(_("Payroll Account:"), 'payroll_act', $_POST['payroll_act']); +text_row(_("Past Due Days Interval:"), 'past_due_days', $_POST['past_due_days'], 6, 6, "", _("days")); + +//--------------- + +table_section_title(_("Customers and Sales")); + +text_row(_("Default Credit Limit:"), 'default_credit_limit', $_POST['default_credit_limit'], 12, 12); + +gl_all_accounts_list_row(_("Sales Exchange Variances Account:"), 'exchange_diff_act', $_POST['exchange_diff_act']); + +gl_all_accounts_list_row(_("Shipping Charged Account:"), 'freight_act', $_POST['freight_act']); + +//--------------- + +table_section_title(_("Customers and Sales Defaults")); + +gl_all_accounts_list_row(_("Accounts Receivable Account:"), 'debtors_act', $_POST['debtors_act']); + +gl_all_accounts_list_row(_("Sales Account:"), 'default_sales_act', $_POST['default_sales_act']); + +gl_all_accounts_list_row(_("Sales Discount Account:"), 'default_sales_discount_act', $_POST['default_sales_discount_act']); + +gl_all_accounts_list_row(_("Prompt Payment Discount Account:"), 'default_prompt_payment_act', $_POST['default_prompt_payment_act']); + +//--------------- + +table_section_title(_("Suppliers and Purchasing")); + +percent_row(_("Delivery Over-Receive Allowance:"), 'po_over_receive'); + +percent_row(_("Invoice Over-Charge Allowance:"), 'po_over_charge'); + +gl_all_accounts_list_row(_("Purchases Exchange Variances Account:"), 'purch_exchange_diff_act', $_POST['purch_exchange_diff_act']); + +gl_all_accounts_list_row(_("Goods Received Clearing Account:"), 'grn_act', $_POST['grn_act']); + +table_section_title(_("Suppliers and Purchasing Defaults")); + +gl_all_accounts_list_row(_("Accounts Payable Account:"), 'creditors_act', $_POST['creditors_act']); + +gl_all_accounts_list_row(_("Purchase Discount Account:"), 'pyt_discount_act', $_POST['pyt_discount_act']); + +//--------------- + +table_section_title(_("Inventory Defaults")); + +check_row(_("Allow Negative Inventory:"), 'allow_negative_stock', null); + +gl_all_accounts_list_row(_("Sales Account:"), 'default_inv_sales_act', $_POST['default_inv_sales_act']); + +gl_all_accounts_list_row(_("Inventory Account:"), 'default_inventory_act', $_POST['default_inventory_act']); + +gl_all_accounts_list_row(_("C.O.G.S. Account:"), 'default_cogs_act', $_POST['default_cogs_act']); + +gl_all_accounts_list_row(_("Inventory Adjustments Account:"), 'default_adj_act', $_POST['default_adj_act']); + +gl_all_accounts_list_row(_("Item Assembly Costs Account:"), 'default_assembly_act', $_POST['default_assembly_act']); + +//---------------- + +table_section_title(_("Manufacturing Defaults")); + +text_row(_("Default Work Order Required By After:"), 'default_workorder_required', $_POST['default_workorder_required'], 6, 6, "", _("days")); + +//---------------- + +table_section_title(_("Dimension Defaults")); + +text_row(_("Default Dimension Required By After:"), 'default_dim_required', $_POST['default_dim_required'], 6, 6, "", _("days")); + +//---------------- + +end_table(1); + +submit_center('submit', _("Update")); + +end_form(2); + +//------------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,3 @@ + diff --git a/admin/inst_lang.php b/admin/inst_lang.php new file mode 100644 index 00000000..e5eae2e7 --- /dev/null +++ b/admin/inst_lang.php @@ -0,0 +1,349 @@ + $arySorted) + foreach ($aryData as $aryOriginal) + // if the key matches + if ($aryOriginal[$strIndex]==$arySortKey) + // add it to the output array + array_push($aryResult, $aryOriginal); + + // return the return + return $aryResult; +} + +function write_lang() +{ + global $path_to_root, $installed_languages; + include_once($path_to_root . "/lang/installed_languages.inc"); + + $conn = array_natsort($installed_languages, 'code', 'code'); + $installed_languages = $conn; + //reset($installed_languages); + $n = count($installed_languages); + $msg = " ')\n"; + $msg .= "-- 'code' should match the name of the directory for the language under \\lang\n"; + $msg .= "-- 'name' is the name that will be displayed in the language selection list (in Users and Display Setup)\n"; + $msg .= "-- 'rtl' only needs to be set for right-to-left languages like Arabic and Hebrew\n\n"; + $msg .= "*/\n\n\n"; + + $msg .= "\$installed_languages = array (\n"; + $msg .= "\t0 => "; + for ($i = 0; $i < $n; $i++) + { + if ($i > 0) + $msg .= "\t\tarray "; + else + $msg .= "array "; + $msg .= "('code' => '" . $installed_languages[$i]['code'] . "', "; + $msg .= "'name' => '" . $installed_languages[$i]['name'] . "', "; + $msg .= "'encoding' => '" . $installed_languages[$i]['encoding'] . "'"; + if (isset($installed_languages[$i]['rtl']) && $installed_languages[$i]['rtl']) + $msg .= ", 'rtl' => true),\n"; + else + $msg .= "),\n"; + } + $msg .= "\t);\n?>"; + + $filename = $path_to_root . "/lang/installed_languages.inc"; + // Check if the file exists and is writable first. + if (file_exists($filename) && is_writable($filename)) + { + if (!$zp = fopen($filename, 'w')) + { + display_error(_("Cannot open the languages file - ") . $filename); + return false; + } + else + { + if (!fwrite($zp, $msg)) + { + display_error(_("Cannot write to the language file - ") . $filename); + fclose($zp); + return false; + } + // Close file + fclose($zp); + } + } + else + { + display_error(_("The language file ") . $filename . _(" is not writable. Change its permissions so it is, then re-run the operation.")); + return false; + } + return true; +} + +//--------------------------------------------------------------------------------------------- + +function handle_submit() +{ + global $path_to_root, $installed_languages; + + if (!check_data()) + return false; + + $id = $_GET['id']; + + $installed_languages[$id]['code'] = $_POST['code']; + $installed_languages[$id]['name'] = $_POST['name']; + $installed_languages[$id]['encoding'] = $_POST['encoding']; + $installed_languages[$id]['rtl'] = (bool)$_POST['rtl']; + if (!write_lang()) + return false; + $directory = $path_to_root . "/lang/" . $_POST['code']; + if (!file_exists($directory)) + { + mkdir($directory); + mkdir($directory . "/LC_MESSAGES"); + } + if (is_uploaded_file($_FILES['uploadfile']['tmp_name'])) + { + $file1 = $_FILES['uploadfile']['tmp_name']; + $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".mo"; + if (file_exists($file2)) + unlink($file2); + move_uploaded_file($file1, $file2); + } + return true; +} + +//--------------------------------------------------------------------------------------------- + +function handle_delete() +{ + global $path_to_root, $installed_languages; + + $id = $_GET['id']; + + $lang = $installed_languages[$id]['code']; + $filename = "$path_to_root/lang/$lang/LC_MESSAGES"; + if ($h = opendir($filename)) + { + while (($file = readdir($h)) !== false) + { + if (is_file("$filename/$file")) + unlink("$filename/$file"); + } + closedir($h); + } + rmdir($filename); + $filename = "$path_to_root/lang/$lang"; + if ($h = opendir($filename)) + { + while (($file = readdir($h)) !== false) + { + if (is_file("$filename/$file")) + unlink("$filename/$file"); + } + closedir($h); + } + rmdir($filename); + + unset($installed_languages[$id]); + $conn = array_values($installed_languages); + $installed_languages = $conn; + + //$$db_connections = array_values($db_connections); + + if (!write_lang()) + return; + meta_forward($_SERVER['PHP_SELF']); +} + +//--------------------------------------------------------------------------------------------- + +function display_languages() +{ + global $table_style, $installed_languages; + + $lang = $_SESSION["language"]->code; + + echo " + "; + start_table($table_style); + $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"), "", ""); + table_header($th); + + $k = 0; + $conn = $installed_languages; + $n = count($conn); + for ($i = 0; $i < $n; $i++) + { + if ($conn[$i]['code'] == $lang) + start_row("class='stockmankobg'"); + else + alt_table_row_color($k); + + label_cell($conn[$i]['code']); + label_cell($conn[$i]['name']); + label_cell($conn[$i]['encoding']); + if (isset($conn[$i]['rtl']) && $conn[$i]['rtl']) + $rtl = _("Yes"); + else + $rtl = _("No"); + label_cell($rtl); + edit_link_cell("selected_id=" . $i); + if ($conn[$i]['code'] != $lang) + label_cell("" . _("Delete") . ""); + end_row(); + } + + end_table(); + display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'"); +} + +//--------------------------------------------------------------------------------------------- + +function display_language_edit($selected_id) +{ + global $installed_languages, $table_style2; + + if ($selected_id != -1) + $n = $selected_id; + else + $n = count($installed_languages); + + start_form(true, true); + + echo " + "; + + start_table($table_style2); + + if ($selected_id != -1) + { + $conn = $installed_languages[$selected_id]; + $_POST['code'] = $conn['code']; + $_POST['name'] = $conn['name']; + $_POST['encoding'] = $conn['encoding']; + if (isset($conn['rtl'])) + $_POST['rtl'] = $conn['rtl']; + else + $_POST['rtl'] = false; + hidden('selected_id', $selected_id); + } + text_row_ex(_("Language"), 'code', 20); + text_row_ex(_("Name"), 'name', 20); + text_row_ex(_("Encoding"), 'encoding', 20); + + yesno_list_row(_("Right To Left"), 'rtl', null, "", "", false); + + label_row(_("Language File"), ""); + + end_table(0); + display_note(_("Select your language MO file from your local harddisk."), 0, 1); + echo "
"; + + + end_form(); +} + + +//--------------------------------------------------------------------------------------------- + +if (isset($_GET['c'])) +{ + if ($_GET['c'] == 'df') + { + handle_delete(); + } + + if ($_GET['c'] == 'u') + { + if (handle_submit()) + { + //meta_forward($_SERVER['PHP_SELF']); + } + } +} + +//--------------------------------------------------------------------------------------------- + +display_languages(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("Create a new language")); + +display_language_edit($selected_id); + +//--------------------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/admin/payment_terms.php b/admin/payment_terms.php new file mode 100644 index 00000000..cf46b906 --- /dev/null +++ b/admin/payment_terms.php @@ -0,0 +1,223 @@ + 30 && !check_value('DaysOrFoll')) + { + $inpug_error = 1; + display_error( _("When the check box to indicate a day in the following month is the due date, the due date cannot be a day after the 30th. A number between 1 and 30 is expected.")); + } + elseif ($_POST['DayNumber'] > 500 && check_value('DaysOrFoll')) + { + $inpug_error = 1; + display_error( _("When the check box is not checked to indicate that the term expects a number of days after which accounts are due, the number entered should be less than 500 days.")); + } + + if ($_POST['DayNumber'] == '') + $_POST['DayNumber'] = 0; + + if ($inpug_error != 1) + { + if (isset($selected_id)) + { + if (check_value('DaysOrFoll')) + { + $sql = "UPDATE ".TB_PREF."payment_terms SET terms='" . $_POST['terms'] . "', + day_in_following_month=0, + days_before_due=" . $_POST['DayNumber'] . " + WHERE terms_indicator = '" . $selected_id . "'"; + } + else + { + $sql = "UPDATE ".TB_PREF."payment_terms SET terms='" . $_POST['terms'] . "', + day_in_following_month=" . $_POST['DayNumber'] . ", + days_before_due=0 + WHERE terms_indicator = '" . $selected_id . "'"; + } + + } + else + { + + if (check_value('DaysOrFoll')) + { + $sql = "INSERT INTO ".TB_PREF."payment_terms (terms, + days_before_due, day_in_following_month) + VALUES ('" . + $_POST['terms'] . "', " . $_POST['DayNumber'] . ", 0)"; + } + else + { + $sql = "INSERT INTO ".TB_PREF."payment_terms (terms, + days_before_due, day_in_following_month) + VALUES ('" . $_POST['terms'] . "', + 0, " . $_POST['DayNumber'] . ")"; + } + + } + //run the sql from either of the above possibilites + db_query($sql,"The payment term could not be added or updated"); + + meta_forward($_SERVER['PHP_SELF']); + } +} + +if (isset($_GET['delete'])) +{ + // PREVENT DELETES IF DEPENDENT RECORDS IN debtors_master + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."debtors_master WHERE payment_terms = '$selected_id'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this payment term, because customer accounts have been created referring to this term.")); + } + else + { + $sql= "SELECT COUNT(*) FROM ".TB_PREF."suppliers WHERE payment_terms = '$selected_id'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this payment term, because supplier accounts have been created referring to this term")); + } + else + { + //only delete if used in neither customer or supplier accounts + + $sql="DELETE FROM ".TB_PREF."payment_terms WHERE terms_indicator='$selected_id'"; + db_query($sql,"could not delete a payment terms"); + + meta_forward($_SERVER['PHP_SELF']); + } + } + //end if payment terms used in customer or supplier accounts +} + +//------------------------------------------------------------------------------------------------- + +$sql = "SELECT * FROM ".TB_PREF."payment_terms"; +$result = db_query($sql,"could not get payment terms"); + +start_table($table_style); +$th = array(_("Description"), _("Following Month On"), _("Due After (Days)"), "", ""); +table_header($th); + +$k = 0; //row colour counter +while ($myrow = db_fetch($result)) +{ + if ($myrow["day_in_following_month"] == 0) + { + $full_text = _("N/A"); + } + else + { + $full_text = $myrow["day_in_following_month"]; + } + + if ($myrow["days_before_due"] == 0) + { + $after_text = _("N/A"); + } + else + { + $after_text = $myrow["days_before_due"] . " " . _("days"); + } + + alt_table_row_color($k); + + label_cell($myrow["terms"]); + label_cell($full_text); + label_cell($after_text); + edit_link_cell("selected_id=".$myrow["terms_indicator"]); + delete_link_cell("selected_id=".$myrow["terms_indicator"]."&delete=1"); + end_row(); + + +} //END WHILE LIST LOOP + +end_table(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Payment Term")); + +//------------------------------------------------------------------------------------------------- + +start_form(); + +start_table($table_style2); + +$day_in_following_month = $days_before_due = 0; +if (isset($selected_id)) +{ + //editing an existing payment terms + $sql = "SELECT * FROM ".TB_PREF."payment_terms + WHERE terms_indicator='$selected_id'"; + + $result = db_query($sql,"could not get payment term"); + $myrow = db_fetch($result); + + $_POST['terms'] = $myrow["terms"]; + $days_before_due = $myrow["days_before_due"]; + $day_in_following_month = $myrow["day_in_following_month"]; + + hidden('selected_id', $selected_id); +} +text_row(_("Terms Description:"), 'terms', null, 40, 40); + +check_row(_("Due After A Given No. Of Days:"), 'DaysOrFoll', $day_in_following_month == 0); + +if (!isset($_POST['DayNumber'])) +{ + if ($days_before_due != 0) + $_POST['DayNumber'] = $days_before_due; + else + $_POST['DayNumber'] = $day_in_following_month; +} + +text_row_ex(_("Days (Or Day In Following Month):"), 'DayNumber', 3); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); + +?> diff --git a/admin/shipping_companies.php b/admin/shipping_companies.php new file mode 100644 index 00000000..7d4e530c --- /dev/null +++ b/admin/shipping_companies.php @@ -0,0 +1,162 @@ + 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this shipping company because sales orders have been created using this shipper.")); + } + else + { + // PREVENT DELETES IF DEPENDENT RECORDS IN 'debtor_trans' + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."debtor_trans WHERE ship_via='$selected_id'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this shipping company because invoices have been created using this shipping company.")); + } + else + { + $sql="DELETE FROM ".TB_PREF."shippers WHERE shipper_id=$selected_id"; + db_query($sql,"could not delete shipper"); + + meta_forward($_SERVER['PHP_SELF']); + } + } +} + +//---------------------------------------------------------------------------------------------- + +$sql = "SELECT * FROM ".TB_PREF."shippers ORDER BY shipper_id"; +$result = db_query($sql,"could not get shippers"); + +start_table($table_style); +$th = array(_("Name"), _("Contact Person"), _("Phone Number"), _("Address"), "", ""); +table_header($th); + +$k = 0; //row colour counter + +while ($myrow = db_fetch($result)) +{ + alt_table_row_color($k); + label_cell($myrow["shipper_name"]); + label_cell($myrow["contact"]); + label_cell($myrow["phone"]); + label_cell($myrow["address"]); + edit_link_cell("selected_id=".$myrow[0]); + delete_link_cell("selected_id=".$myrow[0]."&delete=1"); + end_row(); +} + +end_table(); + +//---------------------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Shipping Company")); + +start_form(); + +start_table($table_style2); + +if (isset($selected_id)) +{ + //editing an existing Shipper + + $sql = "SELECT * FROM ".TB_PREF."shippers WHERE shipper_id=$selected_id"; + + $result = db_query($sql, "could not get shipper"); + $myrow = db_fetch($result); + + $_POST['shipper_name'] = $myrow["shipper_name"]; + $_POST['contact'] = $myrow["contact"]; + $_POST['phone'] = $myrow["phone"]; + $_POST['address'] = $myrow["address"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Name:"), 'shipper_name', 40); + +text_row_ex(_("Contact Person:"), 'contact', 30); + +text_row_ex(_("Phone Number:"), 'phone', 20); + +text_row_ex(_("Address:"), 'address', 50); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); +end_page(); +?> diff --git a/admin/users.php b/admin/users.php new file mode 100644 index 00000000..8eeb575c --- /dev/null +++ b/admin/users.php @@ -0,0 +1,207 @@ +access == 2) + $th = array(_("User login"), _("Full Name"), _("Phone"), + _("E-mail"), _("Last Visit"), _("Access Level"), "", ""); +else + $th = array(_("User login"), _("Full Name"), _("Phone"), + _("E-mail"), _("Last Visit"), _("Access Level"), ""); +table_header($th); + +$k = 0; //row colour counter + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + $last_visit_date = sql2date($myrow["last_visit_date"]); + + /*The security_headings array is defined in config.php */ + + label_cell($myrow["user_id"]); + label_cell($myrow["real_name"]); + label_cell($myrow["phone"]); + label_cell($myrow["email"]); + label_cell($last_visit_date, "nowrap"); + label_cell($security_headings[$myrow["full_access"]]); + edit_link_cell("selected_id=".$myrow["user_id"]); + if (strcasecmp($myrow["user_id"], $_SESSION["wa_current_user"]->username) && + $_SESSION["wa_current_user"]->access == 2) + delete_link_cell("selected_id=".$myrow["user_id"]."&delete=1"); + end_row(); + +} //END WHILE LIST LOOP + +end_table(); + +//------------------------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New User")); + +start_form(); + +start_table($table_style2); +if (isset($selected_id)) +{ + //editing an existing User + + $myrow = get_user($selected_id); + + $_POST['user_id'] = $myrow["user_id"]; + $_POST['real_name'] = $myrow["real_name"]; + $_POST['phone'] = $myrow["phone"]; + $_POST['email'] = $myrow["email"]; + $_POST['Access'] = $myrow["full_access"]; + $_POST['language'] = $myrow["language"]; + + hidden('selected_id', $selected_id); + hidden('user_id', $_POST['user_id']); + + start_row(); + label_row(_("User login:"), $_POST['user_id']); + +} +else +{ //end of if $selected_id only do the else when a new record is being entered + text_row(_("User Login:"), "user_id", null, 22, 20); +} +$_POST['password'] = ""; +start_row(); +label_cell(_("Password:")); +label_cell(""); +end_row(); + +if (isset($selected_id)) +{ + table_section_title(_("Enter a new password to change, leave empty to keep current.")); +} + +text_row_ex(_("Full Name").":", 'real_name', 50); + +text_row_ex(_("Telephone No.:"), 'phone', 30); + +text_row_ex(_("Email Address:"), 'email', 50); + +security_headings_list_row(_("Access Level:"), "Access", null); + +languages_list_row(_("Language:"), 'language', null); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); +end_page(); +?> diff --git a/admin/view_print_transaction.php b/admin/view_print_transaction.php new file mode 100644 index 00000000..a8c09d2d --- /dev/null +++ b/admin/view_print_transaction.php @@ -0,0 +1,158 @@ += " . $_POST['FromTransNo']. " + AND $trans_no_name <= " . $_POST['ToTransNo']; + + if ($type_name != null) + $sql .= " AND $type_name = " . $_POST['filterType']; + + $sql .= " ORDER BY $trans_no_name"; + + $result = db_query($sql, "could not query transactions on $table_name"); + + if (db_num_rows($result) == 0) + { + echo _("There are no transactions for the given parameters."); + return; + } + + start_table($table_style); + if ($trans_ref) + $th = array(_("#"), _("Reference"), _("View"), _("Print")); + else + $th = array(_("#"), _("View"), _("Print")); + table_header($th); + $k = 0; + while ($line = db_fetch($result)) + { + + alt_table_row_color($k); + + label_cell($line[$trans_no_name]); + if ($trans_ref) + label_cell($line[$trans_ref]); + label_cell(get_trans_view_str($_POST['filterType'],$line[$trans_no_name], _("View"))); + label_cell(get_gl_view_str_cell($_POST['filterType'], $line[$trans_no_name], _("View GL"))); + + $forms = get_form_entries($_POST['filterType'], $line[$trans_no_name]); + while ($form_item = db_fetch($forms)) + { + + $param1 = $form_item['param1']; + $param2 = $form_item['param2']; + + if ($_POST['filterType'] == systypes::bank_payment() + || $_POST['filterType'] == systypes::bank_deposit() + || $_POST['filterType'] == systypes::cust_payment() + || $_POST['filterType'] == systypes::supp_payment()) + { + $param1 = payment_person_types::type_name($form_item['param1']); + $param2 = payment_person_types::person_name($form_item['param1'], $form_item['param2'], false); + } + + //label_cell(printTransaction(_("Print") . " " . getFormTypeName($form_item["form_type"]), $form_item['form_id'], $form_item['form_type'], $_POST['filterType'], $line[$trans_no_name], $line[$trans_ref], $param1, $param2)); + } + end_row(); + + } + + end_table(); + } +} + +//---------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessSearch'])) +{ + if (!check_valid_entries()) + unset($_POST['ProcessSearch']); +} + +//---------------------------------------------------------------------------------------- + +viewing_controls(); + +//echo getHiddenFieldScript(); + +handle_search(); + +br(2); + +end_page(); + +?> diff --git a/admin/void_transaction.php b/admin/void_transaction.php new file mode 100644 index 00000000..d349e5f2 --- /dev/null +++ b/admin/void_transaction.php @@ -0,0 +1,130 @@ + \ No newline at end of file diff --git a/applications/application.php b/applications/application.php new file mode 100644 index 00000000..efa11f23 --- /dev/null +++ b/applications/application.php @@ -0,0 +1,118 @@ +label = $label; + $this->link = $link; + } + } + + class menu + { + var $title; + var $items; + + function menu($title) + { + $this->title = $title; + $this->items = array(); + } + + function add_item($label, $link) + { + $item = new menu_item($label,$link); + array_push($this->items,$item); + return $item; + } + + } + + class app_function + { + var $label; + var $link; + var $access; + + function app_function($label,$link,$access=1) + { + $this->label = $label; + $this->link = $link; + $this->access = $access; + } + } + + class module + { + var $name; + var $icon; + var $lappfunctions; + var $rappfunctions; + + function module($name,$icon = null) + { + $this->name = $name; + $this->icon = $icon; + $this->lappfunctions = array(); + $this->rappfunctions = array(); + } + + function add_lapp_function($label,$link="",$access=1) + { + $appfunction = new app_function($label,$link,$access); + //array_push($this->lappfunctions,$appfunction); + $this->lappfunctions[] = $appfunction; + return $appfunction; + } + + function add_rapp_function($label,$link="",$access=1) + { + $appfunction = new app_function($label,$link,$access); + //array_push($this->rappfunctions,$appfunction); + $this->rappfunctions[] = $appfunction; + return $appfunction; + } + + + } + + class application + { + var $id; + var $name; + var $modules; + var $enabled; + + function application($id, $name, $enabled=true) + { + $this->id = $id; + $this->name = $name; + $this->enables = $enabled; + $this->modules = array(); + } + + function add_module($name, $icon = null) + { + $module = new module($name,$icon); + //array_push($this->modules,$module); + $this->modules[] = $module; + return $module; + } + + function add_lapp_function($level, $label,$link="",$access=1) + { + $this->modules[$level]->lappfunctions[] = new app_function($label, $link, $access); + } + + function add_rapp_function($level, $label,$link="",$access=1) + { + $this->modules[$level]->rappfunctions[] = new app_function($label, $link, $access); + } + } + + +?> \ No newline at end of file diff --git a/applications/customers.php b/applications/customers.php new file mode 100644 index 00000000..dbc0fa86 --- /dev/null +++ b/applications/customers.php @@ -0,0 +1,37 @@ +application("orders",_("Sales")); + + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Sales Order Entry"),"sales/sales_order_entry.php?NewOrder=Yes"); + $this->add_lapp_function(0, _("Select a Sales Order to Invoice"),"sales/inquiry/sales_orders_view.php?&OutstandingOnly=1"); + $this->add_rapp_function(0, _("Customer Payments"),"sales/customer_payments.php?"); + $this->add_rapp_function(0, "",""); + $this->add_rapp_function(0, _("Sales Invoices"),"sales/sales_order_entry.php?NewInvoice=Yes"); + $this->add_rapp_function(0, _("Customer Credit Notes"),"sales/credit_note_entry.php?&NewCredit=Yes"); + $this->add_rapp_function(0, _("Allocate Customer Payments or Credit Notes"),"sales/allocations/customer_allocation_main.php?"); + + $this->add_module(_("Inquiries and Reports")); + $this->add_lapp_function(1, _("Sales Order Inquiry"),"sales/inquiry/sales_orders_view.php?"); + $this->add_lapp_function(1, _("Customer Transaction Inquiry"),"sales/inquiry/customer_inquiry.php?"); + $this->add_lapp_function(1, "",""); + $this->add_lapp_function(1, _("Customer Allocation Inquiry"),"sales/inquiry/customer_allocation_inquiry.php?"); + + $this->add_rapp_function(1, _("Customer and Sales Reports"),"reporting/reports_main.php?Class=0"); + + $this->add_module(_("Maintenance")); + $this->add_lapp_function(2, _("Add and Manage Customers"),"sales/manage/customers.php?"); + $this->add_lapp_function(2, _("Customer Branches"),"sales/manage/customer_branches.php?"); + $this->add_rapp_function(2, _("Sales Types"),"sales/manage/sales_types.php?"); + $this->add_rapp_function(2, _("Sales Persons"),"sales/manage/sales_people.php?"); + $this->add_rapp_function(2, _("Sales Areas"),"sales/manage/sales_areas.php?"); + $this->add_rapp_function(2, _("Credit Status Setup"),"sales/manage/credit_status.php?"); + } + } + + +?> \ No newline at end of file diff --git a/applications/dimensions.php b/applications/dimensions.php new file mode 100644 index 00000000..304df321 --- /dev/null +++ b/applications/dimensions.php @@ -0,0 +1,25 @@ +application("proj",_("Dimensions")); + + if ($dim > 0) + { + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Dimension Entry"),"dimensions/dimension_entry.php?"); + $this->add_lapp_function(0, _("Outstanding Dimensions"),"dimensions/inquiry/search_dimensions.php?OutstandingOnly=1"); + + $this->add_module(_("Inquiries and Reports")); + $this->add_lapp_function(1, _("Dimension Inquiry"),"dimensions/inquiry/search_dimensions.php?"); + + $this->add_rapp_function(1, _("Dimension Reports"),"reporting/reports_main.php?Class=4"); + } + } + } + + +?> \ No newline at end of file diff --git a/applications/generalledger.php b/applications/generalledger.php new file mode 100644 index 00000000..58409c8c --- /dev/null +++ b/applications/generalledger.php @@ -0,0 +1,38 @@ +application("GL",_("Banking and General Ledger")); + + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Payments"),"gl/gl_payment.php?NewPayment=Yes"); + $this->add_lapp_function(0, _("Deposits"),"gl/gl_deposit.php?NewDeposit=Yes"); + $this->add_lapp_function(0, _("Bank Account Transfers"),"gl/bank_transfer.php?"); + $this->add_rapp_function(0, _("Journal Entry"),"gl/gl_journal.php?NewJournal=Yes"); + + $this->add_module(_("Inquiries and Reports")); + $this->add_lapp_function(1, _("Bank Account Inquiry"),"gl/inquiry/bank_inquiry.php?"); + $this->add_lapp_function(1, _("GL Account Inquiry"),"gl/inquiry/gl_account_inquiry.php?"); + $this->add_lapp_function(1, "",""); + $this->add_lapp_function(1, _("Trial Balance"),"gl/inquiry/gl_trial_balance.php?"); + + $this->add_rapp_function(1, _("Banking Reports"),"reporting/reports_main.php?Class=5"); + $this->add_rapp_function(1, _("General Ledger Reports"),"reporting/reports_main.php?Class=6"); + + $this->add_module(_("Maintenance")); + $this->add_lapp_function(2, _("Bank Accounts"),"gl/manage/bank_accounts.php?"); + $this->add_lapp_function(2, _("Payment, Deposit and Transfer Types"),"gl/manage/bank_trans_types.php?"); + $this->add_lapp_function(2, "",""); + $this->add_lapp_function(2, _("Currencies"),"gl/manage/currencies.php?"); + $this->add_lapp_function(2, _("Exchange Rates"),"gl/manage/exchange_rates.php?"); + + $this->add_rapp_function(2, _("GL Accounts"),"gl/manage/gl_accounts.php?"); + $this->add_rapp_function(2, _("GL Account Groups"),"gl/manage/gl_account_types.php?"); + $this->add_rapp_function(2, _("GL Account Classes"),"gl/manage/gl_account_classes.php?"); + } + } + + +?> \ No newline at end of file diff --git a/applications/index.php b/applications/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/applications/index.php @@ -0,0 +1,3 @@ + diff --git a/applications/inventory.php b/applications/inventory.php new file mode 100644 index 00000000..2f7d8eb6 --- /dev/null +++ b/applications/inventory.php @@ -0,0 +1,35 @@ +application("stock",_("Items and Inventory")); + + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Inventory Location Transfers"),"inventory/transfers.php?NewTransfer=1"); + $this->add_lapp_function(0, _("Inventory Adjustments"),"inventory/adjustments.php?NewAdjustment=1"); + + $this->add_module(_("Inquiries and Reports")); + $this->add_lapp_function(1, _("Inventory Item Movements"),"inventory/inquiry/stock_movements.php?"); + $this->add_lapp_function(1, _("Inventory Item Status"),"inventory/inquiry/stock_status.php?"); + $this->add_rapp_function(1, _("Inventory Reports"),"reporting/reports_main.php?Class=2"); + + $this->add_module(_("Maintenance")); + $this->add_lapp_function(2, _("Items"),"inventory/manage/items.php?"); + $this->add_lapp_function(2, _("Item Categories"),"inventory/manage/item_categories.php?"); + $this->add_lapp_function(2, _("Inventory Locations"),"inventory/manage/locations.php?"); + $this->add_rapp_function(2, _("Inventory Movement Types"),"inventory/manage/movement_types.php?"); + $this->add_rapp_function(2, _("Item Tax Types"),"taxes/item_tax_types.php?"); + $this->add_rapp_function(2, "",""); + $this->add_rapp_function(2, _("Reorder Levels"),"inventory/reorder_level.php?"); + + $this->add_module(_("Pricing and Costs")); + $this->add_lapp_function(3, _("Sales Pricing"),"inventory/prices.php?"); + $this->add_lapp_function(3, _("Purchasing Pricing"),"inventory/purchasing_data.php?"); + $this->add_rapp_function(3, _("Standard Costs"),"inventory/cost_update.php?"); + } + } + + +?> \ No newline at end of file diff --git a/applications/manufacturing.php b/applications/manufacturing.php new file mode 100644 index 00000000..46b95fe6 --- /dev/null +++ b/applications/manufacturing.php @@ -0,0 +1,26 @@ +application("manuf",_("Manufacturing")); + + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Work Order Entry"),"manufacturing/work_order_entry.php?"); + $this->add_lapp_function(0, _("Outstanding Work Orders"),"manufacturing/search_work_orders.php?OutstandingOnly=1"); + + $this->add_module(_("Inquiries and Reports")); + //$this->add_lapp_function(1, _("Costed Bill Of Material Inquiry"),"manufacturing/inquiry/bom_cost_inquiry.php?"); + $this->add_lapp_function(1, _("Inventory Item Where Used Inquiry"),"manufacturing/inquiry/where_used_inquiry.php?"); + $this->add_lapp_function(1, _("Work Order Inquiry"),"manufacturing/search_work_orders.php?"); + $this->add_rapp_function(1, _("Manufactoring Reports"),"reporting/reports_main.php?Class=3"); + + $this->add_module(_("Maintenance")); + $this->add_lapp_function(2, _("Bills Of Material"),"manufacturing/manage/bom_edit.php?"); + $this->add_lapp_function(2, _("Work Centres"),"manufacturing/manage/work_centres.php?"); + } + } + + +?> \ No newline at end of file diff --git a/applications/setup.php b/applications/setup.php new file mode 100644 index 00000000..e8b34031 --- /dev/null +++ b/applications/setup.php @@ -0,0 +1,35 @@ +application("system",_("Setup")); + + $this->add_module(_("Company Setup")); + $this->add_lapp_function(0, _("Company Setup"),"admin/company_preferences.php?"); + $this->add_lapp_function(0, _("User Accounts Setup"),"admin/users.php?", 15); + $this->add_lapp_function(0, "",""); + $this->add_lapp_function(0, _("Display Setup"),"admin/display_prefs.php?"); + $this->add_lapp_function(0, _("Forms Setup"),"admin/forms_setup.php?"); + $this->add_rapp_function(0, _("Taxes"),"taxes/tax_types.php?"); + $this->add_rapp_function(0, _("Tax Groups"),"taxes/tax_groups.php?"); + $this->add_rapp_function(0, "",""); + $this->add_rapp_function(0, _("System and General GL Setup"),"admin/gl_setup.php?"); + $this->add_rapp_function(0, _("Fiscal Years"),"admin/fiscalyears.php?"); + + $this->add_module(_("Miscellaneous")); + $this->add_lapp_function(1, _("Payment Terms"),"admin/payment_terms.php?"); + $this->add_lapp_function(1, _("Shipping Company"),"admin/shipping_companies.php?"); + + $this->add_module(_("Maintanance")); + $this->add_lapp_function(2, _("Void a Transaction"),"admin/void_transaction.php?"); + $this->add_lapp_function(2, _("View or Print Transactions"),"admin/view_print_transaction.php?"); + $this->add_rapp_function(2, _("Backup and Restore"),"admin/backups.php?", 15); + $this->add_rapp_function(2, _("Create/Update Companies"),"admin/create_coy.php?", 14); + $this->add_rapp_function(2, _("Install/Update Languages"),"admin/inst_lang.php?", 14); + } + } + + +?> \ No newline at end of file diff --git a/applications/suppliers.php b/applications/suppliers.php new file mode 100644 index 00000000..9f7213ba --- /dev/null +++ b/applications/suppliers.php @@ -0,0 +1,32 @@ +application("AP",_("Purchases")); + + $this->add_module(_("Transactions")); + $this->add_lapp_function(0, _("Purchase Order Entry"),"purchasing/po_entry_items.php?NewOrder=Yes"); + $this->add_lapp_function(0, _("Outstanding Purchase Orders Maintenance"),"purchasing/inquiry/po_search.php?"); + $this->add_rapp_function(0, _("Payments to Suppliers"),"purchasing/supplier_payment.php?"); + $this->add_rapp_function(0, "",""); + $this->add_rapp_function(0, _("Supplier Invoices"),"purchasing/supplier_invoice.php?New=1"); + $this->add_rapp_function(0, _("Supplier Credit Notes"),"purchasing/supplier_credit.php?New=1"); + $this->add_rapp_function(0, _("Allocate Supplier Payments or Credit Notes"),"purchasing/allocations/supplier_allocation_main.php?"); + + $this->add_module(_("Inquiries and Reports")); + $this->add_lapp_function(1, _("Purchase Orders Inquiry"),"purchasing/inquiry/po_search_completed.php?"); + $this->add_lapp_function(1, _("Supplier Transaction Inquiry"),"purchasing/inquiry/supplier_inquiry.php?"); + $this->add_lapp_function(1, "",""); + $this->add_lapp_function(1, _("Supplier Allocation Inquiry"),"purchasing/inquiry/supplier_allocation_inquiry.php?"); + + $this->add_rapp_function(1, _("Supplier and Purchasing Reports"),"reporting/reports_main.php?Class=1"); + + $this->add_module(_("Maintenance")); + $this->add_lapp_function(2, _("Suppliers"),"purchasing/manage/suppliers.php?"); + } + } + + +?> \ No newline at end of file diff --git a/config.php b/config.php new file mode 100644 index 00000000..ee8d2999 --- /dev/null +++ b/config.php @@ -0,0 +1,138 @@ + \ No newline at end of file diff --git a/config_db.php b/config_db.php new file mode 100644 index 00000000..1c06397b --- /dev/null +++ b/config_db.php @@ -0,0 +1,36 @@ + array ('name' => 'Training Co.', + 'host' => 'localhost', + 'dbuser' => 'your_db_user_name', + 'dbpassword' => 'your_db_password', + 'dbname' => 'your_db_name', + 'tbpref' => '0_') + ); +*/ + +$tb_pref_counter = 0; + +$db_connections = array (); + +?> \ No newline at end of file diff --git a/dimensions/dimension_entry.php b/dimensions/dimension_entry.php new file mode 100644 index 00000000..6474ac14 --- /dev/null +++ b/dimensions/dimension_entry.php @@ -0,0 +1,259 @@ +"; + hyperlink_no_params($path_to_root . "/dimensions/inquiry/search_dimensions.php", _("Select an existing dimension")); + echo "

"; + + end_page(); + + exit; +} + +//------------------------------------------------------------------------------------- + +function can_process() +{ + global $selected_id; + + if ($selected_id == -1) + { + + if (!references::is_valid($_POST['ref'])) + { + display_error( _("The dimension reference must be entered.")); + return false; + } + + if (!is_new_reference($_POST['ref'], systypes::dimension())) + { + display_error(_("The entered reference is already in use.")); + return false; + } + } + + if (strlen($_POST['name']) == 0) + { + display_error( _("The dimension name must be entered.")); + return false; + } + + if (!is_date($_POST['date_'])) + { + display_error( _("The date entered is in an invalid format.")); + return false; + } + + if (!is_date($_POST['due_date'])) + { + display_error( _("The required by date entered is in an invalid format.")); + return false; + } + + return true; +} + +//------------------------------------------------------------------------------------- + +if (isset($_POST['ADD_ITEM']) || isset($_POST['UPDATE_ITEM'])) +{ + + if (can_process()) + { + + if ($selected_id == -1) + { + + $id = add_dimension($_POST['ref'], $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$id"); + } + else + { + + update_dimension($selected_id, $_POST['name'], $_POST['type_'], $_POST['date_'], $_POST['due_date'], $_POST['memo_']); + + meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$selected_id"); + } + } +} + +//-------------------------------------------------------------------------------------- + +if (isset($_POST['delete'])) +{ + + $cancel_delete = false; + + // can't delete it there are productions or issues + if (dimension_has_payments($selected_id) || dimension_has_deposits($selected_id)) + { + display_error(_("This dimension cannot be deleted because it has already been processed.")); + $cancel_delete = true; + } + + if ($cancel_delete == false) + { //ie not cancelled the delete as a result of above tests + + // delete + delete_dimension($selected_id); + meta_forward($_SERVER['PHP_SELF'], "DeletedID=$selected_id"); + } +} + +//------------------------------------------------------------------------------------- + +if (isset($_POST['close'])) +{ + + // update the closed flag + close_dimension($selected_id); + meta_forward($_SERVER['PHP_SELF'], "ClosedID=$selected_id"); +} + +//------------------------------------------------------------------------------------- + +start_form(); + +start_table($table_style2); + +if ($selected_id != -1) +{ + $myrow = get_dimension($selected_id); + + if (strlen($myrow[0]) == 0) + { + display_error(_("The dimension sent is not valid.")); + exit; + } + + // if it's a closed dimension can't edit it + if ($myrow["closed"] == 1) + { + display_error(_("This dimension is closed and cannot be edited.")); + exit; + } + + $_POST['ref'] = $myrow["reference"]; + $_POST['closed'] = $myrow["closed"]; + $_POST['name'] = $myrow["name"]; + $_POST['type_'] = $myrow["type_"]; + $_POST['date_'] = sql2date($myrow["date_"]); + $_POST['due_date'] = sql2date($myrow["due_date"]); + $_POST['memo_'] = get_comments_string(systypes::dimension(), $selected_id); + + hidden('ref', $_POST['ref']); + + label_row(_("Dimension Reference:"), $_POST['ref']); + + hidden('selected_id', $selected_id); +} +else +{ + ref_row(_("Dimension Reference:"), 'ref', references::get_next(systypes::dimension())); +} + +text_row_ex(_("Name") . ":", 'name', 50, 75); + +$dim = get_company_pref('use_dimension'); + +number_list_row(_("Type"), 'type_', null, 1, $dim); + +date_row(_("Start Date") . ":", 'date_'); + +date_row(_("Date Required By") . ":", 'due_date', null, sys_prefs::default_dimension_required_by()); + +textarea_row(_("Memo:"), 'memo_', null, 40, 5); + +end_table(1); + +submit_add_or_update_center($selected_id == -1); + +if ($selected_id != -1) +{ + echo "
"; + + submit_center_first('close', _("Close This Dimension")); + submit_center_last('delete', _("Delete This Dimension")); +} + +end_form(); + +//-------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/dimensions/includes/dimensions_db.inc b/dimensions/includes/dimensions_db.inc new file mode 100644 index 00000000..a66ca538 --- /dev/null +++ b/dimensions/includes/dimensions_db.inc @@ -0,0 +1,140 @@ + \ No newline at end of file diff --git a/dimensions/includes/dimensions_ui.inc b/dimensions/includes/dimensions_ui.inc new file mode 100644 index 00000000..7683712a --- /dev/null +++ b/dimensions/includes/dimensions_ui.inc @@ -0,0 +1,60 @@ +"; + + if (db_num_rows($result) == 0) + { + echo _("There are no transactions for this dimension.") . "
"; + } + else + { + display_heading2(_("Transactions for this Dimension")); + start_table($table_style); + $th = array(_("Type"), _("#"), _("Reference"), + _("Date"), _("Debit"), _("Credit")); + table_header($th); + + $total = $k = 0; + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + // projects are always in home currency...get the home equivalent of the banktrans + // from it's gl postings + $home_value = get_gl_trans_value($myrow["bank_act"], $myrow["type"], $myrow["trans_no"]); + + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"], $myrow["trans_no"])); + label_cell($myrow["ref"]); + label_cell(sql2date($myrow["trans_date"])); + display_debit_or_credit_cells($home_value); + + $total += $home_value; + + end_row(); + } + + start_row(); + label_cell(_("Total"), "colspan=4"); + display_debit_or_credit_cells($total); + end_row(); + + end_table(); + } +} + +//-------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/dimensions/includes/index.php b/dimensions/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/dimensions/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/dimensions/index.php b/dimensions/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/dimensions/index.php @@ -0,0 +1,3 @@ + diff --git a/dimensions/inquiry/index.php b/dimensions/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/dimensions/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/dimensions/inquiry/search_dimensions.php b/dimensions/inquiry/search_dimensions.php new file mode 100644 index 00000000..f659092b --- /dev/null +++ b/dimensions/inquiry/search_dimensions.php @@ -0,0 +1,166 @@ + 0"; + +if ($dim == 1) + $sql .= " AND type_=1"; + +if (isset($_POST['OpenOnly'])) +{ + $sql .= " AND closed=0"; +} + +if (isset($_POST['type_']) && ($_POST['type_'] > 0)) +{ + $sql .= " AND type_=" . $_POST['type_']; +} + +if (isset($_POST['OrderNumber']) && $_POST['OrderNumber'] != "") +{ + $sql .= " AND reference LIKE '%". $_POST['OrderNumber'] . "%'"; +} + +if (isset($_POST['OverdueOnly'])) +{ + $today = date2sql(Today()); + + $sql .= " AND due_date < '$today' "; +} + +$sql .= " AND date_ >= '" . date2sql($_POST['FromDate']) . "' + AND date_ <= '" . date2sql($_POST['ToDate']) . "'"; + +$sql .= " ORDER BY due_date"; + +$result = db_query($sql,"could not query dimensions"); + +start_table("$table_style width=80%"); + +if (!$outstanding_only) + $th = array(_("#"), _("Reference"), _("Name"), _("Type"), _("Date"), + _("Due Date"), _("Closed"), _("Balance")); +else + $th = array(_("#"), _("Reference"), _("Name"), _("Type"), _("Date"), + _("Due Date"), _("Balance")); +table_header($th); +$j = 1; +$k = 0; + +while ($myrow = db_fetch($result)) +{ + $sql = "SELECT SUM(amount) FROM ".TB_PREF."gl_trans WHERE tran_date >= '" . + date2sql($_POST['FromDate']) . "' AND + tran_date <= '" . date2sql($_POST['ToDate']) . "' AND dimension_id = " . + $myrow['id']; + $res = db_query($sql, "Transactions could not be calculated"); + $row = db_fetch_row($res); + + if ($k == 1) + { + $row_text = "class='oddrow'"; + $k = 0; + } + else + { + $row_text = "class='evenrow'"; + $k++; + } + + // check if it's an overdue work order + if (date_diff(Today(), sql2date($myrow["due_date"]), "d") > 0) + { + $row_text = "class='overduebg'"; + } + + start_row($row_text); + + $mpage = $path_to_root . "/dimensions/dimension_entry.php?" . SID . "trans_no=" . $myrow["id"]; + + label_cell(get_dimensions_trans_view_str(systypes::dimension(), $myrow["id"])); + label_cell(get_dimensions_trans_view_str(systypes::dimension(), $myrow["id"], $myrow["reference"])); + label_cell($myrow["name"]); + label_cell($myrow["type_"]); + label_cell(sql2date($myrow["date_"])); + label_cell(sql2date($myrow["due_date"])); + if (!$outstanding_only) + label_cell(($myrow["closed"] ? _("Yes") : _("No"))); + amount_cell($row[0]); + if ($myrow["closed"] == 0) + label_cell("" . _("Edit") . ""); + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } + //end of page full new headings if +} +//end of while loop + +end_table(1); + +//--------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/dimensions/view/index.php b/dimensions/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/dimensions/view/index.php @@ -0,0 +1,3 @@ + diff --git a/dimensions/view/view_dimension.php b/dimensions/view/view_dimension.php new file mode 100644 index 00000000..ce562484 --- /dev/null +++ b/dimensions/view/view_dimension.php @@ -0,0 +1,62 @@ +" . _("This dimension is closed.") . "
"; +} + +display_dimension_payments($id); + +br(1); + +end_page(true); + +?> diff --git a/frontaccounting.php b/frontaccounting.php new file mode 100644 index 00000000..77163a54 --- /dev/null +++ b/frontaccounting.php @@ -0,0 +1,49 @@ +renderer = new renderer(); } + function add_application($app) { $this->applications[$app->id] = &$app; } + function get_application($id) { if (isset($this->applications[$id])) + return $this->applications[$id]; + return null; } + function get_selected_application() { if (isset($this->selected_application)) + return $this->applications[$this->selected_application]; + foreach ($this->applications as $application) + return $application; + return null; } + function display() { $this->init(); + $this->renderer->wa_header(); + $this->renderer->menu_header($this->menu); + $this->renderer->display_applications($this); + $this->renderer->menu_footer($this->menu); + $this->renderer->wa_footer(); } + function init() { + $this->menu = new menu(_("Main Menu")); + $this->menu->add_item(_("Main Menu"), "index.php"); + $this->menu->add_item(_("Logout"), "/account/access/logout.php"); + $this->applications = array(); + $this->add_application(new customers_app()); + $this->add_application(new suppliers_app()); + $this->add_application(new inventory_app()); + $this->add_application(new manufacturing_app()); + $this->add_application(new dimensions_app()); + $this->add_application(new general_ledger_app()); + $this->add_application(new setup_app()); } } +?> \ No newline at end of file diff --git a/gl/bank_transfer.php b/gl/bank_transfer.php new file mode 100644 index 00000000..83d2750a --- /dev/null +++ b/gl/bank_transfer.php @@ -0,0 +1,174 @@ +
"; // outer table + end_table(1); +} + +//--------------------------------------------------------------------------------- + +function display_gl_items($title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($title); + + $dim = get_company_pref('use_dimension'); + + start_table("$table_style colspan=7 width=95%"); + if ($dim == 2) + $th = array(_("Account Code"), _("Account Description"), _("Dimension")." 1", + _("Dimension")." 2", _("Debit"), _("Credit"), _("Memo")); + else if ($dim == 1) + $th = array(_("Account Code"), _("Account Description"), _("Dimension"), + _("Debit"), _("Credit"), _("Memo")); + else + $th = array(_("Account Code"), _("Account Description"), + _("Debit"), _("Credit"), _("Memo")); + table_header($th); + + $k = 0; + + foreach ($order->gl_items as $item) + { + if (!isset($_GET['Edit']) || $_GET['Edit'] != $item->index) + { + alt_table_row_color($k); + + label_cells($item->code_id, $item->description); + if ($dim >= 1) + label_cell(get_dimension_string($item->dimension_id, true)); + if ($dim > 1) + label_cell(get_dimension_string($item->dimension2_id, true)); + if ($item->amount > 0) + { + amount_cell(abs($item->amount)); + label_cell(""); + } + else + { + label_cell(""); + amount_cell(abs($item->amount)); + } + label_cell($item->reference); + edit_link_cell("Edit=$item->index"); + delete_link_cell("Delete=$item->index"); + end_row();; + } + else + { + gl_edit_item_controls($order, $dim, $item->index); + } + } + + if (!isset($_GET['Edit'])) + gl_edit_item_controls($order, $dim); + + if ($order->count_gl_items()) + { + $colspan = ($dim == 2 ? "4" : ($dim == 1 ? "3" : "2")); + start_row(); + label_cell(_("Total"), "align=right colspan=" . $colspan); + amount_cell($order->gl_items_total_debit()); + amount_cell(abs($order->gl_items_total_credit())); + end_row(); + } + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function gl_edit_item_controls(&$order, $dim, $Index=null) +{ + start_row(); + + if (isset($_GET['Edit']) && $Index != null) + { + $item = $order->gl_items[$Index]; + if (!isset($_POST['code_id'])) + $_POST['code_id'] = $item->code_id; + if (!isset($_POST['dimension_id'])) + $_POST['dimension_id'] = $item->dimension_id; + if (!isset($_POST['dimension2_id'])) + $_POST['dimension2_id'] = $item->dimension2_id; + + if ((!isset($_POST['AmountDebit']) || ($_POST['AmountDebit']=="")) && $item->amount > 0) + $_POST['AmountDebit'] = $item->amount; + + if ((!isset($_POST['AmountCredit']) || ($_POST['AmountCredit']=="")) && $item->amount <= 0) + $_POST['AmountCredit'] = abs($item->amount); + + if (!isset($_POST['description']) || ($_POST['description'] == "")) + $_POST['description'] = $item->description; + if (!isset($_POST['LineMemo']) || ($_POST['LineMemo'] == "")) + $_POST['LineMemo'] = $item->reference; + + hidden('Index', $item->index); + hidden('code_id', $item->code_id); + label_cell($_POST['code_id']); + label_cell($item->description); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', $_POST['dimension_id'], true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', $_POST['dimension2_id'], true, " ", false, 2); + } + else + { + $_POST['AmountDebit'] = 0; + $_POST['AmountCredit'] = 0; + $_POST['dimension_id'] = 0; + $_POST['dimension2_id'] = 0; + $_POST['LineMemo'] = ""; + $_POST['CodeID2'] = ""; + $_POST['code_id'] = ""; + + text_cells(null, "CodeID2", "", 12, 10, "", "", "onkeyup='recalcAccounts();' onKeyDown='if(event.keyCode==13) event.keyCode=9;' onblur='return setAccount(0, false)'"); + $skip_bank = ($_SESSION["wa_current_user"]->access != 2); + gl_all_accounts_list_cells(null, 'code_id', null, $skip_bank, false, "return setAccount(1, false)"); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', null, true, " ", false, 2); + } + if ($dim < 1) + hidden('dimension_id', 0); + if ($dim < 2) + hidden('dimension2_id', 0); + + amount_cells(null, 'AmountDebit'); + amount_cells(null, 'AmountCredit'); + text_cells_ex(null, 'LineMemo', 35, 50); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + submit_cells('AddItem', _("Add item"), "colspan=2"); + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function gl_options_controls() +{ + echo "
"; // outer table + + echo ""; + bank_accounts_list_row(_("From Account:"), 'FromBankAccount', null, true); + + bank_accounts_list_row(_("To Account:"), 'ToBankAccount', null, true); + + date_row(_("Transfer Date:"), 'DatePaid'); + + $from_currency = get_bank_account_currency($_POST['FromBankAccount']); + $to_currency = get_bank_account_currency($_POST['ToBankAccount']); + if ($from_currency != "" && $to_currency != "" && $from_currency != $to_currency) + { + amount_row(_("Amount:"), 'amount', null, null, $from_currency); + + exchange_rate_display($from_currency, $to_currency, $_POST['DatePaid']); + } + else + { + amount_row(_("Amount:"), 'amount'); + } + + echo "
"; + echo "
"; // outer table + echo ""; + + bank_trans_types_list_row(_("Transfer Type:"), 'TransferType', null); + + ref_row(_("Reference:"), 'ref', references::get_next(systypes::bank_transfer())); + + textarea_row(_("Memo:"), 'memo_', null, 40,4); + + end_table(1); + + echo ""; + end_table(1); // outer table + + submit_center('AddPayment',_("Enter Transfer")); + + end_form(); +} + +//---------------------------------------------------------------------------------------- + +function check_valid_entries() +{ + if (!is_date($_POST['DatePaid'])) + { + display_error(_("The entered date is invalid.")); + return false; + } + if (!is_date_in_fiscalyear($_POST['DatePaid'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + + if (!is_numeric($_POST['amount'])) + { + display_error(_("The entered amount is invalid.")); + return false; + } + if ($_POST['amount'] <= 0) + { + display_error(_("The entered amount must be a positive number.")); + return false; + } + + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], systypes::bank_transfer())) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + if ($_POST['FromBankAccount'] == $_POST['ToBankAccount']) + { + display_error(_("The source and destination bank accouts cannot be the same.")); + return false; + } + + return true; +} + +//---------------------------------------------------------------------------------------- + +function handle_add_deposit() +{ + global $path_to_root; + + $trans_no = add_bank_transfer($_POST['FromBankAccount'], $_POST['ToBankAccount'], + $_POST['DatePaid'], $_POST['amount'], + $_POST['TransferType'], $_POST['ref'], $_POST['memo_']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); +} + +//---------------------------------------------------------------------------------------- + +function safeExit() +{ + global $path_to_root; + echo "

"; + end_page(); + exit; +} + +//---------------------------------------------------------------------------------------- + +if (isset($_POST['AddPayment'])) +{ + if (check_valid_entries() == true) + { + handle_add_deposit(); + safeExit(); + } +} + +gl_payment_controls(); + +end_page(); +?> diff --git a/gl/gl_deposit.php b/gl/gl_deposit.php new file mode 100644 index 00000000..019e36a4 --- /dev/null +++ b/gl/gl_deposit.php @@ -0,0 +1,256 @@ +from_loc = $_POST['bank_account']; + $_SESSION['deposit_items']->tran_date = $_POST['date_']; + $_SESSION['deposit_items']->transfer_type = $_POST['type']; + $_SESSION['deposit_items']->increase = $_POST['PayType']; + if (!isset($_POST['person_id'])) + $_POST['person_id'] = ""; + $_SESSION['deposit_items']->person_id = $_POST['person_id']; + if (!isset($_POST['PersonDetailID'])) + $_POST['PersonDetailID'] = ""; + $_SESSION['deposit_items']->branch_id = $_POST['PersonDetailID']; + $_SESSION['deposit_items']->memo_ = $_POST['memo_']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_py() +{ + $_POST['bank_account'] = $_SESSION['deposit_items']->from_loc; + $_POST['date_'] = $_SESSION['deposit_items']->tran_date; + $_POST['type'] = $_SESSION['deposit_items']->transfer_type; + $_POST['PayType'] = $_SESSION['deposit_items']->increase; + $_POST['person_id'] = $_SESSION['deposit_items']->person_id; + $_POST['PersonDetailID'] = $_SESSION['deposit_items']->branch_id; + $_POST['memo_'] = $_SESSION['deposit_items']->memo_; +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['deposit_items'])) + { + $_SESSION['deposit_items']->clear_items(); + unset ($_SESSION['deposit_items']); + } + + session_register("deposit_items"); + + $_SESSION['deposit_items'] = new items_cart; + $_POST['date_'] = Today(); + if (!is_date_in_fiscalyear($_POST['date_'])) + $_POST['date_'] = end_fiscalyear(); + $_SESSION['deposit_items']->tran_date = $_POST['date_']; +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $input_error = 0; + + if (!references::is_valid($_POST['ref'])) + { + display_error( _("You must enter a reference.")); + $input_error = 1; + } + elseif (!is_new_reference($_POST['ref'], systypes::bank_deposit())) + { + display_error( _("The entered reference is already in use.")); + $input_error = 1; + } + + if (!is_date($_POST['date_'])) + { + display_error(_("The entered date for the deposit is invalid.")); + $input_error = 1; + } + + if (!is_date_in_fiscalyear($_POST['date_'])) + { + display_error(_("The entered date is not in fiscal year.")); + $input_error = 1; + } + + if ($input_error == 1) + unset($_POST['Process']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $trans = add_bank_deposit($_POST['bank_account'], + $_SESSION['deposit_items'], $_POST['date_'], + $_POST['PayType'], $_POST['person_id'], $_POST['PersonDetailID'], + $_POST['type'], $_POST['ref'], $_POST['memo_']); + + $trans_type = $trans[0]; + $trans_no = $trans[1]; + + $_SESSION['deposit_items']->clear_items(); + unset($_SESSION['deposit_items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); + +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['amount'])) + { + display_error( _("The amount entered is not a valid number.")); + return false; + } + + if ($_POST['amount'] <= 0) + { + display_error( _("The amount entered must be a postitive number.")); + return false; + } + + if ($_POST['code_id'] == $_POST['bank_account']) + { + display_error( _("The source and destination accouts cannot be the same.")); + return false; + } + + if (is_bank_account($_POST['code_id'])) + { + display_error( _("You cannot make a deposit from a bank account. Please use the transfer funds facility for this.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['deposit_items']->update_gl_item($_POST['Index'], $_POST['dimension_id'], $_POST['dimension2_id'], -$_POST['amount'], $_POST['LineMemo']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['deposit_items']->remove_gl_item($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + $_SESSION['deposit_items']->add_gl_item($_POST['code_id'], $_POST['dimension_id'], $_POST['dimension2_id'], -$_POST['amount'], $_POST['LineMemo']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_py(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_py(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewDeposit']) || !isset($_SESSION['deposit_items'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_order_header($_SESSION['deposit_items']); + +start_table("$table_style width=90%", 10); +start_row(); +echo ""; +end_row(); +end_table(1); + +if (!isset($_POST['Process'])) +{ + submit_center_first('Update', _("Update")); + if ($_SESSION['deposit_items']->count_gl_items() >= 1) + submit_center_last('Process', _("Process Deposit")); +} + +end_form(); + +//------------------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/gl_journal.php b/gl/gl_journal.php new file mode 100644 index 00000000..7ac7b703 --- /dev/null +++ b/gl/gl_journal.php @@ -0,0 +1,288 @@ +tran_date = $_POST['date_']; + $_SESSION['journal_items']->transfer_type = check_value('Reverse'); + $_SESSION['journal_items']->memo_ = $_POST['memo_']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_je() +{ + $_POST['date_'] = $_SESSION['journal_items']->tran_date; + $_POST['Reverse'] = $_SESSION['journal_items']->transfer_type; + $_POST['memo_'] = $_SESSION['journal_items']->memo_; +} + +//---------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['journal_items'])) + { + $_SESSION['journal_items']->clear_items(); + unset ($_SESSION['journal_items']); + } + + session_register("journal_items"); + + $_SESSION['journal_items'] = new items_cart; + + $_POST['date_'] = Today(); + if (!is_date_in_fiscalyear($_POST['date_'])) + $_POST['date_'] = end_fiscalyear(); + $_SESSION['journal_items']->tran_date = $_POST['date_']; +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $input_error = 0; + + if (!is_date($_POST['date_'])) + { + display_error(_("The entered date is invalid.")); + $input_error = 1; + } + elseif (!is_date_in_fiscalyear($_POST['date_'])) + { + display_error(_("The entered date is not in fiscal year.")); + $input_error = 1; + } + elseif (!references::is_valid($_POST['ref'])) + { + display_error( _("You must enter a reference.")); + $input_error = 1; + } + elseif (references::exists(systypes::journal_entry(), $_POST['ref'])) + { + display_error( _("The entered reference is already in use.")); + $input_error = 1; + } + + if ($input_error == 1) + unset($_POST['Process']); +} + +if (isset($_POST['Process'])) +{ + + $trans_no = add_journal_entries($_SESSION['journal_items']->gl_items, + $_POST['date_'], $_POST['ref'], check_value('Reverse'), $_POST['memo_']); + + $_SESSION['journal_items']->clear_items(); + unset($_SESSION['journal_items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (isset($_POST['dimension_id']) && $_POST['dimension_id'] != 0 && dimension_is_closed($_POST['dimension_id'])) + { + display_error(_("Dimension is closed.")); + return false; + } + + if (isset($_POST['dimension2_id']) && $_POST['dimension2_id'] != 0 && dimension_is_closed($_POST['dimension2_id'])) + { + display_error(_("Dimension is closed.")); + return false; + } + + if (strlen($_POST['AmountDebit']) && strlen($_POST['AmountCredit'])) + { + display_error(_("You cannot enter both a debit amount and a credit amount.")); + return false; + } + + if ((!isset($_POST['AmountDebit']) && !isset($_POST['AmountCredit'])) + || ($_POST['AmountDebit'] == "" && $_POST['AmountCredit'] == "")) + { + display_error(_("You must enter either a debit amount or a credit amount.")); + return false; + } + + if (isset($_POST['AmountDebit']) && $_POST['AmountDebit'] != "") + { + + if (!is_numeric($_POST['AmountDebit'])) + { + display_error(_("The debit amount entered is not a valid number.")); + return false; + } + + if ($_POST['AmountDebit'] <= 0) + { + display_error(_("The debit amount entered cannot be zero or negative.")); + return false; + } + } + + if (isset($_POST['AmountCredit']) && $_POST['AmountCredit'] != "") + { + + if (!is_numeric($_POST['AmountCredit'])) + { + display_error(_("The credit amount entered is not a valid number.")); + return false; + } + + if ($_POST['AmountCredit'] <= 0) + { + display_error(_("The credit amount entered cannot be zero or negative.")); + return false; + } + } + + if ($_SESSION["wa_current_user"]->access != 2 && is_bank_account($_POST['code_id'])) + { + display_error(_("You cannot make a journal entry for a bank account. Please use one of the banking functions for bank transactions.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + if ($_POST['AmountDebit'] > 0) + $amount = $_POST['AmountDebit']; + else + $amount = -$_POST['AmountCredit']; + + $_SESSION['journal_items']->update_gl_item($_POST['Index'], $_POST['dimension_id'], + $_POST['dimension2_id'], $amount, $_POST['LineMemo']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['journal_items']->remove_gl_item($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + if ($_POST['AmountDebit'] > 0) + $amount = $_POST['AmountDebit']; + else + $amount = -$_POST['AmountCredit']; + + $_SESSION['journal_items']->add_gl_item($_POST['code_id'], $_POST['dimension_id'], + $_POST['dimension2_id'], $amount, $_POST['LineMemo']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_je(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_je(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewJournal']) || !isset($_SESSION['journal_items'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +start_form(); + +display_order_header($_SESSION['journal_items']); + +start_table("$table_style2 width=90%", 10); +start_row(); +echo ""; +end_row(); +end_table(1); + +if (!isset($_POST['Process'])) +{ + if ($_SESSION['journal_items']->count_gl_items() >= 1 && + abs($_SESSION['journal_items']->gl_items_total()) < 0.0001) + { + submit_center('Process', _("Process Journal Entry")); + } + else + { + display_note(_("The journal must balance (debits equal to credits) before it can be processed."), 0, 1); + } +} + +end_form(); + +//------------------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/gl_payment.php b/gl/gl_payment.php new file mode 100644 index 00000000..9f2d5067 --- /dev/null +++ b/gl/gl_payment.php @@ -0,0 +1,257 @@ +from_loc = $_POST['bank_account']; + $_SESSION['pay_items']->tran_date = $_POST['date_']; + $_SESSION['pay_items']->transfer_type = $_POST['type']; + $_SESSION['pay_items']->increase = $_POST['PayType']; + if (isset($_POST['person_id'])) + $_POST['person_id'] = 0; + $_SESSION['pay_items']->person_id = $_POST['person_id']; + if (!isset($_POST['PersonDetailID'])) + $_POST['PersonDetailID'] = 0; + $_SESSION['pay_items']->branch_id = $_POST['PersonDetailID']; + $_SESSION['pay_items']->memo_ = $_POST['memo_']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_py() +{ + $_POST['bank_account'] = $_SESSION['pay_items']->from_loc; + $_POST['date_'] = $_SESSION['pay_items']->tran_date; + $_POST['type'] = $_SESSION['pay_items']->transfer_type; + $_POST['PayType'] = $_SESSION['pay_items']->increase; + $_POST['person_id'] = $_SESSION['pay_items']->person_id; + $_POST['PersonDetailID'] = $_SESSION['pay_items']->branch_id; + $_POST['memo_'] = $_SESSION['pay_items']->memo_; +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['pay_items'])) + { + $_SESSION['pay_items']->clear_items(); + unset ($_SESSION['pay_items']); + } + + session_register("pay_items"); + + $_SESSION['pay_items'] = new items_cart; + + $_POST['date_'] = Today(); + if (!is_date_in_fiscalyear($_POST['date_'])) + $_POST['date_'] = end_fiscalyear(); + $_SESSION['pay_items']->tran_date = $_POST['date_']; +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $input_error = 0; + + if (!references::is_valid($_POST['ref'])) + { + display_error( _("You must enter a reference.")); + $input_error = 1; + } + elseif (!is_new_reference($_POST['ref'], systypes::bank_payment())) + { + display_error( _("The entered reference is already in use.")); + $input_error = 1; + } + elseif (!is_date($_POST['date_'])) + { + display_error(_("The entered date for the payment is invalid.")); + $input_error = 1; + } + elseif (!is_date_in_fiscalyear($_POST['date_'])) + { + display_error(_("The entered date is not in fiscal year.")); + $input_error = 1; + } + + if ($input_error == 1) + unset($_POST['Process']); +} + +if (isset($_POST['Process'])) +{ + + $trans = add_bank_payment($_POST['bank_account'], + $_SESSION['pay_items'], $_POST['date_'], + $_POST['PayType'], $_POST['person_id'], $_POST['PersonDetailID'], + $_POST['type'], $_POST['ref'], $_POST['memo_']); + + $trans_type = $trans[0]; + $trans_no = $trans[1]; + + $_SESSION['pay_items']->clear_items(); + unset($_SESSION['pay_items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); + +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['amount'])) + { + display_error( _("The amount entered is not a valid number.")); + return false; + } + + if ($_POST['amount'] <= 0) + { + display_error( _("The amount entered must be a postitive number.")); + return false; + } + + if ($_POST['code_id'] == $_POST['bank_account']) + { + display_error( _("The source and destination accouts cannot be the same.")); + return false; + } + + if (is_bank_account($_POST['code_id'])) + { + display_error( _("You cannot make a payment to a bank account. Please use the transfer funds facility for this.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['pay_items']->update_gl_item($_POST['Index'], $_POST['dimension_id'], + $_POST['dimension2_id'], $_POST['amount'], $_POST['LineMemo']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['pay_items']->remove_gl_item($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + $_SESSION['pay_items']->add_gl_item($_POST['code_id'], $_POST['dimension_id'], + $_POST['dimension2_id'], $_POST['amount'], $_POST['LineMemo']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_py(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_py(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewPayment']) || !isset($_SESSION['pay_items'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_order_header($_SESSION['pay_items']); + +start_table("$table_style2 width=90%", 10); +start_row(); +echo ""; +end_row(); +end_table(1); + +if (!isset($_POST['Process'])) +{ + submit_center_first('Update', _("Update")); + if ($_SESSION['pay_items']->count_gl_items() >= 1) + submit_center_last('Process', _("Process Payment")); +} + +end_form(); + +//------------------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/includes/db/gl_db_account_types.inc b/gl/includes/db/gl_db_account_types.inc new file mode 100644 index 00000000..a9c38573 --- /dev/null +++ b/gl/includes/db/gl_db_account_types.inc @@ -0,0 +1,104 @@ + \ No newline at end of file diff --git a/gl/includes/db/gl_db_accounts.inc b/gl/includes/db/gl_db_accounts.inc new file mode 100644 index 00000000..e48823f3 --- /dev/null +++ b/gl/includes/db/gl_db_accounts.inc @@ -0,0 +1,92 @@ += '$from'"; + if ($to != null) + $sql .= " AND ".TB_PREF."chart_master.account_code <= '$to'"; + $sql .= " ORDER BY account_code"; + + return db_query($sql, "could not get gl accounts"); +} + +function get_gl_accounts_all($balance=-1) +{ + $sql = "SELECT ".TB_PREF."chart_master.*,".TB_PREF."chart_types.name AS AccountTypeName,".TB_PREF."chart_class.class_name AS AccountClassName + FROM ".TB_PREF."chart_master,".TB_PREF."chart_types, ".TB_PREF."chart_class + WHERE ".TB_PREF."chart_master.account_type=".TB_PREF."chart_types.id AND + ".TB_PREF."chart_types.class_id=".TB_PREF."chart_class.cid"; + if ($balance != -1) + $sql .= " AND ".TB_PREF."chart_class.balance_sheet=$balance"; + $sql .= " ORDER BY ".TB_PREF."chart_class.cid, ".TB_PREF."chart_types.id, ".TB_PREF."chart_master.account_code"; + + return db_query($sql, "could not get gl accounts"); +} + +function get_gl_account($code) +{ + $sql = "SELECT * FROM ".TB_PREF."chart_master WHERE account_code=$code"; + + $result = db_query($sql, "could not get gl account"); + return db_fetch($result); +} + +function is_account_balancesheet($code) +{ + $sql = "SELECT ".TB_PREF."chart_class.balance_sheet FROM ".TB_PREF."chart_class, ".TB_PREF."chart_types, ".TB_PREF."chart_master + WHERE ".TB_PREF."chart_master.account_type=".TB_PREF."chart_types.id AND + ".TB_PREF."chart_types.class_id=".TB_PREF."chart_class.cid + AND ".TB_PREF."chart_master.account_code='$code'"; + + $result = db_query($sql,"could not retreive the account class for $code"); + $row = db_fetch_row($result); + return $row[0]; +} + +function get_gl_account_name($code) +{ + $sql = "SELECT account_name from ".TB_PREF."chart_master WHERE account_code='$code'"; + + $result = db_query($sql,"could not retreive the account name for $code"); + + if (db_num_rows($result) == 1) + { + $row = db_fetch_row($result); + return $row[0]; + } + + display_db_error("could not retreive the account name for $code", $sql, true); +} + + +?> \ No newline at end of file diff --git a/gl/includes/db/gl_db_bank_accounts.inc b/gl/includes/db/gl_db_bank_accounts.inc new file mode 100644 index 00000000..138ad95a --- /dev/null +++ b/gl/includes/db/gl_db_bank_accounts.inc @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/gl/includes/db/gl_db_bank_trans.inc b/gl/includes/db/gl_db_bank_trans.inc new file mode 100644 index 00000000..88cdc555 --- /dev/null +++ b/gl/includes/db/gl_db_bank_trans.inc @@ -0,0 +1,112 @@ + 0); +} + +//---------------------------------------------------------------------------------------- + +function get_bank_trans($type, $trans_no=null, $person_type_id=null, $person_id=null) +{ + $sql = "SELECT *, bank_account_name, account_code, bank_curr_code, name AS BankTransType + FROM ".TB_PREF."bank_trans, ".TB_PREF."bank_accounts, ".TB_PREF."bank_trans_types + WHERE ".TB_PREF."bank_trans_types.id = ".TB_PREF."bank_trans.bank_trans_type_id + AND ".TB_PREF."bank_accounts.account_code=".TB_PREF."bank_trans.bank_act "; + if ($type != null) + $sql .= " AND type=$type "; + if ($trans_no != null) + $sql .= " AND ".TB_PREF."bank_trans.trans_no = $trans_no "; + if ($person_type_id != null) + $sql .= " AND ".TB_PREF."bank_trans.person_type_id = $person_type_id "; + if ($person_id != null) + $sql .= " AND ".TB_PREF."bank_trans.person_id = '$person_id'"; + $sql .= " ORDER BY trans_date, ".TB_PREF."bank_trans.id"; + + return db_query($sql, "query for bank transaction"); +} + +//---------------------------------------------------------------------------------------- + +function get_gl_trans_value($account, $type, $trans_no) +{ + $sql = "SELECT SUM(amount) FROM ".TB_PREF."gl_trans WHERE account=$account AND type=$type AND type_no=$trans_no"; + + $result = db_query($sql, "query for gl trans value"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//---------------------------------------------------------------------------------------- + +function void_bank_trans($type, $type_no, $nested=false) +{ + if (!$nested) + begin_transaction(); + + $sql = "UPDATE ".TB_PREF."bank_trans SET amount=0 + WHERE type=$type AND trans_no=$type_no"; + + $result = db_query($sql, "could not void bank transactions for type=$type and trans_no=$type_no"); + + void_gl_trans($type, $type_no, true); + + // in case it's a customer trans - probably better to check first + void_cust_allocations($type, $type_no); + void_customer_trans($type, $type_no); + + // in case it's a supplier trans - probably better to check first + void_supp_allocations($type, $type_no); + void_supp_trans($type, $type_no); + + if (!$nested) + commit_transaction(); +} + +//---------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/gl/includes/db/gl_db_bank_trans_types.inc b/gl/includes/db/gl_db_bank_trans_types.inc new file mode 100644 index 00000000..66e1cdd6 --- /dev/null +++ b/gl/includes/db/gl_db_bank_trans_types.inc @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/gl/includes/db/gl_db_banking.inc b/gl/includes/db/gl_db_banking.inc new file mode 100644 index 00000000..dbf5151a --- /dev/null +++ b/gl/includes/db/gl_db_banking.inc @@ -0,0 +1,161 @@ +gl_items_total(); + + if ($person_type_id == payment_person_types::customer()) + { + // we need to add a customer transaction record + + // convert to customer currency + $cust_amount = exchange_from_to($total_amount, $currency, get_customer_currency($person_id), $date_); + + $trans_no = add_customer_trans($trans_type, $person_id, $person_detail_id, $date_, + $ref, $cust_amount); + + } + elseif ($person_type_id == payment_person_types::supplier()) + { + // we need to add a supplier transaction record + // convert to supp currency + $supp_amount = exchange_from_to($total_amount, $currency, get_supplier_currency($person_id), $date_); + + // we need to negate it too + $supp_amount = -$supp_amount; + + $trans_no = add_supp_trans($trans_type, $person_id, $date_, '', + $ref, "", $supp_amount, 0, 0); + + } + else + { + $trans_no = get_next_trans_no($trans_type); + } + + // do the source account postings + add_gl_trans($trans_type, $trans_no, $date_, $from_account, 0, 0, "", + -$total_amount, $currency, $person_type_id, $person_id); + + add_bank_trans($trans_type, $trans_no, $from_account, $ref, + $date_, $type, -$total_amount, + $person_type_id, $person_id, + $currency, + "Cannot insert a source bank transaction"); + + foreach ($items->gl_items as $gl_item) + { + $is_bank_to = is_bank_account($gl_item->code_id); + + if ($trans_type == 1 AND $is_bank_to) + { + // we don't allow payments to go to a bank account. use transfer for this ! + display_db_error("invalid payment entered. Cannot pay to another bank account", ""); + } + + // do the destination account postings + add_gl_trans($trans_type, $trans_no, $date_, $gl_item->code_id, + $gl_item->dimension_id, $gl_item->dimension2_id, $gl_item->reference, + $gl_item->amount, $currency, $person_type_id, $person_id); + + if ($is_bank_to) + { + add_bank_trans($trans_type, $trans_no, $gl_item->code_id, $ref, + $date_, $type, $gl_item->amount, + $person_type_id, $person_id, $currency, + "Cannot insert a destination bank transaction"); + } + } + + add_comments($trans_type, $trans_no, $date_, $memo_); + + add_forms_for_sys_type($trans_type, $trans_no, $person_type_id, $person_id); + + references::save_last($ref, $trans_type); + + commit_transaction(); + + return array($trans_type, $trans_no); +} + +//---------------------------------------------------------------------------------------- + +function add_bank_payment($from_account, $items, $date_, + $person_type_id, $person_id, $person_detail_id, $type, $ref, $memo_) +{ + return add_bank_transaction(systypes::bank_payment(), $from_account, $items, $date_, + $person_type_id, $person_id, $person_detail_id, $type, $ref, $memo_); +} + +//--------------------------------------------------------------------------------------------- + +function add_bank_deposit($from_account, $items, $date_, + $person_type_id, $person_id, $person_detail_id, $type, $ref, $memo_) +{ + return add_bank_transaction(systypes::bank_deposit(), $from_account, $items, $date_, + $person_type_id, $person_id, $person_detail_id, $type, $ref, $memo_); +} + +//--------------------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/gl/includes/db/gl_db_currencies.inc b/gl/includes/db/gl_db_currencies.inc new file mode 100644 index 00000000..8c9ad979 --- /dev/null +++ b/gl/includes/db/gl_db_currencies.inc @@ -0,0 +1,55 @@ + \ No newline at end of file diff --git a/gl/includes/db/gl_db_rates.inc b/gl/includes/db/gl_db_rates.inc new file mode 100644 index 00000000..0a2c2276 --- /dev/null +++ b/gl/includes/db/gl_db_rates.inc @@ -0,0 +1,120 @@ +|i"; + preg_match ( $from_mask, $contents, $out ); + $val_a = $out[1]; + $val_a = str_replace ( ',', '', $val_a ); + $to_mask = "||i"; + preg_match ( $to_mask, $contents, $out ); + $val_b = $out[1]; + $val_b = str_replace ( ',', '', $val_b ); + if ($val_b) + { + $val = $val_a / $val_b; + } + else + { + $val = 0; + } + return $val; +} // end function get_ecb_rate + +?> \ No newline at end of file diff --git a/gl/includes/db/gl_db_trans.inc b/gl/includes/db/gl_db_trans.inc new file mode 100644 index 00000000..f6a8ef1e --- /dev/null +++ b/gl/includes/db/gl_db_trans.inc @@ -0,0 +1,266 @@ += '$from' + AND tran_date <= '$to'"; + if ($trans_no > 0) + $sql .= " AND ".TB_PREF."gl_trans.type_no LIKE '%$trans_no'"; + + if ($account != null) + $sql .= " AND ".TB_PREF."gl_trans.account = $account"; + + if ($dimension > 0) + $sql .= " AND ".TB_PREF."gl_trans.dimension_id = $dimension"; + + if ($dimension2 > 0) + $sql .= " AND ".TB_PREF."gl_trans.dimension2_id = $dimension2"; + + if ($filter_type != null AND is_numeric($filter_type)) + $sql .= " AND ".TB_PREF."gl_trans.type= $filter_type"; + + $sql .= " ORDER BY tran_date"; + + return db_query($sql, "The transactions for could not be retrieved"); +} + + +//-------------------------------------------------------------------------------- + +function get_gl_trans($type, $trans_id) +{ + $sql = "SELECT ".TB_PREF."gl_trans.*, ".TB_PREF."chart_master.account_name FROM ".TB_PREF."gl_trans, ".TB_PREF."chart_master + WHERE ".TB_PREF."chart_master.account_code=".TB_PREF."gl_trans.account + AND ".TB_PREF."gl_trans.type=$type AND ".TB_PREF."gl_trans.type_no=$trans_id"; + + return db_query($sql, "The gl transactions could not be retrieved"); +} + +//-------------------------------------------------------------------------------- + +function get_gl_balance_from_to($from_date, $to_date, $account, $dimension=0, $dimension2=0) +{ + $from = date2sql($from_date); + $to = date2sql($to_date); + + $sql = "SELECT SUM(amount) FROM ".TB_PREF."gl_trans + WHERE account='" . $account . "'"; + if ($from_date != "") + $sql .= " AND tran_date > '$from'"; + if ($to_date != "") + $sql .= " AND tran_date < '$to'"; + if ($dimension > 0) + $sql .= " AND dimension_id = $dimension"; + if ($dimension2 > 0) + $sql .= " AND dimension2_id = $dimension2"; + + $result = db_query($sql, "The starting balance for account $account could not be calculated"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//-------------------------------------------------------------------------------- + +function get_gl_trans_from_to($from_date, $to_date, $account, $dimension=0, $dimension2=0) +{ + $from = date2sql($from_date); + $to = date2sql($to_date); + + $sql = "SELECT SUM(amount) FROM ".TB_PREF."gl_trans + WHERE account='" . $account . "'"; + if ($from_date != "") + $sql .= " AND tran_date >= '$from'"; + if ($to_date != "") + $sql .= " AND tran_date <= '$to'"; + if ($dimension > 0) + $sql .= " AND dimension_id = $dimension"; + if ($dimension2 > 0) + $sql .= " AND dimension2_id = $dimension2"; + + $result = db_query($sql, "Transactions for account $account could not be calculated"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//-------------------------------------------------------------------------------- + +function get_budget_trans_from_to($from_date, $to_date, $account, $dimension=0, $dimension2=0) +{ + + $from = date2sql($from_date); + $to = date2sql($to_date); + + $sql = "SELECT SUM(amount) FROM ".TB_PREF."budget_trans + WHERE account=$account "; + if ($from_date != "") + $sql .= " AND tran_date >= '$from' "; + if ($to_date != "") + $sql .= " AND tran_date <= '$to' "; + if ($dimension > 0) + $sql .= " AND dimension_id = $dimension"; + if ($dimension2 > 0) + $sql .= " AND dimension2_id = $dimension2"; + $result = db_query($sql,"No budget accounts were returned"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//-------------------------------------------------------------------------------- + +function add_journal_entries($items, $date_, $ref, $reverse, $memo_=null) +{ + begin_transaction(); + + $trans_type = systypes::journal_entry(); + $trans_id = get_next_trans_no($trans_type); + + foreach ($items as $journal_item) + { + $is_bank_to = is_bank_account($journal_item->code_id); + + add_gl_trans($trans_type, $trans_id, $date_, $journal_item->code_id, + $journal_item->dimension_id, $journal_item->dimension2_id, + $journal_item->reference, $journal_item->amount); + if ($is_bank_to) + { + add_bank_trans($trans_type, $trans_id, $journal_item->code_id, $ref, + $date_, 3, $journal_item->amount, + 0, "", get_company_currency(), + "Cannot insert a destination bank transaction"); + } + } + + add_comments($trans_type, $trans_id, $date_, $memo_); + + references::save($trans_type, $trans_id, $ref); + + if ($reverse) + { + + $reversingDate = date(user_date_display(), + Mktime(0,0,0,get_month($date_)+1,1,get_year($date_))); + + $trans_id_reverse = get_next_trans_no($trans_type); + + foreach ($items as $journal_item) + { + $is_bank_to = is_bank_account($journal_item->code_id); + + add_gl_trans($trans_type, $trans_id_reverse, $reversingDate, + $journal_item->code_id, $journal_item->dimension_id, $journal_item->dimension2_id, + $journal_item->reference, -$journal_item->amount); + if ($is_bank_to) + { + add_bank_trans($trans_type, $trans_id_reverse, $journal_item->code_id, $ref, + $reversingDate, 3, $journal_item->amount, + 0, "", get_company_currency(), + "Cannot insert a destination bank transaction"); + } + } + + add_comments($trans_type, $trans_id_reverse, $reversingDate, $memo_); + + references::save($trans_type, $trans_id_reverse, $ref); + } + + commit_transaction(); + + return $trans_id; +} + +//-------------------------------------------------------------------------------------------------- + +function exists_gl_trans($type, $trans_id) +{ + $sql = "SELECT type_no FROM ".TB_PREF."gl_trans WHERE type=$type AND type_no=$trans_id"; + $result = db_query($sql, "Cannot retreive a gl transaction"); + + return (db_num_rows($result) > 0); +} + +//-------------------------------------------------------------------------------------------------- + +function void_gl_trans($type, $trans_id, $nested=false) +{ + if (!$nested) + begin_transaction(); + + $sql = "UPDATE ".TB_PREF."gl_trans SET amount=0 WHERE type=$type AND type_no=$trans_id"; + + db_query($sql, "could not void gl transactions for type=$type and trans_no=$trans_id"); + + if (!$nested) + commit_transaction(); +} + +//-------------------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/gl/includes/db/index.php b/gl/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/includes/gl_db.inc b/gl/includes/gl_db.inc new file mode 100644 index 00000000..8e894234 --- /dev/null +++ b/gl/includes/gl_db.inc @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/gl/includes/gl_ui.inc b/gl/includes/gl_ui.inc new file mode 100644 index 00000000..55f2102d --- /dev/null +++ b/gl/includes/gl_ui.inc @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/gl/includes/index.php b/gl/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/includes/ui/gl_deposit_ui.inc b/gl/includes/ui/gl_deposit_ui.inc new file mode 100644 index 00000000..3f65b68c --- /dev/null +++ b/gl/includes/ui/gl_deposit_ui.inc @@ -0,0 +1,249 @@ +"; + + end_table(1); // outer table +} + +//--------------------------------------------------------------------------------- + +function display_gl_items($title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($title); + + $dim = get_company_pref('use_dimension'); + $colspan = ($dim == 2 ? 4 : ($dim == 1 ? 3 : 2)); + + start_table("$table_style colspan=7 width=95%"); + + if ($dim == 2) + $th = array(_("Account Code"), _("Account Description"), _("Dimension")." 1", + _("Dimension")." 2", _("Amount"), _("Memo")); + else if ($dim == 1) + $th = array(_("Account Code"), _("Account Description"), _("Dimension"), + _("Amount"), _("Memo")); + else + $th = array(_("Account Code"), _("Account Description"), + _("Amount"), _("Memo")); + table_header($th); + + $k = 0; //row colour counter + + foreach ($order->gl_items as $item) + { + if (!isset($_GET['Edit']) || $_GET['Edit'] != $item->index) + { + alt_table_row_color($k); + + label_cells($item->code_id, $item->description); + if ($dim >= 1) + label_cell(get_dimension_string($item->dimension_id, true)); + if ($dim > 1) + label_cell(get_dimension_string($item->dimension2_id, true)); + amount_cell(abs($item->amount)); + label_cell($item->reference); + edit_link_cell("Edit=$item->index"); + delete_link_cell("Delete=$item->index"); + end_row(); + } + else + { + gl_edit_item_controls($order, $dim, $item->index); + } + } + + if (!isset($_GET['Edit'])) + gl_edit_item_controls($order, $dim); + + if ($order->count_gl_items()) + label_row(_("Total"), number_format2(abs($order->gl_items_total()), user_price_dec()),"colspan=" . $colspan . " align=right", "align=right"); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function gl_edit_item_controls(&$order, $dim, $Index=null) +{ + start_row(); + + if (isset($_GET['Edit']) && $Index != null) + { + if (!isset($_POST['code_id'])) + $_POST['code_id'] = $order->gl_items[$Index]->code_id; + if (!isset($_POST['dimension_id'])) + $_POST['dimension_id'] = $order->gl_items[$Index]->dimension_id; + if (!isset($_POST['dimension2_id'])) + $_POST['dimension2_id'] = $order->gl_items[$Index]->dimension2_id; + if (!isset($_POST['amount']) || ($_POST['amount'] == "")) + $_POST['amount'] = -$order->gl_items[$Index]->amount; + if (!isset($_POST['description']) || ($_POST['description'] == "")) + $_POST['description'] = $order->gl_items[$Index]->description; + if (!isset($_POST['LineMemo']) || ($_POST['LineMemo'] == "")) + $_POST['LineMemo'] = $order->gl_items[$Index]->reference; + + hidden('Index', $order->gl_items[$Index]->index); + hidden('code_id', $order->gl_items[$Index]->code_id); + + label_cell($_POST['code_id']); + label_cell($order->gl_items[$Index]->description); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', $_POST['dimension_id'], true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', $_POST['dimension2_id'], true, " ", false, 2); + } + else + { + $_POST['amount'] = 0; + $_POST['dimension_id'] = 0; + $_POST['dimension2_id'] = 0; + $_POST['LineMemo'] = ""; + + if ($_POST['PayType'] == payment_person_types::customer()) + { + $acc = get_branch_accounts($_POST['PersonDetailID']); + $_POST['code_id'] = $acc['receivables_account']; + } + elseif ($_POST['PayType'] == payment_person_types::supplier()) + { + $acc = get_supplier_accounts($_POST['person_id']); + $_POST['code_id'] = $acc['payable_account']; + } + elseif ($_POST['PayType'] == payment_person_types::WorkOrder()) + $_POST['code_id'] = get_company_pref('default_assembly_act'); + else + $_POST['code_id'] = get_company_pref('default_inv_sales_act'); + text_cells(null, "CodeID2", $_POST['code_id'], 12, 10, "", "", "onkeyup='recalcAccounts();' onblur='return setAccount(0, false);'"); + gl_all_accounts_list_cells(null, 'code_id', $_POST['code_id'], true, false, "return setAccount(1, false)"); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', null, true, " ", false, 2); + } + if ($dim < 1) + hidden('dimension_id', 0); + if ($dim < 2) + hidden('dimension2_id', 0); + + amount_cells(null, 'amount'); + text_cells_ex(null, 'LineMemo', 35, 50); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add item"), "colspan=2"); + } + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function gl_options_controls() +{ + echo "
"; +display_gl_items(_("Deposit Items"), $_SESSION['deposit_items']); +gl_options_controls(); +echo ""; +display_gl_items(_("Rows"), $_SESSION['journal_items']); +gl_options_controls(); +echo ""; +display_gl_items(_("Payment Items"), $_SESSION['pay_items']); +gl_options_controls(); +echo " "; // outer table + + echo ""; + + bank_accounts_list_row(_("To:"), 'bank_account', null, true); + + date_row(_("Date:"), 'date_'); + + echo "
"; + + echo "
"; // outer table + + echo ""; + + if (!isset($_POST['PayType'])) + { + if (isset($_GET['PayType'])) + $_POST['PayType'] = $_GET['PayType']; + else + $_POST['PayType'] = ""; + } + if (!isset($_POST['person_id'])) + { + if (isset($_GET['PayPerson'])) + $_POST['person_id'] = $_GET['PayPerson']; + else + $_POST['person_id'] = ""; + } + payment_person_types_list_row(_("From:"), 'PayType', $_POST['PayType'], 'person_id'); + + switch ($_POST['PayType']) + { + case payment_person_types::misc() : + text_row_ex(_("Name:"), 'person_id', 40, 50); + break; + case payment_person_types::WorkOrder() : + workorders_list_row(_("Work Order:"), 'person_id', null); + break; + case payment_person_types::supplier() : + supplier_list_row(_("Supplier:"), 'person_id', null, false, true); + break; + case payment_person_types::customer() : + customer_list_row(_("Customer:"), 'person_id', null, false, true); + + if (db_customer_has_branches($_POST['person_id'])) + { + customer_branches_list_row(_("Branch:"), $_POST['person_id'], 'PersonDetailID', null, false, true, true); + } + else + { + hidden('BranchID', reserved_words::get_any_numeric()); + } + break; + //case payment_person_types::Project() : + // dimensions_list_row(_("Dimension:"), 'person_id', $_POST['person_id'], false, null, true); + // break; + } + + //$homeCurrency = get_company_currency(); + $person_currency = payment_person_types::person_currency($_POST['PayType'], $_POST['person_id']); + $bank_currency = get_bank_account_currency($_POST['bank_account']); + + if ($bank_currency != "" && $bank_currency != $person_currency) + { + exchange_rate_display($bank_currency, $person_currency, $_POST['date_']); + } + + echo "
"; + + echo "
"; // outer table + + echo ""; + + bank_trans_types_list_row(_("Type:"), 'type', null); + + ref_row(_("Reference:"), 'ref', references::get_next(systypes::bank_deposit())); + + echo "
"; + + echo "
"; + + textarea_row(_("Memo"), 'memo_', null, 50, 3); + + echo "
"; +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/gl/includes/ui/gl_journal_ui.inc b/gl/includes/ui/gl_journal_ui.inc new file mode 100644 index 00000000..1b3c232f --- /dev/null +++ b/gl/includes/ui/gl_journal_ui.inc @@ -0,0 +1,196 @@ +
"; // outer table + + echo ""; + start_row(); + date_cells(_("Date:"), 'date_'); + ref_cells(_("Reference:"), 'ref', references::get_next(0)); + end_row(); + + echo "
"; + + echo "
"; // outer table + + echo ""; + + check_row(_("Reverse Transaction:"), 'Reverse', null); + + echo "
"; + + echo "
"; + + textarea_row(_("Memo"), 'memo_', null, 50, 3); + + echo "
"; +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/gl/includes/ui/gl_payment_ui.inc b/gl/includes/ui/gl_payment_ui.inc new file mode 100644 index 00000000..2a4e9f41 --- /dev/null +++ b/gl/includes/ui/gl_payment_ui.inc @@ -0,0 +1,246 @@ +"; + + echo ""; // inner table + + bank_accounts_list_row(_("From:"), 'bank_account', null, true); + + date_row(_("Date:"), 'date_'); + + echo "
"; // inner table + + echo ""; + + echo ""; // inner table + + if (!isset($_POST['PayType'])) + { + if (isset($_GET['PayType'])) + $_POST['PayType'] = $_GET['PayType']; + else + $_POST['PayType'] = ""; + } + if (!isset($_POST['person_id'])) + { + if (isset($_GET['PayPerson'])) + $_POST['person_id'] = $_GET['PayPerson']; + else + $_POST['person_id'] = ""; + } + payment_person_types_list_row(_("Pay To:"), 'PayType', $_POST['PayType'], 'person_id'); + + switch ($_POST['PayType']) + { + case payment_person_types::misc() : + text_row_ex(_("To the Order of:"), 'person_id', 40, 50); + break; + case payment_person_types::WorkOrder() : + workorders_list_row(_("Work Order:"), 'person_id', null); + break; + case payment_person_types::supplier() : + supplier_list_row(_("Supplier:"), 'person_id', null, false, true); + break; + case payment_person_types::customer() : + customer_list_row(_("Customer:"), 'person_id', null, false, true); + + if (db_customer_has_branches($_POST['person_id'])) + { + customer_branches_list_row(_("Branch:"), $_POST['person_id'], 'PersonDetailID', null, false, true, true); + } + else + { + hidden('BranchID', reserved_words::get_any_numeric()); + } + break; + //case payment_person_types::Project() : + // dimensions_list_row(_("Dimension:"), 'person_id', $_POST['person_id'], false, null, true); + // break; + } + + //$homeCurrency = get_company_currency(); + $person_currency = payment_person_types::person_currency($_POST['PayType'], $_POST['person_id']); + $bank_currency = get_bank_account_currency($_POST['bank_account']); + + if ($bank_currency != "" && $bank_currency != $person_currency) + { + exchange_rate_display($bank_currency, $person_currency, $_POST['date_']); + } + + echo "
"; // inner table + + echo ""; + + echo ""; // inner table + + bank_trans_types_list_row(_("Payment Type:"), 'type', null); + + ref_row(_("Reference:"), 'ref', references::get_next(systypes::bank_payment())); + + echo "
"; // inner table + + echo ""; + + end_table(1); // outer table +} + +//--------------------------------------------------------------------------------- + +function display_gl_items($title, &$order) +{ + global $table_style, $path_to_root; + + $dim = get_company_pref('use_dimension'); + $colspan = ($dim == 2 ? 4 : ($dim == 1 ? 3 : 2)); + display_heading($title); + + start_table("$table_style colspan=7 width=95%"); + + if ($dim == 2) + $th = array(_("Account Code"), _("Account Description"), _("Dimension")." 1", + _("Dimension")." 2", _("Amount"), _("Memo")); + else if ($dim == 1) + $th = array(_("Account Code"), _("Account Description"), _("Dimension"), + _("Amount"), _("Memo")); + else + $th = array(_("Account Code"), _("Account Description"), + _("Amount"), _("Memo")); + table_header($th); + $k = 0; //row colour counter + + foreach ($order->gl_items as $item) + { + if (!isset($_GET['Edit']) || $_GET['Edit'] != $item->index) + { + alt_table_row_color($k); + + label_cell($item->code_id); + label_cell($item->description); + if ($dim >= 1) + label_cell(get_dimension_string($item->dimension_id, true)); + if ($dim > 1) + label_cell(get_dimension_string($item->dimension2_id, true)); + amount_cell($item->amount); + label_cell($item->reference); + + edit_link_cell("Edit=$item->index"); + delete_link_cell("Delete=$item->index"); + end_row(); + } + else + { + gl_edit_item_controls($order, $dim, $item->index); + } + } + + if (!isset($_GET['Edit'])) + gl_edit_item_controls($order, $dim); + + if ($order->count_gl_items()) + label_row(_("Total"), number_format2(abs($order->gl_items_total()), user_price_dec()),"colspan=" . $colspan . " align=right", "align=right"); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function gl_edit_item_controls(&$order, $dim, $Index=null) +{ + start_row(); + + if (isset($_GET['Edit']) and $Index!=null) + { + if (!isset($_POST['code_id'])) + $_POST['code_id'] = $order->gl_items[$Index]->code_id; + if (!isset($_POST['dimension_id'])) + $_POST['dimension_id'] = $order->gl_items[$Index]->dimension_id; + if (!isset($_POST['dimension2_id'])) + $_POST['dimension2_id'] = $order->gl_items[$Index]->dimension2_id; + if (!isset($_POST['amount']) OR ($_POST['amount']=="")) + $_POST['amount'] = $order->gl_items[$Index]->amount; + if (!isset($_POST['description']) OR ($_POST['description']=="")) + $_POST['description'] = $order->gl_items[$Index]->description; + if (!isset($_POST['LineMemo']) OR ($_POST['LineMemo']=="")) + $_POST['LineMemo'] = $order->gl_items[$Index]->reference; + + hidden('Index', $order->gl_items[$Index]->index); + hidden('code_id', $order->gl_items[$Index]->code_id); + label_cell($_POST['code_id']); + label_cell($order->gl_items[$Index]->description); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', $_POST['dimension_id'], true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', $_POST['dimension2_id'], true, " ", false, 2); + } + else + { + $_POST['amount'] = 0; + $_POST['dimension_id'] = 0; + $_POST['dimension2_id'] = 0; + $_POST['LineMemo'] = ""; + + if ($_POST['PayType'] == payment_person_types::customer()) + { + $acc = get_branch_accounts($_POST['PersonDetailID']); + $_POST['code_id'] = $acc['receivables_account']; + } + elseif ($_POST['PayType'] == payment_person_types::supplier()) + { + $acc = get_supplier_accounts($_POST['person_id']); + $_POST['code_id'] = $acc['payable_account']; + } + elseif ($_POST['PayType'] == payment_person_types::WorkOrder()) + $_POST['code_id'] = get_company_pref('default_assembly_act'); + else + $_POST['code_id'] = get_company_pref('default_cogs_act'); + text_cells(null, "CodeID2", $_POST['code_id'], 12, 10, "", "", "onkeyup='recalcAccounts()' onblur='return setAccount(0, false)'"); + gl_all_accounts_list_cells(null, 'code_id', $_POST['code_id'], true, false, "return setAccount(1, false)"); + if ($dim >= 1) + dimensions_list_cells(null, 'dimension_id', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_cells(null, 'dimension2_id', null, true, " ", false, 2); + } + if ($dim < 1) + hidden('dimension_id', 0); + if ($dim < 2) + hidden('dimension2_id', 0); + + amount_cells(null, 'amount'); + text_cells_ex(null, 'LineMemo', 35, 50); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + submit_cells('AddItem', _("Add Item"), "colspan=2"); + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function gl_options_controls() +{ + echo "
"; + + textarea_row(_("Memo"), 'memo_', null, 50, 3); + + echo "
"; +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/gl/includes/ui/index.php b/gl/includes/ui/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/includes/ui/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/index.php b/gl/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/inquiry/bank_inquiry.php b/gl/inquiry/bank_inquiry.php new file mode 100644 index 00000000..1ff07159 --- /dev/null +++ b/gl/inquiry/bank_inquiry.php @@ -0,0 +1,116 @@ += '$date_after' + AND trans_date <= '$date_to' + AND ".TB_PREF."bank_trans_types.id = ".TB_PREF."bank_trans.bank_trans_type_id + ORDER BY trans_date,".TB_PREF."bank_trans.id"; + +$result = db_query($sql,"The transactions for '" . $_POST['bank_account'] . "' could not be retrieved"); + +$act = get_bank_account($_POST["bank_account"]); +display_heading($act['bank_account_name']." - ".$act['bank_curr_code']); + +start_table($table_style); + +$th = array(_("Type"), _("#"), _("Reference"), _("Type"), _("Date"), + _("Debit"), _("Credit"), _("Balance"), _("Person/Item"), ""); +table_header($th); + +$sql = "SELECT SUM(amount) FROM ".TB_PREF."bank_trans WHERE bank_act='" . $_POST['bank_account'] . "' + AND trans_date < '$date_after'"; +$before_qty = db_query($sql, "The starting balance on hand could not be calculated"); + +start_row("class='inquirybg'"); +label_cell(""._("Opening Balance")." - ".$_POST['TransAfterDate']."", "colspan=5"); +$bfw_row = db_fetch_row($before_qty); +$bfw = $bfw_row[0]; +display_debit_or_credit_cells($bfw); +label_cell(""); + +end_row(); +$running_total = $bfw; +$j = 1; +$k = 0; //row colour counter +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + $running_total += $myrow["amount"]; + + $trandate = sql2date($myrow["trans_date"]); + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"])); + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"],$myrow['ref'])); + label_cell($myrow["BankTransType"]); + label_cell($trandate); + display_debit_or_credit_cells($myrow["amount"]); + amount_cell($running_total); + label_cell(payment_person_types::person_name($myrow["person_type_id"],$myrow["person_id"])); + label_cell(get_gl_view_str($myrow["type"], $myrow["trans_no"])); + end_row(); + + if ($j == 12) + { + $j = 1; + table_header($th); + } + $j++; +} +//end of while loop + +start_row("class='inquirybg'"); +label_cell("" . _("Ending Balance")." - ". $_POST['TransToDate']. "", "colspan=5"); +display_debit_or_credit_cells($running_total); +label_cell(""); +end_row(); +end_table(2); + +//------------------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/inquiry/gl_account_inquiry.php b/gl/inquiry/gl_account_inquiry.php new file mode 100644 index 00000000..94ef03bf --- /dev/null +++ b/gl/inquiry/gl_account_inquiry.php @@ -0,0 +1,164 @@ += 1) + dimensions_list_row(_("Dimension")." 1", 'Dimension', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_row(_("Dimension")." 2", 'Dimension2', null, true, " ", false, 2); + end_table(); + + end_form(); +} + +//---------------------------------------------------------------------------------------------------- + +function show_results() +{ + global $path_to_root, $table_style; + + if (!isset($_POST["account"]) || $_POST["account"] == "") + return; + $act_name = get_gl_account_name($_POST["account"]); + $dim = get_company_pref('use_dimension'); + + /*Now get the transactions */ + if (!isset($_POST['Dimension'])) + $_POST['Dimension'] = 0; + if (!isset($_POST['Dimension2'])) + $_POST['Dimension2'] = 0; + $result = get_gl_transactions($_POST['TransFromDate'], $_POST['TransToDate'], -1, + $_POST["account"], $_POST['Dimension'], $_POST['Dimension2']); + + if (db_num_rows($result) == 0) + { + display_note(_("No general ledger transactions have been created for this account on the selected dates."), 0, 1); + return; + } + $colspan = ($dim == 2 ? "6" : ($dim == 1 ? "5" : "4")); + //echo "\nDimension =". $_POST['Dimension']; + display_heading($_POST["account"]. "   ".$act_name); + + start_table($table_style); + if ($dim == 2) + $th = array(_("Type"), _("#"), _("Date"), _("Dimension")." 1", _("Dimension")." 2", + _("Person/Item"), _("Debit"), _("Credit"), _("Balance"), _("Memo")); + else if ($dim == 1) + $th = array(_("Type"), _("#"), _("Date"), _("Dimension"), + _("Person/Item"), _("Debit"), _("Credit"), _("Balance"), _("Memo")); + else + $th = array(_("Type"), _("#"), _("Date"), + _("Person/Item"), _("Debit"), _("Credit"), _("Balance"), _("Memo")); + table_header($th); + $bfw = get_gl_balance_from_to("", $_POST['TransFromDate'], $_POST["account"], $_POST['Dimension'], $_POST['Dimension2']); + + start_row("class='inquirybg'"); + label_cell(""._("Opening Balance")." - ".$_POST['TransFromDate']."", "colspan=$colspan"); + display_debit_or_credit_cells($bfw); + label_cell(""); + end_row(); + //$running_total =0; + $running_total = $bfw; + $j = 1; + $k = 0; //row colour counter + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + $running_total += $myrow["amount"]; + + $trandate = sql2date($myrow["tran_date"]); + + label_cell(systypes::name($myrow["type"])); + label_cell(get_gl_view_str($myrow["type"], $myrow["type_no"], $myrow["type_no"], true)); + label_cell($trandate); + if ($dim >= 1) + label_cell(get_dimension_string($myrow['dimension_id'], true)); + if ($dim > 1) + label_cell(get_dimension_string($myrow['dimension2_id'], true)); + label_cell(payment_person_types::person_name($myrow["person_type_id"],$myrow["person_id"])); + display_debit_or_credit_cells($myrow["amount"]); + amount_cell($running_total); + label_cell($myrow['memo_']); + end_row(); + + $j++; + if ($j == 12) + { + $j = 1; + table_header($th); + } + } + //end of while loop + + start_row("class='inquirybg'"); + label_cell("" . _("Ending Balance") ." - ".$_POST['TransToDate']. "", "colspan=$colspan"); + display_debit_or_credit_cells($running_total); + label_cell(""); + end_row(); + + end_table(2); +} + +//---------------------------------------------------------------------------------------------------- + +gl_inquiry_controls(); + +show_results(); + +//---------------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/gl/inquiry/gl_trial_balance.php b/gl/inquiry/gl_trial_balance.php new file mode 100644 index 00000000..28653ff0 --- /dev/null +++ b/gl/inquiry/gl_trial_balance.php @@ -0,0 +1,129 @@ += '$from_date'"; + else + $sql .= " AND tran_date > '$from_date'"; + } + + if ($to) + { + $to_date = date2sql($to); + if ($to_incl) + $sql .= " AND tran_date <= '$to_date' "; + else + $sql .= " AND tran_date < '$to_date' "; + } + + $result = db_query($sql,"No general ledger accounts were returned"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//---------------------------------------------------------------------------------------------------- + +function display_trial_balance() +{ + global $table_style, $path_to_root; + + start_table($table_style); + $tableheader = " + " . _("Account") . " + " . _("Account Name") . " + " . _("Brought Forward") . " + " . _("This Period") . " + " . _("Balance") . " + + " . _("Debit") . " + " . _("Credit") . " + " . _("Debit") . " + " . _("Credit") . " + " . _("Debit") . " + " . _("Credit") . " + "; + + echo $tableheader; + + $k = 0; + + $accounts = get_gl_accounts(); + + while ($account = db_fetch($accounts)) + { + + $prev_balance = get_balance($account["account_code"], null, $_POST['TransFromDate'], false, false); + + $curr_balance = get_balance($account["account_code"], $_POST['TransFromDate'], $_POST['TransToDate']); + if (check_value("NoZero") && !$prev_balance && !$curr_balance) + continue; + alt_table_row_color($k); + + $url = "" . $account["account_code"] . ""; + + label_cell($url); + label_cell($account["account_name"]); + + display_debit_or_credit_cells($prev_balance); + display_debit_or_credit_cells($curr_balance); + display_debit_or_credit_cells($prev_balance + $curr_balance); + end_row(); + } + + end_table(1); + +} + +//---------------------------------------------------------------------------------------------------- + +gl_inquiry_controls(); + +display_trial_balance(); + +//---------------------------------------------------------------------------------------------------- + +end_page(); + +?> + diff --git a/gl/inquiry/index.php b/gl/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/manage/bank_accounts.php b/gl/manage/bank_accounts.php new file mode 100644 index 00000000..6f1d3cd0 --- /dev/null +++ b/gl/manage/bank_accounts.php @@ -0,0 +1,169 @@ + 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this bank account because transactions have been created using this account.")); + } + if (!$cancel_delete) + { + delete_bank_account($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } //end if Delete bank account +} + +/* Always show the list of accounts */ + +$sql = "SELECT ".TB_PREF."bank_accounts.*, ".TB_PREF."chart_master.account_name FROM ".TB_PREF."bank_accounts, ".TB_PREF."chart_master + WHERE ".TB_PREF."bank_accounts.account_code = ".TB_PREF."chart_master.account_code"; +$result = db_query($sql,"could not get bank accounts"); + +check_db_error("The bank accounts set up could not be retreived", $sql); + +start_table("$table_style width='80%'"); + +$th = array(_("GL Account"), _("Bank"), _("Account Name"), + _("Type"), _("Number"), _("Currency"), _("Bank Address")); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["account_code"] . " " . $myrow["account_name"]); + label_cell($myrow["bank_name"]); + label_cell($myrow["bank_account_name"]); + label_cell(bank_account_types::name($myrow["account_type"])); + label_cell($myrow["bank_account_number"]); + label_cell($myrow["bank_curr_code"]); + label_cell($myrow["bank_address"]); + edit_link_cell("selected_id=" . $myrow["account_code"]); + delete_link_cell("selected_id=" . $myrow["account_code"]. "&delete=1"); + end_row(); +} +//END WHILE LIST LOOP + + +end_table(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Bank Account")); + +start_form(); + +$is_editing = (isset($selected_id) && !isset($_GET['delete'])); + +start_table($table_style2); + +if ($is_editing) +{ + + $myrow = get_bank_account($selected_id); + + $_POST['account_code'] = $myrow["account_code"]; + $_POST['account_type'] = $myrow["account_type"]; + $_POST['bank_name'] = $myrow["bank_name"]; + $_POST['bank_account_name'] = $myrow["bank_account_name"]; + $_POST['bank_account_number'] = $myrow["bank_account_number"]; + $_POST['bank_address'] = $myrow["bank_address"]; + $_POST['BankAccountCurrency'] = $myrow["bank_curr_code"]; + + hidden('selected_id', $selected_id); + hidden('account_code', $_POST['account_code']); + hidden('BankAccountCurrency', $_POST['BankAccountCurrency']); + label_row(_("Bank Account GL Code:"), $_POST['account_code']); +} +else +{ + gl_all_accounts_list_row(_("Bank Account GL Code:"), 'account_code', null, true); +} + +bank_account_types_list_row(_("Account Type:"), 'account_type', null); + +text_row(_("Bank Name:"), 'bank_name', null, 50, 50); +text_row(_("Bank Account Name:"), 'bank_account_name', null, 50, 50); +text_row(_("Bank Account Number:"), 'bank_account_number', null, 30, 30); + +if ($is_editing) +{ + label_row(_("Bank Account Currency:"), $_POST['BankAccountCurrency']); +} +else +{ + currencies_list_row(_("Bank Account Currency:"), 'BankAccountCurrency', null); +} + +text_row(_("Bank Address:"), 'bank_address', null, 70, 70); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); +?> diff --git a/gl/manage/bank_trans_types.php b/gl/manage/bank_trans_types.php new file mode 100644 index 00000000..bc9efacd --- /dev/null +++ b/gl/manage/bank_trans_types.php @@ -0,0 +1,142 @@ + 0) + { + display_error(_("Cannot delete this bank transaction type because bank transactions have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_bank_trans_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_bank_trans_type(); + +start_table($table_style); + +$th = array(_("Description"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["name"]); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Bank Transaction Type")); + +start_form(); + +start_table($table_style2); + +if ($selected_id != -1) +{ + //editing an existing status code + + $myrow = get_bank_trans_type($selected_id); + + $_POST['name'] = $myrow["name"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Description:"), 'name', 40); + +end_table(1); + +submit_add_or_update_center($selected_id == -1); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/manage/currencies.php b/gl/manage/currencies.php new file mode 100644 index 00000000..1cdd5421 --- /dev/null +++ b/gl/manage/currencies.php @@ -0,0 +1,257 @@ + 0) + { + display_error(_("Cannot delete this currency, because customer accounts have been created referring to this currency.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."suppliers WHERE curr_code = '$selected_id'"; + $result = db_query($sql); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this currency, because supplier accounts have been created referring to this currency.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."company WHERE curr_default = '$selected_id'"; + $result = db_query($sql); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this currency, because the company preferences uses this currency.")); + return false; + } + + // see if there are any bank accounts that use this currency + $sql= "SELECT COUNT(*) FROM ".TB_PREF."bank_accounts WHERE bank_curr_code = '$selected_id'"; + $result = db_query($sql); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this currency, because thre are bank accounts that use this currency.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------- + +function handle_delete() +{ + global $selected_id; + if (!check_can_delete()) + return; + //only delete if used in neither customer or supplier, comp prefs, bank trans accounts + + delete_currency($selected_id); + + meta_forward($_SERVER['PHP_SELF']); +} + +//--------------------------------------------------------------------------------------------- + +function display_currencies() +{ + global $table_style; + + $company_currency = get_company_currency(); + + $result = get_currencies(); + + start_table($table_style); + $th = array(_("Abbreviation"), _("Symbol"), _("Currency Name"), + _("Hundredths name"), _("Country"), "", ""); + table_header($th); + + $k = 0; //row colour counter + + while ($myrow = db_fetch($result)) + { + + if ($myrow[1] == $company_currency) + { + start_row("class='currencybg'"); + } + else + alt_table_row_color($k); + + label_cell($myrow["curr_abrev"]); + label_cell($myrow["curr_symbol"]); + label_cell($myrow["currency"]); + label_cell($myrow["hundreds_name"]); + label_cell($myrow["country"]); + edit_link_cell("selected_id=" . $myrow["curr_abrev"]); + if ($myrow["curr_abrev"] != $company_currency) + delete_link_cell("selected_id=" . $myrow["curr_abrev"]. "&delete=1"); + + end_row(); + + } //END WHILE LIST LOOP + + end_table(); + + display_note(_("The marked currency is the home currency which cannot be deleted."), 0, 0, "class='currentfg'"); +} + +//--------------------------------------------------------------------------------------------- + +function display_currency_edit($selected_id) +{ + global $table_style2; + + start_form(); + start_table($table_style2); + + if ($selected_id != "") + { + //editing an existing currency + $myrow = get_currency($selected_id); + + $_POST['Abbreviation'] = $myrow["curr_abrev"]; + $_POST['Symbol'] = $myrow["curr_symbol"]; + $_POST['CurrencyName'] = $myrow["currency"]; + $_POST['country'] = $myrow["country"]; + $_POST['hundreds_name'] = $myrow["hundreds_name"]; + + hidden('selected_id', $selected_id); + hidden('Abbreviation', $_POST['Abbreviation']); + label_row(_("Currency Abbreviation:"), $_POST['Abbreviation']); + } + else + { + text_row_ex(_("Currency Abbreviation:"), 'Abbreviation', 4, 3); + } + + text_row_ex(_("Currency Symbol:"), 'Symbol', 10); + text_row_ex(_("Currency Name:"), 'CurrencyName', 20); + text_row_ex(_("Hundredths Name:"), 'hundreds_name', 15); + text_row_ex(_("Country:"), 'country', 40); + + end_table(1); + + submit_add_or_update_center($selected_id == ""); + + end_form(); +} + +//--------------------------------------------------------------------------------------------- + +if (isset($_POST['ADD_ITEM']) || isset($_POST['UPDATE_ITEM'])) +{ + + if (handle_submit()) + { + meta_forward($_SERVER['PHP_SELF']); + } +} + +//--------------------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + handle_delete(); +} + +//--------------------------------------------------------------------------------------------- + +display_currencies(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("Enter a New Currency")); + +display_currency_edit($selected_id); + +//--------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/gl/manage/exchange_rates.php b/gl/manage/exchange_rates.php new file mode 100644 index 00000000..e2be27d9 --- /dev/null +++ b/gl/manage/exchange_rates.php @@ -0,0 +1,228 @@ +"; +start_form(false, true); + +if (!isset($_POST['curr_abrev'])) + $_POST['curr_abrev'] = get_global_curr_code(); + +echo _("Select a currency :") . " "; +currencies_list('curr_abrev', $_POST['curr_abrev'], true); + +// if currency sel has changed, clear the form +if ($_POST['curr_abrev'] != get_global_curr_code()) +{ + clear_data(); + $selected_id = ""; +} + +set_global_curr_code($_POST['curr_abrev']); + +if (is_company_currency($_POST['curr_abrev'])) +{ + + display_note(_("The selected currency is the company currency."), 2); + display_note(_("The company currency is the base currency so exchange rates cannot be set for it."), 1); +} +else +{ + + display_rates($_POST['curr_abrev']); + + hyperlink_no_params($_SERVER['PHP_SELF'], _("Enter a New Exchange Rate")); + br(1); + + display_rate_edit(); +} + +end_form(); + +end_page(); + +?> diff --git a/gl/manage/gl_account_classes.php b/gl/manage/gl_account_classes.php new file mode 100644 index 00000000..cfdff8a8 --- /dev/null +++ b/gl/manage/gl_account_classes.php @@ -0,0 +1,165 @@ + 0) + { + display_error(_("Cannot delete this account class because GL account types have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_account_class($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_account_classes(); + +start_table($table_style); +$th = array(_("Class ID"), _("Class Name"), _("Balance Sheet"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + if ($myrow["balance_sheet"] == 0) + { + $bs_text = _("No"); + } + else + { + $bs_text = _("Yes"); + } + label_cell($myrow["cid"]); + label_cell($myrow['class_name']); + label_cell($bs_text); + edit_link_cell("selected_id=" . $myrow["cid"]); + delete_link_cell("selected_id=" . $myrow["cid"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Account Class")); + +start_form(); + +start_table($table_style2); + +if ($selected_id != -1) +{ + //editing an existing status code + + $myrow = get_account_class($selected_id); + + $_POST['id'] = $myrow["cid"]; + $_POST['name'] = $myrow["class_name"]; + $_POST['Balance'] = $myrow["balance_sheet"]; + hidden('selected_id', $selected_id); + label_row(_("Class ID:"), $_POST['id']); + +} +else +{ + + text_row_ex(_("Class ID:"), 'id', 3); +} + +text_row_ex(_("Class Name:"), 'name', 50); + +yesno_list_row(_("Balance Sheet:"), 'Balance', null, "", "", false); + +end_table(1); + +submit_add_or_update_center($selected_id == -1); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/manage/gl_account_types.php b/gl/manage/gl_account_types.php new file mode 100644 index 00000000..915835d8 --- /dev/null +++ b/gl/manage/gl_account_types.php @@ -0,0 +1,181 @@ + 0) + { + display_error(_("Cannot delete this account group because GL accounts have been created referring to it.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."chart_types + WHERE parent=$selected_id"; + $result = db_query($sql, "could not query chart types"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account group because GL account groups have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_account_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_account_types(); + +start_table($table_style); +$th = array(_("Name"), _("Subgroup Of"), _("Class Type"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + $bs_text = get_account_class_name($myrow["class_id"]); + + if ($myrow["parent"] == reserved_words::get_any_numeric()) + { + $parent_text = ""; + } + else + { + $parent_text = get_account_type_name($myrow["parent"]); + } + + label_cell($myrow["name"]); + label_cell($parent_text); + label_cell($bs_text); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Account Group")); + +start_form(); + +start_table($table_style2); + +if ($selected_id != "") +{ + //editing an existing status code + + $myrow = get_account_type($selected_id); + + $_POST['name'] = $myrow["name"]; + $_POST['parent'] = $myrow["parent"]; + $_POST['class_id'] = $myrow["class_id"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Name:"), 'name', 50); + +gl_account_types_list_row(_("Subgroup Of:"), 'parent', null, true, _("None"), true); + +class_list_row(_("Class Type:"), 'class_id', null); + +end_table(1); + +submit_add_or_update_center($selected_id == ""); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/gl/manage/gl_accounts.php b/gl/manage/gl_accounts.php new file mode 100644 index 00000000..6e309598 --- /dev/null +++ b/gl/manage/gl_accounts.php @@ -0,0 +1,248 @@ + 0) + { + display_error(_("Cannot delete this account because transactions have been created using this account.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."company WHERE debtors_act=$selected_account + OR pyt_discount_act=$selected_account + OR creditors_act=$selected_account + OR grn_act=$selected_account + OR exchange_diff_act=$selected_account + OR purch_exchange_diff_act=$selected_account + OR retained_earnings_act=$selected_account + OR freight_act=$selected_account + OR default_sales_act=$selected_account + OR default_sales_discount_act=$selected_account + OR default_prompt_payment_act=$selected_account + OR default_inventory_act=$selected_account + OR default_cogs_act=$selected_account + OR default_adj_act=$selected_account + OR default_inv_sales_act=$selected_account + OR default_assembly_act=$selected_account + OR payroll_act=$selected_account"; + $result = db_query($sql,"Couldn't test for default company GL codes"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used as one of the company default GL accounts.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."bank_accounts WHERE account_code=$selected_account"; + $result = db_query($sql,"Couldn't test for bank accounts"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used by a bank account.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."stock_master WHERE + inventory_account=$selected_account + OR cogs_account=$selected_account + OR adjustment_account=$selected_account + OR sales_account=$selected_account"; + $result = db_query($sql,"Couldn't test for existing stock GL codes"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used by one or more Items.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."tax_types WHERE sales_gl_code=$selected_account OR purchasing_gl_code=$selected_account"; + $result = db_query($sql,"Couldn't test for existing tax GL codes"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used by one or more Taxes.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."cust_branch WHERE + sales_account=$selected_account + OR sales_discount_account=$selected_account + OR receivables_account=$selected_account + OR payment_discount_account=$selected_account"; + $result = db_query($sql,"Couldn't test for existing tax GL codes"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used by one or more Customer Branches.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."suppliers WHERE + purchase_account=$selected_account + payment_discount_account=$selected_account + OR payable_account=$selected_account"; + $result = db_query($sql,"Couldn't test for existing tax GL codes"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this account because it is used by one or more suppliers.")); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------- + +if (isset($_POST['delete'])) +{ + + if (can_delete($selected_account)) + { + delete_gl_account($selected_account); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//------------------------------------------------------------------------------------- + +start_form(); + +if (db_has_gl_accounts()) +{ + echo "
"; + echo _("Select an Account:") . " "; + gl_all_accounts_list('AccountList', null); + echo " "; + submit('Select', _("Edit Account")); + echo "
"; +} + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Account")); +br(1); + +start_table($table_style2); + +if ($selected_account != "") +{ + //editing an existing account + $myrow = get_gl_account($selected_account); + + $_POST['account_code'] = $myrow["account_code"]; + $_POST['account_code2'] = $myrow["account_code2"]; + $_POST['account_name'] = $myrow["account_name"]; + $_POST['account_type'] = $myrow["account_type"]; + $_POST['tax_code'] = $myrow["tax_code"]; + + hidden('account_code', $_POST['account_code']); + hidden('selected_account', $_POST['selected_account']); + + label_row(_("Account Code:"), $_POST['account_code']); +} +else +{ + text_row_ex(_("Account Code:"), 'account_code', 11); +} + +text_row_ex(_("Account Code 2:"), 'account_code2', 11); + +text_row_ex(_("Account Name:"), 'account_name', 60); + +gl_account_types_list_row(_("Account Group:"), 'account_type', null); + +tax_types_list_row(_("Tax Type:"), 'tax_code', null, true, _('No Tax')); + +end_table(1); + +if ($selected_account == "") +{ + submit_center('add', _("Add Account")); +} +else +{ + submit_center_first('update', _("Update Account")); + submit_center_last('delete', _("Delete account")); +} + +end_form(); + +end_page(); + +?> diff --git a/gl/manage/index.php b/gl/manage/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/manage/index.php @@ -0,0 +1,3 @@ + diff --git a/gl/view/bank_transfer_view.php b/gl/view/bank_transfer_view.php new file mode 100644 index 00000000..c0a25e27 --- /dev/null +++ b/gl/view/bank_transfer_view.php @@ -0,0 +1,85 @@ +"; +start_table("$table_style width=80%"); + +start_row(); +label_cells(_("From Bank Account"), $from_trans['bank_account_name'], "class='tableheader2'"); +if ($show_currencies) + label_cells(_("Currency"), $from_trans['bank_curr_code'], "class='tableheader2'"); +label_cells(_("Amount"), number_format2(-$from_trans['amount'], user_price_dec()), "class='tableheader2'", "align=right"); +if ($show_currencies) +{ + end_row(); + start_row(); +} +label_cells(_("To Bank Account"), $to_trans['bank_account_name'], "class='tableheader2'"); +if ($show_currencies) + label_cells(_("Currency"), $to_trans['bank_curr_code'], "class='tableheader2'"); +if ($show_both_amounts) + label_cells(_("Amount"), number_format2($to_trans['amount'], user_price_dec()), "class='tableheader2'", "align=right"); +end_row(); +start_row(); +label_cells(_("Date"), sql2date($from_trans['trans_date']), "class='tableheader2'"); +label_cells(_("Transfer Type"), $from_trans['BankTransType'], "class='tableheader2'"); +label_cells(_("Reference"), $from_trans['ref'], "class='tableheader2'"); +end_row(); +comments_display_row(systypes::bank_transfer(), $trans_no); + +end_table(1); + +is_voided_display(systypes::bank_transfer(), $trans_no, _("This transfer has been voided.")); + +end_page(true); +?> \ No newline at end of file diff --git a/gl/view/gl_deposit_view.php b/gl/view/gl_deposit_view.php new file mode 100644 index 00000000..fd9b7462 --- /dev/null +++ b/gl/view/gl_deposit_view.php @@ -0,0 +1,119 @@ +"; + +display_heading(_("GL Deposit") . " #$trans_no"); + +echo "
"; +start_table("$table_style width=80%"); + +if ($show_currencies) +{ + $colspan1 = 5; + $colspan2 = 8; +} +else +{ + $colspan1 = 3; + $colspan2 = 6; +} +start_row(); +label_cells(_("To Bank Account"), $to_trans['bank_account_name'], "class='tableheader2'"); +if ($show_currencies) + label_cells(_("Currency"), $to_trans['bank_curr_code'], "class='tableheader2'"); +label_cells(_("Amount"), number_format2($to_trans['amount'], user_price_dec()), "class='tableheader2'", "align=right"); +label_cells(_("Date"), sql2date($to_trans['trans_date']), "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("From"), payment_person_types::person_name($to_trans['person_type_id'], $to_trans['person_id']), "class='tableheader2'", "colspan=$colspan1"); +label_cells(_("Deposit Type"), $to_trans['BankTransType'], "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Reference"), $to_trans['ref'], "class='tableheader2'", "colspan=$colspan2"); +end_row(); +comments_display_row(systypes::bank_deposit(), $trans_no); + +end_table(1); + +is_voided_display(systypes::bank_deposit(), $trans_no, _("This deposit has been voided.")); + +$items = get_gl_trans(systypes::bank_deposit(), $trans_no); + +if (db_num_rows($items) == 0) +{ + echo "
" . _("There are no items for this deposit."); +} +else +{ + + display_heading2(_("Items for this Deposit")); + if ($show_currencies) + display_heading2(_("Item Amounts are Shown in :") . " " . $company_currency); + + start_table("$table_style width=80%"); + $th = array(_("Account Code"), _("Account Description"), + _("Amount"), _("Memo")); + table_header($th); + + $k = 0; //row colour counter + $total_amount = 0; + + while ($item = db_fetch($items)) + { + + if ($item["account"] != $to_trans["account_code"]) + { + alt_table_row_color($k); + + label_cell($item["account"]); + label_cell($item["account_name"]); + amount_cell(abs($item["amount"])); + label_cell($item["memo_"]); + end_row(); + $total_amount += abs($item["amount"]); + } + } + + label_row(_("Total"), number_format2($total_amount, user_price_dec()),"colspan=2 align=right", "align=right"); + + end_table(1); + + display_allocations_from($to_trans['person_type_id'], $to_trans['person_id'], 2, $trans_no, $to_trans['amount']); +} + +end_page(true); +?> \ No newline at end of file diff --git a/gl/view/gl_payment_view.php b/gl/view/gl_payment_view.php new file mode 100644 index 00000000..0d7c51e7 --- /dev/null +++ b/gl/view/gl_payment_view.php @@ -0,0 +1,119 @@ +"; +start_table("$table_style width=80%"); + +if ($show_currencies) +{ + $colspan1 = 5; + $colspan2 = 8; +} +else +{ + $colspan1 = 3; + $colspan2 = 6; +} +start_row(); +label_cells(_("From Bank Account"), $from_trans['bank_account_name'], "class='tableheader2'"); +if ($show_currencies) + label_cells(_("Currency"), $from_trans['bank_curr_code'], "class='tableheader2'"); +label_cells(_("Amount"), number_format2(-$from_trans['amount'], user_price_dec()), "class='tableheader2'", "align=right"); +label_cells(_("Date"), sql2date($from_trans['trans_date']), "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Pay To"), payment_person_types::person_name($from_trans['person_type_id'], $from_trans['person_id']), "class='tableheader2'", "colspan=$colspan1"); +label_cells(_("Payment Type"), $from_trans['BankTransType'], "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Reference"), $from_trans['ref'], "class='tableheader2'", "colspan=$colspan2"); +end_row(); +comments_display_row(systypes::bank_payment(), $trans_no); + +end_table(1); + +$voided = is_voided_display(systypes::bank_payment(), $trans_no, _("This payment has been voided.")); + +$items = get_gl_trans(systypes::bank_payment(), $trans_no); + +if (db_num_rows($items)==0) +{ + echo "
" . _("There are no items for this payment."); +} +else +{ + + display_heading2(_("Items for this Payment")); + if ($show_currencies) + display_heading2(_("Item Amounts are Shown in :") . " " . $company_currency); + + echo "
"; + start_table("$table_style width=80%"); + $th = array(_("Account Code"), _("Account Description"), + _("Amount"), _("Memo")); + table_header($th); + + $k = 0; //row colour counter + $totalAmount = 0; + + while ($item = db_fetch($items)) + { + + if ($item["account"] != $from_trans["account_code"]) + { + alt_table_row_color($k); + + label_cell($item["account"]); + label_cell($item["account_name"]); + amount_cell($item["amount"]); + label_cell($item["memo_"]); + end_row(); + $totalAmount += $item["amount"]; + } + } + + label_row(_("Total"), number_format2($totalAmount, user_price_dec()),"colspan=2 align=right", "align=right"); + + end_table(1); + + if (!$voided) + display_allocations_from($from_trans['person_type_id'], $from_trans['person_id'], 1, $trans_no, -$from_trans['amount']); +} + +end_page(true); +?> \ No newline at end of file diff --git a/gl/view/gl_trans_view.php b/gl/view/gl_trans_view.php new file mode 100644 index 00000000..0aec1027 --- /dev/null +++ b/gl/view/gl_trans_view.php @@ -0,0 +1,99 @@ +" . _("The script must be called with a valid transaction type and transaction number to review the general ledger postings for.") . "

"; + exit; +} + +function display_gl_heading($myrow) +{ + global $table_style; + $trans_name = systypes::name($_GET['type_id']); + start_table("$table_style width=95%"); + $th = array(_("General Ledger Transaction Details"), + _("Date"), _("Person/Item")); + table_header($th); + start_row(); + label_cell("$trans_name #" . $_GET['trans_no']); + label_cell(sql2date($myrow["tran_date"])); + label_cell(payment_person_types::person_name($myrow["person_type_id"],$myrow["person_id"])); + + end_row(); + + comments_display_row($_GET['type_id'], $_GET['trans_no']); + + end_table(1); +} + +$sql = "SELECT ".TB_PREF."gl_trans.*, account_name FROM ".TB_PREF."gl_trans, ".TB_PREF."chart_master WHERE ".TB_PREF."gl_trans.account = ".TB_PREF."chart_master.account_code AND type= " . $_GET['type_id'] . " AND type_no = " . $_GET['trans_no'] . " ORDER BY counter"; +$result = db_query($sql,"could not get transactions"); +//alert("sql = ".$sql); + +if (db_num_rows($result) == 0) +{ + echo "

" . _("No general ledger transactions have been created for") . " " .systypes::name($_GET['type_id'])." " . _("number") . " " . $_GET['trans_no'] . "



"; + end_page(true); + exit; +} + +/*show a table of the transactions returned by the sql */ +$dim = get_company_pref('use_dimension'); + +if ($dim == 2) + $th = array(_("Account Code"), _("Account Name"), _("Dimension")." 1", _("Dimension")." 2", + _("Debit"), _("Credit"), _("Memo")); +else if ($dim == 1) + $th = array(_("Account Code"), _("Account Name"), _("Dimension"), + _("Debit"), _("Credit"), _("Memo")); +else + $th = array(_("Account Code"), _("Account Name"), + _("Debit"), _("Credit"), _("Memo")); +$k = 0; //row colour counter +$heading_shown = false; + +while ($myrow = db_fetch($result)) +{ + if (!$heading_shown) + { + display_gl_heading($myrow); + start_table("$table_style width=95%"); + table_header($th); + $heading_shown = true; + } + + alt_table_row_color($k); + + label_cell($myrow['account']); + label_cell($myrow['account_name']); + if ($dim >= 1) + label_cell(get_dimension_string($myrow['dimension_id'], true)); + if ($dim > 1) + label_cell(get_dimension_string($myrow['dimension2_id'], true)); + + display_debit_or_credit_cells($myrow['amount']); + label_cell($myrow['memo_']); + end_row(); + +} +//end of while loop +if ($heading_shown) + end_table(1); + +is_voided_display($_GET['type_id'], $_GET['trans_no'], _("This transaction has been voided.")); + +end_page(true); + +?> diff --git a/gl/view/index.php b/gl/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/gl/view/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/banking.inc b/includes/banking.inc new file mode 100644 index 00000000..a8a1c62e --- /dev/null +++ b/includes/banking.inc @@ -0,0 +1,143 @@ + 0); +} + +//---------------------------------------------------------------------------------- + +function is_company_currency($currency) +{ + return (get_company_currency() == $currency); +} + +//---------------------------------------------------------------------------------- + +function get_company_currency() +{ + $sql= "SELECT curr_default FROM ".TB_PREF."company"; + $result = db_query($sql, "retreive company currency"); + + if (db_num_rows($result) == 0) + display_db_error("Could not find the requested currency. Fatal.", $sql); + + $myrow = db_fetch_row($result); + return $myrow[0]; +} + +//---------------------------------------------------------------------------------- + +function get_bank_account_currency($bankAccount) +{ + $sql= "SELECT bank_curr_code FROM ".TB_PREF."bank_accounts WHERE account_code='$bankAccount'"; + $result = db_query($sql, "retreive bank account currency"); + + $myrow = db_fetch_row($result); + return $myrow[0]; +} + +//---------------------------------------------------------------------------------- + +function get_customer_currency($customer_id) +{ + $sql = "SELECT curr_code FROM ".TB_PREF."debtors_master WHERE debtor_no = '$customer_id'"; + + $result = db_query($sql, "Retreive currency of customer $customer_id"); + + $myrow=db_fetch_row($result); + return $myrow[0]; +} + +//---------------------------------------------------------------------------------- + +function get_supplier_currency($supplier_id) +{ + $sql = "SELECT curr_code FROM ".TB_PREF."suppliers WHERE supplier_id = '$supplier_id'"; + + $result = db_query($sql, "Retreive currency of supplier $supplier_id"); + + $myrow=db_fetch_row($result); + return $myrow[0]; +} + +//---------------------------------------------------------------------------------- + +function get_exchange_rate_from_home_currency($currency_code, $date_) +{ + if ($currency_code == get_company_currency()) + return 1.0000; + + $date = date2sql($date_); + + $sql = "SELECT rate_buy, max(date_) as date_ FROM ".TB_PREF."exchange_rates WHERE curr_code = '$currency_code' + AND date_ <= '$date' GROUP BY rate_buy ORDER BY date_ Desc LIMIT 1"; + + $result = db_query($sql, "could not query exchange rates"); + + if (db_num_rows($result) == 0) + { + // no stored exchange rate, just return 1 + return 1.000; + } + + $myrow = db_fetch_row($result); + return $myrow[0]; +} + +//---------------------------------------------------------------------------------- + +function get_exchange_rate_to_home_currency($currency_code, $date_) +{ + return 1 / get_exchange_rate_from_home_currency($currency_code, $date_); +} + +//---------------------------------------------------------------------------------- + +function to_home_currency($amount, $currency_code, $date_) +{ + $ex_rate = get_exchange_rate_to_home_currency($currency_code, $date_); + return $amount / $ex_rate; +} + +//---------------------------------------------------------------------------------- + +function get_exchange_rate_from_to($from_curr_code, $to_curr_code, $date_) +{ +// echo "converting from $from_curr_code to $to_curr_code
"; + if ($from_curr_code == $to_curr_code) + return 1.0000; + + $home_currency = get_company_currency(); + if ($to_curr_code == $home_currency) + { + return get_exchange_rate_to_home_currency($from_curr_code, $date_); + } + + if ($from_curr_code == $home_currency) + { + return get_exchange_rate_from_home_currency($to_curr_code, $date_); + } + + // neither from or to are the home currency + return get_exchange_rate_to_home_currency($from_curr_code, $date_) / get_exchange_rate_to_home_currency($to_curr_code, $date_); +} + +//-------------------------------------------------------------------------------- + +function exchange_from_to($amount, $from_curr_code, $to_curr_code, $date_) +{ + $ex_rate = get_exchange_rate_from_to($from_curr_code, $to_curr_code, $date_); + return $amount / $ex_rate; +} + +//-------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/includes/current_user.inc b/includes/current_user.inc new file mode 100644 index 00000000..a86d00d3 --- /dev/null +++ b/includes/current_user.inc @@ -0,0 +1,201 @@ +loginname = $username = $this->name = $this->company = ""; + $this->logged = false; + + $this->prefs = null; + } + + function logged_in() + { + return $this->logged; + } + + function set_company($company) + { + $this->company = $company; + } + + function login($company, $loginname, $password) + { + $this->set_company($company); + + $Auth_Result = get_user_for_login($loginname, $password); + + if (db_num_rows($Auth_Result) > 0) + { + $myrow = db_fetch($Auth_Result); + + $this->access = $myrow["full_access"]; + $this->name = $myrow["real_name"]; + $this->loginname = $loginname; + $this->username = $this->loginname; + $this->prefs = new user_prefs($myrow); + + update_user_visitdate($loginname); + $this->logged = true; + } + else + { + $this->logged = false; + } + + return $this->logged; + } + + function check_user_access() + { + global $security_groups; + return is_array($security_groups[$this->access]); + } + + function can_access_page($page_level) + { + global $security_groups; + return isset($page_level) && in_array($page_level, $security_groups[$this->access]); + } + + function get_db_connection() + { + global $db_connections; + + $connection = $db_connections[$this->company]; + + //print_r($connection); + + $db = mysql_connect($connection["host"] , + $connection["dbuser"], $connection["dbpassword"]); + mysql_select_db($connection["dbname"],$db); + + if (!defined('TB_PREF')) + define('TB_PREF', $connection["tbpref"]); + + return $db; + } + + function update_prefs($price_dec, $qty_dec, $exrate_dec, $percent_dec, $showgl, $showcodes, + $date_format, $date_sep, $tho_sep, $dec_sep, $theme, $pagesize) { + update_user_display_prefs($this->username, $price_dec, $qty_dec, $exrate_dec, $percent_dec, $showgl, + $showcodes, $date_format, $date_sep, $tho_sep, $dec_sep, $theme, $pagesize); + + // re-read the prefs + $user = get_user($this->username); + $this->prefs = new user_prefs($user); + } +} + +//-------------------------------------------------------------------------- + +function number_format2($number, $decimals=0) +{ + global $thoseps, $decseps; + $tsep = $thoseps[$_SESSION["wa_current_user"]->prefs->tho_sep()]; + $dsep = $decseps[$_SESSION["wa_current_user"]->prefs->dec_sep()]; + return number_format($number, $decimals, $dsep, $tsep); +} + +function user_company() +{ + return $_SESSION["wa_current_user"]->company; +} + +function user_language() +{ + return $_SESSION["wa_current_user"]->prefs->language(); +} + +function user_qty_dec() +{ + return $_SESSION["wa_current_user"]->prefs->qty_dec(); +} + +function user_price_dec() +{ + return $_SESSION["wa_current_user"]->prefs->price_dec(); +} + +function user_exrate_dec() +{ + return $_SESSION["wa_current_user"]->prefs->exrate_dec(); +} + +function user_percent_dec() +{ + return $_SESSION["wa_current_user"]->prefs->percent_dec(); +} + +function user_show_gl_info() +{ + return $_SESSION["wa_current_user"]->prefs->show_gl_info(); +} + +function user_show_codes() +{ + return $_SESSION["wa_current_user"]->prefs->show_codes(); +} + +function user_date_format() +{ + return $_SESSION["wa_current_user"]->prefs->date_format(); +} + +function user_date_display() +{ + return $_SESSION["wa_current_user"]->prefs->date_display(); +} + +function user_date_sep() +{ + return $_SESSION["wa_current_user"]->prefs->date_sep(); +} + +function user_tho_sep() +{ + return $_SESSION["wa_current_user"]->prefs->tho_sep(); +} + +function user_dec_sep() +{ + return $_SESSION["wa_current_user"]->prefs->dec_sep(); +} + +function user_theme() +{ + return $_SESSION["wa_current_user"]->prefs->get_theme(); +} + +function user_pagesize() +{ + return $_SESSION["wa_current_user"]->prefs->get_pagesize(); +} + +function set_user_prefs($price_dec, $qty_dec, $exrate_dec, $percent_dec, $showgl, $showcodes, + $date_format, $date_sep, $tho_sep, $dec_sep, $theme, $pagesize) +{ + + $_SESSION["wa_current_user"]->update_prefs($price_dec, $qty_dec, $exrate_dec, $percent_dec, $showgl, $showcodes, + $date_format, $date_sep, $tho_sep, $dec_sep, $theme, $pagesize); +} + +//-------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/includes/data_checks.inc b/includes/data_checks.inc new file mode 100644 index 00000000..ef33acfd --- /dev/null +++ b/includes/data_checks.inc @@ -0,0 +1,432 @@ + 0; +} + +?> \ No newline at end of file diff --git a/includes/date_functions.inc b/includes/date_functions.inc new file mode 100644 index 00000000..9c51a68e --- /dev/null +++ b/includes/date_functions.inc @@ -0,0 +1,404 @@ + 9999) + { + return 0; + } + + + if (is_long((int)$date_array[0]) && is_long((int)$date_array[1]) && is_long((int)$date_array[2])) + { + if (checkdate((int)$date_array[1],(int)$date_array[0],(int)$date_array[2])) + { + return 1; + } + else + { + return 0; + } + } + else + { /*Can't be in an appropriate DefaultDateFormat */ + return 0; + } +} //end of is_date function + + +function Today() +{ + return date(user_date_display()); +} + +function Now() +{ + if (user_date_format() == 0) + return date("h:i a"); + else + return date("H:i"); +} + +function is_date_in_fiscalyear($date, $convert=false) +{ + global $path_to_root; + include_once($path_to_root . "/admin/db/company_db.inc"); + + $myrow = get_current_fiscalyear(); + if ($myrow['closed'] == 1) + return 0; + if ($convert) + $date2 = sql2date($date); + else + $date2 = $date; + $begin = sql2date($myrow['begin']); + $end = sql2date($myrow['end']); + if (date1_greater_date2($begin, $date2) || date1_greater_date2($date2, $end)) + { + return 0; + } + return 1; +} + +function begin_fiscalyear() +{ + global $path_to_root; + include_once($path_to_root . "/admin/db/company_db.inc"); + + $myrow = get_current_fiscalyear(); + return sql2date($myrow['begin']); +} + +function end_fiscalyear() +{ + global $path_to_root; + include_once($path_to_root . "/admin/db/company_db.inc"); + + $myrow = get_current_fiscalyear(); + return sql2date($myrow['end']); +} + +function begin_month($date) +{ + $date_array = explode_date_to_dmy($date); + return date(user_date_display(), Mktime(0,0,0, $date_array[1], 1, $date_array[2])); +} + +function enc_month($date) +{ + $date_array = explode_date_to_dmy($date); + return date(user_date_display(), Mktime(0,0,0, $date_array[1] + 1, 0, $date_array[2])); +} + +function add_days($date, $days) // accepts - values as well +{ + $date_array = explode_date_to_dmy($date); + return date(user_date_display(), Mktime(0,0,0, $date_array[1], $date_array[0] + $days, $date_array[2])); +} + +function add_months($date, $months) +{ + $date_array = explode_date_to_dmy($date); + return date(user_date_display(), Mktime(0,0,0, $date_array[1] + $months, $date_array[0], $date_array[2])); +} + +function add_years($date, $years) +{ + $date_array = explode_date_to_dmy($date); + return date(user_date_display(), Mktime(0,0,0, $date_array[1], $date_array[0], $date_array[2] + $years)); +} + +//_______________________________________________________________ + +function sql2date($date_) +{ + global $dateseps; + + //for MySQL dates are in the format YYYY-mm-dd + $date_array = array(); + $how = user_date_format(); + $sep = $dateseps[user_date_sep()]; + if ($date_ == null || strlen($date_) == 0) + return ""; + + if (strpos($date_, "/")) + { // In MySQL it could be either / or - + $date_array = explode("/",$date_); + } + elseif (strpos ($date_, "-")) + { + $date_array = explode("-",$date_); + } + + if (strlen($date_array[2]) > 4) + { /*chop off the time stuff */ + $date_array[2]= substr($date_array[2],0,2); + } + + if ($how == 1) + { + return $date_array[2].$sep.$date_array[1].$sep.$date_array[0]; + } + elseif ($how == 0) + { + return $date_array[1].$sep.$date_array[2].$sep.$date_array[0]; + } + else + { + return $date_array[0].$sep.$date_array[1].$sep.$date_array[2]; + } + +} // end function sql2date + + +function date2sql($date_) +{ + global $dateseps; +/* takes a date in a the format specified in $DefaultDateFormat +and converts to a yyyy/mm/dd format */ + + $how = user_date_format(); + $sep = $dateseps[user_date_sep()]; + + if ($date_ == null || strlen($date_) == 0) + return ""; + + $date_ =trim($date_); + $date_ = str_replace($sep, "", $date_); + + if (strlen($date_) == 6) + { + if ($how == 0) + { + $date_array[0] = substr($date_,2,2); + $date_array[1] = substr($date_,0,2); + $date_array[2] = substr($date_,4,2); + } + elseif ($how == 1) + { + $date_array[0] = substr($date_,0,2); + $date_array[1] = substr($date_,2,2); + $date_array[2] = substr($date_,4,2); + } + else + { + $date_array[0]= substr($date_,4,2); + $date_array[1]= substr($date_,2,2); + $date_array[2]= substr($date_,0,2); + } + } + elseif (strlen($date_) == 8) + { + if ($how == 0) + { + $date_array[0] = substr($date_,2,2); + $date_array[1] = substr($date_,0,2); + $date_array[2] = substr($date_,4,4); + } + elseif ($how == 1) + { + $date_array[0] = substr($date_,0,2); + $date_array[1] = substr($date_,2,2); + $date_array[2] = substr($date_,4,4); + } + else + { + $date_array[0] = substr($date_,6,2); + $date_array[1] = substr($date_,4,2); + $date_array[2] = substr($date_,0,4); + } + } + +//to modify assumption in 2030 + + if ((int)$date_array[2] < 60) + { + $date_array[2] = "20".$date_array[2]; + } + elseif ((int)$date_array[2] > 59 && (int)$date_array[2] < 100) + { + $date_array[2] = "19".$date_array[2]; + } + elseif ((int)$date_array[2] > 9999) + { + return 0; + } + return $date_array[2]."/".$date_array[1]."/".$date_array[0]; +}// end of function + +function date1_greater_date2 ($date1, $date2) +{ + +/* returns 1 true if date1 is greater than date_ 2 */ + + $date1 = date2sql($date1); + $date2 = date2sql($date2); + $date1_array = explode("/", $date1); + $date2_array = explode("/", $date2); + + /*The 0 element of the array will be the year in either d/m/Y or m/d/Y formats */ + + if ($date1_array[0] > $date2_array[0]) + { + return 1; + } + elseif ($date1_array[0] == $date2_array[0]) + { + if ($date1_array[1] > $date2_array[1]) + { + return 1; + } + elseif ($date1_array[1] == $date2_array[1]) + { + if ($date1_array[2] > $date2_array[2]) + { + return 1; + } + } + } + return 0; +} + + +function date_diff ($date1, $date2, $period) +{ + +/* expects dates in the format specified in $DefaultDateFormat - period can be one of 'd','w','y','m' +months are assumed to be 30 days and years 365.25 days This only works +provided that both dates are after 1970. Also only works for dates up to the year 2035 ish */ + + $date1 = date2sql($date1); + $date2 = date2sql($date2); + $date1_array = explode("/", $date1); + $date2_array = explode("/", $date2); + + $date1_Stamp = mktime(0,0,0, (int)$date1_array[1],(int)$date1_array[2],(int)$date1_array[0]); + $date2_Stamp = mktime(0,0,0, (int)$date2_array[1],(int)$date2_array[2],(int)$date2_array[0]); + $difference = $date1_Stamp - $date2_Stamp; + +/* difference is the number of seconds between each date negative if date_ 2 > date_ 1 */ + + switch ($period) + { + case "d": + return (int) ($difference/(24*60*60)); + break; + case "w": + return (int) ($difference/(24*60*60*7)); + break; + case "m": + return (int) ($difference/(24*60*60*30)); + break; + case "s": + return $difference; + break; + case "y": + return (int) ($difference/(24*60*60*365.25)); + break; + default: + Return 0; + } +} + +Function explode_date_to_dmy($date_) +{ + $date_ = date2sql($date_); + if ($date_ == "") + { + $disp = user_date_display(); + echo "
Dates must be entered in the format $disp. Sent was $date_
"; + exit; + } + $date_array = explode("/", $date_); + $temp = $date_array[0]; + $date_array[0] = $date_array[2]; + $date_array[2] = $temp; + return $date_array; +} + +Function get_day($date_) +{ + $date_array = explode_date_to_dmy($date_); + + return $date_array[0]; +} + +Function get_month($date_) +{ + $date_array = explode_date_to_dmy($date_); + + return $date_array[1]; +} + +Function get_year($date_) +{ + $date_array = explode_date_to_dmy($date_); + + return $date_array[2]; +} + + + + +?> diff --git a/includes/db/comments_db.inc b/includes/db/comments_db.inc new file mode 100644 index 00000000..27e4405d --- /dev/null +++ b/includes/db/comments_db.inc @@ -0,0 +1,54 @@ + \ No newline at end of file diff --git a/includes/db/connect_db.inc b/includes/db/connect_db.inc new file mode 100644 index 00000000..cedfd787 --- /dev/null +++ b/includes/db/connect_db.inc @@ -0,0 +1,102 @@ +company !='') + $db = $_SESSION["wa_current_user"]->get_db_connection(); + else + $db = null; +} + +$db_duplicate_error_code = 1062; + +//DB wrapper functions to change only once for whole application + +function db_query($sql, $err_msg=null) +{ + global $db, $show_sql; + + //echo "
$sql
"; + if ($show_sql) + { + echo "SQL.."; + echo "
";
+		echo $sql;
+		echo "
\n"; + } + + + $result = mysql_query($sql, $db); + + if ($err_msg != null) + check_db_error($err_msg, $sql); + + return $result; +} + +function db_fetch_row (&$result) +{ + + return mysql_fetch_row($result); +} + +function db_fetch (&$result) +{ + + return mysql_fetch_array(&$result); +} + +function db_seek (&$result,$record) +{ + mysql_data_seek($result, $record); +} + +function db_free_result ($result) +{ + if ($result) + mysql_free_result($result); +} + +function db_num_rows (&$result) +{ + return mysql_num_rows($result); +} + +function db_num_fields (&$result) +{ + return mysql_num_fields($result); +} + +function db_escape (&$result) +{ + return mysql_escape_string($result); +} + +function db_error_no () +{ + global $db; + return mysql_errno($db); +} + +function db_error_msg(&$conn) +{ + return mysql_error($conn); +} + +function db_insert_id() +{ + global $db; + return mysql_insert_id($db); +} + +function db_num_affected_rows() +{ + global $db; + return mysql_affected_rows($db); +} + +?> diff --git a/includes/db/index.php b/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/db/inventory_db.inc b/includes/db/inventory_db.inc new file mode 100644 index 00000000..57234f4c --- /dev/null +++ b/includes/db/inventory_db.inc @@ -0,0 +1,151 @@ + 'D'"; + $result = db_query($sql, "Cannot query is inventory item or not"); + + return db_num_rows($result) > 0; +} + +//------------------------------------------------------------------- + +Function get_stock_gl_code($stock_id) +{ + /*Gets the GL Codes relevant to the item account */ + + $sql = "SELECT inventory_account, cogs_account, + adjustment_account, sales_account, assembly_account, dimension_id, dimension2_id FROM + ".TB_PREF."stock_master WHERE stock_id = '$stock_id'"; + + $get = db_query($sql,"retreive stock gl code"); + return db_fetch($get); +} + +//-------------------------------------------------------------------------------------- + +// $date_ - display / non-sql date +// $std_cost - in HOME currency +// $show_or_hide - wil this move be visible in reports, etc +// $price - in $person_id's currency + +function add_stock_move($type, $stock_id, $trans_no, $location, + $date_, $reference, $quantity, $std_cost, $person_id=null, $show_or_hide=1, + $price=0, $discount_percent=0, $error_msg="") +{ + // do not add a stock move if it's a non-inventory item + if (!is_inventory_item($stock_id)) + return null; + + $date = date2sql($date_); + + $sql = "INSERT INTO ".TB_PREF."stock_moves (stock_id, trans_no, type, loc_code, + tran_date, person_id, reference, qty, standard_cost, visible, price, + discount_percent) VALUES ('$stock_id', $trans_no, $type, + '$location', '$date', '$person_id', '$reference', $quantity, $std_cost, + $show_or_hide, $price, $discount_percent)"; + + if ($error_msg == "") + $error_msg = "The stock movement record cannot be inserted"; + + db_query($sql, $error_msg); + + return db_insert_id(); +} + +//-------------------------------------------------------------------------------------------------- + +function get_stock_moves($type, $type_no, $visible=false) +{ + $sql = "SELECT ".TB_PREF."stock_moves.*, ".TB_PREF."stock_master.description, ".TB_PREF."stock_master.units, + ".TB_PREF."locations.location_name, + ".TB_PREF."stock_master.material_cost + ".TB_PREF."stock_master.labour_cost + ".TB_PREF."stock_master.overhead_cost AS FixedStandardCost + FROM ".TB_PREF."stock_moves,".TB_PREF."locations,".TB_PREF."stock_master + WHERE ".TB_PREF."stock_moves.stock_id = ".TB_PREF."stock_master.stock_id + AND ".TB_PREF."locations.loc_code=".TB_PREF."stock_moves.loc_code + AND type=$type AND trans_no=$type_no ORDER BY trans_id"; + if ($visible) + $sql .= " AND ".TB_PREF."stock_moves.visible=1"; + + return db_query($sql, "Could not get stock moves"); +} + +//-------------------------------------------------------------------------------------------------- + +function void_stock_move($type, $type_no) +{ + $sql = "UPDATE ".TB_PREF."stock_moves SET qty=0, price=0, discount_percent=0, + standard_cost=0 WHERE type=$type AND trans_no=$type_no"; + + db_query($sql, "Could not void stock moves"); +} + +//-------------------------------------------------------------------------------------------------- + +function get_location_name($loc_code) +{ + $sql = "SELECT location_name FROM ".TB_PREF."locations WHERE loc_code='$loc_code'"; + + $result = db_query($sql, "could not retreive the location name for $loc_code"); + + if (db_num_rows($result) == 1) + { + $row = db_fetch_row($result); + return $row[0]; + } + + display_db_error("could not retreive the location name for $loc_code", $sql, true); +} + +//-------------------------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/includes/db/manufacturing_db.inc b/includes/db/manufacturing_db.inc new file mode 100644 index 00000000..fa63bbf8 --- /dev/null +++ b/includes/db/manufacturing_db.inc @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/includes/db/references_db.inc b/includes/db/references_db.inc new file mode 100644 index 00000000..77e688a5 --- /dev/null +++ b/includes/db/references_db.inc @@ -0,0 +1,63 @@ + 0); +} + +//-------------------------------------------------------------------------------------------------- + +function save_next_reference($type, $reference) +{ + $sql = "UPDATE ".TB_PREF."sys_types SET next_reference='" . trim($reference) . "' WHERE type_id = $type"; + + db_query($sql, "The next transaction ref for $type could not be updated"); +} + +//-------------------------------------------------------------------------------------------------- + +function get_next_reference($type) +{ + $sql = "SELECT next_reference FROM ".TB_PREF."sys_types WHERE type_id = $type"; + + $result = db_query($sql,"The last transaction ref for $type could not be retreived"); + + $row = db_fetch_row($result); + return $row[0]; +} + +?> \ No newline at end of file diff --git a/includes/db/sql_functions.inc b/includes/db/sql_functions.inc new file mode 100644 index 00000000..766fe545 --- /dev/null +++ b/includes/db/sql_functions.inc @@ -0,0 +1,20 @@ + diff --git a/includes/errors.inc b/includes/errors.inc new file mode 100644 index 00000000..ed7f281f --- /dev/null +++ b/includes/errors.inc @@ -0,0 +1,66 @@ +" . _("DATABASE ERROR :") . " $msg
"; + + if ($db_error != 0) + { + echo "error code : " . $db_error . "
"; + echo "error message : " . db_error_msg($db) . "
"; + } + + if ($debug == 1) + { + echo "sql that failed was : " . $sql_statement . "
"; + } + + echo "

"; + + if ($exit) + exit; +} + +function frindly_db_error($db_error) +{ + global $db_duplicate_error_code; + + if ($db_error == $db_duplicate_error_code) + { + display_error(_("The entered information is a duplicate. Please go back and enter different values.") + . "
" . _("Back") . "", true); + return true; + } + + return false; +} + +function check_db_error($msg, $sql_statement, $exit_if_error=true, $rollback_if_error=true) +{ + global $db; + $db_error = db_error_no(); + + if ($db_error != 0) + { + + if (!frindly_db_error($db_error)) + display_db_error($msg, $sql_statement, false); + + if ($rollback_if_error) + { + $rollback_result = db_query("rollback","could not rollback"); + } + + if ($exit_if_error) + { + echo "

"; + exit; + } + } + return $db_error; +} + +?> \ No newline at end of file diff --git a/includes/index.php b/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/lang/gettext.php b/includes/lang/gettext.php new file mode 100644 index 00000000..58bd1139 --- /dev/null +++ b/includes/lang/gettext.php @@ -0,0 +1,668 @@ + +// + +//require_once "PEAR.php"; + +define('GETTEXT_NATIVE', 1); +define('GETTEXT_PHP', 2); + +/** +* Generic gettext static class. +* +* This class allows gettext usage with php even if the gettext support is +* not compiled in php. +* +* The developper can choose between the GETTEXT_NATIVE support and the +* GETTEXT_PHP support on initialisation. If native is not supported, the +* system will fall back to PHP support. +* +* On both systems, this package add a variable interpolation system so you can +* translate entire dynamic sentences in stead of peace of sentences. +* +* Small example without pear error lookup : +* +* +* +* A gettext mini-howto should be provided with this package, if you're new +* to gettext usage, please read it to learn how to build a gettext +* translation directory (locale). +* +* @todo Tools to manage gettext files in php. +* +* - non traducted domains / keys +* - modification of keys +* - domain creation, preparation, delete, ... +* - tool to extract required messages from TOF templates +* +* @version 0.5 +* @author Laurent Bedubourg +*/ +class get_text +{ + /** + * This method returns current gettext support class. + * + * @return GetText_Support + * @static 1 + * @access private + */ + function &_support($set=false) + { + static $support_obj; + if ($set !== false) + { + $support_obj = $set; + } + elseif (!isset($support_obj)) + { + trigger_error("get_text not initialized !". endl. + "Please call get_text::init() before calling ". + "any get_text function !" . endl , E_USER_ERROR); + } + return $support_obj; + } + + /** + * Initialize gettext package. + * + * This method instantiate the gettext support depending on managerType + * value. + * + * GETTEXT_NATIVE try to use gettext php support and fall back to PHP + * support if not installed. + * + * GETTEXT_PHP explicitely request the usage of PHP support. + * + * @param int $managerType + * Gettext support type. + * + * @access public + * @static 1 + */ + function init($managerType = GETTEXT_NATIVE) + { + if ($managerType == GETTEXT_NATIVE) + { + if (function_exists('gettext')) + { + return get_text::_support(new gettext_native_support()); + } + } + // fail back to php support + return get_text::_support(new gettext_php_support()); + } + + /** + * Set the language to use for traduction. + * + * @param string $lang_code + * The language code usually defined as ll_CC, ll is the two letter + * language code and CC is the two letter country code. + * + * @throws GetText_Error if language is not supported by your system. + */ + function set_language($lang_code, $encoding) + { + $support = &get_text::_support(); + return $support->set_language($lang_code, $encoding); + } + + /** + * Add a translation domain. + * + * The domain name is usually the name of the .po file you wish to use. + * For example, if you created a file 'lang/ll_CC/LC_MESSAGES/myapp.po', + * you'll use 'myapp' as the domain name. + * + * @param string $domain + * The domain name. + * + * @param string $path optional + * The path to the locale directory (ie: /path/to/locale/) which + * contains ll_CC directories. + */ + function add_domain($domain, $path=false) + { + $support =& get_text::_support(); + return $support->add_domain($domain, $path); + } + + /** + * Retrieve the translation for specified key. + * + * @param string $key + * String to translate using gettext support. + */ + function gettext($key) + { + $support = &get_text::_support(); + return $support->gettext($key); + } + + /** + * Add a variable to gettext interpolation system. + * + * @param string $key + * The variable name. + * + * @param string $value + * The variable value. + */ + function set_var($key, $value) + { + $support =& get_text::_support(); + return $support->set_var($key, $value); + } + + /** + * Add an hashtable of variables. + * + * @param hashtable $hash + * PHP associative array of variables. + */ + function set_vars($hash) + { + $support =& get_text::_support(); + return $support->set_vars($hash); + } + + /** + * Reset interpolation variables. + */ + function reset() + { + $support =& get_text::_support(); + return $support->reset(); + } +} + +function raise_error($str) { + //echo "$str"; + return 1; +} + +function is_error($err) { + return $err > 0; +} + +/** +* Interface to gettext native support. +* +* @author Laurent Bedubourg +* @access private +*/ +class gettext_native_support +{ + var $_interpolation_vars = array(); + + /** + * Set gettext language code. + * @throws GetText_Error + */ + function set_language($lang_code, $encoding) + { + putenv("LANG=$lang_code"); + putenv("LC_ALL=$lang_code"); + putenv("LANGUAGE=$lang_code"); + + //$set = setlocale(LC_ALL, "$lang_code"); + //$set = setlocale(LC_ALL, "$encoding"); + $set = setlocale(LC_ALL, "$lang_code.".".$encoding"); + setlocale(LC_NUMERIC, 'C'); // important for numeric presentation etc. + if ($set === false) + { + $str = sprintf('language code "%s", encoding "%s" not supported by your system', + $lang_code, $encoding); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error("1 " . $str); + } + //return 0; + } + + /** + * Add a translation domain. + */ + function add_domain($domain, $path=false) + { + if ($path === false) + { + bindtextdomain($domain, "./locale/"); + } + else + { + bindtextdomain($domain, $path); + } + //bind_textdomain_codeset($domain, $encoding); + textdomain($domain); + } + + /** + * Retrieve translation for specified key. + * + * @access private + */ + function _get_translation($key) + { + return gettext($key); + } + + + /** + * Reset interpolation variables. + */ + function reset() + { + $this->_interpolation_vars = array(); + } + + /** + * Set an interpolation variable. + */ + function set_var($key, $value) + { + $this->_interpolation_vars[$key] = $value; + } + + /** + * Set an associative array of interpolation variables. + */ + function set_vars($hash) + { + $this->_interpolation_vars = array_merge($this->_interpolation_vars, + $hash); + } + + /** + * Retrieve translation for specified key. + * + * @param string $key -- gettext msgid + * @throws GetText_Error + */ + function gettext($key) + { + $value = $this->_get_translation($key); + if ($value === false) { + $str = sprintf('Unable to locate gettext key "%s"', $key); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error("2 " . $str); + } + + while (preg_match('/\$\{(.*?)\}/sm', $value, $m)) { + list($src, $var) = $m; + + // retrieve variable to interpolate in context, throw an exception + // if not found. + $var2 = $this->_get_var($var); + if ($var2 === false) { + $str = sprintf('Interpolation error, var "%s" not set', $var); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error("3 " . $str); + } + $value = str_replace($src, $var2, $value); + } + return $value; + } + + /** + * Retrieve an interpolation variable value. + * + * @return mixed + * @access private + */ + function _get_var($name) + { + if (!array_key_exists($name, $this->_interpolation_vars)) { + return false; + } + return $this->_interpolation_vars[$name]; + } +} + + +/** +* Implementation of get_text support for PHP. +* +* This implementation is abble to cache .po files into php files returning the +* domain translation hashtable. +* +* @access private +* @author Laurent Bedubourg +*/ +class gettext_php_support extends gettext_native_support +{ + var $_path = 'locale/'; + var $_lang_code = false; + var $_domains = array(); + var $_end = -1; + var $_jobs = array(); + + /** + * Set the translation domain. + * + * @param string $lang_code -- language code + * @throws GetText_Error + */ + function set_language($lang_code, $encoding) + { + // if language already set, try to reload domains + if ($this->_lang_code !== false and $this->_lang_code != $lang_code) + { + foreach ($this->_domains as $domain) + { + $this->_jobs[] = array($domain->name, $domain->path); + } + $this->_domains = array(); + $this->_end = -1; + } + + $this->_lang_code = $lang_code; + + // this allow us to set the language code after + // domain list. + while (count($this->_jobs) > 0) + { + list($domain, $path) = array_shift($this->_jobs); + $err = $this->add_domain($domain, $path); + // error raised, break jobs + /*if (PEAR::is_error($err)) { + return $err; + }*/ + if (is_error($err)) + { + return $err; + } + } + } + + /** + * Add a translation domain. + * + * @param string $domain -- Domain name + * @param string $path optional -- Repository path + * @throws GetText_Error + */ + function add_domain($domain, $path = "./locale/") + { + if (array_key_exists($domain, $this->_domains)) + { + return; + } + + if (!$this->_lang_code) + { + $this->_jobs[] = array($domain, $path); + return; + } + + $err = $this->_load_domain($domain, $path); + if ($err != 0) + { + return $err; + } + + $this->_end++; + } + + /** + * Load a translation domain file. + * + * This method cache the translation hash into a php file unless + * GETTEXT_NO_CACHE is defined. + * + * @param string $domain -- Domain name + * @param string $path optional -- Repository + * @throws GetText_Error + * @access private + */ + function _load_domain($domain, $path = "./locale") + { + $src_domain = $path . "/$this->_lang_code/LC_MESSAGES/$domain.po"; + $php_domain = $path . "/$this->_lang_code/LC_MESSAGES/$domain.php"; + + if (!file_exists($src_domain)) + { + $str = sprintf('Domain file "%s" not found.', $src_domain); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error("4 " . $str); + } + + $d = new gettext_domain(); + $d->name = $domain; + $d->path = $path; + + if (!file_exists($php_domain) || (filemtime($php_domain) < filemtime($src_domain))) + { + + // parse and compile translation table + $parser = new gettext_php_support_parser(); + $hash = $parser->parse($src_domain); + if (!defined('GETTEXT_NO_CACHE')) + { + $comp = new gettext_php_support_compiler(); + $err = $comp->compile($hash, $src_domain); + /*if (PEAR::is_error($err)) { + return $err; + }*/ + if (is_error($err)) + { + return $err; + } + } + $d->_keys = $hash; + } + else + { + $d->_keys = include $php_domain; + } + $this->_domains[] = &$d; + } + + /** + * Implementation of gettext message retrieval. + */ + function _get_translation($key) + { + for ($i = $this->_end; $i >= 0; $i--) + { + if ($this->_domains[$i]->has_key($key)) + { + return $this->_domains[$i]->get($key); + } + } + return $key; + } +} + +/** +* Class representing a domain file for a specified language. +* +* @access private +* @author Laurent Bedubourg +*/ +class gettext_domain +{ + var $name; + var $path; + + var $_keys = array(); + + function has_key($key) + { + return array_key_exists($key, $this->_keys); + } + + function get($key) + { + return $this->_keys[$key]; + } +} + +/** +* This class is used to parse gettext '.po' files into php associative arrays. +* +* @access private +* @author Laurent Bedubourg +*/ +class gettext_php_support_parser +{ + var $_hash = array(); + var $_current_key; + var $_current_value; + + /** + * Parse specified .po file. + * + * @return hashtable + * @throws GetText_Error + */ + function parse($file) + { + $this->_hash = array(); + $this->_current_key = false; + $this->_current_value = ""; + + if (!file_exists($file)) + { + $str = sprintf('Unable to locate file "%s"', $file); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error($str); + } + $i = 0; + $lines = file($file); + foreach ($lines as $line) + { + $this->_parse_line($line, ++$i); + } + $this->_store_key(); + + return $this->_hash; + } + + /** + * Parse one po line. + * + * @access private + */ + function _parse_line($line, $nbr) + { + if (preg_match('/^\s*?#/', $line)) { return; } + if (preg_match('/^\s*?msgid \"(.*?)(?!<\\\)\"/', $line, $m)) { + $this->_store_key(); + $this->_current_key = $m[1]; + return; + } + if (preg_match('/^\s*?msgstr \"(.*?)(?!<\\\)\"/', $line, $m)) { + $this->_current_value .= $m[1]; + return; + } + if (preg_match('/^\s*?\"(.*?)(?!<\\\)\"/', $line, $m)) { + $this->_current_value .= $m[1]; + return; + } + } + + /** + * Store last key/value pair into building hashtable. + * + * @access private + */ + function _store_key() + { + if ($this->_current_key === false) return; + $this->_current_value = str_replace('\\n', "\n", $this->_current_value); + $this->_hash[$this->_current_key] = $this->_current_value; + $this->_current_key = false; + $this->_current_value = ""; + } +} + + +/** +* This class write a php file from a gettext hashtable. +* +* The produced file return the translation hashtable on include. +* +* @throws GetText_Error +* @access private +* @author Laurent Bedubourg +*/ +class gettext_php_support_compiler +{ + /** + * Write hash in an includable php file. + */ + function compile(&$hash, $source_path) + { + $dest_path = preg_replace('/\.po$/', '.php', $source_path); + $fp = @fopen($dest_path, "w"); + if (!$fp) + { + $str = sprintf('Unable to open "%s" in write mode.', $dest_path); + //$err = new GetText_Error($str); + //return PEAR::raise_error($err); + return raise_error($str); + } + fwrite($fp, ' $value) + { + $key = str_replace("'", "\\'", $key); + $value = str_replace("'", "\\'", $value); + fwrite($fp, ' \'' . $key . '\' => \'' . $value . "',\n"); + } + fwrite($fp, ');' . "\n"); + fwrite($fp, '?>'); + fclose($fp); + } +} + +/** +* get_text related error. +*/ +//class GetText_Error extends PEAR_Error {} + +?> diff --git a/includes/lang/index.php b/includes/lang/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/lang/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/lang/language.php b/includes/lang/language.php new file mode 100644 index 00000000..1bde610c --- /dev/null +++ b/includes/lang/language.php @@ -0,0 +1,127 @@ +name = $name; + $this->code = $code; + $this->encoding = $encoding; + $this->dir = "ltr"; + } + + function get_language_dir() + { + return "lang/" . $this->code; + } + + + function get_current_language_dir() + { + $lang = $_SESSION['language']; + return "lang/" . $lang->code; + } + + function set_language($code) + { + if (isset($_SESSION['languages'][$code]) && + $_SESSION['language'] != $_SESSION['languages'][$code]) + { + $_SESSION['language'] = $_SESSION['languages'][$code]; + redirect(""); + } + } + + function get_stylesheet() + { + return 'lang/' . $_SESSION['language']->code . '/stylesheet.css'; + } + + /** + * This method loads an array of language objects into a session variable + * called $_SESSIONS['languages']. Only supported languages are added. + */ + function load_languages() + { + global $installed_languages; + + $_SESSION['languages'] = array(); + + foreach ($installed_languages as $lang) + { + $l = new language($lang['name'],$lang['code'],$lang['encoding']); + if (isset($lang['rtl'])) + $l->dir = "rtl"; + $_SESSION['languages'][$l->code] = $l; + } + + if (!isset($_SESSION['language'])) + $_SESSION['language'] = $_SESSION['languages']['en_GB']; + } + +} + +session_start(); +// this is to fix the "back-do-you-want-to-refresh" issue - thanx PHPFreaks +header("Cache-control: private"); + +// Page Initialisation +if (!isset($_SESSION['languages'])) +{ + language::load_languages(); +} + +$lang = $_SESSION['language']; + +// get_text support +get_text::init(); +get_text::set_language($lang->code, $lang->encoding); +//get_text::add_domain("wa", $path_to_root . "/lang"); +get_text::add_domain($lang->code, $path_to_root . "/lang"); + +if (!function_exists("_")) +{ + function _($text) + { + $retVal = get_text::gettext($text); + if ($retVal == "") + return $text; + return $retVal; + } +} + +function _set($key,$value) +{ + get_text::set_var($key,$value); +} + +function redirect($msg) +{ +// header("Location: $_SERVER['PHP_SELF'].""); +// exit; + echo ""; + echo ""; + echo "Changing Languages"; + echo ''; + echo ''; + echo ''; + echo '
'; + if ($msg != "") + echo $msg . " " . $_SERVER['PHP_SELF']; + echo "
"; + echo ""; + echo ""; +} + + + +?> \ No newline at end of file diff --git a/includes/main.inc b/includes/main.inc new file mode 100644 index 00000000..937d9a92 --- /dev/null +++ b/includes/main.inc @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/includes/manufacturing.inc b/includes/manufacturing.inc new file mode 100644 index 00000000..e3c213d1 --- /dev/null +++ b/includes/manufacturing.inc @@ -0,0 +1,28 @@ + diff --git a/includes/page/footer.inc b/includes/page/footer.inc new file mode 100644 index 00000000..bb2759c6 --- /dev/null +++ b/includes/page/footer.inc @@ -0,0 +1,45 @@ +\n"; + else + echo "\n"; + echo ""; + if (isset($_SESSION['wa_current_user'])) + echo "\n"; + echo "
" . Today() . " | " . Now() . "
\n"; + } + echo "\n"; + echo "\n"; + if ($no_menu == false) + { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if ($allow_demo_mode==true) + { + echo "\n"; + //echo "\n"; + echo "\n"; + } + echo "

\n"; + } + echo "\n"; +} + +?> \ No newline at end of file diff --git a/includes/page/header.inc b/includes/page/header.inc new file mode 100644 index 00000000..b23ecc87 --- /dev/null +++ b/includes/page/header.inc @@ -0,0 +1,70 @@ +dir . "' >"; + echo "$title"; + $encoding = $_SESSION['language']->encoding; + echo ""; + echo " \n"; + echo "get_stylesheet() . "' rel='stylesheet' type='text/css' /> \n"; + if ($js != "") + echo $js; + echo " \n"; + if ($onload == "") + echo ""; + else + echo ""; + echo "\n"; + echo "\n"; + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function hyperlink_params($target, $label, $params, $center=true) +{ + if ($center) + echo "
"; + echo "$label\n"; + if ($center) + echo "
"; +} + +function hyperlink_params_td($target, $label, $params) +{ + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function hyperlink_params_separate($target, $label, $params) +{ + echo "$label\n"; +} + +function hyperlink_params_separate_td($target, $label, $params) +{ + echo "\n"; +} + +//-------------------------------------------------------------------------------------------------- + +function alt_table_row_color(&$k) +{ + if ($k == 1) + { + echo "\n"; + $k = 0; + } + else + { + echo "\n"; + $k++; + } +} + +function table_section_title($msg) +{ + echo "\n"; +} + +function table_header($labels) +{ + start_row(); + foreach ($labels as $label) + labelheader_cell($label); + end_row(); +} + +function edit_link_cell($param) +{ + label_cell("" . _("Edit") . "", "nowrap"); +} + +function delete_link_cell($param) +{ + label_cell("" . _("Delete") . "", "nowrap"); +} + +//----------------------------------------------------------------------------------- + +function start_row($param="") +{ + if ($param != "") + echo "\n"; + else + echo "\n"; +} + +function end_row() +{ + echo "\n"; +} + +function br($num=1) +{ + for ($i = 0; $i < $num; $i++) + echo "
"; +} +?> \ No newline at end of file diff --git a/includes/ui/ui_globals.inc b/includes/ui/ui_globals.inc new file mode 100644 index 00000000..a22c6886 --- /dev/null +++ b/includes/ui/ui_globals.inc @@ -0,0 +1,60 @@ + \ No newline at end of file diff --git a/includes/ui/ui_input.inc b/includes/ui/ui_input.inc new file mode 100644 index 00000000..8b6a6e2c --- /dev/null +++ b/includes/ui/ui_input.inc @@ -0,0 +1,348 @@ +\n"; +} + +//--------------------------------------------------------------------------------- + +function submit($name, $value, $echo=true) +{ + $submit_str = "\n"; + if ($echo) + echo $submit_str; + else + return $submit_str; +} + +function submit_center($name, $value, $echo=true) +{ + echo "
"; + submit($name, $value, $echo); + echo "
"; +} + +function submit_center_first($name, $value) +{ + echo "
"; + submit($name, $value); + echo " "; +} + +function submit_center_last($name, $value) +{ + echo " "; + submit($name, $value); + echo "
"; +} + +function submit_add_or_update($add=true) +{ + if ($add) + submit('ADD_ITEM', _("Save")); + else + submit('UPDATE_ITEM', _("Update")); +} + +function submit_add_or_update_center($add=true) +{ + echo "
"; + submit_add_or_update($add); + echo "
"; +} + +/* +function submit_add_or_update_row($add=true) +{ + echo "\n"; +} +*/ +function submit_add_or_update_row($add=true, $right=true, $extra="") +{ + echo ""; + if ($right) + echo "\n"; + echo "\n"; +} + +function submit_cells($name, $value, $extra="") +{ + echo "\n"; +} + +function submit_row($name, $value, $right=true, $extra="") +{ + echo ""; + if ($right) + echo "\n"; + submit_cells($name, $value, $extra); + echo "\n"; +} +//----------------------------------------------------------------------------------- + +function check_value($name) +{ + if (!isset($_POST[$name])) + return 0; + return 1; +} + +function check($label, $name, $value, $submit_on_change=false) +{ + if ($label) + echo $label . " "; + + if ($value == null) + $value = (!isset($_POST[$name]) ? 0 : $_POST[$name]); + if ($value == 1) + echo "\n"; +} + +function check_cells($label, $name, $value, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo ""; +} + +function check_row($label, $name, $value, $submit_on_change=false) +{ + echo ""; + check_cells($label, $name, $value, $submit_on_change); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function labelheader_cell($label, $params="") // ändra till label_td +{ + echo "\n"; +} + +function label_cell($label, $params="") // ändra till label_td +{ + echo "\n"; +} + +function amount_cell($label, $bold=false) +{ + if ($bold) + label_cell("".number_format2($label,user_price_dec())."", "nowrap align=right"); + else + label_cell(number_format2($label,user_price_dec()), "nowrap align=right"); +} + +function qty_cell($label, $bold=false) +{ + if ($bold) + label_cell("".number_format2($label,user_qty_dec())."", "nowrap align=right"); + else + label_cell(number_format2($label,user_qty_dec()), "nowrap align=right"); +} + +function label_cells($label, $value, $params="", $params2="") +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function label_row($label, $value, $params="", $params2="") +{ + echo ""; + label_cells($label, $value, $params, $params2); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function text_cells($label, $name, $value, $size="", $max="", $params="", $post_label="", $disabled="") +{ + if ($label != null) + label_cell($label, $params); + echo "\n"; +} + +function text_cells_ex($label, $name, $size, $max=null, $init=null, $params=null, $post_label=null) +{ + if (!isset($_POST[$name]) || $_POST[$name] == "") + { + if ($init) + $_POST[$name] = $init; + else + $_POST[$name] = ""; + } + + if ($label != null) + label_cell($label, $params); + + if (!isset($max)) + $max = $size; + + echo "\n"; +} + +function text_row($label, $name, $value, $size, $max, $params="", $post_label="") +{ + echo ""; + + text_cells($label, $name, $value, $size, $max, $params, $post_label); + + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function text_row_ex($label, $name, $size, $max=null, $value=null, $params=null, $post_label=null) +{ + echo ""; + + text_cells_ex($label, $name, $size, $max, $value, $params, $post_label); + + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function date_cells($label, $name, $init=null, $inc_days=0, $inc_months=0, $inc_years=0, $params=null) +{ + if (!isset($_POST[$name]) || $_POST[$name] == "") + { + if (!$init) + { + $_POST[$name] = date(user_date_display(), Mktime(0,0,0,date("m") + $inc_months,date("d") + $inc_days,date("Y") + $inc_years)); + } + else + $_POST[$name] = $init; + } + text_cells_ex($label, $name, 9, 12, $_POST[$name], $params); +} + +function date_row($label, $name, $init=null, $inc_days=0, $inc_months=0, $inc_years=0, $params=null) +{ + echo ""; + date_cells($label, $name, $init, $inc_days, $inc_months, $inc_years, $params); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function ref_cells($label, $name, $init=null, $params=null) +{ + text_cells_ex($label, $name, 16, 18, $init, $params); +} + +//----------------------------------------------------------------------------------- + +function ref_row($label, $name, $init=null) +{ + echo ""; + ref_cells($label, $name, $init); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function percent_row($label, $name, $init=null) +{ + + if (!isset($_POST[$name]) || $_POST[$name]=="") + { + if ($init) + $_POST[$name] = $init; + } + + text_row($label, $name, $_POST[$name], 6, 6, "", "%"); +} + +//----------------------------------------------------------------------------------- + +function amount_cells($label, $name, $init=null, $params=null, $post_label=null) +{ + text_cells_ex($label, $name, 15, 15, $init, $params, $post_label); +} + +function amount_row($label, $name, $init=null, $params=null, $post_label=null) +{ + echo ""; + amount_cells($label, $name, $init, $params, $post_label); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function small_amount_cells($label, $name, $init=null, $params=null, $post_label=null) +{ + text_cells_ex($label, $name, 7, 12, $init, $params, $post_label); +} + +//----------------------------------------------------------------------------------- + +function textarea_cells($label, $name, $value, $cols, $rows, $params="") +{ + if ($label != null) + echo "\n"; + if ($value == null) + $value = (!isset($_POST[$name]) ? "" : $_POST[$name]); + echo "\n"; +} + +function textarea_row($label, $name, $value, $cols, $rows, $params="") +{ + echo ""; + textarea_cells($label, $name, $value, $cols, $rows, $params); + echo "\n"; +} + +//----------------------------------------------------------------------------------- + +function text_row_with_submit($label, $name, $value, $size, $max, $input_name, $input_value) +{ + echo "\n"; + echo "\n"; +} + +//----------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/includes/ui/ui_lists.inc b/includes/ui/ui_lists.inc new file mode 100644 index 00000000..0946945f --- /dev/null +++ b/includes/ui/ui_lists.inc @@ -0,0 +1,1968 @@ +"; + else + echo ""; + + db_free_result($supplier_result); +} + +function supplier_list_cells($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function supplier_list_row($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + echo "\n"; + supplier_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//---------------------------------------------------------------------------------------------- + +function customer_list($name, $selected_id, $all_option=false, $submit_on_change=false) +{ + if ($submit_on_change==true) + echo ""; + + $customer_sql = "SELECT debtor_no, name, curr_code FROM ".TB_PREF."debtors_master ORDER BY debtor_no"; + $customer_result = db_query($customer_sql); + + $company_currency = get_company_currency(); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if (($all_option == true)) + { + if (reserved_words::get_all() == $selected_id) + { + echo "\n"; + } + else + { + echo "\n"; + } + if ($selected_id == "") + { + $selected_id = reserved_words::get_all(); + } + } + + while ($customer_row = db_fetch_row($customer_result)) + { + if ($selected_id == $customer_row[0]) + { + echo "\n"; + // if no initial selection - set the first item + // do we want to do this for all lists ???? probably + if ($selected_id == "") + { + $selected_id = $customer_row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + + db_free_result($customer_result); +} + +function customer_list_cells($label, $name, $selected_id, $all_option = false, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function customer_list_row($label, $name, $selected_id, $all_option = false, $submit_on_change=false) +{ + echo "\n"; + customer_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function customer_branches_list($customer_id, $name, $selected_id, + $all_option = true, $enabled=true, $submit_on_change=false) +{ + global $all_items; + + if ($submit_on_change==true) + echo ""; + + $sql = "SELECT branch_code, br_name FROM ".TB_PREF."cust_branch + WHERE debtor_no='" . $customer_id . "'"; + if ($enabled) + $sql .= " AND disable_trans = 0"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if ($all_option == true) + { + echo "\n"; + + if ($selected_id == "") + { + $selected_id = reserved_words::get_all(); + } + } + + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + echo "\n"; + + if ($selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + db_free_result($result); +} + +function customer_branches_list_cells($label,$customer_id, $name, $selected_id, $all_option = true, $enabled=true, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function customer_branches_list_row($label,$customer_id, $name, $selected_id, $all_option = true, $enabled=true, $submit_on_change=false) +{ + echo ""; + customer_branches_list_cells($label, $customer_id, $name, $selected_id, $all_option, $enabled, $submit_on_change); + echo ""; +} + +//------------------------------------------------------------------------------------------------ + +function locations_list($name, $selected_id, $all_option=false, $submit_on_change=false, $all_option_name="") +{ + if ($submit_on_change == true) + echo ""; + +// if ($selected_id =="" AND isset($_SESSION['UserStockLocation']) AND $_SESSION['UserStockLocation'] !="") { +// $selected_id = $_SESSION['UserStockLocation']; +// } + + $sql = "SELECT loc_code, location_name FROM ".TB_PREF."locations"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if ($all_option == true) + { + echo "\n"; + + if ($selected_id == "") { + $selected_id = reserved_words::get_all(); + } + } + + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + echo "\n"; + + if ($selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + + db_free_result($result); +} + +function locations_list_cells($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function locations_list_row($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + echo ""; + locations_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function currencies_list($name, &$selected_id, $submit_on_change=false) +{ + if ($submit_on_change==true) + echo ""; + + $company_currency = get_company_currency(); + + $sql = "SELECT curr_abrev, currency FROM ".TB_PREF."currencies"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + while ($row = db_fetch_row($result)) + { + // default to the company currency + if ($selected_id == "" && ($row[0] == $company_currency)) + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + + if ($selected_id == $row[0]) + { + echo "\n"; + } + + echo ""; + db_free_result($result); +} + +function currencies_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function currencies_list_row($label, $name, $selected_id) +{ + echo "\n"; + currencies_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//--------------------------------------------------------------------------------------------------- + +function fiscalyears_list($name, &$selected_id, $submit_on_change=false) +{ + if ($submit_on_change == true) + echo ""; + + $company_year = get_company_pref('f_year'); + + $sql = "SELECT * FROM ".TB_PREF."fiscal_year ORDER BY begin"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + while ($row = db_fetch_row($result)) + { + // default to the company current fiscal year + if ($selected_id == "" && ($row[0] == $company_year)) + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + + if ($selected_id == $row[0]) + { + echo "\n"; + } + + echo ""; + db_free_result($result); +} + +function fiscalyears_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function fiscalyears_list_row($label, $name, $selected_id) +{ + echo "\n"; + fiscalyears_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//--------------------------------------------------------------------------------------------------- + +function simple_codeandname_list($sql, $name, &$selected_id, + $all_option=false, $all_option_name=null, $all_option_numeric=false, + $submit_on_change=false, $returnzero=false) +{ + if ($submit_on_change == true) + echo ""; + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if ($all_option == true) + { + if ($returnzero) + $reserved_word = 0; + elseif ($all_option_numeric) + $reserved_word = reserved_words::get_all_numeric(); + else + $reserved_word = reserved_words::get_all(); + + if ($reserved_word == $selected_id) + { + echo "\n"; + } + else + { + echo "\n"; + } + if ($selected_id == "") + { + $selected_id = $reserved_word; + } + } + + $result = db_query($sql); + + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + echo "\n"; + + if (!$returnzero && $selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + db_free_result($result); +} + +//------------------------------------------------------------------------------------ + +function dimensions_list($name, &$selected_id, $no_option=false, $showname=null, + $submit_on_change=false, $showclosed=false, $showtype=1) +{ + $sql = "SELECT id, CONCAT(reference,' ',name) FROM ".TB_PREF."dimensions"; + if ($showclosed || $showtype) + { + $sql .= " WHERE"; + if ($showclosed) + $sql .= " closed=0"; + if ($showclosed && $showtype) + $sql .= " AND type_=$showtype"; + else if ($showtype) + $sql .= " type_=$showtype"; + } + $sql .= " ORDER BY reference"; + simple_codeandname_list($sql, $name, &$selected_id, $no_option, $showname, + true, $submit_on_change, true); +} + +function dimensions_list_cells($label, $name, $selected_id, $no_option=false, $showname=null, + $showclosed=false, $showtype=0) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function dimensions_list_row($label, $name, $selected_id, $no_option=false, $showname=null, + $showclosed=false, $showtype=0) +{ + echo "\n"; + dimensions_list_cells($label, $name, $selected_id, $no_option, $showname, + $showclosed, $showtype); + echo "\n"; +} + +//--------------------------------------------------------------------------------------------------- + +function stock_items_list($name, $selected_id, $all_option=false, $submit_on_change=false, $extra="") +{ + global $all_items; + if ($submit_on_change==true) + echo ""; + else + echo ""; + db_free_result($result); +} + +function stock_items_list_cells($label, $name, $selected_id, $all_option=false, $submit_on_change=false, $extra="") +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function stock_items_list_row($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + echo "\n"; + stock_items_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function stock_bom_items_list($name, $selected_id, $all_option=false, $submit_on_change=false) +{ + global $all_items; + + if ($submit_on_change==true) + echo ""; + + $sql = "SELECT stock_id, ".TB_PREF."stock_master.description, ".TB_PREF."stock_category.description + FROM ".TB_PREF."stock_master,".TB_PREF."stock_category WHERE ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id + AND (".TB_PREF."stock_master.mb_flag='M' OR ".TB_PREF."stock_master.mb_flag='K')"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if (($all_option == true)) + { + if ($all_items == $selected_id) + { + echo "\n"; + } + else + { + echo "\n"; + } + if ($selected_id == "") + { + $selected_id = $all_items; + } + } + + while ($row = db_fetch_row($result)) + { + if ($selected_id==$row[0]) + { + echo "\n"; + + if ($selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + db_free_result($result); +} + +function stock_bom_items_list_cells($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function stock_bom_items_list_row($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + echo "\n"; + stock_bom_items_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function base_stock_items_list($sql, $name, &$selected_id, + $all_option=false, $all_option_name="", $submit_on_change=false, $extra="") +{ + if ($submit_on_change==true) + echo ""; + else + echo ""; + db_free_result($result); +} + +//------------------------------------------------------------------------------------ + +function stock_manufactured_items_list($name, $selected_id, + $all_option=false, $submit_on_change=false) +{ + $sql = "SELECT stock_id, ".TB_PREF."stock_master.description, ".TB_PREF."stock_category.description + FROM ".TB_PREF."stock_master,".TB_PREF."stock_category WHERE ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id + AND (".TB_PREF."stock_master.mb_flag='M')"; + + base_stock_items_list($sql, $name, &$selected_id, $all_option, _("All Items"), + $submit_on_change); +} + +function stock_manufactured_items_list_cells($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function stock_manufactured_items_list_row($label, $name, $selected_id, $all_option=false, $submit_on_change=false) +{ + echo "\n"; + stock_manufactured_items_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function stock_component_items_list($name, $parent_stock_id, &$selected_id, + $all_option=false, $submit_on_change=false) +{ + $sql = "SELECT stock_id, ".TB_PREF."stock_master.description, ".TB_PREF."stock_category.description + FROM ".TB_PREF."stock_master,".TB_PREF."stock_category WHERE + ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id + AND stock_id != '$parent_stock_id'"; + + base_stock_items_list($sql, $name, &$selected_id, + $all_option, _("All Items"), $submit_on_change); +} + +//------------------------------------------------------------------------------------ + +function stock_purchasable_items_list($name, &$selected_id, + $all_option=false, $submit_on_change=false, $extra="") +{ + $sql = "SELECT stock_id, ".TB_PREF."stock_master.description, ".TB_PREF."stock_category.description + FROM ".TB_PREF."stock_master,".TB_PREF."stock_category WHERE ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id + AND mb_flag !='M'"; + + base_stock_items_list($sql, $name, &$selected_id, + $all_option, _("All Items"), $submit_on_change, $extra); +} + +function stock_purchasable_items_list_cells($label, $name, &$selected_id, $all_option=false, $submit_on_change=false, $extra = "") +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function stock_purchasable_items_list_row($label, $name, &$selected_id, $all_option=false, $submit_on_change=false) +{ + echo "\n"; + stock_purchasable_items_list_cells($label, $name, $selected_id, $all_option, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function stock_costable_items_list($name, &$selected_id, + $all_option=false, $submit_on_change=false) +{ + $sql = "SELECT stock_id, ".TB_PREF."stock_master.description, ".TB_PREF."stock_category.description + FROM ".TB_PREF."stock_master,".TB_PREF."stock_category WHERE ".TB_PREF."stock_master.category_id=".TB_PREF."stock_category.category_id + AND mb_flag !='D'"; + + base_stock_items_list($sql, $name, &$selected_id, + $all_option, _("All Items"), $submit_on_change); +} + +//------------------------------------------------------------------------------------ + +function stock_item_types_list_row($label, $name, $selected_id, $enabled=true) +{ + echo ""; + if ($label != NULL) + echo "\n"; + echo "\n"; +} + +function stock_units_list_row($label, $name, $value, $enabled=true) +{ + global $stock_units; + + echo "\n"; + if ($enabled) + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function tax_types_list($name, $selected_id, + $none_option=false, $none_option_name=null, $submit_on_change=false) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."tax_types", + $name, $selected_id, $none_option, $none_option_name, true, $submit_on_change); +} + +function tax_types_list_cells($label, $name, $selected_id, $none_option=false, + $none_option_name=null, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function tax_types_list_row($label, $name, $selected_id, $none_option=false, + $none_option_name=null, $submit_on_change=false) +{ + echo "\n"; + tax_types_list_cells($label, $name, $selected_id, $none_option, $none_option_name, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function tax_groups_list($name, $selected_id, + $none_option=false, $none_option_name=null, $submit_on_change=false) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."tax_groups ORDER BY id", + $name, $selected_id, $none_option, $none_option_name, true, $submit_on_change); +} + +function tax_groups_list_cells($label, $name, $selected_id, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function tax_groups_list_row($label, $name, $selected_id, $submit_on_change=false) +{ + echo "\n"; + tax_groups_list_cells($label, $name, $selected_id, false, null, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function item_tax_types_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."item_tax_types ORDER BY id", + $name, $selected_id); +} + +function item_tax_types_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function item_tax_types_list_row($label, $name, $selected_id) +{ + echo "\n"; + item_tax_types_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function shippers_list($name, $selected_id) +{ + simple_codeandname_list("SELECT shipper_id, shipper_name FROM ".TB_PREF."shippers", + $name, $selected_id); +} + +function shippers_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function shippers_list_row($label, $name, $selected_id) +{ + echo "\n"; + shippers_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------- + +function sales_persons_list($name, $selected_id) +{ + simple_codeandname_list("SELECT salesman_code, salesman_name FROM ".TB_PREF."salesman", + $name, $selected_id); +} + +function sales_persons_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function sales_persons_list_row($label, $name, $selected_id) +{ + echo "\n"; + sales_persons_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function sales_areas_list($name, $selected_id) +{ + simple_codeandname_list("SELECT area_code, description FROM ".TB_PREF."areas", + $name, $selected_id); +} + +function sales_areas_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function sales_areas_list_row($label, $name, $selected_id) +{ + echo "\n"; + sales_areas_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function workorders_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, wo_ref FROM ".TB_PREF."workorders WHERE closed=0", + $name, $selected_id); +} + +function workorders_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function workorders_list_row($label, $name, $selected_id) +{ + echo "\n"; + workorders_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function payment_terms_list($name, $selected_id) +{ + simple_codeandname_list("SELECT terms_indicator, terms FROM ".TB_PREF."payment_terms", + $name, $selected_id); +} + +function payment_terms_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function payment_terms_list_row($label, $name, $selected_id) +{ + echo "\n"; + payment_terms_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------ + +function credit_status_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, reason_description FROM ".TB_PREF."credit_status", + $name, $selected_id); +} + +function credit_status_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function credit_status_list_row($label, $name, $selected_id) +{ + echo "\n"; + credit_status_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function sales_types_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, sales_type FROM ".TB_PREF."sales_types", + $name, $selected_id); +} + +function sales_types_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function sales_types_list_row($label, $name, $selected_id) +{ + echo "\n"; + sales_types_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function movement_types_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."movement_types", + $name, $selected_id); +} + +function movement_types_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function movement_types_list_row($label, $name, $selected_id) +{ + echo "\n"; + movement_types_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function bank_trans_types_list($name, $selected_id) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."bank_trans_types", + $name, $selected_id); +} + +function bank_trans_types_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function bank_trans_types_list_row($label, $name, $selected_id) +{ + echo "\n"; + bank_trans_types_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function workcenter_list($name, $selected_id, $all_option=false) +{ + global $all_items; + echo ""; + db_free_result($result); +} + +function workcenter_list_cells($label, $name, $selected_id, $all_option=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function workcenter_list_row($label, $name, $selected_id, $all_option=false) +{ + echo "\n"; + workcenter_list_cells($label, $name, $selected_id, $all_option); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function bank_accounts_list($name, $selected_id, $submit_on_change=false) +{ + if ($submit_on_change==true) + echo ""; + + $company_currency = get_company_currency(); + + $sql = "SELECT ".TB_PREF."bank_accounts.account_code, bank_account_name, bank_curr_code + FROM ".TB_PREF."bank_accounts, ".TB_PREF."chart_master + WHERE ".TB_PREF."bank_accounts.account_code=".TB_PREF."chart_master.account_code"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + echo "\n"; + if ($selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + db_free_result($result); +} + +function bank_accounts_list_cells($label, $name, $selected_id, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function bank_accounts_list_row($label, $name, $selected_id, $submit_on_change=false) +{ + echo "\n"; + bank_accounts_list_cells($label, $name, $selected_id, $submit_on_change); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function class_list($name, $selected_id, $submit_on_change=false) +{ + if ($submit_on_change==true) + echo ""; + + $sql = "SELECT cid, class_name FROM ".TB_PREF."chart_class"; + $result = db_query($sql); + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + echo "\n"; + if ($selected_id == "") + { + $selected_id = $row[0]; + $_POST[$name] = $selected_id; + } + } + + echo ""; + db_free_result($result); +} + +function class_list_cells($label, $name, $selected_id, $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function class_list_row($label, $name, $selected_id, $submit_on_change=false) +{ + echo "\n"; + class_list_cells($label, $name, $selected_id, $submit_on_change); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function stock_categories_list($name, $selected_id) +{ + simple_codeandname_list("SELECT category_id, description FROM ".TB_PREF."stock_category + ORDER BY category_id", $name, $selected_id); +} + +function stock_categories_list_cells($label, $name, $selected_id) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function stock_categories_list_row($label, $name, $selected_id) +{ + echo "\n"; + stock_categories_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function gl_account_types_list($name, $selected_id, $all_option, $all_option_name, + $all_option_numeric) +{ + simple_codeandname_list("SELECT id, name FROM ".TB_PREF."chart_types ORDER BY id", + $name, $selected_id, $all_option, $all_option_name, $all_option_numeric); +} + +function gl_account_types_list_cells($label, $name, $selected_id, $all_option=false, $all_option_name=null, + $all_option_numeric=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function gl_account_types_list_row($label, $name, $selected_id, $all_option=false, $all_option_name=null, + $all_option_numeric=false) +{ + echo "\n"; + gl_account_types_list_cells($label, $name, $selected_id, $all_option, + $all_option_name, $all_option_numeric); + echo "\n"; +} + +//----------------------------------------------------------------------------------------------- + +function gl_all_accounts_list($name, $selected_id, $skip_bank_accounts=false, + $show_group=false, $onchange="") +{ + echo ""; + db_free_result($result); +} + +function gl_all_accounts_list_cells($label, $name, $selected_id, $skip_bank_accounts=false, + $show_group=false, $onchange="") +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function gl_all_accounts_list_row($label, $name, $selected_id, $skip_bank_accounts=false, + $show_group=false, $onchange="") +{ + echo "\n"; + gl_all_accounts_list_cells($label, $name, $selected_id, $skip_bank_accounts, + $show_group, $onchange); + echo "\n"; +} + +function yesno_list($name, $selected_id, $name_yes="", $name_no="", $submit_on_change=false) +{ + if ($submit_on_change == true) + echo ""; + + if (strlen($name_yes) == 0) + { + unset($name_yes); + } + if (strlen($name_no) == 0) + { + unset($name_no); + } + + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? 0 : $_POST[$name]); + if ($selected_id == 0) + echo "\n"; + else + echo $name_yes . "\n"; + if ($selected_id == 0) + echo "\n"; + else + echo $name_no . "\n"; + echo ""; +} + +function yesno_list_cells($label, $name, $selected_id, $name_yes="", $name_no="", $submit_on_change=false) +{ + if ($label != null) + echo "\n"; + echo "\n"; +} + +function yesno_list_row($label, $name, $selected_id, $name_yes="", $name_no="", $submit_on_change=false) +{ + echo "\n"; + yesno_list_cells($label, $name, $selected_id, $name_yes, $name_no, $submit_on_change); + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function languages_list($name, &$selected_id) +{ + global $installed_languages; + + echo "\n"; + echo "\n"; +} + +function languages_list_row($label, $name, $selected_id) +{ + echo "\n"; + languages_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function bank_account_types_list($name, &$selected_id) +{ + $bank_account_types = bank_account_types::get_all(); + + echo "\n"; + echo "\n"; +} + +function bank_account_types_list_row($label, $name, $selected_id) +{ + echo "\n"; + bank_account_types_list_cells($label, $name, $selected_id); + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function payment_person_types_list($name, $selected_id, $related=null) +{ + $types = payment_person_types::get_all(); + + echo "\n"; + echo "\n"; +} + +function payment_person_types_list_row($label, $name, $selected_id, $related=null) +{ + echo "\n"; + payment_person_types_list_cells($label, $name, $selected_id, $related); + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function wo_types_list($name, &$selected_id) +{ + $types = wo_types::get_all(); + + echo "\n"; +} + +//------------------------------------------------------------------------------------------------ + +function dateformats_list_row($label, $name, $value) +{ + global $dateformats; + + echo "\n"; + echo "\n"; +} + +function dateseps_list_row($label, $name, $value) +{ + global $dateseps; + + echo "\n"; + echo "\n"; +} + +function thoseps_list_row($label, $name, $value) +{ + global $thoseps; + + echo "\n"; + echo "\n"; +} + +function decseps_list_row($label, $name, $value) +{ + global $decseps; + + echo "\n"; + echo "\n"; +} + +function themes_list_row($label, $name, $value) +{ + global $themes; + + echo "\n"; + echo "\n"; +} + +function pagesizes_list_row($label, $name, $value) +{ + global $pagesizes; + + echo "\n"; + echo "\n"; +} + +function security_headings_list_row($label, $name, $value) +{ + global $security_headings; + + echo "\n"; + echo "\n"; +} + +function systypes_list_cells($label, $name, $value, $submit_on_change=false) +{ + global $systypes_array; + + if ($label != null) + echo "\n"; + echo "\n"; +} + +function systypes_list_row($label, $name, $value, $submit_on_change=false) +{ + echo "\n"; + systypes_list_cells($label, $name, $value, $submit_on_change); + echo "\n"; +} + +function cust_allocations_list_cells($label, $name, $selected) +{ + if ($label != null) + label_cell($label); + if ($selected == null) + $selected = (!isset($_POST[$name]) ? "" : $_POST[$name]); + echo "\n"; +} + +function supp_allocations_list_cells($name, $selected) +{ + if ($selected == null) + $selected = (!isset($_POST[$name]) ? "" : $_POST[$name]); + echo "\n"; +} + +function policy_list_cells($label, $name, $selected) +{ + if ($selected == null) + { + $selected = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if ($selected == "") + $_POST[$name] = $selected; + } + if ($label != null) + label_cell($label); + echo "\n"; +} + +function policy_list_row($label, $name, $selected) +{ + echo "\n"; + policy_list_cells($label, $name, $selected); + echo "\n"; +} + +function credit_type_list_cells($label, $name, $selected, $submit_on_change=false) +{ + if ($selected == null) + { + $selected = (!isset($_POST[$name]) ? "Return" : $_POST[$name]); + if ($selected == "Return") + $_POST[$name] = $selected; + } + if ($label != null) + label_cell($label); + echo "\n"; +} + +function credit_type_list_row($label, $name, $selected, $submit_on_change=false) +{ + echo "\n"; + credit_type_list_cells($label, $name, $selected, $submit_on_change); + echo "\n"; +} + +function number_list($name, $selected, $from, $to, $firstlabel="") +{ + if ($selected == null) + { + $selected = (!isset($_POST[$name]) ? $from : $_POST[$name]); + if ($selected == $from) + $_POST[$name] = $selected; + } + echo "\n"; +} + +function number_list_cells($label, $name, $selected, $from, $to) +{ + if ($label != null) + label_cell($label); + echo "\n"; +} + +function number_list_row($label, $name, $selected, $from, $to) +{ + echo "\n"; + number_list_cells($label, $name, $selected, $from, $to); + echo "\n"; +} +?> \ No newline at end of file diff --git a/includes/ui/ui_msgs.inc b/includes/ui/ui_msgs.inc new file mode 100644 index 00000000..0120b7f8 --- /dev/null +++ b/includes/ui/ui_msgs.inc @@ -0,0 +1,63 @@ +
\n"; + + echo "\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + if (!$no_menu) + { + echo "
"; + echo ""; + + echo "
"; + + echo ""; + echo ""; + echo "
" . $db_connections[$_SESSION["wa_current_user"]->company]["name"] . " | " . $_SERVER['SERVER_NAME'] . " | " . $_SESSION["wa_current_user"]->name . "" . _("Logout") . ""; + echo "
"; + } + + echo "
"; + + if ($title && !$no_menu && !$is_index) + { + echo "
$title
"; + } + + if (!$is_index) + echo "
"; +} + +?> \ No newline at end of file diff --git a/includes/page/index.php b/includes/page/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/page/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/prefs/index.php b/includes/prefs/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/prefs/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/prefs/sysprefs.inc b/includes/prefs/sysprefs.inc new file mode 100644 index 00000000..3c5df2f0 --- /dev/null +++ b/includes/prefs/sysprefs.inc @@ -0,0 +1,55 @@ + \ No newline at end of file diff --git a/includes/prefs/userprefs.inc b/includes/prefs/userprefs.inc new file mode 100644 index 00000000..63a0828d --- /dev/null +++ b/includes/prefs/userprefs.inc @@ -0,0 +1,143 @@ +language = $user["language"]; + language::set_language($this->language); + + $this->qty_dec = $user["qty_dec"]; + $this->price_dec = $user["prices_dec"]; + $this->exrate_dec = $user["rates_dec"]; + $this->percent_dec = $user["percent_dec"]; + + $this->show_gl_info = $user["show_gl"]; + $this->show_codes = $user["show_codes"]; + $this->date_format = $user["date_format"]; + $this->date_sep = $user["date_sep"]; + $this->tho_sep = $user["tho_sep"]; + $this->dec_sep = $user["dec_sep"]; + $this->theme = $user["theme"]; + $this->pagesize = $user["page_size"]; + } + + function language() + { + return $this->language; + } + + function qty_dec() + { + return $this->qty_dec; + } + + function price_dec() + { + return $this->price_dec; + } + + function exrate_dec() + { + return $this->exrate_dec; + } + + function percent_dec() + { + return $this->percent_dec; + } + + function show_gl_info() + { + return $this->show_gl_info; + } + + function show_codes() + { + return $this->show_codes; + } + + function date_format() + { + return $this->date_format; + } + + function date_sep() + { + return $this->date_sep; + } + + function date_display() + { + global $dateseps; + $sep = $dateseps[$this->date_sep]; + if ($this->date_format == 0) + return "m".$sep."d".$sep."Y"; + elseif ($this->date_format == 1) + return "d".$sep."m".$sep."Y"; + else + return "Y".$sep."m".$sep."d"; + } + + function tho_sep() + { + return $this->tho_sep; + } + + function dec_sep() + { + return $this->dec_sep; + } + + function get_theme() + { + return $this->theme; + } + + function get_pagesize() + { + return $this->pagesize; + } + + function set_dec($price_dec, $qty_dec, $exrate_dec, $percent_dec, $showgl, $showcodes) + { + $this->price_dec = $price_dec; + $this->qty_dec = $qty_dec; + $this->exrate_dec = $exrate_dec; + $this->percent_dec = $percent_dec; + $this->show_gl_info = $showgl; + $this->show_codes = $showcodes; + } + + function set_format($date_format, $date_sep, $tho_sep, $dec_sep, $theme, $pagesize) + { + $this->date_format = $date_format; + $this->date_sep = $date_sep; + $this->tho_sep = $tho_sep; + $this->dec_sep = $dec_sep; + $this->theme = $theme; + $this->pagesize = $pagesize; + } + +} + +?> \ No newline at end of file diff --git a/includes/references.inc b/includes/references.inc new file mode 100644 index 00000000..07f397b6 --- /dev/null +++ b/includes/references.inc @@ -0,0 +1,83 @@ + 0; + } + + function increment($reference) + { + if (is_numeric($reference)) + return $reference + 1; + else + return $reference; + } + + //------------------------------------ +} + +//---------------------------------------------------------------------------- + +function is_new_reference($ref, $type) +{ + $db_info = get_systype_db_info($type); + $db_name = $db_info[0]; + $db_type = $db_info[1]; + $db_ref = $db_info[3]; + + if ($db_ref != null) + { + $sql = "SELECT $db_ref FROM $db_name WHERE $db_ref='$ref'"; + if ($db_type != null) + $sql .= " AND $db_type=$type"; + + $result = db_query($sql, "could not test for unique reference"); + + return (db_num_rows($result) == 0); + } + + // it's a type that doesn't use references - shouldn't be calling here, but say yes anyways + return true; +} + +?> \ No newline at end of file diff --git a/includes/reserved.inc b/includes/reserved.inc new file mode 100644 index 00000000..5f376ade --- /dev/null +++ b/includes/reserved.inc @@ -0,0 +1,49 @@ + \ No newline at end of file diff --git a/includes/session.inc b/includes/session.inc new file mode 100644 index 00000000..d3ddf600 --- /dev/null +++ b/includes/session.inc @@ -0,0 +1,117 @@ +

" . _("Incorrect Password") . "

"; + echo "" . _("The user and password combination is not valid for the system.") . "

"; + + echo _("If you are not an authorized user, please contact your system administrator to obtain an account to enable you to use the system."); + echo "
" . _("Back") . ""; + echo ""; + + kill_login(); + die(); + } + + //---------------------------------------------------------------------------------------- + + function check_page_security($page_security) + { + if (!$_SESSION["wa_current_user"]->check_user_access()) + { + echo "


"; + echo "" . _("Security settings have not been defined for your user account."); + echo "
" . _("Please contact your system administrator.") . "
"; + + kill_login(); + exit; + } + + if (!$_SESSION["wa_current_user"]->can_access_page($page_security)) + { + page(_("Access denied")); + echo "



"; + echo _("The security settings on your account do not permit you to access this function"); + echo ""; + echo "

" . _("Back") . ""; + echo "



"; + //echo '' + end_page(); + //kill_login(); + exit; + } + } + + //---------------------------------------------------------------------------------------- + + if (!isset($_SESSION["wa_current_user"]) || + (isset($_SESSION["wa_current_user"]) && !$_SESSION["wa_current_user"]->logged_in())) + { + + $_SESSION["wa_current_user"] = new current_user(); + + // Show login screen + if (!isset($_POST["user_name_entry_field"]) or $_POST["user_name_entry_field"] == "") + { + include($path_to_root . "/access/login.php"); + exit; + } + } + + if (isset($_POST["user_name_entry_field"])) + { + $succeed = $_SESSION["wa_current_user"]->login($_POST["company_login_name"], + $_POST["user_name_entry_field"], + md5($_POST["password"])); + + if (!$succeed) + { + // Incorrect password + login_fail(); + } + } + + check_page_security($page_security); + + // Run with debugging messages for the system administrator(s) but not anyone else + /*if (in_array(15, $security_groups[$_SESSION["AccessLevel"]])) { + $debug = 1; + } else { + $debug = 0; + }*/ + + //---------------------------------------------------------------------------------------- +?> \ No newline at end of file diff --git a/includes/systypes.inc b/includes/systypes.inc new file mode 100644 index 00000000..0c9aa048 --- /dev/null +++ b/includes/systypes.inc @@ -0,0 +1,63 @@ + \ No newline at end of file diff --git a/includes/types.inc b/includes/types.inc new file mode 100644 index 00000000..1d8eeb54 --- /dev/null +++ b/includes/types.inc @@ -0,0 +1,288 @@ + array ('name' => _("Journal Entry")), + 1=> array ('name' => _("Bank Payment")), + 2=> array ('name' => _("Bank Deposit")), + 4=> array ('name' => _("Funds Transfer")), + 10=> array ('name' => _("Sales Invoice")), + 11=> array ('name' => _("Customer Credit Note")), + 12=> array ('name' => _("Customer Payment")), + 16=> array ('name' => _("Location Transfer")), + 17=> array ('name' => _("Inventory Adjustment")), + 18=> array ('name' => _("Purchase Order")), + 20=> array ('name' => _("Supplier Invoice")), + 21=> array ('name' => _("Supplier Credit Note")), + 22=> array ('name' => _("Supplier Payment")), + 25=> array ('name' => _("Purchase Order Delivery")), + 26=> array ('name' => _("Work Order")), + 28=> array ('name' => _("Work Order Issue")), + 29=> array ('name' => _("Work Order Production")), + 30=> array ('name' => _("Sales Order")), + 35=> array ('name' => _("Cost Update")), + 40=> array ('name' => _("Dimension")) + ); +class systypes +{ + + function journal_entry() + { + return 0; + } + + function bank_payment() + { + return 1; + } + + function bank_deposit() + { + return 2; + } + + function bank_transfer() + { + return 4; + } + + function cust_payment() + { + return 12; + } + + function location_transfer() + { + return 16; + } + + function inventory_adjustment() + { + return 17; + } + + function po() + { + return 18; + } + + function supp_payment() + { + return 22; + } + + function work_order() + { + return 26; + } + + function sales_order() + { + return 30; + } + + function cost_update() + { + return 35; + } + + function dimension() + { + return 40; + } + + function name($index) + { + global $systypes_array; + if ($index < 0) + return ''; + return $systypes_array[$index]['name']; + } +} + +//---------------------------------------------------------------------------------- + +$bank_account_types_array = array ( + 0=> array ('id' => 0, 'name' => _("Savings Account")), + 1=> array ('id' => 1, 'name' => _("Chequing Account")), + 2=> array ('id' => 2, 'name' => _("Credit Account")), + 3=> array ('id' => 3, 'name' => _("Cash Account")) + ); + +class bank_account_types +{ + + function get_all() + { + global $bank_account_types_array; + return $bank_account_types_array;; + } + + function name($index) + { + global $bank_account_types_array; + return $bank_account_types_array[$index]['name']; + } +} + +//---------------------------------------------------------------------------------- + +include_once($path_to_root . "/manufacturing/includes/manufacturing_db.inc"); +include_once($path_to_root . "/purchasing/includes/purchasing_db.inc"); +include_once($path_to_root . "/sales/includes/sales_db.inc"); +include_once($path_to_root . "/dimensions/includes/dimensions_db.inc"); + +$payment_person_types_array = array ( + 0=> array ('id' => 0, 'name' => _("Miscellaneous")), + 1=> array ('id' => 1, 'name' => _("Work Order")), + 2=> array ('id' => 2, 'name' => _("Customer")), + 3=> array ('id' => 3, 'name' => _("Supplier")), + ); + +class payment_person_types +{ + + function get_all() + { + global $payment_person_types_array; + return $payment_person_types_array; + } + + function misc() + { + return 0; + } + + function WorkOrder() + { + return 1; + } + + function customer() + { + return 2; + } + + function supplier() + { + return 3; + } + + function dimension() + { + return 4; + } + + //function Project() { return 4; } + + function type_name($type) + { + global $payment_person_types_array; + return $payment_person_types_array[$type]['name']; + } + + function person_name($type, $person_id, $full=true) + { + switch ($type) + { + case payment_person_types::misc() : + return $person_id; + case payment_person_types::WorkOrder() : + $wo = get_work_order($person_id); + return ($full?payment_person_types::type_name($type) . " ":"") . $wo["wo_ref"]; + case payment_person_types::customer() : + return ($full?payment_person_types::type_name($type) . " ":"") . get_customer_name($person_id); + case payment_person_types::supplier() : + return ($full?payment_person_types::type_name($type) . " ":"") . get_supplier_name($person_id); + //case payment_person_types::Project() : + // return ($full?payment_person_types::type_name($type) . " ":"") . get_dimension_string($person_id); + default : + //DisplayDBerror("Invalid type sent to person_name"); + //return; + return ''; + } + } + + function person_currency($type, $person_id) + { + switch ($type) + { + case payment_person_types::misc() : + case payment_person_types::WorkOrder() : + //case payment_person_types::Project() : + return get_company_currency(); + + case payment_person_types::customer() : + return get_customer_currency($person_id); + + case payment_person_types::supplier() : + return get_supplier_currency($person_id); + + default : + return get_company_currency(); + } + } + + function has_items($type) + { + switch ($type) + { + case payment_person_types::misc() : + return true; + case payment_person_types::WorkOrder() : // 070305 changed to open workorders ES + return db_has_open_workorders(); + case payment_person_types::customer() : + return db_has_customers(); + case payment_person_types::supplier() : + return db_has_suppliers(); + //case payment_person_types::Project() : + // return db_has_dimensions(); + default : + display_db_error("Invalid type sent to has_items", ""); + return; + } + } +} + +//---------------------------------------------------------------------------------- + +$wo_types_array = array ( + 0=> array ('id' => 0, 'name' => _("Assemble")), + 1=> array ('id' => 1, 'name' => _("Unassemble")), + 2=> array ('id' => 2, 'name' => _("Advanced Manufacture")) + ); + +class wo_types +{ + + function assemble() + { + return 0; + } + + function unassemble() + { + return 1; + } + + function advanced() + { + return 2; + } + + function get_all() + { + global $wo_types_array; + return $wo_types_array;; + } + + function name($index) + { + global $wo_types_array; + return $wo_types_array[$index]['name']; + } +} + + +?> \ No newline at end of file diff --git a/includes/ui.inc b/includes/ui.inc new file mode 100644 index 00000000..0e2442e4 --- /dev/null +++ b/includes/ui.inc @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/includes/ui/allocation_cart.inc b/includes/ui/allocation_cart.inc new file mode 100644 index 00000000..ee52150c --- /dev/null +++ b/includes/ui/allocation_cart.inc @@ -0,0 +1,113 @@ +allocs = array(); + + $this->trans_no = $trans_no; + $this->type = $type; + $this->person_id = $person_id; + $this->person_name = $person_name; + $this->amount = $amount; + $this->date_ = $date_; + } + + function add_item($type, $type_no, $date_, $due_date, $amount, $amount_allocated, + $current_allocated) + { + if ($amount > 0) + { + $this->allocs[count($this->allocs)] = new allocation_item($type, $type_no, + $date_, $due_date, $amount, $amount_allocated, $current_allocated); + return true; + } + else + { + return false; + } + } + + function update_item($index, $type, $type_no, $date_, $due_date, + $amount, $amount_allocated, $current_allocated) + { + if ($amount > 0) + { + $this->allocs[$index] = new allocation_item($type, $type_no, + $date_, $due_date, $amount, $amount_allocated, $current_allocated); + return true; + } + else + { + return false; + } + } + + function add_or_update_item($type, $type_no, $date_, $due_date, + $amount, $amount_allocated, $current_allocated) + { + for ($i = 0; $i < count($this->allocs); $i++) + { + $item = $this->allocs[$i]; + if (($item->type == $type) && ($item->type_no == $type_no)) + { + return $this->update_item($i, $type, $type_no, $date_, $due_date, + $amount, $amount_allocated, $current_allocated); + } + } + return $this->add_item($type, $type_no, $date_, $due_date, + $amount, $amount_allocated, $current_allocated); + } + +} + +//----------------------------------------------------------------------------------- + +class allocation_item +{ + + var $type; + var $type_no; + + var $date_; + var $due_date; + + var $amount_allocated; + var $amount; + + var $current_allocated; + + function allocation_item ($type, $type_no, $date_, $due_date, $amount, + $amount_allocated, $current_allocated) + { + + $this->type = $type; + $this->type_no = $type_no; + + $this->date_ = $date_; + $this->due_date = $due_date; + + $this->amount = $amount; + $this->amount_allocated = $amount_allocated; + $this->current_allocated = $current_allocated; + } +} + +//----------------------------------------------------------------------------------- + +?> diff --git a/includes/ui/index.php b/includes/ui/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/includes/ui/index.php @@ -0,0 +1,3 @@ + diff --git a/includes/ui/items_cart.inc b/includes/ui/items_cart.inc new file mode 100644 index 00000000..2c77babf --- /dev/null +++ b/includes/ui/items_cart.inc @@ -0,0 +1,308 @@ +clear_items(); + } + + // --------------- line item functions + + function add_to_cart($stock_id, $qty, $standard_cost, $description=null) + { + + if (isset($stock_id) && $stock_id != "" && isset($qty)) + { + $this->line_items[$stock_id] = new line_item($stock_id, $qty, + $standard_cost, $description); + $this->clear_editing_flags(); + return true; + } + else + { + // shouldn't come here under normal circumstances + display_db_error("unexpected - adding an invalid item or null quantity", "", true); + } + + return false; + } + + function find_cart_item($stock_id) + { + if (isset($this->line_items[$stock_id]) && $this->line_items[$stock_id] != null) + return $this->line_items[$stock_id]; + return null; + } + + function update_cart_item($update_item, $qty, $standard_cost) + { + $this->line_items[$update_item]->quantity = $qty; + $this->line_items[$update_item]->standard_cost = $standard_cost; + $this->clear_editing_flags(); + } + + function remove_from_cart(&$stock_id) + { + if (isset($stock_id)) + { + unset($this->line_items[$stock_id]); + $this->clear_editing_flags(); + } + } + + function count_items() + { + return count($this->line_items); + } + + function check_qoh($location, $date_, $reverse=false) + { + foreach ($this->line_items as $line_item) + { + $item_ret = $line_item->check_qoh($location, $date_, $reverse); + if ($item_ret != null) + return $line_item; + } + } + + // ----------- GL item functions + + function add_gl_item($code_id, $dimension_id, $dimension2_id, $amount, $reference, $description=null) + { + if (isset($code_id) && $code_id != "" && isset($amount) && isset($dimension_id) && + isset($dimension2_id)) + { + $this->gl_items[$this->gl_item_count] = new gl_item($this->gl_item_count, + $code_id, $dimension_id, $dimension2_id, $amount, $reference, $description); + $this->gl_item_count++; + $this->clear_editing_flags(); + return true; + } + else + { + // shouldn't come here under normal circumstances + display_db_error("unexpected - adding an invalid item or null quantity", "", true); + } + + return false; + } + + function update_gl_item($index, $dimension_id, $dimension2_id, $amount, $reference, $description=null) + { + $this->gl_items[$index]->index = $index; + $this->gl_items[$index]->dimension_id = $dimension_id; + $this->gl_items[$index]->dimension2_id = $dimension2_id; + $this->gl_items[$index]->amount = $amount; + $this->gl_items[$index]->reference = $reference; + if ($description != null) + $this->gl_items[$index]->description = $description; + + $this->clear_editing_flags(); + } + + function remove_gl_item($index) + { + if (isset($index)) + { + unset($this->gl_items[$index]); + $this->clear_editing_flags(); + } + } + + function count_gl_items() + { + return count($this->gl_items); + } + + function gl_items_total() + { + $total = 0; + foreach ($this->gl_items as $gl_item) + $total += $gl_item->amount; + return $total; + } + + function gl_items_total_debit() + { + $total = 0; + foreach ($this->gl_items as $gl_item) + { + if ($gl_item->amount > 0) + $total += $gl_item->amount; + } + return $total; + } + + function gl_items_total_credit() + { + $total = 0; + foreach ($this->gl_items as $gl_item) + { + if ($gl_item->amount < 0) + $total += $gl_item->amount; + } + return $total; + } + + // ------------ common functions + + function clear_items() + { + unset($this->line_items); + $this->line_items = array(); + + unset($this->gl_items); + $this->gl_items = array(); + $this->gl_item_count = 1; + + $this->clear_editing_flags(); + } + + function clear_editing_flags() + { + $this->editing_item = $this->deleting_item = 0; + } + + function get_editing_item() + { + return $this->editing_item; + } + + function get_deleting_item() + { + return $this->deleting_item; + } + + function is_editing_item($index) + { + return ($this->editing_item > 0) && ($this->editing_item == $index); + } + + function is_deleting_item($index) + { + return ($this->deleting_item > 0) && ($this->deleting_item == $index); + } + +} + +//-------------------------------------------------------------------------------------------- + +class line_item +{ + var $stock_id; + var $item_description; + var $units; + var $mb_flag; + + var $quantity; + var $price; + var $standard_cost; + + function line_item ($stock_id, $qty, $standard_cost=null, $description=null) + { + $item_row = get_item($stock_id); + + if ($item_row == null) + display_db_error("invalid item added to order : $stock_id", ""); + + $this->mb_flag = $item_row["mb_flag"]; + $this->units = $item_row["units"]; + + if ($description == null) + $this->item_description = $item_row["description"]; + else + $this->item_description = $description; + + if ($standard_cost == null) + $this->standard_cost = $item_row["actual_cost"]; + else + $this->standard_cost = $standard_cost; + + $this->stock_id = $stock_id; + $this->quantity = $qty; + //$this->price = $price; + $this->price = 0; + } + + function check_qoh($location, $date_, $reverse) + { + if (!sys_prefs::allow_negative_stock()) + { + if (has_stock_holding($this->mb_flag)) + { + $quantity = $this->quantity; + if ($reverse) + $quantity = -$this->quantity; + + if ($quantity >= 0) + return null; + + $qoh = get_qoh_on_date($this->stock_id, $location, $date_); + if ($quantity + $qoh < 0) + { + return $this; + } + } + } + + return null; + } +} + +//--------------------------------------------------------------------------------------- + +class gl_item +{ + + var $index; + var $code_id; + var $dimension_id; + var $dimension2_id; + var $amount; + var $reference; + var $description; + + function gl_item($index, $code_id, $dimension_id, $dimension2_id, $amount, $reference, + $description=null) + { + //echo "adding $index, $code_id, $dimension_id, $amount, $reference
"; + + if ($description == null) + $this->description = get_gl_account_name($code_id); + else + $this->description = $description; + + $this->index = $index; + $this->code_id = $code_id; + $this->dimension_id = $dimension_id; + $this->dimension2_id = $dimension2_id; + $this->amount = $amount; + $this->reference = $reference; + } +} + +//--------------------------------------------------------------------------------------- + +?> diff --git a/includes/ui/ui_controls.inc b/includes/ui/ui_controls.inc new file mode 100644 index 00000000..8fd5aba4 --- /dev/null +++ b/includes/ui/ui_controls.inc @@ -0,0 +1,177 @@ +\n"; + else + echo "
\n"; +} + +//--------------------------------------------------------------------------------- + +function end_form($breaks=0) +{ + if ($breaks) + br($breaks); + echo "
\n"; +} + +function start_table($extra="", $padding='0', $spacing='0') +{ + echo "
\n"; +} + +function end_table($breaks=0) +{ + echo "
\n"; + if ($breaks) + br($breaks); +} + +function meta_forward($forward_to, $params="") +{ + echo "\n"; + echo "

" . _("You should automatically be forwarded."); + echo " " . _("If this does not happen") . " " . "" . _("click here") . " " . _("to continue") . ".

\n"; + exit; +} + +//----------------------------------------------------------------------------------- + +function hyperlink_back($center=true) +{ + echo get_js_go_back(); + + if ($center) + echo "
"; + echo ""._("Back")."\n"; + if ($center) + echo "
"; + echo "
"; +} + +function hyperlink_no_params($target, $label, $center=true) +{ + if ($center) + echo "
"; + echo "$label\n"; + if ($center) + echo "
"; +} + +function hyperlink_no_params_td($target, $label) +{ + echo "
"; + hyperlink_no_params($target, $label); + echo ""; + hyperlink_params($target, $label, $params); + echo ""; + hyperlink_params_separate($target, $label, $params); + echo "
$msg
"; + submit_add_or_update($add); + echo "
 "; + submit_add_or_update($add); + echo "
"; + submit($name, $value); + echo "
 
$label"; + check(null, $name, $value, $submit_on_change); + echo "
$label$label$label$value
"; + + if ($value == null) + $value = (!isset($_POST[$name]) ? "" : $_POST[$name]); + echo ""; + + if ($post_label != "") + echo " " . $post_label; + + echo ""; + + echo ""; + + if ($post_label) + echo " " . $post_label; + + echo "
$label
$label"; + + if ($value == null) + $value = (!isset($_POST[$name]) ? "" : $_POST[$name]); + echo " "; + + submit($input_name, $input_value); + + echo "
$label"; + supplier_list($name, $selected_id, $all_option, $submit_on_change); + echo "
$label"; + customer_list($name, $selected_id, $all_option, $submit_on_change); + echo "
$label"; + customer_branches_list($customer_id, $name, $selected_id, $all_option, $enabled, $submit_on_change); + echo "
$label"; + locations_list($name, $selected_id, $all_option, $submit_on_change); + echo "
$label"; + currencies_list($name, $selected_id); + echo "
$label"; + fiscalyears_list($name, $selected_id); + echo "
$label"; + dimensions_list($name, $selected_id, $no_option, $showname, false, $showclosed, $showtype); + echo "
$label"; + stock_items_list($name, $selected_id, $all_option, $submit_on_change, $extra); + echo "
$label"; + stock_bom_items_list($name, $selected_id, $all_option, $submit_on_change); + echo "
$label"; + stock_manufactured_items_list($name, $selected_id, $all_option, $submit_on_change); + echo "
$label"; + stock_purchasable_items_list($name, $selected_id, $all_option, $submit_on_change, $extra); + echo "
$label"; + if ($enabled) + echo "\n"; + if ($selected_id == null) + $selected_id = (!isset($_POST[$name]) ? "" : $_POST[$name]); + if ($selected_id == "") + $_POST[$name] = $selected_id = "B"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
$label
$label"; + tax_types_list($name, $selected_id, $none_option, $none_option_name, $submit_on_change); + echo "
$label"; + tax_groups_list($name, $selected_id, false, null, $submit_on_change); + echo "
$label"; + item_tax_types_list($name, $selected_id); + echo "
$label"; + shippers_list($name, $selected_id); + echo "
$label\n"; + sales_persons_list($name, $selected_id); + echo "
$label"; + sales_areas_list($name, $selected_id); + echo "
$label"; + workorders_list($name, $selected_id); + echo "
$label"; + payment_terms_list($name, $selected_id); + echo "
$label"; + credit_status_list($name, $selected_id); + echo "
$label"; + sales_types_list($name, $selected_id); + echo "
$label"; + movement_types_list($name, $selected_id); + echo "
$label"; + bank_trans_types_list($name, $selected_id); + echo "
$label"; + workcenter_list($name, $selected_id, $all_option); + echo "
$label"; + bank_accounts_list($name, $selected_id, $submit_on_change); + echo "
$label"; + class_list($name, $selected_id, $submit_on_change); + echo "
$label"; + stock_categories_list($name, $selected_id); + echo "
$label"; + gl_account_types_list($name, $selected_id, $all_option, $all_option_name, $all_option_numeric); + echo "
$label"; + gl_all_accounts_list($name, $selected_id, $skip_bank_accounts, $show_group, $onchange); + echo "
$label"; + yesno_list($name, $selected_id, $name_yes, $name_no, $submit_on_change); + echo "
$label"; + languages_list($name, $selected_id); + echo "
$label"; + bank_account_types_list($name, $selected_id); + echo "
$label"; + payment_person_types_list($name, $selected_id, $related); + echo "
$label\n"; + wo_types_list($name, $selected_id); + echo "
$label
$label
$label
$label
$label
$label
$label
$label
\n"; + number_list($name, $selected, $from, $to); + echo "
+ + + +
$msg

\n"; + + //echo "" . _("ERROR :") . " $msg
"; +} + +function display_notification($msg, $center=true) +{ + echo "
+ + + +
$msg

\n"; +} + +function display_notification_centered($msg) +{ + display_notification($msg, true); +} + +function display_heading($msg) +{ + echo "
$msg
\n"; +} + +function display_heading2($msg) +{ + echo "
$msg
\n"; +} + +function display_note($msg, $br=0, $br2=0, $extra="") +{ + for ($i = 0; $i < $br; $i++) + echo "
"; + if ($extra != "") + echo "
$msg
\n"; + else + echo "
$msg
\n"; + for ($i = 0; $i < $br2; $i++) + echo "
"; +} + +function stock_item_heading($stock_id) +{ + if ($stock_id != "") + { + $result = db_query("SELECT description, units FROM ".TB_PREF."stock_master WHERE stock_id='$stock_id'"); + $myrow = db_fetch_row($result); + + display_heading("$stock_id - $myrow[0]"); + $units = $myrow[1]; + display_heading2(_("in units of : ") . $units); + } +} + +?> \ No newline at end of file diff --git a/includes/ui/ui_view.inc b/includes/ui/ui_view.inc new file mode 100644 index 00000000..d33b9fc6 --- /dev/null +++ b/includes/ui/ui_view.inc @@ -0,0 +1,646 @@ +$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_gl_view_str($type, $trans_no, $label="", $force=false) +{ + global $path_to_root, $use_popup_windows; + + if (!$force && !user_show_gl_info()) + return ""; + + if ($label == "") + $label = _("GL"); + if ($use_popup_windows) + $gl_view = "$label"; + else + $gl_view = "$label"; + + return $gl_view; +} + +//-------------------------------------------------------------------------------------- + +function get_gl_view_str_cell($type, $trans_no, $label="") +{ + $str = get_gl_view_str($type, $trans_no, $label); + if ($str != "") + return "$str"; +} + +//-------------------------------------------------------------------------------------- + +function get_customer_trans_view_str($type, $trans_no, $label="") +{ + global $path_to_root, $use_popup_windows; + + $viewer = ""; + if ($type == 10) + $viewer = "view_invoice.php"; + elseif ($type == 11) + $viewer = "view_credit.php"; + elseif ($type == 12) + $viewer = "view_receipt.php"; + elseif ($type == 30) + $viewer = "view_sales_order.php"; + else + return null; + + if ($label == "") + $label = $trans_no; + + if ($viewer != "") + { + if ($use_popup_windows) + $preview_str = "$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_banking_trans_view_str($type, $trans_no, $label="") +{ + global $path_to_root, $use_popup_windows; + + $viewer = ""; + + if ($type == 4) + $viewer = "bank_transfer_view.php"; + elseif ($type == 1) + $viewer = "gl_payment_view.php"; + elseif ($type == 2) + $viewer = "gl_deposit_view.php"; + elseif ($type == 0) + $viewer = ""; + else + return null; + + if ($label == "") + $label = $trans_no; + + if ($viewer != "") + { + if ($use_popup_windows) + $preview_str = "$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_inventory_trans_view_str($type, $trans_no, $label="") +{ + global $path_to_root, $use_popup_windows; + + $viewer = ""; + + if ($type == systypes::inventory_adjustment()) + $viewer = "view_adjustment.php"; + elseif ($type == systypes::location_transfer()) + $viewer = "view_transfer.php"; + else + return null; + + if ($label == "") + $label = $trans_no; + + if ($viewer != "") + { + if ($use_popup_windows) + $preview_str = "$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_manufacturing_trans_view_str($type, $trans_no, $label="") +{ + global $path_to_root, $use_popup_windows; + + $viewer = ""; + + if ($type == 28) + $viewer = "wo_issue_view.php"; + elseif ($type == 29) + $viewer = "wo_production_view.php"; + elseif ($type == systypes::work_order()) + $viewer = "work_order_view.php"; + else + return null; + + if ($label == "") + $label = $trans_no; + + if ($viewer != "") + { + if ($use_popup_windows) + $preview_str = "$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_dimensions_trans_view_str($type, $trans_no, $label="") +{ + global $path_to_root, $use_popup_windows; + + $viewer = ""; + + if ($type == 40) + $viewer = "view_dimension.php"; + else + return null; + + if ($label == "") + $label = $trans_no; + + if ($viewer != "") + { + if ($use_popup_windows) + $preview_str = "$label"; + else + $preview_str = "$label"; + } + else + $preview_str = $label; + + return $preview_str; +} + +//-------------------------------------------------------------------------------------- + +function get_trans_view_str($type, $trans_no, $label="") +{ + $view_str = get_customer_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + $view_str = get_supplier_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + $view_str = get_banking_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + $view_str = get_inventory_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + $view_str = get_manufacturing_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + $view_str = get_dimensions_trans_view_str($type, $trans_no, $label); + if ($view_str != null) + return $view_str; + + return null; +} + +//-------------------------------------------------------------------------------------- + +function exchange_rate_display($from_currency, $to_currency, $date_, $buttons=true) +{ + if ($from_currency != $to_currency) + { + if ($buttons && isset($_POST['get_rate'])) + { + $comp_currency = get_company_currency(); + if ($from_currency == $comp_currency) + $currency = $to_currency; + else + $currency = $from_currency; + $rate = get_ecb_rate($currency); + if (get_date_exchange_rate($currency, $date_)) + update_exchange_rate($currency, $date_, $rate, $rate); + else + add_exchange_rate($currency, $date_, $rate, $rate); + if ($from_currency == $comp_currency) + $rate = 1 / $rate; + } + else + $rate = get_exchange_rate_from_to($to_currency, $from_currency, $date_); + $rate = number_format2($rate, user_exrate_dec()); + label_row(_("Exchange Rate:"),"1 " . $from_currency . " = " . $rate . " " . $to_currency . + ($buttons?" " . submit('get_rate',_("Get"), false):"")); + } +} + +//-------------------------------------------------------------------------------------- + +function is_voided_display($type, $id, $label) +{ + global $table_style; + $void_entry = get_voided_entry($type, $id); + + if ($void_entry == null) + return false; + + start_table("width=50% $table_style"); + echo "$label
"; + echo "" . _("Date Voided:") . " " . sql2date($void_entry["date_"]) . "
"; + if (strlen($void_entry["memo_"]) > 0) + echo "
" . _("Memo:") . " " . $void_entry["memo_"] . "
"; + echo ""; + end_table(1); + + return true; +} + +//-------------------------------------------------------------------------------------- + +function comments_display_row($type, $id) +{ + $comments = get_comments($type, $id); + if ($comments and db_num_rows($comments)) + { + echo ""; + while ($comment = db_fetch($comments)) + { + echo $comment["memo_"] . "
"; + } + echo ""; + } +} + +//-------------------------------------------------------------------------------------- + +function get_comments_string($type, $type_no) +{ + $str_return = ""; + $result = get_comments($type, $type_no); + while ($comment = db_fetch($result)) + { + if (strlen($str_return)) + $str_return = $str_return . " \n"; + $str_return = $str_return . $comment["memo_"]; + } + return $str_return; +} + +//-------------------------------------------------------------------------------------- + +function view_stock_status($stock_id, $description=null) +{ + global $path_to_root; + if ($description) + //hyperlink_params_separate($path_to_root . "/inventory/inquiry/stock_status.php", (user_show_codes()?$stock_id . " - ":"") . $description, "stock_id=$stock_id"); + $preview_str = "". (user_show_codes()?$stock_id . " - ":"") . $description.""; + else + //hyperlink_params_separate($path_to_root . "/inventory/inquiry/stock_status.php", $stock_id, "stock_id=$stock_id"); + $preview_str = "$stock_id"; + echo $preview_str; +} + +function view_stock_status_cell($stock_id, $description=null) +{ + echo ""; + view_stock_status($stock_id, $description); + echo ""; +} + +//-------------------------------------------------------------------------------------- + +function display_debit_or_credit_cells($value) +{ + if ($value > 0) + { + amount_cell($value); + label_cell(""); + } + elseif ($value < 0) + { + label_cell(""); + amount_cell(abs($value)); + } + else + { + //label_cell(""); + amount_cell(0); + label_cell(""); + } +} + +//-------------------------------------------------------------------------------------- + +function display_customer_trans_tax_details($tax_items, $columns) +{ + while ($tax_item = db_fetch($tax_items)) + { + $tax = number_format2($tax_item['amount'],user_price_dec()); + if ($tax_item['included_in_price']) + label_row(_("Included") . " " . $tax_item['tax_type_name'] . " (" . $tax_item['rate'] . "%) " . + _("Amount") . ": $tax", "", "colspan=$columns align=right", "align=right"); + else + label_row($tax_item['tax_type_name'] . " (" . $tax_item['rate'] . "%)", + $tax, "colspan=$columns align=right", "align=right"); + } +} + +//-------------------------------------------------------------------------------------- + +function display_supp_trans_tax_details($tax_items, $columns) +{ + while ($tax_item = db_fetch($tax_items)) + { + $tax = number_format2(abs($tax_item['amount']),user_price_dec()); + if ($tax_item['included_in_price']) + label_row(_("Included") . " " . $tax_item['tax_type_name'] . " (" . $tax_item['rate'] . "%) " . + _("Amount:") . ": $tax", "colspan=$columns align=right", "align=right"); + else + label_row($tax_item['tax_type_name'] . " (" . $tax_item['rate'] . "%)", + $tax, "colspan=$columns align=right", "align=right"); + } +} + +//-------------------------------------------------------------------------------------- + +function display_edit_tax_items($taxes, $columns) +{ + $total = 0; + + foreach ($taxes as $taxitem) + { + if ($taxitem['included_in_price']) + { + label_row(_("Included") . " " . $taxitem['tax_type_name'] . " (" . $taxitem['rate'] . "%) " . + _("Amount:") . " " . number_format2($taxitem['Value'],user_price_dec()), "", "colspan=$columns align=right", "align=right"); + } + else + { + label_row($taxitem['tax_type_name'] . " (" . $taxitem['rate'] . "%)", + number_format2($taxitem['Value'],user_price_dec()), "colspan=$columns align=right", "align=right"); + $total += $taxitem['Value']; + } + } + + return $total; +} + +//-------------------------------------------------------------------------------------- + +function display_footer_exit() +{ + global $path_to_root; + br(2); + end_page(); + exit; +} + +//-------------------------------------------------------------------------------------- + +function display_allocations($alloc_result, $total) +{ + global $table_style; + + if (!$alloc_result || db_num_rows($alloc_result) == 0) + return; + + display_heading2(_("Allocations")); + + start_table("$table_style width=80%"); + + $th = array( _("Type"), _("Number"), _("Date"), _("Total Amount"), + _("Left to Allocate"), _("This Allocation")); + table_header($th); + $k = $total_allocated = 0; + + while ($alloc_row = db_fetch($alloc_result)) + { + + alt_table_row_color($k); + + label_cell(systypes::name($alloc_row['type'])); + label_cell(get_trans_view_str($alloc_row['type'],$alloc_row['trans_no'])); + label_cell(sql2date($alloc_row['tran_date'])); + amount_cell($alloc_row['Total']); + //amount_cell($alloc_row['Total'] - $alloc_row['PrevAllocs'] - $alloc_row['amt']); + amount_cell($alloc_row['Total'] - $alloc_row['amt']); + amount_cell($alloc_row['amt']); + end_row(); + + $total_allocated += $alloc_row['amt']; + } + start_row(); + label_cell(_("Total Allocated:"), "align=right colspan=5"); + amount_cell($total_allocated); + end_row(); + start_row(); + label_cell(_("Left to Allocate:"), "align=right colspan=5"); + amount_cell($total - $total_allocated); + end_row(); + + end_table(1); +} + +//-------------------------------------------------------------------------------------- + +function display_allocations_from($person_type, $person_id, $type, $type_no, $total) +{ + switch ($person_type) + { + case payment_person_types::customer() : + $alloc_result = get_allocatable_to_cust_transactions($person_id, $type_no, $type); + display_allocations($alloc_result, $total); + return; + case payment_person_types::supplier() : + $alloc_result = get_allocatable_to_supp_transactions($person_id, $type_no, $type); + display_allocations($alloc_result, $total); + return; + } +} + +function get_js_go_back() +{ + $js = "\n\n"; + return $js; +} + +function get_js_open_window($width, $height) +{ + $js = "\n\n"; + return $js; +} + +function get_js_form_entry($edit_name, $sel_name, $next_name) +{ + $js = "\n\n"; + return $js; +} + +function get_js_set_focus($name) +{ + $js = "\n\n"; + return $js; +} + +function get_js_png_fix() +{ + $js = "\n"; + return $js; +} + +function alert($msg) +{ + echo "\n\n"; +} + +if (!function_exists('_vd')) +{ + function _vd($mixed, $title = '', $exit = false) + { + // Only the site admin is able to proceed here. + echo (!empty($title) ? ($title .':') : '') .'
';
+    	var_dump($mixed);
+    	echo "
\n"; + if ($exit) + exit; + } +} + +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 00000000..c158424b --- /dev/null +++ b/index.php @@ -0,0 +1,11 @@ +selected_application = $_GET['application']; + $app->display(); +?> \ No newline at end of file diff --git a/install.html b/install.html new file mode 100644 index 00000000..5984d404 --- /dev/null +++ b/install.html @@ -0,0 +1,307 @@ + + + + + + FrontAccounting + + + + + + +
FrontAccounting 1.0 Installation
+ +

Pre-requisites

+ + + + + +

Important Notes

+ + + + + +

Copying all the project files to the correct directory

+ + + + + +

Installation Steps (automatic, recommended)

+ + +
    + + +
  1. If you have the option to create multiple databases on your host, create one, fi. frontacc, +otherwise write down the database name for your account. At the same +time look up the username and password for the database. You will need +these informations during the wizard install.
  2. + + +
  3. Enter your_url/account/install (or +whatever directory you entered). This will run the install wizard, +setup a drill company and populating with initial data. You can later +on create your own real company. It is a good idea to get familiar with +the system before starting your own company. 
  4. +
  5. After successfully install, remove or rename your install directory for safety reasons. You don't need it any more.
  6. + + +
+ + +

Installation Steps (manuel, for advanced users, not recommended)

+ + +


+ +

+ + +
    + + +
  1. + +

    Creating the Database

    + + + +
      + + +
    1. NOTE : As FrontAccounting is still heavily under development, +the database structure will ALWAYS change between releases, so if you +have a database that you created for a previous release of +FrontAccounting, it WILL NOT WORK after installing a new release. +Please delete any old databases before proceeding.
    2. + + +
    3. We strongly suggest using a GUI to manage your database(s) and database users. If you don’t have any, download phpMyAdmin.
    4. + + +
    5. Create a database with a name of your choice. The default in config_db.php is ‘frontacc’, but of course you can select whatever name you desire.
    6. + + +
    7. Populate the database you have created. There are two scripts +are provided to populate the database (both inside the folder /sql) : + + +
        + + +
      1. en_US-demo.sql. This has a minimal amount of demonstration data set up so that transactions can be tried to see how the system works.
      2. + + +
      3. en_US-new.sql. This script has +only the basic data necessary to start a new company system off. If you +wish to set up your company on FrontAccounting then this is the script +to use.
      4. + + + +
      + + +
    8. + + +
    9. Now that the database is created you will need to set up a +database user to access this database. DO NOT USE THE USER +‘ROOT’. Set up a new user and give that user full +privileges over the database ‘frontacc’.
    10. +
    11. After successfully install, remove or rename your install directory your_url/account/install (or +whatever directory you entered) for safety reasons. You don't need it any more.
    12. + + + +
    + + +
  2. + + +
  3. + +

    Editing config_db.php

    + + + +
      + + +
    1. config_db.php contains connection +information for the database. These must be set to your local settings +or you will not be able to access FrontAccounting.
    2. + + +
    3. FrontAccounting allows multiple connections, you can enter as +many connections as you have separate entities (most people will use +only one).
    4. + + +
    5. $db_connections is an array of connections – for each connection :
    6. + + +
    7. name” is the name of the connection, this is the name that will be displayed to the user
    8. + + +
    9. host” is the computer IP +address or name where the database is. The default is localhost +assuming that the web server is also the sql server.
    10. + + +
    11. dbuser” is the user name under +which the database should be accessed. NB, again, do not use the user +ROOT. A user with appropriate privileges must be set up.
    12. + + +
    13. dbpassword” is the password for “dbuser”. You would have entered this when you created “dbuser”.
    14. + + +
    15. dbname” is the name of the database. The provided scripts use the name OpenAccounting.
    16. + + +
    17. tbpref” is the table prefix for +the tables. If you only have access to one database, you must use table +prefix to separate the companies. Table prefix is set by a table prefix +counter inside config_db.php, fi. 0_ for the first company.
    18. + + + +
    + + +
  4. + + +
+ + +

 Logging In For the First Time

+ + +
    + + +
  1. Open a browser and enter the URL for the web server directory where FrontAccounting is installed.
  2. + + +
  3. Enter the user name:  'admin'
  4. + + +
  5. Enter the password: 'password'
  6. + + +
  7. (NB : enter without quotation marks).
  8. + + +
  9. + +
    You can set up additional user accounts from the System Setup +tab. Be careful not to delete the demonstration user until a new user +has been set up. If there are no users defined the next time you try to +login you won't be able to. The only way then to create a user to login +with is to manually edit the SQL table "users" to insert a user.
    + + +
  10. + + +
+ + +

Setting Up Company Specific Data

+ + +
    + + +
  1. All the standing configuration data is defined from the Setup tab +and each link should be reviewed to enter appropriate data for the +business. Setup wizards that guide you through this process has been +implemented and we strongly recommend you to use this approach, see Installation steps (automatic, recommended) .
  2. + + +
+ + +

Troubleshooting

+ + +
    + + +
  1. If FrontAccounting is installed locally, you may have the session save path not set correctly. Normally this is set in your php.ini (for Windows). The entry is called session.save_path. Make sure this is set to a directory that actually exists. The default is set to /tmp, which may not be valid.
  2. + + +
  3. If you are installing FrontAccounting onto a shared server, you +may have to set the session save path within FrontAccounting. At the +top of config.php you will find this line :
  4. + + +
  5. Uncomment this line and set the path to a directory that exists +on your server. Make sure that you have read/write privileges on this +directory.
  6. + + +
+ + +

 

+ + + diff --git a/install/index.php b/install/index.php new file mode 100644 index 00000000..786dde60 --- /dev/null +++ b/install/index.php @@ -0,0 +1,307 @@ +Enabled'; + // Reload page + header('Location: index.php?sessions_checked=true'); + exit(0); +} +else +{ + // Check if session variable has been saved after reload + if(isset($_SESSION['session_support'])) + { + $session_support = $_SESSION['session_support']; + } + else + { + $session_support = 'Disabled'; + } +} +$path_to_root = ".."; + +?> + + + +FrontAccounting Installation Wizard + + + + + + + + + +
+ FrontAccounting + Installation Wizard +
+ +
+ + + + + + + + + +
+

Welcome to the FrontAccounting Installation Wizard.

+
+ Logo +
+ + +
Error:
+ + + + + Enabled') { ?> + + + + + + + + + + + + +

Step 1

Please check the following requirements are met before continuing...
Please note: PHP Session Support may appear disabled if your browser does not support cookies.
PHP Version > 4.1.0 + 4.1) { + ?>YesNo + PHP Session SupportPHP Safe Mode + EnabledDisabled +
+ + + + + + + + + + + + + + + + + + + + +

Step 2

Please check the following files/folders are writeable before continuing...
config_db.phpWriteable'; } elseif(!file_exists($path_to_root.'/config_db.php')) { echo 'File Not Found'; } else { echo 'Unwriteable'; } ?>inventory/manage/image/Writeable'; } elseif(!file_exists($path_to_root.'/inventory/manage/image/')) { echo 'Directory Not Found'; } else { echo 'Unwriteable'; } ?>
lang/Writeable'; } elseif(!file_exists($path_to_root.'/lang/')) { echo 'Directory Not Found'; } else { echo 'Unwriteable'; } ?>reporting/pdf_files/Writeable'; } elseif(!file_exists($path_to_root.'/reporting/pdf_files/')) { echo 'Directory Not Found'; } else { echo 'Unwriteable'; } ?>
admin/backup/Writeable'; } elseif(!file_exists($path_to_root.'/admin/backup/')) { echo 'Directory Not Found'; } else { echo 'Unwriteable'; } ?>
+ + + + + + + + +

Step 3

Please check your path settings...
+ Absolute URL: + + + +
+ + + + + + + + + +

Step 4

Please specify your operating system information below...
+ Server Operating System: + + /> + Linux/Unix based +
+ /> + Windows +
+
+ /> + +
+ (Please note: this is only recommended for testing environments) +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Please enter your MySQL database server details below...
Host Name: + +  Username: + +
Database Name: + +  Password: + /> +
Table Prefix: + +   + /> + +
      + (Please note: May remove existing tables and data)

Step 5

Please enter the training company name below (you can create your own company later)...
Company Name: + +

Step 6

Please enter your Administrator account details below...
Username: + admin + +  Password: + /> +
Email: + /> +  Re-Password: + /> +

 

+ + + + + +
Please note:   + FrontAccounting is released under the + GNU General Public License +
+ By clicking install, you are accepting the license. +
+
+ +
+ +
+ +
+ + + + + +
+ + FrontAccounting + is released under the + GNU General Public License + +
+ + + \ No newline at end of file diff --git a/install/save.php b/install/save.php new file mode 100644 index 00000000..74403dd0 --- /dev/null +++ b/install/save.php @@ -0,0 +1,366 @@ +Enabled'; + // Redirect to first page again and exit + header('Location: index.php?sessions_checked=true'); + exit(); + } +} + +// Function to workout what the default permissions are for files created by the webserver +function default_file_mode($temp_dir) +{ + $v = explode(".",PHP_VERSION); + $v = $v[0].$v[1]; + if($v > 41 && is_writable($temp_dir)) + { + $filename = $temp_dir.'/test_permissions.txt'; + $handle = fopen($filename, 'w'); + fwrite($handle, 'This file is to get the default file permissions'); + fclose($handle); + $default_file_mode = '0'.substr(sprintf('%o', fileperms($filename)), -3); + unlink($filename); + } + else + { + $default_file_mode = '0777'; + } + return $default_file_mode; +} + +// Function to workout what the default permissions are for directories created by the webserver +function default_dir_mode($temp_dir) +{ + $v = explode(".",PHP_VERSION); + $v = $v[0].$v[1]; + if ($v > 41 && is_writable($temp_dir)) + { + $dirname = $temp_dir.'/test_permissions/'; + mkdir($dirname); + $default_dir_mode = '0'.substr(sprintf('%o', fileperms($dirname)), -3); + rmdir($dirname); + } + else + { + $default_dir_mode = '0777'; + } + return $default_dir_mode; +} + +function add_slashes($input) +{ + if (get_magic_quotes_gpc() || (!is_string($input))) + { + return $input; + } + $output = addslashes($input); + return $output; +} +function check_db_error($err_msg, $sql) +{ + return true; +} + +if (isset($_POST['path_to_root'])) + $path_to_root = $_POST['path_to_root']; +else + $path_to_root = ".."; + +// Begin check to see if form was even submitted +// Set error if no post vars found +if (!isset($_POST['company_name'])) +{ + set_error('Please fill-in the form below'); +} +// End check to see if form was even submitted + +// Begin path and timezone details code + +// Check if user has entered the installation url +if (!isset($_POST['ba_url']) || $_POST['ba_url'] == '') +{ + set_error('Please enter an absolute URL'); +} +else +{ + $ba_url = $_POST['ba_url']; +} + +// Remove any slashes at the end of the URL +if(substr($ba_url, strlen($ba_url) - 1, 1) == "/") +{ + $ba_url = substr($ba_url, 0, strlen($ba_url) - 1); +} +if(substr($ba_url, strlen($ba_url) - 1, 1) == "\\") +{ + $ba_url = substr($ba_url, 0, strlen($ba_url) - 1); +} +if(substr($ba_url, strlen($ba_url) - 1, 1) == "/") +{ + $ba_url = substr($ba_url, 0, strlen($ba_url) - 1); +} +if(substr($ba_url, strlen($ba_url) - 1, 1) == "\\") +{ + $ba_url = substr($ba_url, 0, strlen($ba_url) - 1); +} +// End path + +// Begin operating system specific code +// Get operating system +if (!isset($_POST['operating_system']) || $_POST['operating_system'] != 'linux' && $_POST['operating_system'] != 'windows') +{ + set_error('Please select a valid operating system'); +} +else +{ + $operating_system = $_POST['operating_system']; +} +// Work-out file permissions +if($operating_system == 'windows') +{ + $file_mode = '0777'; + $dir_mode = '0777'; +} +elseif (isset($_POST['world_writeable']) && $_POST['world_writeable'] == 'true') +{ + $file_mode = '0777'; + $dir_mode = '0777'; +} +else +{ + $file_mode = default_file_mode('../temp'); + $dir_mode = default_dir_mode('../temp'); +} +// End operating system specific code + +// Begin database details code +// Check if user has entered a database host +if (!isset($_POST['database_host']) || $_POST['database_host'] == '') +{ + set_error('Please enter a database host name'); +} +else +{ + $database_host = $_POST['database_host']; +} +// Check if user has entered a database username +if (!isset($_POST['database_username']) || $_POST['database_username'] == '') +{ + set_error('Please enter a database username'); +} +else +{ + $database_username = $_POST['database_username']; +} +// Check if user has entered a database password +if (!isset($_POST['database_password'])) +{ + set_error('Please enter a database password'); +} +else +{ + $database_password = $_POST['database_password']; +} +// Check if user has entered a database name +if (!isset($_POST['database_name']) || $_POST['database_name'] == '') +{ + set_error('Please enter a database name'); +} +else +{ + $database_name = $_POST['database_name']; +} +// Get table prefix +$table_prefix = $_POST['table_prefix']; +// Find out if the user wants to install tables and data +if (isset($_POST['install_tables']) && $_POST['install_tables'] == 'true') +{ + $install_tables = true; +} +else +{ + $install_tables = false; +} +// End database details code + +// Begin company name code +// Get company name +if (!isset($_POST['company_name']) || $_POST['company_name'] == '') +{ + set_error('Please enter a company name'); +} +else +{ + $company_name = add_slashes($_POST['company_name']); +} +// End website company name + +// Check if the user has entered a correct path +if (!file_exists($path_to_root.'/sql/basic.sql')) +{ + set_error('It appears the Absolute path that you entered is incorrect'); +} + +// Get admin email and validate it +if (!isset($_POST['admin_email']) || $_POST['admin_email'] == '') +{ + set_error('Please enter an email for the Administrator account'); +} +else +{ + if (eregi("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $_POST['admin_email'])) + { + $admin_email = $_POST['admin_email']; + } + else + { + set_error('Please enter a valid email address for the Administrator account'); + } +} +// Get the two admin passwords entered, and check that they match +if (!isset($_POST['admin_password']) || $_POST['admin_password'] == '') +{ + set_error('Please enter a password for the Administrator account'); +} +else +{ + $admin_password = $_POST['admin_password']; +} +if (!isset($_POST['admin_repassword']) || $_POST['admin_repassword'] == '') +{ + set_error('Please make sure you re-enter the password for the Administrator account'); +} +else +{ + $admin_repassword = $_POST['admin_repassword']; +} +if ($admin_password != $admin_repassword) +{ + set_error('Sorry, the two Administrator account passwords you entered do not match'); +} +// End admin user details code + +include_once($path_to_root . "/includes/db/connect_db.inc"); +include_once($path_to_root . "/admin/db/maintenance_db.inc"); +include_once($path_to_root . "/config_db.php"); + +$id = count($db_connections); +if ($table_prefix != "" && $id > 0) + $table_prefix = $tb_pref_counter . "_"; +$db_connections[$id]['name'] = $company_name; +$db_connections[$id]['host'] = $database_host; +$db_connections[$id]['dbuser'] = $database_username; +$db_connections[$id]['dbpassword'] = $database_password; +$db_connections[$id]['dbname'] = $database_name; +$db_connections[$id]['tbpref'] = $table_prefix; + +$def_coy = $id; + +$config_filename = $path_to_root . '/config_db.php'; + +$err = write_config_db($table_prefix != ""); +if ($err == -1) + set_error("Cannot open the configuration file ($config_filename)"); +else if ($err == -2) + set_error("Cannot write to the configuration file ($config_filename)"); +else if ($err == -3) + set_error("The configuration file $config_filename is not writable. Change its permissions so it is, then re-run step 4."); + +// Try connecting to database + +$db = mysql_connect($database_host, $database_username, $database_password); +if (!$db) +{ + set_error('Database host name, username and/or password incorrect. MySQL Error:
'.mysql_error()); +} + +if($install_tables == true) +{ + if (!mysql_select_db($database_name, $db)) + { + + // Try to create the database + mysql_query('CREATE DATABASE '.$database_name); + mysql_select_db($database_name, $db); + } + $import_filename = $path_to_root."/sql/basic.sql"; + if (!db_import($import_filename, $db_connections[$id])) + set_error("Import error, try to import $import_filename and $path_to_root/en_US-demo.sql manually via phpMyAdmin"); + $import_filename = $path_to_root."/sql/en_US-demo.sql"; + if (!db_import($import_filename, $db_connections[$id])) + set_error("Import error, try to import $import_filename manually via phpMyAdmin"); +} +else +{ + mysql_select_db($database_name, $db); +} +$sql = "UPDATE ".$table_prefix."users SET password = '" . md5($admin_password) . "', email = '$admin_email' WHERE user_id = 'admin'"; +db_query($sql, "could not update admin account"); +$sql = "UPDATE ".$table_prefix."company SET coy_name = '$company_name' WHERE coy_code = 1"; +db_query($sql, "could not update company name. Do it manually later in Setup"); + +session_unset(); +session_destroy(); +$_SESSION = array(); + +header("Location: ".$path_to_root."/index.php"); +exit(); + +?> \ No newline at end of file diff --git a/install/stylesheet.css b/install/stylesheet.css new file mode 100644 index 00000000..63f15b55 --- /dev/null +++ b/install/stylesheet.css @@ -0,0 +1,71 @@ +body,td,th,input,textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #000000; +} +body { + background-color: #557799; + background-image: url(../admin/interface/background.png); + background-repeat: repeat-x; + margin: 0px; +} +form { + margin: 0; +} +.submit { + border : solid 1px #CCCCCC; + background: #E9ECEF; + color : #003366; + font-weight : bold; + font-size : 11px; + padding: 4px; + width: 100%; +} +.content { + background-color: #FFFFFF; + padding: 15px; + height: 350px; + width: 750px; + text-align: justify; + vertical-align: top; +} +hr { + margin: 15px 0px 15px 0px; + color: #003366; + height: 1px; +} +h1 { + font-size: 13px; + color: #336699; + margin: 0px 0px 5px 0px; + border-bottom: 1px solid #CCCCCC; +} +h2 { + font-size: 12px; + color: #336699; + text-align: center; + margin: 0px 0px 5px 0px; +} +a:link, a:visited, a:active { + color: #003366; + text-decoration: none; +} +a:hover { + text-decoration: none; + color: #336699; +} +.bad { + color: #FF0000; + font-weight: bold; +} +.good { + color: #009900; + font-weight: bold; +} +.note { + color: #666666; + font-size: 10px; +} +.hide { + display: none; +} \ No newline at end of file diff --git a/inventory/adjustments.php b/inventory/adjustments.php new file mode 100644 index 00000000..9a114e41 --- /dev/null +++ b/inventory/adjustments.php @@ -0,0 +1,237 @@ +from_loc = $_POST['StockLocation']; + $_SESSION['adj_items']->tran_date = $_POST['AdjDate']; + $_SESSION['adj_items']->transfer_type = $_POST['type']; + $_SESSION['adj_items']->increase = $_POST['Increase']; + $_SESSION['adj_items']->memo_ = $_POST['memo_']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_st() +{ + $_POST['StockLocation'] = $_SESSION['adj_items']->from_loc; + $_POST['AdjDate'] = $_SESSION['adj_items']->tran_date; + $_POST['type'] = $_SESSION['adj_items']->transfer_type; + $_POST['Increase'] = $_SESSION['adj_items']->increase; + $_POST['memo_'] = $_SESSION['adj_items']->memo_; +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['adj_items'])) + { + $_SESSION['adj_items']->clear_items(); + unset ($_SESSION['adj_items']); + } + + session_register("adj_items"); + + $_SESSION['adj_items'] = new items_cart; + $_POST['AdjDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['AdjDate'])) + $_POST['AdjDate'] = end_fiscalyear(); + $_SESSION['adj_items']->tran_date = $_POST['AdjDate']; +} + +//----------------------------------------------------------------------------------------------- + +function can_process() +{ + if (!references::is_valid($_POST['ref'])) + { + display_error( _("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], systypes::inventory_adjustment())) + { + display_error( _("The entered reference is already in use.")); + return false; + } + + if (!is_date($_POST['AdjDate'])) + { + display_error(_("The entered date for the adjustment is invalid.")); + return false; + } + elseif (!is_date_in_fiscalyear($_POST['AdjDate'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + $failed_item = $_SESSION['adj_items']->check_qoh($_POST['StockLocation'], $_POST['AdjDate'], !$_POST['Increase']); + if ($failed_item != null) + { + display_error(_("The adjustment cannot be processed because an adjustment item would cause a negative inventory balance :") . + " " . $failed_item->stock_id . " - " . $failed_item->item_description); + return false; + } + + return true; +} + +//------------------------------------------------------------------------------- + +if (isset($_POST['Process']) && can_process()){ + + $trans_no = add_stock_adjustment($_SESSION['adj_items']->line_items, + $_POST['StockLocation'], $_POST['AdjDate'], $_POST['type'], $_POST['Increase'], + $_POST['ref'], $_POST['memo_']); + + $_SESSION['adj_items']->clear_items(); + unset($_SESSION['adj_items']); + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['qty'])) + { + display_error(_("The quantity entered is not a valid number.")); + return false; + } + + if ($_POST['qty'] <= 0) + { + display_error(_("The quantity entered must be greater than zero.")); + return false; + } + + if (!is_numeric($_POST['std_cost']) || $_POST['std_cost'] < 0) + { + display_error(_("The entered standard cost is negative or invalid.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['adj_items']->update_cart_item($_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['adj_items']->remove_from_cart($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + add_to_order($_SESSION['adj_items'], $_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_st(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_st(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewAdjustment']) || !isset($_SESSION['adj_items'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_order_header($_SESSION['adj_items']); + +start_table("$table_style width=70%", 10); +start_row(); +echo ""; +display_adjustment_items(_("Adjustment Items"), $_SESSION['adj_items']); +adjustment_options_controls(); +echo ""; +end_row(); +end_table(1); + +start_table(); +start_row(); +submit_cells('Update', _("Update")); +if ($_SESSION['adj_items']->count_items() >= 1) +{ + submit_cells('Process', _("Process Adjustment")); +} +end_row(); +end_table(); + +end_form(); +end_page(); + +?> diff --git a/inventory/cost_update.php b/inventory/cost_update.php new file mode 100644 index 00000000..845ec849 --- /dev/null +++ b/inventory/cost_update.php @@ -0,0 +1,117 @@ + 0) + { + display_note(get_gl_view_str(systypes::cost_update(), $update_no, _("View the GL Journal Entries for this Cost Update")), 1, 0); + } + } +} + +//----------------------------------------------------------------------------------------- + +start_form(false, true); + +if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = get_global_stock_item(); + +echo "
" . _("Item:"). " "; +stock_costable_items_list('stock_id', $_POST['stock_id'], false, true); + +echo "

"; +set_global_stock_item($_POST['stock_id']); + +$sql = "SELECT description, units, last_cost, actual_cost, material_cost, labour_cost, + overhead_cost, mb_flag + FROM ".TB_PREF."stock_master + WHERE stock_id='" . $_POST['stock_id'] . "' + GROUP BY description, units, last_cost, actual_cost, material_cost, labour_cost, overhead_cost, mb_flag"; +$result = db_query($sql); +check_db_error("The cost details for the item could not be retrieved", $sql); + +$myrow = db_fetch($result); + +hidden("OldMaterialCost", $myrow["material_cost"]); +hidden("OldLabourCost", $myrow["labour_cost"]); +hidden("OldOverheadCost", $myrow["overhead_cost"]); + +start_table($table_style2); +label_row(_("Last Cost"), number_format2($myrow["last_cost"],user_price_dec()), + "class='tableheader2'", "nowrap align=right"); + +text_row(_("Standard Material Cost Per Unit"), "material_cost", + number_format($myrow["material_cost"],user_price_dec()), "", "", "class='tableheader2'"); + +if ($myrow["mb_flag"]=='M') +{ + text_row(_("Standard Labour Cost Per Unit"), "labour_cost", + number_format($myrow["labour_cost"],user_price_dec()), "", "", "class='tableheader2'"); + text_row(_("Standard Overhead Cost Per Unit"), "overhead_cost", + number_format($myrow["overhead_cost"],user_price_dec()), "", "", "class='tableheader2'"); +} +else +{ + hidden("labour_cost", 0); + hidden("overhead_cost", 0); +} + +end_table(1); +submit_center('UpdateData', _("Update")); + +end_form(); +end_page(); + +?> diff --git a/inventory/includes/db/index.php b/inventory/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/inventory/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/inventory/includes/db/items_adjust_db.inc b/inventory/includes/db/items_adjust_db.inc new file mode 100644 index 00000000..c245bb0f --- /dev/null +++ b/inventory/includes/db/items_adjust_db.inc @@ -0,0 +1,83 @@ +quantity = -$line_item->quantity; + + add_stock_adjustment_item($adj_id, $line_item->stock_id, $location, $date_, $type, $reference, + $line_item->quantity, $line_item->standard_cost, $memo_); + } + + add_comments(systypes::inventory_adjustment(), $adj_id, $date_, $memo_); + + add_forms_for_sys_type(systypes::inventory_adjustment(), $adj_id, $increase, $location); + + references::save_last($reference, systypes::inventory_adjustment()); + + commit_transaction(); + + return $adj_id; +} + +//------------------------------------------------------------------------------------------------------------- + +function void_stock_adjustment($type_no) +{ + void_gl_trans(systypes::inventory_adjustment(), $type_no); + void_stock_move(systypes::inventory_adjustment(), $type_no); +} + +//------------------------------------------------------------------------------------------------------------- + +function get_stock_adjustment_items($trans_no) +{ + $result = get_stock_moves(systypes::inventory_adjustment(), $trans_no); + + if (db_num_rows($result) == 0) + { + return null; + } + + return $result; +} + +//-------------------------------------------------------------------------------------------------- + +function add_stock_adjustment_item($adj_id, $stock_id, $location, $date_, $type, $reference, + $quantity, $standard_cost, $memo_) +{ + $mb_flag = get_mb_flag($stock_id); + + if (is_service($mb_flag)) + { + display_db_error("Cannot do inventory adjustment for Service item : $stock_id", ""); + } + + add_stock_move(systypes::inventory_adjustment(), $stock_id, $adj_id, $location, + $date_, $reference, $quantity, $standard_cost, $type); + + if ($standard_cost > 0) + { + + $stock_gl_codes = get_stock_gl_code($stock_id); + + add_gl_trans_std_cost(systypes::inventory_adjustment(), $adj_id, $date_, + $stock_gl_codes['adjustment_account'], $stock_gl_codes['dimension_id'], $stock_gl_codes['dimension2_id'], $memo_, ($standard_cost * -($quantity))); + + add_gl_trans_std_cost(systypes::inventory_adjustment(), $adj_id, $date_, $stock_gl_codes['inventory_account'], 0, 0, $memo_, ($standard_cost * $quantity)); + } +} + +//------------------------------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/inventory/includes/db/items_category_db.inc b/inventory/includes/db/items_category_db.inc new file mode 100644 index 00000000..5c93e317 --- /dev/null +++ b/inventory/includes/db/items_category_db.inc @@ -0,0 +1,48 @@ + \ No newline at end of file diff --git a/inventory/includes/db/items_db.inc b/inventory/includes/db/items_db.inc new file mode 100644 index 00000000..988d1d18 --- /dev/null +++ b/inventory/includes/db/items_db.inc @@ -0,0 +1,82 @@ + \ No newline at end of file diff --git a/inventory/includes/db/items_locations_db.inc b/inventory/includes/db/items_locations_db.inc new file mode 100644 index 00000000..0cdb1e0c --- /dev/null +++ b/inventory/includes/db/items_locations_db.inc @@ -0,0 +1,76 @@ + \ No newline at end of file diff --git a/inventory/includes/db/items_prices_db.inc b/inventory/includes/db/items_prices_db.inc new file mode 100644 index 00000000..ab3b92cd --- /dev/null +++ b/inventory/includes/db/items_prices_db.inc @@ -0,0 +1,46 @@ + \ No newline at end of file diff --git a/inventory/includes/db/items_trans_db.inc b/inventory/includes/db/items_trans_db.inc new file mode 100644 index 00000000..ce1153ed --- /dev/null +++ b/inventory/includes/db/items_trans_db.inc @@ -0,0 +1,57 @@ + 0) + { + + $update_no = get_next_trans_no(systypes::cost_update()); + $date_ = Today(); + if (!is_date_in_fiscalyear($date_)) + $date_ = end_fiscalyear(); + + $stock_gl_code = get_stock_gl_code($stock_id); + + $new_cost = $material_cost + $labour_cost + $overhead_cost; + + $value_of_change = $qoh * ($new_cost - $last_cost); + + $memo_ = "Cost was " . $last_cost . " changed to " . $new_cost . " x quantity on hand of $qoh"; + add_gl_trans_std_cost(systypes::cost_update(), $update_no, $date_, $stock_gl_code["adjustment_account"], + $stock_gl_code["dimension_id"], $stock_gl_code["dimension2_id"], $memo_, (-$value_of_change)); + + add_gl_trans_std_cost(systypes::cost_update(), $update_no, $date_, $stock_gl_code["inventory_account"], 0, 0, $memo_, + $value_of_change); + } + + commit_transaction(); + + return $update_no; +} + +//------------------------------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/inventory/includes/db/items_transfer_db.inc b/inventory/includes/db/items_transfer_db.inc new file mode 100644 index 00000000..4d4a438b --- /dev/null +++ b/inventory/includes/db/items_transfer_db.inc @@ -0,0 +1,90 @@ +stock_id, $location_from, + $location_to, $date_, $type, $reference, $line_item->quantity); + } + + add_comments(systypes::location_transfer(), $transfer_id, $date_, $memo_); + + add_forms_for_sys_type(systypes::location_transfer(), $transfer_id, $location_from, $location_to); + + references::save_last($reference, systypes::location_transfer()); + + commit_transaction(); + + return $transfer_id; +} + +//------------------------------------------------------------------------------------------------------------- + +// add 2 stock_moves entries for a stock transfer +// $date_ is display date (not sql) +// std_cost is in HOME currency +// it seems the standard_cost field is not used at all + +function add_stock_transfer_item($transfer_id, $stock_id, $location_from, $location_to, + $date_, $type, $reference, $quantity) +{ + add_stock_move(systypes::location_transfer(), $stock_id, $transfer_id, $location_from, + $date_, $reference, -$quantity, 0, $type); + + add_stock_move(systypes::location_transfer(), $stock_id, $transfer_id, $location_to, + $date_, $reference, $quantity, 0, $type); + +} + +//------------------------------------------------------------------------------------------------------------- + +function get_stock_transfer($trans_no) +{ + $result = get_stock_transfer_items($trans_no); + if (db_num_rows($result) < 2) + { + display_db_error("transfer with less than 2 items : $trans_no", ""); + } + + // this function is very bad that it assumes that 1st record and 2nd record contain the + // from and to locations - if get_stock_moves uses a different ordering than trans_no then + // it will bomb + $move1 = db_fetch($result); + $move2 = db_fetch($result); + + // return an array of (From, To) + if ($move1['qty'] < 0) + return array($move1, $move2); + else + return array($move2, $move1); +} + +//------------------------------------------------------------------------------------------------------------- + +function get_stock_transfer_items($trans_no) +{ + $result = get_stock_moves(systypes::location_transfer(), $trans_no); + + if (db_num_rows($result) == 0) + { + return null; + } + + return $result; +} + +//------------------------------------------------------------------------------------------------------------- + +function void_stock_transfer($type_no) +{ + void_stock_move(systypes::location_transfer(), $type_no); +} + +?> \ No newline at end of file diff --git a/inventory/includes/db/movement_types_db.inc b/inventory/includes/db/movement_types_db.inc new file mode 100644 index 00000000..de9626f8 --- /dev/null +++ b/inventory/includes/db/movement_types_db.inc @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/inventory/includes/index.php b/inventory/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/inventory/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/inventory/includes/inventory_db.inc b/inventory/includes/inventory_db.inc new file mode 100644 index 00000000..b48fc54a --- /dev/null +++ b/inventory/includes/inventory_db.inc @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/inventory/includes/item_adjustments_ui.inc b/inventory/includes/item_adjustments_ui.inc new file mode 100644 index 00000000..ce8762f1 --- /dev/null +++ b/inventory/includes/item_adjustments_ui.inc @@ -0,0 +1,185 @@ +line_items as $order_item) + { + if (strcasecmp($order_item->stock_id, $new_item) == 0) + { + $allready_on_order = 1; + display_error(_("For Part :") . $new_item . " " . "This item is already on this order. You can change the quantity ordered of the existing line if necessary."); + } + } + + if ($allready_on_order != 1) + { + $order->add_to_cart ($new_item, $new_item_qty, $standard_cost); + } /* end of if not already on the order */ +} + +//-------------------------------------------------------------------------------- + +function display_order_header(&$order) +{ + global $table_style2; + + start_table("width=70% $table_style2"); // outer table + echo ""; + echo ""; // inner table + + locations_list_row(_("Location:"), 'StockLocation', null); + ref_row(_("Reference:"), 'ref', references::get_next(systypes::inventory_adjustment())); + + echo "
"; // inner table + + echo ""; + + echo ""; // inner table + + date_row(_("Date:"), 'AdjDate'); + + echo "
"; // inner table + + echo ""; + + echo ""; // inner table + movement_types_list_row(_("Detail:"), 'type', null); + + if (!isset($_POST['Increase'])) + $_POST['Increase'] = 1; + yesno_list_row(_("Type:"), 'Increase', $_POST['Increase'], + _("Positive Adjustment"), _("Negative Adjustment")); + + echo "
"; // inner table + + echo ""; + end_table(1); // outer table +} + +//--------------------------------------------------------------------------------- + +function display_adjustment_items($title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($title); + start_table("$table_style width=80%"); + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Unit Cost"), _("Total")); + table_header($th); + $total = 0; + $k = 0; //row colour counter + + foreach ($order->line_items as $stock_item) + { + + $quantity = number_format2($stock_item->quantity,user_qty_dec()); + + $total += ($stock_item->standard_cost * $stock_item->quantity); + + if (!isset($_GET['Edit']) || $_GET['Edit'] != $stock_item->stock_id) + { + alt_table_row_color($k); + + label_cell("$stock_item->stock_id"); + label_cell($stock_item->item_description); + label_cell($quantity, "nowrap align=right"); + label_cell($stock_item->units); + amount_cell($stock_item->standard_cost); + amount_cell($stock_item->standard_cost * $stock_item->quantity); + + edit_link_cell(SID . "Edit=$stock_item->stock_id"); + delete_link_cell(SID . "Delete=$stock_item->stock_id"); + end_row(); + } + else + { + adjustment_edit_item_controls($order, $stock_item->stock_id); + } + } + + if (!isset($_GET['Edit'])) + adjustment_edit_item_controls($order); + + label_row(_("Total"), number_format2($total,user_price_dec()), "colspan=5", "align=right"); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function adjustment_edit_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) and $stock_id!=null) + { + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$stock_id]->stock_id; + if (!isset($_POST['qty']) OR ($_POST['qty']=="")) + $_POST['qty'] = $order->line_items[$stock_id]->quantity; + if (!isset($_POST['std_cost']) OR ($_POST['std_cost']=="")) + $_POST['std_cost'] = $order->line_items[$stock_id]->standard_cost; + + $_POST['units'] = $order->line_items[$stock_id]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$stock_id]->item_description); + } + else + { + echo ""; + stock_costable_items_list('stock_id', $_POST['stock_id'], false, true); + echo ""; + + $item_info = get_item_edit_info($_POST['stock_id']); + + $_POST['qty'] = 0; + $_POST['std_cost'] = $item_info["standard_cost"]; + $_POST['units'] = $item_info["units"]; + } + + text_cells(null, 'qty', $_POST['qty'], 13, 15); + + label_cell($_POST['units']); + text_cells(null, 'std_cost', $_POST['std_cost'], 15, 14); + label_cell(" "); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add Item"), "colspan=2"); + } + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function adjustment_options_controls() +{ + echo "
"; + start_table(); + + textarea_row(_("Memo"), 'memo_', null, 50, 3); + + end_table(1); +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/inventory/includes/stock_transfers_ui.inc b/inventory/includes/stock_transfers_ui.inc new file mode 100644 index 00000000..05b7304f --- /dev/null +++ b/inventory/includes/stock_transfers_ui.inc @@ -0,0 +1,169 @@ +line_items as $order_item) + { + if (strcasecmp($order_item->stock_id, $new_item) == 0) + { + $already_on_order = 1; + display_error(_("For Part :") . $new_item . " " . "This item is already on this order. You can change the quantity ordered of the existing line if necessary."); + } + } + + if ($already_on_order != 1) + { + $order->add_to_cart ($new_item, $new_item_qty, $standard_cost); + } /* end of if not already on the order */ +} + +//-------------------------------------------------------------------------------- + +function display_order_header(&$order) +{ + global $table_style; + + start_table("width=70% $table_style"); + echo ""; // outer table + echo ""; + + locations_list_row(_("From Location:"), 'FromStockLocation', null); + locations_list_row(_("To Location:"), 'ToStockLocation', null); + + echo "
"; + + echo ""; // outer table + + echo ""; + + ref_row(_("Reference:"), 'ref', references::get_next(systypes::location_transfer())); + + date_row(_("Date:"), 'AdjDate'); + + echo "
"; + + echo ""; // outer table + + echo ""; + movement_types_list_row(_("Transfer Type:"), 'type', null); + echo "
"; + + echo ""; + end_table(1); // outer table +} + +//--------------------------------------------------------------------------------- + +function display_transfer_items($title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($title); + start_table("$table_style width=80%"); + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), _("Unit")); + table_header($th); + $subtotal = 0; + $k = 0; //row colour counter + + foreach ($order->line_items as $stock_item) + { + + $quantity = number_format2($stock_item->quantity,user_qty_dec()); + + if (!isset($_GET['Edit']) || $_GET['Edit'] != $stock_item->stock_id) + { + alt_table_row_color($k); + + label_cell("$stock_item->stock_id"); + label_cell($stock_item->item_description); + label_cell($quantity, "nowrap align=right"); + label_cell($stock_item->units); + + edit_link_cell(SID . "Edit=$stock_item->stock_id"); + delete_link_cell(SID . "Delete=$stock_item->stock_id"); + end_row(); + } + else + { + transfer_edit_item_controls($order, $stock_item->stock_id); + } + } + + if (!isset($_GET['Edit'])) + transfer_edit_item_controls($order); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function transfer_edit_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) and $stock_id!=null) + { + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$stock_id]->stock_id; + if (!isset($_POST['qty']) || ($_POST['qty']=="")) + $_POST['qty'] = $order->line_items[$stock_id]->quantity; + + $_POST['units'] = $order->line_items[$stock_id]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$stock_id]->item_description); + } + else + { + echo ""; + stock_costable_items_list('stock_id', $_POST['stock_id'], false, true); + echo ""; + + $item_info = get_item_edit_info($_POST['stock_id']); + + $_POST['qty'] = 0; + $_POST['units'] = $item_info["units"]; + } + + + text_cells(null, 'qty', $_POST['qty'], 13, 15); + label_cell($_POST['units']); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add Item"), "colspan=2"); + } + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function transfer_options_controls() +{ + echo "
"; + start_table(); + + textarea_row(_("Memo"), 'memo_', null, 50, 3); + + end_table(1); +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/inventory/index.php b/inventory/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/inventory/index.php @@ -0,0 +1,3 @@ + diff --git a/inventory/inquiry/index.php b/inventory/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/inventory/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/inventory/inquiry/stock_movements.php b/inventory/inquiry/stock_movements.php new file mode 100644 index 00000000..a1c22e1e --- /dev/null +++ b/inventory/inquiry/stock_movements.php @@ -0,0 +1,177 @@ += '". $after_date . "' + AND tran_date <= '" . $before_date . "' + AND stock_id = '" . $_POST['stock_id'] . "' ORDER BY tran_date,trans_id"; +$result = db_query($sql, "could not query stock moves"); + +check_db_error("The stock movements for the selected criteria could not be retrieved",$sql); + +start_table("$table_style width=70%"); +$th = array(_("Type"), _("#"), _("Reference"), _("Date"), _("Detail"), + _("Quantity In"), _("Quantity Out"), _("Quantity On Hand")); + +table_header($th); + +$sql = "SELECT SUM(qty) FROM ".TB_PREF."stock_moves WHERE stock_id='" . $_POST['stock_id'] . "' + AND loc_code='" . $_POST['StockLocation'] . "' + AND tran_date < '" . $after_date . "'"; +$before_qty = db_query($sql, "The starting quantity on hand could not be calculated"); + +$before_qty_row = db_fetch_row($before_qty); +$after_qty = $before_qty = $before_qty_row[0]; + +if (!isset($before_qty_row[0])) +{ + $after_qty = $before_qty = 0; +} + +start_row("class='inquirybg'"); +label_cell(""._("Quantity on hand before") . " " . $_POST['AfterDate']."", "align=center colspan=7"); +qty_cell($before_qty); +end_row(); + +$j = 1; +$k = 0; //row colour counter + +$total_in = 0; +$total_out = 0; + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + $trandate = sql2date($myrow["tran_date"]); + + $type_name = systypes::name($myrow["type"]); + + if ($myrow["qty"] > 0) + { + $quantity_formatted = number_format2($myrow["qty"],user_qty_dec()); + $total_in += $myrow["qty"]; + } + else + { + $quantity_formatted = number_format2(-$myrow["qty"],user_qty_dec()); + $total_out += -$myrow["qty"]; + } + $after_qty += $myrow["qty"]; + + label_cell($type_name); + + label_cell(get_trans_view_str($myrow["type"], $myrow["trans_no"])); + + label_cell(get_trans_view_str($myrow["type"], $myrow["trans_no"], $myrow["reference"])); + + label_cell($trandate); + + $person = $myrow["person_id"]; + $gl_posting = ""; + + if (($myrow["type"] == 10) || ($myrow["type"] == 11)) + { + $cust_row = get_customer_details_from_trans($myrow["type"], $myrow["trans_no"]); + + if (strlen($cust_row['name']) > 0) + $person = $cust_row['name'] . " (" . $cust_row['br_name'] . ")"; + + } + elseif ($myrow["type"] == 25) + { + // get the supplier name + $sql = "SELECT supp_name FROM ".TB_PREF."suppliers WHERE supplier_id = '" . $myrow["person_id"] . "'"; + $supp_result = db_query($sql,"check failed"); + + $supp_row = db_fetch($supp_result); + + if (strlen($supp_row['supp_name']) > 0) + $person = $supp_row['supp_name']; + } + elseif ($myrow["type"] == systypes::location_transfer() || $myrow["type"] == systypes::inventory_adjustment()) + { + // get the adjustment type + $movement_type = get_movement_type($myrow["person_id"]); + $person = $movement_type["name"]; + } + elseif ($myrow["type"]==systypes::work_order() || $myrow["type"] == 28 || + $myrow["type"] == 29) + { + $person = ""; + } + + label_cell($person); + + label_cell((($myrow["qty"] >= 0) ? $quantity_formatted : ""), "nowrap align=right"); + label_cell((($myrow["qty"] < 0) ? $quantity_formatted : ""), "nowrap align=right"); + label_cell(number_format2($after_qty,user_qty_dec()), "nowrap align=right"); + end_row(); + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +if ($total_in != 0 || $total_out != 0) +{ + start_row("class='inquirybg'"); + label_cell(""._("Quantity on hand after") . " " . $_POST['BeforeDate']."", "align=center colspan=7"); + qty_cell($after_qty); + end_row(); +} + +end_table(1); + +end_page(); + +?> diff --git a/inventory/inquiry/stock_status.php b/inventory/inquiry/stock_status.php new file mode 100644 index 00000000..9b16d753 --- /dev/null +++ b/inventory/inquiry/stock_status.php @@ -0,0 +1,139 @@ + " . _("Item:"). " "; +stock_items_list('stock_id', $_POST['stock_id'], false, true); +echo "
"; + +echo "
"; + +set_global_stock_item($_POST['stock_id']); + +$mb_flag = get_mb_flag($_POST['stock_id']); +$kitset_or_service = false; + +if (is_service($mb_flag)) +{ + display_note(_("This is a service and cannot have a stock holding, only the total quantity on outstanding sales orders is shown.")); + $kitset_or_service = true; +} + +$loc_details = get_loc_details($_POST['stock_id']); + +start_table($table_style); + +if ($kitset_or_service == true) +{ + $th = array(_("Location"), _("Demand")); +} +else +{ + $th = array(_("Location"), _("Quantity On Hand"), _("Re-Order Level"), + _("Demand"), _("Available"), _("On Order")); +} +table_header($th); +$j = 1; +$k = 0; //row colour counter + +while ($myrow = db_fetch($loc_details)) +{ + + alt_table_row_color($k); + + $sql = "SELECT Sum(".TB_PREF."sales_order_details.quantity-".TB_PREF."sales_order_details.qty_invoiced) AS DEM + FROM ".TB_PREF."sales_order_details, ".TB_PREF."sales_orders + WHERE ".TB_PREF."sales_orders.order_no = ".TB_PREF."sales_order_details.order_no + AND ".TB_PREF."sales_orders.from_stk_loc='" . $myrow["loc_code"] . "' + AND ".TB_PREF."sales_order_details.qty_invoiced < ".TB_PREF."sales_order_details.quantity + AND ".TB_PREF."sales_order_details.stk_code='" . $_POST['stock_id'] . "'"; + + $demand_result = db_query($sql,"Could not retreive demand for item"); + + if (db_num_rows($demand_result) == 1) + { + $demand_row = db_fetch_row($demand_result); + $demand_qty = $demand_row[0]; + } + else + { + $demand_qty =0; + } + + + $qoh = get_qoh_on_date($_POST['stock_id'], $myrow["loc_code"]); + + if ($kitset_or_service == false) + { + $sql = "SELECT Sum(".TB_PREF."purch_order_details.quantity_ordered - ".TB_PREF."purch_order_details.quantity_received) AS qoo + FROM ".TB_PREF."purch_order_details INNER JOIN ".TB_PREF."purch_orders ON ".TB_PREF."purch_order_details.order_no=".TB_PREF."purch_orders.order_no + WHERE ".TB_PREF."purch_orders.into_stock_location='" . $myrow["loc_code"] . "' + AND ".TB_PREF."purch_order_details.item_code='" . $_POST['stock_id'] . "'"; + $qoo_result = db_query($sql,"could not receive quantity on order for item"); + + if (db_num_rows($qoo_result) == 1) + { + $qoo_row = db_fetch_row($qoo_result); + $qoo = $qoo_row[0]; + } + else + { + $qoo = 0; + } + + label_cell($myrow["location_name"]); + qty_cell($qoh); + qty_cell($myrow["reorder_level"]); + qty_cell($demand_qty); + qty_cell($qoh - $demand_qty); + qty_cell($qoo); + end_row(); + + } + else + { + /* It must be a service or kitset part */ + label_cell($myrow["location_name"]); + qty_cell($demand_qty); + end_row(); + + } + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +} + +end_table(); + +end_form(); +end_page(); + +?> diff --git a/inventory/manage/image/0/102.jpg b/inventory/manage/image/0/102.jpg new file mode 100644 index 0000000000000000000000000000000000000000..479662ea79efd5d880d04faf4948af4ddf2d2c9c GIT binary patch literal 14949 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 L|37ECi`oAT`M2&0 literal 0 HcmV?d00001 diff --git a/inventory/manage/image/0/104.jpg b/inventory/manage/image/0/104.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13e294962816da28732890f4e9f1649149f38ecb GIT binary patch literal 11055 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 diff --git a/inventory/manage/item_categories.php b/inventory/manage/item_categories.php new file mode 100644 index 00000000..d32ba2ea --- /dev/null +++ b/inventory/manage/item_categories.php @@ -0,0 +1,125 @@ + 0) + { + display_error(_("Cannot delete this item category because items have been created using this item category.")); + + } + else + { + delete_item_category($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//---------------------------------------------------------------------------------- + +$sql = "SELECT * FROM ".TB_PREF."stock_category"; +$result = db_query($sql, "could not get stock categories"); + +start_table("$table_style width=30%"); +$th = array(_("Name"), "", ""); +table_header($th); +$k = 0; //row colour counter + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["description"]); + edit_link_cell(SID."selected_id=$myrow[0]"); + delete_link_cell(SID."selected_id=$myrow[0]&delete=yes"); + end_row(); +} + +end_table(); + +//---------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Item Category")); + +start_form(); + +start_table("class='tablestyle_noborder'"); + +if (isset($selected_id)) +{ + //editing an existing item category + + $myrow = get_item_category($selected_id); + + $_POST['category_id'] = $myrow["category_id"]; + $_POST['description'] = $myrow["description"]; + + hidden('selected_id', $selected_id); + hidden('category_id', $_POST['category_id']); +} + +text_row(_("Category Name:"), 'description', null, 30, 30); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); + +?> diff --git a/inventory/manage/items.php b/inventory/manage/items.php new file mode 100644 index 00000000..78ca9f2b --- /dev/null +++ b/inventory/manage/items.php @@ -0,0 +1,386 @@ + ($max_image_size * 1024)) + { //File Size Check + display_notification(_('The file size is over the maximum allowed. The maximum size allowed in KB is') . ' ' . $max_image_size); + $upload_file ='No'; + } + elseif ( $_FILES['pic']['type'] == "text/plain" ) + { //File type Check + display_notification( _('Only graphics files can be uploaded')); + $upload_file ='No'; + } + elseif (file_exists($filename)) + { + display_notification(_('Attempting to overwrite an existing item image')); + $result = unlink($filename); + if (!$result) + { + display_error(_('The existing image could not be removed')); + $upload_file ='No'; + } + } + + if ($upload_file == 'Yes') + { + $result = move_uploaded_file($_FILES['pic']['tmp_name'], $filename); + $message = ($result)?_('File url') ."$filename" : "Somthing is wrong with uploading a file."; + } + /* EOF Add Image upload for New Item - by Ori */ +} + + +check_db_has_stock_categories(_("There are no item categories defined in the system. At least one item category is required to add a item.")); + +check_db_has_item_tax_types(_("There are no item tax types defined in the system. At least one item tax type is required to add a item.")); + +function clear_data() +{ + unset($_POST['long_description']); + unset($_POST['description']); + unset($_POST['category_id']); + unset($_POST['tax_type_id']); + unset($_POST['units']); + unset($_POST['mb_flag']); + unset($_POST['NewStockID']); + unset($_POST['dimension_id']); + unset($_POST['dimension2_id']); + $_POST['New'] = "1"; +} + +//------------------------------------------------------------------------------------ + +if (isset($_POST['addupdate'])) +{ + + $input_error = 0; + if ($upload_file == 'No') + $input_error = 1; + if (strlen($_POST['description']) == 0) + { + $input_error = 1; + display_error( _('The item name must be entered.')); + } + elseif (strlen($_POST['NewStockID']) == 0) + { + $input_error = 1; + display_error( _('The item code cannot be empty')); + } + elseif (strstr($_POST['NewStockID'], " ") || strstr($_POST['NewStockID'],"'") || + strstr($_POST['NewStockID'], "+") || strstr($_POST['NewStockID'], "\"") || + strstr($_POST['NewStockID'], "&")) + { + $input_error = 1; + display_error( _('The item code cannot contain any of the following characters - & + OR a space OR quotes')); + + } + + if ($input_error != 1) + { + + if (!isset($_POST['New'])) + { /*so its an existing one */ + + update_item($_POST['NewStockID'], $_POST['description'], + $_POST['long_description'], $_POST['category_id'], $_POST['tax_type_id'], + $_POST['sales_account'], $_POST['inventory_account'], $_POST['cogs_account'], + $_POST['adjustment_account'], $_POST['assembly_account'], + $_POST['dimension_id'], $_POST['dimension2_id']); + + } + else + { //it is a NEW part + + add_item($_POST['NewStockID'], $_POST['description'], + $_POST['long_description'], $_POST['category_id'], $_POST['tax_type_id'], + $_POST['units'], $_POST['mb_flag'], $_POST['sales_account'], + $_POST['inventory_account'], $_POST['cogs_account'], + $_POST['adjustment_account'], $_POST['assembly_account'], + $_POST['dimension_id'], $_POST['dimension2_id']); + } + meta_forward($_SERVER['PHP_SELF']); + } +} + +//------------------------------------------------------------------------------------ + +function can_delete($stock_id) +{ + $sql= "SELECT COUNT(*) FROM ".TB_PREF."stock_moves WHERE stock_id='$stock_id'"; + $result = db_query($sql, "could not query stock moves"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_('Cannot delete this item because there are stock movements that refer to this item.')); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."bom WHERE component='$stock_id'"; + $result = db_query($sql, "could not query boms"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_('Cannot delete this item record because there are bills of material that require this part as a component.')); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."sales_order_details WHERE stk_code='$stock_id'"; + $result = db_query($sql, "could not query sales orders"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_('Cannot delete this item record because there are existing sales orders for this part.')); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."purch_order_details WHERE item_code='$stock_id'"; + $result = db_query($sql, "could not query purchase orders"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_('Cannot delete this item because there are existing purchase order items for it.')); + return false; + } + + return true; +} + +//------------------------------------------------------------------------------------ + +if (isset($_POST['delete']) && strlen($_POST['delete']) > 1) +{ + + if (can_delete($_POST['NewStockID'])) { + + $stock_id = $_POST['NewStockID']; + delete_item($stock_id); + $filename = $path_to_root . "/inventory/manage/image/$user_comp/$stock_id.jpg"; + if (file_exists($filename)) + unlink($filename); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//------------------------------------------------------------------------------------ + +start_form(true); + +if (db_has_stock_items()) +{ + start_table("class='tablestyle_noborder'"); + start_row(); + stock_items_list_cells(_("Select an item:"), 'stock_id', null); + submit_cells('SelectStockItem', _("Edit Item")); + end_row(); + end_table(); +} + +hyperlink_params($_SERVER['PHP_SELF'], _("Enter a new item"), "New=1"); +echo "
"; + +start_table("$table_style2 width=40%"); + +table_section_title(_("Item")); + +//------------------------------------------------------------------------------------ + +if (!isset($_POST['NewStockID']) || isset($_POST['New'])) +{ + +/*If the page was called without $_POST['NewStockID'] passed to page then assume a new item is to be entered show a form with a part Code field other wise the form showing the fields with the existing entries against the part will show for editing with only a hidden stock_id field. New is set to flag that the page may have called itself and still be entering a new part, in which case the page needs to know not to go looking up details for an existing part*/ + + hidden('New', 'Yes'); + + text_row(_("Item Code:"), 'NewStockID', null, 21, 20); + + $company_record = get_company_prefs(); + + if (!isset($_POST['inventory_account']) || $_POST['inventory_account'] == "") + $_POST['inventory_account'] = $company_record["default_inventory_act"]; + + if (!isset($_POST['cogs_account']) || $_POST['cogs_account'] == "") + $_POST['cogs_account'] = $company_record["default_cogs_act"]; + + if (!isset($_POST['sales_account']) || $_POST['sales_account'] == "") + $_POST['sales_account'] = $company_record["default_inv_sales_act"]; + + if (!isset($_POST['adjustment_account']) || $_POST['adjustment_account'] == "") + $_POST['adjustment_account'] = $company_record["default_adj_act"]; + + if (!isset($_POST['assembly_account']) || $_POST['assembly_account'] == "") + $_POST['assembly_account'] = $company_record["default_assembly_act"]; + +} +else +{ // Must be modifying an existing item + + if (!isset($_POST['New'])) + { + $myrow = get_item($_POST['NewStockID']); + + $_POST['long_description'] = $myrow["long_description"]; + $_POST['description'] = $myrow["description"]; + $_POST['category_id'] = $myrow["category_id"]; + $_POST['tax_type_id'] = $myrow["tax_type_id"]; + $_POST['units'] = $myrow["units"]; + $_POST['mb_flag'] = $myrow["mb_flag"]; + + $_POST['sales_account'] = $myrow['sales_account']; + $_POST['inventory_account'] = $myrow['inventory_account']; + $_POST['cogs_account'] = $myrow['cogs_account']; + $_POST['adjustment_account'] = $myrow['adjustment_account']; + $_POST['assembly_account'] = $myrow['assembly_account']; + $_POST['dimension_id'] = $myrow['dimension_id']; + $_POST['dimension2_id'] = $myrow['dimension2_id']; + + label_row(_("Item Code:"),$_POST['NewStockID']); + hidden('NewStockID', $_POST['NewStockID']); + } +} + +text_row(_("Name:"), 'description', null, 52, 50); + +textarea_row(_('Description:'), 'long_description', null, 50, 3); + +end_table(); +start_table("$table_style2 width=40%"); +// Add image upload for New Item - by Joe +start_row(); +label_cells(_("Image File (.jpg)") . ":", ""); +// Add Image upload for New Item - by Joe +if (isset($_POST['NewStockID']) && file_exists("$path_to_root/inventory/manage/image/$user_comp/".$_POST['NewStockID'].".jpg")) +{ + $stock_img_link = ""; +} +else +{ + $stock_img_link = "No Image"; +} + +label_cell($stock_img_link, "valign=top align=center rowspan=5"); +end_row(); + +stock_categories_list_row(_("Category:"), 'category_id', null); + +item_tax_types_list_row(_("Item Tax Type:"), 'tax_type_id', null); + +stock_item_types_list_row(_("Item Type:"), 'mb_flag', null, + (!isset($_POST['NewStockID']) || isset($_POST['New']))); + +/* The array stock_units is set up in config.php for user modification +possible units of measure can added or modifying the array definition by editing that file */ + +stock_units_list_row(_('Units of Measure:'), 'units', null, + (!isset($_POST['NewStockID']) || isset($_POST['New']))); +end_table(); +start_table("$table_style2 width=40%"); + +table_section_title(_("GL Accounts")); + +gl_all_accounts_list_row(_("Sales Account:"), 'sales_account', $_POST['sales_account']); + +gl_all_accounts_list_row(_("Inventory Account:"), 'inventory_account', $_POST['inventory_account']); + +if (!is_service($_POST['mb_flag'])) +{ + gl_all_accounts_list_row(_("C.O.G.S. Account:"), 'cogs_account', $_POST['cogs_account']); + gl_all_accounts_list_row(_("Inventory Adjustments Account:"), 'adjustment_account', $_POST['adjustment_account']); +} +else +{ + hidden('cogs_account', $_POST['cogs_account']); + hidden('adjustment_account', $_POST['adjustment_account']); +} + + +if (is_manufactured($_POST['mb_flag'])) + gl_all_accounts_list_row(_("Item Assembly Costs Account:"), 'assembly_account', $_POST['assembly_account']); +else + hidden('assembly_account', $_POST['assembly_account']); +$dim = get_company_pref('use_dimension'); +if ($dim >= 1) +{ + table_section_title(_("Dimensions")); + + dimensions_list_row(_("Dimension")." 1", 'dimension_id', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_row(_("Dimension")." 2", 'dimension2_id', null, true, " ", false, 2); +} +if ($dim < 1) + hidden('dimension_id', 0); +if ($dim < 2) + hidden('dimension2_id', 0); + +end_table(1); + +if (!isset($_POST['NewStockID']) || (isset($_POST['New']) && $_POST['New'] != "")) +{ + submit_center('addupdate', _("Insert New Item")); + +} +else +{ + submit_center_first('addupdate', _("Update Item")); + + submit_center_last('delete', _("Delete This Item")); +} + + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); +?> diff --git a/inventory/manage/locations.php b/inventory/manage/locations.php new file mode 100644 index 00000000..fe90a68c --- /dev/null +++ b/inventory/manage/locations.php @@ -0,0 +1,185 @@ + 5) + { + $input_error = 1; + display_error( _("The location code must be five characters or less long.")); + } + elseif (strlen($_POST['location_name']) == 0) + { + $input_error = 1; + display_error( _("The location name must be entered.")); + } + + if ($input_error != 1) + { + if (isset($selected_id)) + { + + update_item_location($selected_id, $_POST['location_name'], $_POST['delivery_address'], + $_POST['phone'], $_POST['fax'], $_POST['email'], $_POST['contact']); + } + else + { + + /*selected_id is null cos no item selected on first time round so must be adding a record must be submitting new entries in the new Location form */ + + add_item_location($_POST['loc_code'], $_POST['location_name'], $_POST['delivery_address'], + $_POST['phone'], $_POST['fax'], $_POST['email'], $_POST['contact']); + } + + meta_forward($_SERVER['PHP_SELF']); + } +} + +function can_delete($selected_id) +{ + $sql= "SELECT COUNT(*) FROM ".TB_PREF."stock_moves WHERE loc_code='$selected_id'"; + $result = db_query($sql, "could not query stock moves"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this location because item movements have been created using this location.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."workorders WHERE loc_code='$selected_id'"; + $result = db_query($sql, "could not query work orders"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this location because it is used by some work orders records.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."cust_branch WHERE default_location='$selected_id'"; + $result = db_query($sql, "could not query customer branches"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this location because it is used by some branch records as the default location to deliver from.")); + return false; + } + + return true; +} + +//---------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_item_location($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } //end if Delete Location +} + +/* It could still be the second time the page has been run and a record has been selected for modification - selected_id will exist because it was sent with the new call. If its the first time the page has been displayed with no parameters +then none of the above are true and the list of locations will be displayed with +links to delete or edit each. These will call the same page again and allow update/input +or deletion of the records*/ + +$sql = "SELECT * FROM ".TB_PREF."locations"; +$result = db_query($sql, "could not query locations");; + +start_table("$table_style width=30%"); +$th = array(_("Location Code"), _("Location Name"), "", ""); +table_header($th); +$k = 0; //row colour counter +while ($myrow = db_fetch_row($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow[0]); + label_cell($myrow[1]); + edit_link_cell("selected_id=$myrow[0]"); + delete_link_cell("selected_id=$myrow[0]&delete=1"); + end_row(); +} + //END WHILE LIST LOOP + +//end of ifs and buts! + +end_table(); + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Location")); + +start_form(); + +start_table($table_style2); +if (isset($selected_id)) +{ + //editing an existing Location + + $myrow = get_item_location($selected_id); + + $_POST['loc_code'] = $myrow["loc_code"]; + $_POST['location_name'] = $myrow["location_name"]; + $_POST['delivery_address'] = $myrow["delivery_address"]; + $_POST['contact'] = $myrow["contact"]; + $_POST['phone'] = $myrow["phone"]; + $_POST['fax'] = $myrow["fax"]; + $_POST['email'] = $myrow["email"]; + + hidden("selected_id", $selected_id); + hidden("loc_code", $_POST['loc_code']); + label_row(_("Location Code:"), $_POST['loc_code']); +} +else +{ //end of if $selected_id only do the else when a new record is being entered + text_row(_("Location Code:"), 'loc_code', null, 5, 5); +} + +text_row_ex(_("Location Name:"), 'location_name', 50, 50); +text_row_ex(_("Contact for deliveries:"), 'contact', 30, 30); + +textarea_row(_("Address:"), 'delivery_address', null, 35, 5); + +text_row_ex(_("Telephone No:"), 'phone', 30, 30); +text_row_ex(_("Facsimile No:"), 'fax', 30, 30); +text_row_ex(_("Email:"), 'email', 30, 30); + +end_table(1); +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//end if record deleted no point displaying form to add record + + end_page(); + +?> diff --git a/inventory/manage/movement_types.php b/inventory/manage/movement_types.php new file mode 100644 index 00000000..4a2369e7 --- /dev/null +++ b/inventory/manage/movement_types.php @@ -0,0 +1,138 @@ + 0) + { + display_error(_("Cannot delete this inventory movement type because item transactions have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_movement_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_movement_type(); + +start_table("$table_style width=30%"); + +$th = array(_("Description"), "", ""); +table_header($th); +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["name"]); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Inventory Movement Type")); + +start_form(); + +start_table(); + +if (isset($selected_id)) +{ + //editing an existing status code + + $myrow = get_movement_type($selected_id); + + $_POST['name'] = $myrow["name"]; + + hidden('selected_id', $selected_id); +} + +text_row(_("Description:"), 'name', null, 50, 50); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/inventory/prices.php b/inventory/prices.php new file mode 100644 index 00000000..073289c6 --- /dev/null +++ b/inventory/prices.php @@ -0,0 +1,169 @@ +" . _("Item:"). " "; +stock_items_list('stock_id', $_POST['stock_id'], false, true); +echo "
"; + +// if stock sel has changed, clear the form +if ($_POST['stock_id'] != get_global_stock_item()) +{ + clear_data(); +} + +set_global_stock_item($_POST['stock_id']); + +//---------------------------------------------------------------------------------------------------- + +function clear_data() +{ + unset($_POST['PriceID']); + unset($_POST['price']); +} + +//---------------------------------------------------------------------------------------------------- + +if (isset($_POST['updatePrice'])) +{ + + if (!is_numeric($_POST['price']) || $_POST['price'] == "") + { + $input_error = 1; + display_error( _("The price entered must be numeric.")); + } + + if ($input_error != 1) + { + + if (isset($_POST['PriceID'])) + { + //editing an existing price + update_item_price($_POST['PriceID'], $_POST['sales_type_id'], $_POST['curr_abrev'], $_POST['price']); + + $msg = _("This price has been updated."); + } + elseif ($input_error !=1) + { + + add_item_price($_POST['stock_id'], $_POST['sales_type_id'], $_POST['curr_abrev'], $_POST['price']); + + display_note(_("The new price has been added.")); + } + clear_data(); + } + +} + +//------------------------------------------------------------------------------------------------------ + +if (isset($_GET['delete'])) +{ + + //the link to delete a selected record was clicked + delete_item_price($_GET['PriceID']); + echo _("The selected price has been deleted."); + +} + +//--------------------------------------------------------------------------------------------------- + +$mb_flag = get_mb_flag($_POST['stock_id']); + +$prices_list = get_prices($_POST['stock_id']); + +start_table("$table_style width=30%"); + +$th = array(_("Currency"), _("Sales Type"), _("Price"), "", ""); +table_header($th); +$k = 0; //row colour counter + +while ($myrow = db_fetch($prices_list)) +{ + + alt_table_row_color($k); + + label_cell($myrow["curr_abrev"]); + label_cell($myrow["sales_type"]); + amount_cell($myrow["price"]); + edit_link_cell("PriceID=" . $myrow["id"]. "&Edit=1"); + delete_link_cell("PriceID=" . $myrow["id"]. "&delete=yes"); + end_row(); + +} +end_table(); + +//------------------------------------------------------------------------------------------------ + +if (db_num_rows($prices_list) == 0) +{ + display_note(_("There are no prices set up for this part.")); +} + +echo "
"; + +if (isset($_GET['Edit'])) +{ + $myrow = get_stock_price($_GET['PriceID']); + hidden('PriceID', $_GET['PriceID']); + $_POST['curr_abrev'] = $myrow["curr_abrev"]; + $_POST['sales_type_id'] = $myrow["sales_type_id"]; + $_POST['price'] = $myrow["price"]; +} + +start_table($table_style2); + +currencies_list_row(_("Currency:"), 'curr_abrev', null); + +sales_types_list_row(_("Sales Type:"), 'sales_type_id', null); + +text_row(_("Price:"), 'price', null, 10, 10); + +end_table(1); + +submit_center('updatePrice', _("Add/Update Price")); + + +end_form(); +end_page(); +?> diff --git a/inventory/purchasing_data.php b/inventory/purchasing_data.php new file mode 100644 index 00000000..8e2cb59d --- /dev/null +++ b/inventory/purchasing_data.php @@ -0,0 +1,234 @@ +" . _("Item:"). " "; +stock_purchasable_items_list('stock_id', $_POST['stock_id'], false, true); + +echo "
"; + +set_global_stock_item($_POST['stock_id']); + +$mb_flag = get_mb_flag($_POST['stock_id']); + +if ($mb_flag == -1) +{ + display_error(_("Entered item is not defined. Please re-enter.")); +} +else +{ + + $sql = "SELECT ".TB_PREF."purch_data.*,".TB_PREF."suppliers.supp_name,".TB_PREF."suppliers.curr_code + FROM ".TB_PREF."purch_data INNER JOIN ".TB_PREF."suppliers + ON ".TB_PREF."purch_data.supplier_id=".TB_PREF."suppliers.supplier_id + WHERE stock_id = '" . $_POST['stock_id'] . "'"; + + $result = db_query($sql, "The supplier purchasing details for the selected part could not be retrieved"); + + if (db_num_rows($result) == 0) + { + display_note(_("There is no purchasing data set up for the part selected")); + } + else + { + start_table("$table_style width=60%"); + + $th = array(_("Supplier"), _("Price"), _("Currency"), + _("Supplier's Unit"), _("Supplier's Description"), "", ""); + + table_header($th); + + $k = $j = 0; //row colour counter + + while ($myrow = db_fetch($result)) + { + alt_table_row_color($k); + + label_cell($myrow["supp_name"]); + amount_cell($myrow["price"]); + label_cell($myrow["curr_code"]); + label_cell($myrow["suppliers_uom"]); + label_cell($myrow["supplier_description"]); + edit_link_cell("stock_id=" . $_POST['stock_id']. "&supplier_id=" . $myrow["supplier_id"] . "&Edit=1"); + delete_link_cell("stock_id=" . $_POST['stock_id']. "&supplier_id=" . $myrow["supplier_id"] . "&Delete=1"); + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } //end of page full new headings + } //end of while loop + + end_table(); + } +} + +//------------------------------------------------------------------------------------------------ + +if (isset($_GET['Edit'])) +{ + + $sql = "SELECT ".TB_PREF."purch_data.*,".TB_PREF."suppliers.supp_name FROM ".TB_PREF."purch_data + INNER JOIN ".TB_PREF."suppliers ON ".TB_PREF."purch_data.supplier_id=".TB_PREF."suppliers.supplier_id + WHERE ".TB_PREF."purch_data.supplier_id='$supplier_id' + AND ".TB_PREF."purch_data.stock_id='" . $_POST['stock_id'] . "'"; + + $result = db_query($sql, "The supplier purchasing details for the selected supplier and item could not be retrieved"); + + $myrow = db_fetch($result); + + $supp_name = $myrow["supp_name"]; + $_POST['price'] = $myrow["price"]; + $_POST['suppliers_uom'] = $myrow["suppliers_uom"]; + $_POST['supplier_description'] = $myrow["supplier_description"]; + $_POST['conversion_factor'] = $myrow["conversion_factor"]; +} + +echo "
"; +start_table($table_style2); + +if (isset($_GET['Edit'])) +{ + hidden('supplier_id', $supplier_id); + label_row(_("Supplier:"), $supp_name); +} +else +{ + supplier_list_row(_("Supplier:"), 'supplier_id', null, false, true); + $supplier_id = $_POST['supplier_id']; +} +text_row(_("Price:"), 'price', null, 12, 12, "", get_supplier_currency($supplier_id)); +text_row(_("Suppliers Unit of Measure:"), 'suppliers_uom', null, 50, 51); + +if (!isset($_POST['conversion_factor']) || $_POST['conversion_factor'] == "") +{ + $_POST['conversion_factor'] = 1; +} +text_row(_("Conversion Factor (to our UOM):"), 'conversion_factor', $_POST['conversion_factor'], 12, 12); +text_row(_("Supplier's Code or Description:"), 'supplier_description', null, 50, 51); + +end_table(1); + +if (isset($_GET['Edit'])) +{ + submit_center('UpdateRecord', _("Update Purchasing Data")); +} +else +{ + submit_center('AddRecord', _("Add Purchasing Data")); +} + +end_form(); +end_page(); + +?> diff --git a/inventory/reorder_level.php b/inventory/reorder_level.php new file mode 100644 index 00000000..980d04cf --- /dev/null +++ b/inventory/reorder_level.php @@ -0,0 +1,83 @@ +" . _("Item:"). " "; +stock_costable_items_list('stock_id', $_POST['stock_id'], false, true); + +echo "
"; + +stock_item_heading($_POST['stock_id']); + +set_global_stock_item($_POST['stock_id']); + +start_table("$table_style width=30%"); + +$th = array(_("Location"), _("Quantity On Hand"), _("Re-Order Level")); +table_header($th); + +$j = 1; +$k=0; //row colour counter + +$result = get_loc_details($_POST['stock_id']); + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + if (isset($_POST['UpdateData']) && is_numeric($_POST[$myrow["loc_code"]])) + { + + $myrow["reorder_level"] = $_POST[$myrow["loc_code"]]; + set_reorder_level($_POST['stock_id'], $myrow["loc_code"], $_POST[$myrow["loc_code"]]); + } + + $qoh = get_qoh_on_date($_POST['stock_id'], $myrow["loc_code"]); + + label_cell($myrow["location_name"]); + label_cell(number_format2($qoh,user_qty_dec()), "nowrap align='right'"); + text_cells(null, $myrow["loc_code"], $myrow["reorder_level"], 10, 10); + end_row(); + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +} + +end_table(1); + +submit('UpdateData', _("Update")); + +end_form(); +end_page(); + +?> diff --git a/inventory/transfers.php b/inventory/transfers.php new file mode 100644 index 00000000..e9e931fa --- /dev/null +++ b/inventory/transfers.php @@ -0,0 +1,246 @@ +from_loc = $_POST['FromStockLocation']; + $_SESSION['transfer_items']->to_loc = $_POST['ToStockLocation']; + $_SESSION['transfer_items']->tran_date = $_POST['AdjDate']; + $_SESSION['transfer_items']->transfer_type = $_POST['type']; + $_SESSION['transfer_items']->memo_ = $_POST['memo_']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_st() +{ + $_POST['FromStockLocation'] = $_SESSION['transfer_items']->from_loc; + $_POST['ToStockLocation'] = $_SESSION['transfer_items']->to_loc; + $_POST['AdjDate'] = $_SESSION['transfer_items']->tran_date; + $_POST['type'] = $_SESSION['transfer_items']->transfer_type; + $_POST['memo_'] = $_SESSION['transfer_items']->memo_; +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['transfer_items'])) + { + $_SESSION['transfer_items']->clear_items(); + unset ($_SESSION['transfer_items']); + } + + session_register("transfer_items"); + + $_SESSION['transfer_items'] = new items_cart; + $_POST['AdjDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['AdjDate'])) + $_POST['AdjDate'] = end_fiscalyear(); + $_SESSION['transfer_items']->tran_date = $_POST['AdjDate']; +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $input_error = 0; + + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + $input_error = 1; + } + elseif (!is_new_reference($_POST['ref'], systypes::location_transfer())) + { + display_error(_("The entered reference is already in use.")); + $input_error = 1; + } + elseif (!is_date($_POST['AdjDate'])) + { + display_error(_("The entered date for the adjustment is invalid.")); + $input_error = 1; + } + elseif (!is_date_in_fiscalyear($_POST['AdjDate'])) + { + display_error(_("The entered date is not in fiscal year.")); + $input_error = 1; + } + elseif ($_POST['FromStockLocation'] == $_POST['ToStockLocation']) + { + display_error(_("The locations to transfer from and to must be different.")); + $input_error = 1; + } + else + { + $failed_item = $_SESSION['transfer_items']->check_qoh($_POST['FromStockLocation'], $_POST['AdjDate'], true); + if ($failed_item != null) + { + display_error(_("The quantity entered is greater than the available quantity for this item at the source location :") . + " " . $failed_item->stock_id . " - " . $failed_item->item_description); + echo "
"; + $input_error = 1; + } + } + + if ($input_error == 1) + unset($_POST['Process']); +} + +//------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + + $trans_no = add_stock_transfer($_SESSION['transfer_items']->line_items, + $_POST['FromStockLocation'], $_POST['ToStockLocation'], + $_POST['AdjDate'], $_POST['type'], $_POST['ref'], $_POST['memo_']); + + $_SESSION['transfer_items']->clear_items(); + unset($_SESSION['transfer_items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$trans_no"); +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['qty']) || ($_POST['qty'] == 0)) + { + display_error( _("The quantity entered is not a valid number.")); + return false; + } + + if ($_POST['qty'] <= 0) + { + display_error(_("The quantity entered must be a positive number.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + if (!isset($_POST['std_cost'])) + $_POST['std_cost'] = $_SESSION['transfer_items']->line_items[$_POST['stock_id']]->standard_cost; + $_SESSION['transfer_items']->update_cart_item($_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['transfer_items']->remove_from_cart($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + if (!isset($_POST['std_cost'])) + $_POST['std_cost'] = 0; + add_to_order($_SESSION['transfer_items'], $_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_st(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_st(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewTransfer']) || !isset($_SESSION['transfer_items'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_order_header($_SESSION['transfer_items']); + +start_table("$table_style width=70%", 10); +start_row(); +echo ""; +display_transfer_items(_("Items"), $_SESSION['transfer_items']); +transfer_options_controls(); +echo ""; +end_row(); +end_table(1); + +if (!isset($_POST['Process'])) +{ + if ($_SESSION['transfer_items']->count_items() >= 1) + { + submit_center_first('Update', _("Update")); + submit_center_last('Process', _("Process Transfer")); + } + else + submit_center('Update', _("Update")); +} +end_form(); +end_page(); + +?> diff --git a/inventory/view/index.php b/inventory/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/inventory/view/index.php @@ -0,0 +1,3 @@ + diff --git a/inventory/view/view_adjustment.php b/inventory/view/view_adjustment.php new file mode 100644 index 00000000..f5d9cbd6 --- /dev/null +++ b/inventory/view/view_adjustment.php @@ -0,0 +1,66 @@ +"; + start_table("$table_style width=90%"); + + $th = array(_("Item"), _("Description"), _("Quantity"), + _("Units"), _("Unit Cost")); + table_header($th); + } + + alt_table_row_color($k); + + label_cell($adjustment['stock_id']); + label_cell($adjustment['description']); + qty_cell($adjustment['qty']); + label_cell($adjustment['units']); + amount_cell($adjustment['standard_cost']); + end_row(); +} + +end_table(1); + +is_voided_display(systypes::inventory_adjustment(), $trans_no, _("This adjustment has been voided.")); + +end_page(true); +?> \ No newline at end of file diff --git a/inventory/view/view_transfer.php b/inventory/view/view_transfer.php new file mode 100644 index 00000000..66f5a7a4 --- /dev/null +++ b/inventory/view/view_transfer.php @@ -0,0 +1,71 @@ +"; +start_table("$table_style2 width=90%"); + +start_row(); +label_cells(_("Item"), $from_trans['stock_id'] . " - " . $from_trans['description'], "class='tableheader2'"); +label_cells(_("From Location"), $from_trans['location_name'], "class='tableheader2'"); +label_cells(_("To Location"), $to_trans['location_name'], "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Reference"), $from_trans['reference'], "class='tableheader2'"); +$adjustment_type = get_movement_type($from_trans['person_id']) ; +label_cells(_("Adjustment Type"), $adjustment_type['name'], "class='tableheader2'"); +label_cells(_("Date"), sql2date($from_trans['tran_date']), "class='tableheader2'"); +end_row(); + +comments_display_row(systypes::location_transfer(), $trans_no); + +end_table(1); + +echo "
"; +start_table("$table_style width=90%"); + +$th = array(_("Item"), _("Description"), _("Quantity"), _("Units")); +table_header($th); +$transfer_items = get_stock_moves(systypes::location_transfer(), $trans_no); + +while ($item = db_fetch($transfer_items)) +{ + if ($item['loc_code'] == $to_trans['loc_code']) + { + alt_table_row_color($k); + + label_cell($item['stock_id']); + label_cell($item['description']); + qty_cell($item['qty']); + label_cell($item['units']); + end_row();; + } +} + +end_table(1); + +is_voided_display(systypes::location_transfer(), $trans_no, _("This transfer has been voided.")); + +end_page(true); +?> \ No newline at end of file diff --git a/lang/en_US/LC_MESSAGES/en_US.mo b/lang/en_US/LC_MESSAGES/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..0783989a887db5b8e320417c75599a5d53f47582 GIT binary patch literal 596 zcmaKo&rSj{5XSM(iK9p3VGi81Y?nZQibjMrqM$@pBrvgd%@S1*MV2bYsc%zE31ar{&u0z^l!#&YH0Kng(JO$JfN{sD+U)v zE7ul6FO`#OQXJmKq+^gf-z8n{kU@pg8lhD}>kw90l^)WNQV)_le399foU4CvRR}4g z%{ABO){)q7WoO)J!{ACITzWU?Xl0kP%oSQwjiqrGg>Ryig`S@l`&>n3l=jj)iH>a8;kBlT1^^_T9br1oW&la zA(0X~@j)3ho~0{3lA*>#I`Wf_L8K-#Y16#b$$r$V7~J3V;;0LwxE)8Myg$-QBe1hJ zXYk8?v;7)Zui7M*!BakW&MhvuOBo0jv=>~YSP4>>Xkmlz&&%NvawF2A#|iy!pzsO) C_qI9! literal 0 HcmV?d00001 diff --git a/lang/en_US/stylesheet.css b/lang/en_US/stylesheet.css new file mode 100644 index 00000000..fd485a3f --- /dev/null +++ b/lang/en_US/stylesheet.css @@ -0,0 +1,17 @@ +/*--------------------------------------------------\ +| | | stylesheet.css | +|---------------------------------------------------| +| For use with: | +| OpenAccounting | +| http://open-accounting.sourceforge.net/ | +| by KylieTech Consulting | +|---------------------------------------------------| +| Developer: | +| Sherif Omar, Shane Barnaby | +| | +|---------------------------------------------------| +| Use this file to override the default styles for | +| this language. | +| | +| | +\--------------------------------------------------*/ \ No newline at end of file diff --git a/lang/index.php b/lang/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/lang/index.php @@ -0,0 +1,3 @@ + diff --git a/lang/installed_languages.inc b/lang/installed_languages.inc new file mode 100644 index 00000000..2d8a8015 --- /dev/null +++ b/lang/installed_languages.inc @@ -0,0 +1,17 @@ + ') +-- 'code' should match the name of the directory for the language under \lang +-- 'name' is the name that will be displayed in the language selection list (in Users and Display Setup) +-- 'rtl' only needs to be set for right-to-left languages like Arabic and Hebrew + +*/ + + +$installed_languages = array ( + 0 => array ('code' => 'en_GB', 'name' => 'English', 'encoding' => 'iso-8859-1'), + array ('code' => 'en_US', 'name' => 'English (US)', 'encoding' => 'iso-8859-1') + ); +?> \ No newline at end of file diff --git a/lang/new_language_template/LC_MESSAGES/empty.po b/lang/new_language_template/LC_MESSAGES/empty.po new file mode 100644 index 00000000..2c79e9d7 --- /dev/null +++ b/lang/new_language_template/LC_MESSAGES/empty.po @@ -0,0 +1,8374 @@ +msgid "" +msgstr "" +"Project-Id-Version: FrontAccounting\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2007-04-04 10:12+0100\n" +"Last-Translator: Joe Hunt Consulting \n" +"Language-Team: Translators\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED KINGDOM\n" +"X-Poedit-SourceCharset: iso-8859-1\n" +"X-Poedit-Basepath: c:\\Apache2\\htdocs\\account\n" +"X-Poedit-SearchPath-0: c:\\Apache2\\htdocs\\account\n" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "ea." +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "m" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "kgg" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "tons" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "l" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "lbs" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "dozen" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "pack" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:59 +msgid "hrs" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:118 +msgid "Inquiries" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:119 +msgid "Accountant" +msgstr "" + +# c:\Apache2\htdocs\account/config.php:120 +msgid "System Administrator" +msgstr "" + +# c:\Apache2\htdocs\account/boxaccounting.php:63 +# c:\Apache2\htdocs\account/boxaccounting.php:64 +msgid "Main Menu" +msgstr "" + +# c:\Apache2\htdocs\account/boxaccounting.php:65 +# c:\Apache2\htdocs\account/access/logout.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:55 +msgid "Logout" +msgstr "" + +# c:\Apache2\htdocs\account/access/login.php:38 +msgid "Version" +msgstr "" + +# c:\Apache2\htdocs\account/access/logout.php:21 +msgid "Thank you for using" +msgstr "" + +# c:\Apache2\htdocs\account/access/logout.php:33 +msgid "Click here to Login Again." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:14 +msgid "Backup and Restore Database - Error" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:15 +msgid "Backup paths have not been set correctly." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:15 +msgid "Please contact System Administrator." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:23 +msgid "Backup and Restore Database" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:46 +msgid "This extension can not be be viewed: " +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:53 +msgid "Are you sure you want to delete the backup file - " +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:63 +msgid "Please select a file to upload." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:74 +msgid "Backup scripts" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:83 +# c:\Apache2\htdocs\account/admin/backups.php:95 +msgid "Create Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:83 +msgid "Compression" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:84 +msgid "Restore Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:85 +msgid "View Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:86 +msgid "Delete Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:87 +msgid "Download Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:88 +msgid "Upload Backup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:95 +# c:\Apache2\htdocs\account/reporting/reports_main.php:24 +# c:\Apache2\htdocs\account/reporting/reports_main.php:31 +# c:\Apache2\htdocs\account/reporting/reports_main.php:35 +# c:\Apache2\htdocs\account/reporting/reports_main.php:41 +# c:\Apache2\htdocs\account/reporting/reports_main.php:48 +# c:\Apache2\htdocs\account/reporting/reports_main.php:55 +# c:\Apache2\htdocs\account/reporting/reports_main.php:61 +# c:\Apache2\htdocs\account/reporting/reports_main.php:68 +# c:\Apache2\htdocs\account/reporting/reports_main.php:76 +# c:\Apache2\htdocs\account/reporting/reports_main.php:83 +# c:\Apache2\htdocs\account/reporting/reports_main.php:89 +# c:\Apache2\htdocs\account/reporting/reports_main.php:93 +# c:\Apache2\htdocs\account/reporting/reports_main.php:100 +# c:\Apache2\htdocs\account/reporting/reports_main.php:107 +# c:\Apache2\htdocs\account/reporting/reports_main.php:111 +# c:\Apache2\htdocs\account/reporting/reports_main.php:116 +# c:\Apache2\htdocs\account/reporting/reports_main.php:122 +# c:\Apache2\htdocs\account/reporting/reports_main.php:130 +# c:\Apache2\htdocs\account/reporting/reports_main.php:133 +# c:\Apache2\htdocs\account/reporting/reports_main.php:145 +# c:\Apache2\htdocs\account/reporting/reports_main.php:150 +# c:\Apache2\htdocs\account/reporting/reports_main.php:162 +# c:\Apache2\htdocs\account/reporting/reports_main.php:167 +# c:\Apache2\htdocs\account/reporting/reports_main.php:173 +# c:\Apache2\htdocs\account/reporting/reports_main.php:180 +# c:\Apache2\htdocs\account/reporting/reports_main.php:187 +# c:\Apache2\htdocs\account/reporting/reports_main.php:197 +# c:\Apache2\htdocs\account/reporting/reports_main.php:201 +# c:\Apache2\htdocs\account/reporting/reports_main.php:206 +# c:\Apache2\htdocs\account/reporting/reports_main.php:212 +# c:\Apache2\htdocs\account/reporting/reports_main.php:218 +# c:\Apache2\htdocs\account/reporting/reports_main.php:227 +# c:\Apache2\htdocs\account/reporting/reports_main.php:230 +# c:\Apache2\htdocs\account/reporting/reports_main.php:234 +# c:\Apache2\htdocs\account/reporting/reports_main.php:239 +# c:\Apache2\htdocs\account/reporting/reports_main.php:244 +# c:\Apache2\htdocs\account/reporting/reports_main.php:250 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:63 +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:238 +msgid "Comments" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:144 +msgid "File successfully deleted." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:145 +# c:\Apache2\htdocs\account/admin/backups.php:162 +msgid "Filename" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:152 +msgid "Backup is being downloaded..." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:161 +msgid "Backup successfully generated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:176 +msgid "Restore backup completed." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:186 +msgid "Uploaded file has been restored." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:190 +msgid "Backup was not uploaded into the system." +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:235 +# c:\Apache2\htdocs\account/admin/create_coy.php:163 +# c:\Apache2\htdocs\account/admin/fiscalyears.php:138 +# c:\Apache2\htdocs\account/admin/inst_lang.php:255 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:144 +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:108 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:133 +# c:\Apache2\htdocs\account/reporting/rep104.php:82 +# c:\Apache2\htdocs\account/reporting/rep501.php:99 +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:114 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:156 +# c:\Apache2\htdocs\account/taxes/tax_types.php:109 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1467 +msgid "No" +msgstr "" + +# c:\Apache2\htdocs\account/admin/backups.php:267 +msgid "cannot find backup directory" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:9 +# c:\Apache2\htdocs\account/applications/setup.php:10 +msgid "Company Setup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:24 +msgid "The company name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:34 +msgid "Company setup has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:69 +msgid "Name (to appear on reports):" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:70 +msgid "Official Company Number:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:71 +msgid "Tax Authority Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:73 +msgid "Tax Periods:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:73 +msgid "Months." +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:74 +msgid "Tax Last Period:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:74 +msgid "Months back." +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:76 +msgid "Home Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:77 +msgid "Fiscal Year:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:79 +# c:\Apache2\htdocs\account/admin/shipping_companies.php:154 +# c:\Apache2\htdocs\account/inventory/manage/locations.php:170 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:185 +# c:\Apache2\htdocs\account/sales/manage/customers.php:274 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:364 +msgid "Address:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:81 +msgid "Telephone Number:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:82 +msgid "Facsimile Number:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:83 +# c:\Apache2\htdocs\account/admin/users.php:195 +msgid "Email Address:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:84 +msgid "Company Logo:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:85 +msgid "Domicile:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:87 +msgid "Use Dimensions:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:91 +msgid "Custom Field Name" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:91 +msgid "Custom Field Value" +msgstr "" + +# c:\Apache2\htdocs\account/admin/company_preferences.php:110 +# c:\Apache2\htdocs\account/admin/display_prefs.php:89 +# c:\Apache2\htdocs\account/admin/forms_setup.php:45 +# c:\Apache2\htdocs\account/admin/gl_setup.php:191 +# c:\Apache2\htdocs\account/gl/gl_deposit.php:245 +# c:\Apache2\htdocs\account/gl/gl_payment.php:246 +# c:\Apache2\htdocs\account/inventory/adjustments.php:226 +# c:\Apache2\htdocs\account/inventory/cost_update.php:112 +# c:\Apache2\htdocs\account/inventory/reorder_level.php:78 +# c:\Apache2\htdocs\account/inventory/transfers.php:237 +# c:\Apache2\htdocs\account/inventory/transfers.php:241 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:192 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:291 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:244 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:269 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:385 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:479 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:236 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:223 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:171 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:222 +# c:\Apache2\htdocs\account/includes/ui/ui_input.inc:47 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:158 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:142 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:125 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:320 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:212 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:327 +msgid "Update" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:12 +msgid "Create/Update Company" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:67 +# c:\Apache2\htdocs\account/admin/create_coy.php:120 +msgid "Cannot open the configuration file - " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:69 +# c:\Apache2\htdocs\account/admin/create_coy.php:122 +msgid "Cannot write to the configuration file - " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:71 +# c:\Apache2\htdocs\account/admin/create_coy.php:124 +msgid "The configuration file " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:71 +# c:\Apache2\htdocs\account/admin/create_coy.php:124 +# c:\Apache2\htdocs\account/admin/inst_lang.php:136 +msgid " is not writable. Change its permissions so it is, then re-run the operation." +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:79 +msgid "Error creating Database: " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:79 +msgid ", Please create it manually" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:91 +msgid "Error uploading Database Script, please upload it manually" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:128 +msgid "Error removing Database: " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:128 +msgid ", please remove it manuallly" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:144 +msgid "Are you sure you want to delete company no. " +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:151 +# c:\Apache2\htdocs\account/admin/create_coy.php:232 +msgid "Company" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:151 +msgid "Database Host" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:151 +# c:\Apache2\htdocs\account/admin/create_coy.php:234 +msgid "Database User" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:152 +# c:\Apache2\htdocs\account/admin/create_coy.php:236 +msgid "Database Name" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:152 +# c:\Apache2\htdocs\account/admin/create_coy.php:238 +# c:\Apache2\htdocs\account/admin/create_coy.php:240 +msgid "Table Pref" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:152 +# c:\Apache2\htdocs\account/admin/create_coy.php:241 +msgid "Default" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:161 +# c:\Apache2\htdocs\account/admin/fiscalyears.php:142 +# c:\Apache2\htdocs\account/admin/inst_lang.php:253 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:144 +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:112 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:133 +# c:\Apache2\htdocs\account/reporting/rep104.php:84 +# c:\Apache2\htdocs\account/reporting/rep501.php:97 +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:118 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:154 +# c:\Apache2\htdocs\account/taxes/tax_types.php:107 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1459 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:159 +msgid "Yes" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:176 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:147 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:142 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:143 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:165 +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:149 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:187 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:295 +msgid "Edit" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:178 +# c:\Apache2\htdocs\account/admin/inst_lang.php:259 +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:154 +msgid "Delete" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:183 +msgid "The marked company is the current company which cannot be deleted." +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:233 +msgid "Host" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:151 +# c:\Apache2\htdocs\account/admin/create_coy.php:235 +msgid "Database Password" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:238 +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:167 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:221 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:214 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:219 +msgid "None" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:244 +msgid "Database Script" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:254 +msgid "New script Admin Password" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:249 +msgid "Choose from Database scripts in SQL folder. No Datase is created without a script." +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:250 +# c:\Apache2\htdocs\account/admin/inst_lang.php:312 +# c:\Apache2\htdocs\account/includes/ui/ui_input.inc:45 +msgid "Save" +msgstr "" + +# c:\Apache2\htdocs\account/admin/create_coy.php:278 +msgid "Create a new company" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:13 +msgid "Display Setup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:32 +msgid "Display settings have been updated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:38 +msgid "Decimal Places" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:40 +msgid "Prices/Amounts:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:41 +msgid "Quantities:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:42 +msgid "Exchange Rates:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:43 +msgid "Percentages:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:45 +msgid "Dateformat and Separators" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:47 +msgid "Dateformat:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:49 +msgid "Date Separator:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:54 +msgid "Thousand Separator:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:59 +msgid "Decimal Separator:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:64 +# c:\Apache2\htdocs\account/applications/setup.php:21 +# c:\Apache2\htdocs\account/includes/types.inc:137 +msgid "Miscellaneous" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:66 +msgid "Show GL Information:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:68 +msgid "Show Item Codes:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:70 +# c:\Apache2\htdocs\account/includes/page/footer.inc:29 +msgid "Theme:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:75 +msgid "Page Size:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:80 +# c:\Apache2\htdocs\account/admin/inst_lang.php:236 +# c:\Apache2\htdocs\account/admin/inst_lang.php:302 +msgid "Language" +msgstr "" + +# c:\Apache2\htdocs\account/admin/display_prefs.php:85 +# c:\Apache2\htdocs\account/admin/users.php:199 +msgid "Language:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:19 +msgid "Fiscal Years" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:36 +msgid "Invalid BEGIN date in fiscal year." +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:41 +msgid "Invalid END date in fiscal year." +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:46 +msgid "BEGIN date bigger than END date." +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:87 +msgid "Cannot delete this fiscal year because items have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:121 +msgid "Fiscal Year Begin" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:121 +msgid "Fiscal Year End" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:121 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:99 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:89 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:168 +msgid "Closed" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:154 +msgid "The marked fiscal year is the current fiscal year which cannot be deleted." +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:176 +# c:\Apache2\htdocs\account/admin/fiscalyears.php:181 +msgid "Fiscal Year Begin:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:177 +# c:\Apache2\htdocs\account/admin/fiscalyears.php:182 +msgid "Fiscal Year End:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:185 +msgid "Is Closed:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/fiscalyears.php:215 +msgid "Enter a New Fiscal Year" +msgstr "" + +# c:\Apache2\htdocs\account/admin/forms_setup.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:14 +msgid "Forms Setup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/forms_setup.php:27 +msgid "Forms settings have been updated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/forms_setup.php:35 +msgid "Form" +msgstr "" + +# c:\Apache2\htdocs\account/admin/forms_setup.php:35 +msgid "Next Reference" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:18 +msgid "System and General GL Setup" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:21 +msgid "The delivery over-receive allowance must be between 0 and 100." +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:28 +msgid "The invoice over-charge allowance must be between 0 and 100." +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:35 +msgid "The past due days interval allowance must be between 0 and 100." +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:65 +msgid "The general GL setup has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:113 +msgid "General GL" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:115 +msgid "Retained Earning Clearing Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:116 +msgid "Payroll Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:117 +msgid "Past Due Days Interval:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:117 +# c:\Apache2\htdocs\account/admin/gl_setup.php:179 +# c:\Apache2\htdocs\account/admin/gl_setup.php:185 +# c:\Apache2\htdocs\account/admin/payment_terms.php:160 +msgid "days" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:121 +msgid "Customers and Sales" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:123 +msgid "Default Credit Limit:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:125 +msgid "Sales Exchange Variances Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:127 +msgid "Shipping Charged Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:131 +msgid "Customers and Sales Defaults" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:133 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:303 +msgid "Accounts Receivable Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:135 +# c:\Apache2\htdocs\account/admin/gl_setup.php:165 +# c:\Apache2\htdocs\account/inventory/manage/items.php:332 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:299 +msgid "Sales Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:137 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:301 +msgid "Sales Discount Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:139 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:305 +msgid "Prompt Payment Discount Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:143 +msgid "Suppliers and Purchasing" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:145 +msgid "Delivery Over-Receive Allowance:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:147 +msgid "Invoice Over-Charge Allowance:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:149 +msgid "Purchases Exchange Variances Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:151 +msgid "Goods Received Clearing Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:153 +msgid "Suppliers and Purchasing Defaults" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:155 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:206 +msgid "Accounts Payable Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:157 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:210 +msgid "Purchase Discount Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:161 +msgid "Inventory Defaults" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:163 +msgid "Allow Negative Inventory:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:167 +# c:\Apache2\htdocs\account/inventory/manage/items.php:334 +msgid "Inventory Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:169 +# c:\Apache2\htdocs\account/inventory/manage/items.php:338 +msgid "C.O.G.S. Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:171 +# c:\Apache2\htdocs\account/inventory/manage/items.php:339 +msgid "Inventory Adjustments Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:173 +# c:\Apache2\htdocs\account/inventory/manage/items.php:349 +msgid "Item Assembly Costs Account:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:177 +msgid "Manufacturing Defaults" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:179 +msgid "Default Work Order Required By After:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:183 +msgid "Dimension Defaults" +msgstr "" + +# c:\Apache2\htdocs\account/admin/gl_setup.php:185 +msgid "Default Dimension Required By After:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:30 +msgid "Install/Update Languages" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:119 +msgid "Cannot open the languages file - " +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:126 +msgid "Cannot write to the language file - " +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:136 +msgid "The language file " +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:230 +msgid "Are you sure you want to delete language no. " +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:236 +# c:\Apache2\htdocs\account/admin/inst_lang.php:303 +# c:\Apache2\htdocs\account/admin/shipping_companies.php:104 +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:229 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:101 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:114 +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:77 +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:97 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/reporting/rep709.php:171 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:169 +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:87 +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:103 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:199 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:201 +msgid "Name" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:236 +# c:\Apache2\htdocs\account/admin/inst_lang.php:304 +msgid "Encoding" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:236 +# c:\Apache2\htdocs\account/admin/inst_lang.php:306 +msgid "Right To Left" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:264 +msgid "The marked language is the current language which cannot be deleted." +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:308 +msgid "Language File" +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:311 +msgid "Select your language MO file from your local harddisk." +msgstr "" + +# c:\Apache2\htdocs\account/admin/inst_lang.php:341 +msgid "Create a new language" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:22 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:17 +msgid "Payment Terms" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:33 +msgid "The number of days or the day in the following month must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:38 +msgid "The Terms description must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:43 +msgid "When the check box to indicate a day in the following month is the due date, the due date cannot be a day after the 30th. A number between 1 and 30 is expected." +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:48 +msgid "When the check box is not checked to indicate that the term expects a number of days after which accounts are due, the number entered should be less than 500 days." +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:109 +msgid "Cannot delete this payment term, because customer accounts have been created referring to this term." +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:118 +msgid "Cannot delete this payment term, because supplier accounts have been created referring to this term" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:139 +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:94 +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:91 +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:46 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:48 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:91 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:49 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:110 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:141 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:204 +# c:\Apache2\htdocs\account/reporting/rep104.php:88 +# c:\Apache2\htdocs\account/reporting/rep105.php:101 +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +# c:\Apache2\htdocs\account/reporting/rep303.php:124 +# c:\Apache2\htdocs\account/reporting/rep401.php:60 +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:89 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:143 +# c:\Apache2\htdocs\account/taxes/tax_types.php:98 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:21 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:302 +msgid "Description" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:139 +msgid "Following Month On" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:139 +msgid "Due After (Days)" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:147 +# c:\Apache2\htdocs\account/admin/payment_terms.php:156 +msgid "N/A" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:177 +msgid "New Payment Term" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:201 +msgid "Terms Description:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:203 +msgid "Due After A Given No. Of Days:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/payment_terms.php:213 +msgid "Days (Or Day In Following Month):" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:23 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:346 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:65 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:79 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:8 +msgid "Shipping Company" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:26 +msgid "The shipping company name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:74 +msgid "Cannot delete this shipping company because sales orders have been created using this shipper." +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:86 +msgid "Cannot delete this shipping company because invoices have been created using this shipping company." +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:104 +msgid "Contact Person" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:104 +msgid "Phone Number" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:104 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:21 +msgid "Address" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:125 +msgid "New Shipping Company" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:148 +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:165 +# c:\Apache2\htdocs\account/inventory/manage/items.php:293 +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:135 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:45 +msgid "Name:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:150 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:270 +msgid "Contact Person:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/shipping_companies.php:152 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:272 +msgid "Phone Number:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:7 +msgid "Users" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:27 +msgid "A new user has been added." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:32 +msgid "The selected user has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:37 +msgid "User has been deleted." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:47 +msgid "The user login entered must be at least 4 characters long." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:55 +msgid "The password entered must be at least 4 characters long." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:61 +msgid "The password cannot contain the user login." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:115 +# c:\Apache2\htdocs\account/admin/users.php:118 +msgid "User login" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:115 +# c:\Apache2\htdocs\account/admin/users.php:118 +# c:\Apache2\htdocs\account/admin/users.php:191 +msgid "Full Name" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:115 +# c:\Apache2\htdocs\account/admin/users.php:118 +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:87 +msgid "Phone" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:116 +# c:\Apache2\htdocs\account/admin/users.php:119 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:170 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:61 +msgid "E-mail" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:116 +# c:\Apache2\htdocs\account/admin/users.php:119 +msgid "Last Visit" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:116 +# c:\Apache2\htdocs\account/admin/users.php:119 +msgid "Access Level" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:151 +msgid "New User" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:173 +msgid "User login:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:178 +msgid "User Login:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:182 +msgid "Password:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:188 +msgid "Enter a new password to change, leave empty to keep current." +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:193 +msgid "Telephone No.:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/users.php:197 +msgid "Access Level:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:8 +# c:\Apache2\htdocs\account/applications/setup.php:27 +msgid "View or Print Transactions" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:25 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:148 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:329 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:336 +# c:\Apache2\htdocs\account/sales/customer_payments.php:199 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:35 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:85 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:57 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:149 +msgid "Type:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:27 +msgid "from #:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:29 +msgid "to #:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:31 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:52 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:45 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:34 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:33 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:45 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:41 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:39 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:40 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:49 +msgid "Search" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:45 +msgid "The starting transaction number is expected to be numeric and greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:51 +msgid "The ending transaction number is expected to be numeric and greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:90 +msgid "There are no transactions for the given parameters." +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:96 +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:101 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:58 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:93 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:96 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:99 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:57 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:88 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:195 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:60 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:63 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:105 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:108 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:98 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:101 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:158 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:162 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:97 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:122 +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:71 +# c:\Apache2\htdocs\account/reporting/rep203.php:76 +# c:\Apache2\htdocs\account/reporting/rep704.php:63 +# c:\Apache2\htdocs\account/reporting/rep704.php:66 +# c:\Apache2\htdocs\account/reporting/rep704.php:69 +# c:\Apache2\htdocs\account/reporting/rep709.php:171 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:187 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:62 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:65 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:70 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:101 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:23 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:149 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:192 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:228 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:268 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:272 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:323 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:45 +msgid "#" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:96 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:101 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:58 +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:76 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:66 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:64 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:57 +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:34 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:35 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:88 +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:32 +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:33 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:60 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:63 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:105 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:108 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:98 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:101 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:124 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:158 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:162 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:97 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:32 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:38 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:61 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:257 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:322 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:62 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:65 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:72 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:36 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:23 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:149 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:192 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:228 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:268 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:272 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:323 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:28 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:43 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:223 +msgid "Reference" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:96 +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:98 +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:109 +msgid "View" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:96 +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:98 +msgid "Print" +msgstr "" + +# c:\Apache2\htdocs\account/admin/view_print_transaction.php:110 +msgid "View GL" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:7 +# c:\Apache2\htdocs\account/applications/setup.php:26 +msgid "Void a Transaction" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:25 +msgid "Transaction Type:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:27 +msgid "Transaction #:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:29 +msgid "Voiding Date:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:31 +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:239 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:78 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:155 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:381 +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:82 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:409 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:100 +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:119 +# c:\Apache2\htdocs\account/sales/customer_payments.php:203 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:303 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:157 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:146 +msgid "Memo:" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:36 +msgid "Void Transaction" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:40 +msgid "Are you sure you want to void this transaction ? This action cannot be undone." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:41 +msgid "Proceed" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:42 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:224 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:172 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:223 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:159 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:143 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:126 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:321 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:213 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:328 +msgid "Cancel" +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:54 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:96 +# c:\Apache2\htdocs\account/gl/gl_journal.php:86 +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:31 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:76 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:154 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:151 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:49 +msgid "The entered date is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:59 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:101 +# c:\Apache2\htdocs\account/gl/gl_deposit.php:118 +# c:\Apache2\htdocs\account/gl/gl_journal.php:91 +# c:\Apache2\htdocs\account/gl/gl_payment.php:119 +# c:\Apache2\htdocs\account/inventory/adjustments.php:106 +# c:\Apache2\htdocs\account/inventory/transfers.php:106 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:81 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:133 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:57 +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:95 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:95 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:156 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:123 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:54 +# c:\Apache2\htdocs\account/sales/customer_payments.php:55 +msgid "The entered date is not in fiscal year." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:65 +msgid "The transaction number is expected to be numeric and greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:82 +msgid "The selected transaction has already been voided." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:94 +msgid "Selected transaction has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/admin/void_transaction.php:100 +msgid "The entered transaction does not exist or cannot be voided." +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:7 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:277 +# c:\Apache2\htdocs\account/includes/page/header.inc:42 +msgid "Sales" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:9 +# c:\Apache2\htdocs\account/applications/dimensions.php:12 +# c:\Apache2\htdocs\account/applications/generalledger.php:9 +# c:\Apache2\htdocs\account/applications/inventory.php:9 +# c:\Apache2\htdocs\account/applications/manufacturing.php:9 +# c:\Apache2\htdocs\account/applications/suppliers.php:9 +msgid "Transactions" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:10 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:29 +msgid "Sales Order Entry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:11 +msgid "Select a Sales Order to Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:12 +msgid "Customer Payments" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:14 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:25 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:35 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1851 +msgid "Sales Invoices" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:15 +msgid "Customer Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:16 +msgid "Allocate Customer Payments or Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:18 +# c:\Apache2\htdocs\account/applications/dimensions.php:16 +# c:\Apache2\htdocs\account/applications/generalledger.php:15 +# c:\Apache2\htdocs\account/applications/inventory.php:13 +# c:\Apache2\htdocs\account/applications/manufacturing.php:13 +# c:\Apache2\htdocs\account/applications/suppliers.php:18 +msgid "Inquiries and Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:19 +msgid "Sales Order Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:20 +msgid "Customer Transaction Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:22 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:13 +msgid "Customer Allocation Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:24 +msgid "Customer and Sales Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:26 +# c:\Apache2\htdocs\account/applications/generalledger.php:24 +# c:\Apache2\htdocs\account/applications/inventory.php:18 +# c:\Apache2\htdocs\account/applications/manufacturing.php:19 +# c:\Apache2\htdocs\account/applications/suppliers.php:26 +msgid "Maintenance" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:27 +msgid "Add and Manage Customers" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:28 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:7 +msgid "Customer Branches" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:29 +# c:\Apache2\htdocs\account/reporting/reports_main.php:38 +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:7 +msgid "Sales Types" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:30 +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:7 +msgid "Sales Persons" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:31 +# c:\Apache2\htdocs\account/reporting/rep103.php:135 +# c:\Apache2\htdocs\account/reporting/reports_main.php:34 +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:8 +msgid "Sales Areas" +msgstr "" + +# c:\Apache2\htdocs\account/applications/customers.php:32 +msgid "Credit Status Setup" +msgstr "" + +# c:\Apache2\htdocs\account/applications/dimensions.php:8 +# c:\Apache2\htdocs\account/inventory/manage/items.php:355 +# c:\Apache2\htdocs\account/reporting/reports_main.php:123 +# c:\Apache2\htdocs\account/reporting/reports_main.php:126 +# c:\Apache2\htdocs\account/reporting/reports_main.php:131 +# c:\Apache2\htdocs\account/includes/page/header.inc:46 +msgid "Dimensions" +msgstr "" + +# c:\Apache2\htdocs\account/applications/dimensions.php:13 +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:8 +msgid "Dimension Entry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/dimensions.php:14 +msgid "Outstanding Dimensions" +msgstr "" + +# c:\Apache2\htdocs\account/applications/dimensions.php:17 +msgid "Dimension Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/dimensions.php:19 +msgid "Dimension Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:47 +msgid "Banking and General Ledger" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:10 +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:57 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1853 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1866 +msgid "Payments" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:11 +msgid "Deposits" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:12 +msgid "Bank Account Transfers" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:13 +# c:\Apache2\htdocs\account/gl/gl_journal.php:21 +# c:\Apache2\htdocs\account/includes/types.inc:6 +msgid "Journal Entry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:16 +msgid "Bank Account Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:17 +msgid "GL Account Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:19 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:8 +# c:\Apache2\htdocs\account/reporting/rep708.php:89 +# c:\Apache2\htdocs\account/reporting/reports_main.php:181 +# c:\Apache2\htdocs\account/reporting/reports_main.php:213 +# c:\Apache2\htdocs\account/reporting/reports_main.php:240 +msgid "Trial Balance" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:21 +msgid "Banking Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:22 +msgid "General Ledger Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:25 +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:7 +msgid "Bank Accounts" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:26 +msgid "Payment, Deposit and Transfer Types" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:28 +# c:\Apache2\htdocs\account/gl/manage/currencies.php:7 +msgid "Currencies" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:29 +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:7 +msgid "Exchange Rates" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:31 +# c:\Apache2\htdocs\account/inventory/manage/items.php:330 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:297 +msgid "GL Accounts" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:32 +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:7 +msgid "GL Account Groups" +msgstr "" + +# c:\Apache2\htdocs\account/applications/generalledger.php:33 +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:7 +msgid "GL Account Classes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:44 +msgid "Items and Inventory" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:10 +# c:\Apache2\htdocs\account/inventory/transfers.php:17 +msgid "Inventory Location Transfers" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:11 +msgid "Inventory Adjustments" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:14 +msgid "Inventory Item Movements" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:15 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:9 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:11 +msgid "Inventory Item Status" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:16 +msgid "Inventory Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:19 +# c:\Apache2\htdocs\account/inventory/transfers.php:227 +# c:\Apache2\htdocs\account/inventory/manage/items.php:7 +msgid "Items" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:20 +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:7 +msgid "Item Categories" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:21 +# c:\Apache2\htdocs\account/inventory/manage/locations.php:7 +msgid "Inventory Locations" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:22 +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:7 +msgid "Inventory Movement Types" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:23 +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:8 +msgid "Item Tax Types" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:25 +# c:\Apache2\htdocs\account/inventory/reorder_level.php:7 +msgid "Reorder Levels" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:27 +msgid "Pricing and Costs" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:28 +msgid "Sales Pricing" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:29 +msgid "Purchasing Pricing" +msgstr "" + +# c:\Apache2\htdocs\account/applications/inventory.php:30 +msgid "Standard Costs" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:45 +msgid "Manufacturing" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:10 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:8 +msgid "Work Order Entry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:11 +msgid "Outstanding Work Orders" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:15 +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:7 +msgid "Inventory Item Where Used Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:16 +msgid "Work Order Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:17 +msgid "Manufactoring Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:20 +msgid "Bills Of Material" +msgstr "" + +# c:\Apache2\htdocs\account/applications/manufacturing.php:21 +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:7 +msgid "Work Centres" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:48 +msgid "Setup" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:11 +msgid "User Accounts Setup" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:15 +msgid "Taxes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:16 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:8 +msgid "Tax Groups" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:25 +msgid "Maintanance" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:28 +msgid "Backup and Restore" +msgstr "" + +# c:\Apache2\htdocs\account/applications/setup.php:29 +msgid "Create/Update Companies" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:7 +# c:\Apache2\htdocs\account/includes/page/header.inc:43 +msgid "Purchases" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:10 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:25 +msgid "Purchase Order Entry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:11 +msgid "Outstanding Purchase Orders Maintenance" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:12 +msgid "Payments to Suppliers" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:14 +msgid "Supplier Invoices" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:15 +msgid "Supplier Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:16 +msgid "Allocate Supplier Payments or Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:19 +msgid "Purchase Orders Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:20 +msgid "Supplier Transaction Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:22 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:11 +msgid "Supplier Allocation Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:24 +msgid "Supplier and Purchasing Reports" +msgstr "" + +# c:\Apache2\htdocs\account/applications/suppliers.php:27 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:7 +msgid "Suppliers" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:35 +msgid "The dimension has been entered." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:46 +msgid "The dimension has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:56 +msgid "The dimension has been deleted." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:66 +msgid "The dimension has been closed. There can be no more changes to it." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:76 +msgid "Enter a new dimension" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:78 +msgid "Select an existing dimension" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:97 +msgid "The dimension reference must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:103 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:124 +# c:\Apache2\htdocs\account/gl/gl_deposit.php:106 +# c:\Apache2\htdocs\account/gl/gl_journal.php:101 +# c:\Apache2\htdocs\account/gl/gl_payment.php:109 +# c:\Apache2\htdocs\account/inventory/adjustments.php:95 +# c:\Apache2\htdocs\account/inventory/transfers.php:96 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:58 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:109 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:68 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:271 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:166 +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:78 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:78 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:167 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:113 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:66 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:209 +# c:\Apache2\htdocs\account/sales/customer_payments.php:67 +msgid "The entered reference is already in use." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:110 +msgid "The dimension name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:116 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:128 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:198 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:170 +msgid "The date entered is in an invalid format." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:122 +msgid "The required by date entered is in an invalid format." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:164 +msgid "This dimension cannot be deleted because it has already been processed." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:199 +msgid "The dimension sent is not valid." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:206 +msgid "This dimension is closed and cannot be edited." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:220 +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:226 +msgid "Dimension Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:233 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:39 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:101 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:58 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:93 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:96 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:99 +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:89 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:57 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:88 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:124 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:158 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:162 +# c:\Apache2\htdocs\account/reporting/rep102.php:147 +# c:\Apache2\htdocs\account/reporting/rep202.php:156 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/reporting/rep702.php:46 +# c:\Apache2\htdocs\account/reporting/rep704.php:63 +# c:\Apache2\htdocs\account/reporting/rep704.php:66 +# c:\Apache2\htdocs\account/reporting/rep704.php:69 +# c:\Apache2\htdocs\account/reporting/rep709.php:178 +# c:\Apache2\htdocs\account/reporting/reports_main.php:149 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:23 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:463 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:268 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:272 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:323 +msgid "Type" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:235 +# c:\Apache2\htdocs\account/reporting/reports_main.php:43 +# c:\Apache2\htdocs\account/reporting/reports_main.php:147 +# c:\Apache2\htdocs\account/reporting/reports_main.php:156 +# c:\Apache2\htdocs\account/reporting/reports_main.php:169 +# c:\Apache2\htdocs\account/reporting/reports_main.php:175 +# c:\Apache2\htdocs\account/reporting/reports_main.php:182 +# c:\Apache2\htdocs\account/reporting/reports_main.php:192 +# c:\Apache2\htdocs\account/reporting/reports_main.php:203 +# c:\Apache2\htdocs\account/reporting/reports_main.php:208 +# c:\Apache2\htdocs\account/reporting/reports_main.php:214 +# c:\Apache2\htdocs\account/reporting/reports_main.php:223 +# c:\Apache2\htdocs\account/reporting/reports_main.php:232 +# c:\Apache2\htdocs\account/reporting/reports_main.php:236 +# c:\Apache2\htdocs\account/reporting/reports_main.php:241 +# c:\Apache2\htdocs\account/reporting/reports_main.php:247 +msgid "Start Date" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:237 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:364 +msgid "Date Required By" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:249 +msgid "Close This Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/dimension_entry.php:250 +msgid "Delete This Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:17 +msgid "Search Outstanding Dimensionss" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:22 +msgid "Search Dimensions" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:37 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:76 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:35 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:143 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:328 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:334 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:98 +# c:\Apache2\htdocs\account/sales/customer_payments.php:201 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:87 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:18 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:87 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:38 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:46 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:144 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:75 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:77 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:87 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:92 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:48 +msgid "Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:40 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:29 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:25 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:34 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:38 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:36 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:32 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:40 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:16 +msgid "From:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:41 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:30 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:26 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:35 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:39 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:37 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:33 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:16 +msgid "To:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:43 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:39 +msgid "Only Overdue:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:47 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:41 +msgid "Only Open:" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:98 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:101 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:58 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:93 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:96 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:99 +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:74 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:59 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:57 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:27 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:57 +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:35 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:38 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:89 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:363 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:369 +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:34 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:195 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:60 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:63 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:125 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:159 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:163 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:122 +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:71 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/reporting/rep704.php:63 +# c:\Apache2\htdocs\account/reporting/rep704.php:66 +# c:\Apache2\htdocs\account/reporting/rep704.php:69 +# c:\Apache2\htdocs\account/reporting/rep709.php:171 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:363 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:187 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:62 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:65 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:60 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:70 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:101 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:24 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:463 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:149 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:192 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:228 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:269 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:273 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:324 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:87 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:237 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:5 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:45 +msgid "Date" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:99 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:102 +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:35 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:195 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:125 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:159 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:163 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:37 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:43 +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:71 +# c:\Apache2\htdocs\account/reporting/rep203.php:76 +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:369 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:187 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:84 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:89 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:12 +msgid "Due Date" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:99 +# c:\Apache2\htdocs\account/dimensions/inquiry/search_dimensions.php:102 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:59 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:94 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:97 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:100 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:77 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:126 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:129 +# c:\Apache2\htdocs\account/reporting/rep203.php:77 +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +# c:\Apache2\htdocs\account/reporting/rep701.php:36 +# c:\Apache2\htdocs\account/reporting/rep704.php:64 +# c:\Apache2\htdocs\account/reporting/rep704.php:67 +# c:\Apache2\htdocs\account/reporting/rep704.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:55 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:123 +msgid "Balance" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:8 +msgid "View Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:29 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:261 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:317 +msgid "The work order number sent is not valid." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/view/view_dimension.php:53 +msgid "This dimension is closed." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:17 +msgid "Transfer between Bank Accounts" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:19 +# c:\Apache2\htdocs\account/gl/gl_deposit.php:23 +# c:\Apache2\htdocs\account/gl/gl_payment.php:25 +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:19 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:28 +# c:\Apache2\htdocs\account/sales/customer_payments.php:24 +msgid "There are no bank accounts defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:20 +msgid "There are no bank transfer types defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:29 +msgid "Transfer has been entered" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:31 +msgid "View the GL Journal Entries for this Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:33 +msgid "Enter Another Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:51 +msgid "From Account:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:53 +msgid "To Account:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:55 +msgid "Transfer Date:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:61 +# c:\Apache2\htdocs\account/gl/bank_transfer.php:67 +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:117 +# c:\Apache2\htdocs\account/sales/customer_payments.php:177 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:409 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:427 +msgid "Amount:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:74 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:55 +msgid "Transfer Type:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:85 +msgid "Enter Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:107 +msgid "The entered amount is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:112 +msgid "The entered amount must be a positive number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:118 +# c:\Apache2\htdocs\account/gl/gl_deposit.php:101 +# c:\Apache2\htdocs\account/gl/gl_journal.php:96 +# c:\Apache2\htdocs\account/gl/gl_payment.php:104 +# c:\Apache2\htdocs\account/inventory/adjustments.php:89 +# c:\Apache2\htdocs\account/inventory/transfers.php:91 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:52 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:103 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:62 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:160 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:161 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:108 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:60 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:203 +# c:\Apache2\htdocs\account/sales/customer_payments.php:61 +msgid "You must enter a reference." +msgstr "" + +# c:\Apache2\htdocs\account/gl/bank_transfer.php:130 +msgid "The source and destination bank accouts cannot be the same." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:19 +msgid "Bank Account Deposit Entry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:25 +# c:\Apache2\htdocs\account/gl/gl_payment.php:27 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:30 +# c:\Apache2\htdocs\account/sales/customer_payments.php:26 +msgid "There are no bank payment types defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:34 +msgid "Deposit has been entered" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:36 +msgid "View the GL Postings for this Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:38 +msgid "Enter Another Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:112 +msgid "The entered date for the deposit is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:152 +# c:\Apache2\htdocs\account/gl/gl_payment.php:151 +msgid "The amount entered is not a valid number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:158 +# c:\Apache2\htdocs\account/gl/gl_payment.php:157 +msgid "The amount entered must be a postitive number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:164 +# c:\Apache2\htdocs\account/gl/gl_payment.php:163 +msgid "The source and destination accouts cannot be the same." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:170 +msgid "You cannot make a deposit from a bank account. Please use the transfer funds facility for this." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:237 +msgid "Deposit Items" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_deposit.php:247 +msgid "Process Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:30 +msgid "Journal entry has been entered" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:32 +msgid "View this Journal Entry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:34 +msgid "Enter Another Journal Entry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:127 +# c:\Apache2\htdocs\account/gl/gl_journal.php:133 +msgid "Dimension is closed." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:139 +msgid "You cannot enter both a debit amount and a credit amount." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:146 +msgid "You must enter either a debit amount or a credit amount." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:155 +msgid "The debit amount entered is not a valid number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:161 +msgid "The debit amount entered cannot be zero or negative." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:171 +msgid "The credit amount entered is not a valid number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:177 +msgid "The credit amount entered cannot be zero or negative." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:184 +msgid "You cannot make a journal entry for a bank account. Please use one of the banking functions for bank transactions." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:263 +msgid "Rows" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:274 +msgid "Process Journal Entry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_journal.php:278 +msgid "The journal must balance (debits equal to credits) before it can be processed." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:21 +msgid "Bank Account Payment Entry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:36 +msgid "Payment has been entered" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:38 +msgid "View the GL Postings for this Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:40 +msgid "Enter Another Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:114 +msgid "The entered date for the payment is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:169 +msgid "You cannot make a payment to a bank account. Please use the transfer funds facility for this." +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:238 +msgid "Payment Items" +msgstr "" + +# c:\Apache2\htdocs\account/gl/gl_payment.php:248 +msgid "Process Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:17 +msgid "Bank Statement" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:27 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:46 +msgid "Account:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:32 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:50 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:29 +msgid "Show" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:59 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:94 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:97 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:100 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:79 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:81 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:83 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:57 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:60 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:63 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:126 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:129 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:160 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:164 +# c:\Apache2\htdocs\account/reporting/rep702.php:40 +# c:\Apache2\htdocs\account/reporting/rep704.php:64 +# c:\Apache2\htdocs\account/reporting/rep704.php:67 +# c:\Apache2\htdocs\account/reporting/rep704.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:62 +# c:\Apache2\htdocs\account/reporting/rep708.php:63 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:123 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:162 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:165 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:24 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:48 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:51 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:54 +msgid "Debit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:59 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:94 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:97 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:100 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:80 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:82 +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:84 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:57 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:60 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:63 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:126 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:129 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:160 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:164 +# c:\Apache2\htdocs\account/reporting/rep702.php:40 +# c:\Apache2\htdocs\account/reporting/rep704.php:64 +# c:\Apache2\htdocs\account/reporting/rep704.php:67 +# c:\Apache2\htdocs\account/reporting/rep704.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:62 +# c:\Apache2\htdocs\account/reporting/rep708.php:63 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:123 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:162 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:165 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:24 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:48 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:51 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:54 +msgid "Credit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:59 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:94 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:97 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:100 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:27 +# c:\Apache2\htdocs\account/reporting/rep704.php:64 +# c:\Apache2\htdocs\account/reporting/rep704.php:66 +# c:\Apache2\htdocs\account/reporting/rep704.php:69 +msgid "Person/Item" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:67 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:105 +# c:\Apache2\htdocs\account/reporting/rep704.php:118 +msgid "Opening Balance" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/bank_inquiry.php:106 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:146 +# c:\Apache2\htdocs\account/reporting/rep704.php:155 +msgid "Ending Balance" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:18 +msgid "General Ledger Account Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:48 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:27 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:26 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:32 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:42 +msgid "from:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:49 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:28 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:27 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:33 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:43 +msgid "to:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:55 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:57 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:93 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:96 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:56 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:59 +# c:\Apache2\htdocs\account/inventory/manage/items.php:357 +# c:\Apache2\htdocs\account/inventory/manage/items.php:359 +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:110 +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:112 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:215 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:217 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:219 +# c:\Apache2\htdocs\account/reporting/rep501.php:80 +# c:\Apache2\htdocs\account/reporting/rep704.php:63 +# c:\Apache2\htdocs\account/reporting/rep704.php:66 +# c:\Apache2\htdocs\account/reporting/rep704.php:77 +# c:\Apache2\htdocs\account/reporting/rep704.php:79 +# c:\Apache2\htdocs\account/reporting/rep704.php:87 +# c:\Apache2\htdocs\account/reporting/rep705.php:133 +# c:\Apache2\htdocs\account/reporting/rep705.php:135 +# c:\Apache2\htdocs\account/reporting/rep705.php:145 +# c:\Apache2\htdocs\account/reporting/rep706.php:64 +# c:\Apache2\htdocs\account/reporting/rep706.php:66 +# c:\Apache2\htdocs\account/reporting/rep706.php:73 +# c:\Apache2\htdocs\account/reporting/rep707.php:78 +# c:\Apache2\htdocs\account/reporting/rep707.php:80 +# c:\Apache2\htdocs\account/reporting/rep707.php:87 +# c:\Apache2\htdocs\account/reporting/rep708.php:71 +# c:\Apache2\htdocs\account/reporting/rep708.php:73 +# c:\Apache2\htdocs\account/reporting/rep708.php:80 +# c:\Apache2\htdocs\account/reporting/reports_main.php:132 +# c:\Apache2\htdocs\account/reporting/reports_main.php:160 +# c:\Apache2\htdocs\account/reporting/reports_main.php:161 +# c:\Apache2\htdocs\account/reporting/reports_main.php:165 +# c:\Apache2\htdocs\account/reporting/reports_main.php:166 +# c:\Apache2\htdocs\account/reporting/reports_main.php:171 +# c:\Apache2\htdocs\account/reporting/reports_main.php:172 +# c:\Apache2\htdocs\account/reporting/reports_main.php:178 +# c:\Apache2\htdocs\account/reporting/reports_main.php:179 +# c:\Apache2\htdocs\account/reporting/reports_main.php:185 +# c:\Apache2\htdocs\account/reporting/reports_main.php:186 +# c:\Apache2\htdocs\account/reporting/reports_main.php:196 +# c:\Apache2\htdocs\account/reporting/reports_main.php:200 +# c:\Apache2\htdocs\account/reporting/reports_main.php:205 +# c:\Apache2\htdocs\account/reporting/reports_main.php:211 +# c:\Apache2\htdocs\account/reporting/reports_main.php:217 +# c:\Apache2\htdocs\account/sales/manage/customers.php:299 +# c:\Apache2\htdocs\account/sales/manage/customers.php:301 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:111 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:113 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:47 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:48 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:50 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:109 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:112 +# c:\Apache2\htdocs\account/includes/types.inc:25 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:199 +msgid "Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:84 +msgid "No general ledger transactions have been created for this account on the selected dates." +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:94 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:97 +# c:\Apache2\htdocs\account/gl/inquiry/gl_account_inquiry.php:100 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:89 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:88 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:57 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:60 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:63 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:375 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:475 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:111 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:114 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:117 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:241 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:48 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:51 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:54 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:187 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:113 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:116 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:238 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:177 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:161 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:199 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:201 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:249 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:380 +msgid "Memo" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:27 +msgid "No zero values" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:73 +# c:\Apache2\htdocs\account/reporting/rep701.php:36 +# c:\Apache2\htdocs\account/reporting/rep705.php:122 +# c:\Apache2\htdocs\account/reporting/rep706.php:55 +# c:\Apache2\htdocs\account/reporting/rep707.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:62 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:199 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:201 +msgid "Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:74 +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:88 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:56 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:59 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:62 +# c:\Apache2\htdocs\account/reporting/rep701.php:36 +# c:\Apache2\htdocs\account/reporting/rep702.php:39 +# c:\Apache2\htdocs\account/reporting/rep705.php:122 +# c:\Apache2\htdocs\account/reporting/rep706.php:55 +# c:\Apache2\htdocs\account/reporting/rep707.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:62 +msgid "Account Name" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:75 +# c:\Apache2\htdocs\account/reporting/rep708.php:55 +msgid "Brought Forward" +msgstr "" + +# c:\Apache2\htdocs\account/gl/inquiry/gl_trial_balance.php:76 +# c:\Apache2\htdocs\account/reporting/rep708.php:55 +msgid "This Period" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:31 +msgid "The bank account name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:69 +msgid "Cannot delete this bank account because transactions have been created using this account." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:88 +msgid "GL Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:88 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:23 +msgid "Bank" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:89 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:124 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:463 +msgid "Number" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:89 +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:60 +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:69 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:57 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:55 +# c:\Apache2\htdocs\account/inventory/prices.php:117 +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:144 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:61 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:106 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:109 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:99 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:102 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:125 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:64 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:159 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:38 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:45 +# c:\Apache2\htdocs\account/reporting/rep101.php:79 +# c:\Apache2\htdocs\account/reporting/rep102.php:146 +# c:\Apache2\htdocs\account/reporting/rep102.php:150 +# c:\Apache2\htdocs\account/reporting/rep201.php:80 +# c:\Apache2\htdocs\account/reporting/rep202.php:155 +# c:\Apache2\htdocs\account/reporting/rep203.php:85 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:250 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:315 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:63 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:66 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:162 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:126 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:61 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:73 +msgid "Currency" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:89 +msgid "Bank Address" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:114 +msgid "New Bank Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:138 +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:142 +msgid "Bank Account GL Code:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:145 +msgid "Account Type:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:147 +msgid "Bank Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:148 +msgid "Bank Account Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:149 +msgid "Bank Account Number:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:153 +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:157 +msgid "Bank Account Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_accounts.php:160 +msgid "Bank Address:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:8 +msgid "Bank Transaction Types" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:35 +msgid "The bank transaction type name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:68 +msgid "Cannot delete this bank transaction type because bank transactions have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:113 +msgid "New Bank Transaction Type" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/bank_trans_types.php:130 +# c:\Apache2\htdocs\account/inventory/manage/items.php:295 +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:126 +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:136 +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:136 +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:163 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:202 +# c:\Apache2\htdocs\account/taxes/tax_types.php:149 +msgid "Description:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:30 +msgid "The currency abbreviation must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:35 +msgid "The currency name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:40 +msgid "The currency symbol must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:45 +msgid "The hundredths name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:91 +msgid "Cannot delete this currency, because customer accounts have been created referring to this currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:100 +msgid "Cannot delete this currency, because supplier accounts have been created referring to this currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:109 +msgid "Cannot delete this currency, because the company preferences uses this currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:119 +msgid "Cannot delete this currency, because thre are bank accounts that use this currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:151 +msgid "Abbreviation" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:151 +msgid "Symbol" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:151 +msgid "Currency Name" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:152 +msgid "Hundredths name" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:152 +msgid "Country" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:182 +msgid "The marked currency is the home currency which cannot be deleted." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:207 +# c:\Apache2\htdocs\account/gl/manage/currencies.php:211 +msgid "Currency Abbreviation:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:214 +msgid "Currency Symbol:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:215 +msgid "Currency Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:216 +msgid "Hundredths Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:217 +msgid "Country:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/currencies.php:249 +msgid "Enter a New Currency" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:36 +msgid "The exchange rate must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:41 +msgid "The exchange rate cannot be zero or a negative number." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:96 +msgid "Date to Use From" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:96 +msgid "Exchange Rate" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:144 +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:148 +msgid "Date to Use From:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:150 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:284 +msgid "Exchange Rate:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:150 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:285 +msgid "Get" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:156 +msgid "Exchange rates are entered against the company currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:195 +msgid "Select a currency :" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:210 +msgid "The selected currency is the company currency." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:211 +msgid "The company currency is the base currency so exchange rates cannot be set for it." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/exchange_rates.php:218 +msgid "Enter a New Exchange Rate" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:7 +# c:\Apache2\htdocs\account/reporting/rep701.php:42 +# c:\Apache2\htdocs\account/reporting/reports_main.php:143 +msgid "Chart of Accounts" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:13 +msgid "There are no account groups defined. Please define at least one account group before entering accounts." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:43 +msgid "The account code must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:48 +msgid "The account name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:53 +msgid "The account code must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:78 +msgid "Cannot delete this account because transactions have been created using this account." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:104 +msgid "Cannot delete this account because it is used as one of the company default GL accounts." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:114 +msgid "Cannot delete this account because it is used by a bank account." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:128 +msgid "Cannot delete this account because it is used by one or more Items." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:138 +msgid "Cannot delete this account because it is used by one or more Taxes." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:152 +msgid "Cannot delete this account because it is used by one or more Customer Branches." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:165 +msgid "Cannot delete this account because it is used by one or more suppliers." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:191 +msgid "Select an Account:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:194 +msgid "Edit Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:198 +msgid "New Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:217 +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:221 +msgid "Account Code:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:224 +msgid "Account Code 2:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:226 +msgid "Account Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:228 +msgid "Account Group:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:230 +msgid "Tax Type:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:230 +msgid "No Tax" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:236 +msgid "Add Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:240 +msgid "Update Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_accounts.php:241 +msgid "Delete account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:30 +msgid "The account class name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:72 +msgid "Cannot delete this account class because GL account types have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:97 +msgid "Class ID" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:97 +msgid "Class Name" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:97 +# c:\Apache2\htdocs\account/reporting/rep706.php:82 +# c:\Apache2\htdocs\account/reporting/reports_main.php:168 +# c:\Apache2\htdocs\account/reporting/reports_main.php:202 +# c:\Apache2\htdocs\account/reporting/reports_main.php:231 +msgid "Balance Sheet" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:126 +msgid "New Account Class" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:142 +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:148 +msgid "Class ID:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:151 +msgid "Class Name:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_classes.php:153 +msgid "Balance Sheet:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:31 +msgid "The account group name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:37 +msgid "You cannot set an account group to be a subgroup of itself." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:79 +msgid "Cannot delete this account group because GL accounts have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:89 +msgid "Cannot delete this account group because GL account groups have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:114 +msgid "Subgroup Of" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:114 +msgid "Class Type" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:146 +msgid "New Account Group" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:167 +msgid "Subgroup Of:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/manage/gl_account_types.php:169 +msgid "Class Type:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:8 +msgid "View Bank Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:58 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:53 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:45 +msgid "From Bank Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:61 +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:71 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:58 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:89 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:56 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:88 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:195 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:51 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:60 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:187 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:31 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:111 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:114 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:117 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:113 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:116 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:393 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:228 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:199 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:201 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:67 +msgid "Amount" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:67 +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:55 +msgid "To Bank Account" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:75 +msgid "Transfer Type" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/bank_transfer_view.php:82 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:68 +msgid "This transfer has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:8 +msgid "View Bank Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:39 +msgid "GL Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:62 +# c:\Apache2\htdocs\account/reporting/reports_main.php:50 +# c:\Apache2\htdocs\account/reporting/reports_main.php:63 +# c:\Apache2\htdocs\account/reporting/reports_main.php:95 +msgid "From" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:63 +msgid "Deposit Type" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:72 +msgid "This deposit has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:78 +msgid "There are no items for this deposit." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:83 +msgid "Items for this Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:85 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:83 +msgid "Item Amounts are Shown in :" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:88 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:87 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:56 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:59 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:62 +# c:\Apache2\htdocs\account/reporting/rep701.php:36 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:113 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:116 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:47 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:50 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:53 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:109 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:112 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:115 +msgid "Account Code" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:88 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:87 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:110 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:113 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:116 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:47 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:50 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:53 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:109 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:112 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:115 +msgid "Account Description" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_deposit_view.php:111 +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:110 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:50 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:143 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:61 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:64 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:122 +# c:\Apache2\htdocs\account/reporting/rep101.php:148 +# c:\Apache2\htdocs\account/reporting/rep201.php:149 +# c:\Apache2\htdocs\account/reporting/rep203.php:77 +# c:\Apache2\htdocs\account/reporting/rep203.php:139 +# c:\Apache2\htdocs\account/reporting/rep204.php:98 +# c:\Apache2\htdocs\account/reporting/rep204.php:126 +# c:\Apache2\htdocs\account/reporting/rep301.php:111 +# c:\Apache2\htdocs\account/reporting/rep301.php:145 +# c:\Apache2\htdocs\account/reporting/rep705.php:206 +# c:\Apache2\htdocs\account/reporting/rep705.php:216 +# c:\Apache2\htdocs\account/reporting/rep705.php:271 +# c:\Apache2\htdocs\account/reporting/rep705.php:281 +# c:\Apache2\htdocs\account/reporting/rep706.php:125 +# c:\Apache2\htdocs\account/reporting/rep706.php:136 +# c:\Apache2\htdocs\account/reporting/rep706.php:197 +# c:\Apache2\htdocs\account/reporting/rep706.php:217 +# c:\Apache2\htdocs\account/reporting/rep707.php:157 +# c:\Apache2\htdocs\account/reporting/rep707.php:168 +# c:\Apache2\htdocs\account/reporting/rep707.php:228 +# c:\Apache2\htdocs\account/reporting/rep707.php:241 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:284 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:379 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:63 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:66 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:82 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:100 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:70 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:101 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:141 +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:50 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:149 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:98 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:149 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:75 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:111 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:170 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:246 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:340 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:37 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:40 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:104 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:110 +msgid "Total" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:8 +msgid "View Bank Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:37 +msgid "GL Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:60 +msgid "Pay To" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:61 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:52 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:35 +msgid "Payment Type" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:70 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:67 +msgid "This payment has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:76 +msgid "There are no items for this payment." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_payment_view.php:81 +msgid "Items for this Payment" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:7 +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:26 +msgid "General Ledger Transaction Details" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:17 +msgid "The script must be called with a valid transaction type and transaction number to review the general ledger postings for." +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:47 +msgid "No general ledger transactions have been created for" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:47 +msgid "number" +msgstr "" + +# c:\Apache2\htdocs\account/gl/view/gl_trans_view.php:95 +msgid "This transaction has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:17 +msgid "Item Adjustments Note" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:21 +msgid "There are no inventory items defined in the system which can be adjusted (Purchased or Manufactured)." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:23 +# c:\Apache2\htdocs\account/inventory/transfers.php:24 +msgid "There are no inventory movement types defined in the system. Please define at least one inventory adjustment type." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:32 +msgid "Items adjustment has been processed" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:33 +msgid "View this adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:35 +msgid "View the GL Postings for this Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:37 +msgid "Enter Another Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:101 +# c:\Apache2\htdocs\account/inventory/transfers.php:101 +msgid "The entered date for the adjustment is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:112 +msgid "The adjustment cannot be processed because an adjustment item would cause a negative inventory balance :" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:139 +# c:\Apache2\htdocs\account/inventory/transfers.php:151 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:64 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:110 +msgid "The quantity entered is not a valid number." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:145 +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:70 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:116 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:129 +msgid "The quantity entered must be greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:151 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:122 +msgid "The entered standard cost is negative or invalid." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:218 +msgid "Adjustment Items" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/adjustments.php:229 +msgid "Process Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:17 +msgid "Inventory Item Cost Update" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:21 +msgid "There are no costable inventory items defined in the system (Purchased or manufactured items)." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:41 +msgid "The entered cost is not numeric." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:46 +msgid "The new cost is the same as the old cost. Cost was not updated." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:55 +msgid "Cost has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:59 +msgid "View the GL Journal Entries for this Cost Update" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:71 +# c:\Apache2\htdocs\account/inventory/prices.php:45 +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:113 +# c:\Apache2\htdocs\account/inventory/reorder_level.php:31 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:30 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:30 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:345 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:350 +# c:\Apache2\htdocs\account/manufacturing/inquiry/bom_cost_inquiry.php:22 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:32 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:47 +msgid "Item:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:92 +msgid "Last Cost" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:95 +msgid "Standard Material Cost Per Unit" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:100 +msgid "Standard Labour Cost Per Unit" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/cost_update.php:102 +msgid "Standard Overhead Cost Per Unit" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:7 +msgid "Inventory Item Sales prices" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:16 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:23 +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:13 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:28 +msgid "There are no items defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:18 +msgid "There are no sales types in the system. Please set up sales types befor entering pricing." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:73 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:166 +msgid "The price entered must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:84 +msgid "This price has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:91 +msgid "The new price has been added." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:105 +msgid "The selected price has been deleted." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:117 +# c:\Apache2\htdocs\account/reporting/rep104.php:94 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:336 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:64 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:80 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:68 +msgid "Sales Type" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:117 +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:144 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:50 +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:28 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:38 +# c:\Apache2\htdocs\account/reporting/rep104.php:88 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:284 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:379 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:82 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:100 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:141 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:303 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:168 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:37 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:40 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:104 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:110 +msgid "Price" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:140 +msgid "There are no prices set up for this part." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:156 +msgid "Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:158 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:235 +msgid "Sales Type:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:160 +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:210 +msgid "Price:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/prices.php:164 +msgid "Add/Update Price" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:8 +msgid "Supplier Purchasing Data" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:15 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:32 +msgid "There are no purchasable inventory items defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:16 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:30 +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:22 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:22 +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:26 +msgid "There are no suppliers defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:41 +msgid "There is no item selected." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:46 +msgid "The price entered was not numeric." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:51 +msgid "The conversion factor entered was not numeric. The conversion factor is the number by which the price must be divided by to get the unit price in our unit of measure." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:65 +msgid "This supplier purchasing data has been added." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:78 +msgid "Supplier purchasing data has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:102 +msgid "The purchasing data item has been sucessfully deleted." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:124 +msgid "Entered item is not defined. Please re-enter." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:138 +msgid "There is no purchasing data set up for the part selected" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:144 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:60 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:105 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:108 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:98 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:101 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:124 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:158 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:151 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:31 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:37 +# c:\Apache2\htdocs\account/reporting/rep201.php:78 +# c:\Apache2\htdocs\account/reporting/rep202.php:146 +# c:\Apache2\htdocs\account/reporting/rep202.php:153 +# c:\Apache2\htdocs\account/reporting/rep203.php:83 +# c:\Apache2\htdocs\account/reporting/rep204.php:77 +# c:\Apache2\htdocs\account/reporting/reports_main.php:70 +# c:\Apache2\htdocs\account/reporting/reports_main.php:71 +# c:\Apache2\htdocs\account/reporting/reports_main.php:77 +# c:\Apache2\htdocs\account/reporting/reports_main.php:84 +# c:\Apache2\htdocs\account/reporting/reports_main.php:90 +# c:\Apache2\htdocs\account/reporting/reports_main.php:94 +# c:\Apache2\htdocs\account/includes/types.inc:140 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:11 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:225 +msgid "Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:145 +msgid "Supplier's Unit" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:145 +msgid "Supplier's Description" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:203 +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:207 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:51 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:51 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:62 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:57 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:70 +msgid "Supplier:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:211 +msgid "Suppliers Unit of Measure:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:217 +msgid "Conversion Factor (to our UOM):" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:218 +msgid "Supplier's Code or Description:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:224 +msgid "Update Purchasing Data" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/purchasing_data.php:228 +msgid "Add Purchasing Data" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/reorder_level.php:15 +# c:\Apache2\htdocs\account/inventory/transfers.php:22 +msgid "There are no inventory items defined in the system (Purchased or manufactured items)." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/reorder_level.php:42 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:53 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:57 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:88 +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:45 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:91 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:105 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:98 +# c:\Apache2\htdocs\account/reporting/rep105.php:107 +# c:\Apache2\htdocs\account/reporting/rep301.php:91 +# c:\Apache2\htdocs\account/reporting/rep302.php:177 +# c:\Apache2\htdocs\account/reporting/rep303.php:130 +# c:\Apache2\htdocs\account/reporting/reports_main.php:105 +# c:\Apache2\htdocs\account/reporting/reports_main.php:110 +# c:\Apache2\htdocs\account/reporting/reports_main.php:114 +msgid "Location" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/reorder_level.php:42 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:58 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:57 +msgid "Quantity On Hand" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/reorder_level.php:42 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:57 +msgid "Re-Order Level" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:33 +msgid "Inventory transfer has been processed" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:34 +msgid "View this transfer" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:36 +msgid "Enter Another Inventory Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:111 +msgid "The locations to transfer from and to must be different." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:119 +msgid "The quantity entered is greater than the available quantity for this item at the source location :" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:157 +msgid "The quantity entered must be a positive number." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/transfers.php:238 +msgid "Process Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:16 +msgid "Inventory Item Movement" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:32 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:37 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:152 +msgid "From Location:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:37 +msgid "Show Movements" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:57 +msgid "Detail" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:58 +msgid "Quantity In" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:58 +msgid "Quantity Out" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:76 +msgid "Quantity on hand before" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_movements.php:168 +msgid "Quantity on hand after" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:43 +msgid "This is a service and cannot have a stock holding, only the total quantity on outstanding sales orders is shown." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:53 +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:58 +# c:\Apache2\htdocs\account/reporting/rep303.php:124 +msgid "Demand" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:58 +msgid "Available" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/inquiry/stock_status.php:58 +msgid "On Order" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:52 +msgid "Only jpg files are supported - a file extension of .jpg is expected" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:57 +msgid "The file size is over the maximum allowed. The maximum size allowed in KB is" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:62 +msgid "Only graphics files can be uploaded" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:67 +msgid "Attempting to overwrite an existing item image" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:71 +msgid "The existing image could not be removed" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:79 +msgid "File url" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:85 +msgid "There are no item categories defined in the system. At least one item category is required to add a item." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:87 +msgid "There are no item tax types defined in the system. At least one item tax type is required to add a item." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:114 +msgid "The item name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:119 +msgid "The item code cannot be empty" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:126 +msgid "The item code cannot contain any of the following characters - & + OR a space OR quotes" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:166 +msgid "Cannot delete this item because there are stock movements that refer to this item." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:175 +msgid "Cannot delete this item record because there are bills of material that require this part as a component." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:184 +msgid "Cannot delete this item record because there are existing sales orders for this part." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:193 +msgid "Cannot delete this item because there are existing purchase order items for it." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:224 +msgid "Select an item:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:225 +msgid "Edit Item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:230 +msgid "Enter a new item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:235 +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:46 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:30 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:48 +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:88 +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:33 +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:34 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:165 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:141 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:204 +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:302 +msgid "Item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:246 +# c:\Apache2\htdocs\account/inventory/manage/items.php:288 +msgid "Item Code:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:301 +msgid "Image File (.jpg)" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:315 +msgid "Category:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:317 +msgid "Item Tax Type:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:319 +msgid "Item Type:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:325 +msgid "Units of Measure:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:370 +msgid "Insert New Item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:375 +msgid "Update Item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/items.php:377 +msgid "Delete This Item" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:33 +msgid "The item category description cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:61 +msgid "Cannot delete this item category because items have been created using this item category." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:96 +msgid "New Item Category" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/item_categories.php:115 +msgid "Category Name:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:37 +msgid "The location code must be five characters or less long." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:42 +msgid "The location name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:73 +msgid "Cannot delete this location because item movements have been created using this location." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:82 +msgid "Cannot delete this location because it is used by some work orders records." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:91 +msgid "Cannot delete this location because it is used by some branch records as the default location to deliver from." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:119 +msgid "Location Code" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:119 +msgid "Location Name" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:139 +msgid "New Location" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:160 +# c:\Apache2\htdocs\account/inventory/manage/locations.php:164 +msgid "Location Code:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:167 +msgid "Location Name:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:168 +msgid "Contact for deliveries:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:172 +msgid "Telephone No:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:173 +msgid "Facsimile No:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/locations.php:174 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:186 +# c:\Apache2\htdocs\account/sales/manage/customers.php:276 +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:138 +msgid "Email:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:33 +msgid "The inventory movement type name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:65 +msgid "Cannot delete this inventory movement type because item transactions have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/manage/movement_types.php:109 +msgid "New Inventory Movement Type" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:8 +msgid "View Inventory Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:33 +msgid "At Location" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:36 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:37 +msgid "Adjustment Type" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:46 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:48 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:92 +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:68 +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:27 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:38 +# c:\Apache2\htdocs\account/reporting/rep301.php:85 +# c:\Apache2\htdocs\account/reporting/rep303.php:124 +# c:\Apache2\htdocs\account/reporting/rep401.php:60 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:81 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:99 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:140 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:74 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:70 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:22 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:149 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:324 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:43 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:303 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:167 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:37 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:39 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:103 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:109 +msgid "Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:47 +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:48 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:92 +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:68 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:49 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:283 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:378 +msgid "Units" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:47 +# c:\Apache2\htdocs\account/reporting/rep301.php:85 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:75 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:22 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:44 +msgid "Unit Cost" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_adjustment.php:63 +msgid "This adjustment has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:8 +msgid "View Inventory Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:31 +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:33 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:22 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:76 +msgid "From Location" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/view/view_transfer.php:32 +msgid "To Location" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:15 +msgid "Search Outstanding Work Orders" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:20 +msgid "Search Work Orders" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:37 +msgid "at Location:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:43 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:31 +msgid "for item:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:89 +msgid "Required" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:89 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:818 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:270 +msgid "Manufactured" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:89 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:126 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:269 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:273 +msgid "Required By" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:115 +msgid "Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:116 +msgid "Produce" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:117 +msgid "Costs" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:117 +msgid "Not Released" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/search_work_orders.php:138 +msgid "Release" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:7 +msgid "Produce or Unassemble Finished Items From Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:26 +msgid "The manufacturing process has been entered." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:28 +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:24 +msgid "Select another Work Order to Process" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:40 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:294 +# c:\Apache2\htdocs\account/manufacturing/includes/db/work_order_issues_db.inc:14 +# c:\Apache2\htdocs\account/manufacturing/includes/db/work_order_produce_items_db.inc:11 +msgid "The order number sent is not valid." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:86 +msgid "The production date cannot be before the release date of the work order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:98 +msgid "The unassembling cannot be processed because there is insufficient stock." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:149 +msgid "Produce Finished Items" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:149 +msgid "Return Items to Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:151 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:368 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:274 +msgid "Quantity:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:153 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:187 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:178 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:18 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:17 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:18 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:46 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:48 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:80 +msgid "Date:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:159 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:246 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:237 +msgid "Process" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_add_finished.php:160 +msgid "Process And Close Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:17 +msgid "There are no manufacturable items defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:38 +msgid "The work order been added." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:49 +msgid "The work order been updated." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:59 +msgid "Work order has been deleted." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:69 +msgid "This work order has been closed. There can be no more issues against it." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:79 +msgid "Enter a new work order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:80 +msgid "Select an existing work order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:116 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:123 +msgid "The quantity entered must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:122 +msgid "The quantity entered must be a positive number greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:141 +msgid "The selected item to manufacture does not have a bom." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:147 +msgid "The cost entered must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:153 +msgid "The cost entered cannot be negative." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:175 +msgid "The work order cannot be processed because there is an insufficient quantity for component:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:176 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:30 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:45 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:37 +msgid "Location:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:188 +msgid "The selected item cannot be unassembled because there is insufficient stock." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:212 +msgid "The quantity cannot be changed to be less than the quantity already manufactured for this order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:257 +msgid "This work order cannot be deleted because it has already been processed." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:302 +msgid "This work order is closed and cannot be edited." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:346 +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:352 +msgid "Destination Location:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:360 +msgid "Quantity Required:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:362 +msgid "Quantity Manufactured:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:375 +msgid "Total Additional Costs:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:379 +msgid "Released On:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:393 +msgid "Close This Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_entry.php:395 +msgid "Delete This Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:9 +msgid "Issue Items to Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:22 +msgid "The work order issue has been entered." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:52 +msgid "The entered date for the issue is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:75 +msgid "The issue cannot be processed because an entered item would cause a negative inventory balance :" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:93 +msgid "The process cannot be completed because there is an insufficient total quantity for a component." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:94 +msgid "Component is :" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:95 +msgid "From location :" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:182 +msgid "Items to Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_issue.php:195 +msgid "Process Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:7 +msgid "Work Order Release to Manufacturing" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:35 +msgid "This work order has already been released." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:42 +msgid "This Work Order cannot be released. The selected item to manufacture does not have a bom." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:55 +msgid "The work order has been released to manufacturing." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:57 +msgid "Select another work order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:77 +msgid "Work Order #:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:78 +msgid "Work Order Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:80 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:270 +msgid "Released Date" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/work_order_release.php:86 +msgid "Release Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/bom_cost_inquiry.php:7 +msgid "Costed Bill Of Material Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/bom_cost_inquiry.php:14 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:15 +msgid "There are no manufactured or kit items defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/bom_cost_inquiry.php:29 +msgid "All Costs Are In:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/bom_cost_inquiry.php:34 +msgid "Enter an item code above, to view the costed bill of material for." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:20 +msgid "Select an item to display its parent item(s)." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:38 +msgid "The selected item is not used in any BOMs." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:45 +msgid "Parent Item" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:45 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:92 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:21 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:76 +msgid "Work Centre" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/inquiry/where_used_inquiry.php:45 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:269 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:273 +msgid "Quantity Required" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:7 +msgid "Bill Of Materials" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:17 +msgid "There are no work centres defined in the system. BOMs require at least one work centre be defined." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:91 +# c:\Apache2\htdocs\account/reporting/rep105.php:101 +msgid "Code" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:177 +msgid "The selected component is already on this bom. You can modify it's quantity but it cannot appear more than once on the same bom." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:183 +msgid "The selected component is a parent of the current item. Recursive BOMs are not allowed." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:196 +msgid "The component item has been deleted from this bom." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:205 +msgid "Select a manufacturable item:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:225 +msgid "Add a new Component" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:250 +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:259 +msgid "Component:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:267 +msgid "Location to Draw From:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:268 +msgid "Work Centre Added:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/bom_edit.php:277 +msgid "Add/Update" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:33 +msgid "The work centre name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:63 +msgid "Cannot delete this work centre because BOMs have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:72 +msgid "Cannot delete this work centre because work order requirements have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:97 +msgid "description" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/manage/work_centres.php:117 +msgid "New Work Centre" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:17 +msgid "View Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:41 +msgid "BOM for item:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:46 +msgid "Work Order Requirements" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:51 +msgid "Issues" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:54 +msgid "Productions" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/work_order_view.php:65 +msgid "This work order has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:7 +msgid "View Work Order Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:32 +msgid "Issue #" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:32 +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:33 +msgid "For Work Order #" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:33 +msgid "To Work Centre" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:33 +msgid "Date of Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:50 +msgid "This issue has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:63 +msgid "There are no items for this issue." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:68 +# c:\Apache2\htdocs\account/reporting/rep401.php:60 +# c:\Apache2\htdocs\account/reporting/rep401.php:65 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:21 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:76 +msgid "Component" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_issue_view.php:105 +msgid "Items for this Issue" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:8 +msgid "View Work Order Production" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:33 +msgid "Production #" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:34 +msgid "Quantity Manufactured" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/view/wo_production_view.php:50 +msgid "This production has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:21 +msgid "Modify Purchase Order #" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:42 +msgid "Purchase Order has been entered" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:44 +msgid "Purchase Order has been updated" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:45 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:41 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:58 +msgid "View this order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:47 +msgid "Receive Items on this Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:49 +msgid "Enter Another Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:51 +msgid "Select An Outstanding Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:103 +msgid "This item cannot be deleted because some of it has already been received." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:117 +msgid "This order cannot be cancelled because some of it has already been received." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:118 +msgid "The line item quantities may be modified to quantities more than already received. prices cannot be altered for lines that have already been received and quantities cannot be reduced below the quantity already received." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:130 +msgid "This purchase order has been cancelled." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:132 +msgid "Enter a new purchase order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:156 +msgid "The quantity of the order item must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:161 +msgid "The quantity of the ordered item entered must be a positive amount." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:187 +msgid "You are attempting to make the quantity ordered a quantity less than has already been invoiced or received. This is prohibited." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:188 +msgid "The quantity received can only be modified by entering a negative receipt and the quantity invoiced can only be reduced by entering a credit note against this item." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:216 +msgid "The selected item is already on this order." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:244 +msgid "The selected item does not exist or it is a kit part and therefore cannot be purchased." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:257 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:116 +msgid "The entered order date is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:265 +msgid "There is no reference entered for this purchase order." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:278 +msgid "There is no delivery address specified." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:284 +msgid "There is no location specified to move any items into." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:290 +msgid "The order cannot be placed because there are no lines entered on this order." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:415 +msgid "Update Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:417 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:469 +msgid "Place Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:418 +# c:\Apache2\htdocs\account/purchasing/po_entry_items.php:421 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:438 +msgid "Cancel Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:13 +msgid "Receive Purchase Order Items" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:22 +msgid "Purchase Order Delivery has been processed" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:24 +msgid "View this Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:30 +msgid "Select a different purchase order for receiving items against" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:40 +msgid "This page can only be opened if a purchase order has been selected. Please select a purchase order first." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:49 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:110 +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:27 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:38 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:283 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:378 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:81 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:99 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:140 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:74 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:70 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:43 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:167 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:36 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:39 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:103 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:109 +msgid "Item Code" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:49 +# c:\Apache2\htdocs\account/reporting/rep105.php:101 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:378 +msgid "Ordered" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:49 +msgid "Received" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:50 +# c:\Apache2\htdocs\account/reporting/rep101.php:71 +# c:\Apache2\htdocs\account/reporting/rep105.php:102 +# c:\Apache2\htdocs\account/reporting/rep105.php:155 +# c:\Apache2\htdocs\account/reporting/rep201.php:72 +# c:\Apache2\htdocs\account/taxes/tax_types.php:99 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:46 +msgid "Outstanding" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:50 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:379 +msgid "This Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:98 +msgid "Total value of items received" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:148 +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:194 +msgid "There is nothing to process. Please enter valid quantities greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:199 +msgid "Entered quantities cannot be greater than the quantity entered on the purchase order including the allowed over-receive percentage" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:201 +msgid "Modify the ordered items on the purchase order if you wish to increase the quantities." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:219 +msgid "This order has been changed or invoiced since this delivery was started to be actioned. Processing halted. To enter a delivery against this purchase order, it must be re-selected and re-read again to update the changes made by the other user." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:221 +msgid "Select a different purchase order for receiving goods against" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:222 +msgid "Re-Read the updated purchase order for receiving goods against" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:287 +msgid "Items to Receive" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/po_receive_items.php:293 +msgid "Process Receive Items" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:18 +# c:\Apache2\htdocs\account/includes/types.inc:17 +msgid "Supplier Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:33 +msgid "Supplier credit note has been processed." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:34 +msgid "View this Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:36 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:42 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:30 +msgid "View the GL Journal Entries for this Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:38 +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:44 +msgid "Enter Another Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:66 +msgid "The credit note cannot be processed because the there are no items or values on the invoice. Credit notes are expected to have a charge." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:72 +msgid "You must enter an credit note reference." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:84 +msgid "You must enter a supplier's credit note reference." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:90 +msgid "The credit note as entered cannot be processed because the date entered is not valid." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:100 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:100 +msgid "The invoice as entered cannot be processed because the due date is in an incorrect format." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:106 +msgid "The credit note total as entered is less than the sum of the the general ledger entires (if any) and the charges for goods received. There must be a mistake somewhere, the credit note as entered will not be processed." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit.php:162 +msgid "Enter Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:9 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:12 +msgid "Select Received Items to Add" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:16 +msgid "To enter supplier transactions the supplier must first be selected from the supplier selection screen, then the link to enter a supplier credit note must be clicked on." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:32 +msgid "The quantity to credit must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:38 +msgid "The quantity to credit must be greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:44 +msgid "The price is either not numeric or negative." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:88 +msgid "Return to Credit Note Entry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:98 +msgid "There are no received items for the selected supplier that have been invoiced." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:99 +msgid "Credits can only be applied to invoiced items." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:110 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:141 +msgid "Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:110 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:165 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:141 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:204 +msgid "Sequence #" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:110 +# c:\Apache2\htdocs\account/reporting/rep105.php:96 +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:119 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:122 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:161 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:164 +msgid "Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:111 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:378 +msgid "Delivered" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:111 +msgid "Total Qty Received" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:111 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:165 +msgid "Qty Already Invoiced" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:112 +msgid "Qty Yet To Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:112 +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:166 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:143 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:205 +msgid "Order Price" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:112 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:303 +msgid "Line Value" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:163 +msgid "Delivery Item Selected For Adding To A Supplier Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:166 +msgid "Quantity to Credit" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:166 +msgid "Credit Price" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_credit_grns.php:179 +msgid "Add to Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:17 +msgid "Enter Supplier Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:33 +msgid "Supplier invoice has been processed." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:34 +msgid "View this Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:36 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:31 +msgid "View the GL Journal Entries for this Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:38 +msgid "Enter Another Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:66 +msgid "The invoice cannot be processed because the there are no items or values on the invoice. Invoices are expected to have a charge." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:72 +msgid "You must enter an invoice reference." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:84 +msgid "You must enter a supplier's invoice reference." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:90 +msgid "The invoice as entered cannot be processed because the invoice date is in an incorrect format." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:110 +msgid "This invoice number has already been entered. It cannot be entered again." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:110 +msgid " (" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:110 +msgid "supp_reference" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:110 +msgid ")" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice.php:169 +msgid "Enter Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:35 +msgid "The quantity to invoice must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:41 +msgid "The quantity to invoice must be greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:47 +msgid "The price is not numeric." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:56 +msgid "The price being invoiced is more than the purchase order price by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:57 +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:68 +msgid "The over-charge percentage allowance is :" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:67 +msgid "The quantity being invoiced is more than the outstanding quantity by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:117 +msgid "Back to Supplier Invoice Entry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:130 +msgid "There are no outstanding items received from this supplier that have not been invoiced by them." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:138 +msgid "Items Received Yet to be Invoiced" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:141 +msgid "P.O." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:142 +msgid "Received On" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:142 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:39 +msgid "Quantity Received" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:142 +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:28 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:39 +msgid "Quantity Invoiced" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:143 +msgid "Uninvoiced Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:202 +msgid "Delivery Item Selected For Adding To A Supplier Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:204 +msgid "Quantity Outstanding" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:205 +msgid "Quantity to Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:205 +msgid "Actual Price" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_invoice_grns.php:219 +msgid "Add to Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:16 +msgid "Supplier Payment Entry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:38 +msgid "Payment has been sucessfully entered" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:40 +msgid "View the GL Journal Entries for this Payment" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:43 +msgid "Allocate this Payment" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:46 +msgid "Enter another supplier payment" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:74 +msgid "From Bank Account:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:76 +msgid "Amount of Payment:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:77 +# c:\Apache2\htdocs\account/sales/customer_payments.php:179 +msgid "Amount of Discount:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:79 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:46 +msgid "Date Paid" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:85 +msgid "Payment To:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:96 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:85 +msgid "Payment Type:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:107 +msgid "Enter Payment" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:111 +msgid "The amount and discount are in the bank account's currency." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:128 +msgid "The entered amount is invalid or less than zero." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:139 +msgid "The entered discount is invalid or less than zero." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_payment.php:145 +msgid "The total of the amount and the discount negative. Please enter positive values." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:9 +msgid "Add GL Items" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:15 +msgid "To enter a supplier invoice or credit note the supplier must first be selected." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:47 +msgid "The account code entered is not a valid code, this line cannot be added to the transaction." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:56 +msgid "The amount entered is not numeric. This line cannot be added to the transaction." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:87 +msgid "Back to Invoice Entry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:91 +msgid "Back to Credit Note Entry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:101 +msgid "Enter a GL Line" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:107 +msgid "GL Account Selection:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/supplier_trans_gl.php:123 +msgid "Add GL Line" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:18 +msgid "Allocate Supplier Payment or Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:45 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:39 +msgid "The entry for one or more amounts is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:51 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:45 +msgid "The entry for an amount to allocate was negative. A positive allocation amount is expected." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:69 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:63 +msgid "These allocations cannot be processed because the amount allocated is more than the total amount left to allocate." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:183 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:174 +msgid "Allocation of" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:188 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:179 +msgid "Total:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:195 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:60 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:63 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:187 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:62 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:65 +msgid "Transaction Type" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:196 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:188 +msgid "Other Allocations" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:196 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:188 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:464 +msgid "This Allocation" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:196 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:237 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:188 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:230 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:464 +msgid "Left to Allocate" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:220 +# c:\Apache2\htdocs\account/reporting/rep104.php:74 +# c:\Apache2\htdocs\account/reporting/rep104.php:78 +# c:\Apache2\htdocs\account/reporting/rep105.php:82 +# c:\Apache2\htdocs\account/reporting/rep105.php:86 +# c:\Apache2\htdocs\account/reporting/rep301.php:72 +# c:\Apache2\htdocs\account/reporting/rep301.php:79 +# c:\Apache2\htdocs\account/reporting/rep302.php:150 +# c:\Apache2\htdocs\account/reporting/rep302.php:157 +# c:\Apache2\htdocs\account/reporting/rep303.php:111 +# c:\Apache2\htdocs\account/reporting/rep303.php:118 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:213 +msgid "All" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:228 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:221 +msgid "Total Allocated" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:251 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:241 +msgid "There are no unsettled transactions to allocate." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocate.php:255 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:244 +msgid "Back to Allocations" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:16 +msgid "Supplier Allocations" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:35 +msgid "Select a Supplier: " +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:38 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:34 +msgid "Show Settled Items:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:61 +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:64 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:63 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:66 +msgid "Left To Allocate" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:94 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:96 +msgid "Allocate" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:101 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:105 +msgid "Marked items are settled." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/allocations/supplier_allocation_main.php:104 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:108 +msgid "There are no allocations to be done." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:12 +msgid "Search Outstanding Purchase Orders" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:25 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:24 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:41 +msgid "#:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:106 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:109 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:99 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:102 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:159 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:163 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:33 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:39 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:20 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:253 +msgid "Supplier's Reference" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:106 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:109 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:99 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:102 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:125 +msgid "Order Date" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:106 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:109 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:99 +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:102 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:126 +msgid "Order Total" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:144 +msgid "Receive" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search.php:160 +msgid "Marked orders have overdue items." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:11 +msgid "Search Purchase Orders" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/po_search_completed.php:29 +msgid "into location:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:36 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:135 +msgid "Select a supplier: " +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:43 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:37 +msgid "show settled:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:113 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:147 +msgid "There are no transactions to display for the given dates." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:125 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:128 +msgid "Supp Reference" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:126 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:129 +# c:\Apache2\htdocs\account/reporting/rep101.php:71 +# c:\Apache2\htdocs\account/reporting/rep201.php:72 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:123 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:46 +msgid "Allocated" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:181 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:459 +msgid "Allocations" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_allocation_inquiry.php:198 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:220 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:82 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:207 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:250 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:188 +msgid "Marked items are overdue." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:12 +msgid "Supplier Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:34 +msgid "Select a supplier:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:58 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:59 +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:60 +# c:\Apache2\htdocs\account/reporting/rep102.php:132 +# c:\Apache2\htdocs\account/reporting/rep102.php:133 +# c:\Apache2\htdocs\account/reporting/rep102.php:134 +# c:\Apache2\htdocs\account/reporting/rep202.php:140 +# c:\Apache2\htdocs\account/reporting/rep202.php:141 +# c:\Apache2\htdocs\account/reporting/rep202.php:142 +# c:\Apache2\htdocs\account/reporting/rep202.php:171 +# c:\Apache2\htdocs\account/reporting/rep202.php:172 +# c:\Apache2\htdocs\account/reporting/rep202.php:173 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:61 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:62 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:63 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:79 +msgid "Days" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:60 +# c:\Apache2\htdocs\account/reporting/rep102.php:134 +# c:\Apache2\htdocs\account/reporting/rep202.php:142 +# c:\Apache2\htdocs\account/reporting/rep202.php:173 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:63 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:80 +msgid "Over" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:64 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:66 +msgid "Terms" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:64 +# c:\Apache2\htdocs\account/reporting/rep102.php:137 +# c:\Apache2\htdocs\account/reporting/rep202.php:146 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:66 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:75 +msgid "Current" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/inquiry/supplier_inquiry.php:65 +# c:\Apache2\htdocs\account/reporting/rep102.php:138 +# c:\Apache2\htdocs\account/reporting/rep202.php:147 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:67 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:76 +msgid "Total Balance" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:14 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:22 +msgid "There are no tax groups defined in the system. At least one tax group is required before proceeding." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:40 +msgid "The supplier name must be entered." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:104 +msgid "Cannot delete this supplier because there are transactions that refer to this supplier." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:115 +msgid "Cannot delete the supplier record because purchase orders have been created against this supplier." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:136 +msgid "Edit Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:145 +msgid "Enter a new supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:184 +msgid "Supplier Name:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:187 +msgid "Bank Account:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:192 +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:197 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:105 +msgid "Supplier's Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:200 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:287 +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:112 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:84 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:262 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:266 +msgid "Tax Group:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:202 +# c:\Apache2\htdocs\account/sales/manage/customers.php:311 +msgid "Payment Terms:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:204 +# c:\Apache2\htdocs\account/reporting/rep704.php:76 +# c:\Apache2\htdocs\account/reporting/rep704.php:86 +# c:\Apache2\htdocs\account/reporting/rep704.php:94 +msgid "Accounts" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:208 +msgid "Purchase Account:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:230 +msgid "Update Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:231 +msgid "Delete Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/manage/suppliers.php:235 +msgid "Add New Supplier Details" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:8 +msgid "View Purchase Order Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:14 +msgid "This page must be called with a Purchase Order Delivery number to review." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:20 +# c:\Apache2\htdocs\account/includes/types.inc:19 +msgid "Purchase Order Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:24 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:34 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:137 +msgid "Line Details" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:27 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:38 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:283 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:378 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:81 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:99 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:140 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:74 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:70 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:43 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:167 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:36 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:39 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:103 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:109 +msgid "Item Description" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:27 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:10 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:37 +msgid "Delivery Date" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:28 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:38 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:82 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:100 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:140 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:75 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:70 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:44 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:167 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:37 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:40 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:103 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:110 +msgid "Unit" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:28 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:39 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:168 +msgid "Line Total" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:56 +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:76 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:158 +msgid "Total Excluding Tax/Shipping" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_grn.php:61 +msgid "This delivery has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:9 +msgid "View Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:15 +msgid "This page must be called with a purchase order number to review." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:18 +# c:\Apache2\htdocs\account/includes/types.inc:15 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:232 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:9 +msgid "Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:39 +msgid "Requested By" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:95 +msgid "Deliveries" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:97 +msgid "Delivered On" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_po.php:120 +msgid "Invoices/Credits" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:9 +msgid "View Supplier Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:27 +msgid "SUPPLIER CREDIT NOTE" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:36 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:42 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:272 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:83 +msgid "Invoice Date" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:49 +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:57 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:127 +msgid "Sub Total" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:55 +msgid "TOTAL CREDIT NOTE" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_credit.php:59 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:138 +msgid "This credit note has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:14 +msgid "View Supplier Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:32 +msgid "SUPPLIER INVOICE" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:64 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:149 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:68 +msgid "TOTAL INVOICE" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_invoice.php:68 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:153 +msgid "This invoice has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:13 +msgid "View Payment to Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:38 +msgid "Payment to Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:44 +# c:\Apache2\htdocs\account/reporting/reports_main.php:74 +# c:\Apache2\htdocs\account/reporting/reports_main.php:80 +# c:\Apache2\htdocs\account/reporting/reports_main.php:87 +# c:\Apache2\htdocs\account/reporting/reports_main.php:92 +msgid "To Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:50 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:30 +msgid "Payment Currency" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/view/view_supp_payment.php:57 +msgid "Supplier's Currency" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:63 +# c:\Apache2\htdocs\account/reporting/rep102.php:125 +# c:\Apache2\htdocs\account/reporting/rep202.php:134 +# c:\Apache2\htdocs\account/reporting/rep203.php:69 +msgid "Balances in Home Currency" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:71 +# c:\Apache2\htdocs\account/reporting/rep203.php:76 +# c:\Apache2\htdocs\account/reporting/rep709.php:171 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:45 +msgid "Trans Type" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:71 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:45 +msgid "Charges" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:70 +# c:\Apache2\htdocs\account/reporting/rep201.php:72 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:46 +msgid "Credits" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:76 +# c:\Apache2\htdocs\account/reporting/rep102.php:143 +# c:\Apache2\htdocs\account/reporting/rep201.php:77 +# c:\Apache2\htdocs\account/reporting/rep202.php:152 +# c:\Apache2\htdocs\account/reporting/rep203.php:82 +# c:\Apache2\htdocs\account/reporting/reports_main.php:20 +# c:\Apache2\htdocs\account/reporting/reports_main.php:26 +# c:\Apache2\htdocs\account/reporting/reports_main.php:44 +# c:\Apache2\htdocs\account/reporting/reports_main.php:72 +# c:\Apache2\htdocs\account/reporting/reports_main.php:78 +# c:\Apache2\htdocs\account/reporting/reports_main.php:85 +# c:\Apache2\htdocs\account/reporting/reports_main.php:148 +# c:\Apache2\htdocs\account/reporting/reports_main.php:157 +# c:\Apache2\htdocs\account/reporting/reports_main.php:170 +# c:\Apache2\htdocs\account/reporting/reports_main.php:176 +# c:\Apache2\htdocs\account/reporting/reports_main.php:183 +# c:\Apache2\htdocs\account/reporting/reports_main.php:193 +# c:\Apache2\htdocs\account/reporting/reports_main.php:204 +# c:\Apache2\htdocs\account/reporting/reports_main.php:209 +# c:\Apache2\htdocs\account/reporting/reports_main.php:215 +# c:\Apache2\htdocs\account/reporting/reports_main.php:224 +# c:\Apache2\htdocs\account/reporting/reports_main.php:233 +# c:\Apache2\htdocs\account/reporting/reports_main.php:237 +# c:\Apache2\htdocs\account/reporting/reports_main.php:242 +# c:\Apache2\htdocs\account/reporting/reports_main.php:248 +msgid "End Date" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:77 +# c:\Apache2\htdocs\account/reporting/rep102.php:137 +# c:\Apache2\htdocs\account/reporting/rep102.php:144 +# c:\Apache2\htdocs\account/reporting/rep105.php:96 +# c:\Apache2\htdocs\account/reporting/reports_main.php:18 +# c:\Apache2\htdocs\account/reporting/reports_main.php:19 +# c:\Apache2\htdocs\account/reporting/reports_main.php:25 +# c:\Apache2\htdocs\account/reporting/reports_main.php:32 +# c:\Apache2\htdocs\account/reporting/reports_main.php:36 +# c:\Apache2\htdocs\account/reporting/reports_main.php:42 +# c:\Apache2\htdocs\account/reporting/reports_main.php:49 +# c:\Apache2\htdocs\account/reporting/reports_main.php:56 +# c:\Apache2\htdocs\account/reporting/reports_main.php:62 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:248 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:313 +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:62 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:120 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:162 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:125 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:38 +# c:\Apache2\htdocs\account/includes/types.inc:139 +msgid "Customer" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:81 +# c:\Apache2\htdocs\account/reporting/reports_main.php:19 +msgid "Customer Balances" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep101.php:155 +# c:\Apache2\htdocs\account/reporting/rep102.php:226 +# c:\Apache2\htdocs\account/reporting/rep201.php:159 +# c:\Apache2\htdocs\account/reporting/rep202.php:241 +# c:\Apache2\htdocs\account/reporting/rep203.php:149 +# c:\Apache2\htdocs\account/reporting/rep204.php:133 +# c:\Apache2\htdocs\account/reporting/rep301.php:154 +msgid "Grand Total" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep102.php:119 +# c:\Apache2\htdocs\account/reporting/rep202.php:128 +# c:\Apache2\htdocs\account/reporting/rep709.php:149 +# c:\Apache2\htdocs\account/reporting/reports_main.php:30 +# c:\Apache2\htdocs\account/reporting/reports_main.php:82 +# c:\Apache2\htdocs\account/reporting/reports_main.php:249 +msgid "Summary Only" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep102.php:121 +# c:\Apache2\htdocs\account/reporting/rep202.php:130 +# c:\Apache2\htdocs\account/reporting/rep709.php:151 +# c:\Apache2\htdocs\account/reporting/reports_main.php:106 +msgid "Detailed Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep102.php:151 +# c:\Apache2\htdocs\account/reporting/reports_main.php:25 +msgid "Aged Customer Analysis" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:107 +msgid "All Areas" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:111 +msgid "All Sales Folk" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:115 +msgid "Greater than " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:119 +msgid "Less than " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:128 +msgid "Customer Postal Address" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:128 +msgid "Price/Turnover" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:128 +msgid "Branch Contact Information" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:129 +msgid "Branch Delivery Address" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:134 +# c:\Apache2\htdocs\account/reporting/reports_main.php:33 +msgid "Activity Since" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:136 +# c:\Apache2\htdocs\account/reporting/reports_main.php:35 +msgid "Sales Folk" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:137 +msgid "Activity" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:139 +msgid "Customer Details Listing" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:167 +msgid "Customers in" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:191 +msgid "Price List" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:193 +msgid "Turnover" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:196 +msgid "Ph" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep103.php:197 +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:87 +msgid "Fax" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:88 +msgid "Category/Items" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:88 +msgid "GP %" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:93 +# c:\Apache2\htdocs\account/reporting/rep105.php:106 +# c:\Apache2\htdocs\account/reporting/rep301.php:85 +# c:\Apache2\htdocs\account/reporting/rep301.php:90 +# c:\Apache2\htdocs\account/reporting/rep302.php:169 +# c:\Apache2\htdocs\account/reporting/rep302.php:176 +# c:\Apache2\htdocs\account/reporting/rep303.php:124 +# c:\Apache2\htdocs\account/reporting/rep303.php:129 +msgid "Category" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:95 +# c:\Apache2\htdocs\account/reporting/reports_main.php:40 +msgid "Show GP %" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:102 +# c:\Apache2\htdocs\account/reporting/reports_main.php:36 +msgid "Price Listing" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep104.php:119 +msgid "Prices" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:90 +msgid "All Orders" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:92 +# c:\Apache2\htdocs\account/reporting/reports_main.php:47 +msgid "Back Orders Only" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:96 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:249 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:314 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:162 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:165 +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:125 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:49 +msgid "Branch" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:96 +msgid "Customer Ref" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:97 +msgid "Ord Date" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:97 +msgid "Del Date" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:97 +# c:\Apache2\htdocs\account/reporting/rep401.php:60 +msgid "Loc" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:101 +msgid "Invoiced" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:102 +msgid " " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:105 +# c:\Apache2\htdocs\account/reporting/rep702.php:45 +# c:\Apache2\htdocs\account/reporting/rep704.php:75 +# c:\Apache2\htdocs\account/reporting/rep704.php:85 +# c:\Apache2\htdocs\account/reporting/rep704.php:93 +# c:\Apache2\htdocs\account/reporting/rep706.php:55 +# c:\Apache2\htdocs\account/reporting/rep706.php:63 +# c:\Apache2\htdocs\account/reporting/rep706.php:72 +# c:\Apache2\htdocs\account/reporting/rep706.php:79 +# c:\Apache2\htdocs\account/reporting/rep707.php:70 +# c:\Apache2\htdocs\account/reporting/rep707.php:77 +# c:\Apache2\htdocs\account/reporting/rep707.php:86 +# c:\Apache2\htdocs\account/reporting/rep707.php:93 +# c:\Apache2\htdocs\account/reporting/rep708.php:70 +# c:\Apache2\htdocs\account/reporting/rep708.php:79 +# c:\Apache2\htdocs\account/reporting/rep708.php:86 +# c:\Apache2\htdocs\account/reporting/rep709.php:177 +msgid "Period" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:108 +msgid "Selection" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep105.php:113 +# c:\Apache2\htdocs\account/reporting/reports_main.php:42 +msgid "Order Status Listing" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep107.php:59 +# c:\Apache2\htdocs\account/reporting/rep107.php:84 +# c:\Apache2\htdocs\account/reporting/rep107.php:95 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:32 +msgid "INVOICE" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep107.php:89 +# c:\Apache2\htdocs\account/reporting/rep107.php:95 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:30 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:34 +msgid "CREDIT NOTE" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep108.php:72 +# c:\Apache2\htdocs\account/reporting/rep108.php:99 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:44 +msgid "STATEMENT" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep109.php:68 +# c:\Apache2\htdocs\account/reporting/rep109.php:88 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:30 +msgid "SALES ORDER" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep109.php:83 +msgid "SALES_ORDER" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep201.php:64 +msgid "Balances in Home currency" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep201.php:82 +# c:\Apache2\htdocs\account/reporting/reports_main.php:71 +msgid "Supplier Balances" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep202.php:159 +msgid "currency" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep202.php:160 +msgid "Aged Supplier Analysis" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep203.php:87 +# c:\Apache2\htdocs\account/reporting/reports_main.php:84 +msgid "Payment Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +msgid "GRN" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +msgid "Qty Recd" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:71 +msgid "qty Inv" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:72 +msgid "Std Cost" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:72 +# c:\Apache2\htdocs\account/reporting/rep301.php:85 +msgid "Value" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep204.php:80 +# c:\Apache2\htdocs\account/reporting/reports_main.php:90 +msgid "Outstanding GRNs Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep209.php:78 +# c:\Apache2\htdocs\account/reporting/rep209.php:98 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:28 +msgid "PURCHASE ORDER" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep209.php:93 +msgid "PURCHASE_ORDER" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep301.php:93 +# c:\Apache2\htdocs\account/reporting/reports_main.php:103 +msgid "Inventory Valuation Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep302.php:170 +msgid "QOH" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep302.php:170 +msgid "Cust Ord" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep302.php:170 +msgid "Supp Ord" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep302.php:170 +msgid "Sugg Ord" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep302.php:179 +# c:\Apache2\htdocs\account/reporting/reports_main.php:108 +msgid "Inventory Planning Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep303.php:124 +msgid "Difference" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep303.php:137 +# c:\Apache2\htdocs\account/reporting/reports_main.php:112 +msgid "Stock Check Sheets" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep401.php:60 +msgid "Wrk Ctr" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep401.php:67 +# c:\Apache2\htdocs\account/reporting/reports_main.php:119 +msgid "Bill of Material Listing" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep501.php:75 +msgid "YTD" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep501.php:82 +# c:\Apache2\htdocs\account/reporting/reports_main.php:126 +msgid "Dimension Summary" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep702.php:39 +msgid "Type/Account" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep702.php:39 +msgid "Date/Dim." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep702.php:40 +msgid "Person/Item/Memo" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep702.php:49 +# c:\Apache2\htdocs\account/reporting/reports_main.php:146 +msgid "List of Journal Entries" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep704.php:30 +# c:\Apache2\htdocs\account/reporting/reports_main.php:155 +# c:\Apache2\htdocs\account/reporting/reports_main.php:191 +# c:\Apache2\htdocs\account/reporting/reports_main.php:222 +msgid "GL Account Transactions" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep705.php:131 +# c:\Apache2\htdocs\account/reporting/rep705.php:143 +# c:\Apache2\htdocs\account/reporting/rep705.php:153 +# c:\Apache2\htdocs\account/reporting/reports_main.php:164 +# c:\Apache2\htdocs\account/reporting/reports_main.php:199 +# c:\Apache2\htdocs\account/reporting/reports_main.php:229 +msgid "Year" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep705.php:137 +# c:\Apache2\htdocs\account/reporting/rep705.php:147 +# c:\Apache2\htdocs\account/reporting/rep705.php:155 +msgid "Info" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep705.php:137 +# c:\Apache2\htdocs\account/reporting/rep705.php:147 +# c:\Apache2\htdocs\account/reporting/rep705.php:155 +msgid "Amounts in thousands" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep705.php:159 +# c:\Apache2\htdocs\account/reporting/reports_main.php:163 +# c:\Apache2\htdocs\account/reporting/reports_main.php:198 +# c:\Apache2\htdocs\account/reporting/reports_main.php:228 +msgid "Annual Expense Breakdown" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep705.php:289 +# c:\Apache2\htdocs\account/reporting/rep706.php:210 +# c:\Apache2\htdocs\account/reporting/rep707.php:247 +msgid "Calculated Return" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep706.php:55 +msgid "Open Balance" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep706.php:56 +msgid "Close Balance" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep706.php:254 +# c:\Apache2\htdocs\account/reporting/rep707.php:289 +msgid "Group" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep707.php:70 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:163 +msgid "Accumulated" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep707.php:70 +msgid "Achieved %" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep707.php:103 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:163 +msgid "Budget" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep707.php:112 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:163 +msgid "Period Y-1" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep707.php:115 +# c:\Apache2\htdocs\account/reporting/reports_main.php:174 +# c:\Apache2\htdocs\account/reporting/reports_main.php:207 +# c:\Apache2\htdocs\account/reporting/reports_main.php:235 +msgid "Profit and Loss Statement" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:140 +# c:\Apache2\htdocs\account/reporting/reports_main.php:246 +msgid "Tax Report" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:171 +msgid "Branch Name" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:172 +msgid "Net" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:172 +# c:\Apache2\htdocs\account/taxes/tax_groups.php:210 +msgid "Tax" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:225 +msgid "Total Outputs" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:268 +msgid "Total Inputs" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:275 +msgid "Tax Rate" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:275 +msgid "Outputs" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:275 +msgid "Output Tax" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:275 +msgid "Inputs" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:275 +msgid "Input Tax" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/rep709.php:318 +msgid "No tax specified" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:7 +msgid "Reports and Analysis" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:21 +# c:\Apache2\htdocs\account/reporting/reports_main.php:27 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:25 +msgid "From Customer" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:22 +# c:\Apache2\htdocs\account/reporting/reports_main.php:28 +msgid "To Customer" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:23 +# c:\Apache2\htdocs\account/reporting/reports_main.php:29 +# c:\Apache2\htdocs\account/reporting/reports_main.php:52 +# c:\Apache2\htdocs\account/reporting/reports_main.php:58 +# c:\Apache2\htdocs\account/reporting/reports_main.php:65 +# c:\Apache2\htdocs\account/reporting/reports_main.php:75 +# c:\Apache2\htdocs\account/reporting/reports_main.php:81 +# c:\Apache2\htdocs\account/reporting/reports_main.php:88 +# c:\Apache2\htdocs\account/reporting/reports_main.php:97 +msgid "Currency Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:31 +# c:\Apache2\htdocs\account/reporting/reports_main.php:84 +# c:\Apache2\htdocs\account/reporting/reports_main.php:175 +# c:\Apache2\htdocs\account/reporting/reports_main.php:183 +# c:\Apache2\htdocs\account/reporting/reports_main.php:210 +# c:\Apache2\htdocs\account/reporting/reports_main.php:217 +# c:\Apache2\htdocs\account/reporting/reports_main.php:240 +# c:\Apache2\htdocs\account/reporting/reports_main.php:246 +msgid "Graphics" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:32 +msgid "Customer Detail Listing" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:35 +msgid "Activity Greater Than" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:35 +msgid "Activity Less Than" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:37 +# c:\Apache2\htdocs\account/reporting/reports_main.php:45 +# c:\Apache2\htdocs\account/reporting/reports_main.php:104 +# c:\Apache2\htdocs\account/reporting/reports_main.php:109 +# c:\Apache2\htdocs\account/reporting/reports_main.php:113 +msgid "Inventory Category" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:39 +# c:\Apache2\htdocs\account/reporting/reports_main.php:115 +msgid "Show Pictures" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:46 +msgid "Stock Location" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:49 +msgid "Print Invoices/Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:51 +# c:\Apache2\htdocs\account/reporting/reports_main.php:64 +# c:\Apache2\htdocs\account/reporting/reports_main.php:96 +msgid "To" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:53 +# c:\Apache2\htdocs\account/reporting/reports_main.php:59 +# c:\Apache2\htdocs\account/reporting/reports_main.php:66 +# c:\Apache2\htdocs\account/reporting/reports_main.php:98 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:24 +msgid "Bank Account" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:54 +msgid "email Customers" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:56 +msgid "Print Statements" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:57 +# c:\Apache2\htdocs\account/sales/manage/customers.php:7 +msgid "Customers" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:60 +# c:\Apache2\htdocs\account/reporting/reports_main.php:67 +# c:\Apache2\htdocs\account/reporting/reports_main.php:99 +msgid "Email Customers" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:62 +msgid "Print Sales Orders" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:73 +# c:\Apache2\htdocs\account/reporting/reports_main.php:79 +# c:\Apache2\htdocs\account/reporting/reports_main.php:86 +# c:\Apache2\htdocs\account/reporting/reports_main.php:91 +msgid "From Supplier" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:77 +msgid "Aged Supplier Analyses" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:94 +msgid "Print Purchase Orders" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:102 +# c:\Apache2\htdocs\account/reporting/reports_main.php:103 +# c:\Apache2\htdocs\account/reporting/reports_main.php:108 +# c:\Apache2\htdocs\account/reporting/reports_main.php:112 +msgid "Inventory" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:118 +# c:\Apache2\htdocs\account/reporting/reports_main.php:119 +msgid "Manufactoring" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:120 +msgid "From component" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:121 +msgid "To component" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:127 +msgid "From Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:128 +msgid "To Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:129 +msgid "Show Balance" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:131 +msgid "Dimension Details" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:135 +msgid "Banking" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:142 +# c:\Apache2\htdocs\account/reporting/reports_main.php:143 +# c:\Apache2\htdocs\account/reporting/reports_main.php:146 +# c:\Apache2\htdocs\account/reporting/reports_main.php:155 +# c:\Apache2\htdocs\account/reporting/reports_main.php:163 +# c:\Apache2\htdocs\account/reporting/reports_main.php:168 +# c:\Apache2\htdocs\account/reporting/reports_main.php:174 +# c:\Apache2\htdocs\account/reporting/reports_main.php:181 +# c:\Apache2\htdocs\account/reporting/reports_main.php:191 +# c:\Apache2\htdocs\account/reporting/reports_main.php:198 +# c:\Apache2\htdocs\account/reporting/reports_main.php:202 +# c:\Apache2\htdocs\account/reporting/reports_main.php:207 +# c:\Apache2\htdocs\account/reporting/reports_main.php:213 +# c:\Apache2\htdocs\account/reporting/reports_main.php:222 +# c:\Apache2\htdocs\account/reporting/reports_main.php:228 +# c:\Apache2\htdocs\account/reporting/reports_main.php:231 +# c:\Apache2\htdocs\account/reporting/reports_main.php:235 +# c:\Apache2\htdocs\account/reporting/reports_main.php:240 +# c:\Apache2\htdocs\account/reporting/reports_main.php:246 +msgid "General Ledger" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:144 +msgid "Show Balances" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:158 +# c:\Apache2\htdocs\account/reporting/reports_main.php:194 +# c:\Apache2\htdocs\account/reporting/reports_main.php:225 +msgid "From Account" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:159 +# c:\Apache2\htdocs\account/reporting/reports_main.php:195 +# c:\Apache2\htdocs\account/reporting/reports_main.php:226 +msgid "To Account" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:177 +# c:\Apache2\htdocs\account/reporting/reports_main.php:210 +# c:\Apache2\htdocs\account/reporting/reports_main.php:238 +msgid "Compare to" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/reports_main.php:184 +# c:\Apache2\htdocs\account/reporting/reports_main.php:216 +# c:\Apache2\htdocs\account/reporting/reports_main.php:243 +msgid "Zero values" +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:24 +# c:\Apache2\htdocs\account/includes/types.inc:11 +msgid "Customer Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:30 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:424 +msgid "There are no customers, or there are no customers with branches. Please define customers and customer branches." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:39 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:27 +msgid "Credit Note has been processed" +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:40 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:28 +msgid "View this credit note" +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:118 +msgid "The entered date for the credit note is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:138 +msgid "For credit notes created to write off the stock, a general ledger account is required to be selected." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:139 +msgid "Please select an account to write the cost of the stock off to, then click on Process again." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:171 +msgid "The quantity must be greater than zero." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:176 +msgid "The entered price is negative or invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:181 +msgid "The entered discount percent is negative, greater than 100 or invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:256 +msgid "Credit Note Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/credit_note_entry.php:273 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:387 +msgid "Process Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:17 +msgid "Credit all or part of an Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:40 +msgid "This page can only be opened if an invoice has been selected for crediting." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:72 +msgid "The entered shipping cost is invalid or less than zero." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:199 +msgid "This invoice can not be credited using the automatic facility." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:259 +msgid "Crediting Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:263 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:326 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:170 +msgid "Tax Group" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:274 +msgid "Credit Note Date" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:283 +msgid "Invoiced Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:284 +msgid "Credit Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:284 +# c:\Apache2\htdocs\account/sales/view/view_credit.php:82 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:100 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:40 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:104 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:110 +msgid "Discount %" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:314 +msgid "Credit Shipping Cost" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:321 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:457 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:140 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:64 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:147 +msgid "Sub-total" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:329 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:159 +msgid "Credit Note Total" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:343 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:232 +msgid "Credit Note Type" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:347 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:352 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1911 +msgid "Items Written Off" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:348 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:353 +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:367 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1910 +msgid "Items Returned to Inventory Location" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_credit_invoice.php:373 +msgid "Write Off the Cost of the Items to" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:19 +msgid "Issue an Invoice and Deliver Items for a Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:28 +msgid "Invoice processed" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:29 +msgid "View this invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:34 +msgid "Issue Another Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:36 +msgid "Select Another Order For Invoicing" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:49 +msgid "This page can only be opened if an order has been selected. Please select an order first." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:51 +# c:\Apache2\htdocs\account/sales/customer_invoice.php:85 +msgid "Select a sales order to invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:79 +msgid "Select a different sales order to invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:80 +msgid "There are no ordered items with a quantity left to deliver. There is nothing left to invoice." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:86 +msgid "This order item could not be retrieved. Please select another order." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:116 +msgid "This order has been changed or invoiced since this delivery was started to be confirmed. Processing halted." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:117 +msgid "To enter and confirm this dispatch/invoice the order must be re-selected and re-read again to update the changes made by the other user." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:119 +msgid "Select a sales order for confirming deliveries and invoicing" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:165 +msgid "Original order for" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:166 +msgid "has a quantity of" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:167 +msgid "and an invoiced quantity of" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:168 +msgid "the session shows quantity of" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:170 +msgid "and quantity invoice of" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:187 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:112 +msgid "The entered invoice date is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:192 +msgid "The entered invoice date is not in fiscal year." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:197 +msgid "The entered invoice due date is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:216 +msgid "The entered shipping value is not numeric." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:222 +msgid "There are no item quantities on this invoice." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:244 +msgid "The invoice cannot be processed because there is an insufficient quantity for component:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:329 +msgid "For Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:341 +msgid "Delivery From" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:375 +msgid "Invoice Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:379 +msgid "Tax Type" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:379 +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:32 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:141 +msgid "Discount" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:451 +msgid "Shipping Cost" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:464 +msgid "Invoice Total" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:469 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:130 +msgid "Marked items have insufficient quantities in stock." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:473 +msgid "Action For Balance" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_invoice.php:480 +msgid "Process Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:18 +msgid "Customer Payment Entry" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:22 +msgid "There are no customers defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:34 +msgid "The customer payment has been successfully entered." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:36 +msgid "View the GL Journal Entries for this Customer Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:37 +msgid "Allocate this Customer Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:38 +msgid "Enter Another Customer Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:50 +msgid "The entered date is invalid. Please enter a valid date for the payment." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:73 +msgid "The entered amount is invalid or negative and cannot be processed." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:82 +msgid "The entered discount is not a valid number." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:88 +msgid "The balance of the amount and discout is zero or negative. Please enter valid amounts." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:153 +msgid "From Customer:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:157 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:58 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:58 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:33 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:209 +msgid "Branch:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:171 +msgid "This customer account is on hold." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:181 +msgid "Customer prompt payment discount :" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:183 +msgid "Date of Deposit:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:189 +msgid "Into Bank Account:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:211 +msgid "Amount and discount are in customer's currency." +msgstr "" + +# c:\Apache2\htdocs\account/sales/customer_payments.php:215 +msgid "Add Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:21 +msgid "Modifying Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:39 +msgid "Order has been entered." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:43 +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:60 +msgid "Confirm Order Delivery Quantities and Produce Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:45 +msgid "Enter a New Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:56 +msgid "Order has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:62 +msgid "Select A Different Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:125 +msgid "The entered date is not in fiscal year" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:134 +msgid "You must enter at least one line entry." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:139 +msgid "You must enter the person or company to whom delivery should be made to." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:145 +msgid "You should enter the street address in the box provided. Orders cannot be accepted without a valid street address." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:154 +msgid "The shipping cost entered is expected to be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:160 +msgid "The delivery date is invalid." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:166 +msgid "The requested delivery date is before the date of the order." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:235 +msgid "The item could not be updated because you are attempting to set the quantity ordered to less than 0, or the discount percent to more than 100." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:241 +msgid "The item you attempting to modify the price for has already had some quantity invoiced at the old price. The item unit price cannot be modified retrospectively." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:247 +msgid "The item you attempting to modify has had some quantity invoiced at the old discount percent. The items discount cannot be modified retrospectively." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:252 +msgid "You attempting to make the quantity ordered a quantity less than has already been invoiced. The quantity delivered and invoiced cannot be modified retrospectively." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:280 +msgid "This item cannot be deleted because some of it has already been invoiced." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:310 +msgid "This order cannot be cancelled because some of it has already been invoiced. However, the line item quantities may be modified." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:325 +msgid "This sales invoice has been cancelled as requested." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:326 +msgid "Enter a New Sales Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:330 +msgid "This sales order has been cancelled as requested." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:331 +msgid "Enter a New Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:422 +msgid "There are no inventory items defined in the system." +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:428 +msgid "Invoice Date:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:429 +msgid "Sales Invoice Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:430 +msgid "Enter Delivery Details and Confirm Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:431 +msgid "Cancel Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:435 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:109 +msgid "Order Date:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:436 +msgid "Sales Order Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:437 +msgid "Enter Delivery Details and Confirm Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:463 +msgid "Place Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:464 +msgid "Commit Invoice Changes" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:465 +msgid "Edit Invoice Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:470 +msgid "Commit Order Changes" +msgstr "" + +# c:\Apache2\htdocs\account/sales/sales_order_entry.php:471 +msgid "Edit Order Items" +msgstr "" + +# c:\Apache2\htdocs\account/sales/allocations/customer_allocate.php:13 +msgid "Allocate Customer Payment or Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:12 +msgid "Customer Allocations" +msgstr "" + +# c:\Apache2\htdocs\account/sales/allocations/customer_allocation_main.php:31 +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:30 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:30 +# c:\Apache2\htdocs\account/sales/manage/customers.php:217 +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:149 +msgid "Select a customer: " +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:109 +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:151 +msgid "The selected customer has no transactions for the given dates." +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/customer_allocation_inquiry.php:151 +msgid "Allocation" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:13 +msgid "Customer Inquiry" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:58 +msgid "CUSTOMER ACCOUNT IS ON HOLD" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/customer_inquiry.php:194 +msgid "Credit This" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:16 +msgid "Search Outstanding Sales Orders" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:21 +msgid "Search All Sales Orders" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:125 +msgid "Order #" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:125 +msgid "Cust Order #" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:126 +msgid "Delivery To" +msgstr "" + +# c:\Apache2\htdocs\account/sales/inquiry/sales_orders_view.php:166 +msgid "Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:7 +msgid "Credit Status" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:29 +msgid "The credit status description cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:64 +msgid "Cannot delete this credit status because customer accounts have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:89 +msgid "Dissallow Invoices" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:100 +msgid "Invoice OK" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:104 +msgid "NO INVOICING" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:118 +msgid "New Credit Status" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/credit_status.php:138 +msgid "Dissallow invoicing ?" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:30 +msgid "The customer name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:36 +msgid "The credit limit must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:42 +msgid "The payment discount must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:48 +msgid "The discount percentage must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:54 +msgid "The credit limit must be a positive number." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:60 +msgid "The payment discount is expected to be less than 100% and greater than or equal to 0." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:66 +msgid "The discount percent is expected to be less than 100 and greater than or equal to 0." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:101 +msgid "Customer has been updated." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:123 +msgid "A new customer has been added." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:125 +msgid "Add branches for this customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:156 +msgid "This customer cannot be deleted because there are transactions that refer to it." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:166 +msgid "Cannot delete the customer record because orders have been created against it." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:176 +msgid "Cannot delete this customer because there are branch records set up against it." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:209 +msgid "There are no sales types defined. Please define at least one sales type before adding a customer." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:218 +msgid "Edit Customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:227 +msgid "Enter a new customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:273 +msgid "Customer Name:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:277 +msgid "GSTNo:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:283 +# c:\Apache2\htdocs\account/sales/manage/customers.php:287 +msgid "Customer's Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:296 +msgid "Sales Type/Price List:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:307 +msgid "Discount Percent:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:308 +msgid "Prompt Payment Discount Percent:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:309 +msgid "Credit Limit:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:312 +msgid "Credit Status:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:320 +msgid "Add New Customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:324 +msgid "Update Customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customers.php:325 +msgid "Delete Customer" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:14 +msgid "There are no customers defined in the system. Please define a customer to add customer branches." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:16 +msgid "There are no sales people defined in the system. At least one sales person is required before proceeding." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:18 +msgid "There are no sales areas defined in the system. At least one sales area is required before proceeding." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:20 +msgid "There are no shipping companies defined in the system. At least one shipping company is required before proceeding." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:56 +msgid "The Branch name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:125 +msgid "Cannot delete this branch because customer transactions have been created to this branch." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:136 +msgid "Cannot delete this branch because sales orders exist for it. Purge old sales orders first." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:169 +msgid "Contact" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:169 +msgid "Sales Person" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:169 +msgid "Area" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:170 +msgid "Phone No" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:170 +msgid "Fax No" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:192 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:55 +msgid "The selected customer does not have any branches. Please create at least one branch." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:200 +msgid "New Customer Branch" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:248 +msgid "Main Branch" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:267 +msgid "Name and Contact" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:269 +msgid "Branch Name:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:273 +msgid "Fax Number:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:275 +msgid "E-mail:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:279 +msgid "Sales Person:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:281 +msgid "Sales Area:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:283 +msgid "Default Inventory Location:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:285 +msgid "Default Shipping Company:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:289 +msgid "Disable this Branch:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:307 +msgid "Addresses" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:309 +msgid "Mailing Address:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/customer_branches.php:311 +msgid "Billing Address:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:29 +msgid "The area description cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:63 +msgid "Cannot delete this area because customer branches have been created using this area." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:80 +msgid "Area Name" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:97 +msgid "New Sales Area" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_areas.php:117 +msgid "Area Name:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:31 +msgid "The sales person name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:87 +msgid "Email" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:111 +msgid "New Sales Person" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:135 +msgid "Sales person name:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:136 +msgid "Telephone number:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_people.php:137 +msgid "Fax number:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:29 +msgid "The sales type description cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:65 +msgid "Cannot delete this sale type because customer transactions have been created using this sales type." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:78 +msgid "Cannot delete this sale type because customers are currently set up to use this sales type." +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:94 +msgid "Type Name" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:111 +msgid "New Sales type" +msgstr "" + +# c:\Apache2\htdocs\account/sales/manage/sales_types.php:127 +msgid "Sales Type Name:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_credit.php:15 +msgid "View Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_credit.php:59 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:70 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:101 +msgid "Ref" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_credit.php:116 +msgid "There are no line items on this credit note." +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_credit.php:129 +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:142 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:168 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:65 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:152 +msgid "Shipping" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_credit.php:134 +msgid "TOTAL CREDIT" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:7 +msgid "View Sales Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:30 +msgid "SALES INVOICE" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:38 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:6 +msgid "Charge To" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:52 +msgid "Charge Branch" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:61 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:7 +msgid "Delivered To" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:74 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:18 +msgid "Our Order No" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:78 +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:46 +msgid "Customer Order Ref." +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_invoice.php:134 +msgid "There are no line items on this invoice." +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:7 +msgid "View Customer Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:20 +# c:\Apache2\htdocs\account/includes/types.inc:12 +msgid "Customer Payment" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:26 +msgid "Into Bank Account" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:27 +msgid "Date of Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_receipt.php:42 +msgid "This customer payment has been voided." +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:17 +msgid "View Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:19 +# c:\Apache2\htdocs\account/includes/types.inc:23 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:7 +msgid "Sales Order" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:33 +msgid "Order Information" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:37 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1854 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1867 +msgid "Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:43 +msgid "Customer Name" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:47 +msgid "Deliver To Branch" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:50 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:19 +msgid "Ordered On" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:51 +msgid "Requested Delivery" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:54 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:14 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:228 +msgid "Order Currency" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:55 +msgid "Deliver From Location" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:58 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:51 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:257 +msgid "Delivery Address" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:60 +msgid "Telephone" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:141 +msgid "Quantity Delivered" +msgstr "" + +# c:\Apache2\htdocs\account/sales/view/view_sales_order.php:170 +msgid "Total Excluding Tax" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:34 +msgid "The item tax type description cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:78 +msgid "Cannot delete this item tax type because items have been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:103 +msgid "Tax exempt" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:132 +msgid "New Item Tax type" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:165 +msgid "Is Fully Tax-exempt:" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:172 +msgid "Select which taxes this item tax type is exempt from." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:175 +msgid "Tax Name" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/item_tax_types.php:175 +msgid "Is exempt" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:27 +msgid "There are no tax types defined. Define tax types before defining tax groups." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:40 +msgid "The tax group name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:51 +msgid "An entered tax rate is invalid or less than zero." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:108 +msgid "Cannot delete this tax group because customer branches been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:117 +msgid "Cannot delete this tax group because suppliers been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:143 +msgid "Tax Shipping" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:171 +msgid "New Tax Group" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:203 +msgid "Tax Shipping:" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:207 +msgid "Select the taxes that are included in this group." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:210 +# c:\Apache2\htdocs\account/taxes/tax_types.php:98 +msgid "Default Rate (%)" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:210 +msgid "Rate (%)" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_groups.php:210 +msgid "Include in Price" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:7 +msgid "Tax Types" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:26 +msgid "The tax type name cannot be empty." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:31 +msgid "The default tax rate must be numeric." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:36 +msgid "The default tax rate cannot be less than zero." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:72 +msgid "Cannot delete this tax type because tax groups been created referring to it." +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:99 +msgid "Sales GL Account" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:99 +msgid "Purchasing GL Account" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:127 +msgid "New Tax Type" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:150 +msgid "Default Rate:" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:152 +msgid "Sales GL Account:" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:153 +msgid "Purchasing GL Account:" +msgstr "" + +# c:\Apache2\htdocs\account/taxes/tax_types.php:155 +msgid "Outstanding:" +msgstr "" + +# c:\Apache2\htdocs\account/themes/aqua/renderer.php:6 +# c:\Apache2\htdocs\account/themes/cool/renderer.php:7 +# c:\Apache2\htdocs\account/themes/default/renderer.php:7 +msgid "Main Menu" +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:17 +msgid "There are no transactions for this dimension." +msgstr "" + +# c:\Apache2\htdocs\account/dimensions/includes/dimensions_ui.inc:21 +msgid "Transactions for this Dimension" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:48 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:48 +msgid "Work Order:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:54 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:54 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:19 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:186 +msgid "Customer:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_deposit_ui.inc:228 +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:175 +msgid "Add item" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_journal_ui.inc:27 +msgid "Reverse Transaction:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:40 +msgid "Pay To:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:45 +msgid "To the Order of:" +msgstr "" + +# c:\Apache2\htdocs\account/gl/includes/ui/gl_payment_ui.inc:226 +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:163 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:147 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:130 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:325 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:217 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:332 +msgid "Add Item" +msgstr "" + +# c:\Apache2\htdocs\account/includes/errors.inc:8 +msgid "DATABASE ERROR :" +msgstr "" + +# c:\Apache2\htdocs\account/includes/errors.inc:33 +msgid "The entered information is a duplicate. Please go back and enter different values." +msgstr "" + +# c:\Apache2\htdocs\account/includes/errors.inc:34 +# c:\Apache2\htdocs\account/includes/session.inc:39 +# c:\Apache2\htdocs\account/includes/session.inc:66 +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:64 +msgid "Back" +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:35 +msgid "Incorrect Password" +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:36 +msgid "The user and password combination is not valid for the system." +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:38 +msgid "If you are not an authorized user, please contact your system administrator to obtain an account to enable you to use the system." +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:53 +msgid "Security settings have not been defined for your user account." +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:54 +msgid "Please contact your system administrator." +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:62 +msgid "Access denied" +msgstr "" + +# c:\Apache2\htdocs\account/includes/session.inc:64 +msgid "The security settings on your account do not permit you to access this function" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:7 +msgid "Bank Payment" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:8 +msgid "Bank Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:9 +msgid "Funds Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:10 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:5 +msgid "Sales Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:13 +msgid "Location Transfer" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:14 +msgid "Inventory Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:16 +msgid "Supplier Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:18 +msgid "Supplier Payment" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:20 +# c:\Apache2\htdocs\account/includes/types.inc:138 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:11 +msgid "Work Order" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:21 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:12 +msgid "Work Order Issue" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:22 +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:13 +msgid "Work Order Production" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:24 +msgid "Cost Update" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:107 +msgid "Savings Account" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:108 +msgid "Chequing Account" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:109 +msgid "Credit Account" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:110 +msgid "Cash Account" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:251 +msgid "Assemble" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:252 +msgid "Unassemble" +msgstr "" + +# c:\Apache2\htdocs\account/includes/types.inc:253 +msgid "Advanced Manufacture" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:51 +msgid "You should automatically be forwarded." +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:52 +msgid "If this does not happen" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:52 +msgid "click here" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_controls.inc:52 +msgid "to continue" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:28 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:32 +msgid "All Suppliers" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:103 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:107 +msgid "All Customers" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:186 +msgid "All Branches" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:256 +msgid "All Locations" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:538 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:542 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:613 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:617 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:726 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:757 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:770 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:799 +msgid "All Items" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:819 +msgid "Purchased" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:820 +msgid "Service" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1160 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1164 +msgid "All Work Centres" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1850 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1863 +msgid "All Types" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1852 +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1865 +msgid "Overdue Invoices" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1864 +msgid "Invoices" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1868 +msgid "Overdue Credit Notes" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1883 +msgid "Automatically put balance on back order" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_lists.inc:1884 +msgid "Cancel any quantites not delivered" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_msgs.inc:59 +msgid "in units of : " +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:51 +msgid "GL" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:301 +msgid "Date Voided:" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:392 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:408 +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:426 +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:66 +msgid "Included" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:463 +msgid "Total Amount" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:485 +msgid "Total Allocated:" +msgstr "" + +# c:\Apache2\htdocs\account/includes/ui/ui_view.inc:489 +msgid "Left to Allocate:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:17 +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:17 +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:17 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:17 +msgid "For Part :" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:53 +msgid "Detail:" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:58 +msgid "Positive Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/includes/item_adjustments_ui.inc:58 +msgid "Negative Adjustment" +msgstr "" + +# c:\Apache2\htdocs\account/inventory/includes/stock_transfers_ui.inc:38 +msgid "To Location:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:15 +msgid "The bill of material for this item is empty." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:22 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:54 +msgid "Total Cost" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:70 +msgid "There are no Requirements for this Order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:77 +msgid "Unit Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:77 +msgid "Total Quantity" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:77 +msgid "Units Issued" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:77 +msgid "On Hand" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:144 +msgid "There are no Productions for this Order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:187 +msgid "There are no Issues for this Order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:223 +msgid "There are no Payments for this Order." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:268 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:272 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:323 +msgid "Manufactured Item" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:269 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:273 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:324 +msgid "Into Location" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:303 +# c:\Apache2\htdocs\account/manufacturing/includes/manufacturing_ui.inc:348 +msgid "This work order is closed." +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:150 +msgid "Return Items to Location" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:150 +msgid "Issue Items to Work order" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:153 +msgid "To Work Centre:" +msgstr "" + +# c:\Apache2\htdocs\account/manufacturing/includes/work_order_issue_ui.inc:155 +msgid "Issue Date:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:16 +msgid "For Purchase Order" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:32 +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:44 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:243 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:248 +msgid "Deliver Into Location" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:38 +msgid "Date Items Received" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/grn_ui.inc:54 +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:261 +msgid "Order Comments" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:79 +msgid "Supplier's Ref.:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:91 +msgid "Terms:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:130 +msgid "Sub-total:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:138 +msgid "Invoice Total:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:140 +msgid "Credit Note Total:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:179 +msgid "GL Items for this Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:181 +msgid "GL Items for this Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:287 +msgid "Received Items Charged on this Invoice" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:289 +msgid "Received Items Credited on this Note" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/invoice_ui.inc:302 +msgid "Delivery Sequence #" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:80 +msgid "Supplier Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:111 +msgid "Supplier's Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:119 +msgid "Receive Into:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:123 +msgid "Get Address" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:146 +msgid "The default stock location set up for this user is not a currently defined stock location. Your system administrator needs to amend your user record." +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:150 +msgid "Deliver to:" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:163 +msgid "Order Items" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:168 +msgid "Required Delivery Date" +msgstr "" + +# c:\Apache2\htdocs\account/purchasing/includes/ui/po_ui.inc:209 +msgid "Total Excluding Shipping/Tax" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:4 +msgid "Cust no" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:13 +msgid "Your Ref" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:14 +msgid "Our Ref." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:15 +msgid "Your VAT no." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:16 +msgid "Our VAT No." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:19 +msgid "Domicile" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:20 +msgid "Please quote Invoice no. when paying. All amounts stated in" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:22 +msgid "Phone/Fax/Email" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:45 +msgid "DueDate" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:51 +msgid "Dear Sirs" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:52 +msgid "Attached you will find " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:53 +msgid "Kindest regards" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:57 +msgid "Invoice no." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:58 +msgid "Order no." +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:69 +msgid "TOTAL ORDER EX VAT" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:70 +msgid "TOTAL PO EX VAT" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:74 +msgid "Outstanding Transactions" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:77 +msgid "Statement" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/doctext.inc:78 +msgid "as of" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:6 +msgid "Sales Credit Note" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:15 +msgid "Cheque Withdrawal" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:16 +msgid "Cheque Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:18 +msgid "Cash Withdrawal" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:19 +msgid "Cash Deposit" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:21 +msgid "Inventory Release" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:22 +msgid "Inventory Add" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/form_types.inc:23 +msgid "Inventory Return" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:166 +msgid "Active" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:210 +msgid "Print Out Date" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:217 +msgid "Fiscal Year" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:244 +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:316 +msgid "Page" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:656 +msgid "sent to" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/pdf_report.inc:658 +msgid "NOT sent to" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:30 +msgid "Report Classes:" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:35 +msgid "Reports For Class: " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:112 +msgid "Display: " +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:123 +msgid "No Currency Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "No Graphics" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Vertical bars" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Horizontal bars" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Dots" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Lines" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Pie" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "Donut" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:167 +msgid "No Type Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:177 +msgid "No Account Group Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:194 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:202 +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:210 +msgid "No Dimension Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:216 +msgid "No Customer Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:225 +msgid "IV" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:226 +msgid "CN" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:250 +msgid "No Location Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:254 +msgid "No Category Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:262 +msgid "No Area Filter" +msgstr "" + +# c:\Apache2\htdocs\account/reporting/includes/reports_classes.inc:266 +msgid "No Sales Folk Filter" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/db/cust_trans_details_db.inc:69 +msgid "Write off" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:57 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:227 +msgid "Customer Currency:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:70 +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:236 +msgid "Customer Discount:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:240 +msgid "Items Returned to Location" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_credit_ui.inc:246 +msgid "Write off the cost of the items to" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:51 +msgid "The selected customer account is currently on hold. Please contact the credit control personnel to discuss." +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:82 +msgid "The selected customer and branch are not valid, or the customer does not have any branches." +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:346 +msgid "Invoice Delivery Details" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:350 +msgid "Order Delivery Details" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:358 +msgid "Deliver from Location:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:360 +msgid "Required Delivery Date:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:362 +msgid "Deliver To:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:365 +msgid "Contact Phone Number:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:373 +msgid "Customer Reference:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:374 +msgid "Comments:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:376 +msgid "Shipping Charge:" +msgstr "" + +# c:\Apache2\htdocs\account/sales/includes/ui/sales_order_ui.inc:378 +msgid "Shipping Company:" +msgstr "" + diff --git a/lang/new_language_template/stylesheet.css b/lang/new_language_template/stylesheet.css new file mode 100644 index 00000000..fd485a3f --- /dev/null +++ b/lang/new_language_template/stylesheet.css @@ -0,0 +1,17 @@ +/*--------------------------------------------------\ +| | | stylesheet.css | +|---------------------------------------------------| +| For use with: | +| OpenAccounting | +| http://open-accounting.sourceforge.net/ | +| by KylieTech Consulting | +|---------------------------------------------------| +| Developer: | +| Sherif Omar, Shane Barnaby | +| | +|---------------------------------------------------| +| Use this file to override the default styles for | +| this language. | +| | +| | +\--------------------------------------------------*/ \ No newline at end of file diff --git a/manufacturing/includes/db/index.php b/manufacturing/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/includes/db/work_centres_db.inc b/manufacturing/includes/db/work_centres_db.inc new file mode 100644 index 00000000..a1cffa01 --- /dev/null +++ b/manufacturing/includes/db/work_centres_db.inc @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/manufacturing/includes/db/work_order_issues_db.inc b/manufacturing/includes/db/work_order_issues_db.inc new file mode 100644 index 00000000..5bcfbad2 --- /dev/null +++ b/manufacturing/includes/db/work_order_issues_db.inc @@ -0,0 +1,128 @@ +quantity = -$item->quantity; + + // insert a -ve stock move for each item + add_stock_move(28, $item->stock_id, $number, + $location, $date_, $memo_, -$item->quantity, 0); + + $sql = "INSERT INTO ".TB_PREF."wo_issue_items (issue_id, stock_id, qty_issued) + VALUES ('$number', '$item->stock_id', $item->quantity)"; + db_query($sql,"A work order issue item could not be added"); + } + + if ($memo_) + add_comments(28, $number, $date_, $memo_); + + add_forms_for_sys_type(28, $number, $to_work_order, $location); + + references::save_last($ref, 28); + + commit_transaction(); +} + +//-------------------------------------------------------------------------------------- + +function get_work_order_issues($woid) +{ + $sql = "SELECT * FROM ".TB_PREF."wo_issues WHERE workorder_id=$woid ORDER BY issue_no"; + return db_query($sql, "The work order issues could not be retrieved"); +} + +//-------------------------------------------------------------------------------------- + +function get_work_order_issue($issue_no) +{ + $sql = "SELECT DISTINCT ".TB_PREF."wo_issues.*, ".TB_PREF."workorders.stock_id, + ".TB_PREF."stock_master.description, ".TB_PREF."locations.location_name, ".TB_PREF."workcentres.name AS WorkCentreName + FROM ".TB_PREF."wo_issues, ".TB_PREF."workorders, ".TB_PREF."stock_master, ".TB_PREF."locations, ".TB_PREF."workcentres + WHERE issue_no='$issue_no' + AND ".TB_PREF."workorders.id = ".TB_PREF."wo_issues.workorder_id + AND ".TB_PREF."locations.loc_code = ".TB_PREF."wo_issues.loc_code + AND ".TB_PREF."workcentres.id = ".TB_PREF."wo_issues.workcentre_id + AND ".TB_PREF."stock_master.stock_id = ".TB_PREF."workorders.stock_id"; + $result = db_query($sql, "A work order issue could not be retrieved"); + + return db_fetch($result); +} + +//-------------------------------------------------------------------------------------- + +function get_work_order_issue_details($issue_no) +{ + $sql = "SELECT ".TB_PREF."wo_issue_items.*,".TB_PREF."stock_master.description, ".TB_PREF."stock_master.units + FROM ".TB_PREF."wo_issue_items, ".TB_PREF."stock_master + WHERE issue_id=$issue_no + AND ".TB_PREF."stock_master.stock_id=".TB_PREF."wo_issue_items.stock_id + ORDER BY ".TB_PREF."wo_issue_items.id"; + return db_query($sql, "The work order issue items could not be retrieved"); +} + +//-------------------------------------------------------------------------------------- + +function exists_work_order_issue($issue_no) +{ + $sql = "SELECT issue_no FROM ".TB_PREF."wo_issues WHERE issue_no=$issue_no"; + $result = db_query($sql, "Cannot retreive a wo issue"); + + return (db_num_rows($result) > 0); +} + +//-------------------------------------------------------------------------------------- + +function void_work_order_issue($type_no) +{ + begin_transaction(); + + // void the actual issue items and their quantities + $sql = "UPDATE ".TB_PREF."wo_issue_items Set qty_issued = 0 WHERE issue_id=$type_no"; + db_query($sql,"A work order issue item could not be voided"); + + // void all related stock moves + void_stock_move(28, $type_no); + + // void any related gl trans + void_gl_trans(28, $type_no, true); + + commit_transaction(); +} + + +//-------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/manufacturing/includes/db/work_order_produce_items_db.inc b/manufacturing/includes/db/work_order_produce_items_db.inc new file mode 100644 index 00000000..c3da19dc --- /dev/null +++ b/manufacturing/includes/db/work_order_produce_items_db.inc @@ -0,0 +1,106 @@ + 0); +} + +//-------------------------------------------------------------------------------------------- + +function void_work_order_produce($type_no) +{ + begin_transaction(); + + $row = get_work_order_produce($type_no); + + // deduct the quantity of this production from the parent work order + work_order_update_finished_quantity($row["workorder_id"], -$row["quantity"]); + + // clear the production record + $sql = "UPDATE ".TB_PREF."wo_manufacture SET quantity=0 WHERE id=$type_no"; + db_query($sql, "Cannot void a wo production"); + + // void all related stock moves + void_stock_move(29, $type_no); + + // void any related gl trans + void_gl_trans(29, $type_no, true); + + commit_transaction(); +} + + +?> \ No newline at end of file diff --git a/manufacturing/includes/db/work_order_requirements_db.inc b/manufacturing/includes/db/work_order_requirements_db.inc new file mode 100644 index 00000000..9c528db9 --- /dev/null +++ b/manufacturing/includes/db/work_order_requirements_db.inc @@ -0,0 +1,69 @@ + \ No newline at end of file diff --git a/manufacturing/includes/db/work_orders_db.inc b/manufacturing/includes/db/work_orders_db.inc new file mode 100644 index 00000000..81aca2bd --- /dev/null +++ b/manufacturing/includes/db/work_orders_db.inc @@ -0,0 +1,212 @@ + 0); +} + + +//-------------------------------------------------------------------------------------- + +function work_order_has_issues($woid) +{ + $sql = "SELECT COUNT(*) FROM ".TB_PREF."wo_issues WHERE workorder_id=$woid"; + $result = db_query($sql, "query work order for issues"); + + $myrow = db_fetch_row($result); + return ($myrow[0] > 0); +} + +//-------------------------------------------------------------------------------------- + +function work_order_has_payments($woid) +{ + $result = get_bank_trans(null, null, payment_person_types::WorkOrder(), $woid); + + return (db_num_rows($result) != 0); +} + +//-------------------------------------------------------------------------------------- + +function release_work_order($woid, $releaseDate, $memo_) +{ + begin_transaction(); + + $myrow = get_work_order($woid); + $stock_id = $myrow["stock_id"]; + + $date = date2sql($releaseDate); + + $sql = "UPDATE ".TB_PREF."workorders SET released_date='$date', + released=1 WHERE id = $woid"; + db_query($sql, "could not release work order"); + + // create Work Order Requirements based on the bom + create_wo_requirements($woid, $stock_id); + + add_comments(systypes::work_order(), $woid, $releaseDate, $memo_); + + commit_transaction(); +} + +//-------------------------------------------------------------------------------------- + +function close_work_order($woid) +{ + $sql = "UPDATE ".TB_PREF."workorders SET closed=1 WHERE id = $woid"; + db_query($sql, "could not close work order"); +} + +//-------------------------------------------------------------------------------------- + +function work_order_is_closed($woid) +{ + $sql = "SELECT closed FROM ".TB_PREF."workorders WHERE id = $woid"; + $result = db_query($sql, "could not query work order"); + $row = db_fetch_row($result); + return ($row[0] > 0); +} + +//-------------------------------------------------------------------------------------- + +function work_order_update_finished_quantity($woid, $quantity, $force_close=0) +{ + $sql = "UPDATE ".TB_PREF."workorders SET units_issued = units_issued + $quantity, + closed = ((units_issued >= units_reqd) OR $force_close) + WHERE id = $woid"; + + db_query($sql, "The work order issued quantity couldn't be updated"); +} + +//-------------------------------------------------------------------------------------- + +function void_work_order($woid) +{ + $work_order = get_work_order($woid); + + if (!($work_order["type"] == wo_types::advanced())) + { + begin_transaction(); + + $sql = "UPDATE ".TB_PREF."workorders SET closed=1,units_issued=0 WHERE id = $woid"; + db_query($sql, "The work order couldn't be voided"); + + // void all related stock moves + void_stock_move(systypes::work_order(), $woid); + + // void any related gl trans + void_gl_trans(systypes::work_order(), $woid, true); + + // clear the requirements units received + void_wo_requirements($woid); + + commit_transaction(); + } + else + { + // void everything inside the work order : issues, productions, payments + } +} + +//-------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/manufacturing/includes/db/work_orders_quick_db.inc b/manufacturing/includes/db/work_orders_quick_db.inc new file mode 100644 index 00000000..b3eca142 --- /dev/null +++ b/manufacturing/includes/db/work_orders_quick_db.inc @@ -0,0 +1,108 @@ + \ No newline at end of file diff --git a/manufacturing/includes/index.php b/manufacturing/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/includes/manufacturing_db.inc b/manufacturing/includes/manufacturing_db.inc new file mode 100644 index 00000000..69ae13ea --- /dev/null +++ b/manufacturing/includes/manufacturing_db.inc @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/manufacturing/includes/manufacturing_ui.inc b/manufacturing/includes/manufacturing_ui.inc new file mode 100644 index 00000000..b903d2c8 --- /dev/null +++ b/manufacturing/includes/manufacturing_ui.inc @@ -0,0 +1,352 @@ +" . _("Total Cost") . "", "" . number_format2($total_cost,user_price_dec()) ."", + "colspan=6 align=right", "nowrap align=right"); + end_table(); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_requirements($woid, $quantity, $show_qoh=false, $date=null) +{ + global $table_style; + + $result = get_wo_requirements($woid); + + if (db_num_rows($result) == 0) + { + display_note(_("There are no Requirements for this Order."), 1, 0); + } + else + { + + start_table("$table_style width=80%"); + $th = array(_("Component"), _("From Location"), _("Work Centre"), + _("Unit Quantity"), _("Total Quantity"), _("Units Issued"), _("On Hand")); + + table_header($th); + + $k = 0; //row colour counter + $has_marked = false; + + if ($date == null) + $date = Today(); + + while ($myrow = db_fetch($result)) + { + + $qoh = 0; + + // if it's a non-stock item (eg. service) don't show qoh + if (!has_stock_holding($myrow["mb_flag"])) + $show_qoh = false; + + if ($show_qoh) + $qoh = get_qoh_on_date($myrow["stock_id"], $myrow["loc_code"], $date); + + if ($show_qoh && ($myrow["units_req"] * $quantity > $qoh) && + !sys_prefs::allow_negative_stock()) + { + // oops, we don't have enough of one of the component items + start_row("class='stockmankobg'"); + $has_marked = true; + } + else + alt_table_row_color($k); + + if (user_show_codes()) + label_cell($myrow["stock_id"]. " - " . $myrow["description"]); + else + label_cell($myrow["description"]); + + label_cell($myrow["location_name"]); + label_cell($myrow["WorkCentreDescription"]); + qty_cell($myrow["units_req"]); + qty_cell($myrow["units_req"] * $quantity); + qty_cell($myrow["units_issued"]); + if ($show_qoh) + qty_cell($qoh); + else + label_cell(""); + end_row(); + + } + + end_table(); + + if ($has_marked) + display_note(_("Marked items have insufficient quantities in stock."), 0, 0, "class='red'"); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_productions($woid) +{ + global $path_to_root, $table_style; + + $result = get_work_order_productions($woid); + + if (db_num_rows($result) == 0) + { + display_note(_("There are no Productions for this Order."), 1, 1); + } + else + { + start_table($table_style); + $th = array(_("#"), _("Reference"), _("Date"), _("Quantity")); + + table_header($th); + + $k = 0; //row colour counter + $total_qty = 0; + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + $total_qty += $myrow['quantity']; + + label_cell(get_trans_view_str(29, $myrow["id"])); + label_cell($myrow['reference']); + label_cell(sql2date($myrow["date_"])); + qty_cell($myrow['quantity']); + end_row(); + }//end of while + + label_row(_("Total"), number_format2($total_qty,user_qty_dec()), + "colspan=3", "nowrap align=right"); + + end_table(); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_issues($woid) +{ + global $path_to_root, $table_style; + + $result = get_work_order_issues($woid); + + if (db_num_rows($result) == 0) + { + display_note(_("There are no Issues for this Order."), 0, 1); + } + else + { + start_table($table_style); + $th = array(_("#"), _("Reference"), _("Date")); + + table_header($th); + + $k = 0; //row colour counter + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + label_cell(get_trans_view_str(28, $myrow["issue_no"])); + label_cell($myrow['reference']); + label_cell(sql2date($myrow["issue_date"])); + end_row(); + } + + end_table(); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_payments($woid) +{ + global $path_to_root, $table_style; + + $result = get_bank_trans(null, null, payment_person_types::WorkOrder(), $woid); + + if (db_num_rows($result) == 0) + { + echo _("There are no Payments for this Order.") . "
"; + } + else + { + start_table($table_style); + $th = array(_("#"), _("Reference"), _("Date"), _("Amount")); + + table_header($th); + + $k = 0; //row colour counter + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + label_cell(get_trans_view_str(1, $myrow["trans_no"])); + label_cell($myrow['ref']); + label_cell(sql2date($myrow["trans_date"])); + amount_cell(-($myrow['amount'])); + label_cell($myrow['bank_curr_code']); + end_row(); + } + + end_table(); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_details($woid, $suppress_view_link=false) +{ + global $table_style; + + $myrow = get_work_order($woid); + + if (strlen($myrow[0]) == 0) + { + display_note(_("The work order number sent is not valid.")); + exit; + } + + start_table("$table_style width=80%"); + + if ($myrow["released"] == true) + $th = array(_("#"), _("Reference"), _("Type"), _("Manufactured Item"), + _("Into Location"), _("Date"), _("Required By"), _("Quantity Required"), + _("Released Date"), _("Manufactured")); + else + $th = array(_("#"), _("Reference"), _("Type"), _("Manufactured Item"), + _("Into Location"), _("Date"), _("Required By"), _("Quantity Required")); + + table_header($th); + start_row(); + if ($suppress_view_link) + label_cell($myrow["id"]); + else + label_cell(get_trans_view_str(systypes::work_order(), $myrow["id"])); + label_cell($myrow["wo_ref"]); + label_cell(wo_types::name($myrow["type"])); + view_stock_status_cell($myrow["stock_id"], $myrow["StockItemName"]); + label_cell($myrow["location_name"]); + label_cell(sql2date($myrow["date_"])); + label_cell(sql2date($myrow["required_by"])); + + qty_cell($myrow["units_reqd"]); + + if ($myrow["released"] == true) + { + label_cell(sql2date($myrow["released_date"])); + qty_cell($myrow["units_issued"]); + } + end_row(); + + comments_display_row(systypes::work_order(), $woid); + + end_table(); + + if ($myrow["closed"] == true) + { + display_note(_("This work order is closed.")); + } +} + +//-------------------------------------------------------------------------------------- + +function display_wo_details_quick($woid, $suppress_view_link=false) +{ + global $table_style; + + $myrow = get_work_order($woid); + + if (strlen($myrow[0]) == 0) + { + display_note(_("The work order number sent is not valid.")); + exit; + } + + start_table("$table_style width=80%"); + + $th = array(_("#"), _("Reference"), _("Type"), _("Manufactured Item"), + _("Into Location"), _("Date"), _("Quantity")); + table_header($th); + + start_row(); + if ($suppress_view_link) + label_cell($myrow["id"]); + else + label_cell(get_trans_view_str(systypes::work_order(), $myrow["id"])); + label_cell($myrow["wo_ref"]); + label_cell(wo_types::name($myrow["type"])); + view_stock_status_cell($myrow["stock_id"], $myrow["StockItemName"]); + label_cell($myrow["location_name"]); + label_cell(sql2date($myrow["date_"])); + + qty_cell($myrow["units_issued"]); + + end_row(); + + comments_display_row(systypes::work_order(), $woid); + + end_table(); + + if ($myrow["closed"] == true) + { + display_note(_("This work order is closed.")); + } +} + +?> \ No newline at end of file diff --git a/manufacturing/includes/work_order_issue_ui.inc b/manufacturing/includes/work_order_issue_ui.inc new file mode 100644 index 00000000..c81b7792 --- /dev/null +++ b/manufacturing/includes/work_order_issue_ui.inc @@ -0,0 +1,165 @@ +line_items as $order_item) + { + if (strcasecmp($order_item->stock_id, $new_item) == 0) + { + $already_on_order = 1; + display_error(_("For Part :") . $new_item . " " . "This item is already on this order. You can change the quantity ordered of the existing line if necessary."); + } + } + + if ($already_on_order != 1) + { + $order->add_to_cart($new_item, $new_item_qty, $standard_cost); + } /* end of if not already on the order */ +} + +//-------------------------------------------------------------------------------- + +function display_order_header(&$order) +{ + display_wo_details($_SESSION['issue_items']->order_id); + echo "
"; +} + +//--------------------------------------------------------------------------------- + +function display_adjustment_items($Title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($Title); + start_table("$table_style colspan=7"); + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Unit Cost")); + table_header($th); + + $subtotal = 0; + $k = 0; //row colour counter + + foreach ($order->line_items as $stock_item) + { + + if ($_GET['Edit'] != $stock_item->stock_id) + { + alt_table_row_color($k); + + label_cell("$stock_item->stock_id"); + label_cell($stock_item->item_description); + qty_cell($stock_item_quantity); + if (strlen($stock_item->units) + label_cell($stock_item->units); + else + label_cell(""); + amount_cell($stock_item->standard_cost); + + edit_link_cell(SID . "Edit=$stock_item->stock_id"); + delete_link_cell(SID . "Delete=$stock_item->stock_id"); + end_row(); + } + else + { + adjustment_edit_item_controls($order, $stock_item->stock_id); + } + } + + if (!isset($_GET['Edit'])) + adjustment_edit_item_controls($order); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function adjustment_edit_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) && $stock_id != null) + { + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$stock_id]->stock_id; + if (!isset($_POST['qty']) || ($_POST['qty'] == "")) + $_POST['qty'] = $order->line_items[$stock_id]->quantity; + if (!isset($_POST['std_cost']) || ($_POST['std_cost'] == "")) + $_POST['std_cost'] = $order->line_items[$stock_id]->standard_cost; + + $_POST['units'] = $order->line_items[$stock_id]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$stock_id]->item_description); + } + else + { + $wo_details = get_work_order($_SESSION['issue_items']->order_id); + + echo ""; + stock_component_items_list('stock_id', $wo_details["stock_id"], $_POST['stock_id'], false, true); + echo ""; + + $item_info = get_item_edit_info($_POST['stock_id']); + + $_POST['qty'] = 0; + $_POST['std_cost'] = $item_info["standard_cost"]; + $_POST['units'] = $item_info["units"]; + } + + + text_cells(null, 'qty', $_POST['qty'], 13, 15); + label_cell($_POST['units']); + text_cells(null, 'std_cost', $_POST['std_cost'], 15, 14); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add Item"), "colspan=2"); + } + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function adjustment_options_controls() +{ + echo "
"; + start_table(); + + ref_row(_("Reference:"), 'ref', references::get_next(28)); + + if (!isset($_POST['IssueType'])) + $_POST['IssueType'] = 0; + + yesno_list_row(_("Type:"), 'IssueType', $_POST['IssueType'], + _("Return Items to Location"), _("Issue Items to Work order")); + + locations_list_row(_("From Location:"), 'Location', $_POST['Location']); + workcenter_list_row(_("To Work Centre:"), 'WorkCentre', $_POST['WorkCentre']); + + date_row(_("Issue Date:"), 'date_'); + + textarea_row(_("Memo:"), 'memo_', $_POST['memo_'], 50, 3); + + end_table(); +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/manufacturing/index.php b/manufacturing/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/inquiry/bom_cost_inquiry.php b/manufacturing/inquiry/bom_cost_inquiry.php new file mode 100644 index 00000000..26795c14 --- /dev/null +++ b/manufacturing/inquiry/bom_cost_inquiry.php @@ -0,0 +1,39 @@ + " . _("Item:") . " "; +stock_bom_items_list('stock_id', $_POST['stock_id'], false, true); + +echo "
"; + +if ($_POST['stock_id'] != "") +{ + echo "
" . _("All Costs Are In:") . " " . get_company_currency() . "

"; + display_bom($_POST['stock_id']); +} +else +{ //no item entered + echo "

" ._("Enter an item code above, to view the costed bill of material for.") . "

"; +} +end_form(); + +end_page(); +?> diff --git a/manufacturing/inquiry/index.php b/manufacturing/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/inquiry/where_used_inquiry.php b/manufacturing/inquiry/where_used_inquiry.php new file mode 100644 index 00000000..9304c197 --- /dev/null +++ b/manufacturing/inquiry/where_used_inquiry.php @@ -0,0 +1,78 @@ +" . _("Select an item to display its parent item(s).") . " "; +stock_items_list('stock_id', $_POST['stock_id'], false, true); +echo "
"; + +set_global_stock_item($_POST['stock_id']); + +if (isset($_POST['stock_id'])) +{ + $sql = "SELECT ".TB_PREF."bom.*,".TB_PREF."stock_master.description,".TB_PREF."workcentres.name As WorkCentreName, ".TB_PREF."locations.location_name + FROM ".TB_PREF."bom, ".TB_PREF."stock_master, ".TB_PREF."workcentres, ".TB_PREF."locations + WHERE ".TB_PREF."bom.parent = ".TB_PREF."stock_master.stock_id AND ".TB_PREF."bom.workcentre_added = ".TB_PREF."workcentres.id + AND ".TB_PREF."bom.loc_code = ".TB_PREF."locations.loc_code + AND ".TB_PREF."bom.component='" . $_POST['stock_id'] . "'"; + + $result = db_query($sql,"No parent items were returned"); + + if (db_num_rows($result) == 0) + { + display_note(_("The selected item is not used in any BOMs.")); + } + else + { + + start_table("$table_style width=80%"); + + $th = array(_("Parent Item"), _("Work Centre"), _("Location"), _("Quantity Required")); + table_header($th); + + $k = $j = 0; + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + $select_item = $path_to_root . "/manufacturing/manage/bom_edit.php?" . SID . "stock_id=" . $myrow["parent"]; + + label_cell("" . $myrow["parent"]. " - " . $myrow["description"]. ""); + label_cell($myrow["WorkCentreName"]); + label_cell($myrow["location_name"]); + label_cell($myrow["quantity"]); + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } + //end of page full new headings if + } + + end_table(); + } +} + +end_form(); +end_page(); + +?> \ No newline at end of file diff --git a/manufacturing/manage/bom_edit.php b/manufacturing/manage/bom_edit.php new file mode 100644 index 00000000..559b79a2 --- /dev/null +++ b/manufacturing/manage/bom_edit.php @@ -0,0 +1,286 @@ +" . _("Select a manufacturable item:") . " "; +stock_bom_items_list('stock_id', null, false, true); + +end_form(); + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['stock_id'])) +{ //Parent Item selected so display bom or edit component + $selected_parent = $_POST['stock_id']; + + if (isset($selected_parent) && isset($_POST['Submit'])) + on_submit($selected_parent, $selected_component); + + //-------------------------------------------------------------------------------------- + + display_bom_items($selected_parent); + + if (isset($selected_parent) && isset($selected_component)) + { + hyperlink_params($_SERVER['PHP_SELF'], _("Add a new Component"), "NewItem=$selected_parent"); + } + + //-------------------------------------------------------------------------------------- + + start_form(false, true, $_SERVER['PHP_SELF'] . "?" . SID . "NewItem=" . $selected_parent); + + start_table($table_style2); + + if (isset($selected_component)) + { + //editing a selected component from the link to the line item + $sql = "SELECT ".TB_PREF."bom.*,".TB_PREF."stock_master.description FROM ".TB_PREF."bom,".TB_PREF."stock_master + WHERE id='$selected_component' + AND ".TB_PREF."stock_master.stock_id=".TB_PREF."bom.component"; + + $result = db_query($sql, "could not get bom"); + $myrow = db_fetch($result); + + $_POST['loc_code'] = $myrow["loc_code"]; + $_POST['workcentre_added'] = $myrow["workcentre_added"]; + $_POST['quantity'] = $myrow["quantity"]; + + hidden('selected_parent', $selected_parent); + hidden('selected_component', $selected_component); + label_row(_("Component:"), $myrow["component"] . " - " . $myrow["description"]); + + } + else + { //end of if $selected_component + + hidden('selected_parent', $selected_parent); + + start_row(); + label_cell(_("Component:")); + + echo ""; + stock_component_items_list('component', $selected_parent, $_POST['component'], false, true); + echo ""; + end_row(); + } + + locations_list_row(_("Location to Draw From:"), 'loc_code', null); + workcenter_list_row(_("Work Centre Added:"), 'workcentre_added', null); + + if (!isset($_POST['quantity'])) + { + $_POST['quantity'] = 1; + } + text_row(_("Quantity:"), 'quantity', $_POST['quantity'], 10, 18); + + end_table(1); + submit_center('Submit', _("Add/Update")); + + end_form(); +} + +// ---------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/manufacturing/manage/index.php b/manufacturing/manage/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/manage/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/manage/work_centres.php b/manufacturing/manage/work_centres.php new file mode 100644 index 00000000..865fecd8 --- /dev/null +++ b/manufacturing/manage/work_centres.php @@ -0,0 +1,148 @@ + 0) + { + display_error(_("Cannot delete this work centre because BOMs have been created referring to it.")); + return false; + } + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."wo_requirements WHERE workcentre='$selected_id'"; + $result = db_query($sql, "check can delete work centre"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this work centre because work order requirements have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_work_centre($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_work_centres(); + +start_table("$table_style width=50%"); +$th = array(_("Name"), _("description"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["name"]); + label_cell($myrow["description"]); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Work Centre")); + +start_form(); + +start_table($table_style2); + +if (isset($selected_id)) +{ + //editing an existing status code + + $myrow = get_work_centre($selected_id); + + $_POST['name'] = $myrow["name"]; + $_POST['description'] = $myrow["description"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Name:"), 'name', 40); +text_row_ex(_("Description:"), 'description', 50); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/manufacturing/search_work_orders.php b/manufacturing/search_work_orders.php new file mode 100644 index 00000000..3091a75c --- /dev/null +++ b/manufacturing/search_work_orders.php @@ -0,0 +1,165 @@ + 0) + { + start_row("class='overduebg'"); + } + else + alt_table_row_color($k); + + $modify_page = $path_to_root . "/manufacturing/work_order_entry.php?" . SID . "trans_no=" . $myrow["id"]; + $release_page = $path_to_root . "/manufacturing/work_order_release.php?" . SID . "trans_no=" . $myrow["id"]; + if ($myrow["closed"] == 0) + { + $issue = $path_to_root . "/manufacturing/work_order_issue.php?" . SID . "trans_no=" .$myrow["id"]; + $add_finished = $path_to_root . "/manufacturing/work_order_add_finished.php?" . SID . "trans_no=" .$myrow["id"]; + $costs = $path_to_root . "/gl/gl_payment.php?NewPayment=1&PayType=" . payment_person_types::WorkOrder(). "&PayPerson=" .$myrow["id"]; + $can_issue = $myrow["released"]; + $issue_link = $can_issue?("" . _("Issue") . " + " . _("Produce") . " + " . _("Costs") . ""): _("Not Released"); + } + else + { + $issue_link = ""; + } + + label_cell(get_trans_view_str(systypes::work_order(), $myrow["id"])); + label_cell(get_trans_view_str(systypes::work_order(), $myrow["id"], $myrow["wo_ref"])); + label_cell(wo_types::name($myrow["type"])); + label_cell($myrow["location_name"]); + view_stock_status_cell($myrow["stock_id"], $myrow["description"]); + qty_cell($myrow["units_reqd"]); + qty_cell($myrow["units_issued"]); + label_cell(sql2date($myrow["date_"])); + label_cell(sql2date($myrow["required_by"])); + label_cell(($myrow["closed"]? _("Yes"):_("No"))); + if ($issue_link != "") + label_cell($issue_link); + if ($myrow["released"] == 0) + { + label_cell("" . _("Release") . ""); + } + if ($myrow["closed"] == 0) + { + label_cell("" . _("Edit") . ""); + } + + label_cell(get_gl_view_str(systypes::work_order(), $myrow["id"])); + + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } + //end of page full new headings if +} +//end of while loop + +end_table(1); + +//--------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/manufacturing/view/index.php b/manufacturing/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/manufacturing/view/index.php @@ -0,0 +1,3 @@ + diff --git a/manufacturing/view/wo_issue_view.php b/manufacturing/view/wo_issue_view.php new file mode 100644 index 00000000..19b62bc0 --- /dev/null +++ b/manufacturing/view/wo_issue_view.php @@ -0,0 +1,116 @@ +" . _("There are no items for this issue."); + } + else + { + start_table($table_style); + $th = array(_("Component"), _("Quantity"), _("Units")); + + table_header($th); + + $j = 1; + $k = 0; //row colour counter + + $total_cost = 0; + + while ($myrow = db_fetch($result)) + { + + alt_table_row_color($k); + + label_cell($myrow["stock_id"] . " - " . $myrow["description"]); + qty_cell($myrow["qty_issued"]); + label_cell($myrow["units"]); + end_row();; + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + }//end of page full new headings if + }//end of while + + end_table(); + } +} + +//------------------------------------------------------------------------------------------------- + +display_heading(systypes::name(28) . " # " . $wo_issue_no); + +display_wo_issue($wo_issue_no); + +display_heading2(_("Items for this Issue")); + +display_wo_issue_details($wo_issue_no); + +//------------------------------------------------------------------------------------------------- + +echo "
"; + +end_page(true); + +?> + diff --git a/manufacturing/view/wo_production_view.php b/manufacturing/view/wo_production_view.php new file mode 100644 index 00000000..002c9ef7 --- /dev/null +++ b/manufacturing/view/wo_production_view.php @@ -0,0 +1,66 @@ + + diff --git a/manufacturing/view/work_order_view.php b/manufacturing/view/work_order_view.php new file mode 100644 index 00000000..fb28310c --- /dev/null +++ b/manufacturing/view/work_order_view.php @@ -0,0 +1,69 @@ +"; + +// display the WO requirements +echo "
"; +if ($myrow["released"] == false) +{ + display_heading2(_("BOM for item:") . " " . $myrow["StockItemName"]); + display_bom($myrow["stock_id"]); +} +else +{ + display_heading2(_("Work Order Requirements")); + display_wo_requirements($woid, $myrow["units_reqd"]); + if ($myrow["type"] == wo_types::advanced()) + { + echo "
"; + display_heading2(_("Issues")); + display_wo_issues($woid); + echo ""; + display_heading2(_("Productions")); + display_wo_productions($woid); + echo ""; + display_heading2(_("Payments")); + display_wo_payments($woid); + echo "
"; + } +} + +echo "
"; + +is_voided_display(systypes::work_order(), $woid, _("This work order has been voided.")); + +end_page(true); + +?> diff --git a/manufacturing/work_order_add_finished.php b/manufacturing/work_order_add_finished.php new file mode 100644 index 00000000..2771994a --- /dev/null +++ b/manufacturing/work_order_add_finished.php @@ -0,0 +1,166 @@ + 0) + { + display_error(_("The production date cannot be before the release date of the work order.")); + return false; + } + + // if unassembling we need to check the qoh + if (($_POST['ProductionType'] == 0) && !sys_prefs::allow_negative_stock()) + { + $wo_details = get_work_order($_POST['selected_id']); + + $qoh = get_qoh_on_date($wo_details["stock_id"], $wo_details["loc_code"], $date_); + if (-$_POST['quantity'] + $qoh < 0) + { + display_error(_("The unassembling cannot be processed because there is insufficient stock.")); + return false; + } + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['Process']) || (isset($_POST['ProcessAndClose']) && can_process() == true)) +{ + + $close_wo = 0; + if (isset($_POST['ProcessAndClose']) && ($_POST['ProcessAndClose']!="")) + $close_wo = 1; + + // if unassembling, negate quantity + if ($_POST['ProductionType'] == 0) + $_POST['quantity'] = -$_POST['quantity']; + + $id = work_order_produce($_POST['selected_id'], $_POST['ref'], $_POST['quantity'], + $_POST['date_'], $_POST['memo_'], $close_wo); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$id"); +} + +//------------------------------------------------------------------------------------- + +display_wo_details($_POST['selected_id']); + +//------------------------------------------------------------------------------------- + +start_form(); + +hidden('selected_id', $_POST['selected_id']); +//hidden('WOReqQuantity', $_POST['WOReqQuantity']); + +if (!isset($_POST['quantity']) || $_POST['quantity'] == '') +{ + $_POST['quantity'] = max($wo_details["units_reqd"] - $wo_details["units_issued"], 0); +} + +start_table(); + +ref_row(_("Reference:"), 'ref', references::get_next(29)); + +if (!isset($_POST['ProductionType'])) + $_POST['ProductionType'] = 1; + +yesno_list_row(_("Type:"), 'ProductionType', $_POST['ProductionType'], + _("Produce Finished Items"), _("Return Items to Work Order")); + +text_row(_("Quantity:"), 'quantity', $_POST['quantity'], 13, 15); + +date_row(_("Date:"), 'date_'); + +textarea_row(_("Memo:"), 'memo_', null, 40, 3); + +end_table(1); + +submit_center_first('Process', _("Process")); +submit_center_last('ProcessAndClose', _("Process And Close Order")); + +end_form(); + +end_page(); + +?> \ No newline at end of file diff --git a/manufacturing/work_order_entry.php b/manufacturing/work_order_entry.php new file mode 100644 index 00000000..8b9c10f7 --- /dev/null +++ b/manufacturing/work_order_entry.php @@ -0,0 +1,403 @@ +"; + end_form(); + end_page(); + exit; +} + +//------------------------------------------------------------------------------------- +if (!isset($_POST['date_'])) +{ + $_POST['date_'] = Today(); + if (!is_date_in_fiscalyear($_POST['date_'])) + $_POST['date_'] = end_fiscalyear(); +} + +function can_process() +{ + global $selected_id; + + if (!isset($selected_id)) + { + if (!references::is_valid($_POST['wo_ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['wo_ref'], systypes::work_order())) + { + display_error(_("The entered reference is already in use.")); + return false; + } + } + + if (!is_numeric($_POST['quantity'])) + { + display_error( _("The quantity entered must be numeric.")); + return false; + } + + if ($_POST['quantity'] <= 0) + { + display_error( _("The quantity entered must be a positive number greater than zero.")); + return false; + } + + if (!is_date($_POST['date_'])) + { + display_error( _("The date entered is in an invalid format.")); + return false; + } + elseif (!is_date_in_fiscalyear($_POST['date_'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + // only check bom and quantites if quick assembly + if (!($_POST['type'] == wo_types::advanced())) + { + if (!has_bom($_POST['stock_id'])) + { + display_error(_("The selected item to manufacture does not have a bom.")); + return false; + } + + if (!is_numeric($_POST['Costs'])) + { + display_error( _("The cost entered must be numeric.")); + return false; + } + + if ($_POST['Costs'] < 0) + { + display_error( _("The cost entered cannot be negative.")); + return false; + } + + if (!sys_prefs::allow_negative_stock()) + { + if ($_POST['type'] == wo_types::assemble()) + { + // check bom if assembling + $result = get_bom($_POST['stock_id']); + + while ($bom_item = db_fetch($result)) + { + + if (has_stock_holding($bom_item["ResourceType"])) + { + + $quantity = $bom_item["quantity"] * $_POST['quantity']; + + $qoh = get_qoh_on_date($bom_item["component"], $bom_item["loc_code"], $_POST['date_']); + if (-$quantity + $qoh < 0) + { + display_error(_("The work order cannot be processed because there is an insufficient quantity for component:") . + " " . $bom_item["component"] . " - " . $bom_item["description"] . ". " . _("Location:") . " " . $bom_item["location_name"]); + return false; + } + } + } + } + elseif ($_POST['type'] == wo_types::unassemble()) + { + // if unassembling, check item to unassemble + $qoh = get_qoh_on_date($_POST['stock_id'], $_POST['StockLocation'], $_POST['date_']); + if (-$_POST['quantity'] + $qoh < 0) + { + display_error(_("The selected item cannot be unassembled because there is insufficient stock.")); + return false; + } + } + } + } + else + { + if (!is_date($_POST['RequDate'])) + { + display_error( _("The date entered is in an invalid format.")); + return false; + } + //elseif (!is_date_in_fiscalyear($_POST['RequDate'])) + //{ + // display_error(_("The entered date is not in fiscal year.")); + // return false; + //} + if (isset($selected_id)) + { + $myrow = get_work_order($selected_id, true); + + if ($_POST['units_issued'] > $_POST['quantity']) + { + display_error(_("The quantity cannot be changed to be less than the quantity already manufactured for this order.")); + return false; + } + } + } + + return true; +} + +//------------------------------------------------------------------------------------- + +if (isset($_POST['ADD_ITEM']) && can_process()) +{ + + $id = add_work_order($_POST['wo_ref'], $_POST['StockLocation'], $_POST['quantity'], + $_POST['stock_id'], $_POST['type'], $_POST['date_'], + $_POST['RequDate'], $_POST['Costs'], $_POST['memo_']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$id"); +} + +//------------------------------------------------------------------------------------- + +if (isset($_POST['UPDATE_ITEM']) && can_process()) +{ + + update_work_order($selected_id, $_POST['StockLocation'], $_POST['quantity'], + $_POST['stock_id'], $_POST['date_'], $_POST['RequDate'], $_POST['memo_']); + + meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$selected_id"); +} + +//-------------------------------------------------------------------------------------- + +if (isset($_POST['delete'])) +{ + //the link to delete a selected record was clicked instead of the submit button + + $cancel_delete = false; + + // can't delete it there are productions or issues + if (work_order_has_productions($selected_id) || + work_order_has_issues($selected_id) || + work_order_has_payments($selected_id)) + { + display_error(_("This work order cannot be deleted because it has already been processed.")); + $cancel_delete = true; + } + + if ($cancel_delete == false) + { //ie not cancelled the delete as a result of above tests + + // delete the actual work order + delete_work_order($selected_id); + meta_forward($_SERVER['PHP_SELF'], "DeletedID=$selected_id"); + } +} + +//------------------------------------------------------------------------------------- + +if (isset($_POST['close'])) +{ + + // update the closed flag in the work order + close_work_order($selected_id); + meta_forward($_SERVER['PHP_SELF'], "ClosedID=$selected_id"); +} + +//------------------------------------------------------------------------------------- + +start_form(); + +start_table($table_style2); + +$existing_comments = ""; + +if (isset($selected_id)) +{ + $myrow = get_work_order($selected_id); + + if (strlen($myrow[0]) == 0) + { + echo _("The order number sent is not valid."); + safe_exit(); + } + + // if it's a closed work order can't edit it + if ($myrow["closed"] == 1) + { + echo "
"; + display_error(_("This work order is closed and cannot be edited.")); + safe_exit(); + } + + $_POST['wo_ref'] = $myrow["wo_ref"]; + $_POST['quantity'] = $myrow["units_reqd"]; + $_POST['StockLocation'] = $myrow["loc_code"]; + $_POST['released'] = $myrow["released"]; + $_POST['closed'] = $myrow["closed"]; + $_POST['stock_id'] = $myrow["stock_id"]; + $_POST['type'] = $myrow["type"]; + $_POST['date_'] = sql2date($myrow["date_"]); + $_POST['RequDate'] = sql2date($myrow["required_by"]); + $_POST['released_date'] = sql2date($myrow["released_date"]); + $_POST['memo_'] = ""; + $_POST['units_issued'] = $myrow["units_issued"]; + $_POST['Costs'] = $myrow["Costs"]; + + $_POST['memo_'] = get_comments_string(systypes::work_order(), $selected_id); + + hidden('wo_ref', $_POST['wo_ref']); + hidden('units_issued', $_POST['units_issued']); + hidden('released', $_POST['released']); + hidden('released_date', $_POST['released_date']); + hidden('selected_id', $selected_id); + + label_row(_("Reference:"), $_POST['wo_ref']); + label_row(_("Type:"), wo_types::name($_POST['type'])); +} +else +{ + $_POST['units_issued'] = $_POST['released'] = 0; + ref_row(_("Reference:"), 'wo_ref', references::get_next(systypes::work_order())); + + wo_types_list_row(_("Type:"), 'type', $_POST['type']); +} + +if ($_POST['released'] == true) +{ + hidden('stock_id', $_POST['stock_id']); + hidden('StockLocation', $_POST['StockLocation']); + hidden('type', $_POST['type']); + + label_row(_("Item:"), $myrow["StockItemName"]); + label_row(_("Destination Location:"), $myrow["location_name"]); +} +else +{ + stock_manufactured_items_list_row(_("Item:"), 'stock_id', null); + + locations_list_row(_("Destination Location:"), 'StockLocation', null); +} + +if (!isset($_POST['quantity'])) + $_POST['quantity'] = 1; + +if ($_POST['type'] == wo_types::advanced()) +{ + text_row_ex(_("Quantity Required:"), 'quantity', 12); + if ($_POST['released']) + label_row(_("Quantity Manufactured:"), $_POST['units_issued']); + date_row(_("Date") . ":", 'date_'); + date_row(_("Date Required By") . ":", 'RequDate', null, sys_prefs::default_wo_required_by()); +} +else +{ + text_row_ex(_("Quantity:"), 'quantity', 12); + date_row(_("Date") . ":", 'date_'); + hidden('RequDate', ''); + + if (!isset($_POST['Costs'])) + $_POST['Costs'] = 0; + + amount_row(_("Total Additional Costs:"), 'Costs'); +} + +if ($_POST['released']) + label_row(_("Released On:"),$_POST['released_date']); + +textarea_row(_("Memo:"), 'memo_', null, 40, 5); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +if (isset($selected_id)) +{ + echo "

"; + + if (isset($_POST['released'])) + { + submit_cells('close', _("Close This Work Order")); + } + submit_cells('delete', _("Delete This Work Order")); + + echo "
"; +} + +end_form(); +end_page(); + +?> \ No newline at end of file diff --git a/manufacturing/work_order_issue.php b/manufacturing/work_order_issue.php new file mode 100644 index 00000000..6d094ab3 --- /dev/null +++ b/manufacturing/work_order_issue.php @@ -0,0 +1,207 @@ +" . _("The work order issue has been entered."); + echo "
"; + hyperlink_no_params("search_work_orders.php", _("Select another Work Order to Process")); + echo "

"; + end_page(); + exit; +} + +//-------------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['issue_items'])) + { + $_SESSION['issue_items']->clear_items(); + unset ($_SESSION['issue_items']); + } + + Session_register("issue_items"); + + $_SESSION['issue_items'] = new items_cart; + $_SESSION['issue_items']->order_id = $_GET['trans_no']; +} + +//----------------------------------------------------------------------------------------------- + +function can_process() +{ + if (!is_date($_POST['date_'])) + { + display_error(_("The entered date for the issue is invalid.")); + return false; + } + elseif (!is_date_in_fiscalyear($_POST['date_'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], 28)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + $failed_item = $_SESSION['issue_items']->check_qoh($_POST['Location'], $_POST['date_'], !$_POST['IssueType']); + if ($failed_item != null) + { + display_error( _("The issue cannot be processed because an entered item would cause a negative inventory balance :") . + " " . $failed_item->stock_id . " - " . $failed_item->item_description); + return false; + } + + return true; +} + +if (isset($_POST['Process'])) +{ + + // if failed, returns a stockID + $failed_data = add_work_order_issue($_SESSION['issue_items']->order_id, + $_POST['ref'], $_POST['IssueType'], $_SESSION['issue_items']->line_items, + $_POST['Location'], $_POST['WorkCentre'], $_POST['date_'], $_POST['memo_']); + + if ($failed_data != null) + { + display_error(_("The process cannot be completed because there is an insufficient total quantity for a component.") . "
" + . _("Component is :"). $failed_data[0] . "
" + . _("From location :"). $failed_data[1] . "
"); + } + else + { + meta_forward($_SERVER['PHP_SELF'], "AddedID=1"); + } + +} /*end of process credit note */ + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['qty'])) + { + display_error(_("The quantity entered is not a valid number.")); + return false; + } + + if ($_POST['qty'] <= 0) + { + display_error(_("The quantity entered must be greater than zero.")); + return false; + } + + if (!is_numeric($_POST['std_cost']) || $_POST['std_cost'] < 0) + { + display_error(_("The entered standard cost is negative or invalid.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['issue_items']->update_cart_item($_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['issue_items']->remove_from_cart($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + add_to_order($_SESSION['issue_items'], $_POST['stock_id'], $_POST['qty'], $_POST['std_cost']); +} + +//----------------------------------------------------------------------------------------------- + +if ($_GET['Delete']!="") + handle_delete_item(); + +if ($_POST['AddItem']!="") + handle_new_item(); + +if ($_POST['UpdateItem']!="") + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['trans_no'])) +{ + handle_new_order(); +} + +//----------------------------------------------------------------------------------------------- + +display_order_header($_SESSION['issue_items']); + +start_form(false, true); + +start_table("$table_style width=90%", '10'); +echo ""; +display_adjustment_items(_("Items to Issue"), $_SESSION['issue_items']); +adjustment_options_controls(); +echo ""; + +end_table(); + +if (!isset($_POST['Process'])) +{ + start_table(); + start_row(); + submit_cells('Update', _("Update")); + if ($_SESSION['issue_items']->count_items() >= 1) + { + submit_cells('Process', _("Process Issue")); + } + end_row(); + end_table(); +} + +end_form(); + +//------------------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/manufacturing/work_order_release.php b/manufacturing/work_order_release.php new file mode 100644 index 00000000..e93e4355 --- /dev/null +++ b/manufacturing/work_order_release.php @@ -0,0 +1,97 @@ + \ No newline at end of file diff --git a/purchasing/allocations/index.php b/purchasing/allocations/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/allocations/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/allocations/supplier_allocate.php b/purchasing/allocations/supplier_allocate.php new file mode 100644 index 00000000..7ef2b2aa --- /dev/null +++ b/purchasing/allocations/supplier_allocate.php @@ -0,0 +1,277 @@ +allocs); + unset($_SESSION['alloc']); + } + + session_register("alloc"); +} + +//-------------------------------------------------------------------------------- + +function check_data() +{ + $total_allocated = 0; + + for ($counter=0; $counter < $_POST["TotalNumberOfAllocs"]; $counter++) + { + + if (!is_numeric($_POST['amount' . $counter])) + { + display_error(_("The entry for one or more amounts is invalid.")); + return false; + } + + if ($_POST['amount' . $counter] < 0) + { + display_error(_("The entry for an amount to allocate was negative. A positive allocation amount is expected.")); + return false; + } + + /*Now check to see that the AllocAmt is no greater than the + amount left to be allocated against the transaction under review */ + if ($_POST['amount' . $counter] > $_POST['un_allocated' . $counter]) + { + //$_POST['amount' . $counter] = $_POST['un_allocated' . $counter]; + } + + $_SESSION['alloc']->allocs[$counter]->current_allocated = $_POST['amount' . $counter]; + + $total_allocated += $_POST['amount' . $counter]; + } + + if ($total_allocated + $_SESSION['alloc']->amount > sys_prefs::allocation_settled_allowance()) + { + display_error(_("These allocations cannot be processed because the amount allocated is more than the total amount left to allocate.")); + //echo _("Total allocated:") . " " . $total_allocated ; + //echo " " . _("Total amount that can be allocated:") . " " . -$_SESSION['alloc']->TransAmt . "
"; + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------- + +function handle_process() +{ + begin_transaction(); + + // clear all the allocations for this payment/credit + clear_supp_alloctions($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no); + + // now add the new allocations + $total_allocated = 0; + foreach ($_SESSION['alloc']->allocs as $alloc_item) + { + if ($alloc_item->current_allocated > 0) + { + add_supp_allocation($alloc_item->current_allocated, + $_SESSION['alloc']->type, $_SESSION['alloc']->trans_no, + $alloc_item->type, $alloc_item->type_no, $_SESSION['alloc']->date_); + + update_supp_trans_allocation($alloc_item->type, $alloc_item->type_no, + $alloc_item->current_allocated); + $total_allocated += $alloc_item->current_allocated; + } + + } /*end of the loop through the array of allocations made */ + update_supp_trans_allocation($_SESSION['alloc']->type, + $_SESSION['alloc']->trans_no, $total_allocated); + + commit_transaction(); + + clear_allocations(); +} + +//-------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + if (check_data()) + { + handle_process(); + $_POST['Cancel'] = 1; + } +} + +//-------------------------------------------------------------------------------- + +if (isset($_POST['Cancel'])) +{ + clear_allocations(); + meta_forward($path_to_root . "/purchasing/allocations/supplier_allocation_main.php"); + exit; +} + +//-------------------------------------------------------------------------------- + +function get_allocations_for_transaction($type, $trans_no) +{ + clear_allocations(); + + $supptrans = get_supp_trans($trans_no, $type); + + $_SESSION['alloc'] = new allocation($trans_no, $type, + $supptrans["supplier_id"], $supptrans["supplier_name"], + $supptrans["Total"], sql2date($supptrans["tran_date"])); + + /* Now populate the array of possible (and previous actual) allocations for this supplier */ + /*First get the transactions that have outstanding balances ie Total-alloc >0 */ + + $trans_items = get_allocatable_to_supp_transactions($_SESSION['alloc']->person_id); + + while ($myrow = db_fetch($trans_items)) + { + $_SESSION['alloc']->add_item($myrow["type"], $myrow["trans_no"], + sql2date($myrow["tran_date"]), + sql2date($myrow["due_date"]), + $myrow["Total"], // trans total + $myrow["alloc"], // trans total allocated + 0); // this allocation + } + + + /* Now get trans that might have previously been allocated to by this trans + NB existing entries where still some of the trans outstanding entered from + above logic will be overwritten with the prev alloc detail below */ + + $trans_items = get_allocatable_to_supp_transactions($_SESSION['alloc']->person_id, $trans_no, $type); + + while ($myrow = db_fetch($trans_items)) + { + $_SESSION['alloc']->add_or_update_item ($myrow["type"], $myrow["trans_no"], + sql2date($myrow["tran_date"]), + sql2date($myrow["due_date"]), + $myrow["Total"], + $myrow["alloc"] - $myrow["amt"], $myrow["amt"]); + } +} + +//-------------------------------------------------------------------------------- + +function edit_allocations_for_transaction($type, $trans_no) +{ + global $table_style; + + start_form(false, true); + + display_heading(_("Allocation of") . " " . systypes::name($_SESSION['alloc']->type) . " # " . $_SESSION['alloc']->trans_no); + + display_heading($_SESSION['alloc']->person_name); + + display_heading2(_("Date:") . " " . $_SESSION['alloc']->date_ . ""); + display_heading2(_("Total:") . " " . number_format2(-$_SESSION['alloc']->amount,user_price_dec()) . ""); + + echo "
"; + + if (count($_SESSION['alloc']->allocs) > 0) + { + start_table($table_style); + $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"), + _("Other Allocations"), _("This Allocation"), _("Left to Allocate")); + table_header($th); + + $k = $counter = $total_allocated = 0; + + foreach ($_SESSION['alloc']->allocs as $alloc_item) + { + alt_table_row_color($k); + + label_cell(systypes::name($alloc_item->type)); + label_cell(get_trans_view_str($alloc_item->type, $alloc_item->type_no)); + label_cell($alloc_item->date_, "align=right"); + label_cell($alloc_item->due_date, "align=right"); + amount_cell($alloc_item->amount); + amount_cell($alloc_item->amount_allocated); + + if (!isset($_POST['amount' . $counter]) || $_POST['amount' . $counter] == "") + $_POST['amount' . $counter] = $alloc_item->current_allocated; + text_cells(null, "amount" . $counter, $_POST['amount' . $counter], 13, 12); + + $un_allocated = round($alloc_item->amount - $alloc_item->amount_allocated, 6); + hidden("un_allocated" . $counter, $un_allocated); + amount_cell($un_allocated); + + label_cell("" . _("All") . ""); + label_cell("" . _("None") . ""); + end_row(); + + $total_allocated += $_POST['amount' . $counter]; + $counter++; + } + + label_row(_("Total Allocated"), number_format2($total_allocated,user_price_dec()), + "colspan=6 align=right", "align=right"); + if (-$_SESSION['alloc']->amount - $total_allocated < 0) + { + $font1 = ""; + $font2 = ""; + } + else + $font1 = $font2 = ""; + label_row(_("Left to Allocate"), $font1 . number_format2(-$_SESSION['alloc']->amount - + $total_allocated,user_price_dec()) . $font2, "colspan=6 align=right", + "nowrap align=right"); + end_table(); + + hidden('TotalNumberOfAllocs', $counter); + echo "
"; + submit('UpdateDisplay', _("Update")); + echo " "; + submit('Process', _("Process")); + echo " "; + } + else + { + display_note(_("There are no unsettled transactions to allocate."), 0, 1); + echo "
"; + } + + submit('Cancel', _("Back to Allocations")); + echo "


"; + + end_form(); +} + +//-------------------------------------------------------------------------------- + +if (isset($_GET['trans_no']) && isset($_GET['trans_type'])) +{ + get_allocations_for_transaction($_GET['trans_type'], $_GET['trans_no']); +} + +if (isset($_SESSION['alloc'])) +{ + edit_allocations_for_transaction($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no); +} + +//-------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/purchasing/allocations/supplier_allocation_main.php b/purchasing/allocations/supplier_allocation_main.php new file mode 100644 index 00000000..4e9ca586 --- /dev/null +++ b/purchasing/allocations/supplier_allocation_main.php @@ -0,0 +1,117 @@ +allocs); + unset($_SESSION['alloc']); + } + if (!isset($_POST['supplier_id'])) + $_POST['supplier_id'] = get_global_supplier(); + + echo "
" . _("Select a Supplier: ") . "  "; + supplier_list('supplier_id', $_POST['supplier_id'], true, true); + echo "
"; + check(_("Show Settled Items:"), 'ShowSettled', null, true); + echo "


"; + + set_global_supplier($_POST['supplier_id']); + + if (isset($_POST['supplier_id']) && ($_POST['supplier_id'] == reserved_words::get_all())) + { + unset($_POST['supplier_id']); + } + + $settled = false; + if (check_value('ShowSettled')) + $settled = true; + + $supplier_id = null; + if (isset($_POST['supplier_id'])) + $supplier_id = $_POST['supplier_id']; + + $trans_items = get_allocatable_from_supp_transactions($supplier_id, $settled); + + start_table($table_style); + if (!isset($_POST['supplier_id'])) + $th = array(_("Transaction Type"), _("#"), _("Reference"), _("Date"), _("Supplier"), + _("Currency"), _("Total"), _("Left To Allocate")); + else + $th = array(_("Transaction Type"), _("#"), _("Reference"), _("Date"), + _("Total"), _("Left To Allocate")); + table_header($th); + + $k = 0; //row colour counter + $has_settled_items = false; + + while ($myrow = db_fetch($trans_items)) + { + if ($myrow["settled"] == 1) + { + start_row("class='settledbg'"); + $has_settled_items = true; + } + else + { + alt_table_row_color($k); + } + + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"], $myrow["trans_no"])); + label_cell($myrow["reference"]); + label_cell(sql2date($myrow["tran_date"])); + + if (!isset($_POST['supplier_id'])) + { + label_cell($myrow["supp_name"]); + label_cell($myrow["curr_code"]); + } + amount_cell(-$myrow["Total"]); + amount_cell(-$myrow["Total"]-$myrow["alloc"]); + label_cell("" . _("Allocate") . ""); + end_row(); + } + + end_table(); + + if ($has_settled_items) + display_note(_("Marked items are settled."), 0, 1, "class='settledfg'"); + + if (db_num_rows($trans_items) == 0) + display_note(_("There are no allocations to be done."), 1, 2); + + end_form(); +} + +//-------------------------------------------------------------------------------- + +display_allocatable_transactions(); + +//-------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/purchasing/includes/db/grn_db.inc b/purchasing/includes/db/grn_db.inc new file mode 100644 index 00000000..b6738fe0 --- /dev/null +++ b/purchasing/includes/db/grn_db.inc @@ -0,0 +1,269 @@ +order_no, $po->supplier_id, $reference, $location, $date_); + + foreach ($po->line_items as $order_line) + { + + if ($order_line->receive_qty != 0 && $order_line->receive_qty != "" && isset($order_line->receive_qty)) + { + + /*Update sales_order_details for the new quantity received and the standard cost used for postings to GL and recorded in the stock movements for FIFO/LIFO stocks valuations*/ + + if ($order_line->qty_received == 0) + { + /*This must be the first receipt of goods against this line */ + /*Need to get the standard cost as it is now so we can process GL jorunals later*/ + $order_line->standard_cost = get_standard_cost($order_line->stock_id); + } + + /*Need to insert a grn item */ + + $grn_item = add_grn_detail_item($grn, $order_line->po_detail_rec, + $order_line->stock_id, $order_line->item_description, + $order_line->standard_cost, $order_line->receive_qty); + + /* Update location stock records - NB a po cannot be entered for a service/kit parts */ + + add_stock_move(25, $order_line->stock_id, $grn, $location, $date_, "", + $order_line->receive_qty, $order_line->standard_cost, + $po->supplier_id, 1, $order_line->price); + + } /*quantity received is != 0 */ + } /*end of order_line loop */ + + add_forms_for_sys_type(25, $grn, $location); + + references::save_last($reference, 25); + + commit_transaction(); + + return $grn; +} + +//---------------------------------------------------------------------------------------- + +function add_grn_batch($po_number, $supplier_id, $reference, $location, $date_) +{ + $date = date2sql($date_); + + $sql = "INSERT INTO ".TB_PREF."grn_batch (purch_order_no, delivery_date, supplier_id, reference, loc_code) + VALUES ($po_number, '$date', '$supplier_id', '$reference', '$location')"; + + db_query($sql, "A grn batch record could not be inserted."); + + return db_insert_id(); +} + +//------------------------------------------------------------------------------------------------------------- + +function add_grn_detail_item($grn_batch_id, $po_detail_item, $item_code, $description, $standard_unit_cost, + $quantity_received) +{ + $sql = "UPDATE ".TB_PREF."purch_order_details + SET quantity_received = quantity_received + $quantity_received, + std_cost_unit=$standard_unit_cost + WHERE po_detail_item = $po_detail_item"; + + db_query($sql, "a purchase order details record could not be updated. This receipt of goods has not been processed "); + + $sql = "INSERT INTO ".TB_PREF."grn_items (grn_batch_id, po_detail_item, item_code, description, qty_recd) + VALUES ($grn_batch_id, $po_detail_item, '$item_code', '$description', $quantity_received)"; + + db_query($sql, "A GRN detail item could not be inserted."); + + return db_insert_id(); +} + +//---------------------------------------------------------------------------------------- + +function get_grn_items($grn_batch_id=0, $supplier_id="", $outstanding_only=false, + $is_invoiced_only=false) +{ + $sql = "SELECT ".TB_PREF."grn_batch.*, ".TB_PREF."grn_items.*, ".TB_PREF."purch_order_details.unit_price, + ".TB_PREF."purch_order_details.std_cost_unit, units + FROM ".TB_PREF."grn_batch, ".TB_PREF."grn_items, ".TB_PREF."purch_order_details, ".TB_PREF."stock_master + WHERE ".TB_PREF."grn_items.grn_batch_id=".TB_PREF."grn_batch.id + AND ".TB_PREF."grn_items.po_detail_item=".TB_PREF."purch_order_details.po_detail_item + AND ".TB_PREF."stock_master.stock_id=".TB_PREF."grn_items.item_code "; + + if ($grn_batch_id != 0) + $sql .= " AND ".TB_PREF."grn_batch.id=$grn_batch_id AND ".TB_PREF."grn_items.grn_batch_id=$grn_batch_id "; + + if ($is_invoiced_only) + $sql .= " AND ".TB_PREF."grn_items.quantity_inv > 0"; + + if ($outstanding_only) + $sql .= " AND ".TB_PREF."grn_items.qty_recd - ".TB_PREF."grn_items.quantity_inv > 0"; + + if ($supplier_id != "") + $sql .= " AND ".TB_PREF."grn_batch.supplier_id ='$supplier_id' "; + + $sql .= " ORDER BY ".TB_PREF."grn_batch.delivery_date, ".TB_PREF."grn_batch.id, ".TB_PREF."grn_items.id"; + + return db_query($sql, "Could not retreive GRNS"); +} + +//---------------------------------------------------------------------------------------- + +// get the details for a given grn item + +function get_grn_item_detail($grn_item_no) +{ + $sql = "SELECT ".TB_PREF."grn_items.*, ".TB_PREF."purch_order_details.unit_price, + ".TB_PREF."grn_items.qty_recd - ".TB_PREF."grn_items.quantity_inv AS QtyOstdg, + ".TB_PREF."purch_order_details.std_cost_unit + FROM ".TB_PREF."grn_items, ".TB_PREF."purch_order_details, ".TB_PREF."stock_master + WHERE ".TB_PREF."grn_items.po_detail_item=".TB_PREF."purch_order_details.po_detail_item + AND ".TB_PREF."stock_master.stock_id=".TB_PREF."grn_items.item_code + AND ".TB_PREF."grn_items.id=$grn_item_no"; + + $result = db_query($sql, "could not retreive grn item details"); + return db_fetch($result); +} + +//---------------------------------------------------------------------------------------- + +function read_grn_items_to_order($grn_batch, &$order) +{ + $result = get_grn_items($grn_batch); + + if (db_num_rows($result) > 0) + { + + while ($myrow = db_fetch($result)) + { + + if (is_null($myrow["units"])) + { + $units = ""; + } + else + { + $units = $myrow["units"]; + } + + $order->add_to_order($order->lines_on_order+1, $myrow["item_code"], + 1,$myrow["description"], $myrow["unit_price"],$units, + sql2date($myrow["delivery_date"]), $myrow["quantity_inv"], + $myrow["qty_recd"]); + + $order->line_items[$order->lines_on_order]->po_detail_rec = $myrow["po_detail_item"]; + } /* line po from purchase order details */ + } //end of checks on returned data set +} + +//---------------------------------------------------------------------------------------- + +// read a grn into an order class + +function read_grn($grn_batch, &$order) +{ + $sql= "SELECT * FROM ".TB_PREF."grn_batch WHERE id=$grn_batch"; + + $result = db_query($sql, "The grn sent is not valid"); + + $row = db_fetch($result); + $po_number = $row["purch_order_no"]; + + $result = read_po_header($po_number, $order); + + if ($result) + { + + $order->orig_order_date = sql2date($row["delivery_date"]); + $order->location = $row["loc_code"]; + $order->reference = $row["reference"]; + + read_grn_items_to_order($grn_batch, $order); + } +} + +//---------------------------------------------------------------------------------------------------------- + +// get the GRNs (batch info not details) for a given po number + +function get_po_grns($po_number) +{ + $sql = "SELECT * FROM ".TB_PREF."grn_batch WHERE purch_order_no=$po_number"; + + return db_query($sql, "The grns for the po $po_number could not be retreived"); +} + +//---------------------------------------------------------------------------------------------------------- + +function exists_grn($grn_batch) +{ + $sql = "SELECT id FROM ".TB_PREF."grn_batch WHERE id=$grn_batch"; + $result = db_query($sql, "Cannot retreive a grn"); + + return (db_num_rows($result) > 0); +} + +//---------------------------------------------------------------------------------------------------------- + +function exists_grn_on_invoices($grn_batch) +{ + $sql = "SELECT ".TB_PREF."supp_invoice_items.id FROM ".TB_PREF."supp_invoice_items,".TB_PREF."grn_items + WHERE ".TB_PREF."supp_invoice_items.grn_item_id=".TB_PREF."grn_items.id + AND quantity != 0 + AND grn_batch_id=$grn_batch"; + $result = db_query($sql, "Cannot query GRNs"); + + return (db_num_rows($result) > 0); +} + +//---------------------------------------------------------------------------------------------------------- + +function void_grn($grn_batch) +{ + // if this grn is references on any invoices/credit notes, then it + // can't be voided + if (exists_grn_on_invoices($grn_batch)) + return false; + + begin_transaction(); + + void_bank_trans(25, $grn_batch, true); + void_gl_trans(25, $grn_batch, true); + + // clear the quantities of the grn items in the POs and invoices + $result = get_grn_items($grn_batch); + + if (db_num_rows($result) > 0) + { + + while ($myrow = db_fetch($result)) + { + + $sql = "UPDATE ".TB_PREF."purch_order_details + SET quantity_received = quantity_received - " . $myrow["qty_recd"] . " + WHERE po_detail_item = " . $myrow["po_detail_item"]; + + db_query($sql, "a purchase order details record could not be voided."); + } + } + + // clear the quantities in the grn items + $sql = "UPDATE ".TB_PREF."grn_items SET qty_recd=0, quantity_inv=0 + WHERE grn_batch_id=$grn_batch"; + + db_query($sql, "A grn detail item could not be voided."); + + // clear the stock move items + void_stock_move(25, $grn_batch); + + commit_transaction(); + + return true; +} + +//---------------------------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/purchasing/includes/db/index.php b/purchasing/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/includes/db/invoice_db.inc b/purchasing/includes/db/invoice_db.inc new file mode 100644 index 00000000..29640d4b --- /dev/null +++ b/purchasing/includes/db/invoice_db.inc @@ -0,0 +1,328 @@ +supplier_id = $supplier_id; + $supp_trans->supplier_name = $myrow['supp_name']; + $supp_trans->terms_description = $myrow['terms']; + + if ($myrow['days_before_due'] == 0) + { + $supp_trans->terms = "1" . $myrow['day_in_following_month']; + } + else + { + $supp_trans->terms = "0" . $myrow['days_before_due']; + } + $supp_trans->tax_description = $myrow['tax_group_name']; + $supp_trans->tax_group_id = $myrow['tax_group_id']; + + if ($supp_trans->tran_date == "") + { + $supp_trans->tran_date = Today(); + if (!is_date_in_fiscalyear($supp_trans->tran_date)) + $supp_trans->tran_date = end_fiscalyear(); + } + //if ($supp_trans->due_date=="") { + // get_duedate_from_terms($supp_trans); + //} + get_duedate_from_terms($supp_trans); +} + +//-------------------------------------------------------------------------------------------------- + +function update_supp_received_items_for_invoice($id, $po_detail_item, $qty_invoiced, $chg_price=null) +{ + $sql = "UPDATE ".TB_PREF."purch_order_details + SET qty_invoiced = qty_invoiced + $qty_invoiced "; + + if ($chg_price != null) + $sql .= " , act_price = $chg_price "; + + $sql .= " WHERE po_detail_item = $po_detail_item"; + db_query($sql, "The quantity invoiced of the purchase order line could not be updated"); + + $sql = "UPDATE ".TB_PREF."grn_items + SET quantity_inv = quantity_inv + $qty_invoiced + WHERE id = $id"; + db_query($sql, "The quantity invoiced off the items received record could not be updated"); +} + +//---------------------------------------------------------------------------------------- + +function add_supp_invoice($supp_trans) // do not receive as ref because we change locally +{ + $company_currency = get_company_currency(); + + /*Start an sql transaction */ + begin_transaction(); + + $tax_total = 0; + $taxes = $supp_trans->get_taxes($supp_trans->tax_group_id); + foreach ($taxes as $taxitem) + { + $tax_total += $taxitem['Value']; + } + + $invoice_items_total = $supp_trans->get_total_charged($supp_trans->tax_group_id); + + if ($supp_trans->is_invoice) + $trans_type = 20; + else + { + $trans_type = 21; + // let's negate everything because it's a credit note + $invoice_items_total = -$invoice_items_total; + $tax_total = -$tax_total; + $supp_trans->ov_discount = -$supp_trans->ov_discount; // this isn't used at all... + } + + $date_ = $supp_trans->tran_date; + + /*First insert the invoice into the supp_trans table*/ + $invoice_id = add_supp_trans($trans_type, $supp_trans->supplier_id, $date_, $supp_trans->due_date, + $supp_trans->reference, $supp_trans->supp_reference, + $invoice_items_total, $tax_total, $supp_trans->ov_discount); + + /* Now the control account */ + $supplier_accounts = get_supplier_accounts($supp_trans->supplier_id); + add_gl_trans_supplier($trans_type, $invoice_id, $date_, $supplier_accounts["payable_account"], 0, 0, + -($invoice_items_total + $tax_total + $supp_trans->ov_discount), + $supp_trans->supplier_id, + "The general ledger transaction for the control total could not be added"); + + /*Loop through the GL Entries and create a debit posting for each of the accounts entered */ + + /*the postings here are a little tricky, the logic goes like this: + if its a general ledger amount it goes straight to the account specified + + if its a GRN amount invoiced then : + + The cost as originally credited to GRN suspense on arrival of items is debited to GRN suspense. Any difference + between the std cost and the currency cost charged as converted at the ex rate of of the invoice is written off + to the purchase price variance account applicable to the item being invoiced. + */ + + foreach ($supp_trans->gl_codes as $entered_gl_code) + { + + /*GL Items are straight forward - just do the debit postings to the GL accounts specified - + the credit is to creditors control act done later for the total invoice value + tax*/ + + if (!$supp_trans->is_invoice) + $entered_gl_code->amount = -$entered_gl_code->amount; + + $memo_ = $entered_gl_code->memo_; + add_gl_trans_supplier($trans_type, $invoice_id, $date_, $entered_gl_code->gl_code, + $entered_gl_code->gl_dim, $entered_gl_code->gl_dim2, $entered_gl_code->amount, $supp_trans->supplier_id); + + add_supp_invoice_gl_item($trans_type, $invoice_id, $entered_gl_code->gl_code, + $entered_gl_code->amount, $memo_); + } + + foreach ($supp_trans->grn_items as $entered_grn) + { + + if (!$supp_trans->is_invoice) + { + $entered_grn->this_quantity_inv = -$entered_grn->this_quantity_inv; + } + + $line_taxfree = $entered_grn->taxfree_charge_price($supp_trans->tax_group_id); + $line_tax = $entered_grn->full_charge_price() - $line_taxfree; + + update_supp_received_items_for_invoice($entered_grn->id, $entered_grn->po_detail_item, + $entered_grn->this_quantity_inv, $entered_grn->chg_price); + + $stock_gl_code = get_stock_gl_code($entered_grn->item_code); + $stock_entry_account = $stock_gl_code["inventory_account"]; + + add_gl_trans_supplier($trans_type, $invoice_id, $date_, $stock_entry_account, + $stock_gl_code['dimension_id'], $stock_gl_code['dimension2_id'], + $entered_grn->this_quantity_inv * $line_taxfree, $supp_trans->supplier_id); + +/* + $supplierCurrency = get_supplier_currency($supp_trans->supplier_id); + $localChgPrice = to_home_currency($entered_grn->chg_price, $supplierCurrency, $date_); + $PurchPriceVar = $entered_grn->this_quantity_inv * ($localChgPrice - $entered_grn->std_cost_unit); + + echo "purchase price variance is $PurchPriceVar"; + + // Yes but where to post this difference to - if its an inventory item the variance account + // must be retreived from the stock category record + + if ($PurchPriceVar !=0){ // don't bother with this lot if there is no difference ! + // need to get the stock category record for this inventory item - + $stock_gl_code = get_stock_gl_code($entered_grn->item_code); + + + add_gl_trans_supplier($trans_type, $invoice_id, $date_, $stock_gl_code["purch_price_var_act"], + $PurchPriceVar, $supp_trans->supplier_id, + "The general ledger transaction could not be added for the price variance of the inventory item"); + }*/ + + add_supp_invoice_item($trans_type, $invoice_id, $entered_grn->item_code, + $entered_grn->item_description, 0, $line_taxfree, $line_tax, + $entered_grn->this_quantity_inv, $entered_grn->id, $entered_grn->po_detail_item, ""); + } /* end of GRN postings */ + + /* Now the TAX account */ + foreach ($taxes as $taxitem) + { + if ($taxitem['Value'] != 0) + { + + if (!$supp_trans->is_invoice) + $taxitem['Value'] = -$taxitem['Value']; + + add_supp_invoice_tax_item($trans_type, $invoice_id, $taxitem['tax_type_id'], + $taxitem['rate'], $taxitem['included_in_price'], $taxitem['Value']); + + add_gl_trans_supplier($trans_type, $invoice_id, $date_, + $taxitem['purchasing_gl_code'], 0, 0, $taxitem['Value'], + $supp_trans->supplier_id, + "A general ledger transaction for the tax amount could not be added"); + } + } + + add_comments($trans_type, $invoice_id, $date_, $supp_trans->Comments); + + references::save_last($supp_trans->reference, $trans_type); + + commit_transaction(); + + return $invoice_id; +} + +//---------------------------------------------------------------------------------------- + +// get all the invoices/credits for a given PO - quite long route to get there ! + +function get_po_invoices_credits($po_number) +{ + $sql = "SELECT DISTINCT ".TB_PREF."supp_trans.trans_no, ".TB_PREF."supp_trans.type, + ov_amount+ov_discount+ov_gst AS Total, + ".TB_PREF."supp_trans.tran_date + FROM ".TB_PREF."supp_trans, ".TB_PREF."supp_invoice_items, ".TB_PREF."purch_order_details + WHERE ".TB_PREF."supp_invoice_items.supp_trans_no = ".TB_PREF."supp_trans.trans_no + AND ".TB_PREF."supp_invoice_items.po_detail_item_id = ".TB_PREF."purch_order_details.po_detail_item + AND ".TB_PREF."purch_order_details.order_no = $po_number"; + + return db_query($sql, "The invoices/credits for the po $po_number could not be retreived"); +} + +//---------------------------------------------------------------------------------------- + +function read_supp_invoice($trans_no, $trans_type, &$supp_trans) +{ + $sql = "SELECT ".TB_PREF."supp_trans.*, supp_name FROM ".TB_PREF."supp_trans,".TB_PREF."suppliers + WHERE trans_no = $trans_no AND type = $trans_type + AND ".TB_PREF."suppliers.supplier_id=".TB_PREF."supp_trans.supplier_id"; + $result = db_query($sql, "Cannot retreive a supplier transaction"); + + if (db_num_rows($result) == 1) + { + $trans_row = db_fetch($result); + + $supp_trans->supplier_id = $trans_row["supplier_id"]; + $supp_trans->supplier_name = $trans_row["supp_name"]; + $supp_trans->tran_date = sql2date($trans_row["tran_date"]); + $supp_trans->due_date = sql2date($trans_row["due_date"]); + //$supp_trans->Comments = $trans_row["TransText"]; + $supp_trans->Comments = ""; + $supp_trans->reference = $trans_row["reference"]; + $supp_trans->supp_reference = $trans_row["supp_reference"]; + $supp_trans->ov_amount = $trans_row["ov_amount"]; + $supp_trans->ov_discount = $trans_row["ov_discount"]; + $supp_trans->ov_gst = $trans_row["ov_gst"]; + + $id = $trans_row["trans_no"]; + + $result = get_supp_invoice_items($trans_type, $id); + + if (db_num_rows($result) > 0) + { + + while ($details_row = db_fetch($result)) + { + + if ($details_row["gl_code"] == 0) + { + $supp_trans->add_grn_to_trans($details_row["grn_item_id"], $details_row["po_detail_item_id"], $details_row["stock_id"], + $details_row["description"], 0, 0, $details_row["quantity"], 0, $details_row["FullUnitPrice"], + false, 0, 0); + } + else + { + $supp_trans->add_gl_codes_to_trans($details_row["gl_code"], get_gl_account_name($details_row["gl_code"]), 0, 0, + $details_row["FullUnitPrice"], $details_row["memo_"]); + } + } + } + else + { + return display_db_error("Invalid supptrans details for supptrans number : $trans_no and type : $trans_type", $sql, true); + } + + } + else + { + return display_db_error("Invalid supptrans number : $trans_no and type : $trans_type", $sql, true); + } +} + +//---------------------------------------------------------------------------------------- + +function void_supp_invoice($type, $type_no) +{ + begin_transaction(); + + void_bank_trans($type, $type_no, true); + + void_gl_trans($type, $type_no, true); + + void_supp_allocations($type, $type_no); + + void_supp_trans($type, $type_no); + + $result = get_supp_invoice_items($type, $type_no); + + // now remove this invoice/credit from any GRNs/POs that it's related to + if (db_num_rows($result) > 0) + { + while ($details_row = db_fetch($result)) + { + if (strlen($details_row["grn_item_id"]) > 0) // it can be empty for GL items + { + update_supp_received_items_for_invoice($details_row["grn_item_id"], + $details_row["po_detail_item_id"], -$details_row["quantity"]); + } + } + } + + void_supp_invoice_items($type, $type_no); + void_supp_invoice_tax_items($type, $type_no); + + commit_transaction(); +} + +//---------------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/purchasing/includes/db/invoice_items_db.inc b/purchasing/includes/db/invoice_items_db.inc new file mode 100644 index 00000000..e072e6f6 --- /dev/null +++ b/purchasing/includes/db/invoice_items_db.inc @@ -0,0 +1,85 @@ + \ No newline at end of file diff --git a/purchasing/includes/db/po_db.inc b/purchasing/includes/db/po_db.inc new file mode 100644 index 00000000..439ca58f --- /dev/null +++ b/purchasing/includes/db/po_db.inc @@ -0,0 +1,212 @@ +supplier_id . "', '" . + db_escape($po_obj->Comments) . "','" . + date2sql($po_obj->orig_order_date) . "', '" . + $po_obj->reference . "', '" . + $po_obj->requisition_no . "', '" . + $po_obj->Location . "', '" . + $po_obj->delivery_address . "')"; + + db_query($sql, "The purchase order header record could not be inserted"); + + /*Get the auto increment value of the order number created from the sql above */ + $po_obj->order_no = db_insert_id(); + + /*Insert the purchase order detail records */ + foreach ($po_obj->line_items as $po_line) + { + if ($po_line->Deleted == false) + { + $sql = "INSERT INTO ".TB_PREF."purch_order_details (order_no, item_code, description, delivery_date, unit_price, quantity_ordered) VALUES ("; + $sql .= $po_obj->order_no . ", '" . $po_line->stock_id . "','" . + $po_line->item_description . "','" . + date2sql($po_line->req_del_date) . "'," . + $po_line->price . ", " . + $po_line->quantity . ")"; + db_query($sql, "One of the purchase order detail records could not be inserted"); + } + } + + add_forms_for_sys_type(systypes::po(), $po_obj->order_no); + + references::save_last($po_obj->reference, systypes::po()); + + //add_comments(systypes::po(), $po_obj->order_no, $po_obj->orig_order_date, $po_obj->Comments); + + commit_transaction(); + + return $po_obj->order_no; +} + +//---------------------------------------------------------------------------------------- + +function update_po(&$po_obj) +{ + begin_transaction(); + + /*Update the purchase order header with any changes */ + $sql = "UPDATE ".TB_PREF."purch_orders SET Comments='" . db_escape($po_obj->Comments) . "', + requisition_no= '" . $po_obj->requisition_no . "', + into_stock_location='" . $po_obj->Location . "', + ord_date='" . date2sql($po_obj->orig_order_date) . "', + delivery_address='" . $po_obj->delivery_address . "'"; + $sql .= " WHERE order_no = " . $po_obj->order_no; + db_query($sql, "The purchase order could not be updated"); + + /*Now Update the purchase order detail records */ + foreach ($po_obj->line_items as $po_line) + { + + if ($po_line->Deleted==True) + { + // Sherifoz 21.06.03 Handle deleting existing lines + if ($po_line->po_detail_rec!='') + { + $sql = "DELETE FROM ".TB_PREF."purch_order_details WHERE po_detail_item='" . $po_line->po_detail_rec . "'"; + db_query($sql, "could not query purch order details"); + } + } + else if ($po_line->po_detail_rec == '') + { + // Sherifoz 21.06.03 Handle adding new lines vs. updating. if no key(po_detail_rec) then it's a new line + $sql = "INSERT INTO ".TB_PREF."purch_order_details (order_no, item_code, description, delivery_date, unit_price, quantity_ordered) VALUES ("; + $sql .= $po_obj->order_no . ", '" . + $po_line->stock_id . "','" . + $po_line->item_description . "','" . + date2sql($po_line->req_del_date) . "'," . + $po_line->price . ", " . $po_line->quantity . ")"; + } + else + { + $sql = "UPDATE ".TB_PREF."purch_order_details SET item_code='" . $po_line->stock_id . "', + description ='" . $po_line->item_description . "', + delivery_date ='" . date2sql($po_line->req_del_date) . "', + unit_price=" . $po_line->price . ", + quantity_ordered=" . $po_line->quantity . " + WHERE po_detail_item=" . $po_line->po_detail_rec; + } + db_query($sql, "One of the purchase order detail records could not be updated"); + } + + //add_comments(systypes::po(), $po_obj->order_no, $po_obj->orig_order_date, $po_obj->Comments); + + commit_transaction(); + + return $po_obj->order_no; +} + +//---------------------------------------------------------------------------------------- + +function read_po_header($order_no, &$order) +{ + $sql = "SELECT ".TB_PREF."purch_orders.*, ".TB_PREF."suppliers.supp_name, + ".TB_PREF."suppliers.curr_code, ".TB_PREF."locations.location_name + FROM ".TB_PREF."purch_orders, ".TB_PREF."suppliers, ".TB_PREF."locations + WHERE ".TB_PREF."purch_orders.supplier_id = ".TB_PREF."suppliers.supplier_id + AND ".TB_PREF."locations.loc_code = into_stock_location + AND ".TB_PREF."purch_orders.order_no = " . $order_no; + + $result = db_query($sql, "The order cannot be retrieved"); + + if (db_num_rows($result) == 1) + { + + $myrow = db_fetch($result); + + $order->order_no = $order_no; + $order->supplier_id = $myrow["supplier_id"]; + $order->supplier_name = $myrow["supp_name"]; + $order->curr_code = $myrow["curr_code"]; + + $order->orig_order_date = sql2date($myrow["ord_date"]); + $order->Comments = $myrow["comments"]; + $order->Location = $myrow["into_stock_location"]; + $order->requisition_no = $myrow["requisition_no"]; + $order->reference = $myrow["reference"]; + $order->delivery_address = $myrow["delivery_address"]; + + return true; + } + + display_db_error("FATAL : duplicate purchase order found", "", true); + return false; +} + +//---------------------------------------------------------------------------------------- + +function read_po_items($order_no, &$order, $open_items_only=false) +{ + /*now populate the line po array with the purchase order details records */ + + $sql = "SELECT ".TB_PREF."purch_order_details.*, units + FROM ".TB_PREF."purch_order_details + LEFT JOIN ".TB_PREF."stock_master + ON ".TB_PREF."purch_order_details.item_code=".TB_PREF."stock_master.stock_id + WHERE order_no =$order_no "; + + if ($open_items_only) + $sql .= " AND (".TB_PREF."purch_order_details.quantity_ordered > ".TB_PREF."purch_order_details.quantity_received) "; + + $sql .= " ORDER BY po_detail_item"; + + $result = db_query($sql, "The lines on the purchase order cannot be retrieved"); + + if (db_num_rows($result) > 0) + { + + while ($myrow = db_fetch($result)) + { + if (is_null($myrow["units"])) + { + $units = ""; + } + else + { + $units = $myrow["units"]; + } + + $order->add_to_order($order->lines_on_order+1, $myrow["item_code"], + $myrow["quantity_ordered"],$myrow["description"], + $myrow["unit_price"],$units, sql2date($myrow["delivery_date"]), + $myrow["qty_invoiced"], $myrow["quantity_received"]); + + $order->line_items[$order->lines_on_order]->po_detail_rec = $myrow["po_detail_item"]; + $order->line_items[$order->lines_on_order]->standard_cost = $myrow["std_cost_unit"]; /*Needed for receiving goods and GL interface */ + } /* line po from purchase order details */ + } //end of checks on returned data set +} + +//---------------------------------------------------------------------------------------- + +function read_po($order_no, &$order, $open_items_only=false) +{ + $result = read_po_header($order_no, $order); + + if ($result) + read_po_items($order_no, $order, $open_items_only); +} + +//---------------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/purchasing/includes/db/supp_payment_db.inc b/purchasing/includes/db/supp_payment_db.inc new file mode 100644 index 00000000..7014cec4 --- /dev/null +++ b/purchasing/includes/db/supp_payment_db.inc @@ -0,0 +1,73 @@ + \ No newline at end of file diff --git a/purchasing/includes/db/supp_trans_db.inc b/purchasing/includes/db/supp_trans_db.inc new file mode 100644 index 00000000..6526093b --- /dev/null +++ b/purchasing/includes/db/supp_trans_db.inc @@ -0,0 +1,163 @@ + 0) + $sql .= " AND ".TB_PREF."supp_trans.type=$trans_type "; + + if ($trans_type == 22) + { + // it's a payment so also get the bank account + $sql .= " AND ".TB_PREF."bank_trans.trans_no =$trans_no + AND ".TB_PREF."bank_trans.type=$trans_type + AND ".TB_PREF."bank_trans_types.id = ".TB_PREF."bank_trans.bank_trans_type_id + AND ".TB_PREF."bank_accounts.account_code=".TB_PREF."bank_trans.bank_act "; + } + + $result = db_query($sql, "Cannot retreive a supplier transaction"); + + if (db_num_rows($result) == 0) + { + // can't return nothing + display_db_error("no supplier trans found for given params", $sql, true); + exit; + } + + if (db_num_rows($result) > 1) + { + // can't return multiple + display_db_error("duplicate supplier transactions found for given params", $sql, true); + exit; + } + + return db_fetch($result); +} + +//---------------------------------------------------------------------------------------- + +function get_supplier_transactions($extra_fields=null, $extra_conditions=null, $extra_tables=null) +{ + $sql = "SELECT ".TB_PREF."supp_trans.*, + ov_amount+ov_gst+ov_discount AS Total, + ".TB_PREF."suppliers.supp_name, ".TB_PREF."suppliers.address, + ".TB_PREF."suppliers.curr_code "; + + if ($extra_fields) + $sql .= ", $extra_fields "; + + $sql .= " FROM ".TB_PREF."supp_trans, ".TB_PREF."suppliers "; + if ($extra_tables) + $sql .= " ,$extra_tables "; + + $sql .= " WHERE ".TB_PREF."supp_trans.supplier_id=".TB_PREF."suppliers.supplier_id"; + + if ($extra_conditions) + $sql .= " AND $extra_conditions "; + + $sql .= " ORDER BY trans_no"; + + return db_query($sql, "Cannot retreive supplier transactions"); +} + +//---------------------------------------------------------------------------------------- + +function exists_supp_trans($type, $type_no) +{ + if ($type == 25) + return exists_grn($type_no); + + $sql = "SELECT trans_no FROM ".TB_PREF."supp_trans WHERE type=$type + AND trans_no=$type_no"; + $result = db_query($sql, "Cannot retreive a supplier transaction"); + + return (db_num_rows($result) > 0); +} + +//---------------------------------------------------------------------------------------- + +function void_supp_trans($type, $type_no) +{ + $sql = "UPDATE ".TB_PREF."supp_trans SET ov_amount=0, ov_discount=0, ov_gst=0, + alloc=0 WHERE type=$type AND trans_no=$type_no"; + + db_query($sql, "could not void supp transactions for type=$type and trans_no=$type_no"); +} + +//---------------------------------------------------------------------------------------- + +function post_void_supp_trans($type, $type_no) +{ + if ($type == 22) + { + void_supp_payment($type, $type_no); + return true; + } + + if ($type == 20 || $type == 21) + { + void_supp_invoice($type, $type_no); + return true; + } + + if ($type == 25) + { + return void_grn($type_no); + } + + return false; +} + +//---------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/purchasing/includes/db/suppalloc_db.inc b/purchasing/includes/db/suppalloc_db.inc new file mode 100644 index 00000000..24fab3ba --- /dev/null +++ b/purchasing/includes/db/suppalloc_db.inc @@ -0,0 +1,123 @@ + 0"; + } + + $supp_sql = ""; + if ($supplier_id != null) + $supp_sql = " AND ".TB_PREF."supp_trans.supplier_id = $supplier_id"; + + return get_supplier_transactions("round(ABS(ov_amount+ov_gst+ov_discount)-alloc,6) <= 0 AS settled", + "(type=22 OR type=21 OR type=1) AND (ov_amount < 0) " . $settled_sql . $supp_sql); +} + +//------------------------------------------------------------------------------------------------------------- + +function get_allocatable_to_supp_transactions($supplier_id, $trans_no=null, $type=null) +{ + if ($trans_no != null && $type!= null) + { + return get_supplier_transactions("amt", "".TB_PREF."supp_trans.trans_no = ".TB_PREF."supp_allocations.trans_no_to + AND ".TB_PREF."supp_trans.type = ".TB_PREF."supp_allocations.trans_type_to + AND ".TB_PREF."supp_allocations.trans_no_from=$trans_no + AND ".TB_PREF."supp_allocations.trans_type_from=$type + AND ".TB_PREF."supp_trans.supplier_id=$supplier_id", + "".TB_PREF."supp_allocations"); + } + else + { + return get_supplier_transactions(null, "round(ABS(ov_amount+ov_gst+ov_discount)-alloc,6) > 0 + AND ".TB_PREF."supp_trans.type != 22 + AND ".TB_PREF."supp_trans.supplier_id=$supplier_id"); + } +} + + +?> \ No newline at end of file diff --git a/purchasing/includes/db/suppliers_db.inc b/purchasing/includes/db/suppliers_db.inc new file mode 100644 index 00000000..792a5ec9 --- /dev/null +++ b/purchasing/includes/db/suppliers_db.inc @@ -0,0 +1,161 @@ + 0, + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date)) >= ".TB_PREF."payment_terms.days_before_due + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= 0 + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + + )) AS Due, + + Sum(IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $past1) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= $past1) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + + )) AS Overdue1, + + Sum(IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $past2) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= $past2) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + + )) AS Overdue2 + + FROM ".TB_PREF."suppliers, + ".TB_PREF."payment_terms, + ".TB_PREF."supp_trans + + WHERE + ".TB_PREF."suppliers.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."suppliers.supplier_id = $supplier_id + AND ".TB_PREF."supp_trans.tran_date <= '$todate' + AND ".TB_PREF."suppliers.supplier_id = ".TB_PREF."supp_trans.supplier_id + + GROUP BY + ".TB_PREF."suppliers.supp_name, + ".TB_PREF."payment_terms.terms, + ".TB_PREF."payment_terms.days_before_due, + ".TB_PREF."payment_terms.day_in_following_month"; + + $result = db_query($sql,"The customer details could not be retrieved"); + + if (db_num_rows($result) == 0) + { + + /*Because there is no balance - so just retrieve the header information about the customer - the choice is do one query to get the balance and transactions for those customers who have a balance and two queries for those who don't have a balance OR always do two queries - I opted for the former */ + + $nil_balance = true; + + $sql = "SELECT ".TB_PREF."suppliers.supp_name, ".TB_PREF."suppliers.curr_code, ".TB_PREF."suppliers.supplier_id, ".TB_PREF."payment_terms.terms + FROM ".TB_PREF."suppliers, + ".TB_PREF."payment_terms + WHERE + ".TB_PREF."suppliers.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."suppliers.supplier_id = '$supplier_id'"; + + $result = db_query($sql,"The customer details could not be retrieved"); + + } + else + { + $nil_balance = false; + } + + $supp = db_fetch($result); + + if ($nil_balance == true) + { + $supp["Balance"] = 0; + $supp["Due"] = 0; + $supp["Overdue1"] = 0; + $supp["Overdue2"] = 0; + } + + return $supp; + +} + +function get_supplier($supplier_id) +{ + $sql = "SELECT * FROM ".TB_PREF."suppliers WHERE supplier_id=$supplier_id"; + + $result = db_query($sql, "could not get supplier"); + + return db_fetch($result); +} + +function get_supplier_name($supplier_id) +{ + $sql = "SELECT supp_name AS name FROM ".TB_PREF."suppliers WHERE supplier_id=$supplier_id"; + + $result = db_query($sql, "could not get supplier"); + + $row = db_fetch_row($result); + + return $row[0]; +} + +function get_supplier_accounts($supplier_id) +{ + $sql = "SELECT payable_account,purchase_account,payment_discount_account FROM ".TB_PREF."suppliers WHERE supplier_id=$supplier_id"; + + $result = db_query($sql, "could not get supplier"); + + return db_fetch($result); +} + + +?> \ No newline at end of file diff --git a/purchasing/includes/index.php b/purchasing/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/includes/po_class.inc b/purchasing/includes/po_class.inc new file mode 100644 index 00000000..eaa35f98 --- /dev/null +++ b/purchasing/includes/po_class.inc @@ -0,0 +1,147 @@ +line_items = array(); + $this->lines_on_order = $this->order_no = $this->supplier_id = 0; + } + + function add_to_order($line_no, $stock_id, $qty, $item_descr, $price, $uom, $req_del_date, $qty_inv, $qty_recd) + { + if ($qty != 0 && isset($qty)) + { + $this->line_items[$line_no] = new line_details($line_no, $stock_id, $item_descr, $qty, $price, $uom, $req_del_date, $qty_inv, $qty_recd); + $this->lines_on_order++; + Return 1; + } + Return 0; + } + + function update_order_item($line_no, $qty, $price, $req_del_date) + { + $this->line_items[$line_no]->quantity = $qty; + $this->line_items[$line_no]->price = $price; + $this->line_items[$line_no]->req_del_date = $req_del_date; + $this->line_items[$line_no]->price = $price; + } + + function remove_from_order($line_no) + { + $this->line_items[$line_no]->Deleted = true; + } + + function order_has_items() + { + if (count($this->line_items) > 0) + { + foreach ($this->line_items as $ordered_items) + { + if ($ordered_items->Deleted == false) + { + return true; + } + } + } + return false; + } + + function clear_items() + { + unset($this->line_items); + $this->line_items = array(); + + $this->lines_on_order = 0; + $this->order_no = 0; + } + + + function any_already_received() + { + /* Checks if there have been deliveries or invoiced entered against any of the line items */ + if (count($this->line_items) > 0) + { + foreach ($this->line_items as $ordered_items) + { + if ($ordered_items->qty_received != 0 || $ordered_items->qty_inv != 0) + { + return 1; + } + } + } + return 0; + } + + function some_already_received($line_no) + { + /* Checks if there have been deliveries or amounts invoiced against a specific line item */ + if (count($this->line_items) > 0) + { + if ($this->line_items[$line_no]->qty_received != 0 || + $this->line_items[$line_no]->qty_inv != 0) + { + return 1; + } + } + return 0; + } +} /* end of class defintion */ + +class line_details +{ + + Var $line_no; + Var $po_detail_rec; + Var $stock_id; + Var $item_description; + Var $quantity; + Var $price; + Var $units; + Var $req_del_date; + Var $qty_inv; + Var $qty_received; + Var $standard_cost; + Var $receive_qty; + Var $Deleted; + + function line_details($line_no, $stock_item, $item_descr, $qty, $prc, $uom, $req_del_date, $qty_inv, $qty_recd) + { + + /* Constructor function to add a new LineDetail object with passed params */ + $this->line_no = $line_no; + $this->stock_id = $stock_item; + $this->item_description = $item_descr; + $this->quantity = $qty; + $this->req_del_date = $req_del_date; + $this->price = $prc; + $this->units = $uom; + $this->qty_received = $qty_recd; + $this->qty_inv = $qty_inv; + $this->receive_qty = 0; /*initialise these last two only */ + $this->standard_cost =0; + $this->Deleted = false; + } +} + +?> diff --git a/purchasing/includes/purchasing_db.inc b/purchasing/includes/purchasing_db.inc new file mode 100644 index 00000000..9ab331fe --- /dev/null +++ b/purchasing/includes/purchasing_db.inc @@ -0,0 +1,59 @@ + \ No newline at end of file diff --git a/purchasing/includes/purchasing_ui.inc b/purchasing/includes/purchasing_ui.inc new file mode 100644 index 00000000..21cc8f7a --- /dev/null +++ b/purchasing/includes/purchasing_ui.inc @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/purchasing/includes/supp_trans_class.inc b/purchasing/includes/supp_trans_class.inc new file mode 100644 index 00000000..596114c9 --- /dev/null +++ b/purchasing/includes/supp_trans_class.inc @@ -0,0 +1,207 @@ +grn_items = array(); + $this->gl_codes = array(); + } + + function add_grn_to_trans($grn_item_id, $po_detail_item, $item_code, $item_description, + $qty_recd, $prev_quantity_inv, $this_quantity_inv, $order_price, $chg_price, + $Complete, $std_cost_unit, $gl_code) + { + $this->grn_items[$grn_item_id] = new grn_item($grn_item_id, $po_detail_item, + $item_code, $item_description, $qty_recd, $prev_quantity_inv, $this_quantity_inv, + $order_price, $chg_price, $Complete, $std_cost_unit, $gl_code); + return 1; + } + + function add_gl_codes_to_trans($gl_code, $gl_act_name, $gl_dim, $gl_dim2, $amount, $memo_) + { + $this->gl_codes[$this->gl_codes_counter] = new gl_codes($this->gl_codes_counter, + $gl_code, $gl_act_name, $gl_dim, $gl_dim2, $amount, $memo_); + $this->gl_codes_counter++; + return 1; + } + + function remove_grn_from_trans(&$grn_item_id) + { + unset($this->grn_items[$grn_item_id]); + } + function remove_gl_codes_from_trans(&$gl_code_counter) + { + unset($this->gl_codes[$gl_code_counter]); + } + + function is_valid_trans_to_post() + { + return (count($this->grn_items) > 0 || count($this->gl_codes) > 0 || + ($this->ov_amount != 0) || ($this->ov_discount > 0)); + } + + function clear_items() + { + unset($this->grn_items); + unset($this->gl_codes); + $this->ov_amount = $this->ov_discount = $this->supplier_id = 0; + + $this->grn_items = array(); + $this->gl_codes = array(); + } + + function get_taxes($tax_group_id=null, $shipping_cost=0) + { + $items = array(); + $prices = array(); + + if ($tax_group_id == null) + $tax_group_id = $this->tax_group_id; + + // preload the taxgroup ! + $tax_group = get_tax_group_items_as_array($tax_group_id); + + foreach ($this->grn_items as $ln_itm) + { + $items[] = $ln_itm->item_code; + $prices[] = ($ln_itm->this_quantity_inv * $ln_itm->taxfree_charge_price($tax_group_id, $tax_group)); + } + + if ($tax_group_id == null) + $tax_group_id = $this->tax_group_id; + + $taxes = get_tax_for_items($items, $prices, $shipping_cost, $tax_group_id); + + return $taxes; + } + + function get_total_charged($tax_group_id=null) + { + $total = 0; + + // preload the taxgroup ! + if ($tax_group_id != null) + $tax_group = get_tax_group_items_as_array($tax_group_id); + else + $tax_group = null; + + foreach ($this->grn_items as $ln_itm) + $total += ($ln_itm->this_quantity_inv * $ln_itm->taxfree_charge_price($tax_group_id, $tax_group)); + + foreach ($this->gl_codes as $gl_line) + $total += $gl_line->amount; + + return $total; + } + +} /* end of class defintion */ + +class grn_item +{ + +/* Contains relavent information from the purch_order_details as well to provide in cached form, +all the info to do the necessary entries without looking up ie additional queries of the database again */ + + var $id; + var $po_detail_item; + var $item_code; + var $item_description; + var $qty_recd; + var $prev_quantity_inv; + var $this_quantity_inv; + var $order_price; + var $chg_price; + var $Complete; + var $std_cost_unit; + var $gl_code; + + function grn_item ($id, $po_detail_item, $item_code, $item_description, $qty_recd, + $prev_quantity_inv, $this_quantity_inv, $order_price, $chg_price, $Complete, + $std_cost_unit, $gl_code) + { + + $this->id = $id; + $this->po_detail_item = $po_detail_item; + $this->item_code = $item_code; + $this->item_description = $item_description; + $this->qty_recd = $qty_recd; + $this->prev_quantity_inv = $prev_quantity_inv; + $this->this_quantity_inv = $this_quantity_inv; + $this->order_price =$order_price; + $this->chg_price = $chg_price; + $this->Complete = $Complete; + $this->std_cost_unit = $std_cost_unit; + $this->gl_code = $gl_code; + } + + function full_charge_price() + { + return $this->chg_price; + } + + function taxfree_charge_price($tax_group_id, $tax_group=null) + { + if ($tax_group_id==null) + return $this->chg_price; + return get_tax_free_price_for_item($this->item_code, $this->chg_price, $tax_group_id, $tax_group); + } +} + + +class gl_codes +{ + + var $Counter; + var $gl_code; + var $gl_act_name; + var $gl_dim; + var $gl_dim2; + var $amount; + var $memo_; + + function gl_codes ($Counter, $gl_code, $gl_act_name, $gl_dim, $gl_dim2, $amount, $memo_) + { + + /* Constructor function to add a new gl_codes object with passed params */ + $this->Counter = $Counter; + $this->gl_code = $gl_code; + $this->gl_act_name = $gl_act_name; + $this->gl_dim = $gl_dim; + $this->gl_dim2 = $gl_dim2; + $this->amount = $amount; + $this->memo_= $memo_; + } +} + +?> diff --git a/purchasing/includes/ui/grn_ui.inc b/purchasing/includes/ui/grn_ui.inc new file mode 100644 index 00000000..4a5835ee --- /dev/null +++ b/purchasing/includes/ui/grn_ui.inc @@ -0,0 +1,58 @@ +supplier_name, "class='tableheader2'"); + + if (!is_company_currency($po->curr_code)) + label_cells(_("Order Currency"), $po->curr_code, "class='tableheader2'"); + + label_cells(_("For Purchase Order"), get_trans_view_str(systypes::po(), $po->order_no), + "class='tableheader2'"); + + label_cells(_("Ordered On"), $po->orig_order_date, "class='tableheader2'"); + label_cells(_("Supplier's Reference"), $po->requisition_no, "class='tableheader2'"); + end_row(); + + start_row(); + if ($editable) + { + if (!isset($_POST['ref'])) + $_POST['ref'] = references::get_next(25); + ref_cells(_("Reference"), 'ref', null, "class='tableheader2'"); + + if (!isset($_POST['Location'])) + $_POST['Location'] = $po->Location; + label_cell(_("Deliver Into Location"), "class='tableheader2'"); + locations_list_cells(null, "Location", $_POST['Location']); + + if (!isset($_POST['DefaultReceivedDate'])) + $_POST['DefaultReceivedDate'] = Today(); + + date_cells(_("Date Items Received"), 'DefaultReceivedDate', null, 0, 0, 0, "class='tableheader2'"); + + } + else + { + label_cells(_("Reference"), $po->reference, "class='tableheader2'"); + label_cells(_("Deliver Into Location"), get_location_name($po->Location), "class='tableheader2'"); + } + + end_row(); + + if (!$editable) + + label_row(_("Delivery Address"), $po->delivery_address, "class='tableheader2'", "colspan=9"); + + if ($po->Comments != "") + label_row(_("Order Comments"), $po->Comments, "class='tableheader2'", "colspan=9"); + end_table(1); +} + +?> \ No newline at end of file diff --git a/purchasing/includes/ui/index.php b/purchasing/includes/ui/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/includes/ui/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/includes/ui/invoice_ui.inc b/purchasing/includes/ui/invoice_ui.inc new file mode 100644 index 00000000..1c1beae3 --- /dev/null +++ b/purchasing/includes/ui/invoice_ui.inc @@ -0,0 +1,374 @@ +Comments; + $_POST['tran_date'] = $supp_trans->tran_date; + $_POST['due_date'] = $supp_trans->due_date; + $_POST['supp_reference'] = $supp_trans->supp_reference; + $_POST['reference'] = $supp_trans->reference; + $_POST['supplier_id'] = $supp_trans->supplier_id; + $_POST['tax_group_id'] = $supp_trans->tax_group_id; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_to_trans(&$supp_trans) +{ + $supp_trans->Comments = $_POST['Comments']; + $supp_trans->tran_date = $_POST['tran_date']; + $supp_trans->due_date = $_POST['due_date']; + $supp_trans->supp_reference = $_POST['supp_reference']; + $supp_trans->reference = $_POST['reference']; + $supp_trans->tax_group_id = $_POST['tax_group_id']; + + + $supp_trans->ov_amount = 0; /* for starters */ + if (count($supp_trans->grn_items) > 0) + { + foreach ( $supp_trans->grn_items as $grn) + { + $supp_trans->ov_amount += ($grn->this_quantity_inv * $grn->chg_price); + } + } + if (count($supp_trans->gl_codes) > 0) + { + foreach ( $supp_trans->gl_codes as $gl_line) + { + $supp_trans->ov_amount += $gl_line->amount; + } + } +} + +//-------------------------------------------------------------------------------------------------- + +function invoice_header(&$supp_trans) +{ + // if vars have been lost, recopy + if (!isset($_POST['tran_date'])) + copy_from_trans($supp_trans); + + start_table("width=100%", 5); + start_row(); + echo""; // outer + + echo ""; + + if (!isset($_POST['supplier_id']) && (get_global_supplier() != reserved_words::get_all())) + $_POST['supplier_id'] = get_global_supplier(); + + supplier_list_row(_("Supplier:"), 'supplier_id', $_POST['supplier_id'], false, true); + + if ($supp_trans->supplier_id != $_POST['supplier_id']) + { + // supplier has changed + // delete all the order items - drastic but necessary because of + // change of currency, etc + $supp_trans->clear_items(); + read_supplier_details_to_trans($supp_trans, $_POST['supplier_id']); + copy_from_trans($supp_trans); + } + + if ($supp_trans->is_invoice) + ref_row(_("Reference:"), 'reference', references::get_next(20)); + else + ref_row(_("Reference:"), 'reference', references::get_next(21)); + + text_row(_("Supplier's Ref.:"), 'supp_reference', $_POST['supp_reference'], 20, 20); + + echo "
"; + + echo ""; // outer + + echo ""; + + date_row(_("Date") . ":", 'tran_date', null, 0, 0, 0, "", true); + + date_row(_("Due Date") . ":", 'due_date', null); + + label_row(_("Terms:"), $supp_trans->terms_description); + + echo "
"; + + echo ""; // outer + + echo ""; + + $supplier_currency = get_supplier_currency($supp_trans->supplier_id); + + $company_currency = get_company_currency(); + + if ($supplier_currency != $company_currency) + { + label_row(_("Supplier's Currency:"), "" . $supplier_currency . ""); + exchange_rate_display($supplier_currency, $company_currency, $_POST['tran_date']); + } + + + if (!isset($_POST['tax_group_id'])) + $_POST['tax_group_id'] = $supp_trans->tax_group_id; + tax_groups_list_row(_("Tax Group:"), 'tax_group_id', $_POST['tax_group_id'], true); + + echo "
"; + + echo ""; + end_row(); + end_table(); // outer +} + +//-------------------------------------------------------------------------------------------------- + +function invoice_totals(&$supp_trans) +{ + global $table_style, $table_style2; + + copy_to_trans($supp_trans); + + start_table("$table_style width=95%"); + label_row(_("Sub-total:"), number_format2( $supp_trans->ov_amount,user_price_dec()), "align=right", "align=right"); + + $taxes = $supp_trans->get_taxes($_POST['tax_group_id']); + $tax_total = display_edit_tax_items($taxes, 1); + + $display_total = number_format2(( $supp_trans->ov_amount + $tax_total), user_price_dec()); + + if ($supp_trans->is_invoice) + label_row(_("Invoice Total:"), $display_total, "align=right", "align=right"); + else + label_row("" . _("Credit Note Total:") . "", + "$display_total", "align=right", "nowrap align=right"); + + end_table(); + br(1); + start_table($table_style2); + textarea_row(_("Memo:"), "Comments", null, 50, 3); + end_table(); + br(1); +} + +//-------------------------------------------------------------------------------------------------- + +// $mode = 0 display on invoice page +// = 1 display on gl items edit page +// = 2 display on view invoice +// = 3 display on view credit + +function display_gl_items(&$supp_trans, $mode=0) +{ + global $table_style, $path_to_root; + + if ($mode == 0 && isset($_POST["InvGL"])) + { + copy_to_trans($supp_trans); + meta_forward("$path_to_root/purchasing/supplier_trans_gl.php"); + exit; + } + + // if displaying in form, and no items, exit + if (($mode == 2 || $mode == 3) && count($supp_trans->gl_codes) == 0) + return; + + echo "
"; + + start_table("width=95%"); + echo ""; // outertable + + if ($supp_trans->is_invoice) + $heading = _("GL Items for this Invoice"); + else + $heading = _("GL Items for this Credit Note"); + + echo ""; + echo ""; + if ($mode == 0) + { + submit_cells('InvGL', _("Edit"), "align=right"); + } + echo "
$heading
"; + + echo ""; // ouer table + + echo ""; + + $dim = get_company_pref('use_dimension'); + if ($dim == 2) + $th = array(_("Account"), _("Name"), _("Dimension")." 1", _("Dimension")." 2", _("Amount"), _("Memo")); + else if ($dim == 1) + $th = array(_("Account"), _("Name"), _("Dimension"), _("Amount"), _("Memo")); + else + $th = array(_("Account"), _("Name"), _("Amount"), _("Memo")); + + table_header($th); + $total_gl_value=0; + $i = $k = 0; + + if (count($supp_trans->gl_codes) > 0) + { + + foreach ($supp_trans->gl_codes as $entered_gl_code) + { + + alt_table_row_color($k); + + if ($mode == 3) + $entered_gl_code->amount = -$entered_gl_code->amount; + + label_cell($entered_gl_code->gl_code); + label_cell($entered_gl_code->gl_act_name); + + if ($dim >= 1) + label_cell(get_dimension_string($entered_gl_code->gl_dim, true)); + if ($dim > 1) + label_cell(get_dimension_string($entered_gl_code->gl_dim2, true)); + + amount_cell($entered_gl_code->amount); + label_cell($entered_gl_code->memo_); + + if ($mode == 1) + delete_link_cell(SID . "Delete=" . $entered_gl_code->Counter); + + end_row(); + + $total_gl_value += $entered_gl_code->amount; + + $i++; + if ($i > 15) + { + $i = 0; + table_header($th); + } + } + + } + $colspan = ($dim == 2 ? 4 : ($dim == 1 ? 3 : 2)); + label_row(_("Total"), number_format2($total_gl_value,user_price_dec()), + "colspan=".$colspan." align=right", "nowrap align=right"); + + echo "
"; + + echo ""; + + end_table(); // outertable + + return $total_gl_value; +} + +//-------------------------------------------------------------------------------------------------- + +// $mode = 0 display on invoice page +// = 1 display on grn items edit page +// = 2 display on view invoice +// = 3 display on view credit + +function display_grn_items(&$supp_trans, $mode=0) +{ + global $table_style, $path_to_root; + + if ($mode == 0 && isset($_POST["InvGRN"])) + { + copy_to_trans($supp_trans); + if ($supp_trans->is_invoice) + meta_forward("$path_to_root/purchasing/supplier_invoice_grns.php"); + else + meta_forward("$path_to_root/purchasing/supplier_credit_grns.php"); + exit; + } + + // if displaying in form, and no items, exit + if (($mode == 2 || $mode == 3) && count($supp_trans->grn_items) == 0) + return; + br(1); + start_table("width=95%"); + echo ""; // outertable + + if ($supp_trans->is_invoice) + $heading = _("Received Items Charged on this Invoice"); + else + $heading = _("Received Items Credited on this Note"); + + echo ""; + echo ""; + if ($mode == 0) + { + submit_cells('InvGRN', _("Edit"), "align=right"); + } + echo "
$heading
"; + + echo ""; // outer table + + echo ""; + $th = array(_("Delivery Sequence #"), _("Item"), _("Description"), + _("Quantity"), _("Price"), _("Line Value")); + + table_header($th); + $total_grn_value = 0; + $i = $k = 0; + + if (count($supp_trans->grn_items) > 0) + { + + foreach ($supp_trans->grn_items as $entered_grn) + { + + alt_table_row_color($k); + + label_cell(get_trans_view_str(25,$entered_grn->id)); + label_cell($entered_grn->item_code); + label_cell($entered_grn->item_description); + qty_cell(abs($entered_grn->this_quantity_inv)); + amount_cell($entered_grn->chg_price); + amount_cell($entered_grn->chg_price * abs($entered_grn->this_quantity_inv)); + + if ($mode == 1) + delete_link_cell(SID . "Delete=" . $entered_grn->id); + + end_row(); + + $total_grn_value += ($entered_grn->chg_price * abs($entered_grn->this_quantity_inv)); + + $i++; + if ($i > 15) + { + $i = 0; + table_header($th); + } + } + } + + label_row(_("Total"), number_format2($total_grn_value,user_price_dec()), + "colspan=5 align=right", "nowrap align=right"); + echo "
"; + + echo ""; + + end_table(); // outertable + + return $total_grn_value; +} + +//-------------------------------------------------------------------------------------------------- +function get_duedate_from_terms(&$supp_trans) +{ + $disp = user_date_display(); + + if (!is_date($supp_trans->tran_date)) + { + $supp_trans->tran_date = Today(); + } + $date_array = explode_date_to_dmy($supp_trans->tran_date); + + if (substr( $supp_trans->terms, 0, 1) == "1") + { /*Its a day in the following month when due */ + $supp_trans->due_date = date($disp, Mktime(0,0,0,$date_array[1]+1, substr( $supp_trans->terms,1),$date_array[2])); + } + else + { /*Use the Days Before Due to add to the invoice date */ + $supp_trans->due_date = date($disp, Mktime(0,0,0,$date_array[1],$date_array[0] + (int) substr( $supp_trans->terms,1),$date_array[2])); + } +} + +//-------------------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/purchasing/includes/ui/po_ui.inc b/purchasing/includes/ui/po_ui.inc new file mode 100644 index 00000000..e074abaf --- /dev/null +++ b/purchasing/includes/ui/po_ui.inc @@ -0,0 +1,334 @@ +curr_code = $_POST['curr_code'] = $myrow["curr_code"]; + $order->supplier_name = $_POST['supplier_name'] = $myrow["supp_name"]; + $order->supplier_id = $_POST['supplier_id'] = $supplier_id; +} + +//--------------------------------------------------------------------------------------------------- + +function create_new_po() +{ + if (isset($_SESSION['PO'])) + { + unset ($_SESSION['PO']->line_items); + $_SESSION['PO']->lines_on_order = 0; + unset ($_SESSION['PO']); + } + + session_register("PO"); + + $_SESSION['PO'] = new purch_order; + $_POST['OrderDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['OrderDate'])) + $_POST['OrderDate'] = end_fiscalyear(); + $_SESSION['PO']->orig_order_date = $_POST['OrderDate']; +} + +//--------------------------------------------------------------------------------------------------- + +function display_po_header(&$order) +{ + global $table_style2; + + $editable = ($order->order_no == 0); + + start_table("width=80% $table_style2"); + echo ""; // outer table + echo ""; + + if ($editable) + { + if (!isset($_POST['supplier_id']) && (get_global_supplier() != reserved_words::get_all())) + $_POST['supplier_id'] = get_global_supplier(); + + supplier_list_row(_("Supplier:"), 'supplier_id', $_POST['supplier_id'], false, true); + + if ($order->supplier_id != $_POST['supplier_id']) + { + // supplier has changed + // delete all the order items - drastic but necessary because of + // change of currency, etc + $order->clear_items(); + } + } + else + { + hidden('supplier_id', $order->supplier_id); + label_row(_("Supplier:"), $order->supplier_name); + } + + //if ($editable || ($order->supplier_id != $_POST['supplier_id'])) + get_supplier_details_to_order($order, $_POST['supplier_id']); + + set_global_supplier($_POST['supplier_id']); + + if (!is_company_currency($order->curr_code)) + { + label_row(_("Supplier Currency:"), $order->curr_code); + exchange_rate_display($order->curr_code, get_company_currency(), + $_POST['OrderDate']); + } + + if ($editable) + { + ref_row(_("Reference:"), 'ref', references::get_next(systypes::po())); + } + else + { + hidden('ref', $order->reference); + label_row(_("Reference:"), $order->reference); + } + + echo "
"; + + echo ""; // outer table + + echo ""; + // kolla det här????????? + //if (!isset($_POST['OrderDate']) || $_POST['OrderDate'] == "") + // $_POST['OrderDate'] = $order->orig_order_date; + //if (!isset($_POST['OrderDate']) || $_POST['OrderDate'] == "") + //{ + // $_POST['OrderDate'] = Today(); + // if (!is_date_in_fiscalyear($_POST['OrderDate'])) + // $_POST['OrderDate'] = end_fiscalyear(); + //} + text_row(_("Order Date:"), 'OrderDate', $_POST['OrderDate'], 12, 12); + + text_row(_("Supplier's Reference:"), 'Requisition', null, 16, 15); + + echo "
"; + + echo ""; // outer table + + echo ""; + + echo ""; + echo ""; + + if (!isset($_POST['StkLocation']) || $_POST['StkLocation'] == "" || + isset($_POST['GetAddress']) || !isset($_POST['delivery_address']) || + $_POST['delivery_address'] == "") + { + /*If this is the first time the form loaded set up defaults */ + + //$_POST['StkLocation'] = $_SESSION['UserStockLocation']; + $sql = "SELECT delivery_address, phone FROM ".TB_PREF."locations WHERE loc_code='" . $_POST['StkLocation'] . "'"; + $result = db_query($sql,"could not get location info"); + + if (db_num_rows($result) == 1) + { + $loc_row = db_fetch($result); + $_POST['delivery_address'] = $loc_row["delivery_address"]; + $_SESSION['PO']->Location = $_POST['StkLocation']; + $_SESSION['PO']->delivery_address = $_POST['delivery_address']; + + } + else + { /*The default location of the user is crook */ + echo "
" . _("The default stock location set up for this user is not a currently defined stock location. Your system administrator needs to amend your user record."); + } + } + + textarea_row(_("Deliver to:"), 'delivery_address', $_POST['delivery_address'], 35, 4); + echo "
" . _("Receive Into:") . ""; + locations_list('StkLocation', null); + echo " "; + submit('GetAddress', _("Get Address")); + echo "
"; + + echo ""; + end_table(); // outer table +} + +//--------------------------------------------------------------------------------------------------- + +function display_po_items(&$order, $editable=true) +{ + global $table_style; + + display_heading2(_("Order Items")); + + start_table("$table_style width=80%"); + + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), _("Unit"), + _("Required Delivery Date"), _("Price"), _("Line Total")); + table_header($th); + + $total = 0; + $k = 0; + foreach ($order->line_items as $po_line) + { + + if ($po_line->Deleted == false) + { + $line_total = $po_line->quantity * $po_line->price; + if (!$editable || !isset($_GET['Edit']) || $_GET['Edit'] != $po_line->line_no) + { + alt_table_row_color($k); + label_cell($po_line->stock_id); + label_cell($po_line->item_description); + qty_cell($po_line->quantity); + label_cell($po_line->units); + label_cell($po_line->req_del_date); + amount_cell($po_line->price); + amount_cell($line_total); + + if ($editable) + { + edit_link_cell(SID."Edit=" . $po_line->line_no); + delete_link_cell(SID."Delete=" . $po_line->line_no); + } + end_row(); + } + else + { + po_item_controls($order, $po_line->stock_id); + } + $total += $line_total; + } + } + + if (!isset($_GET['Edit']) && $editable) + po_item_controls($order); + + $display_total = number_format2($total,user_price_dec()); + label_row(_("Total Excluding Shipping/Tax"), $display_total, "colspan=6 align=right", + "nowrap align=right"); + + end_table(1); +} + +//--------------------------------------------------------------------------------------------------- + +function display_po_summary(&$po, $is_self=false, $editable=false) +{ + global $table_style2; + start_table("$table_style2 width=90%"); + + start_row(); + label_cells(_("Reference"), $po->reference, "class='tableheader2'"); + + label_cells(_("Supplier"), $po->supplier_name, "class='tableheader2'"); + + if (!is_company_currency($po->curr_code)) + label_cells(_("Order Currency"), $po->curr_code, "class='tableheader2'"); + + if (!$is_self) + { + label_cells(_("Purchase Order"), get_trans_view_str(systypes::po(), $po->order_no), + "class='tableheader2'"); + } + end_row(); + start_row(); + label_cells(_("Date"), $po->orig_order_date, "class='tableheader2'"); + + if ($editable) + { + if (!isset($_POST['Location'])) + $_POST['Location'] = $po->Location; + label_cell(_("Deliver Into Location"), "class='tableheader2'"); + locations_list_cells(null, 'Location', $_POST['Location']); + } + else + { + label_cells(_("Deliver Into Location"), get_location_name($po->Location), + "class='tableheader2'"); + } + + if ($po->requisition_no != "") + label_cells(_("Supplier's Reference"), $po->requisition_no, "class='tableheader2'"); + end_row(); + + if (!$editable) + label_row(_("Delivery Address"), $po->delivery_address, "class='tableheader2'", + "colspan=9"); + + if ($po->Comments != "") + label_row(_("Order Comments"), $po->Comments, "class='tableheader2'", + "colspan=9"); + end_table(1); +} + +//-------------------------------------------------------------------------------- + +function po_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) && $stock_id != null) + { + hidden('line_no', $_GET['Edit']); + + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$_GET['Edit']]->stock_id; + if (!isset($_POST['qty']) || ($_POST['qty'] == "")) + $_POST['qty'] = $order->line_items[$_GET['Edit']]->quantity; + if (!isset($_POST['price']) || ($_POST['price'] == "")) + $_POST['price'] = $order->line_items[$_GET['Edit']]->price; + if (!isset($_POST['req_del_date']) || ($_POST['req_del_date'] == "")) + $_POST['req_del_date'] = $order->line_items[$_GET['Edit']]->req_del_date; + + $_POST['units'] = $order->line_items[$_GET['Edit']]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$_GET['Edit']]->item_description); + } + else + { + + hidden('line_no', ($_SESSION['PO']->lines_on_order + 1)); + + text_cells(null, "StockID2", "", 12, 10, "", "", "onkeyup='recalcAccounts();' onKeyDown='if(event.keyCode==13) event.keyCode=9;' onblur='return setAccount(0, true);'"); + stock_purchasable_items_list_cells(null, 'stock_id', $_POST['stock_id'], false, false, "onchange='return setAccount(1, true)'"); + + $item_info = get_item_edit_info($_POST['stock_id']); + $_POST['units'] = $item_info["units"]; + + $_POST['qty'] = 1; + $_POST['price'] = get_purchase_price ($order->supplier_id, $_POST['stock_id']); + $_POST['req_del_date'] = date(user_date_display(),Mktime(0,0,0,date("m"),date("d")+10,date("y"))); + } + + text_cells(null, 'qty', null, 13, 15); + + label_cell($_POST['units']); + text_cells(null, 'req_del_date', null, 12, 12); + text_cells(null, 'price', null, 15, 14); + + //$line_total = $_POST['qty'] * $_POST['price'] * (1 - $_POST['Disc'] / 100); + $line_total = $_POST['qty'] * $_POST['price']; + amount_cell($line_total); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateLine', _("Update")); + submit_cells('CancelUpdate', _("Cancel")); + } + else + { + submit_cells('EnterLine', _("Add Item"), "colspan=2"); + } + + end_row(); +} + +//--------------------------------------------------------------------------------------------------- + + + +?> \ No newline at end of file diff --git a/purchasing/index.php b/purchasing/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/inquiry/index.php b/purchasing/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/inquiry/po_search.php b/purchasing/inquiry/po_search.php new file mode 100644 index 00000000..dcdddc2c --- /dev/null +++ b/purchasing/inquiry/po_search.php @@ -0,0 +1,163 @@ + ".TB_PREF."purch_order_details.quantity_received)) As OverDue + FROM ".TB_PREF."purch_orders, ".TB_PREF."purch_order_details, ".TB_PREF."suppliers, ".TB_PREF."locations + WHERE ".TB_PREF."purch_orders.order_no = ".TB_PREF."purch_order_details.order_no + AND ".TB_PREF."purch_orders.supplier_id = ".TB_PREF."suppliers.supplier_id + AND ".TB_PREF."locations.loc_code = ".TB_PREF."purch_orders.into_stock_location + AND (".TB_PREF."purch_order_details.quantity_ordered > ".TB_PREF."purch_order_details.quantity_received) "; + +if (isset($order_number) && $order_number != "") +{ + $sql .= "AND ".TB_PREF."purch_orders.reference LIKE '%". $order_number . "%'"; +} +else +{ + + $data_after = date2sql($_POST['OrdersAfterDate']); + $data_before = date2sql($_POST['OrdersToDate']); + + $sql .= " AND ".TB_PREF."purch_orders.ord_date >= '$data_after'"; + $sql .= " AND ".TB_PREF."purch_orders.ord_date <= '$data_before'"; + + if (isset($_POST['StockLocation']) && $_POST['StockLocation'] != $all_items) + { + $sql .= " AND ".TB_PREF."purch_orders.into_stock_location = '". $_POST['StockLocation'] . "' "; + } + + if (isset($selected_stock_item)) + { + $sql .= " AND ".TB_PREF."purch_order_details.item_code='". $selected_stock_item ."' "; + } +} //end not order number selected + +$sql .= " GROUP BY ".TB_PREF."purch_orders.order_no"; + +$result = db_query($sql,"No orders were returned"); + +/*show a table of the orders returned by the sql */ + +start_table("$table_style colspan=7 width=80%"); + +if (isset($_POST['StockLocation']) && $_POST['StockLocation'] == $all_items) + $th = array(_("#"), _("Reference"), _("Supplier"), _("Location"), + _("Supplier's Reference"), _("Order Date"), _("Currency"), _("Order Total")); +else + $th = array(_("#"), _("Reference"), _("Supplier"), + _("Supplier's Reference"), _("Order Date"), _("Currency"), _("Order Total")); + +table_header($th); + +$j = 1; +$k = 0; //row colour counter +$overdue_items = false; +while ($myrow = db_fetch($result)) +{ + + if ($myrow["OverDue"] == 1) + { + start_row("class='overduebg'"); + $overdue_items = true; + } + else + { + alt_table_row_color($k); + } + + $modify = "$path_to_root/purchasing/po_entry_items.php?" . SID . "ModifyOrderNumber=" . $myrow["order_no"]; + $receive = "$path_to_root/purchasing/po_receive_items.php?" . SID . "PONumber=" . $myrow["order_no"]; + + $date = sql2date($myrow["ord_date"]); + + label_cell(get_trans_view_str(systypes::po(), $myrow["order_no"])); + label_cell($myrow["reference"]); + label_cell($myrow["supp_name"]); + if (isset($_POST['StockLocation']) && $_POST['StockLocation'] == $all_items) + label_cell($myrow["location_name"]); + label_cell($myrow["requisition_no"]); + label_cell($date); + label_cell($myrow["curr_code"]); + amount_cell($myrow["OrderValue"]); + label_cell("" . _("Edit") . ""); + label_cell("" . _("Receive") . ""); + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +end_table(); + +if ($overdue_items) + display_note(_("Marked orders have overdue items."), 0, 1, "class='overduefg'"); + +end_page(); +?> diff --git a/purchasing/inquiry/po_search_completed.php b/purchasing/inquiry/po_search_completed.php new file mode 100644 index 00000000..fd74821f --- /dev/null +++ b/purchasing/inquiry/po_search_completed.php @@ -0,0 +1,139 @@ += '$data_after'"; + $sql .= " AND ".TB_PREF."purch_orders.ord_date <= '$date_before'"; + + if (isset($_POST['StockLocation']) && $_POST['StockLocation'] != reserved_words::get_all()) + { + $sql .= " AND ".TB_PREF."purch_orders.into_stock_location = '". $_POST['StockLocation'] . "' "; + } + if (isset($selected_stock_item)) + { + $sql .= " AND ".TB_PREF."purch_order_details.item_code='". $selected_stock_item ."' "; + } + +} //end not order number selected + +$sql .= " GROUP BY ".TB_PREF."purch_orders.order_no"; + +$result = db_query($sql,"No orders were returned"); + +start_table("$table_style colspan=7 width=80%"); + +if (isset($_POST['StockLocation']) && $_POST['StockLocation'] == reserved_words::get_all()) + $th = array(_("#"), _("Reference"), _("Supplier"), _("Location"), + _("Supplier's Reference"), _("Order Date"), _("Currency"), _("Order Total")); +else + $th = array(_("#"), _("Reference"), _("Supplier"), + _("Supplier's Reference"), _("Order Date"), _("Currency"), _("Order Total")); + +table_header($th); + +$j = 1; +$k = 0; //row colour counter +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + $date = sql2date($myrow["ord_date"]); + + label_cell(get_trans_view_str(systypes::po(), $myrow["order_no"])); + label_cell($myrow["reference"]); + label_cell($myrow["supp_name"]); + if (isset($_POST['StockLocation']) && $_POST['StockLocation'] == reserved_words::get_all()) + label_cell($myrow["location_name"]); + label_cell($myrow["requisition_no"]); + label_cell($date); + label_cell($myrow["curr_code"]); + amount_cell($myrow["OrderValue"]); + end_row(); + + $j++; + if ($j == 12) + { + $j = 1; + table_header($th); + } +} + +end_table(2); + +//--------------------------------------------------------------------------------------------------- + +end_page(); +?> diff --git a/purchasing/inquiry/supplier_allocation_inquiry.php b/purchasing/inquiry/supplier_allocation_inquiry.php new file mode 100644 index 00000000..f715ef50 --- /dev/null +++ b/purchasing/inquiry/supplier_allocation_inquiry.php @@ -0,0 +1,201 @@ += '$date_after' + AND ".TB_PREF."supp_trans.tran_date <= '$date_to'"; + if ($_POST['supplier_id'] != reserved_words::get_all()) + $sql .= " AND ".TB_PREF."supp_trans.supplier_id = '" . $_POST['supplier_id'] . "'"; + if (isset($_POST['filterType']) && $_POST['filterType'] != reserved_words::get_all()) + { + if (($_POST['filterType'] == '1') || ($_POST['filterType'] == '2')) + { + $sql .= " AND ".TB_PREF."supp_trans.type = 20 "; + } + elseif ($_POST['filterType'] == '3') + { + $sql .= " AND ".TB_PREF."supp_trans.type = 22 "; + } + elseif (($_POST['filterType'] == '4') || ($_POST['filterType'] == '5')) + { + $sql .= " AND ".TB_PREF."supp_trans.type = 21 "; + } + + if (($_POST['filterType'] == '2') || ($_POST['filterType'] == '5')) + { + $today = date2sql(Today()); + $sql .= " AND ".TB_PREF."supp_trans.due_date < '$today' "; + } + } + + if (!check_value('showSettled')) + { + $sql .= " AND (round(abs(ov_amount + ov_gst + ov_discount) - alloc,6) != 0) "; + } + + $sql .= " ORDER BY ".TB_PREF."supp_trans.tran_date"; + + return db_query($sql,"No supplier transactions were returned"); +} + +//------------------------------------------------------------------------------------------------ + +$result = get_transactions(); + +if (db_num_rows($result) == 0) +{ + display_note(_("There are no transactions to display for the given dates."), 1, 1); + end_page(); + exit; +} + +//------------------------------------------------------------------------------------------------ + +/*show a table of the transactions returned by the sql */ + +start_table("$table_style width=80%"); +if ($_POST['supplier_id'] == reserved_words::get_all()) + $th = array(_("Type"), _("Number"), _("Reference"), _("Supplier"), + _("Supp Reference"), _("Date"), _("Due Date"), _("Currency"), + _("Debit"), _("Credit"), _("Allocated"), _("Balance")); +else + $th = array(_("Type"), _("Number"), _("Reference"), _("Supp Reference"), _("Date"), _("Due Date"), + _("Debit"), _("Credit"), _("Allocated"), _("Balance")); +table_header($th); + +$j = 1; +$k = 0; //row colour counter +$over_due = false; +while ($myrow = db_fetch($result)) +{ + + if ($myrow['OverDue'] == 1) + { + start_row("class='overduebg'"); + $over_due = true; + } + else + { + alt_table_row_color($k); + } + + $date = sql2date($myrow["tran_date"]); + + $duedate = ((($myrow["type"] == 20) || ($myrow["type"]== 21))?sql2date($myrow["due_date"]):""); + + + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"])); + label_cell($myrow["reference"]); + if ($_POST['supplier_id'] == reserved_words::get_all()) + label_cell($myrow["supp_name"]); + label_cell($myrow["supp_reference"]); + label_cell($date); + label_cell($duedate); + if ($_POST['supplier_id'] == reserved_words::get_all()) + label_cell($myrow["curr_code"]); + if ($myrow["TotalAmount"] >= 0) + label_cell(""); + amount_cell(abs($myrow["TotalAmount"])); + if ($myrow["TotalAmount"] < 0) + label_cell(""); + amount_cell($myrow["Allocated"]); + if ($myrow["type"] == 1 || $myrow["type"] == 21 || $myrow["type"] == 22) + $balance = -$myrow["TotalAmount"] - $myrow["Allocated"]; + else + $balance = $myrow["TotalAmount"] - $myrow["Allocated"]; + amount_cell($balance); + + //if (($myrow["type"] == 1 || $myrow["type"] == 21 || $myrow["type"] == 22) && + // $myrow["Void"] == 0) + if (($myrow["type"] == 1 || $myrow["type"] == 21 || $myrow["type"] == 22) && + $balance > 0) + { + label_cell("" . _("Allocations") . ""); + } + + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +end_table(1); +if ($over_due) + display_note(_("Marked items are overdue."), 0, 1, "class='overduefg'"); + +end_page(); +?> diff --git a/purchasing/inquiry/supplier_inquiry.php b/purchasing/inquiry/supplier_inquiry.php new file mode 100644 index 00000000..bb6aa440 --- /dev/null +++ b/purchasing/inquiry/supplier_inquiry.php @@ -0,0 +1,224 @@ += '$date_after' + AND ".TB_PREF."supp_trans.tran_date <= '$date_to'"; + if ($_POST['supplier_id'] != reserved_words::get_all()) + $sql .= " AND ".TB_PREF."supp_trans.supplier_id = '" . $_POST['supplier_id'] . "'"; + if (isset($_POST['filterType']) && $_POST['filterType'] != reserved_words::get_all()) + { + if (($_POST['filterType'] == '1')) + { + $sql .= " AND (".TB_PREF."supp_trans.type = 20 OR ".TB_PREF."supp_trans.type = 2)"; + } + elseif (($_POST['filterType'] == '2')) + { + $sql .= " AND ".TB_PREF."supp_trans.type = 20 "; + } + elseif ($_POST['filterType'] == '3') + { + $sql .= " AND (".TB_PREF."supp_trans.type = 22 OR ".TB_PREF."supp_trans.type = 1) "; + } + elseif (($_POST['filterType'] == '4') || ($_POST['filterType'] == '5')) + { + $sql .= " AND ".TB_PREF."supp_trans.type = 21 "; + } + + if (($_POST['filterType'] == '2') || ($_POST['filterType'] == '5')) + { + $today = date2sql(Today()); + $sql .= " AND ".TB_PREF."supp_trans.due_date < '$today' "; + } + } + + $sql .= " ORDER BY ".TB_PREF."supp_trans.tran_date"; + + return db_query($sql,"No supplier transactions were returned"); +} + +//------------------------------------------------------------------------------------------------ + +if (($_POST['supplier_id'] != "") && ($_POST['supplier_id'] != reserved_words::get_all())) +{ + $supplier_record = get_supplier_details($_POST['supplier_id']); + display_supplier_summary($supplier_record); +} + +//------------------------------------------------------------------------------------------------ + +$result = get_transactions(); + +if (db_num_rows($result) == 0) +{ + display_note(_("There are no transactions to display for the given dates."), 1, 1); + end_page(); + exit; +} + +//------------------------------------------------------------------------------------------------ + +/*show a table of the transactions returned by the sql */ + +start_table("$table_style width=80%"); +if ($_POST['supplier_id'] == reserved_words::get_all()) + $th = array(_("Type"), _("#"), _("Reference"), _("Supplier"), + _("Supplier's Reference"), _("Date"), _("Due Date"), _("Currency"), + _("Debit"), _("Credit"), ""); +else + $th = array(_("Type"), _("#"), _("Reference"), + _("Supplier's Reference"), _("Date"), _("Due Date"), + _("Debit"), _("Credit"), ""); +table_header($th); + +$j = 1; +$k = 0; //row colour counter +$over_due = false; +while ($myrow = db_fetch($result)) +{ + + if ($myrow['OverDue'] == 1) + { + start_row("class='overduebg'"); + $over_due = true; + } + else + { + alt_table_row_color($k); + } + + $date = sql2date($myrow["tran_date"]); + + $duedate = ((($myrow["type"]== 20) || ($myrow["type"]== 21))?sql2date($myrow["due_date"]):""); + + + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"])); + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"], $myrow["reference"])); + if ($_POST['supplier_id'] == reserved_words::get_all()) + label_cell($myrow["supp_name"]); + label_cell($myrow["supp_reference"]); + label_cell($date); + label_cell($duedate); + if ($_POST['supplier_id'] == reserved_words::get_all()) + label_cell($myrow["curr_code"]); + if ($myrow["TotalAmount"] >= 0) + label_cell(""); + amount_cell(abs($myrow["TotalAmount"])); + if ($myrow["TotalAmount"] < 0) + label_cell(""); + + label_cell(get_gl_view_str($myrow["type"], $myrow["trans_no"])); + + end_row(); + + $j++; + If ($j == 12) + { + $j=1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +end_table(1); +if ($over_due) + display_note(_("Marked items are overdue."), 0, 1, "class='overduefg'"); + + +end_page(); +?> diff --git a/purchasing/manage/index.php b/purchasing/manage/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/manage/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/manage/suppliers.php b/purchasing/manage/suppliers.php new file mode 100644 index 00000000..82a651c8 --- /dev/null +++ b/purchasing/manage/suppliers.php @@ -0,0 +1,242 @@ + 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this supplier because there are transactions that refer to this supplier.")); + + } + else + { + $sql= "SELECT COUNT(*) FROM ".TB_PREF."purch_orders WHERE supplier_id='" . $_POST['supplier_id'] . "'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete the supplier record because purchase orders have been created against this supplier.")); + } + + } + if ($cancel_delete == 0) + { + $sql="DELETE FROM ".TB_PREF."suppliers WHERE supplier_id='" . $_POST['supplier_id']. "'"; + db_query($sql,"check failed"); + + unset($_SESSION['supplier_id']); + meta_forward($_SERVER['PHP_SELF']); + } //end if Delete supplier +} + +start_form(); + +if (db_has_suppliers()) +{ + start_table("", 3); + start_row(); + supplier_list_cells(_("Select a supplier: "), 'supplier_id', null); + submit_cells('SelectSupplier', _("Edit Supplier")); + end_row(); + end_table(); +} +else +{ + hidden('supplier_id', $_POST['supplier_id']); +} + +hyperlink_params($_SERVER['PHP_SELF'], _("Enter a new supplier"), "New=1"); +echo "
"; + +//start_table("class='tablestyle2'", 0, 3); +start_table("class='tablestyle'", 3); + +table_section_title(_("Supplier")); + +if (isset($_POST['supplier_id']) && !isset($_POST['New'])) +{ + //SupplierID exists - either passed when calling the form or from the form itself + $myrow = get_supplier($_POST['supplier_id']); + + $_POST['supp_name'] = $myrow["supp_name"]; + $_POST['address'] = $myrow["address"]; + $_POST['email'] = $myrow["email"]; + $_POST['bank_account'] = $myrow["bank_account"]; + $_POST['dimension_id'] = $myrow["dimension_id"]; + $_POST['dimension2_id'] = $myrow["dimension2_id"]; + $_POST['curr_code'] = $myrow["curr_code"]; + $_POST['payment_terms'] = $myrow["payment_terms"]; + $_POST['tax_group_id'] = $myrow["tax_group_id"]; + $_POST['payable_account'] = $myrow["payable_account"]; + $_POST['purchase_account'] = $myrow["purchase_account"]; + $_POST['payment_discount_account'] = $myrow["payment_discount_account"]; + +} +else +{ + // its a new supplier being added + hidden('New', 'Yes'); + + $company_record = get_company_prefs(); + + $_POST['payable_account'] = $company_record["creditors_act"]; + $_POST['purchase_account'] = $company_record["default_cogs_act"]; + $_POST['payment_discount_account'] = $company_record['pyt_discount_act']; +} + +text_row(_("Supplier Name:"), 'supp_name', null, 42, 40); +textarea_row(_("Address:"), 'address', null, 35, 5); +text_row(_("Email:"), 'email', null, 42, 40); +text_row(_("Bank Account:"), 'bank_account', null, 42, 40); + +// Sherifoz 23.09.03 currency can't be changed if editing +if (isset($_POST['supplier_id']) && !isset($_POST['New'])) +{ + label_row(_("Supplier's Currency:"), $_POST['curr_code']); + hidden('curr_code', $_POST['curr_code']); +} +else +{ + currencies_list_row(_("Supplier's Currency:"), 'curr_code', null); +} + +tax_groups_list_row(_("Tax Group:"), 'tax_group_id', null); + +payment_terms_list_row(_("Payment Terms:"), 'payment_terms', null); + +table_section_title(_("Accounts")); + +gl_all_accounts_list_row(_("Accounts Payable Account:"), 'payable_account', $_POST['payable_account']); + +gl_all_accounts_list_row(_("Purchase Account:"), 'purchase_account', $_POST['purchase_account']); + +gl_all_accounts_list_row(_("Purchase Discount Account:"), 'payment_discount_account', $_POST['payment_discount_account']); + +$dim = get_company_pref('use_dimension'); +if ($dim >= 1) +{ + table_section_title(_("Dimension")); + + dimensions_list_row(_("Dimension")." 1:", 'dimension_id', null, true, " ", false, 1); + if ($dim > 1) + dimensions_list_row(_("Dimension")." 2:", 'dimension2_id', null, true, " ", false, 2); +} +if ($dim < 1) + hidden('dimension_id', 0); +if ($dim < 2) + hidden('dimension2_id', 0); + +end_table(1); + +if (!isset($_POST['New'])) +{ + submit_center_first('submit', _("Update Supplier")); + submit_center_last('delete', _("Delete Supplier")); +} +else +{ + submit_center('submit', _("Add New Supplier Details")); +} + +end_form(); + +end_page(); + +?> diff --git a/purchasing/po_entry_items.php b/purchasing/po_entry_items.php new file mode 100644 index 00000000..3c9976be --- /dev/null +++ b/purchasing/po_entry_items.php @@ -0,0 +1,428 @@ +supplier_id = $_POST['supplier_id']; + $_SESSION['PO']->orig_order_date = $_POST['OrderDate']; + $_SESSION['PO']->reference = $_POST['ref']; + $_SESSION['PO']->requisition_no = $_POST['Requisition']; + $_SESSION['PO']->Comments = $_POST['Comments']; + $_SESSION['PO']->Location = $_POST['StkLocation']; + $_SESSION['PO']->delivery_address = $_POST['delivery_address']; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_po() +{ + $_POST['supplier_id'] = $_SESSION['PO']->supplier_id; + $_POST['OrderDate'] = $_SESSION['PO']->orig_order_date; + $_POST['Requisition'] = $_SESSION['PO']->requisition_no; + $_POST['ref'] = $_SESSION['PO']->reference; + $_POST['Comments'] = $_SESSION['PO']->Comments; + $_POST['StkLocation'] = $_SESSION['PO']->Location; + $_POST['delivery_address'] = $_SESSION['PO']->delivery_address; +} + +//-------------------------------------------------------------------------------------------------- + +function unset_form_variables() { + unset($_POST['stock_id']); + unset($_POST['qty']); + unset($_POST['price']); + unset($_POST['req_del_date']); +} + +//--------------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $line_no = $_GET['Delete']; + if($_SESSION['PO']->some_already_received($line_no) == 0) + { + $_SESSION['PO']->remove_from_order($line_no); + unset_form_variables(); + } + else + { + display_error(_("This item cannot be deleted because some of it has already been received.")); + } +} + +//--------------------------------------------------------------------------------------------------- + +function handle_cancel_po() +{ + global $path_to_root; + + //need to check that not already dispatched or invoiced by the supplier + if(($_SESSION['PO']->order_no != 0) && + $_SESSION['PO']->any_already_received() == 1) + { + display_error(_("This order cannot be cancelled because some of it has already been received.") + . "
" . _("The line item quantities may be modified to quantities more than already received. prices cannot be altered for lines that have already been received and quantities cannot be reduced below the quantity already received.")); + return; + } + + if($_SESSION['PO']->order_no != 0) + { + delete_po($_SESSION['PO']->order_no); + } + + $_SESSION['PO']->clear_items(); + $_SESSION['PO'] = new purch_order; + + display_note(_("This purchase order has been cancelled."), 0, 1); + + hyperlink_params($path_to_root . "/purchasing/po_entry_items.php", _("Enter a new purchase order"), "NewOrder=Yes"); + echo "
"; + + end_page(); + exit; +} + +//--------------------------------------------------------------------------------------------------- +if (isset($_GET['Delete']) || isset($_GET['Edit'])) +{ + copy_from_po(); +} + +if (isset($_GET['Delete'])) +{ + handle_delete_item(); +} + +//--------------------------------------------------------------------------------------------------- + +function check_data() +{ + if (!is_numeric($_POST['qty'])) + { + display_error(_("The quantity of the order item must be numeric.")); + return false; + } + if ($_POST['qty'] <= 0) + { + display_error(_("The quantity of the ordered item entered must be a positive amount.")); + return false; + } + if (!is_numeric($_POST['price'])) + { + display_error(_("The price entered must be numeric.")); + return false; + } + if (!is_date($_POST['req_del_date'])){ + display_error(_("The date entered is in an invalid format.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + $allow_update = check_data(); + + if ($allow_update && + ($_SESSION['PO']->line_items[$_POST['line_no']]->qty_inv > $_POST['qty'] || + $_SESSION['PO']->line_items[$_POST['line_no']]->qty_received > $_POST['qty'])) + { + display_error(_("You are attempting to make the quantity ordered a quantity less than has already been invoiced or received. This is prohibited.") . + "
" . _("The quantity received can only be modified by entering a negative receipt and the quantity invoiced can only be reduced by entering a credit note against this item.")); + return; + } + + $_SESSION['PO']->update_order_item($_POST['line_no'], $_POST['qty'], $_POST['price'], + $_POST['req_del_date']); + unset_form_variables(); +} + +//--------------------------------------------------------------------------------------------------- + +function handle_add_new_item() +{ + $allow_update = check_data(); + + if ($allow_update == true) + { + if (count($_SESSION['PO']->line_items) > 0) + { + foreach ($_SESSION['PO']->line_items AS $order_item) + { + + /* do a loop round the items on the order to see that the item + is not already on this order */ + if (($order_item->stock_id == $_POST['stock_id']) && + ($order_item->Deleted==False)) + { + $allow_update = False; + display_error(_("The selected item is already on this order.")); + } + } /* end of the foreach loop to look for pre-existing items of the same code */ + } + + if ($allow_update == true) + { + $sql = "SELECT description, units, mb_flag + FROM ".TB_PREF."stock_master WHERE stock_id = '". $_POST['stock_id'] . "'"; + + $result = db_query($sql,"The stock details for " . $_POST['stock_id'] . " could not be retrieved"); + + if (db_num_rows($result) == 0) + { + $allow_update = False; + } + + if ($allow_update) + { + $myrow = db_fetch($result); + $_SESSION['PO']->add_to_order ($_POST['line_no'], $_POST['stock_id'], $_POST['qty'], + $myrow["description"], $_POST['price'], $myrow["units"], + $_POST['req_del_date'], 0, 0); + + unset_form_variables(); + $_POST['StockID2'] = $_POST['stock_id'] = ""; + } + else + { + display_error(_("The selected item does not exist or it is a kit part and therefore cannot be purchased.")); + } + + } /* end of if not already on the order and allow input was true*/ + } +} + +//--------------------------------------------------------------------------------------------------- + +function can_commit() +{ + if (!is_date($_POST['OrderDate'])) + { + display_error(_("The entered order date is invalid.")); + return false; + } + + if (!$_SESSION['PO']->order_no) + { + if (!references::is_valid($_SESSION['PO']->reference)) + { + display_error(_("There is no reference entered for this purchase order.")); + return false; + } + + if (!is_new_reference($_SESSION['PO']->reference, systypes::po())) + { + display_error(_("The entered reference is already in use.")); + return false; + } + } + + if ($_SESSION['PO']->delivery_address == "") + { + display_error(_("There is no delivery address specified.")); + return false; + } + + if (!isset($_SESSION['PO']->Location) || $_SESSION['PO']->Location == "") + { + display_error(_("There is no location specified to move any items into.")); + return false; + } + + if ($_SESSION['PO']->order_has_items() == false) + { + display_error (_("The order cannot be placed because there are no lines entered on this order.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------------- + +function handle_commit_order() +{ + copy_to_po(); + + if (can_commit()) + { + + if ($_SESSION['PO']->order_no == 0) + { + + /*its a new order to be inserted */ + $order_no = add_po($_SESSION['PO']); + + unset($_SESSION['PO']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no"); + + } + else + { + + /*its an existing order need to update the old order info */ + $order_no = update_po($_SESSION['PO']); + + unset($_SESSION['PO']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no&Updated=1"); + } + } +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_POST['Commit'])) +{ + handle_commit_order(); +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_POST['UpdateLine'])) +{ + copy_to_po(); + handle_update_item(); +} + +//--------------------------------------------------------------------------------------------------- + +If (isset($_POST['EnterLine'])) +{ + copy_to_po(); + handle_add_new_item(); +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_POST['CancelOrder'])) +{ + handle_cancel_po(); +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_POST['CancelUpdate'])) +{ + copy_to_po(); + unset_form_variables(); +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_GET['ModifyOrderNumber']) && $_GET['ModifyOrderNumber'] != "") +{ + create_new_po(); + + $_SESSION['PO']->order_no = $_GET['ModifyOrderNumber']; + + /*read in all the selected order into the Items cart */ + read_po($_SESSION['PO']->order_no, $_SESSION['PO']); + copy_from_po(); +} + +//-------------------------------------------------------------------------------- + +if (isset($_GET['NewOrder'])) +{ + create_new_po(); +} +else +{ + if (!isset($_POST['supplier_id'])) + $_POST['supplier_id'] = $_SESSION['PO']->supplier_id; + if (!isset($_POST['OrderDate'])) + $_POST['OrderDate'] = $_SESSION['PO']->orig_order_date; + if (!isset($_POST['Requisition'])) + $_POST['Requisition'] = $_SESSION['PO']->requisition_no; + if (!isset($_POST['Comments'])) + $_POST['Comments'] = $_SESSION['PO']->Comments; +} + +//--------------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_po_header($_SESSION['PO']); +echo "
"; + +display_po_items($_SESSION['PO']); + +start_table($table_style2); +textarea_row(_("Memo:"), 'Comments', null, 70, 4); + +end_table(1); +if ($_SESSION['PO']->order_has_items()) +{ + if ($_SESSION['PO']->order_no) + submit_center_first('Commit', _("Update Order")); + else + submit_center_first('Commit', _("Place Order")); + submit_center_last('CancelOrder', _("Cancel Order")); +} +else + submit_center('CancelOrder', _("Cancel Order")); + +//--------------------------------------------------------------------------------------------------- + +end_form(); +end_page(); +?> diff --git a/purchasing/po_receive_items.php b/purchasing/po_receive_items.php new file mode 100644 index 00000000..8ad1ef06 --- /dev/null +++ b/purchasing/po_receive_items.php @@ -0,0 +1,302 @@ +"; + //echo get_gl_view_str(25, $grn, _("View the GL Journal Entries for this Delivery")); + + echo "
"; + hyperlink_no_params("$path_to_root/purchasing/inquiry/po_search.php", _("Select a different purchase order for receiving items against")); + + display_footer_exit(); +} + +//-------------------------------------------------------------------------------------------------- + +if ((!isset($_GET['PONumber']) || $_GET['PONumber'] == 0) && !isset($_SESSION['PO'])) +//if (isset($_GET['PONumber']) && !$_GET['PONumber'] > 0 && !isset($_SESSION['PO'])) +{ + die (_("This page can only be opened if a purchase order has been selected. Please select a purchase order first.")); +} + +//-------------------------------------------------------------------------------------------------- + +function display_po_receive_items() +{ + global $table_style; + start_table("colspan=7 $table_style width=90%"); + $th = array(_("Item Code"), _("Description"), _("Ordered"), _("Units"), _("Received"), + _("Outstanding"), _("This Delivery"), _("Price"), _("Total")); + table_header($th); + + /*show the line items on the order with the quantity being received for modification */ + + $total = 0; + $k = 0; //row colour counter + + if (count($_SESSION['PO']->line_items)> 0 ) + { + foreach ($_SESSION['PO']->line_items as $ln_itm) + { + + alt_table_row_color($k); + + $qty_outstanding = $ln_itm->quantity - $ln_itm->qty_received; + + if ($ln_itm->receive_qty == 0) + { //If no quantites yet input default the balance to be received + $ln_itm->receive_qty = $qty_outstanding; + } + + $line_total = ($ln_itm->receive_qty * $ln_itm->price); + $total += $line_total; + + label_cell($ln_itm->stock_id); + if ($qty_outstanding > 0) + text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50); + else + label_cell($ln_itm->item_description); + qty_cell($ln_itm->quantity); + label_cell($ln_itm->units); + qty_cell($ln_itm->qty_received); + qty_cell($qty_outstanding); + + if ($qty_outstanding > 0) + text_cells(null, $ln_itm->line_no, $ln_itm->receive_qty, 10, 10, "align=right"); + else + text_cells(null, $ln_itm->line_no, $ln_itm->receive_qty, 10, 10, "align=right", + "", "disabled"); + + amount_cell($ln_itm->price); + amount_cell($line_total); + end_row(); + } + } + + $display_total = number_format2($total,user_price_dec()); + label_row(_("Total value of items received"), $display_total, "colspan=8 align=right", + "nowrap align=right"); + end_table(); +} + +//-------------------------------------------------------------------------------------------------- + +function check_po_changed() +{ + /*Now need to check that the order details are the same as they were when they were read into the Items array. If they've changed then someone else must have altered them */ + // Sherifoz 22.06.03 Compare against COMPLETED items only !! + // Otherwise if you try to fullfill item quantities separately will give error. + $sql = "SELECT item_code, quantity_ordered, quantity_received, qty_invoiced + FROM ".TB_PREF."purch_order_details + WHERE order_no=" . $_SESSION['PO']->order_no . " + AND (quantity_ordered > quantity_received) + ORDER BY po_detail_item"; + + $result = db_query($sql, "could not query purch order details"); + check_db_error("Could not check that the details of the purchase order had not been changed by another user ", $sql); + + $line_no = 1; + while ($myrow = db_fetch($result)) + { + $ln_item = $_SESSION['PO']->line_items[$line_no]; + + // only compare against items that are outstanding + $qty_outstanding = $ln_item->quantity - $ln_item->qty_received; + if ($qty_outstanding > 0) + { + if ($ln_item->qty_inv != $myrow["qty_invoiced"] || + $ln_item->stock_id != $myrow["item_code"] || + $ln_item->quantity != $myrow["quantity_ordered"] || + $ln_item->qty_received != $myrow["quantity_received"]) + { + return true; + } + } + $line_no++; + } /*loop through all line items of the order to ensure none have been invoiced */ + + return false; +} + +//-------------------------------------------------------------------------------------------------- + +function can_process() +{ + if (count($_SESSION['PO']->line_items) <= 0) + { + display_error(_("There is nothing to process. Please enter valid quantities greater than zero.")); + return false; + } + + if (!is_date($_POST['DefaultReceivedDate'])) + { + display_error(_("The entered date is invalid.")); + return false; + } + + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], 25)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + $something_received = 0; + foreach ($_SESSION['PO']->line_items as $order_line) + { + if ($order_line->receive_qty > 0) + { + $something_received = 1; + break; + } + } + + // Check whether trying to deliver more items than are recorded on the actual purchase order (+ overreceive allowance) + $delivery_qty_too_large = 0; + foreach ($_SESSION['PO']->line_items as $order_line) + { + if ($order_line->receive_qty+$order_line->qty_received > + $order_line->quantity * (1+ (sys_prefs::over_receive_allowance() / 100))) + { + $delivery_qty_too_large = 1; + break; + } + } + + if ($something_received == 0) + { /*Then dont bother proceeding cos nothing to do ! */ + display_error(_("There is nothing to process. Please enter valid quantities greater than zero.")); + return false; + } + elseif ($delivery_qty_too_large == 1) + { + display_error(_("Entered quantities cannot be greater than the quantity entered on the purchase order including the allowed over-receive percentage") . " (" . sys_prefs::over_receive_allowance() ."%)." + . "
" . + _("Modify the ordered items on the purchase order if you wish to increase the quantities.")); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- + +function process_receive_po() +{ + global $path_to_root; + + if (!can_process()) + return; + + if (check_po_changed()) + { + echo "
" . _("This order has been changed or invoiced since this delivery was started to be actioned. Processing halted. To enter a delivery against this purchase order, it must be re-selected and re-read again to update the changes made by the other user.") . "
"; + + echo "
" . _("Select a different purchase order for receiving goods against") . "
"; + echo "
OrderNumber . "'>" . _("Re-Read the updated purchase order for receiving goods against") . "
"; + unset($_SESSION['PO']->line_items); + unset($_SESSION['PO']); + unset($_POST['ProcessGoodsReceived']); + exit; + } + + $grn = add_grn($_SESSION['PO'], $_POST['DefaultReceivedDate'], + $_POST['ref'], $_POST['Location']); + + unset($_SESSION['PO']->line_items); + unset($_SESSION['PO']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$grn"); +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_GET['PONumber']) && $_GET['PONumber'] > 0 && !isset($_POST['Update'])) +{ + + create_new_po(); + + /*read in all the selected order into the Items cart */ + read_po($_GET['PONumber'], $_SESSION['PO']); +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['Update']) || isset($_POST['ProcessGoodsReceived'])) +{ + + /* if update quantities button is hit page has been called and ${$line->line_no} would have be + set from the post to the quantity to be received in this receival*/ + foreach ($_SESSION['PO']->line_items as $line) + { + + $_POST[$line->line_no] = max($_POST[$line->line_no], 0); + if (!is_numeric($_POST[$line->line_no])) + $_POST[$line->line_no] = 0; + + if (!isset($_POST['DefaultReceivedDate']) || $_POST['DefaultReceivedDate'] == "") + $_POST['DefaultReceivedDate'] = Today(); + + $_SESSION['PO']->line_items[$line->line_no]->receive_qty = $_POST[$line->line_no]; + + if (isset($_POST[$line->stock_id . "Desc"]) && strlen($_POST[$line->stock_id . "Desc"]) > 0) + { + $_SESSION['PO']->line_items[$line->line_no]->item_description = $_POST[$line->stock_id . "Desc"]; + } + } +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessGoodsReceived'])) +{ + process_receive_po(); +} + +//-------------------------------------------------------------------------------------------------- + +start_form(false, true); + +display_grn_summary($_SESSION['PO'], true); +display_heading2(_("Items to Receive")); +display_po_receive_items(); + +echo "
"; +submit('Update', _("Update")); +echo " "; +submit('ProcessGoodsReceived', _("Process Receive Items")); +echo "
"; + +end_form(); + +//-------------------------------------------------------------------------------------------------- + +end_page(); +?> + diff --git a/purchasing/supplier_credit.php b/purchasing/supplier_credit.php new file mode 100644 index 00000000..af63044b --- /dev/null +++ b/purchasing/supplier_credit.php @@ -0,0 +1,167 @@ +"; + display_notification_centered(_("Supplier credit note has been processed.")); + display_note(get_trans_view_str($trans_type, $invoice_no, _("View this Credit Note"))); + + display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Credit Note")), 1); + + hyperlink_params($_SERVER['PHP_SELF'], _("Enter Another Credit Note"), "New=1"); + + display_footer_exit(); +} + +//--------------------------------------------------------------------------------------------------- + +if (isset($_GET['New'])) +{ + if (isset( $_SESSION['supp_trans'])) + { + unset ($_SESSION['supp_trans']->grn_items); + unset ($_SESSION['supp_trans']->gl_codes); + unset ($_SESSION['supp_trans']); + } + + $_SESSION['supp_trans'] = new supp_trans; + $_SESSION['supp_trans']->is_invoice = false; +} + +//--------------------------------------------------------------------------------------------------- + +function check_data() +{ + global $total_grn_value, $total_gl_value; + + if (!$_SESSION['supp_trans']->is_valid_trans_to_post()) + { + display_error(_("The credit note cannot be processed because the there are no items or values on the invoice. Credit notes are expected to have a charge.")); + return false; + } + + if (!references::is_valid($_SESSION['supp_trans']->reference)) + { + display_error(_("You must enter an credit note reference.")); + return false; + } + + if (!is_new_reference($_SESSION['supp_trans']->reference, 21)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + if (!references::is_valid($_SESSION['supp_trans']->supp_reference)) + { + display_error(_("You must enter a supplier's credit note reference.")); + return false; + } + + if (!is_date($_SESSION['supp_trans']->tran_date)) + { + display_error(_("The credit note as entered cannot be processed because the date entered is not valid.")); + return false; + } + elseif (!is_date_in_fiscalyear($_SESSION['supp_trans']->tran_date)) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + if (!is_date( $_SESSION['supp_trans']->due_date)) + { + display_error(_("The invoice as entered cannot be processed because the due date is in an incorrect format.")); + return false; + } + + if ($_SESSION['supp_trans']->ov_amount < ($total_gl_value + $total_grn_value)) + { + display_error(_("The credit note total as entered is less than the sum of the the general ledger entires (if any) and the charges for goods received. There must be a mistake somewhere, the credit note as entered will not be processed.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------------- + +function handle_commit_credit_note() +{ + copy_to_trans($_SESSION['supp_trans']); + + if (!check_data()) + return; + + $invoice_no = add_supp_invoice($_SESSION['supp_trans']); + + $_SESSION['supp_trans']->clear_items(); + unset($_SESSION['supp_trans']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no"); +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['PostCreditNote'])) +{ + handle_commit_credit_note(); +} + +//-------------------------------------------------------------------------------------------------- + +start_form(false, true); + +start_table("$table_style width=80%", 8); +echo ""; // outer table + +echo "
"; + +invoice_header($_SESSION['supp_trans']); + +echo ""; // outer table + +$total_grn_value = display_grn_items($_SESSION['supp_trans']); + +$total_gl_value = display_gl_items($_SESSION['supp_trans']); + +echo ""; // outer table + +invoice_totals($_SESSION['supp_trans']); + +echo ""; + +end_table(1); // outer table + +submit_center('PostCreditNote', _("Enter Credit Note")); +echo "

"; + +end_form(); +end_page(); +?> diff --git a/purchasing/supplier_credit_grns.php b/purchasing/supplier_credit_grns.php new file mode 100644 index 00000000..5f84a39c --- /dev/null +++ b/purchasing/supplier_credit_grns.php @@ -0,0 +1,194 @@ +supplier_name); +echo "
"; + +//----------------------------------------------------------------------------------------- + +function check_data() +{ + if (!is_numeric($_POST['This_QuantityCredited'])) + { + display_error(_("The quantity to credit must be numeric.")); + return false; + } + + if ($_POST['This_QuantityCredited'] <= 0) + { + display_error(_("The quantity to credit must be greater than zero.")); + return false; + } + + if (!is_numeric($_POST['ChgPrice']) || $_POST['ChgPrice'] < 0) + { + display_error(_("The price is either not numeric or negative.")); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------------- + +if (isset($_POST['AddGRNToTrans'])) +{ + + if (check_data()) + { + $complete = False; + + //$_SESSION['supp_trans']->add_grn_to_trans($_POST['GRNNumber'], + // $_POST['po_detail_item'], $_POST['item_code'], + // $_POST['item_description'], $_POST['qty_recd'], + // $_POST['prev_quantity_inv'], $_POST['This_QuantityCredited'], + // $_POST['order_price'], $_POST['ChgPrice'], $complete, + // $_POST['std_cost_unit'], $_POST['gl_code']); + $_SESSION['supp_trans']->add_grn_to_trans($_POST['GRNNumber'], + $_POST['po_detail_item'], $_POST['item_code'], + $_POST['item_description'], $_POST['qty_recd'], + $_POST['prev_quantity_inv'], $_POST['This_QuantityCredited'], + $_POST['order_price'], $_POST['ChgPrice'], $complete, + $_POST['std_cost_unit'], ""); + } +} + +//----------------------------------------------------------------------------------------- + +if (isset($_GET['Delete'])) +{ + $_SESSION['supp_trans']->remove_grn_from_trans($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------- + +display_grn_items($_SESSION['supp_trans'], 1); + +echo "
"; + +hyperlink_no_params("$path_to_root/purchasing/supplier_credit.php", _("Return to Credit Note Entry")); +echo "
"; + +//----------------------------------------------------------------------------------------- + +// get the supplier grns that have been invoiced +$result = get_grn_items(0, $_SESSION['supp_trans']->supplier_id, false, true); + +if (db_num_rows($result) == 0) +{ + display_note(_("There are no received items for the selected supplier that have been invoiced.")); + display_note(_("Credits can only be applied to invoiced items.")); + + echo "
"; + end_page(); + exit; +} + +/*Set up a table to show the GRN items outstanding for selection */ +start_form(false, true); + +start_table("$table_style width=95%"); +$th = array(_("Delivery"), _("Sequence #"), _("Order"), _("Item Code"), _("Description"), + _("Delivered"), _("Total Qty Received"), _("Qty Already Invoiced"), + _("Qty Yet To Invoice"), _("Order Price"), _("Line Value")); +table_header($th); +$i = $k =0; +while ($myrow = db_fetch($result)) +{ + + $grn_already_on_credit = False; + + foreach ($_SESSION['supp_trans']->grn_items as $entered_grn) + { + if ($entered_grn->id == $myrow["id"]) + { + $grn_already_on_credit = True; + } + } + if ($grn_already_on_credit == False) + { + + alt_table_row_color($k); + + label_cell(get_trans_view_str(25, $myrow["grn_batch_id"])); + submit_cells('grn_item_id', $myrow["id"]); + label_cell(get_trans_view_str(systypes::po(), $myrow["purch_order_no"])); + label_cell($myrow["item_code"]); + label_cell($myrow["description"]); + label_cell(sql2date($myrow["delivery_date"])); + qty_cell($myrow["qty_recd"]); + qty_cell($myrow["quantity_inv"]); + qty_cell($myrow["qty_recd"] - $myrow["quantity_inv"]); + amount_cell($myrow["unit_price"]); + amount_cell($myrow["unit_price"] * $myrow["quantity_inv"]); + end_row(); + $i++; + if ($i > 15) + { + $i = 0; + table_header($th); + } + } +} + +end_table(); + +//----------------------------------------------------------------------------------------- + +if (isset($_POST['grn_item_id']) && $_POST['grn_item_id'] != "") +{ + + $myrow = get_grn_item_detail($_POST['grn_item_id']); + + echo "
"; + display_heading2(_("Delivery Item Selected For Adding To A Supplier Credit Note")); + start_table("$table_style width=80%"); + $th = array(_("Sequence #"), _("Item"), _("Qty Already Invoiced"), + _("Quantity to Credit"), _("Order Price"), _("Credit Price")); + table_header($th); + + start_row(); + label_cell($_POST['grn_item_id']); + label_cell($myrow['item_code'] . " " . $myrow['description']); + qty_cell($myrow["quantity_inv"]); + text_cells(null, 'This_QuantityCredited', max($myrow['quantity_inv'], 0), 13, 15); + amount_cell($myrow['unit_price']); + text_cells(null, 'ChgPrice', $myrow['unit_price'], 13, 15); + end_row(); + end_table(1); + + submit_center('AddGRNToTrans', _("Add to Credit Note")); + + hidden('GRNNumber', $_POST['grn_item_id']); + hidden('item_code', $myrow['item_code']);; + hidden('item_description', $myrow['description']); + hidden('qty_recd', $myrow['qty_recd']); + hidden('prev_quantity_inv', $myrow['quantity_inv']); + hidden('order_price', $myrow['unit_price']); + hidden('std_cost_unit', $myrow['std_cost_unit']); + + hidden('po_detail_item', $myrow['po_detail_item']); +} + +end_form(); +end_page(); +?> diff --git a/purchasing/supplier_invoice.php b/purchasing/supplier_invoice.php new file mode 100644 index 00000000..33afd6c4 --- /dev/null +++ b/purchasing/supplier_invoice.php @@ -0,0 +1,177 @@ +"; + display_notification_centered(_("Supplier invoice has been processed.")); + display_note(get_trans_view_str($trans_type, $invoice_no, _("View this Invoice"))); + + display_note(get_gl_view_str($trans_type, $invoice_no, _("View the GL Journal Entries for this Invoice")), 1); + + hyperlink_params($_SERVER['PHP_SELF'], _("Enter Another Invoice"), "New=1"); + + display_footer_exit(); +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_GET['New'])) +{ + if (isset( $_SESSION['supp_trans'])) + { + unset ($_SESSION['supp_trans']->grn_items); + unset ($_SESSION['supp_trans']->gl_codes); + unset ($_SESSION['supp_trans']); + } + + //session_register("SuppInv"); + session_register("supp_trans"); + $_SESSION['supp_trans'] = new supp_trans; + $_SESSION['supp_trans']->is_invoice = true; +} + +//-------------------------------------------------------------------------------------------------- + +function check_data() +{ + If (!$_SESSION['supp_trans']->is_valid_trans_to_post()) + { + display_error(_("The invoice cannot be processed because the there are no items or values on the invoice. Invoices are expected to have a charge.")); + return false; + } + + if (!references::is_valid($_SESSION['supp_trans']->reference)) + { + display_error(_("You must enter an invoice reference.")); + return false; + } + + if (!is_new_reference($_SESSION['supp_trans']->reference, 20)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + if (!references::is_valid($_SESSION['supp_trans']->supp_reference)) + { + display_error(_("You must enter a supplier's invoice reference.")); + return false; + } + + if (!is_date( $_SESSION['supp_trans']->tran_date)) + { + display_error(_("The invoice as entered cannot be processed because the invoice date is in an incorrect format.")); + return false; + } + elseif (!is_date_in_fiscalyear($_SESSION['supp_trans']->tran_date)) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + if (!is_date( $_SESSION['supp_trans']->due_date)) + { + display_error(_("The invoice as entered cannot be processed because the due date is in an incorrect format.")); + return false; + } + + $sql = "SELECT Count(*) FROM ".TB_PREF."supp_trans WHERE supplier_id='" . $_SESSION['supp_trans']->supplier_id . "' AND supp_reference='" . $_POST['supp_reference'] . "'"; + $result=db_query($sql,"The sql to check for the previous entry of the same invoice failed"); + + $myrow = db_fetch_row($result); + if ($myrow[0] == 1) + { /*Transaction reference already entered */ + display_error(_("This invoice number has already been entered. It cannot be entered again." . " (" . $_POST['supp_reference'] . ")")); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- + +function handle_commit_invoice() +{ + copy_to_trans($_SESSION['supp_trans']); + + if (!check_data()) + return; + + $invoice_no = add_supp_invoice($_SESSION['supp_trans']); + + $_SESSION['supp_trans']->clear_items(); + unset($_SESSION['supp_trans']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no"); +} + +//-------------------------------------------------------------------------------------------------- + +if (isset($_POST['PostInvoice'])) +{ + handle_commit_invoice(); +} + +//-------------------------------------------------------------------------------------------------- + +start_form(false, true); + +start_table("$table_style2 width=80%", 8); +echo ""; // outer table + +echo "
"; + +invoice_header($_SESSION['supp_trans']); + +echo ""; // outer table + +echo "
"; + +display_grn_items($_SESSION['supp_trans']); + +display_gl_items($_SESSION['supp_trans']); + +//echo ""; // outer table +echo "
"; +invoice_totals($_SESSION['supp_trans']); + +echo ""; + +end_table(); // outer table + +echo "
"; +submit_center('PostInvoice', _("Enter Invoice")); +echo "
"; + +end_form(); + +//-------------------------------------------------------------------------------------------------- + +end_page(); +?> diff --git a/purchasing/supplier_invoice_grns.php b/purchasing/supplier_invoice_grns.php new file mode 100644 index 00000000..0bd9f578 --- /dev/null +++ b/purchasing/supplier_invoice_grns.php @@ -0,0 +1,236 @@ +supplier_name); + +echo "
"; + +//----------------------------------------------------------------------------------------- + +function check_data() +{ + global $check_price_charged_vs_order_price, + $check_qty_charged_vs_del_qty; + if (!is_numeric($_POST['this_quantity_inv'])) + { + display_error( _("The quantity to invoice must be numeric.")); + return false; + } + + if ($_POST['this_quantity_inv'] <= 0) + { + display_error( _("The quantity to invoice must be greater than zero.")); + return false; + } + + if (!is_numeric($_POST['ChgPrice'])) + { + display_error( _("The price is not numeric.")); + return false; + } + + if ($check_price_charged_vs_order_price == True) + { + if ($_POST['ChgPrice']/$_POST['order_price'] > + (1 + (sys_prefs::over_charge_allowance() / 100))) + { + display_error(_("The price being invoiced is more than the purchase order price by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary.") . + _("The over-charge percentage allowance is :") . sys_prefs::over_charge_allowance() . "%"); + return false; + } + } + + if ($check_qty_charged_vs_del_qty == True) + { + if ($_POST['this_quantity_inv'] / ($_POST['qty_recd'] - $_POST['prev_quantity_inv']) > + (1+ (sys_prefs::over_charge_allowance() / 100))) + { + display_error( _("The quantity being invoiced is more than the outstanding quantity by more than the allowed over-charge percentage. The system is set up to prohibit this. See the system administrator to modify the set up parameters if necessary.") + . _("The over-charge percentage allowance is :") . sys_prefs::over_charge_allowance() . "%"); + return false; + } + } + + return true; +} + +//----------------------------------------------------------------------------------------- + +if (isset($_POST['AddGRNToTrans'])) +{ + + if (check_data()) + { + if ($_POST['this_quantity_inv'] >= ($_POST['qty_recd'] - $_POST['prev_quantity_inv'])) + { + $complete = True; + } + else + { + $complete = False; + } + + //$_SESSION['supp_trans']->add_grn_to_trans($_POST['GRNNumber'], $_POST['po_detail_item'], + // $_POST['item_code'], $_POST['item_description'], $_POST['qty_recd'], + // $_POST['prev_quantity_inv'], $_POST['this_quantity_inv'], + // $_POST['order_price'], $_POST['ChgPrice'], $complete, + // $_POST['std_cost_unit'], $_POST['gl_code']); + $_SESSION['supp_trans']->add_grn_to_trans($_POST['GRNNumber'], $_POST['po_detail_item'], + $_POST['item_code'], $_POST['item_description'], $_POST['qty_recd'], + $_POST['prev_quantity_inv'], $_POST['this_quantity_inv'], + $_POST['order_price'], $_POST['ChgPrice'], $complete, + $_POST['std_cost_unit'], ""); + } +} + +//----------------------------------------------------------------------------------------- + +if (isset($_GET['Delete'])) +{ + $_SESSION['supp_trans']->remove_grn_from_trans($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------- + +display_grn_items($_SESSION['supp_trans'], 1); + +echo "
"; +hyperlink_no_params("$path_to_root/purchasing/supplier_invoice.php", _("Back to Supplier Invoice Entry")); +echo "
"; + +//----------------------------------------------------------------------------------------- + +function display_grn_items_for_selection() +{ + global $table_style; + + $result = get_grn_items(0, $_SESSION['supp_trans']->supplier_id, true); + + if (db_num_rows($result) == 0) + { + display_note(_("There are no outstanding items received from this supplier that have not been invoiced by them."), 0, 1); + end_page(); + exit; + } + + /*Set up a table to show the outstanding GRN items for selection */ + start_form(false, true); + + display_heading2(_("Items Received Yet to be Invoiced")); + + start_table("$table_style colspan=7 width=95%"); + $th = array(_("Delivery"), _("Sequence #"), _("P.O."), _("Item"), _("Description"), + _("Received On"), _("Quantity Received"), _("Quantity Invoiced"), + _("Uninvoiced Quantity"), _("Order Price"), _("Total")); + table_header($th); + $i = $k = 0; + + while ($myrow = db_fetch($result)) + { + + $grn_already_on_invoice = False; + + foreach ($_SESSION['supp_trans']->grn_items as $entered_grn) + { + if ($entered_grn->id == $myrow["id"]) + { + $grn_already_on_invoice = True; + } + } + if ($grn_already_on_invoice == False) + { + + alt_table_row_color($k); + + label_cell(get_trans_view_str(25, $myrow["grn_batch_id"])); + //text_cells(null, 'grn_item_id', $myrow["id"]); + submit_cells('grn_item_id', $myrow["id"]); + label_cell(get_trans_view_str(systypes::po(), $myrow["purch_order_no"])); + label_cell($myrow["item_code"]); + label_cell($myrow["description"]); + label_cell(sql2date($myrow["delivery_date"])); + qty_cell($myrow["qty_recd"]); + qty_cell($myrow["quantity_inv"]); + qty_cell($myrow["qty_recd"] - $myrow["quantity_inv"]); + amount_cell($myrow["unit_price"]); + amount_cell($myrow["unit_price"] * ($myrow["qty_recd"] - $myrow["quantity_inv"])); + end_row(); + + $i++; + if ($i > 15) + { + $i = 0; + table_header($th); + } + } + } + + end_table(); +} + +//----------------------------------------------------------------------------------------- + +display_grn_items_for_selection(); + +//----------------------------------------------------------------------------------------- + +if (isset($_POST['grn_item_id']) && $_POST['grn_item_id'] != "") +{ + + $myrow = get_grn_item_detail($_POST['grn_item_id']); + + echo "
"; + display_heading2(_("Delivery Item Selected For Adding To A Supplier Invoice")); + start_table("$table_style width=80%"); + $th = array(_("Sequence #"), _("Item"), _("Description"), _("Quantity Outstanding"), + _("Quantity to Invoice"), _("Order Price"), _("Actual Price")); + table_header($th); + + start_row(); + label_cell($_POST['grn_item_id']); + label_cell($myrow['item_code']); + label_cell($myrow['description']); + qty_cell($myrow['QtyOstdg']); + text_cells(null, 'this_quantity_inv', $myrow['QtyOstdg'], 13, 15); + amount_cell($myrow['unit_price']); + text_cells(null, 'ChgPrice', $myrow['unit_price'], 13, 15); + end_row(); + end_table(1);; + + submit_center('AddGRNToTrans', _("Add to Invoice")); + + hidden('GRNNumber', $_POST['grn_item_id']); + hidden('item_code', $myrow['item_code']); + hidden('item_description', $myrow['description']);; + hidden('qty_recd', $myrow['qty_recd']); + hidden('prev_quantity_inv', $myrow['quantity_inv']); + hidden('order_price', $myrow['unit_price']); + hidden('std_cost_unit', $myrow['std_cost_unit']); + + hidden('po_detail_item', $myrow['po_detail_item']); +} + +//---------------------------------------------------------------------------------------- + +end_form(); +end_page(); +?> diff --git a/purchasing/supplier_payment.php b/purchasing/supplier_payment.php new file mode 100644 index 00000000..82aa967c --- /dev/null +++ b/purchasing/supplier_payment.php @@ -0,0 +1,211 @@ +
"; + hyperlink_params($path_to_root . "/purchasing/allocations/supplier_allocate.php", _("Allocate this Payment"), "trans_no=$payment_id&trans_type=22"); + + echo "

"; + hyperlink_params($_SERVER['PHP_SELF'], _("Enter another supplier payment"), "supplier_id=" . $_POST['supplier_id']); + + echo "


"; + + end_page(); + exit; +} + +//---------------------------------------------------------------------------------------- + +function display_controls() +{ + global $table_style2; + start_form(false, true); + + if (!isset($_POST['supplier_id'])) + $_POST['supplier_id'] = get_global_supplier(false); + if (!isset($_POST['DatePaid'])) + { + $_POST['DatePaid'] = Today(); + if (!is_date_in_fiscalyear($_POST['DatePaid'])) + $_POST['DatePaid'] = end_fiscalyear(); + } + start_table($table_style2, 5, 7); + echo ""; // outer table + + echo ""; + + bank_accounts_list_row(_("From Bank Account:"), 'bank_account', null, true); + + amount_row(_("Amount of Payment:"), 'amount'); + amount_row(_("Amount of Discount:"), 'discount'); + + date_row(_("Date Paid") . ":", 'DatePaid'); + + echo "
"; + echo ""; // outer table + echo ""; + + supplier_list_row(_("Payment To:"), 'supplier_id', null, false, true); + + set_global_supplier($_POST['supplier_id']); + + $supplier_currency = get_supplier_currency($_POST['supplier_id']); + $bank_currency = get_bank_account_currency($_POST['bank_account']); + if ($bank_currency != $supplier_currency) + { + exchange_rate_display($bank_currency, $supplier_currency, $_POST['DatePaid']); + } + + bank_trans_types_list_row(_("Payment Type:"), 'PaymentType', null); + + ref_row(_("Reference:"), 'ref', references::get_next(22)); + + text_row(_("Memo:"), 'memo_', null, 52,50); + + echo "
"; + + echo ""; + end_table(1); // outer table + + submit_center('ProcessSuppPayment',_("Enter Payment")); + + if ($bank_currency != $supplier_currency) + { + display_note(_("The amount and discount are in the bank account's currency."), 2, 0); + } + + end_form(); +} + +//---------------------------------------------------------------------------------------- + +function check_inputs() +{ + if ($_POST['amount'] == "") + { + $_POST['amount'] = 0; + } + + if (!is_numeric($_POST['amount']) || $_POST['amount'] < 0) + { + display_error(_("The entered amount is invalid or less than zero.")); + return false; + } + + if ($_POST['discount'] == "") + { + $_POST['discount'] = 0; + } + + if (!is_numeric($_POST['discount']) OR $_POST['discount'] < 0) + { + display_error(_("The entered discount is invalid or less than zero.")); + return false; + } + + if ($_POST['amount'] - $_POST['discount'] <= 0) + { + display_error(_("The total of the amount and the discount negative. Please enter positive values.")); + return false; + } + + if (!is_date($_POST['DatePaid'])) + { + display_error(_("The entered date is invalid.")); + return false; + } + elseif (!is_date_in_fiscalyear($_POST['DatePaid'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], 22)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + + return true; +} + +//---------------------------------------------------------------------------------------- + +function handle_add_payment() +{ + $payment_id = add_supp_payment($_POST['supplier_id'], $_POST['DatePaid'], + $_POST['PaymentType'], $_POST['bank_account'], + $_POST['amount'], $_POST['discount'], $_POST['ref'], $_POST['memo_']); + + //unset($_POST['supplier_id']); + unset($_POST['bank_account']); + unset($_POST['DatePaid']); + unset($_POST['PaymentType']); + unset($_POST['currency']); + unset($_POST['memo_']); + unset($_POST['amount']); + unset($_POST['discount']); + unset($_POST['ProcessSuppPayment']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$payment_id&supplier_id=".$_POST['supplier_id']); +} + +//---------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessSuppPayment'])) +{ + /*First off check for valid inputs */ + if (check_inputs() == true) + { + handle_add_payment(); + end_page(); + exit; + } +} + +display_controls(); + +end_page(); +?> diff --git a/purchasing/supplier_trans_gl.php b/purchasing/supplier_trans_gl.php new file mode 100644 index 00000000..ced01183 --- /dev/null +++ b/purchasing/supplier_trans_gl.php @@ -0,0 +1,130 @@ +add_gl_codes_to_trans($_POST['gl_code'], $gl_act_name, + $_POST['dimension_id'], $_POST['dimension2_id'], $_POST['amount'], $_POST['memo_']); + clear_fields(); + } +} + +//------------------------------------------------------------------------------------------------ + +if (isset($_GET['Delete'])) +{ + $_SESSION['supp_trans']->remove_gl_codes_from_trans($_GET['Delete']); + clear_fields(); +} + +//------------------------------------------------------------------------------------------------ + +display_heading($_SESSION['supp_trans']->supplier_name); + +display_gl_items($_SESSION['supp_trans'], 1); + +echo "
"; + +if ($_SESSION['supp_trans']->is_invoice == true) +{ + hyperlink_no_params("$path_to_root/purchasing/supplier_invoice.php", _("Back to Invoice Entry")); +} +else +{ + hyperlink_no_params("$path_to_root/purchasing/supplier_credit.php", _("Back to Credit Note Entry")); +} + +echo "
"; + +//------------------------------------------------------------------------------------------------ + +/*Set up a form to allow input of new GL entries */ +start_form(false, true); + +display_heading2(_("Enter a GL Line")); + +start_table($table_style2); + +$accs = get_supplier_accounts($_SESSION['supp_trans']->supplier_id); +$_POST['AcctSelection'] = $accs['purchase_account']; +gl_all_accounts_list_row(_("GL Account Selection:"), 'AcctSelection', $_POST['AcctSelection']); +$dim = get_company_pref('use_dimension'); +if ($dim >= 1) + dimensions_list_row(_("Dimension")." 1", 'dimension_id', null, true, " ", false, 1); +if ($dim > 1) + dimensions_list_row(_("Dimension")." 2", 'dimension2_id', null, true, " ", false, 2); +if ($dim < 1) + hidden('dimension_id', 0); +if ($dim < 2) + hidden('dimension2_id', 0); +amount_row( _("Amount:"), 'amount'); + +textarea_row(_("Memo:"), "memo_", null, 40, 2); + +end_table();; + +submit_center('AddGLCodeToTrans', _("Add GL Line")); + +end_form(); + +//------------------------------------------------------------------------------------------------ + +end_page(); +?> diff --git a/purchasing/view/index.php b/purchasing/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/purchasing/view/index.php @@ -0,0 +1,3 @@ + diff --git a/purchasing/view/view_grn.php b/purchasing/view/view_grn.php new file mode 100644 index 00000000..0df3c994 --- /dev/null +++ b/purchasing/view/view_grn.php @@ -0,0 +1,65 @@ +" . _("This page must be called with a Purchase Order Delivery number to review.")); +} + +$purchase_order = new purch_order; +read_grn($_GET["trans_no"], $purchase_order); + +display_heading(_("Purchase Order Delivery") . " #" . $_GET['trans_no']); +echo "
"; +display_grn_summary($purchase_order); + +display_heading2(_("Line Details")); + +start_table("colspan=9 $table_style width=90%"); +$th = array(_("Item Code"), _("Item Description"), _("Delivery Date"), _("Quantity"), + _("Unit"), _("Price"), _("Line Total"), _("Quantity Invoiced")); + +table_header($th); + +$total = 0; +$k = 0; //row colour counter + +foreach ($purchase_order->line_items as $stock_item) +{ + + $line_total = $stock_item->qty_received * $stock_item->price; + + alt_table_row_color($k); + + label_cell($stock_item->stock_id); + label_cell($stock_item->item_description); + label_cell($stock_item->req_del_date, "nowrap align=right"); + qty_cell($stock_item->qty_received); + label_cell($stock_item->units); + amount_cell($stock_item->price); + amount_cell($line_total); + qty_cell($stock_item->qty_inv); + end_row(); + + $total += $line_total; +} + +$display_total = number_format2($total,user_price_dec()); +label_row(_("Total Excluding Tax/Shipping"), $display_total, + "colspan=6", "nowrap align=right"); + +end_table(1); + +is_voided_display(25, $_GET['trans_no'], _("This delivery has been voided.")); + +end_page(true); + +?> diff --git a/purchasing/view/view_po.php b/purchasing/view/view_po.php new file mode 100644 index 00000000..878c59af --- /dev/null +++ b/purchasing/view/view_po.php @@ -0,0 +1,144 @@ +" . _("This page must be called with a purchase order number to review.")); +} + +display_heading(_("Purchase Order") . " #" . $_GET['trans_no']); + +if (isset($_SESSION['Items'])) +{ + unset ($_SESSION['Items']); +} + +$purchase_order = new purch_order; + +read_po($_GET['trans_no'], $purchase_order); +echo "
"; +display_po_summary($purchase_order, true); + +start_table("$table_style width=90%", 6); +echo ""; // outer table + +display_heading2(_("Line Details")); + +start_table("colspan=9 $table_style width=100%"); + +$th = array(_("Item Code"), _("Item Description"), _("Quantity"), _("Unit"), _("Price"), + _("Line Total"), _("Requested By"), _("Quantity Received"), _("Quantity Invoiced")); +table_header($th); +$total = $k = 0; +$overdue_items = false; + +foreach ($purchase_order->line_items as $stock_item) +{ + + $line_total = $stock_item->quantity * $stock_item->price; + + // if overdue and outstanding quantities, then highlight as so + if (($stock_item->quantity - $stock_item->qty_received > 0) && + date1_greater_date2(Today(), $stock_item->req_del_date)) + { + start_row("class='overduebg'"); + $overdue_items = true; + } + else + { + alt_table_row_color($k); + } + + label_cell($stock_item->stock_id); + label_cell($stock_item->item_description); + qty_cell($stock_item->quantity); + label_cell($stock_item->units); + amount_cell($stock_item->price); + amount_cell($line_total); + label_cell($stock_item->req_del_date); + qty_cell($stock_item->qty_received); + qty_cell($stock_item->qty_inv); + end_row(); + + $total += $line_total; +} + +$display_total = number_format2($total,user_price_dec()); +label_row(_("Total Excluding Tax/Shipping"), $display_total, + "align=right colspan=5", "nowrap align=right"); + +end_table(); + +if ($overdue_items) + display_note(_("Marked items are overdue."), 0, 0, "class='overduefg'"); + +//---------------------------------------------------------------------------------------------------- + +$k = 0; + +$grns_result = get_po_grns($_GET['trans_no']); + +if (db_num_rows($grns_result) > 0) +{ + + echo ""; // outer table + + display_heading2(_("Deliveries")); + start_table($table_style); + $th = array(_("#"), _("Reference"), _("Delivered On")); + table_header($th); + while ($myrow = db_fetch($grns_result)) + { + alt_table_row_color($k); + + label_cell(get_trans_view_str(25,$myrow["id"])); + label_cell($myrow["reference"]); + label_cell(sql2date($myrow["delivery_date"])); + end_row(); + } + end_table();; +} + +$invoice_result = get_po_invoices_credits($_GET['trans_no']); + +$k = 0; + +if (db_num_rows($invoice_result) > 0) +{ + + echo ""; // outer table + + display_heading2(_("Invoices/Credits")); + start_table($table_style); + $th = array(_("#"), _("Date"), _("Total")); + table_header($th); + while ($myrow = db_fetch($invoice_result)) + { + alt_table_row_color($k); + + label_cell(get_trans_view_str($myrow["type"],$myrow["trans_no"])); + label_cell(sql2date($myrow["tran_date"])); + amount_cell($myrow["Total"]); + end_row(); + } + end_table(); +} + +echo ""; + +end_table(1); // outer table + +//---------------------------------------------------------------------------------------------------- + +end_page(true); + +?> diff --git a/purchasing/view/view_supp_credit.php b/purchasing/view/view_supp_credit.php new file mode 100644 index 00000000..d5fc40e1 --- /dev/null +++ b/purchasing/view/view_supp_credit.php @@ -0,0 +1,69 @@ +is_invoice = false; + +read_supp_invoice($trans_no, 21, $supp_trans); + +display_heading(_("SUPPLIER CREDIT NOTE") . " # " . $trans_no); +echo "
"; +start_table($table_style2); +start_row(); +label_cells(_("Supplier"), $supp_trans->supplier_name, "class='tableheader2'"); +label_cells(_("Reference"), $supp_trans->reference, "class='tableheader2'"); +label_cells(_("Supplier's Reference"), $supp_trans->supp_reference, "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Invoice Date"), $supp_trans->tran_date, "class='tableheader2'"); +label_cells(_("Due Date"), $supp_trans->due_date, "class='tableheader2'"); +label_cells(_("Currency"), get_supplier_currency($supp_trans->supplier_id), "class='tableheader2'"); +end_row(); +comments_display_row(21, $trans_no); +end_table(1); + +$total_gl = display_gl_items($supp_trans, 3); +$total_grn = display_grn_items($supp_trans, 2); + +$display_sub_tot = number_format2($total_gl+$total_grn,user_price_dec()); + +start_table("$table_style width=95%"); +label_row(_("Sub Total"), $display_sub_tot, "align=right", "nowrap align=right width=17%"); + +$tax_items = get_supp_invoice_tax_items(21, $trans_no); +display_supp_trans_tax_details($tax_items, 1); + +$display_total = number_format2(-($supp_trans->ov_amount + $supp_trans->ov_gst),user_price_dec()); +label_row(_("TOTAL CREDIT NOTE"), $display_total, "colspan=1 align=right", "nowrap align=right"); + +end_table(1); + +$voided = is_voided_display(21, $trans_no, _("This credit note has been voided.")); + +if (!$voided) +{ + $tax_total = 0; // ?????? + display_allocations_from(payment_person_types::supplier(), $supp_trans->supplier_id, 21, $trans_no, -($supp_trans->ov_amount + $tax_total)); +} + +end_page(true); + +?> \ No newline at end of file diff --git a/purchasing/view/view_supp_invoice.php b/purchasing/view/view_supp_invoice.php new file mode 100644 index 00000000..8de06bdf --- /dev/null +++ b/purchasing/view/view_supp_invoice.php @@ -0,0 +1,72 @@ +is_invoice = true; + +read_supp_invoice($trans_no, 20, $supp_trans); + +$supplier_curr_code = get_supplier_currency($supp_trans->supplier_id); + +display_heading(_("SUPPLIER INVOICE") . " # " . $trans_no); +echo "
"; + +start_table("$table_style width=95%"); +start_row(); +label_cells(_("Supplier"), $supp_trans->supplier_name, "class='tableheader2'"); +label_cells(_("Reference"), $supp_trans->reference, "class='tableheader2'"); +label_cells(_("Supplier's Reference"), $supp_trans->supp_reference, "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Invoice Date"), $supp_trans->tran_date, "class='tableheader2'"); +label_cells(_("Due Date"), $supp_trans->due_date, "class='tableheader2'"); +if (!is_company_currency($supplier_curr_code)) + label_cells(_("Currency"), $supplier_curr_code, "class='tableheader2'"); +end_row(); +comments_display_row(20, $trans_no); + +end_table(1); + +$total_gl = display_gl_items($supp_trans, 2); +$total_grn = display_grn_items($supp_trans, 2); + +$display_sub_tot = number_format2($total_gl+$total_grn,user_price_dec()); + +start_table("width=95% $table_style"); +label_row(_("Sub Total"), $display_sub_tot, "align=right", "nowrap align=right width=15%"); + +$tax_items = get_supp_invoice_tax_items(20, $trans_no); +display_supp_trans_tax_details($tax_items, 1); + +$display_total = number_format2($supp_trans->ov_amount + $supp_trans->ov_gst,user_price_dec()); + +label_row(_("TOTAL INVOICE"), $display_total, "colspan=1 align=right", "nowrap align=right"); + +end_table(1); + +is_voided_display(20, $trans_no, _("This invoice has been voided.")); + +end_page(true); + +?> \ No newline at end of file diff --git a/purchasing/view/view_supp_payment.php b/purchasing/view/view_supp_payment.php new file mode 100644 index 00000000..82d190a3 --- /dev/null +++ b/purchasing/view/view_supp_payment.php @@ -0,0 +1,76 @@ +"; + +display_heading(_("Payment to Supplier") . " #$trans_no"); + +echo "
"; +start_table("$table_style2 width=80%"); + +start_row(); +label_cells(_("To Supplier"), $receipt['supplier_name'], "class='tableheader2'"); +label_cells(_("From Bank Account"), $receipt['bank_account_name'], "class='tableheader2'"); +label_cells(_("Date Paid"), sql2date($receipt['tran_date']), "class='tableheader2'"); +end_row(); +start_row(); +if ($show_currencies) + label_cells(_("Payment Currency"), $receipt['bank_curr_code'], "class='tableheader2'"); +label_cells(_("Amount"), number_format2(-$receipt['BankAmount'], user_price_dec()), "class='tableheader2'"); +label_cells(_("Payment Type"), $receipt['BankTransType'], "class='tableheader2'"); +end_row(); +start_row(); +if ($show_currencies) +{ + label_cells(_("Supplier's Currency"), $receipt['SupplierCurrCode'], "class='tableheader2'"); +} +if ($show_both_amounts) + label_cells(_("Amount"), number_format2(-$receipt['ov_amount'], user_price_dec()), "class='tableheader2'"); +label_cells(_("Reference"), $receipt['ref'], "class='tableheader2'"); +end_row(); +comments_display_row(22, $trans_no); + +end_table(1); + +$voided = is_voided_display(22, $trans_no, _("This payment has been voided.")); + +// now display the allocations for this payment +if (!$voided) +{ + display_allocations_from(payment_person_types::supplier(), $receipt['supplier_id'], 22, $trans_no, -$receipt['ov_amount']); +} + +end_page(true); +?> \ No newline at end of file diff --git a/reporting/fonts/Helvetica-Bold.afm b/reporting/fonts/Helvetica-Bold.afm new file mode 100644 index 00000000..837c594e --- /dev/null +++ b/reporting/fonts/Helvetica-Bold.afm @@ -0,0 +1,2827 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:43:52 1997 +Comment UniqueID 43052 +Comment VMusage 37169 48194 +FontName Helvetica-Bold +FullName Helvetica Bold +FamilyName Helvetica +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -228 1003 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme AdobeStandardEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 315 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; +C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; +C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; +C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; +C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; +C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; +C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ; +C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; +C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; +C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; +C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; +C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; +C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; +C 49 ; WX 556 ; N one ; B 69 0 378 710 ; +C 50 ; WX 556 ; N two ; B 26 0 511 710 ; +C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; +C 52 ; WX 556 ; N four ; B 27 0 526 710 ; +C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; +C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; +C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; +C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; +C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; +C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; +C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; +C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; +C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; +C 63 ; WX 611 ; N question ; B 60 0 556 727 ; +C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 669 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; +C 68 ; WX 722 ; N D ; B 76 0 685 718 ; +C 69 ; WX 667 ; N E ; B 76 0 621 718 ; +C 70 ; WX 611 ; N F ; B 76 0 587 718 ; +C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; +C 72 ; WX 722 ; N H ; B 71 0 651 718 ; +C 73 ; WX 278 ; N I ; B 64 0 214 718 ; +C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; +C 75 ; WX 722 ; N K ; B 87 0 722 718 ; +C 76 ; WX 611 ; N L ; B 76 0 583 718 ; +C 77 ; WX 833 ; N M ; B 69 0 765 718 ; +C 78 ; WX 722 ; N N ; B 69 0 654 718 ; +C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; +C 80 ; WX 667 ; N P ; B 76 0 627 718 ; +C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; +C 82 ; WX 722 ; N R ; B 76 0 677 718 ; +C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; +C 84 ; WX 611 ; N T ; B 14 0 598 718 ; +C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; +C 86 ; WX 667 ; N V ; B 19 0 648 718 ; +C 87 ; WX 944 ; N W ; B 16 0 929 718 ; +C 88 ; WX 667 ; N X ; B 14 0 653 718 ; +C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; +C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; +C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; +C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; +C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; +C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; +C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; +C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; +C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; +C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; +C 104 ; WX 611 ; N h ; B 65 0 546 718 ; +C 105 ; WX 278 ; N i ; B 69 0 209 725 ; +C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; +C 107 ; WX 556 ; N k ; B 69 0 562 718 ; +C 108 ; WX 278 ; N l ; B 69 0 209 718 ; +C 109 ; WX 889 ; N m ; B 64 0 826 546 ; +C 110 ; WX 611 ; N n ; B 65 0 546 546 ; +C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; +C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; +C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; +C 114 ; WX 389 ; N r ; B 64 0 373 546 ; +C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; +C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; +C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; +C 118 ; WX 556 ; N v ; B 13 0 543 532 ; +C 119 ; WX 778 ; N w ; B 10 0 769 532 ; +C 120 ; WX 556 ; N x ; B 15 0 541 532 ; +C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; +C 122 ; WX 500 ; N z ; B 20 0 480 532 ; +C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; +C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; +C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; +C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; +C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; +C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; +C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ; +C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; +C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ; +C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; +C 168 ; WX 556 ; N currency ; B -3 76 559 636 ; +C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; +C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; +C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; +C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; +C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; +C 174 ; WX 611 ; N fi ; B 10 0 542 727 ; +C 175 ; WX 611 ; N fl ; B 10 0 542 727 ; +C 177 ; WX 556 ; N endash ; B 0 227 556 333 ; +C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ; +C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; +C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; +C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; +C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ; +C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; +C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; +C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; +C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; +C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; +C 193 ; WX 333 ; N grave ; B -23 604 225 750 ; +C 194 ; WX 333 ; N acute ; B 108 604 356 750 ; +C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ; +C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ; +C 197 ; WX 333 ; N macron ; B -6 604 339 678 ; +C 198 ; WX 333 ; N breve ; B -2 604 335 750 ; +C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; +C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ; +C 202 ; WX 333 ; N ring ; B 59 568 275 776 ; +C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; +C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; +C 207 ; WX 333 ; N caron ; B -10 604 343 750 ; +C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; +C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ; +C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; +C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ; +C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; +C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ; +C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; +C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ; +C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; +C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ; +C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ; +C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ; +C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; +C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; +C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ; +C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; +C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; +C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; +C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ; +C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ; +C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; +C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ; +C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; +C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; +C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; +C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; +C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; +C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; +C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; +C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; +C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; +C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; +C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; +C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; +C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; +C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; +C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; +C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; +C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ; +C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; +C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; +C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; +C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; +C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; +C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ; +C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; +C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; +C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; +C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; +C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; +C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; +C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; +C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ; +C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; +C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; +C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; +C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; +C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; +C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; +C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; +C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ; +C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ; +C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; +C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; +C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; +C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ; +C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; +C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; +C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; +C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; +C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; +C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; +C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; +C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; +C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ; +C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; +C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; +C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ; +C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; +C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ; +C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; +C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; +C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ; +C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; +C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; +C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; +C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; +C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ; +C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; +C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ; +C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; +C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; +C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; +C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ; +C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; +C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; +C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; +C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; +C -1 ; WX 400 ; N degree ; B 57 426 343 712 ; +C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; +C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; +C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; +C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; +C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; +C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; +C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; +C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; +C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; +C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; +C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; +C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ; +C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; +C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; +C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; +C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/reporting/fonts/Helvetica-BoldOblique.afm b/reporting/fonts/Helvetica-BoldOblique.afm new file mode 100644 index 00000000..1715b210 --- /dev/null +++ b/reporting/fonts/Helvetica-BoldOblique.afm @@ -0,0 +1,2827 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:45:12 1997 +Comment UniqueID 43053 +Comment VMusage 14482 68586 +FontName Helvetica-BoldOblique +FullName Helvetica Bold Oblique +FamilyName Helvetica +Weight Bold +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -174 -228 1114 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme AdobeStandardEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 315 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; +C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; +C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; +C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; +C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; +C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; +C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ; +C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; +C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; +C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; +C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; +C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; +C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; +C 49 ; WX 556 ; N one ; B 173 0 529 710 ; +C 50 ; WX 556 ; N two ; B 26 0 619 710 ; +C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; +C 52 ; WX 556 ; N four ; B 60 0 598 710 ; +C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; +C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; +C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; +C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; +C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; +C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; +C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; +C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; +C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; +C 63 ; WX 611 ; N question ; B 165 0 671 727 ; +C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 764 718 ; +C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; +C 68 ; WX 722 ; N D ; B 76 0 777 718 ; +C 69 ; WX 667 ; N E ; B 76 0 757 718 ; +C 70 ; WX 611 ; N F ; B 76 0 740 718 ; +C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; +C 72 ; WX 722 ; N H ; B 71 0 804 718 ; +C 73 ; WX 278 ; N I ; B 64 0 367 718 ; +C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; +C 75 ; WX 722 ; N K ; B 87 0 858 718 ; +C 76 ; WX 611 ; N L ; B 76 0 611 718 ; +C 77 ; WX 833 ; N M ; B 69 0 918 718 ; +C 78 ; WX 722 ; N N ; B 69 0 807 718 ; +C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; +C 80 ; WX 667 ; N P ; B 76 0 738 718 ; +C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; +C 82 ; WX 722 ; N R ; B 76 0 778 718 ; +C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; +C 84 ; WX 611 ; N T ; B 140 0 751 718 ; +C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; +C 86 ; WX 667 ; N V ; B 172 0 801 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; +C 88 ; WX 667 ; N X ; B 14 0 791 718 ; +C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; +C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; +C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; +C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; +C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; +C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; +C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; +C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; +C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; +C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; +C 104 ; WX 611 ; N h ; B 65 0 629 718 ; +C 105 ; WX 278 ; N i ; B 69 0 363 725 ; +C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; +C 107 ; WX 556 ; N k ; B 69 0 670 718 ; +C 108 ; WX 278 ; N l ; B 69 0 362 718 ; +C 109 ; WX 889 ; N m ; B 64 0 909 546 ; +C 110 ; WX 611 ; N n ; B 65 0 629 546 ; +C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; +C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; +C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; +C 114 ; WX 389 ; N r ; B 64 0 489 546 ; +C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; +C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; +C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; +C 118 ; WX 556 ; N v ; B 126 0 656 532 ; +C 119 ; WX 778 ; N w ; B 123 0 882 532 ; +C 120 ; WX 556 ; N x ; B 15 0 648 532 ; +C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; +C 122 ; WX 500 ; N z ; B 20 0 583 532 ; +C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; +C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; +C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; +C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; +C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; +C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; +C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; +C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ; +C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; +C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ; +C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; +C 168 ; WX 556 ; N currency ; B 27 76 680 636 ; +C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; +C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; +C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; +C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; +C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; +C 174 ; WX 611 ; N fi ; B 87 0 696 727 ; +C 175 ; WX 611 ; N fl ; B 87 0 695 727 ; +C 177 ; WX 556 ; N endash ; B 48 227 627 333 ; +C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ; +C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; +C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; +C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; +C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ; +C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; +C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; +C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; +C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; +C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; +C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; +C 193 ; WX 333 ; N grave ; B 136 604 353 750 ; +C 194 ; WX 333 ; N acute ; B 236 604 515 750 ; +C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ; +C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ; +C 197 ; WX 333 ; N macron ; B 122 604 483 678 ; +C 198 ; WX 333 ; N breve ; B 156 604 494 750 ; +C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; +C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ; +C 202 ; WX 333 ; N ring ; B 200 568 420 776 ; +C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; +C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; +C 207 ; WX 333 ; N caron ; B 149 604 502 750 ; +C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; +C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ; +C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; +C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ; +C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; +C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; +C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; +C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ; +C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; +C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ; +C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ; +C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ; +C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; +C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; +C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ; +C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; +C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; +C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; +C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ; +C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ; +C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; +C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ; +C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; +C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; +C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; +C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; +C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; +C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; +C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; +C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; +C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; +C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; +C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; +C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; +C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; +C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; +C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; +C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; +C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; +C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ; +C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; +C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ; +C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; +C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; +C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; +C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; +C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; +C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ; +C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; +C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; +C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; +C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; +C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; +C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; +C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; +C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; +C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ; +C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ; +C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; +C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; +C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; +C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; +C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; +C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; +C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; +C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; +C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; +C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ; +C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ; +C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; +C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ; +C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; +C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; +C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; +C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; +C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ; +C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; +C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; +C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; +C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; +C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ; +C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; +C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; +C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; +C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; +C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ; +C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; +C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; +C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ; +C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; +C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ; +C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; +C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; +C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ; +C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; +C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; +C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; +C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; +C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; +C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; +C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ; +C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; +C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; +C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; +C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; +C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ; +C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; +C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; +C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; +C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; +C -1 ; WX 400 ; N degree ; B 175 426 467 712 ; +C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; +C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; +C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; +C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; +C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; +C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; +C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; +C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; +C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; +C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; +C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; +C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; +C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; +C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; +C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ; +C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; +C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; +C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; +C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/reporting/fonts/Helvetica-Oblique.afm b/reporting/fonts/Helvetica-Oblique.afm new file mode 100644 index 00000000..7a7af001 --- /dev/null +++ b/reporting/fonts/Helvetica-Oblique.afm @@ -0,0 +1,3051 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:44:31 1997 +Comment UniqueID 43055 +Comment VMusage 14960 69346 +FontName Helvetica-Oblique +FullName Helvetica Oblique +FamilyName Helvetica +Weight Medium +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -225 1116 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme AdobeStandardEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 315 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; +C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; +C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; +C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; +C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; +C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; +C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ; +C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; +C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; +C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; +C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; +C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; +C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; +C 46 ; WX 278 ; N period ; B 87 0 214 106 ; +C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; +C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; +C 49 ; WX 556 ; N one ; B 207 0 508 703 ; +C 50 ; WX 556 ; N two ; B 26 0 617 703 ; +C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; +C 52 ; WX 556 ; N four ; B 61 0 576 703 ; +C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; +C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; +C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; +C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; +C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; +C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; +C 60 ; WX 584 ; N less ; B 94 11 641 495 ; +C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; +C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; +C 63 ; WX 556 ; N question ; B 161 0 610 727 ; +C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 712 718 ; +C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; +C 68 ; WX 722 ; N D ; B 81 0 764 718 ; +C 69 ; WX 667 ; N E ; B 86 0 762 718 ; +C 70 ; WX 611 ; N F ; B 86 0 736 718 ; +C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; +C 72 ; WX 722 ; N H ; B 77 0 799 718 ; +C 73 ; WX 278 ; N I ; B 91 0 341 718 ; +C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; +C 75 ; WX 667 ; N K ; B 76 0 808 718 ; +C 76 ; WX 556 ; N L ; B 76 0 555 718 ; +C 77 ; WX 833 ; N M ; B 73 0 914 718 ; +C 78 ; WX 722 ; N N ; B 76 0 799 718 ; +C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; +C 80 ; WX 667 ; N P ; B 86 0 737 718 ; +C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; +C 82 ; WX 722 ; N R ; B 88 0 773 718 ; +C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; +C 84 ; WX 611 ; N T ; B 148 0 750 718 ; +C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; +C 86 ; WX 667 ; N V ; B 173 0 800 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; +C 88 ; WX 667 ; N X ; B 19 0 790 718 ; +C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; +C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; +C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; +C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; +C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; +C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; +C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; +C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; +C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; +C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; +C 104 ; WX 556 ; N h ; B 65 0 573 718 ; +C 105 ; WX 222 ; N i ; B 67 0 308 718 ; +C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; +C 107 ; WX 500 ; N k ; B 67 0 600 718 ; +C 108 ; WX 222 ; N l ; B 67 0 308 718 ; +C 109 ; WX 833 ; N m ; B 65 0 852 538 ; +C 110 ; WX 556 ; N n ; B 65 0 573 538 ; +C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; +C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; +C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; +C 114 ; WX 333 ; N r ; B 77 0 446 538 ; +C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; +C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; +C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; +C 118 ; WX 500 ; N v ; B 119 0 603 523 ; +C 119 ; WX 722 ; N w ; B 125 0 820 523 ; +C 120 ; WX 500 ; N x ; B 11 0 594 523 ; +C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; +C 122 ; WX 500 ; N z ; B 31 0 571 523 ; +C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; +C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; +C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; +C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; +C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; +C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; +C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; +C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ; +C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; +C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ; +C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; +C 168 ; WX 556 ; N currency ; B 60 99 646 603 ; +C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; +C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; +C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; +C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; +C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; +C 174 ; WX 500 ; N fi ; B 86 0 587 728 ; +C 175 ; WX 500 ; N fl ; B 86 0 585 728 ; +C 177 ; WX 556 ; N endash ; B 51 240 623 313 ; +C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ; +C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; +C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; +C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; +C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ; +C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; +C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; +C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; +C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; +C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; +C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; +C 193 ; WX 333 ; N grave ; B 170 593 337 734 ; +C 194 ; WX 333 ; N acute ; B 248 593 475 734 ; +C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ; +C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ; +C 197 ; WX 333 ; N macron ; B 143 627 468 684 ; +C 198 ; WX 333 ; N breve ; B 167 595 476 731 ; +C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; +C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ; +C 202 ; WX 333 ; N ring ; B 214 572 402 756 ; +C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; +C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; +C 207 ; WX 333 ; N caron ; B 177 593 468 734 ; +C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; +C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ; +C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; +C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ; +C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; +C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; +C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; +C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ; +C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; +C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ; +C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ; +C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ; +C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; +C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; +C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ; +C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; +C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; +C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; +C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ; +C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ; +C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ; +C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; +C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; +C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; +C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; +C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; +C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; +C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; +C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; +C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; +C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; +C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; +C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; +C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; +C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; +C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; +C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; +C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; +C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ; +C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; +C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ; +C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; +C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; +C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; +C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; +C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; +C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ; +C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; +C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; +C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; +C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; +C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; +C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; +C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; +C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; +C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ; +C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ; +C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; +C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; +C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; +C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; +C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; +C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; +C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; +C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; +C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; +C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ; +C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ; +C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; +C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ; +C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; +C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; +C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; +C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; +C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ; +C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; +C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; +C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; +C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; +C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ; +C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; +C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; +C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; +C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ; +C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; +C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; +C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ; +C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; +C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ; +C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; +C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; +C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ; +C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; +C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; +C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; +C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; +C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; +C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ; +C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; +C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; +C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; +C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; +C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ; +C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; +C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; +C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; +C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; +C -1 ; WX 400 ; N degree ; B 169 411 468 703 ; +C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ; +C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; +C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; +C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; +C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; +C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; +C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; +C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; +C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; +C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; +C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; +C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; +C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; +C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; +C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; +C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; +C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/reporting/fonts/Helvetica.afm b/reporting/fonts/Helvetica.afm new file mode 100644 index 00000000..bd32af54 --- /dev/null +++ b/reporting/fonts/Helvetica.afm @@ -0,0 +1,3051 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:38:23 1997 +Comment UniqueID 43054 +Comment VMusage 37069 48094 +FontName Helvetica +FullName Helvetica +FamilyName Helvetica +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -166 -225 1000 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme AdobeStandardEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 315 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; +C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; +C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; +C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; +C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; +C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; +C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; +C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; +C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; +C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; +C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; +C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; +C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 191 106 ; +C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; +C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; +C 49 ; WX 556 ; N one ; B 101 0 359 703 ; +C 50 ; WX 556 ; N two ; B 26 0 507 703 ; +C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; +C 52 ; WX 556 ; N four ; B 25 0 523 703 ; +C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; +C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; +C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; +C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; +C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; +C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; +C 60 ; WX 584 ; N less ; B 48 11 536 495 ; +C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; +C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; +C 63 ; WX 556 ; N question ; B 56 0 492 727 ; +C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 627 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; +C 68 ; WX 722 ; N D ; B 81 0 674 718 ; +C 69 ; WX 667 ; N E ; B 86 0 616 718 ; +C 70 ; WX 611 ; N F ; B 86 0 583 718 ; +C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; +C 72 ; WX 722 ; N H ; B 77 0 646 718 ; +C 73 ; WX 278 ; N I ; B 91 0 188 718 ; +C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; +C 75 ; WX 667 ; N K ; B 76 0 663 718 ; +C 76 ; WX 556 ; N L ; B 76 0 537 718 ; +C 77 ; WX 833 ; N M ; B 73 0 761 718 ; +C 78 ; WX 722 ; N N ; B 76 0 646 718 ; +C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; +C 80 ; WX 667 ; N P ; B 86 0 622 718 ; +C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; +C 82 ; WX 722 ; N R ; B 88 0 684 718 ; +C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; +C 84 ; WX 611 ; N T ; B 14 0 597 718 ; +C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; +C 86 ; WX 667 ; N V ; B 20 0 647 718 ; +C 87 ; WX 944 ; N W ; B 16 0 928 718 ; +C 88 ; WX 667 ; N X ; B 19 0 648 718 ; +C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; +C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; +C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; +C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; +C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; +C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; +C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; +C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; +C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; +C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; +C 104 ; WX 556 ; N h ; B 65 0 491 718 ; +C 105 ; WX 222 ; N i ; B 67 0 155 718 ; +C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; +C 107 ; WX 500 ; N k ; B 67 0 501 718 ; +C 108 ; WX 222 ; N l ; B 67 0 155 718 ; +C 109 ; WX 833 ; N m ; B 65 0 769 538 ; +C 110 ; WX 556 ; N n ; B 65 0 491 538 ; +C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; +C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; +C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; +C 114 ; WX 333 ; N r ; B 77 0 332 538 ; +C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; +C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; +C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; +C 118 ; WX 500 ; N v ; B 8 0 492 523 ; +C 119 ; WX 722 ; N w ; B 14 0 709 523 ; +C 120 ; WX 500 ; N x ; B 11 0 490 523 ; +C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; +C 122 ; WX 500 ; N z ; B 31 0 469 523 ; +C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; +C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; +C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; +C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; +C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; +C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; +C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ; +C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; +C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ; +C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; +C 168 ; WX 556 ; N currency ; B 28 99 528 603 ; +C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; +C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; +C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; +C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; +C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; +C 174 ; WX 500 ; N fi ; B 14 0 434 728 ; +C 175 ; WX 500 ; N fl ; B 14 0 432 728 ; +C 177 ; WX 556 ; N endash ; B 0 240 556 313 ; +C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ; +C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; +C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; +C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; +C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ; +C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; +C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; +C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; +C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; +C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; +C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; +C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; +C 193 ; WX 333 ; N grave ; B 14 593 211 734 ; +C 194 ; WX 333 ; N acute ; B 122 593 319 734 ; +C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ; +C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ; +C 197 ; WX 333 ; N macron ; B 10 627 323 684 ; +C 198 ; WX 333 ; N breve ; B 13 595 321 731 ; +C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; +C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ; +C 202 ; WX 333 ; N ring ; B 75 572 259 756 ; +C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; +C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; +C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; +C 207 ; WX 333 ; N caron ; B 21 593 312 734 ; +C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; +C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ; +C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; +C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ; +C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; +C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ; +C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; +C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ; +C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; +C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ; +C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ; +C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ; +C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; +C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; +C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ; +C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; +C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; +C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; +C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ; +C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ; +C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ; +C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; +C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; +C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; +C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; +C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; +C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; +C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; +C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; +C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; +C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; +C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; +C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; +C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; +C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; +C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; +C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ; +C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; +C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ; +C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; +C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; +C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; +C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; +C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; +C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ; +C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; +C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; +C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; +C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; +C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; +C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; +C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; +C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; +C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ; +C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; +C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; +C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; +C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; +C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; +C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; +C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; +C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; +C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; +C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ; +C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ; +C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; +C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ; +C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; +C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; +C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; +C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ; +C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; +C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; +C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; +C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; +C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; +C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; +C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; +C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ; +C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; +C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; +C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ; +C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; +C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ; +C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; +C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; +C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ; +C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; +C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; +C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; +C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; +C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; +C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ; +C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; +C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; +C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; +C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; +C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ; +C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; +C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; +C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; +C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; +C -1 ; WX 400 ; N degree ; B 54 411 346 703 ; +C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; +C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; +C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; +C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; +C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; +C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; +C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; +C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; +C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; +C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; +C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; +C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; +C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; +C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ; +C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; +C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; +C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; +C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/reporting/fonts/Vera.afm b/reporting/fonts/Vera.afm new file mode 100644 index 00000000..e3457e31 --- /dev/null +++ b/reporting/fonts/Vera.afm @@ -0,0 +1,1818 @@ +StartFontMetrics 4.1 +FontName BitstreamVeraSans-Roman +FullName Bitstream Vera Sans +Notice Copyright [c] 2003 by Bitstream, Inc. All Rights Reserved. +EncodingScheme FontSpecific +FamilyName Bitstream Vera Sans +Weight Roman +Version Release 1.10 +Characters 268 +ItalicAngle 0.0 +Ascender 928 +Descender -236 +UnderlineThickness 70 +UnderlinePosition -104 +IsFixedPitch false +FontBBox -183 -236 1287 928 +StartCharMetrics 305 +C 0 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 1 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 2 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 3 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 4 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 5 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 6 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 7 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 8 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 9 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 10 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 11 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 12 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 13 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 14 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 15 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 16 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 17 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 18 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 19 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 20 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 21 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 22 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 23 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 24 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 25 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 26 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 27 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 28 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 29 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 30 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 31 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 32 ; WX 318 ; N space ; B 151 0 250 729 ; +C 33 ; WX 401 ; N exclam ; B 151 0 250 729 ; +C 34 ; WX 460 ; N quotedbl ; B 96 458 364 729 ; +C 35 ; WX 838 ; N numbersign ; B 77 0 761 718 ; +C 36 ; WX 636 ; N dollar ; B 83 -147 553 760 ; +C 37 ; WX 950 ; N percent ; B 55 -14 895 742 ; +C 38 ; WX 780 ; N ampersand ; B 63 -14 749 742 ; +C 39 ; WX 275 ; N quotesingle ; B 96 458 179 729 ; +C 40 ; WX 390 ; N parenleft ; B 86 -132 310 759 ; +C 41 ; WX 390 ; N parenright ; B 80 -132 304 759 ; +C 42 ; WX 500 ; N asterisk ; B 30 286 470 742 ; +C 43 ; WX 838 ; N plus ; B 106 0 732 627 ; +C 44 ; WX 318 ; N comma ; B 77 -116 220 124 ; +C 45 ; WX 361 ; N hyphen ; B 49 234 312 314 ; +C 46 ; WX 318 ; N period ; B 107 0 210 124 ; +C 47 ; WX 337 ; N slash ; B 0 -93 337 729 ; +C 48 ; WX 636 ; N zero ; B 66 -14 570 742 ; +C 49 ; WX 636 ; N one ; B 110 0 544 729 ; +C 50 ; WX 636 ; N two ; B 73 0 536 742 ; +C 51 ; WX 636 ; N three ; B 76 -14 556 742 ; +C 52 ; WX 636 ; N four ; B 49 0 580 729 ; +C 53 ; WX 636 ; N five ; B 77 -14 549 729 ; +C 54 ; WX 636 ; N six ; B 70 -14 573 742 ; +C 55 ; WX 636 ; N seven ; B 82 0 551 729 ; +C 56 ; WX 636 ; N eight ; B 68 -14 568 742 ; +C 57 ; WX 636 ; N nine ; B 63 -14 566 742 ; +C 58 ; WX 337 ; N colon ; B 117 0 220 517 ; +C 59 ; WX 337 ; N semicolon ; B 77 -116 220 517 ; +C 60 ; WX 838 ; N less ; B 106 46 732 581 ; +C 61 ; WX 838 ; N equal ; B 106 172 732 454 ; +C 62 ; WX 838 ; N greater ; B 106 46 732 581 ; +C 63 ; WX 531 ; N question ; B 72 0 461 742 ; +C 64 ; WX 1000 ; N at ; B 66 -174 930 704 ; +C 65 ; WX 684 ; N A ; B 8 0 676 729 ; +C 66 ; WX 686 ; N B ; B 98 0 615 729 ; +C 67 ; WX 698 ; N C ; B 56 -14 644 742 ; +C 68 ; WX 770 ; N D ; B 98 0 711 729 ; +C 69 ; WX 632 ; N E ; B 98 0 568 729 ; +C 70 ; WX 575 ; N F ; B 98 0 517 729 ; +C 71 ; WX 775 ; N G ; B 56 -14 693 742 ; +C 72 ; WX 752 ; N H ; B 98 0 654 729 ; +C 73 ; WX 295 ; N I ; B 98 0 197 729 ; +C 74 ; WX 295 ; N J ; B -52 -200 197 729 ; +C 75 ; WX 656 ; N K ; B 98 0 677 729 ; +C 76 ; WX 557 ; N L ; B 98 0 552 729 ; +C 77 ; WX 863 ; N M ; B 98 0 765 729 ; +C 78 ; WX 748 ; N N ; B 98 0 650 729 ; +C 79 ; WX 787 ; N O ; B 56 -14 731 742 ; +C 80 ; WX 603 ; N P ; B 98 0 569 729 ; +C 81 ; WX 787 ; N Q ; B 56 -129 731 742 ; +C 82 ; WX 695 ; N R ; B 98 0 666 729 ; +C 83 ; WX 635 ; N S ; B 66 -14 579 742 ; +C 84 ; WX 611 ; N T ; B -3 0 614 729 ; +C 85 ; WX 732 ; N U ; B 87 -14 645 729 ; +C 86 ; WX 684 ; N V ; B 8 0 676 729 ; +C 87 ; WX 989 ; N W ; B 33 0 956 729 ; +C 88 ; WX 685 ; N X ; B 30 0 654 729 ; +C 89 ; WX 611 ; N Y ; B -2 0 613 729 ; +C 90 ; WX 685 ; N Z ; B 45 0 640 729 ; +C 91 ; WX 390 ; N bracketleft ; B 86 -132 293 760 ; +C 92 ; WX 337 ; N backslash ; B 0 -93 337 729 ; +C 93 ; WX 390 ; N bracketright ; B 97 -132 304 760 ; +C 94 ; WX 838 ; N asciicircum ; B 106 457 732 729 ; +C 95 ; WX 500 ; N underscore ; B -10 -236 510 -166 ; +C 96 ; WX 500 ; N grave ; B 83 617 317 800 ; +C 97 ; WX 613 ; N a ; B 60 -14 522 560 ; +C 98 ; WX 635 ; N b ; B 91 -14 580 760 ; +C 99 ; WX 550 ; N c ; B 55 -14 488 560 ; +C 100 ; WX 635 ; N d ; B 55 -14 544 760 ; +C 101 ; WX 615 ; N e ; B 55 -14 562 560 ; +C 102 ; WX 352 ; N f ; B 23 0 371 760 ; +C 103 ; WX 635 ; N g ; B 55 -208 544 560 ; +C 104 ; WX 634 ; N h ; B 91 0 549 760 ; +C 105 ; WX 278 ; N i ; B 94 0 184 760 ; +C 106 ; WX 278 ; N j ; B -18 -208 184 760 ; +C 107 ; WX 579 ; N k ; B 91 0 576 760 ; +C 108 ; WX 278 ; N l ; B 94 0 184 760 ; +C 109 ; WX 974 ; N m ; B 91 0 889 560 ; +C 110 ; WX 634 ; N n ; B 91 0 549 560 ; +C 111 ; WX 612 ; N o ; B 55 -14 557 560 ; +C 112 ; WX 635 ; N p ; B 91 -208 580 560 ; +C 113 ; WX 635 ; N q ; B 55 -208 544 560 ; +C 114 ; WX 411 ; N r ; B 91 0 411 560 ; +C 115 ; WX 521 ; N s ; B 54 -14 472 560 ; +C 116 ; WX 392 ; N t ; B 27 0 368 702 ; +C 117 ; WX 634 ; N u ; B 85 -14 543 547 ; +C 118 ; WX 592 ; N v ; B 30 0 562 547 ; +C 119 ; WX 818 ; N w ; B 42 0 776 547 ; +C 120 ; WX 592 ; N x ; B 29 0 559 547 ; +C 121 ; WX 592 ; N y ; B 30 -208 562 547 ; +C 122 ; WX 525 ; N z ; B 43 0 482 547 ; +C 123 ; WX 636 ; N braceleft ; B 125 -163 511 760 ; +C 124 ; WX 337 ; N bar ; B 127 -236 210 764 ; +C 125 ; WX 636 ; N braceright ; B 125 -163 511 760 ; +C 126 ; WX 838 ; N asciitilde ; B 106 228 732 399 ; +C 127 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 128 ; WX 636 ; N Euro ; B 0 -14 570 742 ; +C 129 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 130 ; WX 318 ; N quotesinglbase ; B 85 -116 228 124 ; +C 131 ; WX 636 ; N florin ; B 15 -208 626 760 ; +C 132 ; WX 518 ; N quotedblbase ; B 85 -116 428 124 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 885 124 ; +C 134 ; WX 500 ; N dagger ; B 28 -96 472 729 ; +C 135 ; WX 500 ; N daggerdbl ; B 28 -96 472 729 ; +C 136 ; WX 500 ; N circumflex ; B 94 616 406 800 ; +C 137 ; WX 1342 ; N perthousand ; B 55 -14 1287 742 ; +C 138 ; WX 635 ; N Scaron ; B 66 -14 579 928 ; +C 139 ; WX 400 ; N guilsinglleft ; B 77 69 306 517 ; +C 140 ; WX 1070 ; N OE ; B 56 0 1006 729 ; +C 141 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 142 ; WX 685 ; N Zcaron ; B 45 0 640 928 ; +C 143 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 144 ; WX 518 ; N quotedblbase ; B 85 -116 428 124 ; +C 145 ; WX 318 ; N quoteleft ; B 85 489 228 729 ; +C 146 ; WX 318 ; N quoteright ; B 87 499 230 729 ; +C 147 ; WX 518 ; N quotedblleft ; B 85 489 428 729 ; +C 148 ; WX 518 ; N quotedblright ; B 85 489 428 729 ; +C 149 ; WX 590 ; N bullet ; B 150 227 440 516 ; +C 150 ; WX 500 ; N endash ; B 0 239 500 309 ; +C 151 ; WX 1000 ; N emdash ; B 0 239 1000 309 ; +C 152 ; WX 500 ; N tilde ; B 89 639 411 777 ; +C 153 ; WX 1000 ; N trademark ; B 144 447 784 729 ; +C 154 ; WX 521 ; N scaron ; B 54 -14 472 800 ; +C 155 ; WX 400 ; N guilsinglright ; B 94 69 323 517 ; +C 156 ; WX 1023 ; N oe ; B 55 -14 970 560 ; +C 157 ; WX 600 ; N .notdef ; B 50 -177 550 705 ; +C 158 ; WX 525 ; N zcaron ; B 43 0 482 800 ; +C 159 ; WX 611 ; N Ydieresis ; B -2 0 613 913 ; +C 160 ; WX 636 ; N nbspace ; B 8 0 676 927 ; +C 161 ; WX 401 ; N exclamdown ; B 151 0 250 729 ; +C 162 ; WX 636 ; N cent ; B 84 -153 517 699 ; +C 163 ; WX 636 ; N sterling ; B 63 0 548 742 ; +C 164 ; WX 636 ; N currency ; B 46 40 592 587 ; +C 165 ; WX 636 ; N yen ; B 40 0 595 729 ; +C 166 ; WX 337 ; N brokenbar ; B 127 -171 210 699 ; +C 167 ; WX 500 ; N section ; B 45 -95 454 742 ; +C 168 ; WX 500 ; N dieresis ; B 105 659 395 758 ; +C 169 ; WX 1000 ; N copyright ; B 138 0 862 725 ; +C 170 ; WX 471 ; N ordfeminine ; B 56 229 404 742 ; +C 171 ; WX 612 ; N guillemotleft ; B 77 69 518 517 ; +C 172 ; WX 838 ; N logicalnot ; B 106 140 732 421 ; +C 173 ; WX 361 ; N sfthyphen ; B 49 234 312 314 ; +C 174 ; WX 1000 ; N registered ; B 138 0 862 725 ; +C 175 ; WX 500 ; N macron ; B 104 673 396 745 ; +C 176 ; WX 500 ; N degree ; B 95 432 405 742 ; +C 177 ; WX 838 ; N plusminus ; B 106 0 732 627 ; +C 178 ; WX 401 ; N twosuperior ; B 46 326 338 742 ; +C 179 ; WX 401 ; N threesuperior ; B 48 319 350 742 ; +C 180 ; WX 500 ; N acute ; B 181 616 415 800 ; +C 181 ; WX 636 ; N mu ; B 85 -208 612 547 ; +C 182 ; WX 636 ; N paragraph ; B 77 -96 528 729 ; +C 183 ; WX 318 ; N periodcentered ; B 107 285 210 409 ; +C 184 ; WX 500 ; N cedilla ; B 142 -193 344 0 ; +C 185 ; WX 401 ; N onesuperior ; B 67 326 346 734 ; +C 186 ; WX 471 ; N ordmasculine ; B 47 229 424 742 ; +C 187 ; WX 612 ; N guillemotright ; B 94 69 535 517 ; +C 188 ; WX 969 ; N onequarter ; B 67 -14 937 742 ; +C 189 ; WX 969 ; N onehalf ; B 67 -14 906 742 ; +C 190 ; WX 969 ; N threequarters ; B 48 -14 937 742 ; +C 191 ; WX 531 ; N questiondown ; B 70 -14 459 729 ; +C 192 ; WX 684 ; N Agrave ; B 8 0 676 927 ; +C 193 ; WX 684 ; N Aacute ; B 8 0 676 927 ; +C 194 ; WX 684 ; N Acircumflex ; B 8 0 676 928 ; +C 195 ; WX 684 ; N Atilde ; B 8 0 676 921 ; +C 196 ; WX 684 ; N Adieresis ; B 8 0 676 913 ; +C 197 ; WX 684 ; N Aring ; B 8 0 676 928 ; +C 198 ; WX 974 ; N AE ; B 4 0 910 729 ; +C 199 ; WX 698 ; N Ccedilla ; B 56 -193 644 742 ; +C 200 ; WX 632 ; N Egrave ; B 98 0 568 927 ; +C 201 ; WX 632 ; N Eacute ; B 98 0 568 927 ; +C 202 ; WX 632 ; N Ecircumflex ; B 98 0 568 928 ; +C 203 ; WX 632 ; N Edieresis ; B 98 0 568 913 ; +C 204 ; WX 295 ; N Igrave ; B 29 0 216 927 ; +C 205 ; WX 295 ; N Iacute ; B 79 0 265 927 ; +C 206 ; WX 295 ; N Icircumflex ; B -1 0 297 928 ; +C 207 ; WX 295 ; N Idieresis ; B 3 0 293 913 ; +C 208 ; WX 775 ; N Eth ; B 5 0 716 729 ; +C 209 ; WX 748 ; N Ntilde ; B 98 0 650 921 ; +C 210 ; WX 787 ; N Ograve ; B 56 -14 731 927 ; +C 211 ; WX 787 ; N Oacute ; B 56 -14 731 927 ; +C 212 ; WX 787 ; N Ocircumflex ; B 56 -14 731 928 ; +C 213 ; WX 787 ; N Otilde ; B 56 -14 731 921 ; +C 214 ; WX 787 ; N Odieresis ; B 56 -14 731 913 ; +C 215 ; WX 838 ; N multiply ; B 137 31 701 596 ; +C 216 ; WX 787 ; N Oslash ; B 50 -34 737 761 ; +C 217 ; WX 732 ; N Ugrave ; B 87 -14 645 927 ; +C 218 ; WX 732 ; N Uacute ; B 87 -14 645 927 ; +C 219 ; WX 732 ; N Ucircumflex ; B 87 -14 645 928 ; +C 220 ; WX 732 ; N Udieresis ; B 87 -14 645 913 ; +C 221 ; WX 611 ; N Yacute ; B -2 0 613 927 ; +C 222 ; WX 605 ; N Thorn ; B 98 0 569 729 ; +C 223 ; WX 630 ; N germandbls ; B 91 -14 584 760 ; +C 224 ; WX 613 ; N agrave ; B 60 -14 522 800 ; +C 225 ; WX 613 ; N aacute ; B 60 -14 522 800 ; +C 226 ; WX 613 ; N acircumflex ; B 60 -14 522 800 ; +C 227 ; WX 613 ; N atilde ; B 60 -14 522 777 ; +C 228 ; WX 613 ; N adieresis ; B 60 -14 522 758 ; +C 229 ; WX 613 ; N aring ; B 60 -14 522 878 ; +C 230 ; WX 982 ; N ae ; B 60 -14 929 560 ; +C 231 ; WX 550 ; N ccedilla ; B 55 -193 488 560 ; +C 232 ; WX 615 ; N egrave ; B 55 -14 562 800 ; +C 233 ; WX 615 ; N eacute ; B 55 -14 562 800 ; +C 234 ; WX 615 ; N ecircumflex ; B 55 -14 562 800 ; +C 235 ; WX 615 ; N edieresis ; B 55 -14 562 758 ; +C 236 ; WX 278 ; N igrave ; B -28 0 206 800 ; +C 237 ; WX 278 ; N iacute ; B 70 0 304 800 ; +C 238 ; WX 278 ; N icircumflex ; B -17 0 295 800 ; +C 239 ; WX 278 ; N idieresis ; B -6 0 284 758 ; +C 240 ; WX 612 ; N eth ; B 55 -14 557 760 ; +C 241 ; WX 634 ; N ntilde ; B 91 0 549 777 ; +C 242 ; WX 612 ; N ograve ; B 55 -14 557 800 ; +C 243 ; WX 612 ; N oacute ; B 55 -14 557 800 ; +C 244 ; WX 612 ; N ocircumflex ; B 55 -14 557 800 ; +C 245 ; WX 612 ; N otilde ; B 55 -14 557 777 ; +C 246 ; WX 612 ; N odieresis ; B 55 -14 557 758 ; +C 247 ; WX 838 ; N divide ; B 106 73 732 554 ; +C 248 ; WX 612 ; N oslash ; B 35 -46 576 592 ; +C 249 ; WX 634 ; N ugrave ; B 85 -14 543 800 ; +C 250 ; WX 634 ; N uacute ; B 85 -14 543 800 ; +C 251 ; WX 634 ; N ucircumflex ; B 85 -14 543 800 ; +C 252 ; WX 634 ; N udieresis ; B 85 -14 543 758 ; +C 253 ; WX 592 ; N yacute ; B 30 -208 562 800 ; +C 254 ; WX 635 ; N thorn ; B 91 -208 580 760 ; +C 255 ; WX 592 ; N ydieresis ; B 30 -208 562 758 ; +C -1 ; WX 0 ; N .null ; B 151 0 250 729 ; +C -1 ; WX 318 ; N CR ; B 151 0 250 729 ; +C -1 ; WX 838 ; N notequal ; B 106 19 732 608 ; +C -1 ; WX 833 ; N infinity ; B 108 108 726 491 ; +C -1 ; WX 838 ; N lessequal ; B 106 0 732 582 ; +C -1 ; WX 838 ; N greaterequal ; B 106 0 732 582 ; +C -1 ; WX 517 ; N partialdiff ; B 51 -12 469 647 ; +C -1 ; WX 674 ; N summation ; B 12 -192 654 719 ; +C -1 ; WX 757 ; N product ; B 76 -192 680 719 ; +C -1 ; WX 589 ; N pi ; B -15 -8 583 523 ; +C -1 ; WX 521 ; N integral ; B 23 -181 497 757 ; +C -1 ; WX 764 ; N Omega ; B 38 0 726 738 ; +C -1 ; WX 637 ; N radical ; B 30 -20 637 811 ; +C -1 ; WX 838 ; N approxequal ; B 106 133 732 494 ; +C -1 ; WX 669 ; N increment ; B -3 0 672 719 ; +C -1 ; WX 494 ; N lozenge ; B 3 -233 491 807 ; +C -1 ; WX 167 ; N fraction ; B -183 -14 350 742 ; +C -1 ; WX 630 ; N fi ; B 23 0 536 760 ; +C -1 ; WX 630 ; N fl ; B 23 0 536 760 ; +C -1 ; WX 278 ; N dotlessi ; B 94 0 184 547 ; +C -1 ; WX 500 ; N breve ; B 97 645 403 785 ; +C -1 ; WX 500 ; N dotaccent ; B 200 658 300 758 ; +C -1 ; WX 500 ; N ring ; B 116 610 384 878 ; +C -1 ; WX 500 ; N hungarumlaut ; B 117 616 460 800 ; +C -1 ; WX 500 ; N ogonek ; B 162 -193 344 0 ; +C -1 ; WX 500 ; N caron ; B 94 616 406 800 ; +C -1 ; WX 562 ; N Lslash ; B -7 0 557 729 ; +C -1 ; WX 284 ; N lslash ; B 1 0 285 760 ; +C -1 ; WX 838 ; N minus ; B 106 272 732 355 ; +C -1 ; WX 775 ; N Gbreve ; B 56 -14 693 928 ; +C -1 ; WX 635 ; N gbreve ; B 55 -208 544 785 ; +C -1 ; WX 295 ; N Idot ; B 98 0 198 914 ; +C -1 ; WX 635 ; N Scedilla ; B 66 -193 579 742 ; +C -1 ; WX 521 ; N scedilla ; B 54 -193 472 560 ; +C -1 ; WX 698 ; N Cacute ; B 56 -14 644 927 ; +C -1 ; WX 550 ; N cacute ; B 55 -14 488 800 ; +C -1 ; WX 698 ; N Ccaron ; B 56 -14 644 928 ; +C -1 ; WX 550 ; N ccaron ; B 55 -14 488 800 ; +C -1 ; WX 635 ; N dmacron ; B 55 -14 619 760 ; +C -1 ; WX 318 ; N _d_257 ; B 107 285 210 409 ; +C -1 ; WX 500 ; N c6459 ; B 105 632 395 731 ; +C -1 ; WX 500 ; N c6460 ; B 181 616 367 745 ; +C -1 ; WX 500 ; N c6461 ; B 89 632 411 739 ; +C -1 ; WX 500 ; N c6462 ; B 131 616 318 745 ; +C -1 ; WX 500 ; N c6463 ; B 101 616 399 746 ; +C -1 ; WX 500 ; N c6466 ; B 101 616 399 746 ; +C -1 ; WX 401 ; N c6467 ; B 31 326 369 734 ; +C -1 ; WX 500 ; N c6468 ; B 97 628 403 746 ; +C -1 ; WX 500 ; N c6469 ; B 200 632 300 732 ; +EndCharMetrics +StartKernData +StartKernPairs 1490 +KPX hyphen A -22 +KPX hyphen B -36 +KPX hyphen G 37 +KPX hyphen J 56 +KPX hyphen O 28 +KPX hyphen Q 37 +KPX hyphen T -92 +KPX hyphen V -59 +KPX hyphen W -41 +KPX hyphen X -50 +KPX hyphen Y -119 +KPX hyphen o 19 +KPX hyphen v -27 +KPX hyphen y -18 +KPX hyphen Adieresis -22 +KPX hyphen Odieresis 28 +KPX hyphen oacute 19 +KPX hyphen ograve 19 +KPX hyphen ocircumflex 19 +KPX hyphen odieresis 19 +KPX hyphen otilde 19 +KPX hyphen Agrave -22 +KPX hyphen Atilde -22 +KPX hyphen Otilde 28 +KPX hyphen ydieresis -18 +KPX hyphen Ydieresis -119 +KPX hyphen Acircumflex -22 +KPX hyphen Aacute -22 +KPX hyphen Oacute 28 +KPX hyphen Ocircumflex 28 +KPX hyphen Ograve 28 +KPX hyphen Yacute -119 +KPX hyphen yacute -18 +KPX hyphen Gbreve 37 +KPX A hyphen -22 +KPX A period -18 +KPX A colon -18 +KPX A A 28 +KPX A C -18 +KPX A G -18 +KPX A O -18 +KPX A Q -18 +KPX A T -78 +KPX A V -64 +KPX A W -55 +KPX A Y -78 +KPX A c -18 +KPX A d -18 +KPX A e -18 +KPX A f -36 +KPX A o -18 +KPX A q -18 +KPX A t -18 +KPX A v -59 +KPX A w -41 +KPX A y -68 +KPX A Adieresis 28 +KPX A Ccedilla -18 +KPX A Odieresis -18 +KPX A ccedilla -18 +KPX A eacute -18 +KPX A egrave -18 +KPX A ecircumflex -18 +KPX A edieresis -18 +KPX A oacute -18 +KPX A ograve -18 +KPX A ocircumflex -18 +KPX A odieresis -18 +KPX A otilde -18 +KPX A guillemotleft -36 +KPX A Agrave 28 +KPX A Atilde 28 +KPX A Otilde -18 +KPX A quotedblleft -129 +KPX A quotedblright -124 +KPX A ydieresis -68 +KPX A Ydieresis -78 +KPX A quotedblbase 23 +KPX A Acircumflex 28 +KPX A Aacute 28 +KPX A Oacute -18 +KPX A Ocircumflex -18 +KPX A Ograve -18 +KPX A Yacute -78 +KPX A yacute -68 +KPX A Gbreve -18 +KPX A Cacute -18 +KPX A cacute -18 +KPX A Ccaron -18 +KPX A ccaron -18 +KPX B C -18 +KPX B G -18 +KPX B O -18 +KPX B S -18 +KPX B V -31 +KPX B W -36 +KPX B Y -55 +KPX B Ccedilla -18 +KPX B Odieresis -18 +KPX B guillemotleft -31 +KPX B guillemotright -18 +KPX B Otilde -18 +KPX B quotedblleft -55 +KPX B quotedblright -55 +KPX B Ydieresis -55 +KPX B quotedblbase -41 +KPX B Oacute -18 +KPX B Ocircumflex -18 +KPX B Ograve -18 +KPX B Scaron -18 +KPX B Yacute -55 +KPX B Gbreve -18 +KPX B Scedilla -18 +KPX B Cacute -18 +KPX B Ccaron -18 +KPX C Y -18 +KPX C guillemotleft -18 +KPX C guillemotright -18 +KPX C quotedblright 19 +KPX C Ydieresis -18 +KPX C Yacute -18 +KPX D A -18 +KPX D V -18 +KPX D Y -55 +KPX D Adieresis -18 +KPX D guillemotleft -18 +KPX D guillemotright -18 +KPX D Agrave -18 +KPX D Atilde -18 +KPX D quotedblleft -22 +KPX D quotedblright -27 +KPX D Ydieresis -55 +KPX D quotedblbase -92 +KPX D Acircumflex -18 +KPX D Aacute -18 +KPX D Yacute -55 +KPX F period -161 +KPX F colon -78 +KPX F A -92 +KPX F S -18 +KPX F T -18 +KPX F a -92 +KPX F e -55 +KPX F i -73 +KPX F o -36 +KPX F r -73 +KPX F u -55 +KPX F y -92 +KPX F Adieresis -92 +KPX F aacute -92 +KPX F agrave -92 +KPX F acircumflex -92 +KPX F adieresis -92 +KPX F atilde -92 +KPX F aring -92 +KPX F eacute -55 +KPX F egrave -55 +KPX F ecircumflex -55 +KPX F edieresis -55 +KPX F oacute -36 +KPX F ograve -36 +KPX F ocircumflex -36 +KPX F odieresis -36 +KPX F otilde -36 +KPX F uacute -55 +KPX F ugrave -55 +KPX F ucircumflex -55 +KPX F udieresis -55 +KPX F Agrave -92 +KPX F Atilde -92 +KPX F quotedblleft -22 +KPX F ydieresis -92 +KPX F quotedblbase -184 +KPX F Acircumflex -92 +KPX F Aacute -92 +KPX F Scaron -18 +KPX F yacute -92 +KPX F Scedilla -18 +KPX G T -36 +KPX G Y -50 +KPX G guillemotleft -18 +KPX G guillemotright -18 +KPX G quotedblleft -22 +KPX G quotedblright -22 +KPX G Ydieresis -50 +KPX G quotedblbase -27 +KPX G Yacute -50 +KPX H period -18 +KPX H quotedblleft -36 +KPX H quotedblright -31 +KPX H quotedblbase -36 +KPX J hyphen -36 +KPX J A -18 +KPX J Adieresis -18 +KPX J guillemotleft -18 +KPX J guillemotright -18 +KPX J Agrave -18 +KPX J Atilde -18 +KPX J quotedblleft -36 +KPX J quotedblright -31 +KPX J quotedblbase -55 +KPX J Acircumflex -18 +KPX J Aacute -18 +KPX K hyphen -105 +KPX K A -18 +KPX K C -55 +KPX K O -55 +KPX K T -78 +KPX K U -27 +KPX K W -36 +KPX K Y -36 +KPX K a -18 +KPX K e -50 +KPX K o -50 +KPX K u -50 +KPX K y -73 +KPX K Adieresis -18 +KPX K Ccedilla -55 +KPX K Odieresis -55 +KPX K Udieresis -27 +KPX K aacute -18 +KPX K agrave -18 +KPX K acircumflex -18 +KPX K adieresis -18 +KPX K atilde -18 +KPX K aring -18 +KPX K eacute -50 +KPX K egrave -50 +KPX K ecircumflex -50 +KPX K edieresis -50 +KPX K oacute -50 +KPX K ograve -50 +KPX K ocircumflex -50 +KPX K odieresis -50 +KPX K otilde -50 +KPX K uacute -50 +KPX K ugrave -50 +KPX K ucircumflex -50 +KPX K udieresis -50 +KPX K guillemotleft -64 +KPX K Agrave -18 +KPX K Atilde -18 +KPX K Otilde -55 +KPX K quotedblleft -31 +KPX K quotedblright -31 +KPX K ydieresis -73 +KPX K Ydieresis -36 +KPX K Acircumflex -18 +KPX K Aacute -18 +KPX K Oacute -55 +KPX K Ocircumflex -55 +KPX K Ograve -55 +KPX K Uacute -27 +KPX K Ucircumflex -27 +KPX K Ugrave -27 +KPX K Yacute -36 +KPX K yacute -73 +KPX K Cacute -55 +KPX K Ccaron -55 +KPX L hyphen -18 +KPX L A 23 +KPX L O -36 +KPX L T -138 +KPX L U -50 +KPX L V -110 +KPX L W -92 +KPX L Y -133 +KPX L e -18 +KPX L o -18 +KPX L u -18 +KPX L y -92 +KPX L Adieresis 23 +KPX L Odieresis -36 +KPX L Udieresis -50 +KPX L eacute -18 +KPX L egrave -18 +KPX L ecircumflex -18 +KPX L edieresis -18 +KPX L oacute -18 +KPX L ograve -18 +KPX L ocircumflex -18 +KPX L odieresis -18 +KPX L otilde -18 +KPX L uacute -18 +KPX L ugrave -18 +KPX L ucircumflex -18 +KPX L udieresis -18 +KPX L Agrave 23 +KPX L Atilde 23 +KPX L Otilde -36 +KPX L quotedblleft -203 +KPX L quotedblright -263 +KPX L ydieresis -92 +KPX L Ydieresis -133 +KPX L Acircumflex 23 +KPX L Aacute 23 +KPX L Oacute -36 +KPX L Ocircumflex -36 +KPX L Ograve -36 +KPX L Uacute -50 +KPX L Ucircumflex -50 +KPX L Ugrave -50 +KPX L Yacute -133 +KPX L yacute -92 +KPX O hyphen 28 +KPX O period -41 +KPX O colon -18 +KPX O A -18 +KPX O V -18 +KPX O X -64 +KPX O Y -55 +KPX O Adieresis -18 +KPX O guillemotleft -18 +KPX O Agrave -18 +KPX O Atilde -18 +KPX O quotedblleft -22 +KPX O quotedblright -18 +KPX O Ydieresis -55 +KPX O quotedblbase -92 +KPX O Acircumflex -18 +KPX O Aacute -18 +KPX O Yacute -55 +KPX P hyphen -22 +KPX P period -156 +KPX P A -64 +KPX P Y -22 +KPX P a -45 +KPX P e -36 +KPX P i -22 +KPX P n -18 +KPX P o -36 +KPX P r -18 +KPX P s -18 +KPX P u -18 +KPX P Adieresis -64 +KPX P aacute -45 +KPX P agrave -45 +KPX P acircumflex -45 +KPX P adieresis -45 +KPX P atilde -45 +KPX P aring -45 +KPX P eacute -36 +KPX P egrave -36 +KPX P ecircumflex -36 +KPX P edieresis -36 +KPX P ntilde -18 +KPX P oacute -36 +KPX P ograve -36 +KPX P ocircumflex -36 +KPX P odieresis -36 +KPX P otilde -36 +KPX P uacute -18 +KPX P ugrave -18 +KPX P ucircumflex -18 +KPX P udieresis -18 +KPX P guillemotleft -18 +KPX P Agrave -64 +KPX P Atilde -64 +KPX P quotedblleft 19 +KPX P quotedblright 19 +KPX P Ydieresis -22 +KPX P quotedblbase -161 +KPX P Acircumflex -64 +KPX P Aacute -64 +KPX P scaron -18 +KPX P Yacute -22 +KPX P scedilla -18 +KPX Q hyphen 28 +KPX Q quotedblleft -22 +KPX Q quotedblright -18 +KPX Q quotedblbase -64 +KPX R hyphen -41 +KPX R period -36 +KPX R colon -31 +KPX R A -41 +KPX R C -50 +KPX R T -73 +KPX R V -55 +KPX R W -41 +KPX R Y -64 +KPX R a -22 +KPX R e -45 +KPX R o -45 +KPX R u -45 +KPX R y -55 +KPX R Adieresis -41 +KPX R Ccedilla -50 +KPX R aacute -22 +KPX R agrave -22 +KPX R acircumflex -22 +KPX R adieresis -22 +KPX R atilde -22 +KPX R aring -22 +KPX R eacute -45 +KPX R egrave -45 +KPX R ecircumflex -45 +KPX R edieresis -45 +KPX R oacute -45 +KPX R ograve -45 +KPX R ocircumflex -45 +KPX R odieresis -45 +KPX R otilde -45 +KPX R uacute -45 +KPX R ugrave -45 +KPX R ucircumflex -45 +KPX R udieresis -45 +KPX R guillemotleft -55 +KPX R guillemotright -18 +KPX R Agrave -41 +KPX R Atilde -41 +KPX R quotedblleft -73 +KPX R quotedblright -64 +KPX R ydieresis -55 +KPX R Ydieresis -64 +KPX R quotedblbase -18 +KPX R Acircumflex -41 +KPX R Aacute -41 +KPX R Yacute -64 +KPX R yacute -55 +KPX R Cacute -50 +KPX R Ccaron -50 +KPX S A 19 +KPX S Adieresis 19 +KPX S Agrave 19 +KPX S Atilde 19 +KPX S Acircumflex 19 +KPX S Aacute 19 +KPX T hyphen -92 +KPX T period -119 +KPX T colon -110 +KPX T A -78 +KPX T C -59 +KPX T T -18 +KPX T a -166 +KPX T c -170 +KPX T e -170 +KPX T i -31 +KPX T o -170 +KPX T r -147 +KPX T s -166 +KPX T u -152 +KPX T w -166 +KPX T y -156 +KPX T Adieresis -78 +KPX T Ccedilla -59 +KPX T aacute -166 +KPX T agrave -166 +KPX T acircumflex -166 +KPX T adieresis -166 +KPX T atilde -166 +KPX T aring -166 +KPX T ccedilla -170 +KPX T eacute -170 +KPX T egrave -170 +KPX T ecircumflex -170 +KPX T edieresis -170 +KPX T oacute -170 +KPX T ograve -170 +KPX T ocircumflex -170 +KPX T odieresis -170 +KPX T otilde -170 +KPX T uacute -152 +KPX T ugrave -152 +KPX T ucircumflex -152 +KPX T udieresis -152 +KPX T guillemotleft -92 +KPX T guillemotright -55 +KPX T Agrave -78 +KPX T Atilde -78 +KPX T quotedblright -22 +KPX T ydieresis -156 +KPX T quotedblbase -129 +KPX T Acircumflex -78 +KPX T Aacute -78 +KPX T scaron -166 +KPX T yacute -156 +KPX T scedilla -166 +KPX T Cacute -59 +KPX T cacute -170 +KPX T Ccaron -59 +KPX T ccaron -170 +KPX U Z -18 +KPX U Zcaron -18 +KPX V hyphen -59 +KPX V period -129 +KPX V colon -82 +KPX V A -64 +KPX V O -18 +KPX V a -78 +KPX V e -78 +KPX V i -22 +KPX V o -78 +KPX V u -68 +KPX V y -27 +KPX V Adieresis -64 +KPX V Odieresis -18 +KPX V aacute -78 +KPX V agrave -78 +KPX V acircumflex -78 +KPX V adieresis -78 +KPX V atilde -78 +KPX V aring -78 +KPX V eacute -78 +KPX V egrave -78 +KPX V ecircumflex -78 +KPX V edieresis -78 +KPX V oacute -78 +KPX V ograve -78 +KPX V ocircumflex -78 +KPX V odieresis -78 +KPX V otilde -78 +KPX V uacute -68 +KPX V ugrave -68 +KPX V ucircumflex -68 +KPX V udieresis -68 +KPX V guillemotleft -87 +KPX V guillemotright -55 +KPX V Agrave -64 +KPX V Atilde -64 +KPX V Otilde -18 +KPX V ydieresis -27 +KPX V quotedblbase -138 +KPX V Acircumflex -64 +KPX V Aacute -64 +KPX V Oacute -18 +KPX V Ocircumflex -18 +KPX V Ograve -18 +KPX V yacute -27 +KPX W hyphen -41 +KPX W period -115 +KPX W colon -59 +KPX W A -55 +KPX W a -64 +KPX W e -59 +KPX W i -22 +KPX W o -59 +KPX W r -45 +KPX W u -36 +KPX W y -18 +KPX W Adieresis -55 +KPX W aacute -64 +KPX W agrave -64 +KPX W acircumflex -64 +KPX W adieresis -64 +KPX W atilde -64 +KPX W aring -64 +KPX W eacute -59 +KPX W egrave -59 +KPX W ecircumflex -59 +KPX W edieresis -59 +KPX W oacute -59 +KPX W ograve -59 +KPX W ocircumflex -59 +KPX W odieresis -59 +KPX W otilde -59 +KPX W uacute -36 +KPX W ugrave -36 +KPX W ucircumflex -36 +KPX W udieresis -36 +KPX W guillemotleft -55 +KPX W guillemotright -18 +KPX W Agrave -55 +KPX W Atilde -55 +KPX W quotedblleft -18 +KPX W ydieresis -18 +KPX W quotedblbase -129 +KPX W Acircumflex -55 +KPX W Aacute -55 +KPX W yacute -18 +KPX X hyphen -50 +KPX X C -73 +KPX X O -64 +KPX X T -18 +KPX X e -45 +KPX X Ccedilla -73 +KPX X Odieresis -64 +KPX X eacute -45 +KPX X egrave -45 +KPX X ecircumflex -45 +KPX X edieresis -45 +KPX X guillemotleft -55 +KPX X Otilde -64 +KPX X quotedblleft -78 +KPX X quotedblright -41 +KPX X quotedblbase -22 +KPX X Oacute -64 +KPX X Ocircumflex -64 +KPX X Ograve -64 +KPX X Cacute -73 +KPX X Ccaron -73 +KPX Y hyphen -119 +KPX Y period -203 +KPX Y colon -133 +KPX Y A -78 +KPX Y C -55 +KPX Y O -55 +KPX Y a -138 +KPX Y e -133 +KPX Y i -36 +KPX Y o -133 +KPX Y u -115 +KPX Y Adieresis -78 +KPX Y Ccedilla -55 +KPX Y Odieresis -55 +KPX Y aacute -138 +KPX Y agrave -138 +KPX Y acircumflex -138 +KPX Y adieresis -138 +KPX Y atilde -138 +KPX Y aring -138 +KPX Y eacute -133 +KPX Y egrave -133 +KPX Y ecircumflex -133 +KPX Y edieresis -133 +KPX Y oacute -133 +KPX Y ograve -133 +KPX Y ocircumflex -133 +KPX Y odieresis -133 +KPX Y otilde -133 +KPX Y uacute -115 +KPX Y ugrave -115 +KPX Y ucircumflex -115 +KPX Y udieresis -115 +KPX Y guillemotleft -110 +KPX Y guillemotright -73 +KPX Y Agrave -78 +KPX Y Atilde -78 +KPX Y Otilde -55 +KPX Y quotedblleft -55 +KPX Y quotedblright -18 +KPX Y quotedblbase -129 +KPX Y Acircumflex -78 +KPX Y Aacute -78 +KPX Y Oacute -55 +KPX Y Ocircumflex -55 +KPX Y Ograve -55 +KPX Y Cacute -55 +KPX Y Ccaron -55 +KPX Z hyphen -18 +KPX Z quotedblleft -18 +KPX Z quotedblright -18 +KPX Z quotedblbase -18 +KPX e x -18 +KPX f hyphen -55 +KPX f period -73 +KPX f colon -36 +KPX f t -18 +KPX f w -18 +KPX f y -18 +KPX f guillemotleft -36 +KPX f guillemotright -18 +KPX f quotedblleft 32 +KPX f ydieresis -18 +KPX f quotedblbase -115 +KPX f yacute -18 +KPX k a -18 +KPX k e -36 +KPX k o -36 +KPX k u -31 +KPX k y -36 +KPX k aacute -18 +KPX k agrave -18 +KPX k acircumflex -18 +KPX k adieresis -18 +KPX k atilde -18 +KPX k aring -18 +KPX k eacute -36 +KPX k egrave -36 +KPX k ecircumflex -36 +KPX k edieresis -36 +KPX k oacute -36 +KPX k ograve -36 +KPX k ocircumflex -36 +KPX k odieresis -36 +KPX k otilde -36 +KPX k uacute -31 +KPX k ugrave -31 +KPX k ucircumflex -31 +KPX k udieresis -31 +KPX k ydieresis -36 +KPX k yacute -36 +KPX n quotedblleft -73 +KPX n quotedblright -55 +KPX n quotedblbase -45 +KPX o hyphen 19 +KPX o period -18 +KPX o x -31 +KPX o quotedblleft -73 +KPX o quotedblright -36 +KPX o quotedblbase -64 +KPX r hyphen -64 +KPX r period -92 +KPX r colon -18 +KPX r c -22 +KPX r d -18 +KPX r e -22 +KPX r g -18 +KPX r h -18 +KPX r m -18 +KPX r n -18 +KPX r o -22 +KPX r q -18 +KPX r r -18 +KPX r x -27 +KPX r ccedilla -22 +KPX r eacute -22 +KPX r egrave -22 +KPX r ecircumflex -22 +KPX r edieresis -22 +KPX r ntilde -18 +KPX r oacute -22 +KPX r ograve -22 +KPX r ocircumflex -22 +KPX r odieresis -22 +KPX r otilde -22 +KPX r guillemotleft -36 +KPX r quotedblright 42 +KPX r quotedblbase -152 +KPX r gbreve -18 +KPX r cacute -22 +KPX r ccaron -22 +KPX v hyphen -27 +KPX v period -78 +KPX v colon -55 +KPX v guillemotleft -18 +KPX v guillemotright -18 +KPX v quotedblright -18 +KPX v quotedblbase -133 +KPX w period -92 +KPX w colon -55 +KPX w guillemotleft -18 +KPX w guillemotright -18 +KPX w quotedblbase -105 +KPX x c -18 +KPX x e -31 +KPX x o -31 +KPX x ccedilla -18 +KPX x eacute -31 +KPX x egrave -31 +KPX x ecircumflex -31 +KPX x edieresis -31 +KPX x oacute -31 +KPX x ograve -31 +KPX x ocircumflex -31 +KPX x odieresis -31 +KPX x otilde -31 +KPX x cacute -18 +KPX x ccaron -18 +KPX y hyphen -18 +KPX y period -143 +KPX y colon -73 +KPX y guillemotleft -18 +KPX y guillemotright -18 +KPX y quotedblbase -147 +KPX Adieresis hyphen -22 +KPX Adieresis period -18 +KPX Adieresis colon -18 +KPX Adieresis A 28 +KPX Adieresis C -18 +KPX Adieresis G -18 +KPX Adieresis O -18 +KPX Adieresis Q -18 +KPX Adieresis T -78 +KPX Adieresis V -64 +KPX Adieresis W -55 +KPX Adieresis Y -78 +KPX Adieresis c -18 +KPX Adieresis d -18 +KPX Adieresis e -18 +KPX Adieresis f -36 +KPX Adieresis o -18 +KPX Adieresis q -18 +KPX Adieresis t -18 +KPX Adieresis v -59 +KPX Adieresis w -41 +KPX Adieresis y -68 +KPX Adieresis Adieresis 28 +KPX Adieresis Ccedilla -18 +KPX Adieresis Odieresis -18 +KPX Adieresis ccedilla -18 +KPX Adieresis eacute -18 +KPX Adieresis egrave -18 +KPX Adieresis ecircumflex -18 +KPX Adieresis edieresis -18 +KPX Adieresis oacute -18 +KPX Adieresis ograve -18 +KPX Adieresis ocircumflex -18 +KPX Adieresis odieresis -18 +KPX Adieresis otilde -18 +KPX Adieresis guillemotleft -36 +KPX Adieresis Agrave 28 +KPX Adieresis Atilde 28 +KPX Adieresis Otilde -18 +KPX Adieresis quotedblleft -129 +KPX Adieresis quotedblright -124 +KPX Adieresis ydieresis -68 +KPX Adieresis Ydieresis -78 +KPX Adieresis quotedblbase 23 +KPX Adieresis Acircumflex 28 +KPX Adieresis Aacute 28 +KPX Adieresis Oacute -18 +KPX Adieresis Ocircumflex -18 +KPX Adieresis Ograve -18 +KPX Adieresis Yacute -78 +KPX Adieresis yacute -68 +KPX Adieresis Gbreve -18 +KPX Adieresis Cacute -18 +KPX Adieresis cacute -18 +KPX Adieresis Ccaron -18 +KPX Adieresis ccaron -18 +KPX Ccedilla Y -18 +KPX Ccedilla guillemotleft -18 +KPX Ccedilla guillemotright -18 +KPX Ccedilla quotedblright 19 +KPX Ccedilla Ydieresis -18 +KPX Ccedilla Yacute -18 +KPX Odieresis hyphen 28 +KPX Odieresis period -41 +KPX Odieresis colon -18 +KPX Odieresis A -18 +KPX Odieresis V -18 +KPX Odieresis X -64 +KPX Odieresis Y -55 +KPX Odieresis Adieresis -18 +KPX Odieresis guillemotleft -18 +KPX Odieresis Agrave -18 +KPX Odieresis Atilde -18 +KPX Odieresis quotedblleft -22 +KPX Odieresis quotedblright -18 +KPX Odieresis Ydieresis -55 +KPX Odieresis quotedblbase -92 +KPX Odieresis Acircumflex -18 +KPX Odieresis Aacute -18 +KPX Odieresis Yacute -55 +KPX Udieresis Z -18 +KPX Udieresis Zcaron -18 +KPX eacute x -18 +KPX egrave x -18 +KPX ecircumflex x -18 +KPX edieresis x -18 +KPX ntilde quotedblleft -73 +KPX ntilde quotedblright -55 +KPX ntilde quotedblbase -45 +KPX oacute hyphen 19 +KPX oacute period -18 +KPX oacute x -31 +KPX oacute quotedblleft -73 +KPX oacute quotedblright -36 +KPX oacute quotedblbase -64 +KPX ograve hyphen 19 +KPX ograve period -18 +KPX ograve x -31 +KPX ograve quotedblleft -73 +KPX ograve quotedblright -36 +KPX ograve quotedblbase -64 +KPX ocircumflex hyphen 19 +KPX ocircumflex period -18 +KPX ocircumflex x -31 +KPX ocircumflex quotedblleft -73 +KPX ocircumflex quotedblright -36 +KPX ocircumflex quotedblbase -64 +KPX odieresis hyphen 19 +KPX odieresis period -18 +KPX odieresis x -31 +KPX odieresis quotedblleft -73 +KPX odieresis quotedblright -36 +KPX odieresis quotedblbase -64 +KPX otilde hyphen 19 +KPX otilde period -18 +KPX otilde x -31 +KPX otilde quotedblleft -73 +KPX otilde quotedblright -36 +KPX otilde quotedblbase -64 +KPX germandbls hyphen 19 +KPX germandbls quotedblleft -55 +KPX germandbls quotedblright -55 +KPX germandbls quotedblbase -41 +KPX AE quotedblleft -41 +KPX AE quotedblright -45 +KPX AE quotedblbase -55 +KPX guillemotleft B -18 +KPX guillemotleft C -18 +KPX guillemotleft D -18 +KPX guillemotleft G -18 +KPX guillemotleft J -18 +KPX guillemotleft T -55 +KPX guillemotleft V -55 +KPX guillemotleft W -18 +KPX guillemotleft Y -73 +KPX guillemotleft v -18 +KPX guillemotleft w -18 +KPX guillemotleft y -18 +KPX guillemotleft Ccedilla -18 +KPX guillemotleft AE 74 +KPX guillemotleft ydieresis -18 +KPX guillemotleft Ydieresis -73 +KPX guillemotleft Yacute -73 +KPX guillemotleft yacute -18 +KPX guillemotleft Gbreve -18 +KPX guillemotleft Cacute -18 +KPX guillemotleft Ccaron -18 +KPX guillemotright A -36 +KPX guillemotright B -36 +KPX guillemotright C -18 +KPX guillemotright D -18 +KPX guillemotright J -18 +KPX guillemotright O -18 +KPX guillemotright T -92 +KPX guillemotright V -87 +KPX guillemotright W -55 +KPX guillemotright X -55 +KPX guillemotright Y -110 +KPX guillemotright v -18 +KPX guillemotright w -18 +KPX guillemotright y -18 +KPX guillemotright Adieresis -36 +KPX guillemotright Ccedilla -18 +KPX guillemotright Odieresis -18 +KPX guillemotright Agrave -36 +KPX guillemotright Atilde -36 +KPX guillemotright Otilde -18 +KPX guillemotright ydieresis -18 +KPX guillemotright Ydieresis -110 +KPX guillemotright Acircumflex -36 +KPX guillemotright Aacute -36 +KPX guillemotright Oacute -18 +KPX guillemotright Ocircumflex -18 +KPX guillemotright Ograve -18 +KPX guillemotright Yacute -110 +KPX guillemotright yacute -18 +KPX guillemotright Cacute -18 +KPX guillemotright Ccaron -18 +KPX Agrave hyphen -22 +KPX Agrave period -18 +KPX Agrave colon -18 +KPX Agrave A 28 +KPX Agrave C -18 +KPX Agrave G -18 +KPX Agrave O -18 +KPX Agrave Q -18 +KPX Agrave T -78 +KPX Agrave V -64 +KPX Agrave W -55 +KPX Agrave Y -78 +KPX Agrave c -18 +KPX Agrave d -18 +KPX Agrave e -18 +KPX Agrave f -36 +KPX Agrave o -18 +KPX Agrave q -18 +KPX Agrave t -18 +KPX Agrave v -59 +KPX Agrave w -41 +KPX Agrave y -68 +KPX Agrave Adieresis 28 +KPX Agrave Ccedilla -18 +KPX Agrave Odieresis -18 +KPX Agrave ccedilla -18 +KPX Agrave eacute -18 +KPX Agrave egrave -18 +KPX Agrave ecircumflex -18 +KPX Agrave edieresis -18 +KPX Agrave oacute -18 +KPX Agrave ograve -18 +KPX Agrave ocircumflex -18 +KPX Agrave odieresis -18 +KPX Agrave otilde -18 +KPX Agrave guillemotleft -36 +KPX Agrave Agrave 28 +KPX Agrave Atilde 28 +KPX Agrave Otilde -18 +KPX Agrave quotedblleft -129 +KPX Agrave quotedblright -124 +KPX Agrave ydieresis -68 +KPX Agrave Ydieresis -78 +KPX Agrave quotedblbase 23 +KPX Agrave Acircumflex 28 +KPX Agrave Aacute 28 +KPX Agrave Oacute -18 +KPX Agrave Ocircumflex -18 +KPX Agrave Ograve -18 +KPX Agrave Yacute -78 +KPX Agrave yacute -68 +KPX Agrave Gbreve -18 +KPX Agrave Cacute -18 +KPX Agrave cacute -18 +KPX Agrave Ccaron -18 +KPX Agrave ccaron -18 +KPX Atilde hyphen -22 +KPX Atilde period -18 +KPX Atilde colon -18 +KPX Atilde A 28 +KPX Atilde C -18 +KPX Atilde G -18 +KPX Atilde O -18 +KPX Atilde Q -18 +KPX Atilde T -78 +KPX Atilde V -64 +KPX Atilde W -55 +KPX Atilde Y -78 +KPX Atilde c -18 +KPX Atilde d -18 +KPX Atilde e -18 +KPX Atilde f -36 +KPX Atilde o -18 +KPX Atilde q -18 +KPX Atilde t -18 +KPX Atilde v -59 +KPX Atilde w -41 +KPX Atilde y -68 +KPX Atilde Adieresis 28 +KPX Atilde Ccedilla -18 +KPX Atilde Odieresis -18 +KPX Atilde ccedilla -18 +KPX Atilde eacute -18 +KPX Atilde egrave -18 +KPX Atilde ecircumflex -18 +KPX Atilde edieresis -18 +KPX Atilde oacute -18 +KPX Atilde ograve -18 +KPX Atilde ocircumflex -18 +KPX Atilde odieresis -18 +KPX Atilde otilde -18 +KPX Atilde guillemotleft -36 +KPX Atilde Agrave 28 +KPX Atilde Atilde 28 +KPX Atilde Otilde -18 +KPX Atilde quotedblleft -129 +KPX Atilde quotedblright -124 +KPX Atilde ydieresis -68 +KPX Atilde Ydieresis -78 +KPX Atilde quotedblbase 23 +KPX Atilde Acircumflex 28 +KPX Atilde Aacute 28 +KPX Atilde Oacute -18 +KPX Atilde Ocircumflex -18 +KPX Atilde Ograve -18 +KPX Atilde Yacute -78 +KPX Atilde yacute -68 +KPX Atilde Gbreve -18 +KPX Atilde Cacute -18 +KPX Atilde cacute -18 +KPX Atilde Ccaron -18 +KPX Atilde ccaron -18 +KPX Otilde hyphen 28 +KPX Otilde period -41 +KPX Otilde colon -18 +KPX Otilde A -18 +KPX Otilde V -18 +KPX Otilde X -64 +KPX Otilde Y -55 +KPX Otilde Adieresis -18 +KPX Otilde guillemotleft -18 +KPX Otilde Agrave -18 +KPX Otilde Atilde -18 +KPX Otilde quotedblleft -22 +KPX Otilde quotedblright -18 +KPX Otilde Ydieresis -55 +KPX Otilde quotedblbase -92 +KPX Otilde Acircumflex -18 +KPX Otilde Aacute -18 +KPX Otilde Yacute -55 +KPX quotedblleft A -129 +KPX quotedblleft B -31 +KPX quotedblleft C -36 +KPX quotedblleft D -31 +KPX quotedblleft F -31 +KPX quotedblleft G -36 +KPX quotedblleft H -31 +KPX quotedblleft J -31 +KPX quotedblleft K -31 +KPX quotedblleft L -31 +KPX quotedblleft O -36 +KPX quotedblleft P -31 +KPX quotedblleft Q -36 +KPX quotedblleft R -31 +KPX quotedblleft X -59 +KPX quotedblleft Z -18 +KPX quotedblleft f -36 +KPX quotedblleft n -55 +KPX quotedblleft o -73 +KPX quotedblleft r -55 +KPX quotedblleft v -36 +KPX quotedblleft w -36 +KPX quotedblleft y -36 +KPX quotedblleft Adieresis -129 +KPX quotedblleft Ccedilla -36 +KPX quotedblleft Odieresis -36 +KPX quotedblleft ntilde -55 +KPX quotedblleft oacute -73 +KPX quotedblleft ograve -73 +KPX quotedblleft ocircumflex -73 +KPX quotedblleft odieresis -73 +KPX quotedblleft otilde -73 +KPX quotedblleft germandbls -31 +KPX quotedblleft AE -189 +KPX quotedblleft Agrave -129 +KPX quotedblleft Atilde -129 +KPX quotedblleft Otilde -36 +KPX quotedblleft ydieresis -36 +KPX quotedblleft Acircumflex -129 +KPX quotedblleft Aacute -129 +KPX quotedblleft Oacute -36 +KPX quotedblleft Ocircumflex -36 +KPX quotedblleft Ograve -36 +KPX quotedblleft Zcaron -18 +KPX quotedblleft eth -36 +KPX quotedblleft yacute -36 +KPX quotedblleft Thorn -31 +KPX quotedblleft Gbreve -36 +KPX quotedblleft Cacute -36 +KPX quotedblleft Ccaron -36 +KPX ydieresis hyphen -18 +KPX ydieresis period -143 +KPX ydieresis colon -73 +KPX ydieresis guillemotleft -18 +KPX ydieresis guillemotright -18 +KPX ydieresis quotedblbase -147 +KPX Ydieresis hyphen -119 +KPX Ydieresis period -203 +KPX Ydieresis colon -133 +KPX Ydieresis A -78 +KPX Ydieresis C -55 +KPX Ydieresis O -55 +KPX Ydieresis a -138 +KPX Ydieresis e -133 +KPX Ydieresis i -36 +KPX Ydieresis o -133 +KPX Ydieresis u -115 +KPX Ydieresis Adieresis -78 +KPX Ydieresis Ccedilla -55 +KPX Ydieresis Odieresis -55 +KPX Ydieresis aacute -138 +KPX Ydieresis agrave -138 +KPX Ydieresis acircumflex -138 +KPX Ydieresis adieresis -138 +KPX Ydieresis atilde -138 +KPX Ydieresis aring -138 +KPX Ydieresis eacute -133 +KPX Ydieresis egrave -133 +KPX Ydieresis ecircumflex -133 +KPX Ydieresis edieresis -133 +KPX Ydieresis oacute -133 +KPX Ydieresis ograve -133 +KPX Ydieresis ocircumflex -133 +KPX Ydieresis odieresis -133 +KPX Ydieresis otilde -133 +KPX Ydieresis uacute -115 +KPX Ydieresis ugrave -115 +KPX Ydieresis ucircumflex -115 +KPX Ydieresis udieresis -115 +KPX Ydieresis guillemotleft -110 +KPX Ydieresis guillemotright -73 +KPX Ydieresis Agrave -78 +KPX Ydieresis Atilde -78 +KPX Ydieresis Otilde -55 +KPX Ydieresis quotedblleft -55 +KPX Ydieresis quotedblright -18 +KPX Ydieresis quotedblbase -129 +KPX Ydieresis Acircumflex -78 +KPX Ydieresis Aacute -78 +KPX Ydieresis Oacute -55 +KPX Ydieresis Ocircumflex -55 +KPX Ydieresis Ograve -55 +KPX Ydieresis Cacute -55 +KPX Ydieresis Ccaron -55 +KPX quotedblbase A 19 +KPX quotedblbase B -36 +KPX quotedblbase C -55 +KPX quotedblbase D -36 +KPX quotedblbase F -36 +KPX quotedblbase G -36 +KPX quotedblbase H -36 +KPX quotedblbase J 23 +KPX quotedblbase K -36 +KPX quotedblbase L -36 +KPX quotedblbase O -55 +KPX quotedblbase P -36 +KPX quotedblbase Q -55 +KPX quotedblbase R -36 +KPX quotedblbase T -138 +KPX quotedblbase V -184 +KPX quotedblbase W -124 +KPX quotedblbase X -36 +KPX quotedblbase Y -184 +KPX quotedblbase f -18 +KPX quotedblbase n -36 +KPX quotedblbase o -36 +KPX quotedblbase r -36 +KPX quotedblbase v -115 +KPX quotedblbase w -96 +KPX quotedblbase y -55 +KPX quotedblbase Adieresis 19 +KPX quotedblbase Ccedilla -55 +KPX quotedblbase Odieresis -55 +KPX quotedblbase ntilde -36 +KPX quotedblbase oacute -36 +KPX quotedblbase ograve -36 +KPX quotedblbase ocircumflex -36 +KPX quotedblbase odieresis -36 +KPX quotedblbase otilde -36 +KPX quotedblbase germandbls -36 +KPX quotedblbase AE 19 +KPX quotedblbase Agrave 19 +KPX quotedblbase Atilde 19 +KPX quotedblbase Otilde -55 +KPX quotedblbase ydieresis -55 +KPX quotedblbase Ydieresis -184 +KPX quotedblbase Acircumflex 19 +KPX quotedblbase Aacute 19 +KPX quotedblbase Oacute -55 +KPX quotedblbase Ocircumflex -55 +KPX quotedblbase Ograve -55 +KPX quotedblbase eth -36 +KPX quotedblbase Yacute -184 +KPX quotedblbase yacute -55 +KPX quotedblbase Thorn -36 +KPX quotedblbase Gbreve -36 +KPX quotedblbase Cacute -55 +KPX quotedblbase Ccaron -55 +KPX Acircumflex hyphen -22 +KPX Acircumflex period -18 +KPX Acircumflex colon -18 +KPX Acircumflex A 28 +KPX Acircumflex C -18 +KPX Acircumflex G -18 +KPX Acircumflex O -18 +KPX Acircumflex Q -18 +KPX Acircumflex T -78 +KPX Acircumflex V -64 +KPX Acircumflex W -55 +KPX Acircumflex Y -78 +KPX Acircumflex c -18 +KPX Acircumflex d -18 +KPX Acircumflex e -18 +KPX Acircumflex f -36 +KPX Acircumflex o -18 +KPX Acircumflex q -18 +KPX Acircumflex t -18 +KPX Acircumflex v -59 +KPX Acircumflex w -41 +KPX Acircumflex y -68 +KPX Acircumflex Adieresis 28 +KPX Acircumflex Ccedilla -18 +KPX Acircumflex Odieresis -18 +KPX Acircumflex ccedilla -18 +KPX Acircumflex eacute -18 +KPX Acircumflex egrave -18 +KPX Acircumflex ecircumflex -18 +KPX Acircumflex edieresis -18 +KPX Acircumflex oacute -18 +KPX Acircumflex ograve -18 +KPX Acircumflex ocircumflex -18 +KPX Acircumflex odieresis -18 +KPX Acircumflex otilde -18 +KPX Acircumflex guillemotleft -36 +KPX Acircumflex Agrave 28 +KPX Acircumflex Atilde 28 +KPX Acircumflex Otilde -18 +KPX Acircumflex quotedblleft -129 +KPX Acircumflex quotedblright -124 +KPX Acircumflex ydieresis -68 +KPX Acircumflex Ydieresis -78 +KPX Acircumflex quotedblbase 23 +KPX Acircumflex Acircumflex 28 +KPX Acircumflex Aacute 28 +KPX Acircumflex Oacute -18 +KPX Acircumflex Ocircumflex -18 +KPX Acircumflex Ograve -18 +KPX Acircumflex Yacute -78 +KPX Acircumflex yacute -68 +KPX Acircumflex Gbreve -18 +KPX Acircumflex Cacute -18 +KPX Acircumflex cacute -18 +KPX Acircumflex Ccaron -18 +KPX Acircumflex ccaron -18 +KPX Aacute hyphen -22 +KPX Aacute period -18 +KPX Aacute colon -18 +KPX Aacute A 28 +KPX Aacute C -18 +KPX Aacute G -18 +KPX Aacute O -18 +KPX Aacute Q -18 +KPX Aacute T -78 +KPX Aacute V -64 +KPX Aacute W -55 +KPX Aacute Y -78 +KPX Aacute c -18 +KPX Aacute d -18 +KPX Aacute e -18 +KPX Aacute f -36 +KPX Aacute o -18 +KPX Aacute q -18 +KPX Aacute t -18 +KPX Aacute v -59 +KPX Aacute w -41 +KPX Aacute y -68 +KPX Aacute Adieresis 28 +KPX Aacute Ccedilla -18 +KPX Aacute Odieresis -18 +KPX Aacute ccedilla -18 +KPX Aacute eacute -18 +KPX Aacute egrave -18 +KPX Aacute ecircumflex -18 +KPX Aacute edieresis -18 +KPX Aacute oacute -18 +KPX Aacute ograve -18 +KPX Aacute ocircumflex -18 +KPX Aacute odieresis -18 +KPX Aacute otilde -18 +KPX Aacute guillemotleft -36 +KPX Aacute Agrave 28 +KPX Aacute Atilde 28 +KPX Aacute Otilde -18 +KPX Aacute quotedblleft -129 +KPX Aacute quotedblright -124 +KPX Aacute ydieresis -68 +KPX Aacute Ydieresis -78 +KPX Aacute quotedblbase 23 +KPX Aacute Acircumflex 28 +KPX Aacute Aacute 28 +KPX Aacute Oacute -18 +KPX Aacute Ocircumflex -18 +KPX Aacute Ograve -18 +KPX Aacute Yacute -78 +KPX Aacute yacute -68 +KPX Aacute Gbreve -18 +KPX Aacute Cacute -18 +KPX Aacute cacute -18 +KPX Aacute Ccaron -18 +KPX Aacute ccaron -18 +KPX Oacute hyphen 28 +KPX Oacute period -41 +KPX Oacute colon -18 +KPX Oacute A -18 +KPX Oacute V -18 +KPX Oacute X -64 +KPX Oacute Y -55 +KPX Oacute Adieresis -18 +KPX Oacute guillemotleft -18 +KPX Oacute Agrave -18 +KPX Oacute Atilde -18 +KPX Oacute quotedblleft -22 +KPX Oacute quotedblright -18 +KPX Oacute Ydieresis -55 +KPX Oacute quotedblbase -92 +KPX Oacute Acircumflex -18 +KPX Oacute Aacute -18 +KPX Oacute Yacute -55 +KPX Ocircumflex hyphen 28 +KPX Ocircumflex period -41 +KPX Ocircumflex colon -18 +KPX Ocircumflex A -18 +KPX Ocircumflex V -18 +KPX Ocircumflex X -64 +KPX Ocircumflex Y -55 +KPX Ocircumflex Adieresis -18 +KPX Ocircumflex guillemotleft -18 +KPX Ocircumflex Agrave -18 +KPX Ocircumflex Atilde -18 +KPX Ocircumflex quotedblleft -22 +KPX Ocircumflex quotedblright -18 +KPX Ocircumflex Ydieresis -55 +KPX Ocircumflex quotedblbase -92 +KPX Ocircumflex Acircumflex -18 +KPX Ocircumflex Aacute -18 +KPX Ocircumflex Yacute -55 +KPX Ograve hyphen 28 +KPX Ograve period -41 +KPX Ograve colon -18 +KPX Ograve A -18 +KPX Ograve V -18 +KPX Ograve X -64 +KPX Ograve Y -55 +KPX Ograve Adieresis -18 +KPX Ograve guillemotleft -18 +KPX Ograve Agrave -18 +KPX Ograve Atilde -18 +KPX Ograve quotedblleft -22 +KPX Ograve quotedblright -18 +KPX Ograve Ydieresis -55 +KPX Ograve quotedblbase -92 +KPX Ograve Acircumflex -18 +KPX Ograve Aacute -18 +KPX Ograve Yacute -55 +KPX Uacute Z -18 +KPX Uacute Zcaron -18 +KPX Ucircumflex Z -18 +KPX Ucircumflex Zcaron -18 +KPX Ugrave Z -18 +KPX Ugrave Zcaron -18 +KPX Scaron A 19 +KPX Scaron Adieresis 19 +KPX Scaron Agrave 19 +KPX Scaron Atilde 19 +KPX Scaron Acircumflex 19 +KPX Scaron Aacute 19 +KPX Zcaron hyphen -18 +KPX Zcaron quotedblleft -18 +KPX Zcaron quotedblright -18 +KPX Zcaron quotedblbase -18 +KPX eth quotedblleft -45 +KPX eth quotedblright -55 +KPX eth quotedblbase -36 +KPX Yacute hyphen -119 +KPX Yacute period -203 +KPX Yacute colon -133 +KPX Yacute A -78 +KPX Yacute C -55 +KPX Yacute O -55 +KPX Yacute a -138 +KPX Yacute e -133 +KPX Yacute i -36 +KPX Yacute o -133 +KPX Yacute u -115 +KPX Yacute Adieresis -78 +KPX Yacute Ccedilla -55 +KPX Yacute Odieresis -55 +KPX Yacute aacute -138 +KPX Yacute agrave -138 +KPX Yacute acircumflex -138 +KPX Yacute adieresis -138 +KPX Yacute atilde -138 +KPX Yacute aring -138 +KPX Yacute eacute -133 +KPX Yacute egrave -133 +KPX Yacute ecircumflex -133 +KPX Yacute edieresis -133 +KPX Yacute oacute -133 +KPX Yacute ograve -133 +KPX Yacute ocircumflex -133 +KPX Yacute odieresis -133 +KPX Yacute otilde -133 +KPX Yacute uacute -115 +KPX Yacute ugrave -115 +KPX Yacute ucircumflex -115 +KPX Yacute udieresis -115 +KPX Yacute guillemotleft -110 +KPX Yacute guillemotright -73 +KPX Yacute Agrave -78 +KPX Yacute Atilde -78 +KPX Yacute Otilde -55 +KPX Yacute quotedblleft -55 +KPX Yacute quotedblright -18 +KPX Yacute quotedblbase -129 +KPX Yacute Acircumflex -78 +KPX Yacute Aacute -78 +KPX Yacute Oacute -55 +KPX Yacute Ocircumflex -55 +KPX Yacute Ograve -55 +KPX Yacute Cacute -55 +KPX Yacute Ccaron -55 +KPX yacute hyphen -18 +KPX yacute period -143 +KPX yacute colon -73 +KPX yacute guillemotleft -18 +KPX yacute guillemotright -18 +KPX yacute quotedblbase -147 +KPX Thorn period -73 +KPX Thorn colon -36 +KPX Thorn quotedblleft -18 +KPX Thorn quotedblbase -92 +KPX Gbreve T -36 +KPX Gbreve Y -50 +KPX Gbreve guillemotleft -18 +KPX Gbreve guillemotright -18 +KPX Gbreve quotedblleft -22 +KPX Gbreve quotedblright -22 +KPX Gbreve Ydieresis -50 +KPX Gbreve quotedblbase -27 +KPX Gbreve Yacute -50 +KPX Scedilla A 19 +KPX Scedilla Adieresis 19 +KPX Scedilla Agrave 19 +KPX Scedilla Atilde 19 +KPX Scedilla Acircumflex 19 +KPX Scedilla Aacute 19 +KPX Cacute Y -18 +KPX Cacute guillemotleft -18 +KPX Cacute guillemotright -18 +KPX Cacute quotedblright 19 +KPX Cacute Ydieresis -18 +KPX Cacute Yacute -18 +KPX Ccaron Y -18 +KPX Ccaron guillemotleft -18 +KPX Ccaron guillemotright -18 +KPX Ccaron quotedblright 19 +KPX Ccaron Ydieresis -18 +KPX Ccaron Yacute -18 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/reporting/fonts/Vera.ttf b/reporting/fonts/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* 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 V$RO_j8GOa84Hp#E^K=>b{vYQ=l(GN- literal 0 HcmV?d00001 diff --git a/reporting/includes/class.graphic.inc b/reporting/includes/class.graphic.inc new file mode 100644 index 00000000..19572288 --- /dev/null +++ b/reporting/includes/class.graphic.inc @@ -0,0 +1,965 @@ +title = "Sex"; +$pg->type = "5"; +$pg->x[0] = "male"; +$pg->y[0] = "50"; +$pg->x[1] = "female"; +$pg->y[1] = "55"; +$pg->display(); +?> + +In your html file you set it up as: +..... + +..... + +You can supply extra parameters to display(). Ex. $pg->display("test.png") will save the image to a file. +Ex. $pg->display("", true) will paint a border around the image. It might be suitable if you choose to save to +file for later presentation. + +///// END OF EXAMPLE.PHP ///// + + + + Here is a list of all parameters you may set: + + title => Title of the graphic + axis_x => Name of values from Axis X + axis_y => Name of values from Axis Y + graphic_1 => Name of Graphic_1 (only shown if you are gonna cross data from 2 different graphics) + graphic_2 => Name of Graphic_2 (same comment of above) + + type => Type of graphic (values 1 to 6) + 1 => Vertical bars (default) + 2 => Horizontal bars + 3 => Dots + 4 => Lines + 5 => Pie + 6 => Donut + + skin => Skin of the graphic (values 1 to 3) + 1 => Office (default) + 2 => Matrix + 3 => Spring + + credits => Only if you want to show my credits in the image. :) + 0 => doesn't show (default) + 1 => shows + + x[0] => Name of the first parameter in Axis X + x[1] => Name of the second parameter in Axis X + ... (etc) + + y[0] => Value from "graphic_1" relative for "x[0]" + y[1] => Value from "graphic_1" relative for "x[1]" + ... (etc) + + z[0] => Value from "graphic_2" relative for "x[0]" + z[1] => Value from "graphic_2" relative for "x[1]" + ... (etc) + + + NOTE: You can't cross data between graphics if you use "pie" or "donut" graphic. Values for "z" + won't be considerated. + + That's all! Hope you make a good use of it! + It would be nice to receive feedback from others users. All comments are welcome! + + Regards, + + Carlos Reche + +*/ + +class graph +{ + + var $x; + var $y; + var $z; + + var $title; + var $axis_x; + var $axis_y; + var $graphic_1; + var $graphic_2; + var $type = 1; + var $skin = 1; + var $credits = 0; + var $latin_notation; + + var $width; + var $height; + var $height_title; + var $alternate_x; + + var $size = 2; + var $tsize = 5; + + var $total_parameters; + var $sum_total; + var $biggest_value; + var $biggest_parameter; + var $available_types; + var $dec1 = 0; + var $dec2 = 0; + var $h3d = 15; // 3D height + var $built_in = true; + var $fontfile = ""; + + function graph() + { + $this->x = $this->y = $this->z = array(); + + $this->biggest_x = NULL; + $this->biggest_y = NULL; + $this->alternate_x = false; + $this->graphic_2_exists = false; + $this->total_parameters = 0; + $this->sum_total = 1; + $this->latin_notation = false; + } + + + function display($save="", $border=false) + { + $this->legend_exists = (ereg("(5|6)", $this->type)) ? true : false; + $this->biggest_graphic_name = (strlen($this->graphic_1) > strlen($this->graphic_2)) ? $this->graphic_1 : $this->graphic_2; + $this->height_title = (!empty($this->title)) ? ($this->string_height($this->tsize) + 15) : 0; + $this->space_between_bars = ($this->type == 1) ? 40 : 30; + $this->space_between_dots = 40; + $this->higher_value = 0; + $this->higher_value_str = 0; + + $this->width = 0; + $this->height = 0; + $this->graphic_area_width = 0; + $this->graphic_area_height = 0; + $this->graphic_area_x1 = 30; + $this->graphic_area_y1 = 20 + $this->height_title; + $this->graphic_area_x2 = $this->graphic_area_x1 + $this->graphic_area_width; + $this->graphic_area_y2 = $this->graphic_area_y1 + $this->graphic_area_height; + + if (count($this->z) && (ereg("(1|2|3|4)", $this->type))) + $this->graphic_2_exists = true; + $this->total_parameters = count($this->x); + for ($i = 0; $i < $this->total_parameters; $i++) + { + if (strlen($this->x[$i]) > strlen($this->biggest_x)) + $this->biggest_x = $this->x[$i]; + if ($this->y[$i] > $this->biggest_y) + $this->biggest_y = number_format(round($this->y[$i], 1), 1, ".", ""); + if ($this->graphic_2_exists) + { + if (isset($this->z[$i]) && $this->z[$i] > $this->biggest_y) + $this->biggest_y = number_format(round($this->z[$i], 1), 1, ".", ""); + } + } + + if (($this->graphic_2_exists == true) && ((!empty($this->graphic_1)) || (!empty($this->graphic_2)))) + { + $this->legend_exists = true; + } + + $this->sum_total = array_sum($this->y); + $this->space_between_bars += ($this->graphic_2_exists == true) ? 10 : 0; + + $this->calculate_higher_value(); + $this->calculate_width(); + $this->calculate_height(); + + $this->create_graphic($save, $border); + } + + function create_graphic($save="", $border=false) + { + $size = 3; + $this->img = imagecreatetruecolor($this->width, $this->height); + + $this->load_color_palette(); + + // Fill background + imagefill($this->img, 0, 0, $this->color['background']); + //imagefilledrectangle($this->img, 0, 0, $this->width, $this->height, $this->color['background']); + if ($border) + imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $this->color['bars']); + + // Draw title + if (!empty($this->title)) + { + $center = ($this->width / 2) - ($this->string_width($this->title, $this->tsize) / 2); + $this->_imagestring($this->img, $this->tsize, $center, 10, $this->title, $this->color['title']); + } + + + // Draw axis and background lines for "vertical bars", "dots" and "lines" + if (ereg("^(1|3|4)$", $this->type)) + { + if ($this->legend_exists == true) + { + $this->draw_legend(); + } + + $higher_value_y = $this->graphic_area_y1 + (0.1 * $this->graphic_area_height); + $higher_value_size = 0.9 * $this->graphic_area_height; + + $less = 7 * strlen($this->higher_value_str); + + imageline($this->img, $this->graphic_area_x1, $higher_value_y, $this->graphic_area_x2, $higher_value_y, $this->color['bg_lines']); + $this->_imagestring($this->img, $this->size, ($this->graphic_area_x1-$less-7), ($higher_value_y-7), $this->higher_value_str, $this->color['axis_values']); + + for ($i = 1; $i < 10; $i++) + { + $dec_y = $i * ($higher_value_size / 10); + $x1 = $this->graphic_area_x1; + $y1 = $this->graphic_area_y2 - $dec_y; + $x2 = $this->graphic_area_x2; + $y2 = $this->graphic_area_y2 - $dec_y; + + imageline($this->img, $x1, $y1, $x2, $y2, $this->color['bg_lines']); + if ($i % 2 == 0) + { + $value = $this->number_formated($this->higher_value * $i / 10, $this->dec1); + $less = 7 * strlen($value); + $this->_imagestring($this->img, $this->size, ($x1-$less-7), ($y2-7), $value, $this->color['axis_values']); + } + } + + // Axis X + $this->_imagestring($this->img, $this->size, $this->graphic_area_x2+10, $this->graphic_area_y2+3, $this->axis_x, $this->color['title']); + imageline($this->img, $this->graphic_area_x1, $this->graphic_area_y2, $this->graphic_area_x2, $this->graphic_area_y2, $this->color['axis_line']); + // Axis Y + $this->_imagestring($this->img, $this->size, 20, $this->graphic_area_y1-20, $this->axis_y, $this->color['title']); + imageline($this->img, $this->graphic_area_x1, $this->graphic_area_y1, $this->graphic_area_x1, $this->graphic_area_y2, $this->color['axis_line']); + } + + + // Draw axis and background lines for "horizontal bars" + else if ($this->type == 2) + { + if ($this->legend_exists == true) + { + $this->draw_legend(); + } + + $higher_value_x = $this->graphic_area_x2 - (0.2 * $this->graphic_area_width); + $higher_value_size = 0.8 * $this->graphic_area_width; + + imageline($this->img, ($this->graphic_area_x1+$higher_value_size), $this->graphic_area_y1, ($this->graphic_area_x1+$higher_value_size), $this->graphic_area_y2, $this->color['bg_lines']); + $this->_imagestring($this->img, $this->size, (($this->graphic_area_x1+$higher_value_size) - ($this->string_width($this->higher_value, $this->size)/2)), ($this->graphic_area_y2+2), $this->higher_value_str, $this->color['axis_values']); + + for ($i = 1, $alt = 15; $i < 10; $i++) + { + $dec_x = number_format(round($i * ($higher_value_size / 10), 1), 1, ".", ""); + + imageline($this->img, ($this->graphic_area_x1+$dec_x), $this->graphic_area_y1, ($this->graphic_area_x1+$dec_x), $this->graphic_area_y2, $this->color['bg_lines']); + if ($i % 2 == 0) + { + $alt = (strlen($this->biggest_y) > 4 && $alt != 15) ? 15 : 2; + $value = $this->number_formated($this->higher_value * $i / 10, $this->dec1); + $this->_imagestring($this->img, $this->size, (($this->graphic_area_x1+$dec_x) - ($this->string_width($this->higher_value, $this->size)/2)), ($this->graphic_area_y2), $value, $this->color['axis_values'], $alt); + } + } + + // Axis X + $this->_imagestring($this->img, $this->size, ($this->graphic_area_x2+10), ($this->graphic_area_y2+3), $this->axis_y, $this->color['title']); + imageline($this->img, $this->graphic_area_x1, $this->graphic_area_y2, $this->graphic_area_x2, $this->graphic_area_y2, $this->color['axis_line']); + // Axis Y + $this->_imagestring($this->img, $this->size, 20, ($this->graphic_area_y1-20), $this->axis_x, $this->color['title']); + imageline($this->img, $this->graphic_area_x1, $this->graphic_area_y1, $this->graphic_area_x1, $this->graphic_area_y2, $this->color['axis_line']); + } + + + // Draw legend box for "pie" or "donut" + else if (ereg("^(5|6)$", $this->type)) + { + $this->draw_legend(); + } + + + + /** + * Draw graphic: VERTICAL BARS + */ + if ($this->type == 1) + { + $num = 1; + $x = $this->graphic_area_x1 + 20; + + foreach ($this->x as $i => $parameter) + { + if (isset($this->z[$i])) + { + $size = round($this->z[$i] * $higher_value_size / $this->higher_value); + $x1 = $x + 10; + $y1 = ($this->graphic_area_y2 - $size) + 1; + $x2 = $x1 + 20; + $y2 = $this->graphic_area_y2 - 1; + imageline($this->img, ($x1+1), ($y1-1), $x2, ($y1-1), $this->color['bars_2_shadow']); + imageline($this->img, ($x2+1), ($y1-1), ($x2+1), $y2, $this->color['bars_2_shadow']); + imageline($this->img, ($x2+2), ($y1-1), ($x2+2), $y2, $this->color['bars_2_shadow']); + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $this->color['bars_2']); + } + + $size = round($this->y[$i] * $higher_value_size / $this->higher_value); + $alt = (($num % 2 == 0) && (strlen($this->biggest_x) > 5)) ? 15 : 2; + $x1 = $x; + $y1 = ($this->graphic_area_y2 - $size) + 1; + $x2 = $x1 + 20; + $y2 = $this->graphic_area_y2 - 1; + $x += $this->space_between_bars; + $num++; + + imageline($this->img, ($x1+1), ($y1-1), $x2, ($y1-1), $this->color['bars_shadow']); + imageline($this->img, ($x2+1), ($y1-1), ($x2+1), $y2, $this->color['bars_shadow']); + imageline($this->img, ($x2+2), ($y1-1), ($x2+2), $y2, $this->color['bars_shadow']); + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $this->color['bars']); + $this->_imagestring($this->img, $this->size, ((($x1+$x2)/2) - (strlen($parameter)*7/2)), ($y2+2), $parameter, $this->color['axis_values'], $alt); + } + } + + + /** + * Draw graphic: HORIZONTAL BARS + */ + else if ($this->type == 2) + { + $y = 10; + + foreach ($this->x as $i => $parameter) + { + if (isset($this->z[$i])) + { + $size = round($this->z[$i] * $higher_value_size / $this->higher_value); + $x1 = $this->graphic_area_x1 + 1; + $y1 = $this->graphic_area_y1 + $y + 10; + $x2 = $x1 + $size; + $y2 = $y1 + 15; + imageline($this->img, ($x1), ($y2+1), $x2, ($y2+1), $this->color['bars_2_shadow']); + imageline($this->img, ($x1), ($y2+2), $x2, ($y2+2), $this->color['bars_2_shadow']); + imageline($this->img, ($x2+1), ($y1+1), ($x2+1), ($y2+2), $this->color['bars_2_shadow']); + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $this->color['bars_2']); + $this->_imagestring($this->img, $this->size, ($x2+7), ($y1+7), $this->number_formated($this->z[$i], $this->dec2), $this->color['bars_2_shadow']); + } + + $size = round(($this->y[$i] / $this->higher_value) * $higher_value_size); + $x1 = $this->graphic_area_x1 + 1; + $y1 = $this->graphic_area_y1 + $y; + $x2 = $x1 + $size; + $y2 = $y1 + 15; + $y += $this->space_between_bars; + + imageline($this->img, ($x1), ($y2+1), $x2, ($y2+1), $this->color['bars_shadow']); + imageline($this->img, ($x1), ($y2+2), $x2, ($y2+2), $this->color['bars_shadow']); + imageline($this->img, ($x2+1), ($y1+1), ($x2+1), ($y2+2), $this->color['bars_shadow']); + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $this->color['bars']); + $this->_imagestring($this->img, $this->size, ($x2+7), ($y1+2), $this->number_formated($this->y[$i], $this->dec2), $this->color['bars_shadow']); + + $this->_imagestring($this->img, $this->size, ($x1 - ((strlen($parameter)*7)+7)), ($y1+2), $parameter, $this->color['axis_values']); + } + } + + + /** + * Draw graphic: DOTS or LINE + */ + else if (ereg("^(3|4)$", $this->type)) + { + + $x[0] = $this->graphic_area_x1+1; + + foreach ($this->x as $i => $parameter) + { + if ($this->graphic_2_exists == true) + { + $size = round($this->z[$i] * $higher_value_size / $this->higher_value); + $z[$i] = $this->graphic_area_y2 - $size; + } + + $alt = (($i % 2 == 0) && (strlen($this->biggest_x) > 5)) ? 15 : 2; + $size = round($this->y[$i] * $higher_value_size / $this->higher_value); + $y[$i] = $this->graphic_area_y2 - $size; + + if ($i != 0) + { + imageline($this->img, $x[$i], ($this->graphic_area_y1+10), $x[$i], ($this->graphic_area_y2-1), $this->color['bg_lines']); + } + $this->_imagestring($this->img, $this->size, ($x[$i] - (strlen($parameter)*7/2 )), ($this->graphic_area_y2+2), $parameter, $this->color['axis_values'], $alt); + + $x[$i+1] = $x[$i] + 40; + } + + foreach ($x as $i => $value_x) + { + if ($this->graphic_2_exists == true) + { + if (isset($z[$i+1])) + { + // Draw lines + if ($this->type == 4) + { + imageline($this->img, $x[$i], $z[$i], $x[$i+1], $z[$i+1], $this->color['line_2']); + imageline($this->img, $x[$i], ($z[$i]+1), $x[$i+1], ($z[$i+1]+1), $this->color['line_2']); + } + imagefilledrectangle($this->img, $x[$i]-1, $z[$i]-1, $x[$i]+2, $z[$i]+2, $this->color['line_2']); + } + else + { // Draw last dot + imagefilledrectangle($this->img, $x[$i-1]-1, $z[$i-1]-1, $x[$i-1]+2, $z[$i-1]+2, $this->color['line_2']); + } + } + + if (count($y) > 1) + { + if (isset($y[$i+1])) + { + // Draw lines + if ($this->type == 4) + { + imageline($this->img, $x[$i], $y[$i], $x[$i+1], $y[$i+1], $this->color['line']); + imageline($this->img, $x[$i], ($y[$i]+1), $x[$i+1], ($y[$i+1]+1), $this->color['line']); + } + imagefilledrectangle($this->img, $x[$i]-1, $y[$i]-1, $x[$i]+2, $y[$i]+2, $this->color['line']); + } + else + { // Draw last dot + imagefilledrectangle($this->img, $x[$i-1]-1, $y[$i-1]-1, $x[$i-1]+2, $y[$i-1]+2, $this->color['line']); + } + } + + } + } + + + /** + * Draw graphic: PIE or DONUT + */ + else if (ereg("^(5|6)$", $this->type)) + { + $center_x = ($this->graphic_area_x1 + $this->graphic_area_x2) / 2; + $center_y = ($this->graphic_area_y1 + $this->graphic_area_y2) / 2; + $width = $this->graphic_area_width; + $height = $this->graphic_area_height; + $start = 0; + $sizes = array(); + + foreach ($this->x as $i => $parameter) + { + $size = $this->y[$i] * 360 / $this->sum_total; + $sizes[] = $size; + $start += $size; + } + $start = 270; + + // Draw PIE + if ($this->type == 5) + { + // Draw shadow + foreach ($sizes as $i => $size) + { + $num_color = $i + 1; + while ($num_color > 7) + { + $num_color -= 5; + } + $color = 'arc_' . $num_color . '_shadow'; + + for ($i = $this->h3d; $i >= 0; $i--) + { + //imagearc($this->img, $center_x, ($center_y+$i), $width, $height, $start, ($start+$size), $this->color[$color]); + imagefilledarc($this->img, $center_x, ($center_y+$i), $width, $height, $start, ($start+$size), $this->color[$color], IMG_ARC_NOFILL); + } + $start += $size; + } + + $start = 270; + + // Draw pieces + foreach ($sizes as $i => $size) + { + $num_color = $i + 1; + while ($num_color > 7) + { + $num_color -= 5; + } + $color = 'arc_' . $num_color; + + imagefilledarc($this->img, $center_x, $center_y, ($width+2), ($height+2), $start, ($start+$size), $this->color[$color], IMG_ARC_EDGED); + $start += $size; + } + } + + // Draw DONUT + else if ($this->type == 6) + { + foreach ($sizes as $i => $size) + { + $num_color = $i + 1; + while ($num_color > 7) + { + $num_color -= 5; + } + $color = 'arc_' . $num_color; + $color_shadow = 'arc_' . $num_color . '_shadow'; + imagefilledarc($this->img, $center_x, $center_y, $width, $height, $start, ($start+$size), $this->color[$color], IMG_ARC_PIE); + $start += $size; + } + imagefilledarc($this->img, $center_x, $center_y, 100, 100, 0, 360, $this->color['background'], IMG_ARC_PIE); + imagearc($this->img, $center_x, $center_y, 100, 100, 0, 360, $this->color['bg_legend']); + imagearc($this->img, $center_x, $center_y, ($width+1), ($height+1), 0, 360, $this->color['bg_legend']); + } + } + + + if ($this->credits == true) + { + $this->draw_credits(); + } + if ($save != "") + imagepng($this->img, $save); + else + { + header('Content-type: image/png'); + imagepng($this->img); + } + imagedestroy($this->img); + } + + function calculate_width() + { + switch ($this->type) + { + // Vertical bars + case 1: + $this->legend_box_width = ($this->legend_exists == true) ? ($this->string_width($this->biggest_graphic_name, $this->tsize) + 25) : 0; + $this->graphic_area_width = ($this->space_between_bars * $this->total_parameters) + 30; + $this->graphic_area_x1 += $this->string_width(($this->higher_value_str), $this->size); + $this->width += $this->graphic_area_x1 + 20; + $this->width += ($this->legend_exists == true) ? 50 : ((7 * strlen($this->axis_x)) + 10); + break; + + // Horizontal bars + case 2: + $this->legend_box_width = ($this->legend_exists == true) ? ($this->string_width($this->biggest_graphic_name, $this->size) + 25) : 0; + $this->graphic_area_width = ($this->string_width($this->higher_value_str, $this->size) > 50) ? (5 * ($this->string_width($this->higher_value_str, $this->size)) * 0.85) : 200; + $this->graphic_area_x1 += 7 * strlen($this->biggest_x); + $this->width += ($this->legend_exists == true) ? 60 : ((7 * strlen($this->axis_y)) + 30); + $this->width += $this->graphic_area_x1; + break; + + // Dots + case 3: + $this->legend_box_width = ($this->legend_exists == true) ? ($this->string_width($this->biggest_graphic_name, $this->size) + 25) : 0; + $this->graphic_area_width = ($this->space_between_dots * $this->total_parameters) - 10; + $this->graphic_area_x1 += $this->string_width(($this->higher_value_str), $this->size); + $this->width += $this->graphic_area_x1 + 20; + $this->width += ($this->legend_exists == true) ? 40 : ((7 * strlen($this->axis_x)) + 10); + break; + + // Lines + case 4: + $this->legend_box_width = ($this->legend_exists == true) ? ($this->string_width($this->biggest_graphic_name, $this->size) + 25) : 0; + $this->graphic_area_width = ($this->space_between_dots * $this->total_parameters) - 10; + $this->graphic_area_x1 += $this->string_width(($this->higher_value_str), $this->size); + $this->width += $this->graphic_area_x1 + 20; + $this->width += ($this->legend_exists == true) ? 40 : ((7 * strlen($this->axis_x)) + 10); + break; + + // Pie + case 5: + $this->legend_box_width = $this->string_width($this->biggest_x, $this->size) + 85; + $this->graphic_area_width = 200; + $this->width += 90; + break; + + // Donut + case 6: + $this->legend_box_width = $this->string_width($this->biggest_x, $this->size) + 85; + $this->graphic_area_width = 180; + $this->width += 90; + break; + } + + $this->width += $this->graphic_area_width; + $this->width += $this->legend_box_width; + + + $this->graphic_area_x2 = $this->graphic_area_x1 + $this->graphic_area_width; + $this->legend_box_x1 = $this->graphic_area_x2 + 40; + $this->legend_box_x2 = $this->legend_box_x1 + $this->legend_box_width; + } + + function calculate_height() + { + switch ($this->type) + { + // Vertical bars + case 1: + $this->legend_box_height = ($this->graphic_2_exists == true) ? 40 : 0; + $this->graphic_area_height = 150; + $this->height += 65; + break; + + // Horizontal bars + case 2: + $this->legend_box_height = ($this->graphic_2_exists == true) ? 40 : 0; + $this->graphic_area_height = ($this->space_between_bars * $this->total_parameters) + 10; + $this->height += 65; + break; + + // Dots + case 3: + $this->legend_box_height = ($this->graphic_2_exists == true) ? 40 : 0; + $this->graphic_area_height = 150; + $this->height += 65; + break; + + // Lines + case 4: + $this->legend_box_height = ($this->graphic_2_exists == true) ? 40 : 0; + $this->graphic_area_height = 150; + $this->height += 65; + break; + + // Pie + case 5: + $this->legend_box_height = (!empty($this->axis_x)) ? 30 : 5; + $this->legend_box_height += (14 * $this->total_parameters); + $this->graphic_area_height = 150; + $this->height += 50; + break; + + // Donut + case 6: + $this->legend_box_height = (!empty($this->axis_x)) ? 30 : 5; + $this->legend_box_height += (14 * $this->total_parameters); + $this->graphic_area_height = 180; + $this->height += 50; + break; + } + + $this->height += $this->height_title; + $this->height += ($this->legend_box_height > $this->graphic_area_height) ? ($this->legend_box_height - $this->graphic_area_height) : 0; + $this->height += $this->graphic_area_height; + + $this->graphic_area_y2 = $this->graphic_area_y1 + $this->graphic_area_height; + $this->legend_box_y1 = $this->graphic_area_y1 + 10; + $this->legend_box_y2 = $this->legend_box_y1 + $this->legend_box_height; + } + + function draw_legend() + { + $x1 = $this->legend_box_x1; + $y1 = $this->legend_box_y1; + $x2 = $this->legend_box_x2; + $y2 = $this->legend_box_y2; + + imagefilledrectangle($this->img, $x1, $y1, $x2, $y2, $this->color['bg_legend']); + + $x = $x1 + 5; + $y = $y1 + 5; + + + // Draw legend values for VERTICAL BARS, HORIZONTAL BARS, DOTS and LINES + if (ereg("^(1|2|3|4)$", $this->type)) + { + $color_1 = (ereg("^(1|2)$", $this->type)) ? $this->color['bars'] : $this->color['line']; + $color_2 = (ereg("^(1|2)$", $this->type)) ? $this->color['bars_2'] : $this->color['line_2']; + + imagefilledrectangle($this->img, $x, $y, ($x+10), ($y+10), $color_1); + imagerectangle($this->img, $x, $y, ($x+10), ($y+10), $this->color['title']); + $this->_imagestring($this->img, $this->size, ($x+15), ($y-2), $this->graphic_1, $this->color['axis_values']); + $y += 20; + imagefilledrectangle($this->img, $x, $y, ($x+10), ($y+10), $color_2); + imagerectangle($this->img, $x, $y, ($x+10), ($y+10), $this->color['title']); + $this->_imagestring($this->img, $this->size, ($x+15), ($y-2), $this->graphic_2, $this->color['axis_values']); + } + + // Draw legend values for PIE or DONUT + else if (ereg("^(5|6)$", $this->type)) + { + if (!empty($this->axis_x)) + { + $this->_imagestring($this->img, $this->size, ((($x1+$x2)/2) - (strlen($this->axis_x)*7/2)), $y, $this->axis_x, $this->color['title']); + $y += 25; + } + + $num = 1; + + foreach ($this->x as $i => $parameter) + { + while ($num > 7) + { + $num -= 5; + } + $color = 'arc_' . $num; + + $percent = number_format(round(($this->y[$i] * 100 / $this->sum_total), 2), 2, ".", "") . ' %'; + $less = (strlen($percent) * 7); + + if ($num != 1) + { + imageline($this->img, ($x1+15), ($y-2), ($x2-5), ($y-2), $this->color['bg_lines']); + } + imagefilledrectangle($this->img, $x, $y, ($x+10), ($y+10), $this->color[$color]); + imagerectangle($this->img, $x, $y, ($x+10), ($y+10), $this->color['title']); + $this->_imagestring($this->img, $this->size, ($x+15), ($y-2), $parameter, $this->color['axis_values']); + $this->_imagestring($this->img, $this->size, ($x2-$less), ($y-2), $percent, $this->color['axis_values']); + $y += 14; + $num++; + } + } + } + + + function string_width($string, $size) + { + $single_width = $size + 4; + return $single_width * strlen($string); + } + + function string_height($size) + { + if ($size <= 1) + { + $height = 8; + } + else if ($size <= 3) + { + $height = 12; + } + else if ($size >= 4) + { + $height = 14; + } + return $height; + } + + function calculate_higher_value() + { + $digits = strlen(round($this->biggest_y)); + $interval = pow(10, ($digits-1)); + $this->higher_value = round(($this->biggest_y - ($this->biggest_y % $interval) + $interval), 1); + $this->higher_value_str = $this->number_formated($this->higher_value, $this->dec1); + } + + function number_formated($number, $dec_size = 1) + { + if ($this->latin_notation == true) + return number_format(round($number, $dec_size), $dec_size, ",", "."); + return number_format(round($number, $dec_size), $dec_size, ".", ","); + } + + function number_float($number) + { + if ($this->latin_notation == true) + $number = str_replace(".", "", $number); + return (float)str_replace(",", "", $number); + } + + + function draw_credits() + { + $this->_imagestring($this->img, $this->size - 2, ($this->width-120), ($this->height-10), "Powered by Carlos Reche", $this->color['title']); + } + + + function load_color_palette() + { + switch ($this->skin) + { + // Office + case 1: + $this->color['title'] = imagecolorallocate($this->img, 50, 50, 50); + $this->color['background'] = imagecolorallocate($this->img, 238, 255, 238); + $this->color['axis_values'] = imagecolorallocate($this->img, 50, 50, 50); + $this->color['axis_line'] = imagecolorallocate($this->img, 100, 100, 100); + $this->color['bg_lines'] = imagecolorallocate($this->img, 220, 220, 220); + $this->color['bg_legend'] = imagecolorallocate($this->img, 255, 255, 255); + + if (ereg("^(1|2)$", $this->type)) + { + $this->color['bars'] = imagecolorallocate($this->img, 100, 150, 200); + $this->color['bars_shadow'] = imagecolorallocate($this->img, 50, 100, 150); + $this->color['bars_2'] = imagecolorallocate($this->img, 200, 250, 150); + $this->color['bars_2_shadow'] = imagecolorallocate($this->img, 120, 170, 70); + } + else if (ereg("^(3|4)$", $this->type)) + { + $this->color['line'] = imagecolorallocate($this->img, 100, 150, 200); + $this->color['line_2'] = imagecolorallocate($this->img, 230, 100, 100); + } + else if (ereg("^(5|6)$", $this->type)) + { + $this->color['arc_1'] = imagecolorallocate($this->img, 255, 150, 0); + $this->color['arc_2'] = imagecolorallocate($this->img, 150, 0, 255); + $this->color['arc_3'] = imagecolorallocate($this->img, 0, 255, 255); + $this->color['arc_4'] = imagecolorallocate($this->img, 255, 0, 0); + $this->color['arc_5'] = imagecolorallocate($this->img, 0, 255, 0); + $this->color['arc_6'] = imagecolorallocate($this->img, 0, 0, 255); + $this->color['arc_7'] = imagecolorallocate($this->img, 255, 255, 0); + $this->color['arc_1_shadow'] = imagecolorallocate($this->img, 127, 75, 0); + $this->color['arc_2_shadow'] = imagecolorallocate($this->img, 75, 0, 127); + $this->color['arc_3_shadow'] = imagecolorallocate($this->img, 0, 127, 127); + $this->color['arc_4_shadow'] = imagecolorallocate($this->img, 127, 0, 0); + $this->color['arc_5_shadow'] = imagecolorallocate($this->img, 0, 127, 0); + $this->color['arc_6_shadow'] = imagecolorallocate($this->img, 0, 0, 127); + $this->color['arc_7_shadow'] = imagecolorallocate($this->img, 127, 127, 0); + } + break; + + // Matrix + case 2: + $this->color['title'] = imagecolorallocate($this->img, 255, 255, 255); + $this->color['background'] = imagecolorallocate($this->img, 0, 0, 0); + $this->color['axis_values'] = imagecolorallocate($this->img, 0, 230, 0); + $this->color['axis_line'] = imagecolorallocate($this->img, 0, 200, 0); + $this->color['bg_lines'] = imagecolorallocate($this->img, 100, 100, 100); + $this->color['bg_legend'] = imagecolorallocate($this->img, 70, 70, 70); + + if (ereg("^(1|2)$", $this->type)) + { + $this->color['bars'] = imagecolorallocate($this->img, 50, 200, 50); + $this->color['bars_shadow'] = imagecolorallocate($this->img, 0, 150, 0); + $this->color['bars_2'] = imagecolorallocate($this->img, 255, 255, 255); + $this->color['bars_2_shadow'] = imagecolorallocate($this->img, 220, 220, 220); + } + else if (ereg("^(3|4)$", $this->type)) + { + $this->color['line'] = imagecolorallocate($this->img, 220, 220, 220); + $this->color['line_2'] = imagecolorallocate($this->img, 0, 180, 0); + } + else if (ereg("^(5|6)$", $this->type)) + { + $this->color['arc_1'] = imagecolorallocate($this->img, 255, 255, 255); + $this->color['arc_2'] = imagecolorallocate($this->img, 200, 220, 200); + $this->color['arc_3'] = imagecolorallocate($this->img, 160, 200, 160); + $this->color['arc_4'] = imagecolorallocate($this->img, 135, 180, 135); + $this->color['arc_5'] = imagecolorallocate($this->img, 115, 160, 115); + $this->color['arc_6'] = imagecolorallocate($this->img, 100, 140, 100); + $this->color['arc_7'] = imagecolorallocate($this->img, 90, 120, 90); + $this->color['arc_1_shadow'] = imagecolorallocate($this->img, 127, 127, 127); + $this->color['arc_2_shadow'] = imagecolorallocate($this->img, 100, 110, 100); + $this->color['arc_3_shadow'] = imagecolorallocate($this->img, 80, 100, 80); + $this->color['arc_4_shadow'] = imagecolorallocate($this->img, 67, 90, 67); + $this->color['arc_5_shadow'] = imagecolorallocate($this->img, 57, 80, 57); + $this->color['arc_6_shadow'] = imagecolorallocate($this->img, 50, 70, 50); + $this->color['arc_7_shadow'] = imagecolorallocate($this->img, 45, 60, 45); + } + break; + + + // Spring + case 3: + $this->color['title'] = imagecolorallocate($this->img, 250, 50, 50); + $this->color['background'] = imagecolorallocate($this->img, 250, 250, 220); + $this->color['axis_values'] = imagecolorallocate($this->img, 50, 150, 50); + $this->color['axis_line'] = imagecolorallocate($this->img, 50, 100, 50); + $this->color['bg_lines'] = imagecolorallocate($this->img, 200, 224, 180); + $this->color['bg_legend'] = imagecolorallocate($this->img, 230, 230, 200); + + if (ereg("^(1|2)$", $this->type)) + { + $this->color['bars'] = imagecolorallocate($this->img, 255, 170, 80); + $this->color['bars_shadow'] = imagecolorallocate($this->img, 200, 120, 30); + $this->color['bars_2'] = imagecolorallocate($this->img, 250, 230, 80); + $this->color['bars_2_shadow'] = imagecolorallocate($this->img, 180, 150, 0); + } + else if (ereg("^(3|4)$", $this->type)) + { + $this->color['line'] = imagecolorallocate($this->img, 230, 100, 0); + $this->color['line_2'] = imagecolorallocate($this->img, 220, 200, 50); + } + else if (ereg("^(5|6)$", $this->type)) + { + $this->color['arc_1'] = imagecolorallocate($this->img, 100, 150, 200); + $this->color['arc_2'] = imagecolorallocate($this->img, 200, 250, 150); + $this->color['arc_3'] = imagecolorallocate($this->img, 250, 200, 150); + $this->color['arc_4'] = imagecolorallocate($this->img, 250, 150, 150); + $this->color['arc_5'] = imagecolorallocate($this->img, 250, 250, 150); + $this->color['arc_6'] = imagecolorallocate($this->img, 230, 180, 250); + $this->color['arc_7'] = imagecolorallocate($this->img, 200, 200, 150); + $this->color['arc_1_shadow'] = imagecolorallocate($this->img, 50, 75, 100); + $this->color['arc_2_shadow'] = imagecolorallocate($this->img, 100, 125, 75); + $this->color['arc_3_shadow'] = imagecolorallocate($this->img, 125, 100, 75); + $this->color['arc_4_shadow'] = imagecolorallocate($this->img, 125, 75, 75); + $this->color['arc_5_shadow'] = imagecolorallocate($this->img, 125, 125, 75); + $this->color['arc_6_shadow'] = imagecolorallocate($this->img, 115, 90, 125); + $this->color['arc_7_shadow'] = imagecolorallocate($this->img, 100, 100, 75); + } + break; + + } + } + + function _imagestring($img, $size, $x, $y, $string, $col, $alt=0) + { + if ($alt && strlen($string) > 12) + $string = substr($string, 0, 12); + if ($this->built_in) + { + imagestring($img, $size, $x, $y + $alt, $string, $col); + } + else + { + if ($size == 1) + $size = 7; + else if ($size == 2) + $size = 8; + else if ($size == 3) + $size = 9; + else if ($size == 4) + $size = 11; + else + $size = 12; + $y += $size + 3; + //if ($alt) + // $angle = -15; + //else + $angle = 0; + imagettftext($img, $size, $angle, $x, $y + $alt, $col, $this->fontfile, $string); + } + } +} +?> \ No newline at end of file diff --git a/reporting/includes/class.mail.inc b/reporting/includes/class.mail.inc new file mode 100644 index 00000000..2896ed3e --- /dev/null +++ b/reporting/includes/class.mail.inc @@ -0,0 +1,124 @@ +boundary = md5(uniqid(time())); + $this->header .= "From: $name <$mail>\n"; + } + + function to($mail) + { + $this->to[] = $mail; + } + + function cc($mail) + { + $this->cc[] = $mail; + } + + function bcc($mail) + { + $this->bcc[] = $mail; + } + + function attachment($file) + { + $this->attachment[] = $file; + } + + function subject($subject) + { + $this->subject = $subject; + } + + function text($text) + { + $this->body = "Content-Type: text/plain; charset=ISO-8859-1\n"; + $this->body .= "Content-Transfer-Encoding: 8bit\n\n"; + $this->body .= $text."\n"; + } + + function html($html) + { + $this->body = "Content-Type: text/html; charset=ISO-8859-1\n"; + $this->body .= "Content-Transfer-Encoding: quoted-printable\n\n"; + $this->body .= "\n".$html."\n\n"; + } + + function send() + { + // CC Empfänger hinzufügen + $max = count($this->cc); + if ($max > 0) + { + $this->header .= "Cc: ".$this->cc[0]; + for ($i = 1; $i < $max; $i++) + { + $this->header .= ", ".$this->cc[$i]; + } + $this->header .= "\n"; + } + // BCC Empfänger hinzufügen + $max = count($this->bcc); + if ($max > 0) + { + $this->header .= "Bcc: ".$this->bcc[0]; + for ($i = 1; $i < $max; $i++) + { + $this->header .= ", ".$this->bcc[$i]; + } + $this->header .= "\n"; + } + $this->header .= "MIME-Version: 1.0\n"; + $this->header .= "Content-Type: multipart/mixed; boundary=$this->boundary\n\n"; + $this->header .= "This is a multi-part message in MIME format\n"; + $this->header .= "--$this->boundary\n"; + $this->header .= $this->body; + + // Attachment hinzufügen + $max = count($this->attachment); + if ($max > 0) + { + for ($i = 0; $i < $max; $i++) + { + $file = fread(fopen($this->attachment[$i], "r"), filesize($this->attachment[$i])); + $this->header .= "--".$this->boundary."\n"; + $this->header .= "Content-Type: application/x-zip-compressed; name=".basename($this->attachment[$i])."\n"; + $this->header .= "Content-Transfer-Encoding: base64\n"; + $this->header .= "Content-Disposition: attachment; filename=".basename($this->attachment[$i])."\n\n"; + $this->header .= chunk_split(base64_encode($file))."\n"; + $file = ""; + } + } + $this->header .= "--".$this->boundary."--\n\n"; + + foreach($this->to as $mail) + { + $ret = mail($mail, $this->subject, "", $this->header); + } + return $ret; + } +} +?> \ No newline at end of file diff --git a/reporting/includes/class.pdf.inc b/reporting/includes/class.pdf.inc new file mode 100644 index 00000000..a20148b0 --- /dev/null +++ b/reporting/includes/class.pdf.inc @@ -0,0 +1,3076 @@ + +* @version 009 +* @package Cpdf +*/ +class Cpdf { + +/** +* the current number of pdf objects in the document +*/ +var $numObj=0; +/** +* this array contains all of the pdf objects, ready for final assembly +*/ +var $objects = array(); +/** +* the objectId (number within the objects array) of the document catalog +*/ +var $catalogId; +/** +* array carrying information about the fonts that the system currently knows about +* used to ensure that a font is not loaded twice, among other things +*/ +var $fonts=array(); +/** +* a record of the current font +*/ +var $currentFont=''; +/** +* the current base font +*/ +var $currentBaseFont=''; +/** +* the number of the current font within the font array +*/ +var $currentFontNum=0; +/** +* +*/ +var $currentNode; +/** +* object number of the current page +*/ +var $currentPage; +/** +* object number of the currently active contents block +*/ +var $currentContents; +/** +* number of fonts within the system +*/ +var $numFonts=0; +/** +* current colour for fill operations, defaults to inactive value, all three components should be between 0 and 1 inclusive when active +*/ +var $currentColour=array('r'=>-1,'g'=>-1,'b'=>-1); +/** +* current colour for stroke operations (lines etc.) +*/ +var $currentStrokeColour=array('r'=>-1,'g'=>-1,'b'=>-1); +/** +* current style that lines are drawn in +*/ +var $currentLineStyle=''; +/** +* an array which is used to save the state of the document, mainly the colours and styles +* it is used to temporarily change to another state, the change back to what it was before +*/ +var $stateStack = array(); +/** +* number of elements within the state stack +*/ +var $nStateStack = 0; +/** +* number of page objects within the document +*/ +var $numPages=0; +/** +* object Id storage stack +*/ +var $stack=array(); +/** +* number of elements within the object Id storage stack +*/ +var $nStack=0; +/** +* an array which contains information about the objects which are not firmly attached to pages +* these have been added with the addObject function +*/ +var $looseObjects=array(); +/** +* array contains infomation about how the loose objects are to be added to the document +*/ +var $addLooseObjects=array(); +/** +* the objectId of the information object for the document +* this contains authorship, title etc. +*/ +var $infoObject=0; +/** +* number of images being tracked within the document +*/ +var $numImages=0; +/** +* an array containing options about the document +* it defaults to turning on the compression of the objects +*/ +var $options=array('compression'=>1); +/** +* the objectId of the first page of the document +*/ +var $firstPageId; +/** +* used to track the last used value of the inter-word spacing, this is so that it is known +* when the spacing is changed. +*/ +var $wordSpaceAdjust=0; +/** +* the object Id of the procset object +*/ +var $procsetObjectId; +/** +* store the information about the relationship between font families +* this used so that the code knows which font is the bold version of another font, etc. +* the value of this array is initialised in the constuctor function. +*/ +var $fontFamilies = array(); +/** +* track if the current font is bolded or italicised +*/ +var $currentTextState = ''; +/** +* messages are stored here during processing, these can be selected afterwards to give some useful debug information +*/ +var $messages=''; +/** +* the ancryption array for the document encryption is stored here +*/ +var $arc4=''; +/** +* the object Id of the encryption information +*/ +var $arc4_objnum=0; +/** +* the file identifier, used to uniquely identify a pdf document +*/ +var $fileIdentifier=''; +/** +* a flag to say if a document is to be encrypted or not +*/ +var $encrypted=0; +/** +* the ancryption key for the encryption of all the document content (structure is not encrypted) +*/ +var $encryptionKey=''; +/** +* array which forms a stack to keep track of nested callback functions +*/ +var $callback = array(); +/** +* the number of callback functions in the callback array +*/ +var $nCallback = 0; +/** +* store label->id pairs for named destinations, these will be used to replace internal links +* done this way so that destinations can be defined after the location that links to them +*/ +var $destinations = array(); +/** +* store the stack for the transaction commands, each item in here is a record of the values of all the +* variables within the class, so that the user can rollback at will (from each 'start' command) +* note that this includes the objects array, so these can be large. +*/ +var $checkpoint = ''; +/** +* class constructor +* this will start a new document +* @var array array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. +*/ +function Cpdf ($pageSize=array(0,0,612,792)){ + $this->newDocument($pageSize); + + // also initialize the font families that are known about already + $this->setFontFamily('init'); +// $this->fileIdentifier = md5('xxxxxxxx'.time()); + +} + +/** +* Document object methods (internal use only) +* +* There is about one object method for each type of object in the pdf document +* Each function has the same call list ($id,$action,$options). +* $id = the object id of the object, or what it is to be if it is being created +* $action = a string specifying the action to be performed, though ALL must support: +* 'new' - create the object with the id $id +* 'out' - produce the output for the pdf object +* $options = optional, a string or array containing the various parameters for the object +* +* These, in conjunction with the output function are the ONLY way for output to be produced +* within the pdf 'file'. +*/ + +/** +*destination object, used to specify the location for the user to jump to, presently on opening +*/ +function o_destination($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch($action){ + case 'new': + $this->objects[$id]=array('t'=>'destination','info'=>array()); + $tmp = ''; + switch ($options['type']){ + case 'XYZ': + case 'FitR': + $tmp = ' '.$options['p3'].$tmp; + case 'FitH': + case 'FitV': + case 'FitBH': + case 'FitBV': + $tmp = ' '.$options['p1'].' '.$options['p2'].$tmp; + case 'Fit': + case 'FitB': + $tmp = $options['type'].$tmp; + $this->objects[$id]['info']['string']=$tmp; + $this->objects[$id]['info']['page']=$options['page']; + } + break; + case 'out': + $tmp = $o['info']; + $res="\n".$id." 0 obj\n".'['.$tmp['page'].' 0 R /'.$tmp['string']."]\nendobj\n"; + return $res; + break; + } +} + +/** +* set the viewer preferences +*/ +function o_viewerPreferences($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'viewerPreferences','info'=>array()); + break; + case 'add': + foreach($options as $k=>$v){ + switch ($k){ + case 'HideToolbar': + case 'HideMenubar': + case 'HideWindowUI': + case 'FitWindow': + case 'CenterWindow': + case 'NonFullScreenPageMode': + case 'Direction': + $o['info'][$k]=$v; + break; + } + } + break; + case 'out': + + $res="\n".$id." 0 obj\n".'<< '; + foreach($o['info'] as $k=>$v){ + $res.="\n/".$k.' '.$v; + } + $res.="\n>>\n"; + return $res; + break; + } +} + +/** +* define the document catalog, the overall controller for the document +*/ +function o_catalog($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'catalog','info'=>array()); + $this->catalogId=$id; + break; + case 'outlines': + case 'pages': + case 'openHere': + $o['info'][$action]=$options; + break; + case 'viewerPreferences': + if (!isset($o['info']['viewerPreferences'])){ + $this->numObj++; + $this->o_viewerPreferences($this->numObj,'new'); + $o['info']['viewerPreferences']=$this->numObj; + } + $vp = $o['info']['viewerPreferences']; + $this->o_viewerPreferences($vp,'add',$options); + break; + case 'out': + $res="\n".$id." 0 obj\n".'<< /Type /Catalog'; + foreach($o['info'] as $k=>$v){ + switch($k){ + case 'outlines': + $res.="\n".'/Outlines '.$v.' 0 R'; + break; + case 'pages': + $res.="\n".'/Pages '.$v.' 0 R'; + break; + case 'viewerPreferences': + $res.="\n".'/ViewerPreferences '.$o['info']['viewerPreferences'].' 0 R'; + break; + case 'openHere': + $res.="\n".'/OpenAction '.$o['info']['openHere'].' 0 R'; + break; + } + } + $res.=" >>\nendobj"; + return $res; + break; + } +} + +/** +* object which is a parent to the pages in the document +*/ +function o_pages($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'pages','info'=>array()); + $this->o_catalog($this->catalogId,'pages',$id); + break; + case 'page': + if (!is_array($options)){ + // then it will just be the id of the new page + $o['info']['pages'][]=$options; + } else { + // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative + // and pos is either 'before' or 'after', saying where this page will fit. + if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])){ + $i = array_search($options['rid'],$o['info']['pages']); + if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i]==$options['rid']){ + // then there is a match + // make a space + switch ($options['pos']){ + case 'before': + $k = $i; + break; + case 'after': + $k=$i+1; + break; + default: + $k=-1; + break; + } + if ($k>=0){ + for ($j=count($o['info']['pages'])-1;$j>=$k;$j--){ + $o['info']['pages'][$j+1]=$o['info']['pages'][$j]; + } + $o['info']['pages'][$k]=$options['id']; + } + } + } + } + break; + case 'procset': + $o['info']['procset']=$options; + break; + case 'mediaBox': + $o['info']['mediaBox']=$options; // which should be an array of 4 numbers + break; + case 'font': + $o['info']['fonts'][]=array('objNum'=>$options['objNum'],'fontNum'=>$options['fontNum']); + break; + case 'xObject': + $o['info']['xObjects'][]=array('objNum'=>$options['objNum'],'label'=>$options['label']); + break; + case 'out': + if (count($o['info']['pages'])){ + $res="\n".$id." 0 obj\n<< /Type /Pages\n/Kids ["; + foreach($o['info']['pages'] as $k=>$v){ + $res.=$v." 0 R\n"; + } + $res.="]\n/Count ".count($this->objects[$id]['info']['pages']); + if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || isset($o['info']['procset'])){ + $res.="\n/Resources <<"; + if (isset($o['info']['procset'])){ + $res.="\n/ProcSet ".$o['info']['procset']." 0 R"; + } + if (isset($o['info']['fonts']) && count($o['info']['fonts'])){ + $res.="\n/Font << "; + foreach($o['info']['fonts'] as $finfo){ + $res.="\n/F".$finfo['fontNum']." ".$finfo['objNum']." 0 R"; + } + $res.=" >>"; + } + if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])){ + $res.="\n/XObject << "; + foreach($o['info']['xObjects'] as $finfo){ + $res.="\n/".$finfo['label']." ".$finfo['objNum']." 0 R"; + } + $res.=" >>"; + } + $res.="\n>>"; + if (isset($o['info']['mediaBox'])){ + $tmp=$o['info']['mediaBox']; + $res.="\n/MediaBox [".sprintf('%.3f',$tmp[0]).' '.sprintf('%.3f',$tmp[1]).' '.sprintf('%.3f',$tmp[2]).' '.sprintf('%.3f',$tmp[3]).']'; + } + } + $res.="\n >>\nendobj"; + } else { + $res="\n".$id." 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; + } + return $res; + break; + } +} + +/** +* define the outlines in the doc, empty for now +*/ +function o_outlines($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'outlines','info'=>array('outlines'=>array())); + $this->o_catalog($this->catalogId,'outlines',$id); + break; + case 'outline': + $o['info']['outlines'][]=$options; + break; + case 'out': + if (count($o['info']['outlines'])){ + $res="\n".$id." 0 obj\n<< /Type /Outlines /Kids ["; + foreach($o['info']['outlines'] as $k=>$v){ + $res.=$v." 0 R "; + } + $res.="] /Count ".count($o['info']['outlines'])." >>\nendobj"; + } else { + $res="\n".$id." 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; + } + return $res; + break; + } +} + +/** +* an object to hold the font description +*/ +function o_font($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'font','info'=>array('name'=>$options['name'],'SubType'=>'Type1')); + $fontNum=$this->numFonts; + $this->objects[$id]['info']['fontNum']=$fontNum; + // deal with the encoding and the differences + if (isset($options['differences'])){ + // then we'll need an encoding dictionary + $this->numObj++; + $this->o_fontEncoding($this->numObj,'new',$options); + $this->objects[$id]['info']['encodingDictionary']=$this->numObj; + } else if (isset($options['encoding'])){ + // we can specify encoding here + switch($options['encoding']){ + case 'WinAnsiEncoding': + case 'MacRomanEncoding': + case 'MacExpertEncoding': + $this->objects[$id]['info']['encoding']=$options['encoding']; + break; + case 'none': + break; + default: + $this->objects[$id]['info']['encoding']='WinAnsiEncoding'; + break; + } + } else { + $this->objects[$id]['info']['encoding']='WinAnsiEncoding'; + } + // also tell the pages node about the new font + $this->o_pages($this->currentNode,'font',array('fontNum'=>$fontNum,'objNum'=>$id)); + break; + case 'add': + foreach ($options as $k=>$v){ + switch ($k){ + case 'BaseFont': + $o['info']['name'] = $v; + break; + case 'FirstChar': + case 'LastChar': + case 'Widths': + case 'FontDescriptor': + case 'SubType': + $this->addMessage('o_font '.$k." : ".$v); + $o['info'][$k] = $v; + break; + } + } + break; + case 'out': + $res="\n".$id." 0 obj\n<< /Type /Font\n/Subtype /".$o['info']['SubType']."\n"; + $res.="/Name /F".$o['info']['fontNum']."\n"; + $res.="/BaseFont /".$o['info']['name']."\n"; + if (isset($o['info']['encodingDictionary'])){ + // then place a reference to the dictionary + $res.="/Encoding ".$o['info']['encodingDictionary']." 0 R\n"; + } else if (isset($o['info']['encoding'])){ + // use the specified encoding + $res.="/Encoding /".$o['info']['encoding']."\n"; + } + if (isset($o['info']['FirstChar'])){ + $res.="/FirstChar ".$o['info']['FirstChar']."\n"; + } + if (isset($o['info']['LastChar'])){ + $res.="/LastChar ".$o['info']['LastChar']."\n"; + } + if (isset($o['info']['Widths'])){ + $res.="/Widths ".$o['info']['Widths']." 0 R\n"; + } + if (isset($o['info']['FontDescriptor'])){ + $res.="/FontDescriptor ".$o['info']['FontDescriptor']." 0 R\n"; + } + $res.=">>\nendobj"; + return $res; + break; + } +} + +/** +* a font descriptor, needed for including additional fonts +*/ +function o_fontDescriptor($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'fontDescriptor','info'=>$options); + break; + case 'out': + $res="\n".$id." 0 obj\n<< /Type /FontDescriptor\n"; + foreach ($o['info'] as $label => $value){ + switch ($label){ + case 'Ascent': + case 'CapHeight': + case 'Descent': + case 'Flags': + case 'ItalicAngle': + case 'StemV': + case 'AvgWidth': + case 'Leading': + case 'MaxWidth': + case 'MissingWidth': + case 'StemH': + case 'XHeight': + case 'CharSet': + if (strlen($value)){ + $res.='/'.$label.' '.$value."\n"; + } + break; + case 'FontFile': + case 'FontFile2': + case 'FontFile3': + $res.='/'.$label.' '.$value." 0 R\n"; + break; + case 'FontBBox': + $res.='/'.$label.' ['.$value[0].' '.$value[1].' '.$value[2].' '.$value[3]."]\n"; + break; + case 'FontName': + $res.='/'.$label.' /'.$value."\n"; + break; + } + } + $res.=">>\nendobj"; + return $res; + break; + } +} + +/** +* the font encoding +*/ +function o_fontEncoding($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + // the options array should contain 'differences' and maybe 'encoding' + $this->objects[$id]=array('t'=>'fontEncoding','info'=>$options); + break; + case 'out': + $res="\n".$id." 0 obj\n<< /Type /Encoding\n"; + if (!isset($o['info']['encoding'])){ + $o['info']['encoding']='WinAnsiEncoding'; + } + if ($o['info']['encoding']!='none'){ + $res.="/BaseEncoding /".$o['info']['encoding']."\n"; + } + $res.="/Differences \n["; + $onum=-100; + foreach($o['info']['differences'] as $num=>$label){ + if ($num!=$onum+1){ + // we cannot make use of consecutive numbering + $res.= "\n".$num." /".$label; + } else { + $res.= " /".$label; + } + $onum=$num; + } + $res.="\n]\n>>\nendobj"; + return $res; + break; + } +} + +/** +* the document procset, solves some problems with printing to old PS printers +*/ +function o_procset($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'procset','info'=>array('PDF'=>1,'Text'=>1)); + $this->o_pages($this->currentNode,'procset',$id); + $this->procsetObjectId=$id; + break; + case 'add': + // this is to add new items to the procset list, despite the fact that this is considered + // obselete, the items are required for printing to some postscript printers + switch ($options) { + case 'ImageB': + case 'ImageC': + case 'ImageI': + $o['info'][$options]=1; + break; + } + break; + case 'out': + $res="\n".$id." 0 obj\n["; + foreach ($o['info'] as $label=>$val){ + $res.='/'.$label.' '; + } + $res.="]\nendobj"; + return $res; + break; + } +} + +/** +* define the document information +*/ +function o_info($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->infoObject=$id; + $date='D:'.date('Ymd'); + $this->objects[$id]=array('t'=>'info','info'=>array('Creator'=>'R and OS php pdf writer, http://www.ros.co.nz','CreationDate'=>$date)); + break; + case 'Title': + case 'Author': + case 'Subject': + case 'Keywords': + case 'Creator': + case 'Producer': + case 'CreationDate': + case 'ModDate': + case 'Trapped': + $o['info'][$action]=$options; + break; + case 'out': + if ($this->encrypted){ + $this->encryptInit($id); + } + $res="\n".$id." 0 obj\n<<\n"; + foreach ($o['info'] as $k=>$v){ + $res.='/'.$k.' ('; + if ($this->encrypted){ + $res.=$this->filterText($this->ARC4($v)); + } else { + $res.=$this->filterText($v); + } + $res.=")\n"; + } + $res.=">>\nendobj"; + return $res; + break; + } +} + +/** +* an action object, used to link to URLS initially +*/ +function o_action($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + if (is_array($options)){ + $this->objects[$id]=array('t'=>'action','info'=>$options,'type'=>$options['type']); + } else { + // then assume a URI action + $this->objects[$id]=array('t'=>'action','info'=>$options,'type'=>'URI'); + } + break; + case 'out': + if ($this->encrypted){ + $this->encryptInit($id); + } + $res="\n".$id." 0 obj\n<< /Type /Action"; + switch($o['type']){ + case 'ilink': + // there will be an 'label' setting, this is the name of the destination + $res.="\n/S /GoTo\n/D ".$this->destinations[(string)$o['info']['label']]." 0 R"; + break; + case 'URI': + $res.="\n/S /URI\n/URI ("; + if ($this->encrypted){ + $res.=$this->filterText($this->ARC4($o['info'])); + } else { + $res.=$this->filterText($o['info']); + } + $res.=")"; + break; + } + $res.="\n>>\nendobj"; + return $res; + break; + } +} + +/** +* an annotation object, this will add an annotation to the current page. +* initially will support just link annotations +*/ +function o_annotation($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + // add the annotation to the current page + $pageId = $this->currentPage; + $this->o_page($pageId,'annot',$id); + // and add the action object which is going to be required + switch($options['type']){ + case 'link': + $this->objects[$id]=array('t'=>'annotation','info'=>$options); + $this->numObj++; + $this->o_action($this->numObj,'new',$options['url']); + $this->objects[$id]['info']['actionId']=$this->numObj; + break; + case 'ilink': + // this is to a named internal link + $label = $options['label']; + $this->objects[$id]=array('t'=>'annotation','info'=>$options); + $this->numObj++; + $this->o_action($this->numObj,'new',array('type'=>'ilink','label'=>$label)); + $this->objects[$id]['info']['actionId']=$this->numObj; + break; + } + break; + case 'out': + $res="\n".$id." 0 obj\n<< /Type /Annot"; + switch($o['info']['type']){ + case 'link': + case 'ilink': + $res.= "\n/Subtype /Link"; + break; + } + $res.="\n/A ".$o['info']['actionId']." 0 R"; + $res.="\n/Border [0 0 0]"; + $res.="\n/H /I"; + $res.="\n/Rect [ "; + foreach($o['info']['rect'] as $v){ + $res.= sprintf("%.4f ",$v); + } + $res.="]"; + $res.="\n>>\nendobj"; + return $res; + break; + } +} + +/** +* a page object, it also creates a contents object to hold its contents +*/ +function o_page($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->numPages++; + $this->objects[$id]=array('t'=>'page','info'=>array('parent'=>$this->currentNode,'pageNum'=>$this->numPages)); + if (is_array($options)){ + // then this must be a page insertion, array shoudl contain 'rid','pos'=[before|after] + $options['id']=$id; + $this->o_pages($this->currentNode,'page',$options); + } else { + $this->o_pages($this->currentNode,'page',$id); + } + $this->currentPage=$id; + //make a contents object to go with this page + $this->numObj++; + $this->o_contents($this->numObj,'new',$id); + $this->currentContents=$this->numObj; + $this->objects[$id]['info']['contents']=array(); + $this->objects[$id]['info']['contents'][]=$this->numObj; + $match = ($this->numPages%2 ? 'odd' : 'even'); + foreach($this->addLooseObjects as $oId=>$target){ + if ($target=='all' || $match==$target){ + $this->objects[$id]['info']['contents'][]=$oId; + } + } + break; + case 'content': + $o['info']['contents'][]=$options; + break; + case 'annot': + // add an annotation to this page + if (!isset($o['info']['annot'])){ + $o['info']['annot']=array(); + } + // $options should contain the id of the annotation dictionary + $o['info']['annot'][]=$options; + break; + case 'out': + $res="\n".$id." 0 obj\n<< /Type /Page"; + $res.="\n/Parent ".$o['info']['parent']." 0 R"; + if (isset($o['info']['annot'])){ + $res.="\n/Annots ["; + foreach($o['info']['annot'] as $aId){ + $res.=" ".$aId." 0 R"; + } + $res.=" ]"; + } + $count = count($o['info']['contents']); + if ($count==1){ + $res.="\n/Contents ".$o['info']['contents'][0]." 0 R"; + } else if ($count>1){ + $res.="\n/Contents [\n"; + foreach ($o['info']['contents'] as $cId){ + $res.=$cId." 0 R\n"; + } + $res.="]"; + } + $res.="\n>>\nendobj"; + return $res; + break; + } +} + +/** +* the contents objects hold all of the content which appears on pages +*/ +function o_contents($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch ($action){ + case 'new': + $this->objects[$id]=array('t'=>'contents','c'=>'','info'=>array()); + if (strlen($options) && intval($options)){ + // then this contents is the primary for a page + $this->objects[$id]['onPage']=$options; + } else if ($options=='raw'){ + // then this page contains some other type of system object + $this->objects[$id]['raw']=1; + } + break; + case 'add': + // add more options to the decleration + foreach ($options as $k=>$v){ + $o['info'][$k]=$v; + } + case 'out': + $tmp=$o['c']; + $res= "\n".$id." 0 obj\n"; + if (isset($this->objects[$id]['raw'])){ + $res.=$tmp; + } else { + $res.= "<<"; + if (function_exists('gzcompress') && $this->options['compression']){ + // then implement ZLIB based compression on this content stream + $res.=" /Filter /FlateDecode"; + $tmp = gzcompress($tmp); + } + if ($this->encrypted){ + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + foreach($o['info'] as $k=>$v){ + $res .= "\n/".$k.' '.$v; + } + $res.="\n/Length ".strlen($tmp)." >>\nstream\n".$tmp."\nendstream"; + } + $res.="\nendobj\n"; + return $res; + break; + } +} + +/** +* an image object, will be an XObject in the document, includes description and data +*/ +function o_image($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch($action){ + case 'new': + // make the new object + $this->objects[$id]=array('t'=>'image','data'=>$options['data'],'info'=>array()); + $this->objects[$id]['info']['Type']='/XObject'; + $this->objects[$id]['info']['Subtype']='/Image'; + $this->objects[$id]['info']['Width']=$options['iw']; + $this->objects[$id]['info']['Height']=$options['ih']; + if (!isset($options['type']) || $options['type']=='jpg'){ + if (!isset($options['channels'])){ + $options['channels']=3; + } + switch($options['channels']){ + case 1: + $this->objects[$id]['info']['ColorSpace']='/DeviceGray'; + break; + default: + $this->objects[$id]['info']['ColorSpace']='/DeviceRGB'; + break; + } + $this->objects[$id]['info']['Filter']='/DCTDecode'; + $this->objects[$id]['info']['BitsPerComponent']=8; + } else if ($options['type']=='png'){ + $this->objects[$id]['info']['Filter']='/FlateDecode'; + $this->objects[$id]['info']['DecodeParms']='<< /Predictor 15 /Colors '.$options['ncolor'].' /Columns '.$options['iw'].' /BitsPerComponent '.$options['bitsPerComponent'].'>>'; + if (strlen($options['pdata'])){ + $tmp = ' [ /Indexed /DeviceRGB '.(strlen($options['pdata'])/3-1).' '; + $this->numObj++; + $this->o_contents($this->numObj,'new'); + $this->objects[$this->numObj]['c']=$options['pdata']; + $tmp.=$this->numObj.' 0 R'; + $tmp .=' ]'; + $this->objects[$id]['info']['ColorSpace'] = $tmp; + if (isset($options['transparency'])){ + switch($options['transparency']['type']){ + case 'indexed': + $tmp=' [ '.$options['transparency']['data'].' '.$options['transparency']['data'].'] '; + $this->objects[$id]['info']['Mask'] = $tmp; + break; + } + } + } else { + $this->objects[$id]['info']['ColorSpace']='/'.$options['color']; + } + $this->objects[$id]['info']['BitsPerComponent']=$options['bitsPerComponent']; + } + // assign it a place in the named resource dictionary as an external object, according to + // the label passed in with it. + $this->o_pages($this->currentNode,'xObject',array('label'=>$options['label'],'objNum'=>$id)); + // also make sure that we have the right procset object for it. + $this->o_procset($this->procsetObjectId,'add','ImageC'); + break; + case 'out': + $tmp=$o['data']; + $res= "\n".$id." 0 obj\n<<"; + foreach($o['info'] as $k=>$v){ + $res.="\n/".$k.' '.$v; + } + if ($this->encrypted){ + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + $res.="\n/Length ".strlen($tmp)." >>\nstream\n".$tmp."\nendstream\nendobj\n"; + return $res; + break; + } +} + +/** +* encryption object. +*/ +function o_encryption($id,$action,$options=''){ + if ($action!='new'){ + $o =& $this->objects[$id]; + } + switch($action){ + case 'new': + // make the new object + $this->objects[$id]=array('t'=>'encryption','info'=>$options); + $this->arc4_objnum=$id; + // figure out the additional paramaters required + $pad = chr(0x28).chr(0xBF).chr(0x4E).chr(0x5E).chr(0x4E).chr(0x75).chr(0x8A).chr(0x41).chr(0x64).chr(0x00).chr(0x4E).chr(0x56).chr(0xFF).chr(0xFA).chr(0x01).chr(0x08).chr(0x2E).chr(0x2E).chr(0x00).chr(0xB6).chr(0xD0).chr(0x68).chr(0x3E).chr(0x80).chr(0x2F).chr(0x0C).chr(0xA9).chr(0xFE).chr(0x64).chr(0x53).chr(0x69).chr(0x7A); + $len = strlen($options['owner']); + if ($len>32){ + $owner = substr($options['owner'],0,32); + } else if ($len<32){ + $owner = $options['owner'].substr($pad,0,32-$len); + } else { + $owner = $options['owner']; + } + $len = strlen($options['user']); + if ($len>32){ + $user = substr($options['user'],0,32); + } else if ($len<32){ + $user = $options['user'].substr($pad,0,32-$len); + } else { + $user = $options['user']; + } + $tmp = $this->md5_16($owner); + $okey = substr($tmp,0,5); + $this->ARC4_init($okey); + $ovalue=$this->ARC4($user); + $this->objects[$id]['info']['O']=$ovalue; + // now make the u value, phew. + $tmp = $this->md5_16($user.$ovalue.chr($options['p']).chr(255).chr(255).chr(255).$this->fileIdentifier); + $ukey = substr($tmp,0,5); + + $this->ARC4_init($ukey); + $this->encryptionKey = $ukey; + $this->encrypted=1; + $uvalue=$this->ARC4($pad); + + $this->objects[$id]['info']['U']=$uvalue; + $this->encryptionKey=$ukey; + + // initialize the arc4 array + break; + case 'out': + $res= "\n".$id." 0 obj\n<<"; + $res.="\n/Filter /Standard"; + $res.="\n/V 1"; + $res.="\n/R 2"; + $res.="\n/O (".$this->filterText($o['info']['O']).')'; + $res.="\n/U (".$this->filterText($o['info']['U']).')'; + // and the p-value needs to be converted to account for the twos-complement approach + $o['info']['p'] = (($o['info']['p']^255)+1)*-1; + $res.="\n/P ".($o['info']['p']); + $res.="\n>>\nendobj\n"; + + return $res; + break; + } +} + +/** +* ARC4 functions +* A series of function to implement ARC4 encoding in PHP +*/ + +/** +* calculate the 16 byte version of the 128 bit md5 digest of the string +*/ +function md5_16($string){ + $tmp = md5($string); + $out=''; + for ($i=0;$i<=30;$i=$i+2){ + $out.=chr(hexdec(substr($tmp,$i,2))); + } + return $out; +} + +/** +* initialize the encryption for processing a particular object +*/ +function encryptInit($id){ + $tmp = $this->encryptionKey; + $hex = dechex($id); + if (strlen($hex)<6){ + $hex = substr('000000',0,6-strlen($hex)).$hex; + } + $tmp.= chr(hexdec(substr($hex,4,2))).chr(hexdec(substr($hex,2,2))).chr(hexdec(substr($hex,0,2))).chr(0).chr(0); + $key = $this->md5_16($tmp); + $this->ARC4_init(substr($key,0,10)); +} + +/** +* initialize the ARC4 encryption +*/ +function ARC4_init($key=''){ + $this->arc4 = ''; + // setup the control array + if (strlen($key)==0){ + return; + } + $k = ''; + while(strlen($k)<256){ + $k.=$key; + } + $k=substr($k,0,256); + for ($i=0;$i<256;$i++){ + $this->arc4 .= chr($i); + } + $j=0; + for ($i=0;$i<256;$i++){ + $t = $this->arc4[$i]; + $j = ($j + ord($t) + ord($k[$i]))%256; + $this->arc4[$i]=$this->arc4[$j]; + $this->arc4[$j]=$t; + } +} + +/** +* ARC4 encrypt a text string +*/ +function ARC4($text){ + $len=strlen($text); + $a=0; + $b=0; + $c = $this->arc4; + $out=''; + for ($i=0;$i<$len;$i++){ + $a = ($a+1)%256; + $t= $c[$a]; + $b = ($b+ord($t))%256; + $c[$a]=$c[$b]; + $c[$b]=$t; + $k = ord($c[(ord($c[$a])+ord($c[$b]))%256]); + $out.=chr(ord($text[$i]) ^ $k); + } + + return $out; +} + +/** +* functions which can be called to adjust or add to the document +*/ + +/** +* add a link in the document to an external URL +*/ +function addLink($url,$x0,$y0,$x1,$y1){ + $this->numObj++; + $info = array('type'=>'link','url'=>$url,'rect'=>array($x0,$y0,$x1,$y1)); + $this->o_annotation($this->numObj,'new',$info); +} + +/** +* add a link in the document to an internal destination (ie. within the document) +*/ +function addInternalLink($label,$x0,$y0,$x1,$y1){ + $this->numObj++; + $info = array('type'=>'ilink','label'=>$label,'rect'=>array($x0,$y0,$x1,$y1)); + $this->o_annotation($this->numObj,'new',$info); +} + +/** +* set the encryption of the document +* can be used to turn it on and/or set the passwords which it will have. +* also the functions that the user will have are set here, such as print, modify, add +*/ +function setEncryption($userPass='',$ownerPass='',$pc=array()){ + $p=bindec(11000000); + + $options = array( + 'print'=>4 + ,'modify'=>8 + ,'copy'=>16 + ,'add'=>32 + ); + foreach($pc as $k=>$v){ + if ($v && isset($options[$k])){ + $p+=$options[$k]; + } else if (isset($options[$v])){ + $p+=$options[$v]; + } + } + // implement encryption on the document + if ($this->arc4_objnum == 0){ + // then the block does not exist already, add it. + $this->numObj++; + if (strlen($ownerPass)==0){ + $ownerPass=$userPass; + } + $this->o_encryption($this->numObj,'new',array('user'=>$userPass,'owner'=>$ownerPass,'p'=>$p)); + } +} + +/** +* should be used for internal checks, not implemented as yet +*/ +function checkAllHere(){ +} + +/** +* return the pdf stream as a string returned from the function +*/ +function output($debug=0){ + + if ($debug){ + // turn compression off + $this->options['compression']=0; + } + + if ($this->arc4_objnum){ + $this->ARC4_init($this->encryptionKey); + } + + $this->checkAllHere(); + + $xref=array(); + $content="%PDF-1.3\n%âãÏÓ\n"; +// $content="%PDF-1.3\n"; + $pos=strlen($content); + foreach($this->objects as $k=>$v){ + $tmp='o_'.$v['t']; + $cont=$this->$tmp($k,'out'); + $content.=$cont; + $xref[]=$pos; + $pos+=strlen($cont); + } + $content.="\nxref\n0 ".(count($xref)+1)."\n0000000000 65535 f \n"; + foreach($xref as $p){ + $content.=substr('0000000000',0,10-strlen($p)).$p." 00000 n \n"; + } + $content.="\ntrailer\n << /Size ".(count($xref)+1)."\n /Root 1 0 R\n /Info ".$this->infoObject." 0 R\n"; + // if encryption has been applied to this document then add the marker for this dictionary + if ($this->arc4_objnum > 0){ + $content .= "/Encrypt ".$this->arc4_objnum." 0 R\n"; + } + if (strlen($this->fileIdentifier)){ + $content .= "/ID[<".$this->fileIdentifier."><".$this->fileIdentifier.">]\n"; + } + $content .= " >>\nstartxref\n".$pos."\n%%EOF\n"; + return $content; +} + +/** +* intialize a new document +* if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum +* this function is called automatically by the constructor function +* +* @access private +*/ +function newDocument($pageSize=array(0,0,612,792)){ + $this->numObj=0; + $this->objects = array(); + + $this->numObj++; + $this->o_catalog($this->numObj,'new'); + + $this->numObj++; + $this->o_outlines($this->numObj,'new'); + + $this->numObj++; + $this->o_pages($this->numObj,'new'); + + $this->o_pages($this->numObj,'mediaBox',$pageSize); + $this->currentNode = 3; + + $this->numObj++; + $this->o_procset($this->numObj,'new'); + + $this->numObj++; + $this->o_info($this->numObj,'new'); + + $this->numObj++; + $this->o_page($this->numObj,'new'); + + // need to store the first page id as there is no way to get it to the user during + // startup + $this->firstPageId = $this->currentContents; +} + +/** +* open the font file and return a php structure containing it. +* first check if this one has been done before and saved in a form more suited to php +* note that if a php serialized version does not exist it will try and make one, but will +* require write access to the directory to do it... it is MUCH faster to have these serialized +* files. +* +* @access private +*/ +function openFont($font){ + // assume that $font contains both the path and perhaps the extension to the file, split them + $pos=strrpos($font,'/'); + if ($pos===false){ + $dir = './'; + $name = $font; + } else { + $dir=substr($font,0,$pos+1); + $name=substr($font,$pos+1); + } + + if (substr($name,-4)=='.afm'){ + $name=substr($name,0,strlen($name)-4); + } + $this->addMessage('openFont: '.$font.' - '.$name); + if (file_exists($dir.'php_'.$name.'.afm')){ + $this->addMessage('openFont: php file exists '.$dir.'php_'.$name.'.afm'); + $tmp = file($dir.'php_'.$name.'.afm'); + $this->fonts[$font]=unserialize($tmp[0]); + if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_']<1){ + // if the font file is old, then clear it out and prepare for re-creation + $this->addMessage('openFont: clear out, make way for new version.'); + unset($this->fonts[$font]); + } + } + if (!isset($this->fonts[$font]) && file_exists($dir.$name.'.afm')){ + // then rebuild the php_.afm file from the .afm file + $this->addMessage('openFont: build php file from '.$dir.$name.'.afm'); + $data = array(); + $file = file($dir.$name.'.afm'); + foreach ($file as $rowA){ + $row=trim($rowA); + $pos=strpos($row,' '); + if ($pos){ + // then there must be some keyword + $key = substr($row,0,$pos); + switch ($key){ + case 'FontName': + case 'FullName': + case 'FamilyName': + case 'Weight': + case 'ItalicAngle': + case 'IsFixedPitch': + case 'CharacterSet': + case 'UnderlinePosition': + case 'UnderlineThickness': + case 'Version': + case 'EncodingScheme': + case 'CapHeight': + case 'XHeight': + case 'Ascender': + case 'Descender': + case 'StdHW': + case 'StdVW': + case 'StartCharMetrics': + $data[$key]=trim(substr($row,$pos)); + break; + case 'FontBBox': + $data[$key]=explode(' ',trim(substr($row,$pos))); + break; + case 'C': + //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; + $bits=explode(';',trim($row)); + $dtmp=array(); + foreach($bits as $bit){ + $bits2 = explode(' ',trim($bit)); + if (strlen($bits2[0])){ + if (count($bits2)>2){ + $dtmp[$bits2[0]]=array(); + for ($i=1;$i=0){ + $data['C'][$dtmp['C']]=$dtmp; + $data['C'][$dtmp['N']]=$dtmp; + } else { + $data['C'][$dtmp['N']]=$dtmp; + } + break; + case 'KPX': + //KPX Adieresis yacute -40 + $bits=explode(' ',trim($row)); + $data['KPX'][$bits[1]][$bits[2]]=$bits[3]; + break; + } + } + } + $data['_version_']=1; + $this->fonts[$font]=$data; + $fp = fopen($dir.'php_'.$name.'.afm','w'); + fwrite($fp,serialize($data)); + fclose($fp); + } else if (!isset($this->fonts[$font])){ + $this->addMessage('openFont: no font file found'); +// echo 'Font not Found '.$font; + } +} + +/** +* if the font is not loaded then load it and make the required object +* else just make it the current font +* the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' +* note that encoding='none' will need to be used for symbolic fonts +* and 'differences' => an array of mappings between numbers 0->255 and character names. +* +*/ +function selectFont($fontName,$encoding='',$set=1){ + if (!isset($this->fonts[$fontName])){ + // load the file + $this->openFont($fontName); + if (isset($this->fonts[$fontName])){ + $this->numObj++; + $this->numFonts++; + $pos=strrpos($fontName,'/'); +// $dir=substr($fontName,0,$pos+1); + $name=substr($fontName,$pos+1); + if (substr($name,-4)=='.afm'){ + $name=substr($name,0,strlen($name)-4); + } + $options=array('name'=>$name); + if (is_array($encoding)){ + // then encoding and differences might be set + if (isset($encoding['encoding'])){ + $options['encoding']=$encoding['encoding']; + } + if (isset($encoding['differences'])){ + $options['differences']=$encoding['differences']; + } + } else if (strlen($encoding)){ + // then perhaps only the encoding has been set + $options['encoding']=$encoding; + } + $fontObj = $this->numObj; + $this->o_font($this->numObj,'new',$options); + $this->fonts[$fontName]['fontNum']=$this->numFonts; + // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there + // should be for all non-basic fonts), then load it into an object and put the + // references into the font object + $basefile = substr($fontName,0,strlen($fontName)-4); + if (file_exists($basefile.'.pfb')){ + $fbtype = 'pfb'; + } else if (file_exists($basefile.'.ttf')){ + $fbtype = 'ttf'; + } else { + $fbtype=''; + } + $fbfile = $basefile.'.'.$fbtype; + +// $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb'; +// $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf'; + $this->addMessage('selectFont: checking for - '.$fbfile); + if (substr($fontName,-4)=='.afm' && strlen($fbtype) ){ + $adobeFontName = $this->fonts[$fontName]['FontName']; +// $fontObj = $this->numObj; + $this->addMessage('selectFont: adding font file - '.$fbfile.' - '.$adobeFontName); + // find the array of fond widths, and put that into an object. + $firstChar = -1; + $lastChar = 0; + $widths = array(); + foreach ($this->fonts[$fontName]['C'] as $num=>$d){ + if (intval($num)>0 || $num=='0'){ + if ($lastChar>0 && $num>$lastChar+1){ + for($i=$lastChar+1;$i<$num;$i++){ + $widths[] = 0; + } + } + $widths[] = $d['WX']; + if ($firstChar==-1){ + $firstChar = $num; + } + $lastChar = $num; + } + } + // also need to adjust the widths for the differences array + if (isset($options['differences'])){ + foreach($options['differences'] as $charNum=>$charName){ + if ($charNum>$lastChar){ + for($i=$lastChar+1;$i<=$charNum;$i++){ + $widths[]=0; + } + $lastChar=$charNum; + } + if (isset($this->fonts[$fontName]['C'][$charName])){ + $widths[$charNum-$firstChar]=$this->fonts[$fontName]['C'][$charName]['WX']; + } + } + } + $this->addMessage('selectFont: FirstChar='.$firstChar); + $this->addMessage('selectFont: LastChar='.$lastChar); + $this->numObj++; + $this->o_contents($this->numObj,'new','raw'); + $this->objects[$this->numObj]['c'].='['; + foreach($widths as $width){ + $this->objects[$this->numObj]['c'].=' '.$width; + } + $this->objects[$this->numObj]['c'].=' ]'; + $widthid = $this->numObj; + + // load the pfb file, and put that into an object too. + // note that pdf supports only binary format type 1 font files, though there is a + // simple utility to convert them from pfa to pfb. + $fp = fopen($fbfile,'rb'); + $tmp = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $data = fread($fp,filesize($fbfile)); + set_magic_quotes_runtime($tmp); + fclose($fp); + + // create the font descriptor + $this->numObj++; + $fontDescriptorId = $this->numObj; + $this->numObj++; + $pfbid = $this->numObj; + // determine flags (more than a little flakey, hopefully will not matter much) + $flags=0; + if ($this->fonts[$fontName]['ItalicAngle']!=0){ $flags+=pow(2,6); } + if ($this->fonts[$fontName]['IsFixedPitch']=='true'){ $flags+=1; } + $flags+=pow(2,5); // assume non-sybolic + + $list = array('Ascent'=>'Ascender','CapHeight'=>'CapHeight','Descent'=>'Descender','FontBBox'=>'FontBBox','ItalicAngle'=>'ItalicAngle'); + $fdopt = array( + 'Flags'=>$flags + ,'FontName'=>$adobeFontName + ,'StemV'=>100 // don't know what the value for this should be! + ); + foreach($list as $k=>$v){ + if (isset($this->fonts[$fontName][$v])){ + $fdopt[$k]=$this->fonts[$fontName][$v]; + } + } + + if ($fbtype=='pfb'){ + $fdopt['FontFile']=$pfbid; + } else if ($fbtype=='ttf'){ + $fdopt['FontFile2']=$pfbid; + } + $this->o_fontDescriptor($fontDescriptorId,'new',$fdopt); + + // embed the font program + $this->o_contents($this->numObj,'new'); + $this->objects[$pfbid]['c'].=$data; + // determine the cruicial lengths within this file + if ($fbtype=='pfb'){ + $l1 = strpos($data,'eexec')+6; + $l2 = strpos($data,'00000000')-$l1; + $l3 = strlen($data)-$l2-$l1; + $this->o_contents($this->numObj,'add',array('Length1'=>$l1,'Length2'=>$l2,'Length3'=>$l3)); + } else if ($fbtype=='ttf'){ + $l1 = strlen($data); + $this->o_contents($this->numObj,'add',array('Length1'=>$l1)); + } + + + // tell the font object about all this new stuff + $tmp = array('BaseFont'=>$adobeFontName,'Widths'=>$widthid + ,'FirstChar'=>$firstChar,'LastChar'=>$lastChar + ,'FontDescriptor'=>$fontDescriptorId); + if ($fbtype=='ttf'){ + $tmp['SubType']='TrueType'; + } + $this->addMessage('adding extra info to font.('.$fontObj.')'); + foreach($tmp as $fk=>$fv){ + $this->addMessage($fk." : ".$fv); + } + $this->o_font($fontObj,'add',$tmp); + + } else { + $this->addMessage('selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'); + } + + + // also set the differences here, note that this means that these will take effect only the + //first time that a font is selected, else they are ignored + if (isset($options['differences'])){ + $this->fonts[$fontName]['differences']=$options['differences']; + } + } + } + if ($set && isset($this->fonts[$fontName])){ + // so if for some reason the font was not set in the last one then it will not be selected + $this->currentBaseFont=$fontName; + // the next line means that if a new font is selected, then the current text state will be + // applied to it as well. + $this->setCurrentFont(); + } + return $this->currentFontNum; +} + +/** +* sets up the current font, based on the font families, and the current text state +* note that this system is quite flexible, a font can be completely different to a +* font, and even will have to be defined within the family to have meaning +* This function is to be called whenever the currentTextState is changed, it will update +* the currentFont setting to whatever the appropriatte family one is. +* If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont +* This function will change the currentFont to whatever it should be, but will not change the +* currentBaseFont. +* +* @access private +*/ +function setCurrentFont(){ + if (strlen($this->currentBaseFont)==0){ + // then assume an initial font + $this->selectFont('./fonts/Helvetica.afm'); + } + $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); + if (strlen($this->currentTextState) + && isset($this->fontFamilies[$cf]) + && isset($this->fontFamilies[$cf][$this->currentTextState])){ + // then we are in some state or another + // and this font has a family, and the current setting exists within it + // select the font, then return it + $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; + $this->selectFont($nf,'',0); + $this->currentFont = $nf; + $this->currentFontNum = $this->fonts[$nf]['fontNum']; + } else { + // the this font must not have the right family member for the current state + // simply assume the base font + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + } +} + +/** +* function for the user to find out what the id is of the first page that was created during +* startup - useful if they wish to add something to it later. +*/ +function getFirstPageId(){ + return $this->firstPageId; +} + +/** +* add content to the currently active object +* +* @access private +*/ +function addContent($content){ + $this->objects[$this->currentContents]['c'].=$content; +} + +/** +* sets the colour for fill operations +*/ +function setColor($r,$g,$b,$force=0){ + if ($r>=0 && ($force || $r!=$this->currentColour['r'] || $g!=$this->currentColour['g'] || $b!=$this->currentColour['b'])){ + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$r).' '.sprintf('%.3f',$g).' '.sprintf('%.3f',$b).' rg'; + $this->currentColour=array('r'=>$r,'g'=>$g,'b'=>$b); + } +} + +/** +* sets the colour for stroke operations +*/ +function setStrokeColor($r,$g,$b,$force=0){ + if ($r>=0 && ($force || $r!=$this->currentStrokeColour['r'] || $g!=$this->currentStrokeColour['g'] || $b!=$this->currentStrokeColour['b'])){ + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$r).' '.sprintf('%.3f',$g).' '.sprintf('%.3f',$b).' RG'; + $this->currentStrokeColour=array('r'=>$r,'g'=>$g,'b'=>$b); + } +} + +/** +* draw a line from one set of coordinates to another +*/ +function line($x1,$y1,$x2,$y2){ + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$x1).' '.sprintf('%.3f',$y1).' m '.sprintf('%.3f',$x2).' '.sprintf('%.3f',$y2).' l S'; +} + +/** +* draw a bezier curve based on 4 control points +*/ +function curve($x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3){ + // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points + // as the control points for the curve. + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$x0).' '.sprintf('%.3f',$y0).' m '.sprintf('%.3f',$x1).' '.sprintf('%.3f',$y1); + $this->objects[$this->currentContents]['c'].= ' '.sprintf('%.3f',$x2).' '.sprintf('%.3f',$y2).' '.sprintf('%.3f',$x3).' '.sprintf('%.3f',$y3).' c S'; +} + +/** +* draw a part of an ellipse +*/ +function partEllipse($x0,$y0,$astart,$afinish,$r1,$r2=0,$angle=0,$nSeg=8){ + $this->ellipse($x0,$y0,$r1,$r2,$angle,$nSeg,$astart,$afinish,0); +} + +/** +* draw a filled ellipse +*/ +function filledEllipse($x0,$y0,$r1,$r2=0,$angle=0,$nSeg=8,$astart=0,$afinish=360){ + return $this->ellipse($x0,$y0,$r1,$r2=0,$angle,$nSeg,$astart,$afinish,1,1); +} + +/** +* draw an ellipse +* note that the part and filled ellipse are just special cases of this function +* +* draws an ellipse in the current line style +* centered at $x0,$y0, radii $r1,$r2 +* if $r2 is not set, then a circle is drawn +* nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a +* pretty crappy shape at 2, as we are approximating with bezier curves. +*/ +function ellipse($x0,$y0,$r1,$r2=0,$angle=0,$nSeg=8,$astart=0,$afinish=360,$close=1,$fill=0){ + if ($r1==0){ + return; + } + if ($r2==0){ + $r2=$r1; + } + if ($nSeg<2){ + $nSeg=2; + } + + $astart = deg2rad((float)$astart); + $afinish = deg2rad((float)$afinish); + $totalAngle =$afinish-$astart; + + $dt = $totalAngle/$nSeg; + $dtm = $dt/3; + + if ($angle != 0){ + $a = -1*deg2rad((float)$angle); + $tmp = "\n q "; + $tmp .= sprintf('%.3f',cos($a)).' '.sprintf('%.3f',(-1.0*sin($a))).' '.sprintf('%.3f',sin($a)).' '.sprintf('%.3f',cos($a)).' '; + $tmp .= sprintf('%.3f',$x0).' '.sprintf('%.3f',$y0).' cm'; + $this->objects[$this->currentContents]['c'].= $tmp; + $x0=0; + $y0=0; + } + + $t1 = $astart; + $a0 = $x0+$r1*cos($t1); + $b0 = $y0+$r2*sin($t1); + $c0 = -$r1*sin($t1); + $d0 = $r2*cos($t1); + + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$a0).' '.sprintf('%.3f',$b0).' m '; + for ($i=1;$i<=$nSeg;$i++){ + // draw this bit of the total curve + $t1 = $i*$dt+$astart; + $a1 = $x0+$r1*cos($t1); + $b1 = $y0+$r2*sin($t1); + $c1 = -$r1*sin($t1); + $d1 = $r2*cos($t1); + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',($a0+$c0*$dtm)).' '.sprintf('%.3f',($b0+$d0*$dtm)); + $this->objects[$this->currentContents]['c'].= ' '.sprintf('%.3f',($a1-$c1*$dtm)).' '.sprintf('%.3f',($b1-$d1*$dtm)).' '.sprintf('%.3f',$a1).' '.sprintf('%.3f',$b1).' c'; + $a0=$a1; + $b0=$b1; + $c0=$c1; + $d0=$d1; + } + if ($fill){ + $this->objects[$this->currentContents]['c'].=' f'; + } else { + if ($close){ + $this->objects[$this->currentContents]['c'].=' s'; // small 's' signifies closing the path as well + } else { + $this->objects[$this->currentContents]['c'].=' S'; + } + } + if ($angle !=0){ + $this->objects[$this->currentContents]['c'].=' Q'; + } +} + +/** +* this sets the line drawing style. +* width, is the thickness of the line in user units +* cap is the type of cap to put on the line, values can be 'butt','round','square' +* where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the +* end of the line. +* join can be 'miter', 'round', 'bevel' +* dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the +* on and off dashes. +* (2) represents 2 on, 2 off, 2 on , 2 off ... +* (2,1) is 2 on, 1 off, 2 on, 1 off.. etc +* phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. +*/ +function setLineStyle($width=1,$cap='',$join='',$dash='',$phase=0){ + + // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day + $string = ''; + if ($width>0){ + $string.= $width.' w'; + } + $ca = array('butt'=>0,'round'=>1,'square'=>2); + if (isset($ca[$cap])){ + $string.= ' '.$ca[$cap].' J'; + } + $ja = array('miter'=>0,'round'=>1,'bevel'=>2); + if (isset($ja[$join])){ + $string.= ' '.$ja[$join].' j'; + } + if (is_array($dash)){ + $string.= ' ['; + foreach ($dash as $len){ + $string.=' '.$len; + } + $string.= ' ] '.$phase.' d'; + } + $this->currentLineStyle = $string; + $this->objects[$this->currentContents]['c'].="\n".$string; +} + +/** +* draw a polygon, the syntax for this is similar to the GD polygon command +*/ +function polygon($p,$np,$f=0){ + $this->objects[$this->currentContents]['c'].="\n"; + $this->objects[$this->currentContents]['c'].=sprintf('%.3f',$p[0]).' '.sprintf('%.3f',$p[1]).' m '; + for ($i=2;$i<$np*2;$i=$i+2){ + $this->objects[$this->currentContents]['c'].= sprintf('%.3f',$p[$i]).' '.sprintf('%.3f',$p[$i+1]).' l '; + } + if ($f==1){ + $this->objects[$this->currentContents]['c'].=' f'; + } else { + $this->objects[$this->currentContents]['c'].=' S'; + } +} + +/** +* a filled rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not +* the coordinates of the upper-right corner +*/ +function filledRectangle($x1,$y1,$width,$height){ + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$x1).' '.sprintf('%.3f',$y1).' '.sprintf('%.3f',$width).' '.sprintf('%.3f',$height).' re f'; +} + +/** +* draw a rectangle, note that it is the width and height of the rectangle which are the secondary paramaters, not +* the coordinates of the upper-right corner +*/ +function rectangle($x1,$y1,$width,$height){ + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$x1).' '.sprintf('%.3f',$y1).' '.sprintf('%.3f',$width).' '.sprintf('%.3f',$height).' re S'; +} + +/** +* add a new page to the document +* this also makes the new page the current active object +*/ +function newPage($insert=0,$id=0,$pos='after'){ + + // if there is a state saved, then go up the stack closing them + // then on the new page, re-open them with the right setings + + if ($this->nStateStack){ + for ($i=$this->nStateStack;$i>=1;$i--){ + $this->restoreState($i); + } + } + + $this->numObj++; + if ($insert){ + // the id from the ezPdf class is the od of the contents of the page, not the page object itself + // query that object to find the parent + $rid = $this->objects[$id]['onPage']; + $opt= array('rid'=>$rid,'pos'=>$pos); + $this->o_page($this->numObj,'new',$opt); + } else { + $this->o_page($this->numObj,'new'); + } + // if there is a stack saved, then put that onto the page + if ($this->nStateStack){ + for ($i=1;$i<=$this->nStateStack;$i++){ + $this->saveState($i); + } + } + // and if there has been a stroke or fill colour set, then transfer them + if ($this->currentColour['r']>=0){ + $this->setColor($this->currentColour['r'],$this->currentColour['g'],$this->currentColour['b'],1); + } + if ($this->currentStrokeColour['r']>=0){ + $this->setStrokeColor($this->currentStrokeColour['r'],$this->currentStrokeColour['g'],$this->currentStrokeColour['b'],1); + } + + // if there is a line style set, then put this in too + if (strlen($this->currentLineStyle)){ + $this->objects[$this->currentContents]['c'].="\n".$this->currentLineStyle; + } + + // the call to the o_page object set currentContents to the present page, so this can be returned as the page id + return $this->currentContents; +} + +/** +* output the pdf code, streaming it to the browser +* the relevant headers are set so that hopefully the browser will recognise it +*/ +function stream($options=''){ + // setting the options allows the adjustment of the headers + // values at the moment are: + // 'Content-Disposition'=>'filename' - sets the filename, though not too sure how well this will + // work as in my trial the browser seems to use the filename of the php file with .pdf on the end + // 'Accept-Ranges'=>1 or 0 - if this is not set to 1, then this header is not included, off by default + // this header seems to have caused some problems despite tha fact that it is supposed to solve + // them, so I am leaving it off by default. + // 'compress'=> 1 or 0 - apply content stream compression, this is on (1) by default + if (!is_array($options)){ + $options=array(); + } + if ( isset($options['compress']) && $options['compress']==0){ + $tmp = $this->output(1); + } else { + $tmp = $this->output(); + } + header("Content-type: application/pdf"); + header("Content-Length: ".strlen(ltrim($tmp))); + $fileName = (isset($options['Content-Disposition'])?$options['Content-Disposition']:'file.pdf'); + header("Content-Disposition: inline; filename=".$fileName); + if (isset($options['Accept-Ranges']) && $options['Accept-Ranges']==1){ + header("Accept-Ranges: ".strlen(ltrim($tmp))); + } + echo ltrim($tmp); +} + +/** +* return the height in units of the current font in the given size +*/ +function getFontHeight($size){ + if (!$this->numFonts){ + $this->selectFont('./fonts/Helvetica'); + } + // for the current font, and the given size, what is the height of the font in user units + $h = $this->fonts[$this->currentFont]['FontBBox'][3]-$this->fonts[$this->currentFont]['FontBBox'][1]; + return $size*$h/1000; +} + +/** +* return the font decender, this will normally return a negative number +* if you add this number to the baseline, you get the level of the bottom of the font +* it is in the pdf user units +*/ +function getFontDecender($size){ + // note that this will most likely return a negative value + if (!$this->numFonts){ + $this->selectFont('./fonts/Helvetica'); + } + $h = $this->fonts[$this->currentFont]['FontBBox'][1]; + return $size*$h/1000; +} + +/** +* filter the text, this is applied to all text just before being inserted into the pdf document +* it escapes the various things that need to be escaped, and so on +* +* @access private +*/ +function filterText($text){ + $text = str_replace('\\','\\\\',$text); + $text = str_replace('(','\(',$text); + $text = str_replace(')','\)',$text); + $text = str_replace('<','<',$text); + $text = str_replace('>','>',$text); + $text = str_replace(''','\'',$text); + $text = str_replace('"','"',$text); + $text = str_replace('&','&',$text); + + return $text; +} + +/** +* given a start position and information about how text is to be laid out, calculate where +* on the page the text will end +* +* @access private +*/ +function PRVTgetTextPosition($x,$y,$angle,$size,$wa,$text){ + // given this information return an array containing x and y for the end position as elements 0 and 1 + $w = $this->getTextWidth($size,$text); + // need to adjust for the number of spaces in this text + $words = explode(' ',$text); + $nspaces=count($words)-1; + $w += $wa*$nspaces; + $a = deg2rad((float)$angle); + return array(cos($a)*$w+$x,-sin($a)*$w+$y); +} + +/** +* wrapper function for PRVTcheckTextDirective1 +* +* @access private +*/ +function PRVTcheckTextDirective(&$text,$i,&$f){ + $x=0; + $y=0; + return $this->PRVTcheckTextDirective1($text,$i,$f,0,$x,$y); +} + +/** +* checks if the text stream contains a control directive +* if so then makes some changes and returns the number of characters involved in the directive +* this has been re-worked to include everything neccesary to fins the current writing point, so that +* the location can be sent to the callback function if required +* if the directive does not require a font change, then $f should be set to 0 +* +* @access private +*/ +function PRVTcheckTextDirective1(&$text,$i,&$f,$final,&$x,&$y,$size=0,$angle=0,$wordSpaceAdjust=0){ + $directive = 0; + $j=$i; + if ($text[$j]=='<'){ + $j++; + switch($text[$j]){ + case '/': + $j++; + if (strlen($text) <= $j){ + return $directive; + } + switch($text[$j]){ + case 'b': + case 'i': + $j++; + if ($text[$j]=='>'){ + $p = strrpos($this->currentTextState,$text[$j-1]); + if ($p !== false){ + // then there is one to remove + $this->currentTextState = substr($this->currentTextState,0,$p).substr($this->currentTextState,$p+1); + } + $directive=$j-$i+1; + } + break; + case 'c': + // this this might be a callback function + $j++; + $k = strpos($text,'>',$j); + if ($k!==false && $text[$j]==':'){ + // then this will be treated as a callback directive + $directive = $k-$i+1; + $f=0; + // split the remainder on colons to get the function name and the paramater + $tmp = substr($text,$j+1,$k-$j-1); + $b1 = strpos($tmp,':'); + if ($b1!==false){ + $func = substr($tmp,0,$b1); + $parm = substr($tmp,$b1+1); + } else { + $func=$tmp; + $parm=''; + } + if (!isset($func) || !strlen(trim($func))){ + $directive=0; + } else { + // only call the function if this is the final call + if ($final){ + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + $tmp = $this->PRVTgetTextPosition($x,$y,$angle,$size,$wordSpaceAdjust,substr($text,0,$i)); + $info = array('x'=>$tmp[0],'y'=>$tmp[1],'angle'=>$angle,'status'=>'end','p'=>$parm,'nCallback'=>$this->nCallback); + $x=$tmp[0]; + $y=$tmp[1]; + $ret = $this->$func($info); + if (is_array($ret)){ + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk=>$rv){ + switch($rk){ + case 'x': + case 'y': + $$rk=$rv; + break; + } + } + } + // also remove from to the stack + // for simplicity, just take from the end, fix this another day + $this->nCallback--; + if ($this->nCallback<0){ + $this->nCallBack=0; + } + } + } + } + break; + } + break; + case 'b': + case 'i': + $j++; + if ($text[$j]=='>'){ + $this->currentTextState.=$text[$j-1]; + $directive=$j-$i+1; + } + break; + case 'C': + $noClose=1; + case 'c': + // this this might be a callback function + $j++; + $k = strpos($text,'>',$j); + if ($k!==false && $text[$j]==':'){ + // then this will be treated as a callback directive + $directive = $k-$i+1; + $f=0; + // split the remainder on colons to get the function name and the paramater +// $bits = explode(':',substr($text,$j+1,$k-$j-1)); + $tmp = substr($text,$j+1,$k-$j-1); + $b1 = strpos($tmp,':'); + if ($b1!==false){ + $func = substr($tmp,0,$b1); + $parm = substr($tmp,$b1+1); + } else { + $func=$tmp; + $parm=''; + } + if (!isset($func) || !strlen(trim($func))){ + $directive=0; + } else { + // only call the function if this is the final call, ie, the one actually doing printing, not measurement + if ($final){ + // need to assess the text position, calculate the text width to this point + // can use getTextWidth to find the text width I think + // also add the text height and decender + $tmp = $this->PRVTgetTextPosition($x,$y,$angle,$size,$wordSpaceAdjust,substr($text,0,$i)); + $info = array('x'=>$tmp[0],'y'=>$tmp[1],'angle'=>$angle,'status'=>'start','p'=>$parm,'f'=>$func,'height'=>$this->getFontHeight($size),'decender'=>$this->getFontDecender($size)); + $x=$tmp[0]; + $y=$tmp[1]; + if (!isset($noClose) || !$noClose){ + // only add to the stack if this is a small 'c', therefore is a start-stop pair + $this->nCallback++; + $info['nCallback']=$this->nCallback; + $this->callback[$this->nCallback]=$info; + } + $ret = $this->$func($info); + if (is_array($ret)){ + // then the return from the callback function could set the position, to start with, later will do font colour, and font + foreach($ret as $rk=>$rv){ + switch($rk){ + case 'x': + case 'y': + $$rk=$rv; + break; + } + } + } + } + } + } + break; + } + } + return $directive; +} + +/** +* add text to the document, at a specified location, size and angle on the page +*/ +function addText($x,$y,$size,$text,$angle=0,$wordSpaceAdjust=0){ + if (!$this->numFonts){$this->selectFont('./fonts/Helvetica');} + + // if there are any open callbacks, then they should be called, to show the start of the line + if ($this->nCallback>0){ + for ($i=$this->nCallback;$i>0;$i--){ + // call each function + $info = array('x'=>$x,'y'=>$y,'angle'=>$angle,'status'=>'sol','p'=>$this->callback[$i]['p'],'nCallback'=>$this->callback[$i]['nCallback'],'height'=>$this->callback[$i]['height'],'decender'=>$this->callback[$i]['decender']); + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + if ($angle==0){ + $this->objects[$this->currentContents]['c'].="\n".'BT '.sprintf('%.3f',$x).' '.sprintf('%.3f',$y).' Td'; + } else { + $a = deg2rad((float)$angle); + $tmp = "\n".'BT '; + $tmp .= sprintf('%.3f',cos($a)).' '.sprintf('%.3f',(-1.0*sin($a))).' '.sprintf('%.3f',sin($a)).' '.sprintf('%.3f',cos($a)).' '; + $tmp .= sprintf('%.3f',$x).' '.sprintf('%.3f',$y).' Tm'; + $this->objects[$this->currentContents]['c'] .= $tmp; + } + if ($wordSpaceAdjust!=0 || $wordSpaceAdjust != $this->wordSpaceAdjust){ + $this->wordSpaceAdjust=$wordSpaceAdjust; + $this->objects[$this->currentContents]['c'].=' '.sprintf('%.3f',$wordSpaceAdjust).' Tw'; + } + $len=strlen($text); + $start=0; + for ($i=0;$i<$len;$i++){ + $f=1; + $directive = $this->PRVTcheckTextDirective($text,$i,$f); + if ($directive){ + // then we should write what we need to + if ($i>$start){ + $part = substr($text,$start,$i-$start); + $this->objects[$this->currentContents]['c'].=' /F'.$this->currentFontNum.' '.sprintf('%.1f',$size).' Tf '; + $this->objects[$this->currentContents]['c'].=' ('.$this->filterText($part).') Tj'; + } + if ($f){ + // then there was nothing drastic done here, restore the contents + $this->setCurrentFont(); + } else { + $this->objects[$this->currentContents]['c'] .= ' ET'; + $f=1; + $xp=$x; + $yp=$y; + $directive = $this->PRVTcheckTextDirective1($text,$i,$f,1,$xp,$yp,$size,$angle,$wordSpaceAdjust); + + // restart the text object + if ($angle==0){ + $this->objects[$this->currentContents]['c'].="\n".'BT '.sprintf('%.3f',$xp).' '.sprintf('%.3f',$yp).' Td'; + } else { + $a = deg2rad((float)$angle); + $tmp = "\n".'BT '; + $tmp .= sprintf('%.3f',cos($a)).' '.sprintf('%.3f',(-1.0*sin($a))).' '.sprintf('%.3f',sin($a)).' '.sprintf('%.3f',cos($a)).' '; + $tmp .= sprintf('%.3f',$xp).' '.sprintf('%.3f',$yp).' Tm'; + $this->objects[$this->currentContents]['c'] .= $tmp; + } + if ($wordSpaceAdjust!=0 || $wordSpaceAdjust != $this->wordSpaceAdjust){ + $this->wordSpaceAdjust=$wordSpaceAdjust; + $this->objects[$this->currentContents]['c'].=' '.sprintf('%.3f',$wordSpaceAdjust).' Tw'; + } + } + // and move the writing point to the next piece of text + $i=$i+$directive-1; + $start=$i+1; + } + + } + if ($start<$len){ + $part = substr($text,$start); + $this->objects[$this->currentContents]['c'].=' /F'.$this->currentFontNum.' '.sprintf('%.1f',$size).' Tf '; + $this->objects[$this->currentContents]['c'].=' ('.$this->filterText($part).') Tj'; + } + $this->objects[$this->currentContents]['c'].=' ET'; + + // if there are any open callbacks, then they should be called, to show the end of the line + if ($this->nCallback>0){ + for ($i=$this->nCallback;$i>0;$i--){ + // call each function + $tmp = $this->PRVTgetTextPosition($x,$y,$angle,$size,$wordSpaceAdjust,$text); + $info = array('x'=>$tmp[0],'y'=>$tmp[1],'angle'=>$angle,'status'=>'eol','p'=>$this->callback[$i]['p'],'nCallback'=>$this->callback[$i]['nCallback'],'height'=>$this->callback[$i]['height'],'decender'=>$this->callback[$i]['decender']); + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + +} + +/** +* calculate how wide a given text string will be on a page, at a given size. +* this can be called externally, but is alse used by the other class functions +*/ +function getTextWidth($size,$text){ + // this function should not change any of the settings, though it will need to + // track any directives which change during calculation, so copy them at the start + // and put them back at the end. + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts){ + $this->selectFont('./fonts/Helvetica'); + } + + // converts a number or a float to a string so it can get the width + $text = "$text"; + + // hmm, this is where it all starts to get tricky - use the font information to + // calculate the width of each character, add them up and convert to user units + $w=0; + $len=strlen($text); + $cf = $this->currentFont; + for ($i=0;$i<$len;$i++){ + $f=1; + $directive = $this->PRVTcheckTextDirective($text,$i,$f); + if ($directive){ + if ($f){ + $this->setCurrentFont(); + $cf = $this->currentFont; + } + $i=$i+$directive-1; + } else { + $char=ord($text[$i]); + if (isset($this->fonts[$cf]['differences'][$char])){ + // then this character is being replaced by another + $name = $this->fonts[$cf]['differences'][$char]; + if (isset($this->fonts[$cf]['C'][$name]['WX'])){ + $w+=$this->fonts[$cf]['C'][$name]['WX']; + } + } else if (isset($this->fonts[$cf]['C'][$char]['WX'])){ + $w+=$this->fonts[$cf]['C'][$char]['WX']; + } + } + } + + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + return $w*$size/1000; +} + +/** +* do a part of the calculation for sorting out the justification of the text +* +* @access private +*/ +function PRVTadjustWrapText($text,$actual,$width,&$x,&$adjust,$justification){ + switch ($justification){ + case 'left': + return; + break; + case 'right': + $x+=$width-$actual; + break; + case 'center': + case 'centre': + $x+=($width-$actual)/2; + break; + case 'full': + // count the number of words + $words = explode(' ',$text); + $nspaces=count($words)-1; + if ($nspaces>0){ + $adjust = ($width-$actual)/$nspaces; + } else { + $adjust=0; + } + break; + } +} + +/** +* add text to the page, but ensure that it fits within a certain width +* if it does not fit then put in as much as possible, splitting at word boundaries +* and return the remainder. +* justification and angle can also be specified for the text +*/ +function addTextWrap($x,$y,$width,$size,$text,$justification='left',$angle=0,$test=0){ + // this will display the text, and if it goes beyond the width $width, will backtrack to the + // previous space or hyphen, and return the remainder of the text. + + // $justification can be set to 'left','right','center','centre','full' + + // need to store the initial text state, as this will change during the width calculation + // but will need to be re-set before printing, so that the chars work out right + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts){$this->selectFont('./fonts/Helvetica');} + if ($width<=0){ + // error, pretend it printed ok, otherwise risking a loop + return ''; + } + $w=0; + $break=0; + $breakWidth=0; + $len=strlen($text); + $cf = $this->currentFont; + $tw = $width/$size*1000; + for ($i=0;$i<$len;$i++){ + $f=1; + $directive = $this->PRVTcheckTextDirective($text,$i,$f); + if ($directive){ + if ($f){ + $this->setCurrentFont(); + $cf = $this->currentFont; + } + $i=$i+$directive-1; + } else { + $cOrd = ord($text[$i]); + if (isset($this->fonts[$cf]['differences'][$cOrd])){ + // then this character is being replaced by another + $cOrd2 = $this->fonts[$cf]['differences'][$cOrd]; + } else { + $cOrd2 = $cOrd; + } + + if (isset($this->fonts[$cf]['C'][$cOrd2]['WX'])){ + $w+=$this->fonts[$cf]['C'][$cOrd2]['WX']; + } + if ($w>$tw){ + // then we need to truncate this line + if ($break>0){ + // then we have somewhere that we can split :) + if ($text[$break]==' '){ + $tmp = substr($text,0,$break); + } else { + $tmp = substr($text,0,$break+1); + } + $adjust=0; + $this->PRVTadjustWrapText($tmp,$breakWidth,$width,$x,$adjust,$justification); + + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + if (!$test){ + $this->addText($x,$y,$size,$tmp,$angle,$adjust); + } + return substr($text,$break+1); + } else { + // just split before the current character + $tmp = substr($text,0,$i); + $adjust=0; + $ctmp=ord($text[$i]); + if (isset($this->fonts[$cf]['differences'][$ctmp])){ + $ctmp=$this->fonts[$cf]['differences'][$ctmp]; + } + $tmpw=($w-$this->fonts[$cf]['C'][$ctmp]['WX'])*$size/1000; + $this->PRVTadjustWrapText($tmp,$tmpw,$width,$x,$adjust,$justification); + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + if (!$test){ + $this->addText($x,$y,$size,$tmp,$angle,$adjust); + } + return substr($text,$i); + } + } + if ($text[$i]=='-'){ + $break=$i; + $breakWidth = $w*$size/1000; + } + if ($text[$i]==' '){ + $break=$i; + $ctmp=ord($text[$i]); + if (isset($this->fonts[$cf]['differences'][$ctmp])){ + $ctmp=$this->fonts[$cf]['differences'][$ctmp]; + } + $breakWidth = ($w-$this->fonts[$cf]['C'][$ctmp]['WX'])*$size/1000; + } + } + } + // then there was no need to break this line + if ($justification=='full'){ + $justification='left'; + } + $adjust=0; + $tmpw=$w*$size/1000; + $this->PRVTadjustWrapText($text,$tmpw,$width,$x,$adjust,$justification); + // reset the text state + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + if (!$test){ + $this->addText($x,$y,$size,$text,$angle,$adjust,$angle); + } + return ''; +} + +/** +* this will be called at a new page to return the state to what it was on the +* end of the previous page, before the stack was closed down +* This is to get around not being able to have open 'q' across pages +* +*/ +function saveState($pageEnd=0){ + if ($pageEnd){ + // this will be called at a new page to return the state to what it was on the + // end of the previous page, before the stack was closed down + // This is to get around not being able to have open 'q' across pages + $opt = $this->stateStack[$pageEnd]; // ok to use this as stack starts numbering at 1 + $this->setColor($opt['col']['r'],$opt['col']['g'],$opt['col']['b'],1); + $this->setStrokeColor($opt['str']['r'],$opt['str']['g'],$opt['str']['b'],1); + $this->objects[$this->currentContents]['c'].="\n".$opt['lin']; +// $this->currentLineStyle = $opt['lin']; + } else { + $this->nStateStack++; + $this->stateStack[$this->nStateStack]=array( + 'col'=>$this->currentColour + ,'str'=>$this->currentStrokeColour + ,'lin'=>$this->currentLineStyle + ); + } + $this->objects[$this->currentContents]['c'].="\nq"; +} + +/** +* restore a previously saved state +*/ +function restoreState($pageEnd=0){ + if (!$pageEnd){ + $n = $this->nStateStack; + $this->currentColour = $this->stateStack[$n]['col']; + $this->currentStrokeColour = $this->stateStack[$n]['str']; + $this->objects[$this->currentContents]['c'].="\n".$this->stateStack[$n]['lin']; + $this->currentLineStyle = $this->stateStack[$n]['lin']; + unset($this->stateStack[$n]); + $this->nStateStack--; + } + $this->objects[$this->currentContents]['c'].="\nQ"; +} + +/** +* make a loose object, the output will go into this object, until it is closed, then will revert to +* the current one. +* this object will not appear until it is included within a page. +* the function will return the object number +*/ +function openObject(){ + $this->nStack++; + $this->stack[$this->nStack]=array('c'=>$this->currentContents,'p'=>$this->currentPage); + // add a new object of the content type, to hold the data flow + $this->numObj++; + $this->o_contents($this->numObj,'new'); + $this->currentContents=$this->numObj; + $this->looseObjects[$this->numObj]=1; + + return $this->numObj; +} + +/** +* open an existing object for editing +*/ +function reopenObject($id){ + $this->nStack++; + $this->stack[$this->nStack]=array('c'=>$this->currentContents,'p'=>$this->currentPage); + $this->currentContents=$id; + // also if this object is the primary contents for a page, then set the current page to its parent + if (isset($this->objects[$id]['onPage'])){ + $this->currentPage = $this->objects[$id]['onPage']; + } +} + +/** +* close an object +*/ +function closeObject(){ + // close the object, as long as there was one open in the first place, which will be indicated by + // an objectId on the stack. + if ($this->nStack>0){ + $this->currentContents=$this->stack[$this->nStack]['c']; + $this->currentPage=$this->stack[$this->nStack]['p']; + $this->nStack--; + // easier to probably not worry about removing the old entries, they will be overwritten + // if there are new ones. + } +} + +/** +* stop an object from appearing on pages from this point on +*/ +function stopObject($id){ + // if an object has been appearing on pages up to now, then stop it, this page will + // be the last one that could contian it. + if (isset($this->addLooseObjects[$id])){ + $this->addLooseObjects[$id]=''; + } +} + +/** +* after an object has been created, it wil only show if it has been added, using this function. +*/ +function addObject($id,$options='add'){ + // add the specified object to the page + if (isset($this->looseObjects[$id]) && $this->currentContents!=$id){ + // then it is a valid object, and it is not being added to itself + switch($options){ + case 'all': + // then this object is to be added to this page (done in the next block) and + // all future new pages. + $this->addLooseObjects[$id]='all'; + case 'add': + if (isset($this->objects[$this->currentContents]['onPage'])){ + // then the destination contents is the primary for the page + // (though this object is actually added to that page) + $this->o_page($this->objects[$this->currentContents]['onPage'],'content',$id); + } + break; + case 'even': + $this->addLooseObjects[$id]='even'; + $pageObjectId=$this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2==0){ + $this->addObject($id); // hacky huh :) + } + break; + case 'odd': + $this->addLooseObjects[$id]='odd'; + $pageObjectId=$this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum']%2==1){ + $this->addObject($id); // hacky huh :) + } + break; + case 'next': + $this->addLooseObjects[$id]='all'; + break; + case 'nexteven': + $this->addLooseObjects[$id]='even'; + break; + case 'nextodd': + $this->addLooseObjects[$id]='odd'; + break; + } + } +} + +/** +* add content to the documents info object +*/ +function addInfo($label,$value=0){ + // this will only work if the label is one of the valid ones. + // modify this so that arrays can be passed as well. + // if $label is an array then assume that it is key=>value pairs + // else assume that they are both scalar, anything else will probably error + if (is_array($label)){ + foreach ($label as $l=>$v){ + $this->o_info($this->infoObject,$l,$v); + } + } else { + $this->o_info($this->infoObject,$label,$value); + } +} + +/** +* set the viewer preferences of the document, it is up to the browser to obey these. +*/ +function setPreferences($label,$value=0){ + // this will only work if the label is one of the valid ones. + if (is_array($label)){ + foreach ($label as $l=>$v){ + $this->o_catalog($this->catalogId,'viewerPreferences',array($l=>$v)); + } + } else { + $this->o_catalog($this->catalogId,'viewerPreferences',array($label=>$value)); + } +} + +/** +* extract an integer from a position in a byte stream +* +* @access private +*/ +function PRVT_getBytes(&$data,$pos,$num){ + // return the integer represented by $num bytes from $pos within $data + $ret=0; + for ($i=0;$i<$num;$i++){ + $ret=$ret*256; + $ret+=ord($data[$pos+$i]); + } + return $ret; +} + +/** +* add a PNG image into the document, from a file +* this should work with remote files +*/ +function addPngFromFile($file,$x,$y,$w=0,$h=0){ + // read in a png file, interpret it, then add to the system + $error=0; + $tmp = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $fp = @fopen($file,'rb'); + if ($fp){ + $data=''; + while(!feof($fp)){ + $data .= fread($fp,1024); + } + fclose($fp); + } else { + $error = 1; + $errormsg = 'trouble opening file: '.$file; + } + set_magic_quotes_runtime($tmp); + + if (!$error){ + $header = chr(137).chr(80).chr(78).chr(71).chr(13).chr(10).chr(26).chr(10); + if (substr($data,0,8)!=$header){ + $error=1; + $errormsg = 'this file does not have a valid header'; + } + } + + if (!$error){ + // set pointer + $p = 8; + $len = strlen($data); + // cycle through the file, identifying chunks + $haveHeader=0; + $info=array(); + $idata=''; + $pdata=''; + while ($p<$len){ + $chunkLen = $this->PRVT_getBytes($data,$p,4); + $chunkType = substr($data,$p+4,4); +// echo $chunkType.' - '.$chunkLen.'
'; + + switch($chunkType){ + case 'IHDR': + // this is where all the file information comes from + $info['width']=$this->PRVT_getBytes($data,$p+8,4); + $info['height']=$this->PRVT_getBytes($data,$p+12,4); + $info['bitDepth']=ord($data[$p+16]); + $info['colorType']=ord($data[$p+17]); + $info['compressionMethod']=ord($data[$p+18]); + $info['filterMethod']=ord($data[$p+19]); + $info['interlaceMethod']=ord($data[$p+20]); +//print_r($info); + $haveHeader=1; + if ($info['compressionMethod']!=0){ + $error=1; + $errormsg = 'unsupported compression method'; + } + if ($info['filterMethod']!=0){ + $error=1; + $errormsg = 'unsupported filter method'; + } + break; + case 'PLTE': + $pdata.=substr($data,$p+8,$chunkLen); + break; + case 'IDAT': + $idata.=substr($data,$p+8,$chunkLen); + break; + case 'tRNS': + //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk + //print "tRNS found, color type = ".$info['colorType']."
"; + $transparency = array(); + if ($info['colorType'] == 3) { // indexed color, rbg + /* corresponding to entries in the plte chunk + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + */ + // there will be one entry for each palette entry. up until the last non-opaque entry. + // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) + $transparency['type']='indexed'; + $numPalette = strlen($pdata)/3; + $trans=0; + for ($i=$chunkLen;$i>=0;$i--){ + if (ord($data[$p+8+$i])==0){ + $trans=$i; + } + } + $transparency['data'] = $trans; + + } elseif($info['colorType'] == 0) { // grayscale + /* corresponding to entries in the plte chunk + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + */ +// $transparency['grayscale']=$this->PRVT_getBytes($data,$p+8,2); // g = grayscale + $transparency['type']='indexed'; + $transparency['data'] = ord($data[$p+8+1]); + + } elseif($info['colorType'] == 2) { // truecolor + /* corresponding to entries in the plte chunk + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + $transparency['r']=$this->PRVT_getBytes($data,$p+8,2); // r from truecolor + $transparency['g']=$this->PRVT_getBytes($data,$p+10,2); // g from truecolor + $transparency['b']=$this->PRVT_getBytes($data,$p+12,2); // b from truecolor + + } else { + //unsupported transparency type + } + // KS End new code + break; + default: + break; + } + + $p += $chunkLen+12; + } + + if(!$haveHeader){ + $error = 1; + $errormsg = 'information header is missing'; + } + if (isset($info['interlaceMethod']) && $info['interlaceMethod']){ + $error = 1; + $errormsg = 'There appears to be no support for interlaced images in pdf.'; + } + } + + if (!$error && $info['bitDepth'] > 8){ + $error = 1; + $errormsg = 'only bit depth of 8 or less is supported'; + } + + if (!$error){ + if ($info['colorType']!=2 && $info['colorType']!=0 && $info['colorType']!=3){ + $error = 1; + $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.'; + } else { + switch ($info['colorType']){ + case 3: + $color = 'DeviceRGB'; + $ncolor=1; + break; + case 2: + $color = 'DeviceRGB'; + $ncolor=3; + break; + case 0: + $color = 'DeviceGray'; + $ncolor=1; + break; + } + } + } + if ($error){ + $this->addMessage('PNG error - ('.$file.') '.$errormsg); + return; + } + if ($w==0){ + $w=$h/$info['height']*$info['width']; + } + if ($h==0){ + $h=$w*$info['height']/$info['width']; + } +//print_r($info); + // so this image is ok... add it in. + $this->numImages++; + $im=$this->numImages; + $label='I'.$im; + $this->numObj++; +// $this->o_image($this->numObj,'new',array('label'=>$label,'data'=>$idata,'iw'=>$w,'ih'=>$h,'type'=>'png','ic'=>$info['width'])); + $options = array('label'=>$label,'data'=>$idata,'bitsPerComponent'=>$info['bitDepth'],'pdata'=>$pdata + ,'iw'=>$info['width'],'ih'=>$info['height'],'type'=>'png','color'=>$color,'ncolor'=>$ncolor); + if (isset($transparency)){ + $options['transparency']=$transparency; + } + $this->o_image($this->numObj,'new',$options); + + $this->objects[$this->currentContents]['c'].="\nq"; + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$w)." 0 0 ".sprintf('%.3f',$h)." ".sprintf('%.3f',$x)." ".sprintf('%.3f',$y)." cm"; + $this->objects[$this->currentContents]['c'].="\n/".$label.' Do'; + $this->objects[$this->currentContents]['c'].="\nQ"; +} + +/** +* add a JPEG image into the document, from a file +*/ +function addJpegFromFile($img,$x,$y,$w=0,$h=0){ + // attempt to add a jpeg image straight from a file, using no GD commands + // note that this function is unable to operate on a remote file. + + if (!file_exists($img)){ + return; + } + + $tmp=getimagesize($img); + $imageWidth=$tmp[0]; + $imageHeight=$tmp[1]; + + if (isset($tmp['channels'])){ + $channels = $tmp['channels']; + } else { + $channels = 3; + } + + if ($w<=0 && $h<=0){ + $w=$imageWidth; + } + if ($w==0){ + $w=$h/$imageHeight*$imageWidth; + } + if ($h==0){ + $h=$w*$imageHeight/$imageWidth; + } + + $fp=fopen($img,'rb'); + + $tmp = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $data = fread($fp,filesize($img)); + set_magic_quotes_runtime($tmp); + + fclose($fp); + + $this->addJpegImage_common($data,$x,$y,$w,$h,$imageWidth,$imageHeight,$channels); +} + +/** +* add an image into the document, from a GD object +* this function is not all that reliable, and I would probably encourage people to use +* the file based functions +*/ +function addImage(&$img,$x,$y,$w=0,$h=0,$quality=75){ + // add a new image into the current location, as an external object + // add the image at $x,$y, and with width and height as defined by $w & $h + + // note that this will only work with full colour images and makes them jpg images for display + // later versions could present lossless image formats if there is interest. + + // there seems to be some problem here in that images that have quality set above 75 do not appear + // not too sure why this is, but in the meantime I have restricted this to 75. + if ($quality>75){ + $quality=75; + } + + // if the width or height are set to zero, then set the other one based on keeping the image + // height/width ratio the same, if they are both zero, then give up :) + $imageWidth=imagesx($img); + $imageHeight=imagesy($img); + + if ($w<=0 && $h<=0){ + return; + } + if ($w==0){ + $w=$h/$imageHeight*$imageWidth; + } + if ($h==0){ + $h=$w*$imageHeight/$imageWidth; + } + + // gotta get the data out of the img.. + + // so I write to a temp file, and then read it back.. soo ugly, my apologies. + $tmpDir='/tmp'; + $tmpName=tempnam($tmpDir,'img'); + imagejpeg($img,$tmpName,$quality); + $fp=fopen($tmpName,'rb'); + + $tmp = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $fp = @fopen($tmpName,'rb'); + if ($fp){ + $data=''; + while(!feof($fp)){ + $data .= fread($fp,1024); + } + fclose($fp); + } else { + $error = 1; + $errormsg = 'trouble opening file'; + } +// $data = fread($fp,filesize($tmpName)); + set_magic_quotes_runtime($tmp); +// fclose($fp); + unlink($tmpName); + $this->addJpegImage_common($data,$x,$y,$w,$h,$imageWidth,$imageHeight); +} + +/** +* common code used by the two JPEG adding functions +* +* @access private +*/ +function addJpegImage_common(&$data,$x,$y,$w=0,$h=0,$imageWidth,$imageHeight,$channels=3){ + // note that this function is not to be called externally + // it is just the common code between the GD and the file options + $this->numImages++; + $im=$this->numImages; + $label='I'.$im; + $this->numObj++; + $this->o_image($this->numObj,'new',array('label'=>$label,'data'=>$data,'iw'=>$imageWidth,'ih'=>$imageHeight,'channels'=>$channels)); + + $this->objects[$this->currentContents]['c'].="\nq"; + $this->objects[$this->currentContents]['c'].="\n".sprintf('%.3f',$w)." 0 0 ".sprintf('%.3f',$h)." ".sprintf('%.3f',$x)." ".sprintf('%.3f',$y)." cm"; + $this->objects[$this->currentContents]['c'].="\n/".$label.' Do'; + $this->objects[$this->currentContents]['c'].="\nQ"; +} + +/** +* specify where the document should open when it first starts +*/ +function openHere($style,$a=0,$b=0,$c=0){ + // this function will open the document at a specified page, in a specified style + // the values for style, and the required paramters are: + // 'XYZ' left, top, zoom + // 'Fit' + // 'FitH' top + // 'FitV' left + // 'FitR' left,bottom,right + // 'FitB' + // 'FitBH' top + // 'FitBV' left + $this->numObj++; + $this->o_destination($this->numObj,'new',array('page'=>$this->currentPage,'type'=>$style,'p1'=>$a,'p2'=>$b,'p3'=>$c)); + $id = $this->catalogId; + $this->o_catalog($id,'openHere',$this->numObj); +} + +/** +* create a labelled destination within the document +*/ +function addDestination($label,$style,$a=0,$b=0,$c=0){ + // associates the given label with the destination, it is done this way so that a destination can be specified after + // it has been linked to + // styles are the same as the 'openHere' function + $this->numObj++; + $this->o_destination($this->numObj,'new',array('page'=>$this->currentPage,'type'=>$style,'p1'=>$a,'p2'=>$b,'p3'=>$c)); + $id = $this->numObj; + // store the label->idf relationship, note that this means that labels can be used only once + $this->destinations["$label"]=$id; +} + +/** +* define font families, this is used to initialize the font families for the default fonts +* and for the user to add new ones for their fonts. The default bahavious can be overridden should +* that be desired. +*/ +function setFontFamily($family,$options=''){ + if (!is_array($options)){ + if ($family=='init'){ + // set the known family groups + // these font families will be used to enable bold and italic markers to be included + // within text streams. html forms will be used... + $this->fontFamilies['Helvetica.afm']=array( + 'b'=>'Helvetica-Bold.afm' + ,'i'=>'Helvetica-Oblique.afm' + ,'bi'=>'Helvetica-BoldOblique.afm' + ,'ib'=>'Helvetica-BoldOblique.afm' + ); + $this->fontFamilies['Courier.afm']=array( + 'b'=>'Courier-Bold.afm' + ,'i'=>'Courier-Oblique.afm' + ,'bi'=>'Courier-BoldOblique.afm' + ,'ib'=>'Courier-BoldOblique.afm' + ); + $this->fontFamilies['Times-Roman.afm']=array( + 'b'=>'Times-Bold.afm' + ,'i'=>'Times-Italic.afm' + ,'bi'=>'Times-BoldItalic.afm' + ,'ib'=>'Times-BoldItalic.afm' + ); + } + } else { + // the user is trying to set a font family + // note that this can also be used to set the base ones to something else + if (strlen($family)){ + $this->fontFamilies[$family] = $options; + } + } +} + +/** +* used to add messages for use in debugging +*/ +function addMessage($message){ + $this->messages.=$message."\n"; +} + +/** +* a few functions which should allow the document to be treated transactionally. +*/ +function transaction($action){ + switch ($action){ + case 'start': + // store all the data away into the checkpoint variable + $data = get_object_vars($this); + $this->checkpoint = $data; + unset($data); + break; + case 'commit': + if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])){ + $tmp = $this->checkpoint['checkpoint']; + $this->checkpoint = $tmp; + unset($tmp); + } else { + $this->checkpoint=''; + } + break; + case 'rewind': + // do not destroy the current checkpoint, but move us back to the state then, so that we can try again + if (is_array($this->checkpoint)){ + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k=>$v){ + if ($k != 'checkpoint'){ + $this->$k=$v; + } + } + unset($tmp); + } + break; + case 'abort': + if (is_array($this->checkpoint)){ + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k=>$v){ + $this->$k=$v; + } + unset($tmp); + } + break; + } + +} + +} // end of class + +?> \ No newline at end of file diff --git a/reporting/includes/doctext.inc b/reporting/includes/doctext.inc new file mode 100644 index 00000000..7a4642c4 --- /dev/null +++ b/reporting/includes/doctext.inc @@ -0,0 +1,83 @@ +title = _("PURCHASE ORDER"); + else if ($doctype == 9) + $this->title = _("SALES ORDER"); + else if ($doctype == 10) + $this->title = _("INVOICE"); + else + $this->title = _("CREDIT NOTE"); + if ($doctype == 8) + $this->headers = array(_("Item Code"), _("Item Description"), + _("Delivery Date"), _("Quantity"), _("Unit"), _("Price"), _("Total")); + else + $this->headers = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Price"), _("Discount %"), _("Total")); + } + else if ($doctype == 12) + { + $this->title = _("STATEMENT"); + $this->headers = array(_("Trans Type"), _("#"), _("Date"), _("DueDate"), _("Charges"), + _("Credits"), _("Allocated"), _("Outstanding")); + } +} +if (isset($emailtype)) +{ + $doc_Dear_Sirs = _("Dear Sirs"); + $doc_AttachedFile = _("Attached you will find "); + $doc_Kindest_regards = _("Kindest regards"); +} +if (isset($header2type) || isset($linetype)) +{ + $doc_Invoice_no = _("Invoice no."); + $doc_Order_no = _("Order no."); +} +if (isset($linetype)) +{ + if ($doctype == 8 || $doctype == 9 || $doctype == 10 || $doctype == 11) + { + $doc_Sub_total = _("Sub-total"); + $doc_Shipping = _("Shipping"); + $doc_Included = _("Included"); + $doc_Amount = _("Amount"); + $doc_TOTAL_INVOICE = _("TOTAL INVOICE"); + $doc_TOTAL_ORDER = _("TOTAL ORDER EX VAT"); + $doc_TOTAL_PO = _("TOTAL PO EX VAT"); + } + else if ($doctype == 12) + { + $doc_Outstanding = _("Outstanding Transactions"); + $doc_Current = _("Current"); + $doc_Total_Balance = _("Total Balance"); + $doc_Statement = _("Statement"); + $doc_as_of = _("as of"); + $doc_Days = _("Days"); + $doc_Over = _("Over"); + } +} +?> \ No newline at end of file diff --git a/reporting/includes/doctext2.inc b/reporting/includes/doctext2.inc new file mode 100644 index 00000000..b042aa08 --- /dev/null +++ b/reporting/includes/doctext2.inc @@ -0,0 +1,83 @@ +title = "PURCHASE ORDER"; + else if ($doctype == 9) + $this->title = "SALES ORDER"; + else if ($doctype == 10) + $this->title = "INVOICE"; + else + $this->title = "CREDIT NOTE"; + if ($doctype == 8) + $this->headers = array('Item Code', 'Item Description', 'Delivery Date', + 'Quantity', 'Unit', 'Price', 'Total'); + else + $this->headers = array('Item Code', 'Item Description', 'Quantity', 'Unit', + 'Price', 'Discount %', 'Total'); + } + else if ($doctype == 12) + { + $this->title = "STATEMENT"; + $this->headers = array('Trans Type', '#', 'Date', 'Due Date', 'Charges', + 'Credits', 'Allocated', 'Outstanding'); + } +} +if (isset($emailtype)) +{ + $doc_Dear_Sirs = "Dear Sirs"; + $doc_AttachedFile = "Attached you will find "; + $doc_Kindest_regards = "Kindest regards"; +} +if (isset($header2type) || isset($linetype)) +{ + $doc_Invoice_no = "Invoice No."; + $doc_Order_no = "Order no."; +} +if (isset($linetype)) +{ + if ($doctype == 8 || $doctype == 9 || $doctype == 10 || $doctype == 11) + { + $doc_Sub_total = "Sub-total"; + $doc_Shipping = "Shipping"; + $doc_Included = "Included"; + $doc_Amount = "amount"; + $doc_TOTAL_INVOICE = "TOTAL INVOICE"; + $doc_TOTAL_ORDER = "TOTAL ORDER EX VAT"; + $doc_TOTAL_PO = "TOTAL PO EX VAT"; + } + else if ($doctype == 12) + { + $doc_Outstanding = "Outstanding Transactions"; + $doc_Current = "Current"; + $doc_Total_Balance = "Total Balance"; + $doc_Statement = "Statement"; + $doc_as_of = "as of"; + $doc_Days = "Days"; + $doc_Over = "Over"; + } +} +?> \ No newline at end of file diff --git a/reporting/includes/form_types.inc b/reporting/includes/form_types.inc new file mode 100644 index 00000000..c70ee0ca --- /dev/null +++ b/reporting/includes/form_types.inc @@ -0,0 +1,134 @@ + array('code' => 'si', 'name' => _("Sales Invoice")), + 11=> array('code' => 'si', 'name' => _("Sales Credit Note")), + 30=> array('code' => 'so', 'name' => _("Sales Order")), + + 18=> array('code' => 'po', 'name' => _("Purchase Order")), + + 26=> array('code' => 'wo', 'name' => _("Work Order")), + 28=> array('code' => 'wo', 'name' => _("Work Order Issue")), + 29=> array('code' => 'wo', 'name' => _("Work Order Production")), + + 40=> array('code' => 'qw', 'name' => _("Cheque Withdrawal")), + 41=> array('code' => 'qd', 'name' => _("Cheque Deposit")), + + 50=> array('code' => 'cw', 'name' => _("Cash Withdrawal")), + 51=> array('code' => 'cd', 'name' => _("Cash Deposit")), + + 60=> array('code' => 'ir', 'name' => _("Inventory Release")), + 61=> array('code' => 'ia', 'name' => _("Inventory Add")), + 62=> array('code' => 'it', 'name' => _("Inventory Return")) + ); + +function getFormTypeName($type) +{ + global $form_types; + return $form_types[$type]['name']; +} + +function add_forms_for_sys_type($trans_type, $trans_id, $ParamFrom=null, $ParamTo=null) +{ + switch ($trans_type) { + case 1 : // bank payment + case 22 : // payment to supplier + add_form_entry(50, $trans_type, $trans_id, $ParamFrom, $ParamTo); + break; + + case 12: // payment from customer + case 2 : // bank deposit + add_form_entry(51, $trans_type, $trans_id, $ParamFrom, $ParamTo); + break; + + case 4 : // bank transfer - withdraw and deposit + add_form_entry(50, $trans_type, $trans_id, $ParamFrom, $ParamTo); + add_form_entry(51, $trans_type, $trans_id, $ParamTo, $ParamFrom); + break; + + case 10 : // sales invoice - inventory release and invoice forms + add_form_entry(60, $trans_type, $trans_id, $ParamFrom); + add_form_entry(10, $trans_type, $trans_id); + break; + + case 11 : // sales credit - inventory return and credit note forms + add_form_entry(62, $trans_type, $trans_id, $ParamFrom); + add_form_entry(11, $trans_type, $trans_id); + break; + + case 16 : // location transfer + add_form_entry(60, $trans_type, $trans_id, $ParamFrom); + add_form_entry(61, $trans_type, $trans_id, $ParamTo); + break; + + case systypes::inventory_adjustment() : // inventory adjustment + + // $ParamFrom : if 1 inventory add, 0 inventory release + if ($ParamFrom) + add_form_entry(61, $trans_type, $trans_id, $ParamTo); + else + add_form_entry(60, $trans_type, $trans_id, $ParamTo); + break; + + case systypes::po() : // purchase order + add_form_entry(18, $trans_type, $trans_id); + break; + + case 25 : // purchase order delivery + add_form_entry(61, $trans_type, $trans_id, $ParamFrom); + break; + + case systypes::work_order() : // work order + add_form_entry(26, $trans_type, $trans_id); + break; + + case 28 : // work order issue + // $ParamFrom : if 1 inventory add, 0 inventory release + if ($ParamFrom) + add_form_entry(61, $trans_type, $trans_id, $ParamTo); + else + add_form_entry(60, $trans_type, $trans_id, $ParamTo); + break; + + case 29 : // work order production + // $ParamFrom is the quantity - if +ve inventory add, -ve inventory release + if ($ParamFrom >= 0) + add_form_entry(61, $trans_type, $trans_id, $ParamTo); + else + add_form_entry(60, $trans_type, $trans_id, $ParamTo); + break; + + case 30 : // sales order - sales order form + add_form_entry(30, $trans_type, $trans_id); + break; + } +} + +function add_form_entry($form_type, $trans_type, $trans_id, $param1=null, $param2=null) +{ + $sql = "SELECT max(form_id) FROM ".TB_PREF."form_items WHERE form_type=$form_type"; + $result = db_query($sql, "could not get next form_id"); + $row = db_fetch_row($result); + $form_id = $row[0] + 1; + + $sql = "INSERT INTO ".TB_PREF."form_items (form_id, form_type, trans_type, trans_id, param1, param2) + VALUES ($form_id, $form_type, $trans_type, $trans_id, '$param1', '$param2')"; + $result = db_query($sql, "could not add form entry for $trans_type, $trans_id"); +} + +function delete_forms_for_systype($trans_type, $trans_id) +{ + $sql = "DELETE FROM ".TB_PREF."form_items WHERE trans_type=$trans_type AND trans_id=$trans_id"; + $result = db_query($sql, "could not delete form entry for $trans_type, $trans_id"); +} + +function get_form_entries($trans_type, $trans_id) +{ + $sql = "SELECT * FROM ".TB_PREF."form_items WHERE trans_type=$trans_type AND trans_id=$trans_id"; + $result = db_query($sql, "could not query form entry for $trans_type, $trans_id"); + + return $result; +} + +?> \ No newline at end of file diff --git a/reporting/includes/index.php b/reporting/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/reporting/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/reporting/includes/pdf_report.inc b/reporting/includes/pdf_report.inc new file mode 100644 index 00000000..c362b2a2 --- /dev/null +++ b/reporting/includes/pdf_report.inc @@ -0,0 +1,693 @@ +pageWidth=595; + $this->pageHeight=842; + $this->topMargin=40; + $this->bottomMargin=30; + $this->leftMargin=40; + $this->rightMargin=30; + break; + case 'A4_Landscape': + $this->pageWidth=842; + $this->pageHeight=595; + $this->topMargin=30; + $this->bottomMargin=30; + $this->leftMargin=40; + $this->rightMargin=30; + break; + case 'A3': + $this->pageWidth=842; + $this->pageHeight=1190; + $this->topMargin=50; + $this->bottomMargin=50; + $this->leftMargin=50; + $this->rightMargin=40; + break; + case 'A3_landscape': + $this->pageWidth=1190; + $this->pageHeight=842; + $this->topMargin=50; + $this->bottomMargin=50; + $this->leftMargin=50; + $this->rightMargin=40; + break; + case 'letter': + case 'Letter': + $this->pageWidth=612; + $this->pageHeight=792; + $this->topMargin=30; + $this->bottomMargin=30; + $this->leftMargin=30; + $this->rightMargin=25; + break; + case 'letter_landscape': + $this->pageWidth=792; + $this->pageHeight=612; + $this->topMargin=30; + $this->bottomMargin=30; + $this->leftMargin=30; + $this->rightMargin=25; + break; + case 'legal': + $this->pageWidth=612; + $this->pageHeight=1008; + $this->topMargin=50; + $this->bottomMargin=40; + $this->leftMargin=30; + $this->rightMargin=25; + break; + case 'legal_landscape': + $this->pageWidth=1008; + $this->pageHeight=612; + $this->topMargin=50; + $this->bottomMargin=40; + $this->leftMargin=30; + $this->rightMargin=25; + break; + } + $this->size = array(0, 0, $this->pageWidth, $this->pageHeight); + $this->title = $title; + $this->filename = $filename; + $this->pageNumber = 0; + $this->endLine = $this->pageWidth - $this->rightMargin; + $this->companyCol = $this->endLine - 150; + $this->titleCol = $this->leftMargin + 100; + $this->lineHeight = 12; + $this->fontSize = $fontsize; + $this->currency = ''; + $this->rtl = ($_SESSION['language']->dir == 'rtl'); + // for quick testing + //$this->rtl = true; + $this->Cpdf($this->size); + } + + function Font($style = 'normal') + { + global $path_to_root; + $own = false; + $locale = $path_to_root . "lang/" . $_SESSION['language']->code . "/locale.inc"; + if (file_exists($locale)) + { + $fontinclude = true; + include($locale); + } + //if ($this->rtl) // this is good for presentation only + if (!$own) + { + if (user_price_dec() == 3) // only for presentation of farsi + { + $this->rtl = true; + $path = $path_to_root . 'reporting/fonts/farsi_1.afm'; + } + elseif ($style == 'italic') + $path = $path_to_root . 'reporting/fonts/Helvetica-Oblique.afm'; + elseif ($style == 'bold') + $path = $path_to_root . 'reporting/fonts/Helvetica-Bold.afm'; + else // even take misspelled styles + $path = $path_to_root . 'reporting/fonts/Helvetica.afm'; + } + $this->selectFont($path, 'WinAnsiEncoding'); + } + + function Info($params, $cols, $headers, $aligns, + $cols2 = null, $headers2 = null, $aligns2 = null) + { + global $app_title, $version, $power_by, $power_url, $path_to_root, $db_connections; + + $this->addinfo('Title', $this->title); + $this->addinfo('Subject', $this->title); + $this->addinfo('Author', $app_title . ' ' . $version); + $this->addinfo('Creator',$power_by . ' - ' . $power_url); + $year = get_current_fiscalyear(); + if ($year['closed'] == 0) + $how = _("Active"); + else + $how = _("Closed"); + $this->fiscal_year = sql2date($year['begin']) . " - " . sql2date($year['end']) . " " . "(" . $how . ")"; + $this->company = get_company_prefs(); + $this->user = $_SESSION["wa_current_user"]->name; + //$this->host = $db_connections[$_SESSION["wa_current_user"]->company]["host"]; + $this->host = $_SERVER['SERVER_NAME']; + $this->params = $params; + $this->cols = $cols; + for ($i = 0; $i < count($this->cols); $i++) + $this->cols[$i] += $this->leftMargin; + $this->headers = $headers; + $this->aligns = $aligns; + $this->cols2 = $cols2; + if ($this->cols2 != null) + { + for ($i = 0; $i < count($this->cols2); $i++) + $this->cols2[$i] += $this->leftMargin; + } + $this->headers2 = $headers2; + $this->aligns2 = $aligns2; + } + + function Header() + { + $this->pageNumber++; + if ($this->pageNumber > 1) + $this->newPage(); + $this->row = $this->pageHeight - $this->topMargin; + + $this->SetDrawColor(128, 128, 128); + $this->Line($this->row + 5, 1); + + $this->NewLine(); + + $this->fontSize += 4; + $this->Font('bold'); + $this->Text($this->leftMargin, $this->title, $this->companyCol); + $this->Font(); + $this->fontSize -= 4; + $this->Text($this->companyCol, $this->company['coy_name']); + $this->row -= ($this->lineHeight + 4); + + $str = _("Print Out Date") . ':'; + $this->Text($this->leftMargin, $str, $this->titleCol); + $str = Today() . ' ' . Now(); + $this->Text($this->titleCol, $str, $this->companyCol); + $this->Text($this->companyCol, $this->host); + + $this->NewLine(); + $str = _("Fiscal Year") . ':'; + $this->Text($this->leftMargin, $str, $this->titleCol); + $str = $this->fiscal_year; + $this->Text($this->titleCol, $str, $this->companyCol); + $this->Text($this->companyCol, $this->user); + for ($i = 1; $i < count($this->params); $i++) + { + if ($this->params[$i]['from'] != '') + { + $this->NewLine(); + $str = $this->params[$i]['text'] . ':'; + $this->Text($this->leftMargin, $str, $this->titleCol); + $str = $this->params[$i]['from']; + if ($this->params[$i]['to'] != '') + $str .= " - " . $this->params[$i]['to']; + $this->Text($this->titleCol, $str, $this->companyCol); + } + } + if ($this->params[0] != '') // Comments + { + $this->NewLine(); + $str = _("Comments") . ':'; + $this->Text($this->leftMargin, $str, $this->titleCol); + $this->Font('bold'); + $this->Text($this->titleCol, $this->params[0], $this->endLine - 35); + $this->Font(); + } + $str = _("Page") . ' ' . $this->pageNumber; + $this->Text($this->endLine - 35, $str); + $this->Line($this->row - 5, 1); + + $this->row -= ($this->lineHeight + 6); + $this->Font('italic'); + if ($this->headers2 != null) + { + $count = count($this->headers2); + for ($i = 0; $i < $count; $i++) + $this->TextCol2($i, $i + 1, $this->headers2[$i]); + $this->NewLine(); + } + $count = count($this->headers); + for ($i = 0; $i < $count; $i++) + $this->TextCol($i, $i + 1, $this->headers[$i]); + $this->Font(); + $this->Line($this->row - 5, 1); + + $this->NewLine(2); + } + + function Header2($myrow, $branch, $sales_order, $bankaccount, $doctype) + { + global $path_to_root; + + $this->pageNumber++; + if ($this->pageNumber > 1) + $this->newPage(); + $header2type = true; + if ($this->currency != $myrow['curr_code']) + { + include($path_to_root . "reporting/includes/doctext2.inc"); + } + else + { + include($path_to_root . "reporting/includes/doctext.inc"); + } + $this->row = $this->pageHeight - $this->topMargin; + + $upper = $this->row - 2 * $this->lineHeight; + $lower = $this->bottomMargin + 6 * $this->lineHeight; + $iline1 = $upper - 4 * $this->lineHeight; + $iline2 = $iline1 - 8 * $this->lineHeight; + $iline3 = $iline2 - 8 * $this->lineHeight; + $iline4 = $iline3 - 2 * $this->lineHeight; + $iline5 = $lower + 5 * $this->lineHeight; + $icol = $this->pageWidth / 2; + $ccol = $this->cols[0] + 4; + $ccol2 = $icol / 2; + $mcol = $icol + 8; + $mcol2 = $this->pageWidth - $ccol2; + + $this->SetDrawColor(128, 128, 128); + $this->LineTo($this->pageWidth - $this->rightMargin, $upper ,$this->leftMargin, $upper); + $this->LineTo($this->leftMargin, $upper ,$this->leftMargin, $lower); + $this->LineTo($this->pageWidth - $this->rightMargin, $lower ,$this->leftMargin, $lower); + $this->LineTo($this->pageWidth - $this->rightMargin, $lower ,$this->pageWidth - $this->rightMargin, $upper); + $this->Line($iline1); + $this->Line($iline2); + $this->Line($iline3); + $this->Line($iline4); + $this->Line($iline5); + $this->LineTo($icol, $upper ,$icol, $iline1); + $this->NewLine(); + + $this->fontSize += 4; + $this->Font('bold'); + $this->Text($mcol, $this->title); + $this->Font(); + $this->fontSize -= 4; + if ($this->pageNumber > 1 && !strstr($this->filename, "Bulk")) + $this->Text($this->endLine - 35, _("Page") . ' ' . $this->pageNumber); + $this->fontSize -= 4; + $this->row = $upper - 5; + + $this->Text($mcol, $doc_Invoice_no, $mcol + 90); + $this->Text($mcol + 90, $doc_Cust_no, $mcol + 180); + $this->Text($mcol + 180, $doc_Date); + $this->fontSize += 4; + + $this->row = $upper - 2 * $this->lineHeight - 2; + if ($this->company['coy_logo'] != '') + { + $logo = $path_to_root . "themes/default/images/" . $this->company['coy_logo']; + $this->AddImage($logo, $ccol, $iline1 + 5, 220, 40); + } + else + { + $this->fontSize += 4; + $this->Font('bold'); + $this->Text($ccol, $this->company['coy_name'], $icol); + $this->Font(); + $this->fontSize -= 4; + } + if ($doctype == 8) // PO + $this->Text($mcol, $myrow['order_no'], $mcol + 90); + else if ($doctype == 9) // SO + $this->Text($mcol, $myrow['order_no'] ." ".$myrow['customer_ref'], $mcol + 90); + else // INV/CRE/STA + $this->Text($mcol, $myrow['reference'], $mcol + 90); + $this->Text($mcol + 90, $myrow['debtor_no'], $mcol + 180); + if ($doctype == 8 || $doctype == 9) + $this->Text($mcol + 180, sql2date($myrow['ord_date'])); + else + $this->Text($mcol + 180, sql2date($myrow['tran_date'])); + + $this->fontSize -= 4; + $this->row = $iline1 - 5; + $this->Text($ccol, $doc_Charge_To, $icol); + $this->Text($mcol, $doc_Delivered_To); + $this->fontSize += 4; + + $this->NewLine(2); + $temp = $this->row; + if ($doctype == 9) + { + $this->Text($ccol, $myrow['name'], $icol); + //$adr = ?; + } + else + { + if ($doctype == 8) + $this->Text($ccol, $myrow['supp_name'], $icol); + else + $this->Text($ccol, $myrow['DebtorName'], $icol); + $adr = explode("\n", $myrow['address']); + } + for ($i = 0; $i < count($adr); $i++) + { + $this->NewLine(); + $this->Text($ccol, $adr[$i], $icol); + } + if ($sales_order != NULL) + { + $this->row = $temp; + if ($doctype == 8) + $this->Text($mcol, $this->company['coy_name']); + else + $this->Text($mcol, $sales_order['deliver_to']); + $adr = explode("\n", $sales_order['delivery_address']); + for ($i = 0; $i < count($adr); $i++) + { + $this->NewLine(); + $this->Text($mcol, $adr[$i]); + } + } + $this->row = $iline2 - 2 * $this->lineHeight; + $this->Text($ccol, $doc_Shipping_Company . ":", $ccol2); + if ($doctype != 8) + $this->Text($ccol2, $myrow['shipper_name'], $mcol); + $this->Text($mcol, $doc_Due_Date . ":", $mcol2); + if ($doctype == 9) + $this->Text($mcol2, sql2date($myrow['delivery_date'])); + else if ($doctype != 8) + $this->Text($mcol2, sql2date($myrow['due_date'])); + if ($branch != null) + { + $this->NewLine(); + $this->Text($ccol, $doc_Your_Ref . ":", $ccol2); + $this->Text($ccol2, $branch['contact_name'], $mcol); + $this->Text($mcol, $doc_Our_Ref . ":", $mcol2); + + $id = $branch['salesman']; + $sql = "SELECT salesman_name FROM ".TB_PREF."salesman WHERE salesman_code='$id'"; + $result = db_query($sql,"could not get sales person"); + $row = db_fetch($result); + + $this->Text($mcol2, $row['salesman_name']); + } + $this->NewLine(); + $this->Text($ccol, $doc_Your_VAT_no . ":", $ccol2); + if ($doctype != 8) + $this->Text($ccol2, $myrow['tax_id'], $mcol); + $this->Text($mcol, $doc_Our_VAT_no . ":", $mcol2); + $this->Text($mcol2, $this->company['gst_no']); + $this->NewLine(); + $this->Text($ccol, $doc_Payment_Terms . ":", $ccol2); + + $id = $myrow['payment_terms']; + $sql = "SELECT terms FROM ".TB_PREF."payment_terms WHERE terms_indicator='$id'"; + $result = db_query($sql,"could not get paymentterms"); + $row = db_fetch($result); + + $this->Text($ccol2, $row["terms"], $mcol); + $this->Text($mcol, $doc_Our_Order_No . ":", $mcol2); + $this->Text($mcol2, $myrow['order_']); + + $locale = $path_to_root . "lang/" . $_SESSION['language']->code . "/locale.inc"; + if (file_exists($locale)) + { + $header2include = true; + include($locale); + } + $this->row = $iline3 - $this->lineHeight - 2; + $this->Font('bold'); + $count = count($this->headers); + for ($i = 0; $i < $count; $i++) + $this->TextCol($i, $i + 1, $this->headers[$i], -2); + $this->Font(); + $temp = $this->row - 2 * $this->lineHeight; + $this->row = $iline5 - $this->lineHeight - 6; + $this->Text($ccol, $doc_Please_Quote . " - " . $myrow['curr_code']); + if ($this->params['comments'] != '') + { + $this->NewLine(2); + $this->Font('bold'); + $this->Text($ccol, $this->params['comments']); + $this->Font(); + } + + $this->row = $lower - 5; + $this->fontSize -= 4; + + $this->Text($ccol, $doc_Address, $ccol2 + 40); + $this->Text($ccol2 + 40, $doc_Phone_Fax_Email, $mcol); + $this->Text($mcol , $doc_Bank, $mcol2); + $this->Text($mcol2, $doc_Bank_Account); + $this->fontSize += 4; + $this->NewLine(); + $adrline = $this->row; + + $adr = explode("\n", $this->company['postal_address']); + for ($i = 0; $i < count($adr); $i++) + { + $this->NewLine(); + $this->Text($ccol, $adr[$i], $ccol2 + 40); + } + $this->row = $adrline; + $this->Text($ccol2 + 40, $this->company['phone'], $mcol); + $this->NewLine(); + $this->Text($ccol2 + 40, $this->company['fax'], $mcol); + $this->NewLine(); + $this->Text($ccol2 + 40, $this->company['email'], $mcol); + // fetch this later + $this->row = $adrline; + $this->Text($mcol, $bankaccount['bank_name'], $mcol2); + $adr = explode("\n", $bankaccount['bank_address']); + for ($i = 0; $i < count($adr); $i++) + { + $this->NewLine(); + $this->Text($mcol, $adr[$i], $mcol2); + } + + $this->row = $adrline; + $this->Text($mcol2, $bankaccount['bank_account_name']); + $this->NewLine(); + $this->Text($mcol2, $bankaccount['bank_account_number']); + $this->row = $temp; + } + + function AddImage($logo, $x, $y, $w, $h) + { + if ($this->rtl) + $x = $this->pageWidth - $x - $w; + if (strpos($logo, ".png") || strpos($logo, ".PNG")) + $this->addPngFromFile($logo, $x, $y, $w, $h); + else + $this->addJpegFromFile($logo, $x, $y, $w, $h); + } + + function SetDrawColor($r, $g, $b) + { + $this->setStrokeColor($r / 255, $g / 255, $b / 255); + } + + function SetTextColor($r, $g, $b) + { + $this->setColor($r / 255, $g / 255, $b / 255); + } + + function Text($c, $txt, $n=0, $corr=0, $r=0) + { + if ($n == 0) + $n = $this->pageWidth - $this->rightMargin; + + return $this->TextWrap($c, $this->row - $r, $n - $c + $corr, $txt, 'left'); + } + + function TextWrap($xpos, $ypos, $len, $str, $align = 'left') + { + if ($this->rtl) + { + $str = strrev($str); + $xpos = $this->pageWidth - $xpos - $len; + if ($align == 'left') + $align = 'right'; + elseif ($align == 'right') + $align = 'left'; + } + return $this->addTextWrap($xpos, $ypos, $len, $this->fontSize, $str, $align); + } + + function TextCol($c, $n, $txt, $corr=0, $r=0) + { + return $this->TextWrap($this->cols[$c], $this->row - $r, $this->cols[$n] - $this->cols[$c] + $corr, $txt, $this->aligns[$c]); + } + + function TextCol2($c, $n, $txt, $corr=0, $r=0) + { + return $this->TextWrap($this->cols2[$c], $this->row - $r, $this->cols2[$n] - $this->cols2[$c] + $corr, $txt, $this->aligns2[$c]); + } + + function TextColLines($c, $n, $txt, $corr=0) + { + $str = Explode("\n", $txt); + for ($i = 0; $i < count($str); $i++) + { + $l = $str[$i]; + do + { + $l = $this->TextCol($c, $n, $l, $corr); + $this->NewLine(); + } + while ($l != ''); + } + } + + function LineTo($from, $row, $to, $row2) + { + Cpdf::line($from, $row, $to, $row2); + } + + function Line($row, $height = 0) + { + $this->setLineStyle($height + 1); + Cpdf::line($this->pageWidth - $this->rightMargin, $row ,$this->leftMargin, $row); + } + + function NewLine($l=1, $np=0) + { + $this->row -= ($l * $this->lineHeight); + if ($np > 0 && $this->row < $this->bottomMargin + ($np * $this->lineHeight)) + $this->Header(); + } + + function End($email=0, $subject=null, $myrow=null, $doctype = 0) + { + global $go_debug, $path_to_root; + + // this is no good in IE so has been replaced, see down under + // but good for debugging purposes in IE + //session_write_close(); + + if ($go_debug == 1) + { + $buf = $this->output(1); + $len = strlen($buf); + $pdfcode = $buf; + $pdfcode = str_replace("\n", "\n
", htmlspecialchars($pdfcode)); + echo ''; + echo trim($pdfcode); + echo ''; + //header("Content-Length: $len"); + //header("Content-Disposition: inline; filename=" . $this->filename); + //header('Expires: 0'); + //header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + //header('Pragma: public'); + + //$this->pdf->stream(); + } + else + { + $buf = $this->output(); + $len = strlen($buf); + $dir = './pdf_files'; + //save the file + if (!file_exists($dir)) + { + mkdir ($dir,0777); + } + $fname = $dir . '/' . $this->filename; + $fp = fopen($fname,'w'); + fwrite($fp,$buf); + fclose($fp); + if ($email == 1) + { + $emailtype = true; + if ($this->currency != $myrow['curr_code']) + { + include("doctext2.inc"); + } + else + { + include("doctext.inc"); + } + require_once($path_to_root . "reporting/includes/class.mail.inc"); + $mail = new email($this->company['coy_name'], $this->company['email']); + $from = $this->company['coy_name'] . " <" . $this->company['email'] . ">"; + $to = $myrow['DebtorName'] . " <" . $myrow['email'] . ">"; + $msg = $doc_Dear_Sirs . ",\n\n" . $doc_AttachedFile . " " . $subject . + "\n\n" . $doc_Kindest_regards . "\n\n"; + $sender = $this->user . "\n" . $this->company['coy_name']; + $mail->to($to); + $mail->subject($subject); + $mail->text($msg . $sender); + $mail->attachment($fname); + $ret = $mail->send(); + if (1 == 1) // just for fun and for debugging purposes!! + { + $from = str_replace("<", "(", $from); + $from = str_replace(">", ")", $from); + $to = str_replace("<", "(", $to); + $to = str_replace(">", ")", $to); + $msg2 = "
From: " . $from; + $msg2 .= "
To: " . $to; + $msg2 .= "
Subject: " . $subject; + $msg2 .= "
Msg: " . nl2br($msg); + $msg2 .= nl2br($sender) . "
"; + $msg2 .= "
Filepath: " . $fname . "
Filename: " . $this->filename . "
"; + } + if ($ret) + $str = "
" . $this->title . " " . $myrow['reference'] . " " . _("sent to") . " "; + else + $str = "
" . $this->title . " " . $myrow['reference'] . " " . _("NOT sent to") . " "; + $msg2 .= $str . $myrow['DebtorName'] . " - " . $myrow['email']; + echo ""; + echo $msg2; + echo ""; + } + else + { + echo ' + + + + + click here if you are not re-directed. + + '; + } + // also have a look through the directory, and remove the files that are older than a week + // rather want to save 'em + /*if ($d = @opendir($dir)) { + while (($file = readdir($d)) !== false) { + // then check to see if this one is too old + $ftime = filemtime($dir.'/'.$file); + if (time()-$ftime > 3600*24*7){ + unlink($dir.'/'.$file); + } + } + closedir($d); + }*/ + } + } +} + +?> \ No newline at end of file diff --git a/reporting/includes/reporting.inc b/reporting/includes/reporting.inc new file mode 100644 index 00000000..15cfee6a --- /dev/null +++ b/reporting/includes/reporting.inc @@ -0,0 +1,42 @@ + $_SESSION["wa_current_user"]->company, + 'FORMID' => $form_id, + 'FORMTYPE' => $form_type, + 'TRANSNO' => $trans_no, + 'TRANSTYPE' => $trans_type, + 'REF' => $ref, + 'PARAM1' => $param1, + 'PARAM2' => $param2 + ); + $pdf_href = getPDFOpenScript($link_text, $ar); + return "" . _($link_text) . ""; +} + +function getHiddenFieldScript() { + $ar = Array('COMPANY','LANG','FORMID','FORMTYPE','TRANSNO','TRANSTYPE','REF','PARAM1','PARAM2'); + foreach ($ar as $value) $st.= ""; + + $st .= " + + "; + + $st = "

" . $st . ""; + return $st; +} + +function getPDFOpenScript($link_text, $ar_params) { + $st = "document.pdf_form.LANG.value='" . $_SESSION['language']->code . "';"; + foreach ($ar_params as $key => $value) { + $st .= "document.pdf_form.{$key}.value = '{$value}';"; + } + $st.= "window.open('','REP_WINDOW','toolbar=no,scrollbar=no,resizable=yes,menubar=no');"; + $st.= "document.pdf_form.target='REP_WINDOW';"; + $st.= "document.pdf_form.action= '" . C_JSP_ROOT . "/reporting/gen_pdf_form.jsp';"; + $st.= "document.pdf_form.submit();"; + + return $st; +} + +?> \ No newline at end of file diff --git a/reporting/includes/reports_classes.inc b/reporting/includes/reports_classes.inc new file mode 100644 index 00000000..354aab4d --- /dev/null +++ b/reporting/includes/reports_classes.inc @@ -0,0 +1,394 @@ +ar_classes = array(); + } + + function addReportClass($class_name) + { + $this->ar_classes[$class_name] = array(); + } + + function addReport($class_name, $id, $rep_name, $params=null) + { + $this->ar_classes[$class_name][] = new Report($id,$rep_name,$params); + } + + function getDisplay($class=null) + { + global $table_style2; + $temp = array_values($this->ar_classes); + $display_class = $class==null ? $temp[0] : $this->ar_classes[$class]; + $class_counter = 0; + $rep_counter = 0; + $st_reports = ""; + $st_params = ""; + $st_classes = "" . _("Report Classes:") . "
"; + foreach($this->ar_classes as $key=>$value) + { + $style = $class_counter==0 ? '' : $style = "style='display:none'"; + $st_classes .= "$key
"; + $st_reports .= ""; + foreach($value as $report) + { + $st_reports .= ""; + $st_params .= "
" . _("Reports For Class: ") . " $key
" . $report->name . "
"; + $st_params .= ""; + } + $st_reports .= ""; + } + + $st = " + "; + $st .= ""; + $st .= ""; + $st .= ""; + $st .= ""; + $st .= "
$st_classes$st_reports$st_params

"; + + return $st; + } +} + +class Report +{ + var $id; + var $name; + var $ar_params; + + function Report($id, $name, $ar_params) + { + $this->id = $id; + $this->name = $name; + $this->ar_params = $ar_params; + } + function getDisplay() + { + global $path_to_root; + $st = " + + "; + $st .= "

"; + $dummy = ""; + if ($this->ar_params==null) + return ""; + foreach($this->ar_params as $index=>$param) + { + $st .= $param->param_name . ':
'; + switch ($param->param_type) + { + case 'CURRENCY': + $sql = "SELECT curr_abrev, concat(curr_abrev,' - ', currency) FROM ".TB_PREF."currencies"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Currency Filter")); + break; + case 'DATE': + case 'DATEBEGIN': + case 'DATEEND': + case 'DATEBEGINM': + case 'DATEENDM': + case 'DATEBEGINTAX': + case 'DATEENDTAX': + if ($param->param_type == 'DATEBEGIN') + $date = begin_fiscalyear(); + elseif ($param->param_type == 'DATEEND') + $date = end_fiscalyear(); + else + $date = Today(); + if ($param->param_type == 'DATEBEGINM') + $date = begin_month($date); + elseif ($param->param_type == 'DATEENDM') + $date = enc_month($date); + elseif ($param->param_type == 'DATEBEGINTAX' || $param->param_type == 'DATEENDTAX') + { + $row = get_company_prefs(); + $edate = add_months($date, -$row['tax_last']); + $edate = enc_month($edate); + if ($param->param_type == 'DATEENDTAX') + $date = $edate; + else + { + $bdate = add_months($edate, -$row['tax_prd'] + 1); + $date = begin_month($bdate); + } + } + //$st .= ""; + $st .= ""; + break; + case 'YES_NO': + $sel = array(_('No'), _("Yes")); + $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel); + break; + case 'COMPARE': + $sel = array(_("Accumulated"), _("Period Y-1"), _("Budget")); + $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel); + break; + case 'GRAPHIC': + $sel = array(_("No Graphics"), _("Vertical bars"), _("Horizontal bars"), _("Dots"), _("Lines"), _("Pie"), _("Donut")); + $st .= dup_simple_name_list("RP_" . $this->id . "_$index", $sel); + break; + case 'SYS_TYPES': + $st .= dup_systypes_list("RP_" . $this->id . "_$index", $dummy, true, _("No Type Filter"), true); + break; + case 'TEXT': + $st .= ""; + break; + case 'TEXTBOX': + $st .= ""; + break; + case 'ACCOUNTS': + $sql = "SELECT id, name FROM ".TB_PREF."chart_types ORDER BY name"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Account Group Filter"), true); + break; + case 'GL_ACCOUNTS': + $sql = "SELECT account_code, concat(account_code, ' - ', account_name) as account_name FROM ".TB_PREF."chart_master ORDER BY account_code"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'BANK_ACCOUNTS': + $sql = "SELECT ".TB_PREF."bank_accounts.account_code, concat(bank_account_name, if (bank_curr_code=curr_default,'', concat(' - ', bank_curr_code))) FROM ".TB_PREF."bank_accounts, ".TB_PREF."chart_master, ".TB_PREF."company + WHERE ".TB_PREF."bank_accounts.account_code=".TB_PREF."chart_master.account_code"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'DIMENSION': + $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'DIMENSIONS': + $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true); + break; + case 'DIMENSION1': + $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions WHERE type_=1 ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'DIMENSIONS1': + $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions WHERE type_=1 ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true); + break; + case 'DIMENSION2': + $sql = "SELECT reference, concat(reference, ' - ', name) AS DimName FROM ".TB_PREF."dimensions WHERE type_=2 ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'DIMENSIONS2': + $sql = "SELECT reference, concat(reference, ' - ', name) as DimName FROM ".TB_PREF."dimensions WHERE type_=2 ORDER BY reference"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Dimension Filter"), true); + break; + case 'CUSTOMERS_NO_FILTER': + case 'CUSTOMERS': + $sql = "SELECT debtor_no, name FROM ".TB_PREF."debtors_master ORDER BY debtor_no"; + if ($param->param_type == 'CUSTOMERS_NO_FILTER') + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Customer Filter"), true); + else + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'SUPPLIERS': + $sql = "SELECT supplier_id, supp_name FROM ".TB_PREF."suppliers ORDER BY supplier_id"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'INVOICE': + $IV = _("IV"); + $CN = _("CN"); + $sql = "SELECT concat(".TB_PREF."debtor_trans.trans_no, '-', + ".TB_PREF."debtor_trans.type) AS TNO, concat(".TB_PREF."debtor_trans.trans_no, if (type=10, ' $IV ', ' $CN '), ".TB_PREF."debtors_master.name) as IName + FROM ".TB_PREF."debtors_master, ".TB_PREF."debtor_trans WHERE (type=10 OR type=11) AND ".TB_PREF."debtors_master.debtor_no=".TB_PREF."debtor_trans.debtor_no ORDER BY ".TB_PREF."debtor_trans.trans_no DESC"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'ORDERS': + $sql = "SELECT ".TB_PREF."sales_orders.order_no, concat(".TB_PREF."sales_orders.order_no, '-', + ".TB_PREF."debtors_master.name) as IName + FROM ".TB_PREF."debtors_master, ".TB_PREF."sales_orders WHERE ".TB_PREF."debtors_master.debtor_no=".TB_PREF."sales_orders.debtor_no ORDER BY ".TB_PREF."sales_orders.order_no DESC"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'PO': + $sql = "SELECT ".TB_PREF."purch_orders.order_no, concat(".TB_PREF."purch_orders.order_no, '-', + ".TB_PREF."suppliers.supp_name) as IName + FROM ".TB_PREF."suppliers, ".TB_PREF."purch_orders WHERE ".TB_PREF."suppliers.supplier_id=".TB_PREF."purch_orders.supplier_id ORDER BY ".TB_PREF."purch_orders.order_no DESC"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'ITEMS': + $sql = "SELECT stock_id, concat(stock_id, '-', description) as name FROM ".TB_PREF."stock_master WHERE (mb_flag='A' OR mb_flag='M') ORDER BY stock_id"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'LOCATIONS': + $sql = "SELECT loc_code, location_name FROM ".TB_PREF."locations ORDER BY location_name"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Location Filter"), false); + break; + case 'CATEGORIES': + $sql = "SELECT category_id, description FROM ".TB_PREF."stock_category ORDER BY description"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Category Filter"), true); + break; + case 'SALESTYPES': + $sql = "SELECT id, sales_type FROM ".TB_PREF."sales_types ORDER BY sales_type"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'AREAS': + $sql = "SELECT area_code, description FROM ".TB_PREF."areas ORDER BY description"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Area Filter"), true); + break; + case 'SALESMEN': + $sql = "SELECT salesman_code, salesman_name FROM ".TB_PREF."salesman ORDER BY salesman_name"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy, true, _("No Sales Folk Filter"), true); + break; + case 'TRANS_YEARS': + $sql = "SELECT DISTINCT YEAR(tran_date), YEAR(tran_date) FROM ".TB_PREF."gl_trans"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + case 'ACCOUNTS_NO_FILTER': + $sql = "SELECT id, name FROM ".TB_PREF."chart_types ORDER BY name"; + $st .= dup_simple_codeandname_list($sql, "RP_" . $this->id . "_$index", $dummy); + break; + + } + $st .= "

"; + } + return $st; + } +} + +class ReportParam +{ + var $param_name; + var $param_type; + + function ReportParam($param_name, $param_type) + { + $this->param_name = $param_name; + $this->param_type = $param_type; + } +} + +function dup_simple_codeandname_list($sql, $name, &$selected_id, + $all_option=false, $all_option_name=null, $all_option_numeric=false, + $submit_on_change=false) +{ + if ($submit_on_change == true) + $st = ""; + + if ($all_option == true) + { + if ($all_option_numeric) + $reserved_word = reserved_words::get_all_numeric(); + else + $reserved_word = reserved_words::get_all(); + + if ($reserved_word == $selected_id) + { + $st .= "\n"; + } + else + { + $st .= "\n"; + } + if ($selected_id == "") + { + $selected_id = $reserved_word; + } + } + + $result = db_query($sql); + + while ($row = db_fetch_row($result)) + { + if ($selected_id == $row[0]) + { + $st .= "\n"; + + if ($selected_id == "") + { + $selected_id = $row[0]; + } + } + + $st .= ""; + db_free_result($result); + + return $st; +} + +function dup_simple_name_list($name, $selections) +{ + $st = ""; + return $st; +} + +//------------------------------------------------------------------------------------------------ + +function dup_systypes_list($name, &$selected_id, $all_option=false, $all_option_name=null) +{ + global $systypes_array; + + $st = ""; + return $st; +} + + +?> \ No newline at end of file diff --git a/reporting/index.php b/reporting/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/reporting/index.php @@ -0,0 +1,3 @@ + diff --git a/reporting/pdf_files/index.php b/reporting/pdf_files/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/reporting/pdf_files/index.php @@ -0,0 +1,3 @@ + diff --git a/reporting/rep101.php b/reporting/rep101.php new file mode 100644 index 00000000..2709e753 --- /dev/null +++ b/reporting/rep101.php @@ -0,0 +1,163 @@ + $comments, + 1 => array('text' => _('End Date'), 'from' => $to, 'to' => ''), + 2 => array('text' => _('Customer'), 'from' => get_customer_name($fromcust), + 'to' => get_customer_name($tocust)), + 3 => array('text' => _('Currency'), 'from' => $currency, 'to' => '')); + + $rep = new FrontReport(_('Customer Balances'), "CustomerBalances.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $total = array(); + $grandtotal = array(); + + $sql = "SELECT debtor_no, name, curr_code FROM ".TB_PREF."debtors_master + WHERE debtor_no>=$fromcust AND debtor_no<=$tocust ORDER BY name"; + $result = db_query($sql, "The customers could not be retrieved"); + + while ($myrow = db_fetch($result)) + { + if (!$convert && $currency != $myrow['curr_code']) + continue; + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['name']); + if ($convert) + { + $rate = get_exchange_rate_from_home_currency($myrow['curr_code'], $to); + $rep->TextCol(3, 4, $myrow['curr_code']); + } + else + $rate = 1.0; + $rep->fontSize -= 2; + $rep->NewLine(1, 2); + $res = get_transactions($myrow['debtor_no'], $to); + if (db_num_rows($res)==0) + continue; + $rep->Line($rep->row + 4); + $total[0] = $total[1] = $total[2] = $total[3] = 0.0; + while ($trans = db_fetch($res)) + { + $rep->NewLine(1, 2); + $rep->TextCol(0, 1, $trans['type_name']); + $rep->TextCol(1, 2, $trans['reference']); + $rep->TextCol(2, 3, sql2date($trans['tran_date'])); + if ($trans['type'] == 10) + $rep->TextCol(3, 4, sql2date($trans['due_date'])); + $item[0] = $item[1] = 0.0; + if ($trans['TotalAmount'] > 0.0) + { + $item[0] = abs($trans['TotalAmount']) * $rate; + $rep->TextCol(4, 5, number_format2($item[0], $dec)); + } + else + { + $item[1] = Abs($trans['TotalAmount']) * $rate; + $rep->TextCol(5, 6, number_format2($item[1], $dec)); + } + $item[2] = $trans['Allocated'] * $rate; + $rep->TextCol(6, 7, number_format2($item[2], $dec)); + if ($trans['type'] == 10) + $item[3] = ($trans['TotalAmount'] - $trans['Allocated']) * $rate; + else + $item[3] = ($trans['TotalAmount'] + $trans['Allocated']) * $rate; + $rep->TextCol(7, 8, number_format2($item[3], $dec)); + for ($i = 0; $i < 4; $i++) + { + $total[$i] += $item[$i]; + $grandtotal[$i] += $item[$i]; + } + } + $rep->Line($rep->row - 8); + $rep->NewLine(2); + $rep->TextCol(0, 3, _('Total')); + for ($i = 0; $i < 4; $i++) + $rep->TextCol($i + 4, $i + 5, number_format2($total[$i], $dec)); + $rep->Line($rep->row - 4); + $rep->NewLine(2); + } + $rep->fontSize += 2; + $rep->TextCol(0, 3, _('Grand Total')); + $rep->fontSize -= 2; + for ($i = 0; $i < 4; $i++) + $rep->TextCol($i + 4, $i + 5, number_format2($grandtotal[$i], $dec)); + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep102.php b/reporting/rep102.php new file mode 100644 index 00000000..e9412e6a --- /dev/null +++ b/reporting/rep102.php @@ -0,0 +1,269 @@ + 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) >= ".TB_PREF."payment_terms.days_before_due THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= 0 THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + ) AS Due, + IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $PastDueDays1) THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= $PastDueDays1 THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + ) AS Overdue1, + IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $PastDueDays2) THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= $PastDueDays2 THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + ) AS Overdue2 + + FROM ".TB_PREF."debtors_master, + ".TB_PREF."payment_terms, + ".TB_PREF."debtor_trans, + ".TB_PREF."sys_types + + WHERE ".TB_PREF."sys_types.type_id = ".TB_PREF."debtor_trans.type + AND ".TB_PREF."debtors_master.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."debtors_master.debtor_no = ".TB_PREF."debtor_trans.debtor_no + AND ".TB_PREF."debtor_trans.debtor_no = $costomer_id + AND ".TB_PREF."debtor_trans.tran_date <= '$todate' + AND ABS(".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount) > 0.004 + ORDER BY ".TB_PREF."debtor_trans.tran_date"; + + + return db_query($sql, "The customer details could not be retrieved"); +} + +//---------------------------------------------------------------------------------------------------- + +function print_aged_customer_analysis() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $to = $_POST['PARAM_0']; + $fromcust = $_POST['PARAM_1']; + $tocust = $_POST['PARAM_2']; + $currency = $_POST['PARAM_3']; + $summaryOnly = $_POST['PARAM_4']; + $graphics = $_POST['PARAM_5']; + $comments = $_POST['PARAM_6']; + if ($graphics) + { + include_once($path_to_root . "reporting/includes/class.graphic.inc"); + $pg = new graph(); + } + + if ($fromcust == null) + $fromcust = 0; + if ($tocust == null) + $tocust = 0; + $dec = user_price_dec(); + + if ($summaryOnly == 1) + $summary = _('Summary Only'); + else + $summary = _('Detailed Report'); + if ($currency == reserved_words::get_all()) + { + $convert = true; + $currency = _('Balances in Home Currency'); + } + else + $convert = false; + + $PastDueDays1 = get_company_pref('past_due_days'); + $PastDueDays2 = 2 * $PastDueDays1; + $nowdue = "1-" . $PastDueDays1 . " " . _('Days'); + $pastdue1 = $PastDueDays1 + 1 . "-" . $PastDueDays2 . " " . _('Days'); + $pastdue2 = _('Over') . " " . $PastDueDays2 . " " . _('Days'); + + $cols = array(0, 100, 130, 190, 250, 320, 385, 450, 515); + $headers = array(_('Customer'), '', '', _('Current'), $nowdue, $pastdue1, $pastdue2, + _('Total Balance')); + + $aligns = array('left', 'left', 'left', 'right', 'right', 'right', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('End Date'), 'from' => $to, 'to' => ''), + 2 => array('text' => _('Customer'), 'from' => get_customer_name($fromcust), + 'to' => get_customer_name($tocust)), + 3 => array('text' => _('Currency'), 'from' => $currency, 'to' => ''), + 4 => array('text' => _('Type'), 'from' => $summary,'to' => '')); + + if ($convert) + $headers[2] = _('Currency'); + $rep = new FrontReport(_('Aged Customer Analysis'), "AgedCustomerAnalysis.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $total = array(); + $total[0] = $total[1] = $total[2] = $total[3] = $total[4] = 0.0; + + $sql = "SELECT debtor_no, name, curr_code FROM ".TB_PREF."debtors_master + WHERE debtor_no>=$fromcust AND debtor_no<=$tocust ORDER BY name"; + $result = db_query($sql, "The customers could not be retrieved"); + + while ($myrow=db_fetch($result)) + { + if (!$convert && $currency != $myrow['curr_code']) + continue; + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['name']); + if ($convert) + { + $rate = get_exchange_rate_from_home_currency($myrow['curr_code'], $to); + $rep->TextCol(2, 4, $myrow['curr_code']); + } + else + $rate = 1.0; + $rep->fontSize -= 2; + $custrec = get_customer_details($myrow['debtor_no'], $to); + foreach ($custrec as $i => $value) + $custrec[$i] *= $rate; + $total[0] += ($custrec["Balance"] - $custrec["Due"]); + $total[1] += ($custrec["Due"]-$custrec["Overdue1"]); + $total[2] += ($custrec["Overdue1"]-$custrec["Overdue2"]); + $total[3] += $custrec["Overdue2"]; + $total[4] += $custrec["Balance"]; + $str = array(number_format2(($custrec["Balance"] - $custrec["Due"]),$dec), + number_format2(($custrec["Due"]-$custrec["Overdue1"]),$dec), + number_format2(($custrec["Overdue1"]-$custrec["Overdue2"]) ,$dec), + number_format2($custrec["Overdue2"],$dec), + number_format2($custrec["Balance"],$dec)); + for ($i = 0; $i < count($str); $i++) + $rep->TextCol($i + 3, $i + 4, $str[$i]); + $rep->NewLine(1, 2); + if (!$summaryOnly) + { + $res = get_invoices($myrow['debtor_no'], $to); + if (db_num_rows($res)==0) + continue; + $rep->Line($rep->row + 4); + while ($trans=db_fetch($res)) + { + $rep->NewLine(1, 2); + $rep->TextCol(0, 1, $trans['type_name'], -2); + $rep->TextCol(1, 2, $trans['reference'], -2); + $rep->TextCol(2, 3, sql2date($trans['tran_date']), -2); + foreach ($trans as $i => $value) + $trans[$i] *= $rate; + $str = array(number_format2(($trans["Balance"] - $trans["Due"]),$dec), + number_format2(($trans["Due"]-$trans["Overdue1"]),$dec), + number_format2(($trans["Overdue1"]-$trans["Overdue2"]) ,$dec), + number_format2($trans["Overdue2"],$dec), + number_format2($trans["Balance"],$dec)); + for ($i = 0; $i < count($str); $i++) + $rep->TextCol($i + 3, $i + 4, $str[$i]); + } + $rep->Line($rep->row - 8); + $rep->NewLine(2); + } + } + if ($summaryOnly) + { + $rep->Line($rep->row + 4); + $rep->NewLine(); + } + $rep->fontSize += 2; + $rep->TextCol(0, 3, _('Grand Total')); + $rep->fontSize -= 2; + for ($i = 0; $i < count($total); $i++) + { + $rep->TextCol($i + 3, $i + 4, number_format2($total[$i], $dec)); + if ($graphics && $i < count($total) - 1) + { + $pg->y[$i] = abs($total[$i]); + } + } + $rep->Line($rep->row - 8); + if ($graphics) + { + global $decseps, $graph_skin; + $pg->x = array(_('Current'), $nowdue, $pastdue1, $pastdue2); + $pg->title = $rep->title; + $pg->axis_x = _("Days"); + $pg->axis_y = _("Amount"); + $pg->graphic_1 = $to; + $pg->type = $graphics; + $pg->skin = $graph_skin; + $pg->built_in = false; + $pg->fontfile = $path_to_root . "reporting/fonts/Vera.ttf"; + $pg->latin_notation = ($decseps[$_SESSION["wa_current_user"]->prefs->dec_sep()] != "."); + $filename = $path_to_root . "reporting/pdf_files/test.png"; + $pg->display($filename, true); + $w = $pg->width / 1.5; + $h = $pg->height / 1.5; + $x = ($rep->pageWidth - $w) / 2; + $rep->NewLine(2); + if ($rep->row - $h < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($filename, $x, $rep->row - $h, $w, $h); + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep103.php b/reporting/rep103.php new file mode 100644 index 00000000..dd655487 --- /dev/null +++ b/reporting/rep103.php @@ -0,0 +1,214 @@ +='$date'"; + + $result = db_query($sql,"No transactions were returned"); + + $row = db_fetch_row($result); + return $row[0]; +} + +//---------------------------------------------------------------------------------------------------- + +function print_customer_details_listing() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $from = $_POST['PARAM_0']; + $area = $_POST['PARAM_1']; + $folk = $_POST['PARAM_2']; + $more = $_POST['PARAM_3']; + $less = $_POST['PARAM_4']; + $comments = $_POST['PARAM_5']; + + $dec = 0; + + if ($area == reserved_words::get_all_numeric()) + $area = 0; + if ($folk == reserved_words::get_all_numeric()) + $folk = 0; + + if ($area == 0) + $sarea = _('All Areas'); + else + $sarea = get_area_name($area); + if ($folk == 0) + $salesfolk = _('All Sales Folk'); + else + $salesfolk = get_salesman_name($folk); + if ($more != '') + $morestr = _('Greater than ') . number_format2($more, $dec); + else + $morestr = ''; + if ($less != '') + $lessstr = _('Less than ') . number_format2($less, $dec); + else + $lessstr = ''; + + $more = (double)$more; + $less = (double)$less; + + $cols = array(0, 150, 300, 400, 550); + + $headers = array(_('Customer Postal Address'), _('Price/Turnover'), _('Branch Contact Information'), + _('Branch Delivery Address')); + + $aligns = array('left', 'left', 'left', 'left'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Activity Since'), 'from' => $from, 'to' => ''), + 2 => array('text' => _('Sales Areas'), 'from' => $sarea, 'to' => ''), + 3 => array('text' => _('Sales Folk'), 'from' => $salesfolk, 'to' => ''), + 4 => array('text' => _('Activity'), 'from' => $morestr, 'to' => $lessstr)); + + $rep = new FrontReport(_('Customer Details Listing'), "CustomerDetailsListing.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $result = get_customer_details_for_report($area, $folk); + + $carea = ''; + $sman = ''; + while ($myrow=db_fetch($result)) + { + $printcustomer = true; + if ($more != '' || $less != '') + { + $turnover = getTransactions($myrow['debtor_no'], $myrow['branch_code'], $from); + if ($more != 0.0 && $turnover <= (double)$more) + $printcustomer = false; + if ($less != 0.0 && $turnover >= (double)$less) + $printcustomer = false; + } + if ($printcustomer) + { + if ($carea != $myrow['description']) + { + $rep->fontSize += 2; + $rep->NewLine(2, 7); + $rep->Font('bold'); + $rep->TextCol(0, 3, _('Customers in') . " " . $myrow['description']); + $carea = $myrow['description']; + $rep->fontSize -= 2; + $rep->Font(); + $rep->NewLine(); + } + if ($sman != $myrow['salesman_name']) + { + $rep->fontSize += 2; + $rep->NewLine(1, 7); + $rep->Font('bold'); + $rep->TextCol(0, 3, $myrow['salesman_name']); + $sman = $myrow['salesman_name']; + $rep->fontSize -= 2; + $rep->Font(); + $rep->NewLine(); + } + $rep->NewLine(); + $rep->TextCol(0, 1, $myrow['name']); + $adr = Explode("\n", $myrow['address']); + $count1 = count($adr); + for ($i = 0; $i < $count1; $i++) + $rep->TextCol(0, 1, $adr[$i], 0, ($i + 1) * $rep->lineHeight); + $count1++; + $rep->TextCol(1, 2, _('Price List') . ": " . $myrow['sales_type']); + if ($more != 0.0 || $less != 0.0) + $rep->TextCol(1, 2, _('Turnover') . ": " . number_format2($turnover, $dec), 0, $rep->lineHeight); + $rep->TextCol(2, 3, $myrow['br_name']); + $rep->TextCol(2, 3, $myrow['contact_name'], 0, $rep->lineHeight); + $rep->TextCol(2, 3, _('Ph') . ": " . $myrow['phone'], 0, 2 * $rep->lineHeight); + $rep->TextCol(2, 3, _('Fax') . ": " . $myrow['fax'], 0, 3 * $rep->lineHeight); + $adr = Explode("\n", $myrow['br_address']); + $count2 = count($adr); + for ($i = 0; $i < $count2; $i++) + $rep->TextCol(3, 4, $adr[$i], 0, ($i + 1) * $rep->lineHeight); + $rep->TextCol(3, 4, $myrow['email'], 0, ($count2 + 1) * $rep->lineHeight); + $count2++; + $count1 = Max($count1, $count2); + $count1 = Max($count1, 4); + $rep->NewLine($count1); + $rep->Line($rep->row + 8); + $rep->NewLine(0, 3); + } + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep104.php b/reporting/rep104.php new file mode 100644 index 00000000..dd30a316 --- /dev/null +++ b/reporting/rep104.php @@ -0,0 +1,166 @@ + $comments, + 1 => array('text' => _('Category'), 'from' => $cat, 'to' => ''), + 2 => array('text' => _('Sales Type'), 'from' => $stype, 'to' => ''), + 3 => array( 'text' => _('Show GP %'),'from' => $GP,'to' => '')); + + if ($pictures) + $user_comp = user_company(); + else + $user_comp = ""; + + $rep = new FrontReport(_('Price Listing'), "PriceListing.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $result = get_prices($category, $salestype); + + $currcode = ''; + $catgor = ''; + + while ($myrow=db_fetch($result)) + { + if ($currcode != $myrow['curr_abrev']) + { + $rep->NewLine(2); + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['curr_abrev'] . " " . _('Prices')); + $currcode = $myrow['curr_abrev']; + $rep->fontSize -= 2; + $rep->NewLine(); + } + if ($catgor != $myrow['description']) + { + $rep->Line($rep->row - $rep->lineHeight); + $rep->NewLine(2); + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['category_id'] . " - " . $myrow['description']); + $catgor = $myrow['description']; + $rep->fontSize -= 2; + $rep->NewLine(); + } + $rep->NewLine(); + $rep->TextCol(0, 1, $myrow['stock_id']); + $rep->TextCol(1, 2, $myrow['name']); + $rep->TextCol(2, 3, number_format2($myrow['price'], $dec)); + if ($showGP) + { + if ($myrow['price'] != 0.0) + $disp = ($myrow['price'] - $myrow['Standardcost']) * 100 / $myrow['price']; + else + $disp = 0.0; + $rep->TextCol(3, 4, number_format2($disp, user_percent_dec()) . " %"); + } + if ($pictures) + { + $image = $path_to_root . "inventory/manage/image/" . $user_comp . "/" . $myrow['stock_id'] . ".jpg"; + if (file_exists($image)) + { + $rep->NewLine(); + if ($rep->row - $pic_height < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($image, $rep->cols[1], $rep->row - $pic_height, $pic_width, $pic_height); + $rep->row -= $pic_height; + $rep->NewLine(); + } + } + else + $rep->NewLine(0, 1); + } + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep105.php b/reporting/rep105.php new file mode 100644 index 00000000..9e8c4936 --- /dev/null +++ b/reporting/rep105.php @@ -0,0 +1,169 @@ +='$fromdate' + AND ".TB_PREF."sales_orders.ord_date <='$todate'"; + if ($category > 0) + $sql .= " AND ".TB_PREF."stock_master.category_id=$category"; + if ($location != null) + $sql .= " AND ".TB_PREF."sales_orders.from_stk_loc='$location'"; + if ($backorder) + $sql .= "AND ".TB_PREF."sales_order_details.quantity - ".TB_PREF."sales_order_details.qty_invoiced > 0"; + $sql .= " ORDER BY ".TB_PREF."sales_orders.order_no"; + + return db_query($sql, "Error getting order details"); +} + +//---------------------------------------------------------------------------------------------------- + +function print_order_status_list() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $from = $_POST['PARAM_0']; + $to = $_POST['PARAM_1']; + $category = $_POST['PARAM_2']; + $location = $_POST['PARAM_3']; + $backorder = $_POST['PARAM_4']; + $comments = $_POST['PARAM_5']; + + $dec = user_qty_dec(); + + if ($category == reserved_words::get_all_numeric()) + $category = 0; + if ($location == reserved_words::get_all()) + $location = null; + if ($category == 0) + $cat = _('All'); + else + $cat = get_category_name($category); + if ($location == null) + $loc = _('All'); + else + $loc = $location; + if ($backorder == 0) + $back = _('All Orders'); + else + $back = _('Back Orders Only'); + + $cols = array(0, 60, 150, 260, 325, 385, 450, 515); + + $headers2 = array(_('Order'), _('Customer'), _('Branch'), _('Customer Ref'), + _('Ord Date'), _('Del Date'), _('Loc')); + + $aligns = array('left', 'left', 'right', 'right', 'right', 'right', 'right'); + + $headers = array(_('Code'), _('Description'), _('Ordered'), _('Invoiced'), + _('Outstanding'), _(' ')); + + $params = array( 0 => $comments, + 1 => array( 'text' => _('Period'), 'from' => $from, 'to' => $to), + 2 => array( 'text' => _('Category'), 'from' => $cat,'to' => ''), + 3 => array( 'text' => _('Location'), 'from' => $loc, 'to' => ''), + 4 => array( 'text' => _('Selection'),'from' => $back,'to' => '')); + + $cols2 = $cols; + $aligns2 = $aligns; + + $rep = new FrontReport(_('Order Status Listing'), "OrderStatusListing.pdf", user_pagesize()); + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns, $cols2, $headers2, $aligns2); + + $rep->Header(); + $orderno = 0; + + $result = GetSalesOrders($from, $to, $category, $location, $backorder); + + while ($myrow=db_fetch($result)) + { + if ($rep->row < $rep->bottomMargin + (2 * $rep->lineHeight)) + { + $orderno = 0; + $rep->Header(); + } + $rep->NewLine(0, 2, false, $orderno); + if ($orderno != $myrow['order_no']) + { + if ($orderno != 0) + { + $rep->Line($rep->row); + $rep->NewLine(); + } + $rep->TextCol(0, 1, $myrow['order_no']); + $rep->TextCol(1, 2, get_customer_name($myrow['debtor_no'])); + $rep->TextCol(2, 3, get_branch_name($myrow['branch_code'])); + $rep->TextCol(3, 4, $myrow['customer_ref']); + $rep->TextCol(4, 5, sql2date($myrow['ord_date'])); + $rep->TextCol(5, 6, sql2date($myrow['delivery_date'])); + $rep->TextCol(6, 7, $myrow['from_stk_loc']); + $rep->NewLine(2); + $orderno = $myrow['order_no']; + } + $rep->TextCol(0, 1, $myrow['stk_code']); + $rep->TextCol(1, 2, $myrow['description']); + $rep->TextCol(2, 3, number_format2($myrow['quantity'], $dec)); + $rep->TextCol(3, 4, number_format2($myrow['qty_invoiced'], $dec)); + $rep->TextCol(4, 5, number_format2($myrow['quantity'] - $myrow['qty_invoiced'], $dec)); + if ($myrow['quantity'] - $myrow['qty_invoiced'] > 0) + { + $rep->Font('italic'); + $rep->TextCol(5, 6, _('Outstanding')); + $rep->Font(); + } + $rep->NewLine(); + if ($rep->row < $rep->bottomMargin + (2 * $rep->lineHeight)) + { + $orderno = 0; + $rep->Header(); + } + } + $rep->Line($rep->row); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep107.php b/reporting/rep107.php new file mode 100644 index 00000000..653347e8 --- /dev/null +++ b/reporting/rep107.php @@ -0,0 +1,191 @@ + $comments, + 'bankaccount' => $bankaccount); + + $baccount = get_bank_account($params['bankaccount']); + $cur = get_company_Pref('curr_default'); + + if ($email == 0) + { + $rep = new FrontReport(_('INVOICE'), "InvoiceBulk.pdf", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->Info($params, $cols, null, $aligns); + } + + for ($i = $fno[0]; $i <= $tno[0]; $i++) + { + for ($j = 10; $j <= 11; $j++) + { + if (!exists_customer_trans($j, $i)) + continue; + $myrow = get_customer_trans($i, $j); + $branch = get_branch($myrow["branch_code"]); + if ($j == 10) + $sales_order = get_sales_order($myrow["order_"]); + else + $sales_order = null; + if ($email == 1) + { + $rep = new FrontReport("", "", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + if ($j == 10) + { + $rep->title = _('INVOICE'); + $rep->filename = "Invoice" . $myrow['reference'] . ".pdf"; + } + else + { + $rep->title = _('CREDIT NOTE'); + $rep->filename = "CreditNote" . $myrow['reference'] . ".pdf"; + } + $rep->Info($params, $cols, null, $aligns); + } + else + $rep->title = ($j == 10) ? _('INVOICE') : _('CREDIT NOTE'); + $rep->Header2($myrow, $branch, $sales_order, $baccount, $j); + + $result = get_customer_trans_details($j, $i); + $SubTotal = 0; + while ($myrow2=db_fetch($result)) + { + $Net = ((1 - $myrow2["discount_percent"]) * $myrow2["FullUnitPrice"] * -$myrow2["quantity"]); + $SubTotal += $Net; + $DisplayPrice = number_format2($myrow2["FullUnitPrice"],$dec); + $DisplayQty = number_format2(-$myrow2["quantity"],user_qty_dec()); + $DisplayNet = number_format2($Net,$dec); + if ($myrow2["discount_percent"]==0) + $DisplayDiscount =""; + else + $DisplayDiscount = number_format2($myrow2["discount_percent"]*100,user_percent_dec()) . "%"; + $rep->TextCol(0, 1, $myrow2['stock_id'], -2); + $rep->TextCol(1, 2, $myrow2['StockDescription'], -2); + $rep->TextCol(2, 3, $DisplayQty, -2); + $rep->TextCol(3, 4, $myrow2['units'], -2); + $rep->TextCol(4, 5, $DisplayPrice, -2); + $rep->TextCol(5, 6, $DisplayDiscount, -2); + $rep->TextCol(6, 7, $DisplayNet, -2); + $rep->NewLine(1); + if ($rep->row < $rep->bottomMargin + (15 * $rep->lineHeight)) + $rep->Header2($myrow, $branch, $sales_order, $baccount); + } + + $comments = get_comments($j, $i); + if ($comments && db_num_rows($comments)) + { + $rep->NewLine(); + while ($comment=db_fetch($comments)) + $rep->TextColLines(0, 6, $comment['memo_'], -2); + } + + $DisplaySubTot = number_format2($SubTotal,$dec); + $DisplayFreight = number_format2($myrow["ov_freight"],$dec); + + $rep->row = $rep->bottomMargin + (15 * $rep->lineHeight); + $linetype = true; + $doctype = $j; + if ($rep->currency != $myrow['curr_code']) + { + include($path_to_root . "reporting/includes/doctext2.inc"); + } + else + { + include($path_to_root . "reporting/includes/doctext.inc"); + } + + $rep->TextCol(3, 6, $doc_Sub_total, -2); + $rep->TextCol(6, 7, $DisplaySubTot, -2); + $rep->NewLine(); + $rep->TextCol(3, 6, $doc_Shipping, -2); + $rep->TextCol(6, 7, $DisplayFreight, -2); + $rep->NewLine(); + $tax_items = get_customer_trans_tax_details($j, $i); + while ($tax_item = db_fetch($tax_items)) + { + $DisplayTax = number_format2($tax_item['amount'], $dec); + if ($tax_item['included_in_price']) + { + $rep->TextCol(3, 7, $doc_Included . " " . $tax_item['tax_type_name'] . + " (" . $tax_item['rate'] . "%) " . $doc_Amount . ":" . $DisplayTax, -2); + } + else + { + $rep->TextCol(3, 6, $tax_item['tax_type_name'] . " (" . + $tax_item['rate'] . "%)", -2); + $rep->TextCol(6, 7, $DisplayTax, -2); + } + $rep->NewLine(); + } + $rep->NewLine(); + $DisplayTotal = number_format2($myrow["ov_freight"] + $myrow["ov_gst"] + + $myrow["ov_amount"],$dec); + $rep->Font('bold'); + $rep->TextCol(3, 6, $doc_TOTAL_INVOICE, - 2); + $rep->TextCol(6, 7, $DisplayTotal, -2); + $rep->Font(); + if ($email == 1) + { + if ($myrow['email'] == '') + { + $myrow['email'] = $branch['email']; + $myrow['DebtorName'] = $branch['br_name']; + } + $rep->End($email, $doc_Invoice_no . " " . $myrow['reference'], $myrow, $j); + } + } + } + if ($email == 0) + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep108.php b/reporting/rep108.php new file mode 100644 index 00000000..04d871a7 --- /dev/null +++ b/reporting/rep108.php @@ -0,0 +1,169 @@ + $comments, + 'bankaccount' => $bankaccount); + + $baccount = get_bank_account($params['bankaccount']); + + $cur = get_company_pref('curr_default'); + $PastDueDays1 = get_company_pref('past_due_days'); + $PastDueDays2 = 2 * $PastDueDays1; + + if ($email == 0) + { + $rep = new FrontReport(_('STATEMENT'), "StatementBulk.pdf", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->Info($params, $cols, null, $aligns); + } + + $sql = "SELECT debtor_no, name AS DebtorName, address, tax_id, email, curr_code, curdate() AS tran_date, payment_terms FROM ".TB_PREF."debtors_master"; + if ($customer != reserved_words::get_all_numeric()) + $sql .= " WHERE debtor_no = $customer"; + else + $sql .= " ORDER by name"; + $result = db_query($sql, "The customers could not be retrieved"); + + while ($myrow=db_fetch($result)) + { + $date = date('Y-m-d'); + + $myrow['order_'] = ""; + + $TransResult = getTransactions($myrow['debtor_no'], $date); + if (db_num_rows($TransResult) == 0) + continue; + if ($email == 1) + { + $rep = new FrontReport("", "", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->title = _('STATEMENT'); + $rep->filename = "Statement" . $myrow['debtor_no'] . ".pdf"; + $rep->Info($params, $cols, null, $aligns); + } + $rep->Header2($myrow, null, null, $baccount, 12); + $rep->NewLine(); + $linetype = true; + $doctype = 12; + if ($rep->currency != $myrow['curr_code']) + { + include($path_to_root . "reporting/includes/doctext2.inc"); + } + else + { + include($path_to_root . "reporting/includes/doctext.inc"); + } + $rep->fontSize += 2; + $rep->TextCol(0, 8, $doc_Outstanding); + $rep->fontSize -= 2; + $rep->NewLine(2); + while ($myrow2=db_fetch($TransResult)) + { + $DisplayTotal = number_format2(Abs($myrow2["TotalAmount"]),$dec); + $DisplayAlloc = number_format2($myrow2["Allocated"],$dec); + if ($myrow2['type'] == 10) + $DisplayNet = number_format2($myrow2["TotalAmount"] - $myrow2["Allocated"],$dec); + else + $DisplayNet = number_format2($myrow2["TotalAmount"] + $myrow2["Allocated"],$dec); + + $rep->TextCol(0, 1, $myrow2['type_name'], -2); + $rep->TextCol(1, 2, $myrow2['reference'], -2); + $rep->TextCol(2, 3, sql2date($myrow2['tran_date']), -2); + if ($myrow2['type'] == 10) + $rep->TextCol(3, 4, sql2date($myrow2['due_date']), -2); + if ($myrow2['TotalAmount'] > 0.0) + $rep->TextCol(4, 5, $DisplayTotal, -2); + else + $rep->TextCol(5, 6, $DisplayTotal, -2); + $rep->TextCol(6, 7, $DisplayAlloc, -2); + $rep->TextCol(7, 8, $DisplayNet, -2); + $rep->NewLine(); + if ($rep->row < $rep->bottomMargin + (10 * $rep->lineHeight)) + $rep->Header2($myrow, null, null, $baccount); + } + $nowdue = "1-" . $PastDueDays1 . " " . $doc_Days; + $pastdue1 = $PastDueDays1 + 1 . "-" . $PastDueDays2 . " " . $doc_Days; + $pastdue2 = $doc_Over . " " . $PastDueDays2 . " " . $doc_Days; + $CustomerRecord = get_customer_details($myrow['debtor_no']); + $str = array($doc_Current, $nowdue, $pastdue1, $pastdue2, $doc_Total_Balance); + $str2 = array(number_format2(($CustomerRecord["Balance"] - $CustomerRecord["Due"]),$dec), + number_format2(($CustomerRecord["Due"]-$CustomerRecord["Overdue1"]),$dec), + number_format2(($CustomerRecord["Overdue1"]-$CustomerRecord["Overdue2"]) ,$dec), + number_format2($CustomerRecord["Overdue2"],$dec), + number_format2($CustomerRecord["Balance"],$dec)); + $col = array($rep->cols[0], $rep->cols[0] + 110, $rep->cols[0] + 210, $rep->cols[0] + 310, + $rep->cols[0] + 410, $rep->cols[0] + 510); + $rep->row = $rep->bottomMargin + (8 * $rep->lineHeight); + for ($i = 0; $i < 5; $i++) + $rep->TextWrap($col[$i], $rep->row, $col[$i + 1] - $col[$i], $str[$i], 'right'); + $rep->NewLine(); + for ($i = 0; $i < 5; $i++) + $rep->TextWrap($col[$i], $rep->row, $col[$i + 1] - $col[$i], $str2[$i], 'right'); + if ($email == 1) + $rep->End($email, $doc_Statement . " " . $doc_as_of . " " . sql2date($date), $myrow, 12); + + } + if ($email == 0) + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep109.php b/reporting/rep109.php new file mode 100644 index 00000000..5ce04c3d --- /dev/null +++ b/reporting/rep109.php @@ -0,0 +1,160 @@ + $comments, + 'bankaccount' => $bankaccount); + + $baccount = get_bank_account($params['bankaccount']); + $cur = get_company_Pref('curr_default'); + + if ($email == 0) + { + $rep = new FrontReport(_('SALES ORDER'), "SalesOrderBulk.pdf", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->Info($params, $cols, null, $aligns); + } + + for ($i = $from; $i <= $to; $i++) + { + $myrow = get_sales_order($i); + $branch = get_branch($myrow["branch_code"]); + if ($email == 1) + { + $rep = new FrontReport("", "", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->title = _('SALES_ORDER'); + $rep->filename = "SalesOrder" . $i . ".pdf"; + $rep->Info($params, $cols, null, $aligns); + } + else + $rep->title = _('SALES ORDER'); + $rep->Header2($myrow, $branch, $myrow, $baccount, 9); + + $result = get_sales_order_details($i); + $SubTotal = 0; + while ($myrow2=db_fetch($result)) + { + $Net = ((1 - $myrow2["discount_percent"]) * $myrow2["unit_price"] * $myrow2["quantity"]); + $SubTotal += $Net; + $DisplayPrice = number_format2($myrow2["unit_price"],$dec); + $DisplayQty = number_format2($myrow2["quantity"],user_qty_dec()); + $DisplayNet = number_format2($Net,$dec); + if ($myrow2["discount_percent"]==0) + $DisplayDiscount =""; + else + $DisplayDiscount = number_format2($myrow2["discount_percent"]*100,user_percent_dec()) . "%"; + $rep->TextCol(0, 1, $myrow2['stk_code'], -2); + $rep->TextCol(1, 2, $myrow2['description'], -2); + $rep->TextCol(2, 3, $DisplayQty, -2); + $rep->TextCol(3, 4, $myrow2['units'], -2); + $rep->TextCol(4, 5, $DisplayPrice, -2); + $rep->TextCol(5, 6, $DisplayDiscount, -2); + $rep->TextCol(6, 7, $DisplayNet, -2); + $rep->NewLine(1); + if ($rep->row < $rep->bottomMargin + (15 * $rep->lineHeight)) + $rep->Header2($myrow, $branch, $sales_order, $baccount); + } + if ($myrow['comments'] != "") + { + $rep->NewLine(); + $rep->TextColLines(1, 5, $myrow['comments'], -2); + } + $DisplaySubTot = number_format2($SubTotal,$dec); + $DisplayFreight = number_format2($myrow["freight_cost"],$dec); + + $rep->row = $rep->bottomMargin + (15 * $rep->lineHeight); + $linetype = true; + $doctype = 9; + if ($rep->currency != $myrow['curr_code']) + { + include($path_to_root . "reporting/includes/doctext2.inc"); + } + else + { + include($path_to_root . "reporting/includes/doctext.inc"); + } + + $rep->TextCol(3, 6, $doc_Sub_total, -2); + $rep->TextCol(6, 7, $DisplaySubTot, -2); + $rep->NewLine(); + $rep->TextCol(3, 6, $doc_Shipping, -2); + $rep->TextCol(6, 7, $DisplayFreight, -2); + $rep->NewLine(); + $DisplayTotal = number_format2($myrow["freight_cost"] + $SubTotal, $dec); + $rep->Font('bold'); + $rep->TextCol(3, 6, $doc_TOTAL_ORDER, - 2); + $rep->TextCol(6, 7, $DisplayTotal, -2); + $rep->Font(); + if ($email == 1) + { + if ($myrow['contact_email'] == '') + { + $myrow['contact_email'] = $branch['email']; + $myrow['DebtorName'] = $branch['br_name']; + } + $rep->End($email, $doc_Invoice_no . " " . $myrow['reference'], $myrow); + } + } + if ($email == 0) + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep201.php b/reporting/rep201.php new file mode 100644 index 00000000..3b6e64f5 --- /dev/null +++ b/reporting/rep201.php @@ -0,0 +1,167 @@ + $comments, + 1 => array('text' => _('End Date'), 'from' => $to, 'to' => ''), + 2 => array('text' => _('Supplier'), 'from' => get_supplier_name($fromsupp), + 'to' => get_supplier_name($tosupp)), + 3 => array( 'text' => _('Currency'),'from' => $currency, 'to' => '')); + + $rep = new FrontReport(_('Supplier Balances'), "SupplierBalances.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $total = array(); + $grandtotal = array(); + + $sql = "SELECT supplier_id, supp_name AS name, curr_code FROM ".TB_PREF."suppliers + WHERE supplier_id>=$fromsupp AND supplier_id<=$tosupp ORDER BY supp_name"; + $result = db_query($sql, "The customers could not be retrieved"); + + while ($myrow=db_fetch($result)) + { + if (!$convert && $currency != $myrow['curr_code']) + continue; + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['name']); + if ($convert) + { + $rate = get_exchange_rate_from_home_currency($myrow['curr_code'], $to); + $rep->TextCol(3, 4, $myrow['curr_code']); + } + else + $rate = 1.0; + $rep->fontSize -= 2; + $rep->NewLine(1, 2); + $res = getTransactions($myrow['supplier_id'], $to); + if (db_num_rows($res)==0) + continue; + $rep->Line($rep->row + 4); + $total[0] = $total[1] = $total[2] = $total[3] = 0.0; + while ($trans=db_fetch($res)) + { + $rep->NewLine(1, 2); + $rep->TextCol(0, 1, $trans['type_name']); + $rep->TextCol(1, 2, $trans['reference']); + $rep->TextCol(2, 3, sql2date($trans['tran_date'])); + if ($trans['type'] == 20) + $rep->TextCol(3, 4, sql2date($trans['due_date'])); + $item[0] = $item[1] = 0.0; + if ($trans['TotalAmount'] > 0.0) + { + $item[0] = Abs($trans['TotalAmount']) * $rate; + $rep->TextCol(4, 5, number_format2($item[0], $dec)); + } + else + { + $item[1] = Abs($trans['TotalAmount']) * $rate; + $rep->TextCol(5, 6, number_format2($item[1], $dec)); + } + $item[2] = $trans['Allocated'] * $rate; + $rep->TextCol(6, 7, number_format2($item[2], $dec)); + if ($trans['type'] == 20) + $item[3] = ($trans['TotalAmount'] - $trans['Allocated']) * $rate; + else + $item[3] = ($trans['TotalAmount'] + $trans['Allocated']) * $rate; + $rep->TextCol(7, 8, number_format2($item[3], $dec)); + for ($i = 0; $i < 4; $i++) + { + $total[$i] += $item[$i]; + $grandtotal[$i] += $item[$i]; + } + } + $rep->Line($rep->row - 8); + $rep->NewLine(2); + $rep->TextCol(0, 3, _('Total')); + for ($i = 0; $i < 4; $i++) + { + $rep->TextCol($i + 4, $i + 5, number_format2($total[$i], $dec)); + $total[$i] = 0.0; + } + $rep->Line($rep->row - 4); + $rep->NewLine(2); + } + $rep->fontSize += 2; + $rep->TextCol(0, 3, _('Grand Total')); + $rep->fontSize -= 2; + for ($i = 0; $i < 4; $i++) + $rep->TextCol($i + 4, $i + 5,number_format2($grandtotal[$i], $dec)); + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep202.php b/reporting/rep202.php new file mode 100644 index 00000000..62d422c6 --- /dev/null +++ b/reporting/rep202.php @@ -0,0 +1,284 @@ + 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) >= ".TB_PREF."payment_terms.days_before_due + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= 0 + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + ) AS Due, + IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $PastDueDays1) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= $PastDueDays1 + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + ) AS Overdue1, + IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."supp_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $PastDueDays2) + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."supp_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."supp_trans.tran_date)) DAY)) >= $PastDueDays2 + THEN + ".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount + ELSE + 0 + END + ) AS Overdue2 + + FROM ".TB_PREF."suppliers, + ".TB_PREF."payment_terms, + ".TB_PREF."supp_trans, + ".TB_PREF."sys_types + + WHERE ".TB_PREF."sys_types.type_id = ".TB_PREF."supp_trans.type + AND ".TB_PREF."suppliers.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."suppliers.supplier_id = ".TB_PREF."supp_trans.supplier_id + AND ".TB_PREF."supp_trans.supplier_id = $supplier_id + AND ".TB_PREF."supp_trans.tran_date <= '$todate' + AND ABS(".TB_PREF."supp_trans.ov_amount + ".TB_PREF."supp_trans.ov_gst + ".TB_PREF."supp_trans.ov_discount) > 0.004 + ORDER BY ".TB_PREF."supp_trans.tran_date"; + + + return db_query($sql, "The supplier details could not be retrieved"); +} + +//---------------------------------------------------------------------------------------------------- + +function print_aged_supplier_analysis() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $to = $_POST['PARAM_0']; + $fromsupp = $_POST['PARAM_1']; + $tosupp = $_POST['PARAM_2']; + $currency = $_POST['PARAM_3']; + $summaryOnly = $_POST['PARAM_4']; + $graphics = $_POST['PARAM_5']; + $comments = $_POST['PARAM_6']; + if ($graphics) + { + include_once($path_to_root . "reporting/includes/class.graphic.inc"); + $pg = new graph(); + } + + if ($fromsupp == null) + $fromsupp = 0; + if ($tosupp == null) + $tosupp = 0; + $dec = user_price_dec(); + + if ($summaryOnly == 1) + $summary = _('Summary Only'); + else + $summary = _('Detailed Report'); + if ($currency == reserved_words::get_all()) + { + $convert = true; + $currency = _('Balances in Home Currency'); + } + else + $convert = false; + $PastDueDays1 = get_company_pref('past_due_days'); + $PastDueDays2 = 2 * $PastDueDays1; + $nowdue = "1-" . $PastDueDays1 . " " . _('Days'); + $pastdue1 = $PastDueDays1 + 1 . "-" . $PastDueDays2 . " " . _('Days'); + $pastdue2 = _('Over') . " " . $PastDueDays2 . " " . _('Days'); + + $cols = array(0, 100, 130, 190, 250, 320, 385, 450, 515); + + $headers = array(_('Supplier'), '', '', _('Current'), $nowdue, $pastdue1,$pastdue2, + _('Total Balance')); + + $aligns = array('left', 'left', 'left', 'right', 'right', 'right', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('End Date'), 'from' => $to, 'to' => ''), + 2 => array('text' => _('Supplier'), 'from' => get_supplier_name($fromsupp), + 'to' => get_supplier_name($tosupp)), + 3 => array('text' => _('Currency'),'from' => $currency,'to' => ''), + 4 => array('text' => _('Type'), 'from' => $summary,'to' => '')); + + if ($convert) + $headers[2] = _('currency'); + $rep = new FrontReport(_('Aged Supplier Analysis'), "AgedSupplierAnalysis.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $total = array(); + $total[0] = $total[1] = $total[2] = $total[3] = $total[4] = 0.0; + $PastDueDays1 = get_company_pref('past_due_days'); + $PastDueDays2 = 2 * $PastDueDays1; + + $nowdue = "1-" . $PastDueDays1 . " " . _('Days'); + $pastdue1 = $PastDueDays1 + 1 . "-" . $PastDueDays2 . " " . _('Days'); + $pastdue2 = _('Over') . " " . $PastDueDays2 . " " . _('Days'); + + $sql = "SELECT supplier_id, supp_name AS name, curr_code FROM ".TB_PREF."suppliers + WHERE supplier_id>=$fromsupp AND supplier_id<=$tosupp ORDER BY name"; + $result = db_query($sql, "The suppliers could not be retrieved"); + + while ($myrow=db_fetch($result)) + { + if (!$convert && $currency != $myrow['curr_code']) + continue; + $rep->fontSize += 2; + $rep->TextCol(0, 3, $myrow['name']); + if ($convert) + { + $rate = get_exchange_rate_from_home_currency($myrow['curr_code'], $to); + $rep->TextCol(2, 4, $myrow['curr_code']); + } + else + $rate = 1.0; + $rep->fontSize -= 2; + $supprec = get_supplier_details($myrow['supplier_id'], $to); + foreach ($supprec as $i => $value) + $supprec[$i] *= $rate; + $total[0] += ($supprec["Balance"] - $supprec["Due"]); + $total[1] += ($supprec["Due"]-$supprec["Overdue1"]); + $total[2] += ($supprec["Overdue1"]-$supprec["Overdue2"]); + $total[3] += $supprec["Overdue2"]; + $total[4] += $supprec["Balance"]; + $str = array(number_format2(($supprec["Balance"] - $supprec["Due"]),$dec), + number_format2(($supprec["Due"]-$supprec["Overdue1"]),$dec), + number_format2(($supprec["Overdue1"]-$supprec["Overdue2"]) ,$dec), + number_format2($supprec["Overdue2"],$dec), + number_format2($supprec["Balance"],$dec)); + for ($i = 0; $i < count($str); $i++) + $rep->TextCol($i + 3, $i + 4, $str[$i]); + $rep->NewLine(1, 2); + if (!$summaryOnly) + { + $res = get_invoices($myrow['supplier_id'], $to); + if (db_num_rows($res)==0) + continue; + $rep->Line($rep->row + 4); + while ($trans=db_fetch($res)) + { + $rep->NewLine(1, 2); + $rep->TextCol(0, 1, $trans['type_name'], -2); + $rep->TextCol(1, 2, $trans['reference'], -2); + $rep->TextCol(2, 3, sql2date($trans['tran_date']), -2); + foreach ($trans as $i => $value) + $trans[$i] *= $rate; + $str = array(number_format2(($trans["Balance"] - $trans["Due"]),$dec), + number_format2(($trans["Due"]-$trans["Overdue1"]),$dec), + number_format2(($trans["Overdue1"]-$trans["Overdue2"]) ,$dec), + number_format2($trans["Overdue2"],$dec), + number_format2($trans["Balance"],$dec)); + for ($i = 0; $i < count($str); $i++) + $rep->TextCol($i + 3, $i + 4, $str[$i]); + } + $rep->Line($rep->row - 8); + $rep->NewLine(2); + } + } + if ($summaryOnly) + { + $rep->Line($rep->row + 4); + $rep->NewLine(); + } + $rep->fontSize += 2; + $rep->TextCol(0, 3, _('Grand Total')); + $rep->fontSize -= 2; + for ($i = 0; $i < count($total); $i++) + { + $rep->TextCol($i + 3, $i + 4, number_format2($total[$i], $dec)); + if ($graphics && $i < count($total) - 1) + { + $pg->y[$i] = abs($total[$i]); + } + } + $rep->Line($rep->row - 8); + if ($graphics) + { + global $decseps, $graph_skin; + $pg->x = array(_('Current'), $nowdue, $pastdue1, $pastdue2); + $pg->title = $rep->title; + $pg->axis_x = _("Days"); + $pg->axis_y = _("Amount"); + $pg->graphic_1 = $to; + $pg->type = $graphics; + $pg->skin = $graph_skin; + $pg->built_in = false; + $pg->fontfile = $path_to_root . "reporting/fonts/Vera.ttf"; + $pg->latin_notation = ($decseps[$_SESSION["wa_current_user"]->prefs->dec_sep()] != "."); + $filename = $path_to_root . "reporting/pdf_files/test.png"; + $pg->display($filename, true); + $w = $pg->width / 1.5; + $h = $pg->height / 1.5; + $x = ($rep->pageWidth - $w) / 2; + $rep->NewLine(2); + if ($rep->row - $h < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($filename, $x, $rep->row - $h, $w, $h); + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep203.php b/reporting/rep203.php new file mode 100644 index 00000000..8c4b2aed --- /dev/null +++ b/reporting/rep203.php @@ -0,0 +1,157 @@ + $comments, + 1 => array('text' => _('End Date'), 'from' => $to, 'to' => ''), + 2 => array('text' => _('Supplier'), 'from' => get_supplier_name($fromsupp), + 'to' => get_supplier_name($tosupp)), + 3 => array( 'text' => _('Currency'),'from' => $currency, 'to' => '')); + + $rep = new FrontReport(_('Payment Report'), "PaymentReport.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $total = array(); + $grandtotal = array(); + + $sql = "SELECT supplier_id, supp_name AS name, curr_code, ".TB_PREF."payment_terms.terms FROM ".TB_PREF."suppliers, ".TB_PREF."payment_terms + WHERE supplier_id>=$fromsupp AND supplier_id<=$tosupp AND ".TB_PREF."suppliers.payment_terms = ".TB_PREF."payment_terms.terms_indicator + ORDER BY supp_name"; + $result = db_query($sql, "The customers could not be retrieved"); + + while ($myrow=db_fetch($result)) + { + if (!$convert && $currency != $myrow['curr_code']) + continue; + $rep->fontSize += 2; + $rep->TextCol(0, 6, $myrow['name'] . " - " . $myrow['terms']); + if ($convert) + { + $rate = get_exchange_rate_from_home_currency($myrow['curr_code'], $to); + $rep->TextCol(6, 7, $myrow['curr_code']); + } + else + $rate = 1.0; + $rep->fontSize -= 2; + $rep->NewLine(1, 2); + $res = getTransactions($myrow['supplier_id'], $to); + if (db_num_rows($res)==0) + continue; + $rep->Line($rep->row + 4); + $total[0] = $total[1] = $total[2] = $total[3] = 0.0; + while ($trans=db_fetch($res)) + { + $rep->NewLine(1, 2); + $rep->TextCol(0, 1, $trans['type_name']); + $rep->TextCol(1, 2, $trans['supp_reference']); + $rep->TextCol(2, 3, sql2date($trans['due_date'])); + $item[0] = Abs($trans['TranTotal']) * $rate; + $rep->TextCol(6, 7, number_format2($item[0], $dec)); + $item[1] = $trans['Balance'] * $rate; + $rep->TextCol(7, 8, number_format2($item[1], $dec)); + for ($i = 0; $i < 2; $i++) + { + $total[$i] += $item[$i]; + $grandtotal[$i] += $item[$i]; + } + } + $rep->Line($rep->row - 8); + $rep->NewLine(2); + $rep->TextCol(0, 3, _('Total')); + for ($i = 0; $i < 2; $i++) + { + $rep->TextCol($i + 6, $i + 7, number_format2($total[$i], $dec)); + $total[$i] = 0.0; + } + $rep->Line($rep->row - 4); + $rep->NewLine(2); + } + $rep->fontSize += 2; + $rep->TextCol(0, 3, _('Grand Total')); + $rep->fontSize -= 2; + for ($i = 0; $i < 2; $i++) + $rep->TextCol($i + 6, $i + 7,number_format2($grandtotal[$i], $dec)); + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep204.php b/reporting/rep204.php new file mode 100644 index 00000000..a1bbf432 --- /dev/null +++ b/reporting/rep204.php @@ -0,0 +1,139 @@ +0 + AND ".TB_PREF."grn_batch.supplier_id >='" . $fromsupp . "' + AND ".TB_PREF."grn_batch.supplier_id <='" . $tosupp . "' + ORDER BY ".TB_PREF."grn_batch.supplier_id, + ".TB_PREF."grn_batch.id"; + + return db_query($sql, "No transactions were returned"); +} + +//---------------------------------------------------------------------------------------------------- + +function print_outstanding_GRN() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $fromsupp = $_POST['PARAM_0']; + $tosupp = $_POST['PARAM_1']; + $comments = $_POST['PARAM_2']; + + if ($fromsupp == null) + $fromsupp = 0; + if ($tosupp == null) + $tosupp = 0; + $dec = user_price_dec(); + + $cols = array(0, 40, 80, 190, 250, 320, 385, 450, 515); + + $headers = array(_('GRN'), _('Order'), _('Item') . '/' . _('Description'), _('Qty Recd'), _('qty Inv'), _('Balance'), + _('Std Cost'), _('Value')); + + $aligns = array('left', 'left', 'left', 'right', 'right', 'right', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Supplier'), 'from' => get_supplier_name($fromsupp), + 'to' => get_supplier_name($tosupp))); + + $rep = new FrontReport(_('Outstanding GRNs Report'), "OutstandingGRN.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $Tot_Val=0; + $Supplier = ''; + $SuppTot_Val=0; + $res = getTransactions($fromsupp, $tosupp); + + While ($GRNs = db_fetch($res)) + { + if ($Supplier != $GRNs['supplier_id']) + { + if ($Supplier != '') + { + $rep->NewLine(2); + $rep->TextCol(0, 7, _('Total')); + $rep->TextCol(7, 8, number_format2($SuppTot_Val, $dec)); + $rep->Line($rep->row - 2); + $rep->NewLine(3); + $SuppTot_Val = 0; + } + $rep->TextCol(0, 6, $GRNs['supp_name']); + $Supplier = $GRNs['supplier_id']; + } + $rep->NewLine(); + $rep->TextCol(0, 1, $GRNs['id']); + $rep->TextCol(1, 2, $GRNs['order_no']); + $rep->TextCol(2, 3, $GRNs['item_code'] . '-' . $GRNs['description']); + $rep->TextCol(3, 4, number_format2($GRNs['qty_recd'], $dec)); + $rep->TextCol(4, 5, number_format2($GRNs['quantity_inv'], $dec)); + $QtyOstg = $GRNs['qty_recd'] - $GRNs['quantity_inv']; + $Value = ($GRNs['qty_recd'] - $GRNs['quantity_inv']) * $GRNs['std_cost_unit']; + $rep->TextCol(5, 6, number_format2($QtyOstg, $dec)); + $rep->TextCol(6, 7, number_format2($GRNs['std_cost_unit'], $dec)); + $rep->TextCol(7, 8, number_format2($Value, $dec)); + $Tot_Val += $Value; + $SuppTot_Val += $Value; + + $rep->NewLine(0, 1); + } + if ($Supplier != '') + { + $rep->NewLine(); + $rep->TextCol(0, 7, _('Total')); + $rep->TextCol(7, 8, number_format2($SuppTot_Val, $dec)); + $rep->Line($rep->row - 2); + $rep->NewLine(3); + $SuppTot_Val = 0; + } + $rep->NewLine(2); + $rep->TextCol(0, 7, _('Grand Total')); + $rep->TextCol(7, 8, number_format2($Tot_Val, $dec)); + $rep->Line($rep->row - 2); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep209.php b/reporting/rep209.php new file mode 100644 index 00000000..947dd64d --- /dev/null +++ b/reporting/rep209.php @@ -0,0 +1,162 @@ + $comments, + 'bankaccount' => $bankaccount); + + $baccount = get_bank_account($params['bankaccount']); + $cur = get_company_Pref('curr_default'); + + if ($email == 0) + { + $rep = new FrontReport(_('PURCHASE ORDER'), "PurchaseOrderBulk.pdf", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->Info($params, $cols, null, $aligns); + } + + for ($i = $from; $i <= $to; $i++) + { + $myrow = get_po($i); + + if ($email == 1) + { + $rep = new FrontReport("", "", user_pagesize()); + $rep->currency = $cur; + $rep->Font(); + $rep->title = _('PURCHASE_ORDER'); + $rep->filename = "PurchaseOrder" . $i . ".pdf"; + $rep->Info($params, $cols, null, $aligns); + } + else + $rep->title = _('PURCHASE ORDER'); + $rep->Header2($myrow, null, $myrow, $baccount, 8); + + $result = get_po_details($i); + $SubTotal = 0; + while ($myrow2=db_fetch($result)) + { + $Net = ($myrow2["unit_price"] * $myrow2["quantity_ordered"]); + $SubTotal += $Net; + $DisplayPrice = number_format2($myrow2["unit_price"],$dec); + $DisplayQty = number_format2($myrow2["quantity_ordered"],user_qty_dec()); + $DisplayNet = number_format2($Net,$dec); + //$rep->TextCol(0, 1, $myrow2['item_code'], -2); + $rep->TextCol(0, 2, $myrow2['description'], -2); + $rep->TextCol(2, 3, $myrow2['delivery_date'], -2); + $rep->TextCol(3, 4, $DisplayQty, -2); + $rep->TextCol(4, 5, $myrow2['units'], -2); + $rep->TextCol(5, 6, $DisplayPrice, -2); + $rep->TextCol(6, 7, $DisplayNet, -2); + $rep->NewLine(1); + if ($rep->row < $rep->bottomMargin + (15 * $rep->lineHeight)) + $rep->Header2($myrow, $branch, $sales_order, $baccount); + } + if ($myrow['comments'] != "") + { + $rep->NewLine(); + $rep->TextColLines(1, 5, $myrow['comments'], -2); + } + $DisplaySubTot = number_format2($SubTotal,$dec); + + $rep->row = $rep->bottomMargin + (15 * $rep->lineHeight); + $linetype = true; + $doctype = 8; + if ($rep->currency != $myrow['curr_code']) + { + include($path_to_root . "reporting/includes/doctext2.inc"); + } + else + { + include($path_to_root . "reporting/includes/doctext.inc"); + } + + $rep->TextCol(3, 6, $doc_Sub_total, -2); + $rep->TextCol(6, 7, $DisplaySubTot, -2); + $rep->NewLine(); + $DisplayTotal = number_format2($SubTotal, $dec); + $rep->Font('bold'); + $rep->TextCol(3, 6, $doc_TOTAL_PO, - 2); + $rep->TextCol(6, 7, $DisplayTotal, -2); + $rep->Font(); + if ($email == 1) + { + if ($myrow['contact_email'] == '') + { + $myrow['contact_email'] = $branch['email']; + $myrow['DebtorName'] = $branch['br_name']; + } + $rep->End($email, $doc_Invoice_no . " " . $myrow['reference'], $myrow); + } + } + if ($email == 0) + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep301.php b/reporting/rep301.php new file mode 100644 index 00000000..17787733 --- /dev/null +++ b/reporting/rep301.php @@ -0,0 +1,160 @@ + $comments, + 1 => array('text' => _('Category'), 'from' => $cat, 'to' => ''), + 2 => array('text' => _('Location'), 'from' => $loc, 'to' => '')); + + $rep = new FrontReport(_('Inventory Valuation Report'), "InventoryValReport.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $res = getTransactions($category, $location); + $total = $grandtotal = 0.0; + $catt = ''; + while ($trans=db_fetch($res)) + { + if ($catt != $trans['cat_description']) + { + if ($catt != '') + { + if ($detail) + { + $rep->NewLine(2, 3); + $rep->TextCol(0, 4, _('Total')); + } + $rep->Textcol(4, 5, number_format2($total, $dec)); + if ($detail) + { + $rep->Line($rep->row - 2); + $rep->NewLine(); + } + $rep->NewLine(); + $total = 0.0; + } + $rep->TextCol(0, 1, $trans['category_id']); + $rep->TextCol(1, 2, $trans['cat_description']); + $catt = $trans['cat_description']; + if ($detail) + $rep->NewLine(); + } + if ($detail) + { + $rep->NewLine(); + $rep->fontsize -= 2; + $rep->TextCol(0, 1, $trans['stock_id']); + $rep->TextCol(1, 2, $trans['description']); + $rep->TextCol(2, 3, number_format2($trans['QtyOnHand'], user_qty_dec())); + $rep->TextCol(3, 4, number_format2($trans['UnitCost'], $dec)); + $rep->TextCol(4, 5, number_format2($trans['ItemTotal'], $dec)); + $rep->fontsize += 2; + } + $total += $trans['ItemTotal']; + $grandtotal += $trans['ItemTotal']; + } + if ($detail) + { + $rep->NewLine(2, 3); + $rep->TextCol(0, 4, _('Total')); + } + $rep->Textcol(4, 5, number_format2($total, $dec)); + if ($detail) + { + $rep->Line($rep->row - 2); + $rep->NewLine(); + } + $rep->NewLine(2, 1); + $rep->TextCol(0, 4, _('Grand Total')); + $rep->TextCol(4, 5, number_format2($grandtotal, $dec)); + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep302.php b/reporting/rep302.php new file mode 100644 index 00000000..c9255bd2 --- /dev/null +++ b/reporting/rep302.php @@ -0,0 +1,232 @@ + 0 AND + ".TB_PREF."bom.component='$stockid' AND + ".TB_PREF."stock_master.stock_id=".TB_PREF."bom.parent AND + ".TB_PREF."stock_master.mb_flag='A'"; + + $TransResult = db_query($sql,"No transactions were returned"); + if (db_num_rows($TransResult) == 1) + { + $DemandRow = db_fetch_row($TransResult); + $DemandQty = $DemandRow[0]; + } + else + $DemandQty = 0.0; + + return $DemandQty; +} + +function getSuppQty($stockid, $location) +{ + $sql = "SELECT SUM(".TB_PREF."purch_order_details.quantity_ordered - ".TB_PREF."purch_order_details.quantity_received) AS QtyOnOrder + FROM ".TB_PREF."purch_order_details, + ".TB_PREF."purch_orders + WHERE ".TB_PREF."purch_order_details.order_no = ".TB_PREF."purch_orders.order_no + AND ".TB_PREF."purch_order_details.item_code = '$stockid' + AND ".TB_PREF."purch_orders.into_stock_location= '$location'"; + + $TransResult = db_query($sql,"No transactions were returned"); + $DemandRow = db_fetch($TransResult); + return $DemandRow['QtyOnOrder']; +} + +function getPeriods($stockid, $location) +{ + $date5 = date('Y-m-d'); + $date4 = date('Y-m-d',mktime(0,0,0,date('m'),1,date('Y'))); + $date3 = date('Y-m-d',mktime(0,0,0,date('m')-1,1,date('Y'))); + $date2 = date('Y-m-d',mktime(0,0,0,date('m')-2,1,date('Y'))); + $date1 = date('Y-m-d',mktime(0,0,0,date('m')-3,1,date('Y'))); + $date0 = date('Y-m-d',mktime(0,0,0,date('m')-4,1,date('Y'))); + + $sql = "SELECT SUM(CASE WHEN tran_date >= '$date0' AND tran_date < '$date1' THEN -qty ELSE 0 END) AS prd0, + SUM(CASE WHEN tran_date >= '$date1' AND tran_date < '$date2' THEN -qty ELSE 0 END) AS prd1, + SUM(CASE WHEN tran_date >= '$date2' AND tran_date < '$date3' THEN -qty ELSE 0 END) AS prd2, + SUM(CASE WHEN tran_date >= '$date3' AND tran_date < '$date4' THEN -qty ELSE 0 END) AS prd3, + SUM(CASE WHEN tran_date >= '$date4' AND tran_date <= '$date5' THEN -qty ELSE 0 END) AS prd4 + FROM ".TB_PREF."stock_moves + WHERE stock_id='$stockid' + AND loc_code ='$location' + AND (type=10 OR type=11) + AND visible=1"; + + $TransResult = db_query($sql,"No transactions were returned"); + return db_fetch($TransResult); +} + +//---------------------------------------------------------------------------------------------------- + +function print_inventory_planning() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $category = $_POST['PARAM_0']; + $location = $_POST['PARAM_1']; + $comments = $_POST['PARAM_2']; + + $dec = user_qty_dec(); + + if ($category == reserved_words::get_all_numeric()) + $category = 0; + if ($category == 0) + $cat = _('All'); + else + $cat = get_category_name($category); + + if ($location == reserved_words::get_all()) + $location = 'all'; + if ($location == 'all') + $loc = _('All'); + else + $loc = $location; + + $cols = array(0, 50, 150, 180, 210, 240, 270, 300, 330, 390, 435, 480, 525); + + $per0 = strftime('%b',mktime(0,0,0,date('m'),date('d'),date('Y'))); + $per1 = strftime('%b',mktime(0,0,0,date('m')-1,date('d'),date('Y'))); + $per2 = strftime('%b',mktime(0,0,0,date('m')-2,date('d'),date('Y'))); + $per3 = strftime('%b',mktime(0,0,0,date('m')-3,date('d'),date('Y'))); + $per4 = strftime('%b',mktime(0,0,0,date('m')-4,date('d'),date('Y'))); + + $headers = array(_('Category'), '', $per4, $per3, $per2, $per1, $per0, '3*M', + _('QOH'), _('Cust Ord'), _('Supp Ord'), _('Sugg Ord')); + + $aligns = array('left', 'left', 'right', 'right', 'right', 'right', 'right', 'right', + 'right', 'right', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Category'), 'from' => $cat, 'to' => ''), + 2 => array('text' => _('Location'), 'from' => $loc, 'to' => '')); + + $rep = new FrontReport(_('Inventory Planning Report'), "InventoryPlanning.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $res = getTransactions($category, $location); + $catt = ''; + while ($trans=db_fetch($res)) + { + if ($catt != $trans['cat_description']) + { + if ($catt != '') + { + $rep->Line($rep->row - 2); + $rep->NewLine(2, 3); + } + $rep->TextCol(0, 1, $trans['category_id']); + $rep->TextCol(1, 2, $trans['cat_description']); + $catt = $trans['cat_description']; + $rep->NewLine(); + } + + $custqty = getCustQty($trans['stock_id'], $trans['loc_code']); + $custqty += getCustAsmQty($trans['stock_id'], $trans['loc_code']); + $suppqty = getSuppQty($trans['stock_id'], $trans['loc_code']); + $period = getPeriods($trans['stock_id'], $trans['loc_code']); + $rep->NewLine(); + $rep->TextCol(0, 1, $trans['stock_id']); + $rep->TextCol(1, 2, $trans['description']); + $rep->TextCol(2, 3, number_format2($period['prd0'], $dec)); + $rep->TextCol(3, 4, number_format2($period['prd1'], $dec)); + $rep->TextCol(4, 5, number_format2($period['prd2'], $dec)); + $rep->TextCol(5, 6, number_format2($period['prd3'], $dec)); + $rep->TextCol(6, 7, number_format2($period['prd4'], $dec)); + + $MaxMthSales = Max($period['prd0'], $period['prd1'], $period['prd2'], $period['prd3']); + $IdealStockHolding = $MaxMthSales * 3; + $rep->TextCol(7, 8, number_format2($IdealStockHolding, $dec)); + + $rep->TextCol(8, 9, number_format2($trans['qty_on_hand'], $dec)); + $rep->TextCol(9, 10, number_format2($custqty, $dec)); + $rep->TextCol(10, 11, number_format2($suppqty, $dec)); + + $SuggestedTopUpOrder = $IdealStockHolding - $trans['qty_on_hand'] + $custqty - $suppqty; + if ($SuggestedTopUpOrder < 0.0) + $SuggestedTopUpOrder = 0.0; + $rep->TextCol(11, 12, number_format2($SuggestedTopUpOrder, $dec)); + } + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep303.php b/reporting/rep303.php new file mode 100644 index 00000000..88328304 --- /dev/null +++ b/reporting/rep303.php @@ -0,0 +1,185 @@ + 0 AND + ".TB_PREF."bom.component='$stockid' AND + ".TB_PREF."stock_master.stock_id=".TB_PREF."bom.parent AND + ".TB_PREF."stock_master.mb_flag='A'"; + + $TransResult = db_query($sql,"No transactions were returned"); + if (db_num_rows($TransResult)==1) + { + $DemandRow = db_fetch_row($TransResult); + $DemandQty = $DemandRow[0]; + } + else + $DemandQty = 0.0; + + return $DemandQty; +} + +//---------------------------------------------------------------------------------------------------- + +function print_stock_check() +{ + global $path_to_root, $pic_height, $pic_width; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $category = $_POST['PARAM_0']; + $location = $_POST['PARAM_1']; + $pictures = $_POST['PARAM_2']; + $comments = $_POST['PARAM_3']; + + $dec = user_qty_dec(); + + if ($category == reserved_words::get_all_numeric()) + $category = 0; + if ($category == 0) + $cat = _('All'); + else + $cat = get_category_name($category); + + if ($location == reserved_words::get_all()) + $location = 'all'; + if ($location == 'all') + $loc = _('All'); + else + $loc = $location; + + $cols = array(0, 100, 305, 375, 445, 515); + + $headers = array(_('Category'), _('Description'), _('Quantity'), _('Demand'), _('Difference')); + + $aligns = array('left', 'left', 'right', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Category'), 'from' => $cat, 'to' => ''), + 2 => array('text' => _('Location'), 'from' => $loc, 'to' => '')); + + if ($pictures) + $user_comp = user_company(); + else + $user_comp = ""; + + $rep = new FrontReport(_('Stock Check Sheets'), "StockCheckSheet.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $res = getTransactions($category, $location); + $catt = ''; + while ($trans=db_fetch($res)) + { + if ($catt != $trans['cat_description']) + { + if ($catt != '') + { + $rep->Line($rep->row - 2); + $rep->NewLine(2, 3); + } + $rep->TextCol(0, 1, $trans['category_id']); + $rep->TextCol(1, 2, $trans['cat_description']); + $catt = $trans['cat_description']; + $rep->NewLine(); + } + $demandqty = getDemandQty($trans['stock_id'], $trans['loc_code']); + $demandqty += getDemandAsmQty($trans['stock_id'], $trans['loc_code']); + $rep->NewLine(); + $rep->TextCol(0, 1, $trans['stock_id']); + $rep->TextCol(1, 2, $trans['description']); + $rep->TextCol(2, 3, number_format2($trans['QtyOnHand'], $dec)); + $rep->TextCol(3, 4, number_format2($demandqty, $dec)); + $rep->TextCol(4, 5, number_format2($trans['QtyOnHand'] - $demandqty, $dec)); + if ($pictures) + { + $image = $path_to_root . "inventory/manage/image/" . $user_comp . "/" . $trans['stock_id'] . ".jpg"; + if (file_exists($image)) + { + $rep->NewLine(); + if ($rep->row - $height < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($image, $rep->cols[1], $rep->row - $pic_height, $pic_width, $pic_height); + $rep->row -= $pic_height; + $rep->NewLine(); + } + } + } + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep401.php b/reporting/rep401.php new file mode 100644 index 00000000..c0d3987d --- /dev/null +++ b/reporting/rep401.php @@ -0,0 +1,102 @@ += '$from' + AND ".TB_PREF."bom.parent <= '$to' + ORDER BY + ".TB_PREF."bom.parent, + ".TB_PREF."bom.component"; + + return db_query($sql,"No transactions were returned"); +} + +//---------------------------------------------------------------------------------------------------- + +function print_bill_of_material() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $frompart = $_POST['PARAM_0']; + $topart = $_POST['PARAM_1']; + $comments = $_POST['PARAM_2']; + + $dec = user_qty_dec(); + + $cols = array(0, 50, 305, 375, 445, 515); + + $headers = array(_('Component'), _('Description'), _('Loc'), _('Wrk Ctr'), _('Quantity')); + + $aligns = array('left', 'left', 'left', 'left', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Component'), 'from' => $frompart, 'to' => $topart)); + + $rep = new FrontReport(_('Bill of Material Listing'), "BillOfMaterial.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $res = getTransactions($frompart, $topart); + $parent = ''; + while ($trans=db_fetch($res)) + { + if ($parent != $trans['parent']) + { + if ($parent != '') + { + $rep->Line($rep->row - 2); + $rep->NewLine(2, 3); + } + $rep->TextCol(0, 1, $trans['parent']); + $desc = get_item($trans['parent']); + $rep->TextCol(1, 2, $desc['description']); + $parent = $trans['parent']; + $rep->NewLine(); + } + + $rep->NewLine(); + $rep->TextCol(0, 1, $trans['component']); + $rep->TextCol(1, 2, $trans['CompDescription']); + $rep->TextCol(2, 3, $trans['loc_code']); + $rep->TextCol(3, 4, $trans['workcentre_added']); + $rep->TextCol(4, 5, number_format2($trans['quantity'], $dec)); + } + $rep->Line($rep->row - 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep501.php b/reporting/rep501.php new file mode 100644 index 00000000..d0c270f4 --- /dev/null +++ b/reporting/rep501.php @@ -0,0 +1,112 @@ += '$from' + AND reference <= '$to' + ORDER BY + reference"; + + return db_query($sql,"No transactions were returned"); +} + +function getYTD($dim) +{ + $date = Today(); + $date = begin_fiscalyear($date); + date2sql($date); + + $sql = "SELECT SUM(amount) AS Balance + FROM + ".TB_PREF."gl_trans + WHERE (dimension_id = '$dim' OR dimension2_id = '$dim') + AND tran_date >= '$date'"; + + $TransResult = db_query($sql,"No transactions were returned"); + if (db_num_rows($TransResult) == 1) + { + $DemandRow = db_fetch_row($TransResult); + $balance = $DemandRow[0]; + } + else + $balance = 0.0; + + return $balance; +} + +//---------------------------------------------------------------------------------------------------- + +function print_dimension_summary() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $fromdim = $_POST['PARAM_0']; + $todim = $_POST['PARAM_1']; + $showbal = $_POST['PARAM_2']; + $comments = $_POST['PARAM_3']; + + + $cols = array(0, 50, 210, 250, 320, 395, 465, 515); + + $headers = array(_('Reference'), _('Name'), _('Type'), _('Date'), _('Due Date'), _('Closed'), _('YTD')); + + $aligns = array('left', 'left', 'left', 'left', 'left', 'left', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Dimension'), 'from' => $fromdim, 'to' => $todim)); + + $rep = new FrontReport(_('Dimension Summary'), "DimensionSummary.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $res = getTransactions($fromdim, $todim); + while ($trans=db_fetch($res)) + { + $rep->TextCol(0, 1, $trans['reference']); + $rep->TextCol(1, 2, $trans['name']); + $rep->TextCol(2, 3, $trans['type_']); + $rep->TextCol(3, 4, $trans['date_']); + $rep->TextCol(4, 5, $trans['due_date']); + if ($trans['closed']) + $str = _('Yes'); + else + $str = _('No'); + $rep->TextCol(5, 6, $str); + if ($showbal) + { + $balance = getYTD($trans['id']); + $rep->TextCol(6, 7, number_format2($balance, 0)); + } + $rep->NewLine(1, 2); + } + $rep->Line($rep->row); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep701.php b/reporting/rep701.php new file mode 100644 index 00000000..f01628f8 --- /dev/null +++ b/reporting/rep701.php @@ -0,0 +1,97 @@ + $comments); + + $rep = new FrontReport(_('Chart of Accounts'), "ChartOfAccounts.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $classname = ''; + $group = ''; + + $accounts = get_gl_accounts_all(); + + while ($account=db_fetch($accounts)) + { + if ($showbalance == 1) + { + $begin = begin_fiscalyear(); + if (is_account_balancesheet($account["account_code"])) + $begin = ""; + $balance = get_gl_trans_from_to($begin, ToDay(), $account["account_code"], 0); + } + if ($account['AccountTypeName'] != $group) + { + if ($classname != '') + $rep->row -= 4; + if ($account['AccountClassName'] != $classname) + { + $rep->Font('bold'); + $rep->TextCol(0, 4, $account['AccountClassName']); + $rep->Font(); + $rep->row -= ($rep->lineHeight + 4); + } + $group = $account['AccountTypeName']; + $rep->TextCol(0, 4, $account['AccountTypeName']); + //$rep->Line($rep->row - 4); + $rep->row -= ($rep->lineHeight + 4); + } + $classname = $account['AccountClassName']; + + $rep->TextCol(0, 1, $account['account_code']); + $rep->TextCol(1, 2, $account['account_name']); + $rep->TextCol(2, 3, $account['account_code2']); + if ($showbalance == 1) + $rep->TextCol(3, 4, number_format2($balance, $dec)); + + $rep->NewLine(); + if ($rep->row < $rep->bottomMargin + 3 * $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + $rep->Line($rep->row); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep702.php b/reporting/rep702.php new file mode 100644 index 00000000..dff13c1a --- /dev/null +++ b/reporting/rep702.php @@ -0,0 +1,99 @@ + $comments, + 1 => array('text' => _('Period'), 'from' => $from,'to' => $to), + 2 => array('text' => _('Type'), 'from' => systypes::name($systype), + 'to' => '')); + + $rep = new FrontReport(_('List of Journal Entries'), "JournalEntries.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + if ($systype == -1) + $systype = null; + + $trans = get_gl_transactions($from, $to, -1, null, 0, $systype); + + $typeno = 0; + while ($myrow=db_fetch($trans)) + { + if ($typeno != $myrow['type_no']) + { + if ($typeno != 0) + { + $rep->Line($rep->row + 4); + $rep->NewLine(); + } + $typeno = $myrow['type_no']; + $TransName = systypes::name($myrow['type']); + $rep->TextCol(0, 2, $TransName . " # " . $myrow['type_no']); + $rep->TextCol(2, 3, sql2date($myrow['tran_date'])); + $coms = payment_person_types::person_name($myrow["person_type_id"],$myrow["person_id"]); + $memo = get_comments_string($myrow['type'], $myrow['type_no']); + if ($memo != '') + $coms .= ($coms!= "")?"/":"" . $memo; + $rep->TextCol(3, 6, $coms); + $rep->NewLine(2); + } + $rep->TextCol(0, 1, $myrow['account']); + $rep->TextCol(1, 2, $myrow['account_name']); + $dim_str = get_dimension_string($myrow['dimension_id']); + $dim_str2 = get_dimension_string($myrow['dimension2_id']); + if ($dim_str2 != "") + $dim_str .= "/".$dim_str2; + $rep->TextCol(2, 3, $dim_str); + $rep->TextCol(3, 4, $myrow['memo_']); + if ($myrow['amount'] > 0.0) + $rep->TextCol(4, 5, number_format2(abs($myrow['amount']), $dec)); + else + $rep->TextCol(5, 6, number_format2(abs($myrow['amount']), $dec)); + $rep->NewLine(1, 2); + } + $rep->Line($rep->row + 4); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep704.php b/reporting/rep704.php new file mode 100644 index 00000000..1c6b091f --- /dev/null +++ b/reporting/rep704.php @@ -0,0 +1,167 @@ + $comments, + 1 => array('text' => _('Period'), 'from' => $from, 'to' => $to), + 2 => array('text' => _('Accounts'),'from' => $fromacc,'to' => $toacc), + 3 => array('text' => _('Dimension')." 1", 'from' => get_dimension_string($dimension), + 'to' => ''), + 4 => array('text' => _('Dimension')." 2", 'from' => get_dimension_string($dimension2), + 'to' => '')); + } + else if ($dim == 1) + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'), 'from' => $from, 'to' => $to), + 2 => array('text' => _('Accounts'),'from' => $fromacc,'to' => $toacc), + 3 => array('text' => _('Dimension'), 'from' => get_dimension_string($dimension), + 'to' => '')); + } + else + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'), 'from' => $from, 'to' => $to), + 2 => array('text' => _('Accounts'),'from' => $fromacc,'to' => $toacc)); + } + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $accounts = get_gl_accounts($fromacc, $toacc); + + while ($account=db_fetch($accounts)) + { + $begin = begin_fiscalyear(); + if (is_account_balancesheet($account["account_code"])) + $begin = ""; + elseif ($from < $begin) + $begin = $from; + $prev_balance = get_gl_balance_from_to($begin, $from, $account["account_code"], $dimension, $dimension2); + + $trans = get_gl_transactions($from, $to, -1, $account['account_code'], $dimension, $dimension2); + $rows = db_num_rows($trans); + if ($prev_balance == 0.0 && $rows == 0) + continue; + $rep->Font('bold'); + $rep->TextCol(0, 3, $account['account_code'] . " " . $account['account_name']); + $rep->TextCol(3, 5, _('Opening Balance')); + if ($prev_balance > 0.0) + $rep->TextCol(6, 7, number_format2(abs($prev_balance), $dec)); + else + $rep->TextCol(7, 8, number_format2(abs($prev_balance), $dec)); + $rep->Font(); + $total = $prev_balance; + $rep->NewLine(2); + if ($rows > 0) + { + while ($myrow=db_fetch($trans)) + { + $total += $myrow['amount']; + + $rep->TextCol(0, 1, systypes::name($myrow["type"])); + $rep->TextCol(1, 2, $myrow['type_no']); + $rep->TextCol(2, 3, sql2date($myrow["tran_date"])); + if ($dim >= 1) + $rep->TextCol(3, 4, get_dimension_string($myrow['dimension_id'])); + if ($dim > 1) + $rep->TextCol(4, 5, get_dimension_string($myrow['dimension2_id'])); + $rep->TextCol(5, 6, payment_person_types::person_name($myrow["person_type_id"],$myrow["person_id"], false)); + if ($myrow['amount'] > 0.0) + $rep->TextCol(6, 7, number_format2(abs($myrow['amount']), $dec)); + else + $rep->TextCol(7, 8, number_format2(abs($myrow['amount']), $dec)); + $rep->TextCol(8, 9, number_format2($total, $dec)); + $rep->NewLine(); + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + $rep->NewLine(); + } + $rep->Font('bold'); + $rep->TextCol(3, 5, _("Ending Balance")); + if ($total > 0.0) + $rep->TextCol(6, 7, number_format2(abs($total), $dec)); + else + $rep->TextCol(7, 8, number_format2(abs($total), $dec)); + $rep->Font(); + $rep->Line($rep->row - $rep->lineHeight + 4); + $rep->NewLine(2, 1); + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep705.php b/reporting/rep705.php new file mode 100644 index 00000000..90a5e97e --- /dev/null +++ b/reporting/rep705.php @@ -0,0 +1,302 @@ += '$date01' AND tran_date < '$date02' THEN -amount / 1000 ELSE 0 END) AS per01, + SUM(CASE WHEN tran_date >= '$date02' AND tran_date < '$date03' THEN -amount / 1000 ELSE 0 END) AS per02, + SUM(CASE WHEN tran_date >= '$date03' AND tran_date < '$date04' THEN -amount / 1000 ELSE 0 END) AS per03, + SUM(CASE WHEN tran_date >= '$date04' AND tran_date < '$date05' THEN -amount / 1000 ELSE 0 END) AS per04, + SUM(CASE WHEN tran_date >= '$date05' AND tran_date < '$date06' THEN -amount / 1000 ELSE 0 END) AS per05, + SUM(CASE WHEN tran_date >= '$date06' AND tran_date < '$date07' THEN -amount / 1000 ELSE 0 END) AS per06, + SUM(CASE WHEN tran_date >= '$date07' AND tran_date < '$date08' THEN -amount / 1000 ELSE 0 END) AS per07, + SUM(CASE WHEN tran_date >= '$date08' AND tran_date < '$date09' THEN -amount / 1000 ELSE 0 END) AS per08, + SUM(CASE WHEN tran_date >= '$date09' AND tran_date < '$date10' THEN -amount / 1000 ELSE 0 END) AS per09, + SUM(CASE WHEN tran_date >= '$date10' AND tran_date < '$date11' THEN -amount / 1000 ELSE 0 END) AS per10, + SUM(CASE WHEN tran_date >= '$date11' AND tran_date < '$date12' THEN -amount / 1000 ELSE 0 END) AS per11, + SUM(CASE WHEN tran_date >= '$date12' AND tran_date < '$date13' THEN -amount / 1000 ELSE 0 END) AS per12 + FROM ".TB_PREF."gl_trans + WHERE account='$account'"; + if ($dimension > 0) + $sql .= " AND dimension_id = $dimension"; + if ($dimension2 > 0) + $sql .= " AND dimension2_id = $dimension2"; + + $result = db_query($sql, "Transactions for account $account could not be calculated"); + + return db_fetch($result); +} + +//---------------------------------------------------------------------------------------------------- + +function print_annual_expense_breakdown() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + $dim = get_company_pref('use_dimension'); + $dimension = $dimension2 = 0; + + if ($dim == 2) + { + $year = $_POST['PARAM_0']; + $dimension = $_POST['PARAM_1']; + $dimension2 = $_POST['PARAM_2']; + $comments = $_POST['PARAM_3']; + } + else if ($dim == 1) + { + $year = $_POST['PARAM_0']; + $dimension = $_POST['PARAM_1']; + $comments = $_POST['PARAM_2']; + } + else + { + $year = $_POST['PARAM_0']; + $comments = $_POST['PARAM_1']; + } + $dec = 1; + //$pdec = user_percent_dec(); + + $cols = array(0, 40, 150, 180, 210, 240, 270, 300, 330, 360, 390, 420, 450, 480, 510); + //------------0--1---2----3----4----5----6----7----8----10---11---12---13---14---15- + + //$yr = date('Y'); + //$mo = date('m'): + // from now + $yr = $year; + $mo = 12; + $da = 1; + $per12 = strftime('%b',mktime(0,0,0,$mo,$da,$yr)); + $per11 = strftime('%b',mktime(0,0,0,$mo-1,$da,$yr)); + $per10 = strftime('%b',mktime(0,0,0,$mo-2,$da,$yr)); + $per09 = strftime('%b',mktime(0,0,0,$mo-3,$da,$yr)); + $per08 = strftime('%b',mktime(0,0,0,$mo-4,$da,$yr)); + $per07 = strftime('%b',mktime(0,0,0,$mo-5,$da,$yr)); + $per06 = strftime('%b',mktime(0,0,0,$mo-6,$da,$yr)); + $per05 = strftime('%b',mktime(0,0,0,$mo-7,$da,$yr)); + $per04 = strftime('%b',mktime(0,0,0,$mo-8,$da,$yr)); + $per03 = strftime('%b',mktime(0,0,0,$mo-9,$da,$yr)); + $per02 = strftime('%b',mktime(0,0,0,$mo-10,$da,$yr)); + $per01 = strftime('%b',mktime(0,0,0,$mo-11,$da,$yr)); + + $headers = array(_('Account'), _('Account Name'), $per01, $per02, $per03, $per04, + $per05, $per06, $per07, $per08, $per09, $per10, $per11, $per12); + + $aligns = array('left', 'left', 'right', 'right', 'right', 'right', 'right', 'right', + 'right', 'right', 'right', 'right', 'right', 'right'); + + if ($dim == 2) + { + $params = array( 0 => $comments, + 1 => array('text' => _("Year"), + 'from' => $year, 'to' => ''), + 2 => array('text' => _("Dimension")." 1", + 'from' => get_dimension_string($dimension), 'to' => ''), + 3 => array('text' => _("Dimension")." 2", + 'from' => get_dimension_string($dimension2), 'to' => ''), + 4 => array('text' => _('Info'), 'from' => _('Amounts in thousands'), + 'to' => '')); + } + else if ($dim == 1) + { + $params = array( 0 => $comments, + 1 => array('text' => _("Year"), + 'from' => $year, 'to' => ''), + 2 => array('text' => _('Dimension'), + 'from' => get_dimension_string($dimension), 'to' => ''), + 3 => array('text' => _('Info'), 'from' => _('Amounts in thousands'), + 'to' => '')); + } + else + { + $params = array( 0 => $comments, + 1 => array('text' => _("Year"), + 'from' => $year, 'to' => ''), + 2 => array('text' => _('Info'), 'from' => _('Amounts in thousands'), + 'to' => '')); + } + + $rep = new FrontReport(_('Annual Expense Breakdown'), "AnnualBreakDown.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $classname = ''; + $group = ''; + $total = Array(); + $total2 = Array(); + $sales = Array(); + $calc = Array(); + unset($total); + unset($total2); + unset($sales); + unset($calc); + $accounts = get_gl_accounts_all(0); + + while ($account = db_fetch($accounts)) + { + $bal = getPeriods($year, $account["account_code"], $dimension, $dimension2); + if (!$bal['per01'] && !$bal['per02'] && !$bal['per03'] && !$bal['per04'] && + !$bal['per05'] && !$bal['per06'] && !$bal['per07'] && !$bal['per08'] && + !$bal['per09'] && !$bal['per10'] && !$bal['per11'] && !$bal['per12']) + continue; + //if (array_sum($bal) == 0.0) + //$i = 1; + //foreach ($bal as $b) + // $balance[$i++] = $b; + //$balance = $bal; + $balance = Array(1 => $bal['per01'], $bal['per02'], $bal['per03'], $bal['per04'], + $bal['per05'], $bal['per06'], $bal['per07'], $bal['per08'], + $bal['per09'], $bal['per10'], $bal['per11'], $bal['per12']); + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + for ($i = 1; $i <= 12; $i++) + $rep->TextCol($i + 1, $i + 2, number_format2($total[$i], $dec)); + unset($total); + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + for ($i = 1; $i <= 12; $i++) + { + $rep->TextCol($i + 1, $i + 2, number_format2($total2[$i], $dec)); + $sales[$i] += $total2[$i]; + } + $rep->Font(); + unset($total2); + $rep->NewLine(3); + $closeclass = false; + } + } + if ($account['AccountClassName'] != $classname) + { + $rep->Font('bold'); + $rep->TextCol(0, 5, $account['AccountClassName']); + $rep->Font(); + $rep->row -= ($rep->lineHeight + 4); + } + $group = $account['AccountTypeName']; + $rep->TextCol(0, 5, $account['AccountTypeName']); + $rep->Line($rep->row - 4); + $rep->row -= ($rep->lineHeight + 4); + } + $classname = $account['AccountClassName']; + $rep->TextCol(0, 1, $account['account_code']); + $rep->TextCol(1, 2, $account['account_name']); + for ($i = 1; $i <= 12; $i++) + { + $rep->TextCol($i + 1, $i + 2, number_format2($balance[$i], $dec)); + $total[$i] += $balance[$i]; + $total2[$i] += $balance[$i]; + } + + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + 3 * $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + for ($i = 1; $i <= 12; $i++) + $rep->TextCol($i + 1, $i + 2, number_format2($total[$i], $dec)); + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + for ($i = 1; $i <= 12; $i++) + { + $rep->TextCol($i + 1, $i + 2, number_format2($total2[$i], $dec)); + $calc[$i] = $sales[$i] + $total2[$i]; + } + + $rep->row -= ($rep->lineHeight + 8); + $rep->TextCol(0, 2, _('Calculated Return')); + for ($i = 1; $i <= 12; $i++) + $rep->TextCol($i + 1, $i + 2, number_format2($calc[$i], $dec)); + $rep->Font(); + + $rep->NewLine(); + } + } + } + $rep->Line($rep->row); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep706.php b/reporting/rep706.php new file mode 100644 index 00000000..9f20eb6b --- /dev/null +++ b/reporting/rep706.php @@ -0,0 +1,275 @@ + $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension')." 1", + 'from' => get_dimension_string($dimension), 'to' => ''), + 3 => array('text' => _('Dimension')." 2", + 'from' => get_dimension_string($dimension2), 'to' => '')); + } + else if ($dim == 1) + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension'), + 'from' => get_dimension_string($dimension), 'to' => '')); + } + else + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to)); + } + + $rep = new FrontReport(_('Balance Sheet'), "BalanceSheet.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $classname = ''; + $group = ''; + $totalopen = 0.0; + $totalperiod = 0.0; + $totalclose = 0.0; + $classopen = 0.0; + $classperiod = 0.0; + $classclose = 0.0; + $assetsopen = 0.0; + $assetsperiod = 0.0; + $assetsclose = 0.0; + + $accounts = get_gl_accounts_all(1); + + while ($account=db_fetch($accounts)) + { + $prev_balance = get_gl_balance_from_to("", $from, $account["account_code"], $dimension, $dimension2); + + $curr_balance = get_gl_trans_from_to($from, $to, $account["account_code"], $dimension, $dimension2); + + if (!$prev_balance && !$curr_balance) + continue; + + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + $rep->TextCol(2, 3, number_format2($totalopen, $dec)); + $rep->TextCol(3, 4, number_format2($totalperiod, $dec)); + $rep->TextCol(4, 5, number_format2($totalclose, $dec)); + if ($graphics) + { + $pg->x[] = $group; + $pg->y[] = abs($totalclose); + } + $totalopen = $totalperiod = $totalclose = 0.0; + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + $rep->TextCol(2, 3, number_format2($classopen, $dec)); + $rep->TextCol(3, 4, number_format2($classperiod, $dec)); + $rep->TextCol(4, 5, number_format2($classclose, $dec)); + $rep->Font(); + $assetsopen += $classopen; + $assetsperiod += $classperiod; + $assetsclose += $classclose; + $classopen = $classperiod = $classclose = 0.0; + $rep->NewLine(3); + $closeclass = false; + } + } + if ($account['AccountClassName'] != $classname) + { + $rep->Font('bold'); + $rep->TextCol(0, 5, $account['AccountClassName']); + $rep->Font(); + $rep->row -= ($rep->lineHeight + 4); + } + $group = $account['AccountTypeName']; + $rep->TextCol(0, 5, $account['AccountTypeName']); + $rep->Line($rep->row - 4); + $rep->row -= ($rep->lineHeight + 4); + } + $classname = $account['AccountClassName']; + + $totalopen += $prev_balance; + $totalperiod += $curr_balance; + $totalclose = $totalopen + $totalperiod; + $classopen += $prev_balance; + $classperiod += $curr_balance; + $classclose = $classopen + $classperiod; + $rep->TextCol(0, 1, $account['account_code']); + $rep->TextCol(1, 2, $account['account_name']); + + $rep->TextCol(2, 3, number_format2($prev_balance, $dec)); + $rep->TextCol(3, 4, number_format2($curr_balance, $dec)); + $rep->TextCol(4, 5, number_format2($curr_balance + $prev_balance, $dec)); + + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + 3 * $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + $rep->TextCol(2, 3, number_format2($totalopen, $dec)); + $rep->TextCol(3, 4, number_format2($totalperiod, $dec)); + $rep->TextCol(4, 5, number_format2($totalclose, $dec)); + if ($graphics) + { + $pg->x[] = $group; + $pg->y[] = abs($totalclose); + } + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $calculateopen = -$assetsopen - $classopen; + $calculateperiod = -$assetsperiod - $classperiod; + $calculateclose = -$assetsclose - $classclose; + $rep->row -= 6; + + $rep->TextCol(0, 2, _('Calculated Return')); + $rep->TextCol(2, 3, number_format2($calculateopen, $dec)); + $rep->TextCol(3, 4, number_format2($calculateperiod, $dec)); + $rep->TextCol(4, 5, number_format2($calculateclose, $dec)); + if ($graphics) + { + $pg->x[] = _('Calculated Return'); + $pg->y[] = abs($calculateclose); + } + $rep->row -= ($rep->lineHeight + 4); + + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + $rep->TextCol(2, 3, number_format2(-$assetsopen, $dec)); + $rep->TextCol(3, 4, number_format2(-$assetsperiod, $dec)); + $rep->TextCol(4, 5, number_format2(-$assetsclose, $dec)); + $rep->Font(); + $rep->NewLine(); + } + } + } + $rep->Line($rep->row); + if ($graphics) + { + global $decseps, $graph_skin; + $pg->title = $rep->title; + $pg->axis_x = _("Group"); + $pg->axis_y = _("Amount"); + $pg->graphic_1 = $to; + $pg->type = $graphics; + $pg->skin = $graph_skin; + $pg->built_in = false; + $pg->fontfile = $path_to_root . "reporting/fonts/Vera.ttf"; + $pg->latin_notation = ($decseps[$_SESSION["wa_current_user"]->prefs->dec_sep()] != "."); + $filename = $path_to_root . "reporting/pdf_files/test.png"; + $pg->display($filename, true); + $w = $pg->width / 1.5; + $h = $pg->height / 1.5; + $x = ($rep->pageWidth - $w) / 2; + $rep->NewLine(2); + if ($rep->row - $h < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($filename, $x, $rep->row - $h, $w, $h); + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep707.php b/reporting/rep707.php new file mode 100644 index 00000000..7059d837 --- /dev/null +++ b/reporting/rep707.php @@ -0,0 +1,311 @@ + 999) + $ret = 999; + return $ret; +} + +//---------------------------------------------------------------------------------------------------- + +function print_profit_and_loss_statement() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + $dim = get_company_pref('use_dimension'); + $dimension = $dimension2 = 0; + + $from = $_POST['PARAM_0']; + $to = $_POST['PARAM_1']; + $compare = $_POST['PARAM_2']; + if ($dim == 2) + { + $dimension = $_POST['PARAM_3']; + $dimension2 = $_POST['PARAM_4']; + $graphics = $_POST['PARAM_5']; + $comments = $_POST['PARAM_6']; + } + else if ($dim == 1) + { + $dimension = $_POST['PARAM_3']; + $graphics = $_POST['PARAM_4']; + $comments = $_POST['PARAM_5']; + } + else + { + $graphics = $_POST['PARAM_3']; + $comments = $_POST['PARAM_4']; + } + if ($graphics) + { + include_once($path_to_root . "reporting/includes/class.graphic.inc"); + $pg = new graph(); + } + $dec = 0; + $pdec = user_percent_dec(); + + $cols = array(0, 50, 200, 350, 425, 500); + //------------0--1---2----3----4----5-- + + $headers = array(_('Account'), _('Account Name'), _('Period'), _('Accumulated'), _('Achieved %')); + + $aligns = array('left', 'left', 'right', 'right', 'right'); + + if ($dim == 2) + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension')." 1", + 'from' => get_dimension_string($dimension), 'to' => ''), + 3 => array('text' => _('Dimension')." 2", + 'from' => get_dimension_string($dimension2), 'to' => '')); + } + else if ($dim == 1) + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension'), + 'from' => get_dimension_string($dimension), 'to' => '')); + } + else + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to)); + } + + + if ($compare == 0 || $compare == 2) + { + $end = $to; + if ($compare == 2) + { + $begin = $from; + $headers[3] = _('Budget'); + } + else + $begin = begin_fiscalyear(); + } + elseif ($compare == 1) + { + $begin = add_months($from, -12); + $end = add_months($to, -12); + $headers[3] = _('Period Y-1'); + } + + $rep = new FrontReport(_('Profit and Loss Statement'), "ProfitAndLoss.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + + $classname = ''; + $group = ''; + $totalper = 0.0; + $totalacc = 0.0; + $classper = 0.0; + $classacc = 0.0; + $salesper = 0.0; + $salesacc = 0.0; + + $accounts = get_gl_accounts_all(0); + + while ($account=db_fetch($accounts)) + { + $per_balance = get_gl_trans_from_to($from, $to, $account["account_code"], $dimension, $dimension2); + + if ($compare == 2) + $acc_balance = get_budget_trans_from_to($begin, $end, $account["account_code"], $dimension, $dimension2); + else + $acc_balance = get_gl_trans_from_to($begin, $end, $account["account_code"], $dimension, $dimension2); + if (!$per_balance && !$acc_balance) + continue; + + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + $rep->TextCol(2, 3, number_format2($totalper, $dec)); + $rep->TextCol(3, 4, number_format2($totalacc, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($totalper, $totalacc), $pdec)); + if ($graphics) + { + $pg->x[] = $group; + $pg->y[] = abs($totalper); + $pg->z[] = abs($totalacc); + } + $totalper = $totalacc = 0.0; + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + $rep->TextCol(2, 3, number_format2($classper, $dec)); + $rep->TextCol(3, 4, number_format2($classacc, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($classper, $classacc), $pdec)); + $rep->Font(); + $salesper += $classper; + $salesacc += $classacc; + $classper = $classacc = 0.0; + $rep->NewLine(3); + $closeclass = false; + } + } + if ($account['AccountClassName'] != $classname) + { + $rep->Font('bold'); + $rep->TextCol(0, 5, $account['AccountClassName']); + $rep->Font(); + $rep->row -= ($rep->lineHeight + 4); + } + $group = $account['AccountTypeName']; + $rep->TextCol(0, 5, $account['AccountTypeName']); + $rep->Line($rep->row - 4); + $rep->row -= ($rep->lineHeight + 4); + } + $classname = $account['AccountClassName']; + + $per_balance *= -1; + $acc_balance *= -1; + $totalper += $per_balance; + $totalacc += $acc_balance; + $classper += $per_balance; + $classacc += $acc_balance; + $rep->TextCol(0, 1, $account['account_code']); + $rep->TextCol(1, 2, $account['account_name']); + + $rep->TextCol(2, 3, number_format2($per_balance, $dec)); + $rep->TextCol(3, 4, number_format2($acc_balance, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($per_balance, $acc_balance), $pdec)); + + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + 3 * $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + if ($account['AccountClassName'] != $classname) + { + if ($classname != '') + { + $closeclass = true; + } + } + if ($account['AccountTypeName'] != $group) + { + if ($group != '') + { + $rep->Line($rep->row + 6); + $rep->row -= 6; + $rep->TextCol(0, 2, _('Total') . " " . $group); + $rep->TextCol(2, 3, number_format2($totalper, $dec)); + $rep->TextCol(3, 4, number_format2($totalacc, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($totalper, $totalacc), $pdec)); + if ($graphics) + { + $pg->x[] = $group; + $pg->y[] = abs($totalper); + $pg->z[] = abs($totalacc); + } + $rep->row -= ($rep->lineHeight + 4); + if ($closeclass) + { + $rep->Line($rep->row + 6); + $calculateper = $salesper + $classper; + $calculateacc = $salesacc + $classacc; + $rep->row -= 6; + + $rep->Font('bold'); + $rep->TextCol(0, 2, _('Total') . " " . $classname); + $rep->TextCol(2, 3, number_format2($classper, $dec)); + $rep->TextCol(3, 4, number_format2($classacc, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($classper, $classacc), $pdec)); + + $rep->row -= ($rep->lineHeight + 8); + $rep->TextCol(0, 2, _('Calculated Return')); + $rep->TextCol(2, 3, number_format2($calculateper, $dec)); + $rep->TextCol(3, 4, number_format2($calculateacc, $dec)); + $rep->TextCol(4, 5, number_format2(Achieve($calculateper, $calculateacc), $pdec)); + if ($graphics) + { + $pg->x[] = _('Calculated Return'); + $pg->y[] = abs($calculateper); + $pg->z[] = abs($calculateacc); + } + + $rep->Font(); + + $rep->NewLine(); + } + } + } + $rep->Line($rep->row); + if ($graphics) + { + global $decseps, $graph_skin; + $pg->title = $rep->title; + $pg->axis_x = _("Group"); + $pg->axis_y = _("Amount"); + $pg->graphic_1 = $headers[2]; + $pg->graphic_2 = $headers[3]; + $pg->type = $graphics; + $pg->skin = $graph_skin; + $pg->built_in = false; + $pg->fontfile = $path_to_root . "reporting/fonts/Vera.ttf"; + $pg->latin_notation = ($decseps[$_SESSION["wa_current_user"]->prefs->dec_sep()] != "."); + $filename = $path_to_root . "reporting/pdf_files/test.png"; + $pg->display($filename, true); + $w = $pg->width / 1.5; + $h = $pg->height / 1.5; + $x = ($rep->pageWidth - $w) / 2; + $rep->NewLine(2); + if ($rep->row - $h < $rep->bottomMargin) + $rep->Header(); + $rep->AddImage($filename, $x, $rep->row - $h, $w, $h); + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep708.php b/reporting/rep708.php new file mode 100644 index 00000000..cb19d72f --- /dev/null +++ b/reporting/rep708.php @@ -0,0 +1,140 @@ + $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension')." 1", + 'from' => get_dimension_string($dimension), 'to' => ''), + 3 => array('text' => _('Dimension')." 2", + 'from' => get_dimension_string($dimension2), 'to' => '')); + } + else if ($dim == 1) + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to), + 2 => array('text' => _('Dimension'), + 'from' => get_dimension_string($dimension), 'to' => '')); + } + else + { + $params = array( 0 => $comments, + 1 => array('text' => _('Period'),'from' => $from, 'to' => $to)); + } + + $rep = new FrontReport(_('Trial Balance'), "TrialBalance.pdf", user_pagesize()); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns, $cols2, $headers2, $aligns2); + $rep->Header(); + + $accounts = get_gl_accounts(); + + while ($account=db_fetch($accounts)) + { + + $begin = begin_fiscalyear(); + if (is_account_balancesheet($account["account_code"])) + $begin = ""; + elseif ($from < $begin) + $begin = $from; + $prev_balance = get_gl_balance_from_to($begin, $from, $account["account_code"], $dimension, $dimension2); + + $curr_balance = get_gl_trans_from_to($from, $to, $account["account_code"], $dimension, $dimension2); + + if ($zero == 0 && !$prev_balance && !$curr_balance) + continue; + + $rep->TextCol(0, 1, $account['account_code']); + $rep->TextCol(1, 2, $account['account_name']); + + if ($prev_balance > 0.0) + $rep->TextCol(2, 3, number_format2(abs($prev_balance), $dec)); + else + $rep->TextCol(3, 4, number_format2(abs($prev_balance), $dec)); + if ($curr_balance > 0.0) + $rep->TextCol(4, 5, number_format2(abs($curr_balance), $dec)); + else + $rep->TextCol(5, 6, number_format2(abs($curr_balance), $dec)); + if ($curr_balance + $prev_balance > 0.0) + $rep->TextCol(6, 7, number_format2(abs($curr_balance + $prev_balance), $dec)); + else + $rep->TextCol(7, 8, number_format2(abs($curr_balance + $prev_balance), $dec)); + + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + $rep->Line($rep->row); + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/rep709.php b/reporting/rep709.php new file mode 100644 index 00000000..47d079d5 --- /dev/null +++ b/reporting/rep709.php @@ -0,0 +1,365 @@ += '$fromdate' + AND ".TB_PREF."debtor_trans.tran_date <= '$todate' + AND (".TB_PREF."debtor_trans.type=10 OR ".TB_PREF."debtor_trans.type=11) + ORDER BY ".TB_PREF."debtor_trans.tran_date"; + + return db_query($sql,"No transactions were returned"); +} + +function getSuppTransactions($from, $to) +{ + $fromdate = date2sql($from); + $todate = date2sql($to); + + $sql = "SELECT ".TB_PREF."supp_trans.supp_reference, + ".TB_PREF."supp_trans.type, + ".TB_PREF."sys_types.type_name, + ".TB_PREF."supp_trans.tran_date, + ".TB_PREF."supp_trans.supplier_id, + ".TB_PREF."supp_trans.rate, + ".TB_PREF."suppliers.supp_name, + ".TB_PREF."suppliers.curr_code, + ".TB_PREF."supp_trans.rate, + ov_amount*rate AS NetAmount, + ov_gst*rate AS Tax + FROM ".TB_PREF."supp_trans + INNER JOIN ".TB_PREF."suppliers ON ".TB_PREF."supp_trans.supplier_id=".TB_PREF."suppliers.supplier_id + INNER JOIN ".TB_PREF."sys_types ON ".TB_PREF."supp_trans.type=".TB_PREF."sys_types.type_id + WHERE ".TB_PREF."supp_trans.tran_date >= '$fromdate' + AND ".TB_PREF."supp_trans.tran_date <= '$todate' + AND (".TB_PREF."supp_trans.type=20 OR ".TB_PREF."supp_trans.type=21) + ORDER BY ".TB_PREF."supp_trans.tran_date"; + + return db_query($sql,"No transactions were returned"); +} + +function getTaxTypes() +{ + $sql = "SELECT id FROM ".TB_PREF."tax_types ORDER BY id"; + return db_query($sql,"No transactions were returned"); +} + +function getTaxInfo($id) +{ + $sql = "SELECT * FROM ".TB_PREF."tax_types WHERE id=$id"; + $result = db_query($sql,"No transactions were returned"); + return db_fetch($result); +} + +function getCustInvTax($taxtype, $from, $to) +{ + $fromdate = date2sql($from); + $todate = date2sql($to); + + $sql = "SELECT SUM(unit_price * -quantity*".TB_PREF."debtor_trans.rate), SUM(amount*".TB_PREF."debtor_trans.rate) + FROM ".TB_PREF."debtor_trans_details, ".TB_PREF."debtor_trans_tax_details, ".TB_PREF."debtor_trans + WHERE ".TB_PREF."debtor_trans_details.debtor_trans_type>=10 + AND ".TB_PREF."debtor_trans_details.debtor_trans_type<=11 + AND ".TB_PREF."debtor_trans_details.debtor_trans_no=".TB_PREF."debtor_trans.trans_no + AND ".TB_PREF."debtor_trans_details.debtor_trans_type=".TB_PREF."debtor_trans.type + AND ".TB_PREF."debtor_trans_details.debtor_trans_no=".TB_PREF."debtor_trans_tax_details.debtor_trans_no + AND ".TB_PREF."debtor_trans_details.debtor_trans_type=".TB_PREF."debtor_trans_tax_details.debtor_trans_type + AND ".TB_PREF."debtor_trans_tax_details.tax_type_id=$taxtype + AND ".TB_PREF."debtor_trans.tran_date >= '$fromdate' + AND ".TB_PREF."debtor_trans.tran_date <= '$todate'"; + + $result = db_query($sql,"No transactions were returned"); + return db_fetch_row($result); +} + +function getSuppInvTax($taxtype, $from, $to) +{ + $fromdate = date2sql($from); + $todate = date2sql($to); + + $sql = "SELECT SUM(unit_price * quantity * ".TB_PREF."supp_trans.rate), SUM(amount*".TB_PREF."supp_trans.rate) + FROM ".TB_PREF."supp_invoice_items, ".TB_PREF."supp_invoice_tax_items, ".TB_PREF."supp_trans + WHERE ".TB_PREF."supp_invoice_items.supp_trans_type>=20 + AND ".TB_PREF."supp_invoice_items.supp_trans_type<=21 + AND ".TB_PREF."supp_invoice_items.supp_trans_no=".TB_PREF."supp_invoice_tax_items.supp_trans_no + AND ".TB_PREF."supp_invoice_items.supp_trans_type=".TB_PREF."supp_invoice_tax_items.supp_trans_type + AND ".TB_PREF."supp_invoice_items.supp_trans_no=".TB_PREF."supp_trans.trans_no + AND ".TB_PREF."supp_invoice_items.supp_trans_type=".TB_PREF."supp_trans.type + AND ".TB_PREF."supp_invoice_tax_items.tax_type_id=$taxtype + AND ".TB_PREF."supp_trans.tran_date >= '$fromdate' + AND ".TB_PREF."supp_trans.tran_date <= '$todate'"; + + $result = db_query($sql,"No transactions were returned"); + return db_fetch_row($result); +} + +//---------------------------------------------------------------------------------------------------- + +function print_tax_report() +{ + global $path_to_root; + + include_once($path_to_root . "reporting/includes/pdf_report.inc"); + + $rep = new FrontReport(_('Tax Report'), "TaxReport.pdf", user_pagesize()); + + $from = $_POST['PARAM_0']; + $to = $_POST['PARAM_1']; + $summaryOnly = $_POST['PARAM_2']; + $comments = $_POST['PARAM_3']; + $dec = user_price_dec(); + + if ($summaryOnly == 1) + $summary = _('Summary Only'); + else + $summary = _('Detailed Report'); + + + $res = getTaxTypes(); + + $taxes = array(); + $i = 0; + while ($tax=db_fetch($res)) + $taxes[$i++] = $tax['id']; + $idcounter = count($taxes); + + $totalinvout = array(); + $totaltaxout = array(); + $totalinvin = array(); + $totaltaxin = array(); + + if (!$summaryOnly) + { + $cols = array(0, 80, 130, 190, 290, 370, 435, 500, 565); + + $headers = array(_('Trans Type'), _('#'), _('Date'), _('Name'), _('Branch Name'), + _('Net'), _('Tax')); + + $aligns = array('left', 'left', 'left', 'left', 'left', 'right', 'right'); + + $params = array( 0 => $comments, + 1 => array('text' => _('Period'), 'from' => $from, 'to' => $to), + 2 => array('text' => _('Type'), 'from' => $summary, 'to' => '')); + + $rep->Font(); + $rep->Info($params, $cols, $headers, $aligns); + $rep->Header(); + } + $totalnet = 0.0; + $totaltax = 0.0; + + $transactions = getCustTransactions($from, $to); + + while ($trans=db_fetch($transactions)) + { + if (!$summaryOnly) + { + $rep->TextCol(0, 1, $trans['type_name']); + $rep->TextCol(1, 2, $trans['reference']); + $rep->TextCol(2, 3, sql2date($trans['tran_date'])); + $rep->TextCol(3, 4, $trans['name']); + if ($trans["branch_code"] > 0) + $rep->TextCol(4, 5, get_branch_name($trans["branch_code"])); + + $rep->TextCol(5, 6, number_format2($trans['NetAmount'], $dec)); + $rep->TextCol(6, 7, number_format2($trans['Tax'], $dec)); + + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + $totalnet += $trans['NetAmount']; + $totaltax += $trans['Tax']; + + } + if (!$summaryOnly) + { + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + $rep->Line($rep->row + $rep->lineHeight); + $rep->TextCol(3, 5, _('Total Outputs')); + $rep->TextCol(5, 6, number_format2($totalnet, $dec)); + $rep->TextCol(6, 7, number_format2($totaltax, $dec)); + $rep->Line($rep->row - 5); + $rep->Header(); + } + $totalinnet = 0.0; + $totalintax = 0.0; + + $transactions = getSuppTransactions($from, $to); + + while ($trans=db_fetch($transactions)) + { + if (!$summaryOnly) + { + $rep->TextCol(0, 1, $trans['type_name']); + $rep->TextCol(1, 2, $trans['supp_reference']); + $rep->TextCol(2, 3, sql2date($trans['tran_date'])); + $rep->TextCol(3, 5, $trans['supp_name']); + $rep->TextCol(5, 6, number_format2($trans['NetAmount'], $dec)); + $rep->TextCol(6, 7, number_format2($trans['Tax'], $dec)); + + $rep->NewLine(); + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + } + $totalinnet += $trans['NetAmount']; + $totalintax += $trans['Tax']; + + } + if (!$summaryOnly) + { + $rep->NewLine(); + + if ($rep->row < $rep->bottomMargin + $rep->lineHeight) + { + $rep->Line($rep->row - 2); + $rep->Header(); + } + $rep->Line($rep->row + $rep->lineHeight); + $rep->TextCol(3, 5, _('Total Inputs')); + $rep->TextCol(5, 6, number_format2($totalinnet, $dec)); + $rep->TextCol(6, 7, number_format2($totalintax, $dec)); + $rep->Line($rep->row - 5); + } + $cols2 = array(0, 100, 200, 300, 400, 500, 600); + + $headers2 = array(_('Tax Rate'), _('Outputs'), _('Output Tax'), _('Inputs'), _('Input Tax')); + + $aligns2 = array('left', 'right', 'right', 'right', 'right'); + + $invamount = 0.0; + for ($i = 0; $i < $idcounter; $i++) + { + $amt = getCustInvTax($taxes[$i], $from, $to); + $totalinvout[$i] += $amt[0]; + $totaltaxout[$i] += $amt[1]; + $invamount += $amt[0]; + } + if ($totalnet != $invamount) + $totalinvout[$idcounter] = ($invamount - $totalnet); + for ($i = 0; $i < $idcounter; $i++) + { + $amt = getSuppInvTax($taxes[$i], $from, $to); + $totalinvin[$i] += $amt[0]; + $totaltaxin[$i] += $amt[1]; + $invamount += $amt[0]; + } + if ($totalinnet != $invamount) + $totalinvin[$idcounter] = ($totalinnet - $invamount); + + for ($i = 0; $i < count($cols2); $i++) + { + $rep->cols[$i] = $rep->leftMargin + $cols2[$i]; + $rep->headers[$i] = $headers2[$i]; + $rep->aligns[$i] = $aligns2[$i]; + } + $rep->Header(); + $counter = count($totalinvout); + $counter = max($counter, $idcounter); + $trow = $rep->row; + $i = 0; + for ($j = 0; $j < $counter; $j++) + { + if (isset($taxes[$j]) && $taxes[$j] > 0) + { + $tx = getTaxInfo($taxes[$j]); + $str = $tx['name'] . " " . number_format2($tx['rate'], $dec) . "%"; + } + else + $str = _('No tax specified'); + $rep->TextCol($i, $i + 1, $str); + $rep->NewLine(); + } + $i++; + $rep->row = $trow; + for ($j = 0; $j < $counter; $j++) + { + $rep->TextCol($i, $i + 1, number_format2($totalinvout[$j], $dec)); + $rep->NewLine(); + } + $i++; + $rep->row = $trow; + for ($j = 0; $j < $counter; $j++) + { + $rep->TextCol($i, $i + 1,number_format2($totaltaxout[$j], $dec)); + $rep->NewLine(); + } + $i++; + $rep->row = $trow; + for ($j = 0; $j < $counter; $j++) + { + $rep->TextCol($i, $i + 1, number_format2($totalinvin[$j], $dec)); + $rep->NewLine(); + } + $i++; + $rep->row = $trow; + for ($j = 0; $j < $counter; $j++) + { + $rep->TextCol($i, $i + 1, number_format2($totaltaxin[$j], $dec)); + $rep->NewLine(); + } + $rep->Line($rep->row - 4); + + $locale = $path_to_root . "lang/" . $_SESSION['language']->code . "/locale.inc"; + if (file_exists($locale)) + { + $taxinclude = true; + include($locale); + /* + if (function_exists("TaxFunction")) + TaxFunction(); + */ + } + $rep->End(); +} + +?> \ No newline at end of file diff --git a/reporting/reports_main.php b/reporting/reports_main.php new file mode 100644 index 00000000..9077ba19 --- /dev/null +++ b/reporting/reports_main.php @@ -0,0 +1,283 @@ +addReportClass(_('Customer')); +$reports->addReport(_('Customer'),101,_('Customer Balances'), + array( new ReportParam(_('End Date'),'DATE'), + new ReportParam(_('From Customer'),'CUSTOMERS'), + new ReportParam(_('To Customer'),'CUSTOMERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),102,_('Aged Customer Analysis'), + array( new ReportParam(_('End Date'),'DATE'), + new ReportParam(_('From Customer'),'CUSTOMERS'), + new ReportParam(_('To Customer'),'CUSTOMERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Summary Only'),'YES_NO'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),103,_('Customer Detail Listing'), + array( new ReportParam(_('Activity Since'),'DATEBEGIN'), + new ReportParam(_('Sales Areas'),'AREAS'), + new ReportParam(_('Sales Folk'),'SALESMEN'), new ReportParam(_('Activity Greater Than'),'TEXT'), new ReportParam(_('Activity Less Than'),'TEXT'), new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),104,_('Price Listing'), + array( new ReportParam(_('Inventory Category'),'CATEGORIES'), + new ReportParam(_('Sales Types'),'SALESTYPES'), + new ReportParam(_('Show Pictures'),'YES_NO'), + new ReportParam(_('Show GP %'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),105,_('Order Status Listing'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Inventory Category'),'CATEGORIES'), + new ReportParam(_('Stock Location'),'LOCATIONS'), + new ReportParam(_('Back Orders Only'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),107,_('Print Invoices/Credit Notes'), + array( new ReportParam(_('From'),'INVOICE'), + new ReportParam(_('To'),'INVOICE'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Bank Account'),'BANK_ACCOUNTS'), + new ReportParam(_('email Customers'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),108,_('Print Statements'), + array( new ReportParam(_('Customers'),'CUSTOMERS_NO_FILTER'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Bank Account'),'BANK_ACCOUNTS'), + new ReportParam(_('Email Customers'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Customer'),109,_('Print Sales Orders'), + array( new ReportParam(_('From'),'ORDERS'), + new ReportParam(_('To'),'ORDERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Bank Account'),'BANK_ACCOUNTS'), + new ReportParam(_('Email Customers'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); + +$reports->addReportClass(_('Supplier')); +$reports->addReport(_('Supplier'),201,_('Supplier Balances'), + array( new ReportParam(_('End Date'),'DATE'), + new ReportParam(_('From Supplier'),'SUPPLIERS'), + new ReportParam(_('To Supplier'),'SUPPLIERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Supplier'),202,_('Aged Supplier Analyses'), + array( new ReportParam(_('End Date'),'DATE'), + new ReportParam(_('From Supplier'),'SUPPLIERS'), + new ReportParam(_('To Supplier'),'SUPPLIERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Summary Only'),'YES_NO'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Supplier'),203,_('Payment Report'), + array( new ReportParam(_('End Date'),'DATE'), + new ReportParam(_('From Supplier'),'SUPPLIERS'), + new ReportParam(_('To Supplier'),'SUPPLIERS'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Supplier'),204,_('Outstanding GRNs Report'), + array( new ReportParam(_('From Supplier'),'SUPPLIERS'), + new ReportParam(_('To Supplier'),'SUPPLIERS'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Supplier'),209,_('Print Purchase Orders'), + array( new ReportParam(_('From'),'PO'), + new ReportParam(_('To'),'PO'), + new ReportParam(_('Currency Filter'),'CURRENCY'), + new ReportParam(_('Bank Account'),'BANK_ACCOUNTS'), + new ReportParam(_('Email Customers'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); + +$reports->addReportClass(_('Inventory')); +$reports->addReport(_('Inventory'),301,_('Inventory Valuation Report'), + array( new ReportParam(_('Inventory Category'),'CATEGORIES'), + new ReportParam(_('Location'),'LOCATIONS'), + new ReportParam(_('Detailed Report'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Inventory'),302,_('Inventory Planning Report'), + array( new ReportParam(_('Inventory Category'),'CATEGORIES'), + new ReportParam(_('Location'),'LOCATIONS'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('Inventory'),303,_('Stock Check Sheets'), + array( new ReportParam(_('Inventory Category'),'CATEGORIES'), + new ReportParam(_('Location'),'LOCATIONS'), + new ReportParam(_('Show Pictures'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); + +$reports->addReportClass(_('Manufactoring')); +$reports->addReport(_('Manufactoring'),401,_('Bill of Material Listing'), + array( new ReportParam(_('From component'),'ITEMS'), + new ReportParam(_('To component'),'ITEMS'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReportClass(_('Dimensions')); +if ($dim > 0) +{ + $reports->addReport(_('Dimensions'),501,_('Dimension Summary'), + array( new ReportParam(_('From Dimension'),'DIMENSION'), + new ReportParam(_('To Dimension'),'DIMENSION'), + new ReportParam(_('Show Balance'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('Dimensions'),502,_('Dimension Details'), + array( new ReportParam(_('Dimension'),'DIMENSIONS'), + new ReportParam(_('Comments'),'TEXTBOX'))); +} +$reports->addReportClass(_('Banking')); +//$reports->addReport(_('Banking'),601,_('Bank Account Transactions'), +// array( new ReportParam(_('Bank Accounts'),'BANK_ACCOUNTS'), +// new ReportParam(_('Start Date'),'DATE'), +// new ReportParam(_('End Date'),'DATE'), +// new ReportParam(_('Comments'),'TEXTBOX'))); + +$reports->addReportClass(_('General Ledger')); +$reports->addReport(_('General Ledger'),701,_('Chart of Accounts'), + array( new ReportParam(_('Show Balances'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +$reports->addReport(_('General Ledger'),702,_('List of Journal Entries'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Type'),'SYS_TYPES'), + new ReportParam(_('Comments'),'TEXTBOX'))); +//$reports->addReport(_('General Ledger'),703,_('GL Account Group Summary'), +// array( new ReportParam(_('Comments'),'TEXTBOX'))); +if ($dim == 2) +{ + $reports->addReport(_('General Ledger'),704,_('GL Account Transactions'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('From Account'),'GL_ACCOUNTS'), + new ReportParam(_('To Account'),'GL_ACCOUNTS'), + new ReportParam(_('Dimension')." 1", 'DIMENSIONS1'), + new ReportParam(_('Dimension')." 2", 'DIMENSIONS2'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),705,_('Annual Expense Breakdown'), + array( new ReportParam(_('Year'),'TRANS_YEARS'), + new ReportParam(_('Dimension')." 1", 'DIMENSIONS1'), + new ReportParam(_('Dimension')." 2", 'DIMENSIONS2'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),706,_('Balance Sheet'), + array( new ReportParam(_('Start Date'),'DATEBEGIN'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Dimension')." 1", 'DIMENSIONS1'), + new ReportParam(_('Dimension')." 2", 'DIMENSIONS2'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),707,_('Profit and Loss Statement'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Compare to'),'COMPARE'), + new ReportParam(_('Dimension')." 1", 'DIMENSIONS1'), + new ReportParam(_('Dimension')." 2", 'DIMENSIONS2'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),708,_('Trial Balance'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Zero values'),'YES_NO'), + new ReportParam(_('Dimension')." 1", 'DIMENSIONS1'), + new ReportParam(_('Dimension')." 2", 'DIMENSIONS2'), + new ReportParam(_('Comments'),'TEXTBOX'))); +} +else if ($dim == 1) +{ + $reports->addReport(_('General Ledger'),704,_('GL Account Transactions'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('From Account'),'GL_ACCOUNTS'), + new ReportParam(_('To Account'),'GL_ACCOUNTS'), + new ReportParam(_('Dimension'), 'DIMENSIONS1'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),705,_('Annual Expense Breakdown'), + array( new ReportParam(_('Year'),'TRANS_YEARS'), + new ReportParam(_('Dimension'), 'DIMENSIONS1'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),706,_('Balance Sheet'), + array( new ReportParam(_('Start Date'),'DATEBEGIN'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Dimension'), 'DIMENSIONS1'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),707,_('Profit and Loss Statement'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Compare to'),'COMPARE'), + new ReportParam(_('Dimension'), 'DIMENSIONS1'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),708,_('Trial Balance'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Zero values'),'YES_NO'), + new ReportParam(_('Dimension'), 'DIMENSIONS1'), + new ReportParam(_('Comments'),'TEXTBOX'))); +} +else +{ + $reports->addReport(_('General Ledger'),704,_('GL Account Transactions'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('From Account'),'GL_ACCOUNTS'), + new ReportParam(_('To Account'),'GL_ACCOUNTS'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),705,_('Annual Expense Breakdown'), + array( new ReportParam(_('Year'),'TRANS_YEARS'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),706,_('Balance Sheet'), + array( new ReportParam(_('Start Date'),'DATEBEGIN'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),707,_('Profit and Loss Statement'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Compare to'),'COMPARE'), + new ReportParam(_('Graphics'),'GRAPHIC'), + new ReportParam(_('Comments'),'TEXTBOX'))); + $reports->addReport(_('General Ledger'),708,_('Trial Balance'), + array( new ReportParam(_('Start Date'),'DATEBEGINM'), + new ReportParam(_('End Date'),'DATEENDM'), + new ReportParam(_('Zero values'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); +} +$reports->addReport(_('General Ledger'),709,_('Tax Report'), + array( new ReportParam(_('Start Date'),'DATEBEGINTAX'), + new ReportParam(_('End Date'),'DATEENDTAX'), + new ReportParam(_('Summary Only'),'YES_NO'), + new ReportParam(_('Comments'),'TEXTBOX'))); + +echo " +
+ + + + + + + + + + + +"; +echo $reports->getDisplay(); +echo "
"; + +end_page(); +?> \ No newline at end of file diff --git a/sales/allocations/customer_allocate.php b/sales/allocations/customer_allocate.php new file mode 100644 index 00000000..15eba74c --- /dev/null +++ b/sales/allocations/customer_allocate.php @@ -0,0 +1,265 @@ +allocs); + unset($_SESSION['alloc']); + } + session_register("alloc"); +} + +//-------------------------------------------------------------------------------- + +function check_data() +{ + $total_allocated = 0; + + for ($counter = 0; $counter < $_POST["TotalNumberOfAllocs"]; $counter++) + { + + if (!is_numeric($_POST['amount' . $counter])) + { + display_error(_("The entry for one or more amounts is invalid.")); + return false; + } + + if ($_POST['amount' . $counter] < 0) + { + display_error(_("The entry for an amount to allocate was negative. A positive allocation amount is expected.")); + return false; + } + + /*Now check to see that the AllocAmt is no greater than the + amount left to be allocated against the transaction under review */ + if ($_POST['amount' . $counter] > $_POST['un_allocated' . $counter]) + { + //$_POST['amount' . $counter] = $_POST['un_allocated' . $counter]; + } + + $_SESSION['alloc']->allocs[$counter]->current_allocated = $_POST['amount' . $counter]; + + $total_allocated += $_POST['amount' . $counter]; + } + + if ($total_allocated + $_SESSION['alloc']->amount > sys_prefs::allocation_settled_allowance()) + { + display_error(_("These allocations cannot be processed because the amount allocated is more than the total amount left to allocate.")); + //echo _("Total allocated:") . " " . $total_allocated ; + //echo " " . _("Total amount that can be allocated:") . " " . -$_SESSION['alloc']->TransAmt . "
"; + return false; + } + + return true; +} + +//----------------------------------------------------------------------------------- + +function handle_process() +{ + begin_transaction(); + + // clear all the allocations for this payment/credit + clear_cust_alloctions($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no); + + // now add the new allocations + $total_allocated = 0; + foreach ($_SESSION['alloc']->allocs as $allocn_item) + { + if ($allocn_item->current_allocated > 0) + { + add_cust_allocation($allocn_item->current_allocated, + $_SESSION['alloc']->type, $_SESSION['alloc']->trans_no, + $allocn_item->type, $allocn_item->type_no, $_SESSION['alloc']->date_); + + update_debtor_trans_allocation($allocn_item->type, $allocn_item->type_no, + $allocn_item->current_allocated); + $total_allocated += $allocn_item->current_allocated; + } + + } /*end of the loop through the array of allocations made */ + + update_debtor_trans_allocation($_SESSION['alloc']->type, + $_SESSION['alloc']->trans_no, $total_allocated); + + commit_transaction(); + + clear_allocations(); +} + +//-------------------------------------------------------------------------------- + +if (isset($_POST['Process'])) +{ + if (check_data()) + { + handle_process(); + $_POST['Cancel'] = 1; + } +} + +//-------------------------------------------------------------------------------- + +if (isset($_POST['Cancel'])) +{ + clear_allocations(); + meta_forward($path_to_root . "/sales/allocations/customer_allocation_main.php"); + exit; +} + +//-------------------------------------------------------------------------------- + +function get_allocations_for_transaction($type, $trans_no) +{ + clear_allocations(); + + $debtor = get_customer_trans($trans_no, $type); + + $_SESSION['alloc'] = new allocation($trans_no, $type, $debtor["debtor_no"], + $debtor["DebtorName"], $debtor["Total"], sql2date($debtor["tran_date"])); + + /* Now populate the array of possible (and previous actual) allocations for this customer */ + /*First get the transactions that have outstanding balances ie Total-alloc >0 */ + + $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id); + + while ($myrow = db_fetch($trans_items)) + { + $_SESSION['alloc']->add_item($myrow["type"], $myrow["trans_no"], + sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]), + $myrow["Total"], // trans total + $myrow["alloc"], // trans total allocated + 0); // this allocation + } + + + /* Now get trans that might have previously been allocated to by this trans + NB existing entries where still some of the trans outstanding entered from + above logic will be overwritten with the prev alloc detail below */ + + $trans_items = get_allocatable_to_cust_transactions($_SESSION['alloc']->person_id, $trans_no, $type); + + while ($myrow = db_fetch($trans_items)) + { + $_SESSION['alloc']->add_or_update_item ($myrow["type"], $myrow["trans_no"], + sql2date($myrow["tran_date"]), sql2date($myrow["due_date"]), + $myrow["Total"], $myrow["alloc"] - $myrow["amt"], $myrow["amt"]); + } +} + +//-------------------------------------------------------------------------------- + +function edit_allocations_for_transaction($type, $trans_no) +{ + global $table_style; + + start_form(false, true); + + display_heading(_("Allocation of") . " " . systypes::name($_SESSION['alloc']->type) . " # " . $_SESSION['alloc']->trans_no); + + display_heading($_SESSION['alloc']->person_name); + + display_heading2(_("Date:") . " " . $_SESSION['alloc']->date_ . ""); + display_heading2(_("Total:") . " " . number_format2(-$_SESSION['alloc']->amount,user_price_dec()) . ""); + + echo "
"; + + if (count($_SESSION['alloc']->allocs) > 0) + { + start_table($table_style); + + $th = array(_("Transaction Type"), _("#"), _("Date"), _("Due Date"), _("Amount"), + _("Other Allocations"), _("This Allocation"), _("Left to Allocate"), "", ""); + + table_header($th); + + $k = $counter = $total_allocated = 0; + + foreach ($_SESSION['alloc']->allocs as $allocn_item) + { + alt_table_row_color($k); + + label_cell(systypes::name($allocn_item->type)); + label_cell(get_trans_view_str($allocn_item->type, $allocn_item->type_no)); + label_cell($allocn_item->date_, "align=right"); + label_cell($allocn_item->due_date, "align=right"); + amount_cell($allocn_item->amount); + amount_cell($allocn_item->amount_allocated); + + if (!isset($_POST['amount' . $counter]) || $_POST['amount' . $counter] == "") + $_POST['amount' . $counter] = $allocn_item->current_allocated; + text_cells(null, "amount" . $counter, $_POST['amount' . $counter], 13, 12); + + $un_allocated = round($allocn_item->amount - $allocn_item->amount_allocated, 6); + hidden("un_allocated" . $counter, $un_allocated); + amount_cell($un_allocated); + + label_cell("" . _("All") . ""); + label_cell("" . _("None") . ""); + end_row(); + + $total_allocated += $_POST['amount' . $counter]; + $counter++; + } + + label_row(_("Total Allocated"), number_format2($total_allocated,user_price_dec()), + "colspan=6 align=right", "nowrap align=right"); + if (-$_SESSION['alloc']->amount - $total_allocated < 0) + { + $font1 = ""; + $font2 = ""; + } + else + $font1 = $font2 = ""; + label_row(_("Left to Allocate"), $font1 . number_format2(-$_SESSION['alloc']->amount - + $total_allocated,user_price_dec()) . $font2, "colspan=6 align=right", + "nowrap align=right"); + end_table(1); + + hidden('TotalNumberOfAllocs', $counter); + submit_center_first('UpdateDisplay', _("Update")); + submit('Process', _("Process")); + } + else + { + display_note(_("There are no unsettled transactions to allocate."), 0, 1); + } + + submit_center_last('Cancel', _("Back to Allocations")); + + end_form(); +} + +//-------------------------------------------------------------------------------- + +if (isset($_GET['trans_no']) && isset($_GET['trans_type'])) +{ + get_allocations_for_transaction($_GET['trans_type'], $_GET['trans_no']); +} + +if (isset($_SESSION['alloc'])) +{ + edit_allocations_for_transaction($_SESSION['alloc']->type, $_SESSION['alloc']->trans_no); +} + +//-------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/sales/allocations/customer_allocation_main.php b/sales/allocations/customer_allocation_main.php new file mode 100644 index 00000000..20baf5ca --- /dev/null +++ b/sales/allocations/customer_allocation_main.php @@ -0,0 +1,121 @@ +allocs); + unset($_SESSION['alloc']); + } + if (!isset($_POST['customer_id'])) + $_POST['customer_id'] = get_global_customer(); + + echo "
" . _("Select a customer: ") . "  "; + customer_list('customer_id', $_POST['customer_id'], true, true); + echo "
"; + check(_("Show Settled Items:"), 'ShowSettled', null, true); + echo "


"; + + set_global_customer($_POST['customer_id']); + + if (isset($_POST['customer_id']) && ($_POST['customer_id'] == reserved_words::get_all())) + { + unset($_POST['customer_id']); + } + + /*if (isset($_POST['customer_id'])) { + $custCurr = get_customer_currency($_POST['customer_id']); + if (!is_company_currency($custCurr)) + echo _("Customer Currency:") . $custCurr; + }*/ + + $settled = false; + if (check_value('ShowSettled')) + $settled = true; + + $customer_id = null; + if (isset($_POST['customer_id'])) + $customer_id = $_POST['customer_id']; + + $trans_items = get_allocatable_from_cust_transactions($customer_id, $settled); + + start_table($table_style); + if (!isset($_POST['customer_id'])) + $th = array(_("Transaction Type"), _("#"), _("Reference"), _("Date"), _("Customer"), + _("Currency"), _("Total"), _("Left To Allocate"), ""); + else + $th = array(_("Transaction Type"), _("#"), _("Reference"), _("Date"), + _("Total"), _("Left To Allocate"), ""); + table_header($th); + $k = 0; //row colour counter + $has_settled_items = false; + + while ($myrow = db_fetch($trans_items)) + { + if ($myrow["settled"] == 1) + { + start_row("class='settledbg'"); + $has_settled_items = true; + } + else + { + alt_table_row_color($k); + } + + label_cell(systypes::name($myrow["type"])); + label_cell(get_trans_view_str($myrow["type"], $myrow["trans_no"])); + label_cell($myrow["reference"]); + label_cell(sql2date($myrow["tran_date"])); + + if (!isset($_POST['customer_id'])) + { + label_cell($myrow["DebtorName"]); + label_cell($myrow["curr_code"]); + } + amount_cell(-$myrow["Total"]); + amount_cell(-$myrow["Total"] - $myrow["alloc"]); + if (-$myrow["Total"] - $myrow["alloc"] != 0.0) + label_cell("" . _("Allocate") . ""); + else + label_cell(""); + end_row(); + } + + end_table(); + + if ($has_settled_items) + display_note(_("Marked items are settled."), 0, 1, "class='settledfg'"); + + if (db_num_rows($trans_items) == 0) + display_note(_("There are no allocations to be done."), 1, 2); + + end_form(); +} + +//-------------------------------------------------------------------------------- + +display_allocatable_transactions(); + +//-------------------------------------------------------------------------------- + +end_page(); + +?> \ No newline at end of file diff --git a/sales/allocations/index.php b/sales/allocations/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/allocations/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/credit_note_entry.php b/sales/credit_note_entry.php new file mode 100644 index 00000000..fd1474ee --- /dev/null +++ b/sales/credit_note_entry.php @@ -0,0 +1,281 @@ +memo_ = $_POST['CreditText']; + + $_SESSION['credit_items']->orig_order_date = $_POST['OrderDate']; + $_SESSION['credit_items']->freight_cost = $_POST['ChargeFreightCost']; + + $_SESSION['credit_items']->Location = $_POST["Location"]; + + $_SESSION['credit_items']->default_sales_type = $_POST['sales_type_id']; + $_SESSION['credit_items']->tax_group_id = $_POST["tax_group_id"]; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_cn() +{ + $_POST['CreditText'] = $_SESSION['credit_items']->memo_; + + $_POST['OrderDate'] = $_SESSION['credit_items']->orig_order_date; + $_POST['ChargeFreightCost'] = $_SESSION['credit_items']->freight_cost; + + $_POST["Location"] = $_SESSION['credit_items']->Location; + + $_POST['sales_type_id'] = $_SESSION['credit_items']->default_sales_type; + $_POST["tax_group_id"] = $_SESSION['credit_items']->tax_group_id; +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_order() +{ + if (isset($_SESSION['credit_items'])) + { + unset ($_SESSION['credit_items']->line_items); + unset ($_SESSION['credit_items']); + } + + session_register("credit_items"); + + $_SESSION['credit_items'] = new cart; + $_POST['OrderDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['OrderDate'])) + $_POST['OrderDate'] = end_fiscalyear(); + $_SESSION['credit_items']->orig_order_date = $_POST['OrderDate']; + +} + +//----------------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessCredit'])) +{ + + $input_error = 0; + + if (!references::is_valid($_POST['ref'])) + { + display_error( _("You must enter a reference.")); + $input_error = 1; + } + elseif (!is_new_reference($_POST['ref'], 11)) + { + display_error( _("The entered reference is already in use.")); + $input_error = 1; + } + elseif (!is_date($_POST['OrderDate'])) + { + display_error(_("The entered date for the credit note is invalid.")); + $input_error = 1; + } + elseif (!is_date_in_fiscalyear($_POST['OrderDate'])) + { + display_error(_("The entered date is not in fiscal year.")); + $input_error = 1; + } + if ($input_error == 1) + unset($_POST['ProcessCredit']); +} + +//------------------------------------------------------------------------------------ + +if (isset($_POST['ProcessCredit'])) +{ + //alert("WriteOffGLCode = ".$_POST['WriteOffGLCode'].", CreditType = ".$_POST['CreditType']); + if ($_POST['CreditType'] == "WriteOff" && (!isset($_POST['WriteOffGLCode']) || + $_POST['WriteOffGLCode'] == '')) + { + display_note(_("For credit notes created to write off the stock, a general ledger account is required to be selected."), 1, 0); + display_note(_("Please select an account to write the cost of the stock off to, then click on Process again."), 1, 0); + exit; + } + if (!isset($_POST['WriteOffGLCode'])) + $_POST['WriteOffGLCode'] = ""; + if (!isset($_POST['ShipperID'])) + $_POST['ShipperID'] = 0; + $credit_no = add_credit_note($_SESSION['credit_items'], $_POST['OrderDate'], + $_POST['CreditType'], $_POST['tax_group_id'], + $_POST['ChargeFreightCost'], $_POST['sales_type_id'], $_POST['ShipperID'], + $_POST['ref'], $_POST['CreditText'], $_POST['WriteOffGLCode']); + + unset($_SESSION['credit_items']->line_items); + unset($_SESSION['credit_items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no"); + +} /*end of process credit note */ + +//--------------------------------------------------------------------------------------------------- + +function get_details_from_customer() +{ + return get_customer_details_to_order($_SESSION['credit_items'], $_POST['customer_id'], $_POST['branch_id']); +} + +//----------------------------------------------------------------------------------------------- + +function check_item_data() +{ + if ($_POST['qty'] <= 0) + { + display_error(_("The quantity must be greater than zero.")); + return false; + } + if (!is_numeric($_POST['price']) || $_POST['price'] < 0) + { + display_error(_("The entered price is negative or invalid.")); + return false; + } + if (!is_numeric($_POST['Disc']) || $_POST['Disc'] > 100 || $_POST['Disc'] < 0) + { + display_error(_("The entered discount percent is negative, greater than 100 or invalid.")); + return false; + } + return true; +} + +//----------------------------------------------------------------------------------------------- + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['credit_items']->update_cart_item($_POST['stock_id'], $_POST['qty'], + $_POST['price'], ($_POST['Disc'] / 100)); + } +} + +//----------------------------------------------------------------------------------------------- + +function handle_delete_item() +{ + $_SESSION['credit_items']->remove_from_cart($_GET['Delete']); +} + +//----------------------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + add_to_order($_SESSION['credit_items'], $_POST['stock_id'], $_POST['qty'], + $_POST['price'], $_POST['Disc'] / 100); +} + +//----------------------------------------------------------------------------------------------- +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_cn(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['AddItem']) || isset($_POST['UpdateItem'])) + copy_to_cn(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +//----------------------------------------------------------------------------------------------- + +if (isset($_GET['NewCredit']) || !isset($_SESSION['credit_items'])) +{ + handle_new_order(); +} +else +{ + if (!isset($_POST['customer_id'])) + $_POST['customer_id'] = $_SESSION['credit_items']->customer_id; + if (!isset($_POST['branch_id'])) + $_POST['branch_id'] = $_SESSION['credit_items']->Branch; +} + +//----------------------------------------------------------------------------------------------- + +start_form(false, true); + +$customer_error = display_credit_header($_SESSION['credit_items']); + +if ($customer_error == "") +{ + start_table("$table_style width=80%", 10); + echo ""; + display_credit_items(_("Credit Note Items"), $_SESSION['credit_items']); + credit_options_controls(); + echo ""; + end_table(); +} +else +{ + display_error($customer_error); +} + +if (!isset($_POST['ProcessCredit'])) +{ + echo "
"; + submit_cells('Update', _("Update")); + if ($_SESSION['credit_items']->count_items() >= 1 + /*OR $_POST['ChargeTax'] > 0*/ || (isset($_POST['ChargeFreightCost']) && $_POST['ChargeFreightCost'] > 0)) + { + submit_cells('ProcessCredit', _("Process Credit Note")); + } + echo "
"; +} + +end_form(); +end_page(); + +?> diff --git a/sales/customer_credit_invoice.php b/sales/customer_credit_invoice.php new file mode 100644 index 00000000..b64f8019 --- /dev/null +++ b/sales/customer_credit_invoice.php @@ -0,0 +1,396 @@ +"; + display_notification_centered(_("Credit Note has been processed")); + display_note(get_customer_trans_view_str($trans_type, $credit_no, _("View this credit note")), 0, 0); + + display_note(get_gl_view_str($trans_type, $credit_no, _("View the GL Journal Entries for this Credit Note"))); + + display_footer_exit(); +} + +//-------------------------------------------------------------------------------------- + +if (!isset($_GET['InvoiceNumber']) && !$_SESSION['InvoiceToCredit']) +{ + /* This page can only be called with an invoice number for crediting*/ + die (_("This page can only be opened if an invoice has been selected for crediting.")); +} + +//-------------------------------------------------------------------------------------- + +function can_process() +{ + if (!is_date($_POST['CreditDate'])) + { + display_error(_("The entered date is invalid."));; + return false; + } + elseif (!is_date_in_fiscalyear($_POST['CreditDate'])) + { + display_error(_("The entered date is not in fiscal year.")); + return false; + } + + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference."));; + return false; + } + + if (!is_new_reference($_POST['ref'], 11)) + { + display_error(_("The entered reference is already in use."));; + return false; + } + + if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0) + { + display_error(_("The entered shipping cost is invalid or less than zero."));; + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------- + +function clear_globals() +{ + if (isset($_SESSION['Items'])) + { + unset($_SESSION['Items']->line_items); + unset($_SESSION['Items']); + } + unset($_SESSION['InvoiceToCredit']); +} + +//-------------------------------------------------------------------------------------- + +function process_credit() +{ + global $path_to_root; + if (can_process()) + { + $credit_no = credit_invoice($_SESSION['Items'], $_SESSION['InvoiceToCredit'], + $_SESSION['Order'], $_POST['CreditDate'], $_POST['CreditType'], + $_POST['tax_group_id'], $_POST['ChargeFreightCost'], $_POST['ref'], + $_POST['CreditText'], $_POST['WriteOffGLCode']); + + clear_globals(); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$credit_no"); + } +} + +//-------------------------------------------------------------------------------------- + +if (isset($_GET['InvoiceNumber']) && $_GET['InvoiceNumber'] > 0) +{ + + clear_globals(); + + session_register("Items"); + session_register("InvoiceToCredit"); + session_Register("Order"); + + $_SESSION['InvoiceToCredit'] = $_GET['InvoiceNumber']; + $_SESSION['Items'] = new cart; + + /*read in all the guff from the selected invoice into the Items cart */ + + // we need a distinct here so that it only returns 1 line - becuase there can be mutliple moves + // per item (for assemblies, etc) + $sql = "SELECT DISTINCT ".TB_PREF."debtor_trans.*, + ".TB_PREF."cust_branch.default_location, ".TB_PREF."cust_branch.default_ship_via, + ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.curr_code, + ".TB_PREF."tax_groups.name AS tax_group_name, ".TB_PREF."tax_groups.id AS tax_group_id, + ".TB_PREF."sales_orders.from_stk_loc + FROM ".TB_PREF."debtor_trans, ".TB_PREF."debtors_master, ".TB_PREF."cust_branch, ".TB_PREF."tax_groups, ".TB_PREF."sales_orders + WHERE ".TB_PREF."debtor_trans.debtor_no = ".TB_PREF."debtors_master.debtor_no + AND ".TB_PREF."debtor_trans.branch_code = ".TB_PREF."cust_branch.branch_code + AND ".TB_PREF."debtor_trans.debtor_no = ".TB_PREF."cust_branch.debtor_no + AND ".TB_PREF."cust_branch.tax_group_id = ".TB_PREF."tax_groups.id + AND ".TB_PREF."debtor_trans.trans_no = " . $_GET['InvoiceNumber'] . " + AND ".TB_PREF."debtor_trans.type=10 + AND ".TB_PREF."sales_orders.order_no=".TB_PREF."debtor_trans.order_"; + + $result = db_query($sql,"The invoice details cannot be retrieved"); + + if (db_num_rows($result) == 1) + { + + $myrow = db_fetch($result); + + $_SESSION['Items']->customer_id = $myrow["debtor_no"]; + $_SESSION['Items']->customer_name = $myrow["name"]; + $_SESSION['Items']->cust_ref = $myrow["reference"]; + $_SESSION['Items']->Branch = $myrow["branch_code"]; + $_SESSION['Items']->customer_currency = $myrow["curr_code"]; + + $_SESSION['Items']->Comments = ""; + $_SESSION['Items']->default_sales_type =$myrow["tpe"]; + $_SESSION['Items']->Location = $myrow["from_stk_loc"]; + + $_SESSION['Items']->tax_group_name = $myrow["tax_group_name"]; + $_SESSION['Items']->tax_group_id = $myrow["tax_group_id"]; + + $_SESSION['Items']->delivery_date = sql2date($myrow["tran_date"]); + $_SESSION['Items']->freight_cost = $myrow["ov_freight"]; + + $_SESSION['Items']->ship_via = $myrow["default_ship_via"]; + + $_SESSION['Order'] = $myrow["order_"]; + + db_free_result($result); + + /*now populate the line items array with the detail records for the invoice*/ + + $result = get_customer_trans_details(10, $_GET['InvoiceNumber']); + + if (db_num_rows($result) > 0) + { + + while ($myrow = db_fetch($result)) + { + + $_SESSION['Items']->add_to_cart($myrow["stock_id"],-$myrow["quantity"], + $myrow["FullUnitPrice"],$myrow["discount_percent"]); + + $_SESSION['Items']->line_items[$myrow["stock_id"]]->standard_cost = $myrow["standard_cost"]; + + } + + } /*else { // there are no item records created for that invoice + // it's ok there might be shipping or only taxes !! + echo "
" . _("Back to the main menu") . ""; + echo "

" . _("There are no line items that were retrieved for this invoice. A credit note cannot be created from this invoice."). "

"; + end_page(); + exit; + + }*/ //end of checks on returned data set + db_free_result($result); + } + else + { + display_error(_("This invoice can not be credited using the automatic facility.")); + display_error("Please report that a duplicate debtor_trans header record was found for invoice " . $SESSION['InvoiceToCredit']); + echo "

"; + exit; + } //valid invoice record returned from the entered invoice number + +} +else +{ + +/* if processing, the page has been called and ${$StkItm->stock_id} would have been set from the post */ + foreach ($_SESSION['Items']->line_items as $itm) + { + $_SESSION['Items']->line_items[$itm->stock_id]->qty_dispatched = $_POST[$itm->stock_id]; + + if (isset($_POST[$itm->stock_id . "Desc"]) && strlen($_POST[$itm->stock_id . "Desc"]) > 0) + { + $_SESSION['Items']->line_items[$itm->stock_id]->item_description = $_POST[$itm->stock_id . "Desc"]; + } + } +} + +//-------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessCredit'])) +{ + process_credit(); +} + +//-------------------------------------------------------------------------------------- + +if (isset($_POST['Location'])) +{ + $_SESSION['Items']->Location = $_POST['Location']; +} + +//-------------------------------------------------------------------------------------- + +function display_credit_items() +{ + global $table_style, $table_style2; + + start_form(false, true); + + start_table("$table_style2 width=80%", 5); + echo ""; // outer table + + start_table("$table_style width=100%"); + start_row(); + label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'"); + label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'"); + label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'"); + end_row(); + start_row(); + + if (!isset($_POST['ref'])) + $_POST['ref'] = references::get_next(11); + + ref_cells(_("Reference"), 'ref', null, "class='tableheader2'"); + + label_cells(_("Crediting Invoice"), get_customer_trans_view_str(10, $_SESSION['InvoiceToCredit']), "class='tableheader2'"); + + if (!isset($_POST['tax_group_id'])) + $_POST['tax_group_id'] = $_SESSION['Items']->tax_group_id; + label_cell(_("Tax Group"), "class='tableheader2'"); + tax_groups_list_cells(null, 'tax_group_id', $_POST['tax_group_id'], false, null, true); + end_row(); + end_table(); + + echo "";// outer table + + start_table("$table_style width=100%"); + + label_row(_("Invoice Date"), $_SESSION['Items']->delivery_date, "class='tableheader2'"); + + date_row(_("Credit Note Date"), 'CreditDate', null, 0, 0, 0, "class='tableheader2'"); + + end_table(); + + echo ""; + + end_table(1); // outer table + + start_table("$table_style width=80%"); + $th = array(_("Item Code"), _("Item Description"), _("Invoiced Quantity"), _("Units"), + _("Credit Quantity"), _("Price"), _("Discount %"), _("Total")); + table_header($th); + + $k = 0; //row colour counter + + foreach ($_SESSION['Items']->line_items as $ln_itm) + { + + alt_table_row_color($k); + + $line_total =($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent)); + + label_cell($ln_itm->stock_id); + text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50); + qty_cell($ln_itm->quantity); + label_cell($ln_itm->units); + + text_cells(null, $ln_itm->stock_id, $ln_itm->qty_dispatched, 13, 15); + + amount_cell($ln_itm->price); + amount_cell($ln_itm->discount_percent*100); + amount_cell($line_total); + end_row(); + } + + if (!isset($_POST['ChargeFreightCost']) || ($_POST['ChargeFreightCost'] == "")) + { + $_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost; + } + start_row(); + label_cell(_("Credit Shipping Cost"), "colspan=7 align=right"); + text_cells(null, "ChargeFreightCost", $_POST['ChargeFreightCost'], 6, 6); + end_row(); + + $inv_items_total = $_SESSION['Items']->get_items_total_dispatch(); + + $display_sub_total = number_format2($inv_items_total + $_POST['ChargeFreightCost'],user_price_dec()); + label_row(_("Sub-total"), $display_sub_total, "colspan=7 align=right", "align=right"); + + $taxes = $_SESSION['Items']->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']); + + $tax_total = display_edit_tax_items($taxes, 7); + + $display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec()); + + label_row(_("Credit Note Total"), $display_total, "colspan=7 align=right", "align=right"); + + end_table(); +} + +//-------------------------------------------------------------------------------------- + +function display_credit_options() +{ + global $table_style2; + + echo "
"; + start_table($table_style2); + + echo "" . _("Credit Note Type") . ""; + echo ""; + echo""; + + if (!isset($_POST['CreditType']) || $_POST['CreditType'] == "Return") + { + + /*if the credit note is a return of goods then need to know which location to receive them into */ + if (!isset($_POST['Location'])) + { + $_POST['Location'] = $_SESSION['Items']->Location; + } + + locations_list_row(_("Items Returned to Inventory Location"), 'Location', $_POST['Location']); + + } + else + { /* the goods are to be written off to somewhere */ + + gl_all_accounts_list_row(_("Write Off the Cost of the Items to"), 'WriteOffGLCode', $_POST['WriteOffGLCode']); + } + textarea_row(_("Memo"), "CreditText", null, 45, 3); + end_table(); +} + +//-------------------------------------------------------------------------------------- + +display_credit_items(); +display_credit_options(); + +echo "

"; +submit('Update', _("Update")); +echo " "; +submit('ProcessCredit', _("Process Credit Note")); +echo "
"; + +end_form(); + +//-------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/sales/customer_invoice.php b/sales/customer_invoice.php new file mode 100644 index 00000000..f63fc523 --- /dev/null +++ b/sales/customer_invoice.php @@ -0,0 +1,488 @@ +direct_invoice) + hyperlink_params("$path_to_root/sales/sales_order_entry.php", _("Issue Another Invoice"), "NewInvoice=Yes"); + else + hyperlink_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select Another Order For Invoicing"), "OutstandingOnly=1"); + + unset($_SESSION['Items']->line_items); + unset($_SESSION['Items']); + display_footer_exit(); +} + +//--------------------------------------------------------------------------------------------------------------- + +if (!isset($_GET['OrderNumber']) && !isset($_SESSION['ProcessingOrder']) && + !isset($_GET['process_invoice'])) +{ + /* This page can only be called with an order number for invoicing*/ + display_error(_("This page can only be opened if an order has been selected. Please select an order first.")); + + hyperlink_no_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a sales order to invoice")); + + end_page(); + exit; + +} +elseif (isset($_GET['OrderNumber']) && $_GET['OrderNumber'] > 0) +{ + + if (isset($_SESSION['Items'])) + { + unset($_SESSION['Items']->line_items); + unset ($_SESSION['Items']); + } + + session_register("Items"); + session_register("ProcessingOrder"); + + $_SESSION['ProcessingOrder'] = $_GET['OrderNumber']; + $_SESSION['Items'] = new cart; + + /*read in all the selected order into the Items cart */ + + if (read_sales_order($_SESSION['ProcessingOrder'], $_SESSION['Items'], true)) + { + + if ($_SESSION['Items']->count_items() == 0) + { + hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php", _("Select a different sales order to invoice"), "OutstandingOnly=1"); + die ("
" . _("There are no ordered items with a quantity left to deliver. There is nothing left to invoice.") . ""); + } + } + else + { + hyperlink_no_params("/sales_orders_view.php", _("Select a sales order to invoice")); + die ("
" . _("This order item could not be retrieved. Please select another order.") . ""); + } + +} +else +{ + /* if processing, a dispatch page has been called and ${$StkItm->stock_id} would have been set from the post */ + foreach ($_SESSION['Items']->line_items as $itm) + { + + if (isset($_SESSION['Items']->line_items[$itm->stock_id]) && + isset($_POST[$itm->stock_id]) && is_numeric($_POST[$itm->stock_id]) && + $_POST[$itm->stock_id] <= ($_SESSION['Items']->line_items[$itm->stock_id]->quantity - + $_SESSION['Items']->line_items[$itm->stock_id]->qty_inv)) + { + $_SESSION['Items']->line_items[$itm->stock_id]->qty_dispatched = $_POST[$itm->stock_id]; + } + + if (isset($_POST[$itm->stock_id . "Desc"]) && strlen($_POST[$itm->stock_id . "Desc"]) > 0) + { + $_SESSION['Items']->line_items[$itm->stock_id]->item_description = $_POST[$itm->stock_id . "Desc"]; + } + } +} + +//--------------------------------------------------------------------------------------------------------------- + +function order_changed_error() +{ + global $path_to_root; + display_note(_("This order has been changed or invoiced since this delivery was started to be confirmed. Processing halted."), 1, 0); + display_note(_("To enter and confirm this dispatch/invoice the order must be re-selected and re-read again to update the changes made by the other user."), 1, 0); + + hyperlink_no_params("$path_to_root/sales/inquiry/sales_orders_view.php", _("Select a sales order for confirming deliveries and invoicing")); + + unset($_SESSION['Items']->line_items); + unset($_SESSION['Items']); + unset($_SESSION['ProcessingOrder']); + exit; +} + +//--------------------------------------------------------------------------------------------------------------- + +function check_order_changed() +{ + global $debug; + + /*Now need to check that the order details are the same as they were when + they were read into the Items array. + If they've changed then someone else may have invoiced them - + as modified for bug pointed out by Sherif 1-7-03*/ + + $sql = "SELECT stk_code, quantity, qty_invoiced FROM ".TB_PREF."sales_order_details WHERE + quantity - qty_invoiced > 0 + AND order_no = " . $_SESSION['ProcessingOrder']; + + $result = db_query($sql,"retreive sales order details"); + + if (db_num_rows($result) != count($_SESSION['Items']->line_items)) + { + + /*there should be the same number of items returned from this query as there are lines on the invoice - + if not then someone has already invoiced or credited some lines */ + if ($debug == 1) + { + display_note($sql, 1, 0); + display_note("No rows returned by sql:" . db_num_rows($result), 1, 0); + display_note("Count of items in the session " . count($_SESSION['Items']->line_items), 1, 0); + } + + return false; + } + + while ($myrow = db_fetch($result)) + { + $stk_itm = $myrow["stk_code"]; + if ($_SESSION['Items']->line_items[$stk_itm]->quantity != $myrow["quantity"] || + $_SESSION['Items']->line_items[$stk_itm]->qty_inv != $myrow["qty_invoiced"]) + { + display_note(_("Original order for") . " " . $myrow["stk_code"] . " " . + _("has a quantity of") . " " . $myrow["quantity"] . " " . + _("and an invoiced quantity of") . " " . $myrow["qty_invoiced"] . " " . + _("the session shows quantity of") . " " . + $_SESSION['Items']->line_items[$stk_itm]->quantity . " " . + _("and quantity invoice of") . " " . + $_SESSION['Items']->line_items[$stk_itm]->qty_inv, 1, 0); + + return false; + } + } /*loop through all line items of the order to ensure none have been invoiced */ + + return true; +} + + +//--------------------------------------------------------------------------------------------------------------- + +function check_data() +{ + if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate'])) + { + display_error(_("The entered invoice date is invalid.")); + return false; + } + if (!is_date_in_fiscalyear($_POST['DispatchDate'])) + { + display_error(_("The entered invoice date is not in fiscal year.")); + return false; + } + if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) + { + display_error(_("The entered invoice due date is invalid.")); + return false; + } + + if (!references::is_valid($_POST['ref'])) + { + display_error(_("You must enter a reference.")); + return false; + } + + if (!is_new_reference($_POST['ref'], 10)) + { + display_error(_("The entered reference is already in use.")); + return false; + } + if ($_POST['ChargeFreightCost'] == "") + $_POST['ChargeFreightCost'] = 0; + if (!is_numeric($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] < 0) + { + display_error(_("The entered shipping value is not numeric.")); + return false; + } + + if ($_SESSION['Items']->has_items_dispatch() == 0 && $_POST['ChargeFreightCost'] == 0) + { + display_error(_("There are no item quantities on this invoice.")); + return false; + } + + return true; +} + +//--------------------------------------------------------------------------------------------------------------- + +function check_qoh() +{ + if (!sys_prefs::allow_negative_stock()) + { + foreach ($_SESSION['Items']->line_items as $itm) + { + + if ($itm->qty_dispatched && has_stock_holding($itm->mb_flag)) + { + $qoh = get_qoh_on_date($itm->stock_id, $_POST['Location'], $_POST['DispatchDate']); + + if ($itm->qty_dispatched > $qoh) + { + display_error(_("The invoice cannot be processed because there is an insufficient quantity for component:") . + " " . $itm->stock_id . " - " . $itm->item_description); + return false; + } + } + } + } + + return true; +} + +//--------------------------------------------------------------------------------------------------------------- + +function process_invoice($invoicing=false) +{ + if ($invoicing) + { + read_sales_order($_SESSION['Items']->order_no, $_SESSION['Items'], true); + $duedate = get_invoice_duedate($_SESSION['Items']->customer_id, $_SESSION['Items']->delivery_date); + $invoice_no = add_sales_invoice($_SESSION['Items'], + $_SESSION['Items']->delivery_date, $duedate, $_SESSION['Items']->order_no, + $_SESSION['Items']->tax_group_id, $_SESSION['Items']->freight_cost, + $_SESSION['Items']->Location, $_SESSION['Items']->ship_via, + $_SESSION['Items']->default_sales_type, references::get_next(10), + $_SESSION['Items']->memo_, 0); + } + else + { + + if (!check_data()) + return; + + if (!check_order_changed()) + order_changed_error(); + + if (!check_qoh()) + return; + + if ($_POST['bo_policy']) + $bo_policy = 0; + else + $bo_policy = 1; + + $invoice_no = add_sales_invoice($_SESSION['Items'], + $_POST['DispatchDate'], $_POST['due_date'], $_SESSION['ProcessingOrder'], + $_POST['tax_group_id'], $_POST['ChargeFreightCost'], $_POST['Location'], + $_POST['ship_via'], $_POST['sales_type_id'], $_POST['ref'], + $_POST['InvoiceText'], $bo_policy); + unset($_SESSION['ProcessingOrder']); + } + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$invoice_no"); +} + +//--------------------------------------------------------------------------------------------------------------- +if (isset($_GET['process_invoice'])) + process_invoice(true); +elseif (isset($_POST['process_invoice'])) + process_invoice(); + +//------------------------------------------------------------------------------------------------- + +start_form(false, true); + +start_table("$table_style2 width=80%", 5); +echo ""; // outer table + +start_table("$table_style width=100%"); +start_row(); +label_cells(_("Customer"), $_SESSION['Items']->customer_name, "class='tableheader2'"); +label_cells(_("Branch"), get_branch_name($_SESSION['Items']->Branch), "class='tableheader2'"); +label_cells(_("Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'"); +end_row(); +start_row(); + +if (!isset($_POST['ref'])) + $_POST['ref'] = references::get_next(10); + +ref_cells(_("Reference"), 'ref', null, "class='tableheader2'"); + +if (!isset($_POST['tax_group_id'])) + $_POST['tax_group_id'] = $_SESSION['Items']->tax_group_id; +label_cell(_("Tax Group"), "class='tableheader2'"); +tax_groups_list_cells(null, 'tax_group_id', $_POST['tax_group_id'], false, null, true); + +label_cells(_("For Sales Order"), get_customer_trans_view_str(systypes::sales_order(), $_SESSION['ProcessingOrder']), "class='tableheader2'"); + +end_row(); +start_row(); + +if (!isset($_POST['sales_type_id'])) + $_POST['sales_type_id'] = $_SESSION['Items']->default_sales_type; +label_cell(_("Sales Type"), "class='tableheader2'"); +sales_types_list_cells(null, 'sales_type_id', $_POST['sales_type_id']); + +if (!isset($_POST['Location'])) + $_POST['Location'] = $_SESSION['Items']->Location; +label_cell(_("Delivery From"), "class='tableheader2'"); +locations_list_cells(null, 'Location', $_POST['Location'], false, true); + +if (!isset($_POST['ship_via'])) + $_POST['ship_via'] = $_SESSION['Items']->ship_via; +label_cell(_("Shipping Company"), "class='tableheader2'"); +shippers_list_cells(null, 'ship_via', $_POST['ship_via']); +end_row(); + +end_table(); + +echo "";// outer table + +start_table("$table_style width=90%"); + +// set this up here cuz it's used to calc qoh +if (!isset($_POST['DispatchDate']) || !is_date($_POST['DispatchDate'])) +{ + $_POST['DispatchDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['DispatchDate'])) + $_POST['DispatchDate'] = end_fiscalyear(); +} +text_row(_("Date"), 'DispatchDate', $_POST['DispatchDate'], 10, 10, "class='tableheader'"); + +if (!isset($_POST['due_date']) || !is_date($_POST['due_date'])) + //$_POST['due_date'] = $_POST['DispatchDate']; + $_POST['due_date'] = get_invoice_duedate($_SESSION['Items']->customer_id, $_POST['DispatchDate']); + +text_row(_("Due Date"), 'due_date', $_POST['due_date'], 10, 10, "class='tableheader'"); +end_table(); + +echo ""; +end_table(1); // outer table + +display_heading(_("Invoice Items")); + +start_table("$table_style width=80%"); +$th = array(_("Item Code"), _("Item Description"), _("Ordered"), _("Units"), _("Delivered"), + _("This Delivery"), _("Price"), _("Tax Type"), _("Discount"), _("Total")); +table_header($th); +$k = 0; +$has_marked = false; +$show_qoh = true; + +foreach ($_SESSION['Items']->line_items as $ln_itm) +{ + + // if it's a non-stock item (eg. service) don't show qoh + if (sys_prefs::allow_negative_stock() || !has_stock_holding($ln_itm->mb_flag) || + $ln_itm->qty_dispatched == 0) + $show_qoh = false; + + if ($show_qoh) + $qoh = get_qoh_on_date($ln_itm->stock_id, $_POST['Location'], $_POST['DispatchDate']); + + if ($show_qoh && ($ln_itm->qty_dispatched > $qoh)) + { + // oops, we don't have enough of one of the component items + start_row("class='stockmankobg'"); + $has_marked = true; + } + else + alt_table_row_color($k); + + view_stock_status_cell($ln_itm->stock_id); + + text_cells(null, $ln_itm->stock_id . "Desc", $ln_itm->item_description, 30, 50); + qty_cell($ln_itm->quantity); + label_cell($ln_itm->units); + qty_cell($ln_itm->qty_inv); + + text_cells(null, $ln_itm->stock_id, $ln_itm->qty_dispatched, 10, 10); + + $display_discount_percent = number_format2($ln_itm->discount_percent*100,user_percent_dec()) . "%"; + + $line_total = ($ln_itm->qty_dispatched * $ln_itm->price * (1 - $ln_itm->discount_percent)); + + amount_cell($ln_itm->price); + label_cell($ln_itm->tax_type_name); + label_cell($display_discount_percent, "nowrap align=right"); + amount_cell($line_total); + + //label_cell(get_tax_free_price_for_item($ln_itm->stock_id, $line_total, $_POST['tax_group_id'])); + + end_row(); +} + +/*Don't re-calculate freight if some of the order has already been delivered - +depending on the business logic required this condition may not be required. +It seems unfair to charge the customer twice for freight if the order +was not fully delivered the first time ?? */ + +if (!isset($_POST['ChargeFreightCost']) || $_POST['ChargeFreightCost'] == "") +{ + if ($_SESSION['Items']->any_already_delivered() == 1) + { + $_POST['ChargeFreightCost'] = 0; + } + else + { + $_POST['ChargeFreightCost'] = $_SESSION['Items']->freight_cost; + } + if (!is_numeric($_POST['ChargeFreightCost'])) + { + $_POST['ChargeFreightCost'] = 0; + } +} + +start_row(); + +small_amount_cells(_("Shipping Cost"), 'ChargeFreightCost', null, "colspan=9 align=right"); + +$inv_items_total = $_SESSION['Items']->get_items_total_dispatch(); + +$display_sub_total = number_format2($inv_items_total + $_POST['ChargeFreightCost'],user_price_dec()); + +label_row(_("Sub-total"), $display_sub_total, "colspan=9 align=right","align=right"); + +$taxes = $_SESSION['Items']->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']); +$tax_total = display_edit_tax_items($taxes, 9); + +$display_total = number_format2(($inv_items_total + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec()); + +label_row(_("Invoice Total"), $display_total, "colspan=9 align=right","align=right"); + +end_table(1); + +if ($has_marked) + display_note(_("Marked items have insufficient quantities in stock."), 0, 1, "class='red'"); + +start_table($table_style2); + +policy_list_row(_("Action For Balance"), "bo_policy", null); + +textarea_row(_("Memo"), 'InvoiceText', null, 50, 4); + +end_table(1); + +submit_center_first('Update', _("Update")); +submit_center_last('process_invoice', _("Process Invoice")); + +end_form(); + +//--------------------------------------------------------------------------------------------- + +end_page(); + +?> diff --git a/sales/customer_payments.php b/sales/customer_payments.php new file mode 100644 index 00000000..7153e457 --- /dev/null +++ b/sales/customer_payments.php @@ -0,0 +1,229 @@ +"; // outer table + + echo ""; + + if (!isset($_POST['customer_id'])) + $_POST['customer_id'] = get_global_customer(false); + if (!isset($_POST['DateBanked'])) + { + $_POST['DateBanked'] = Today(); + if (!is_date_in_fiscalyear($_POST['DateBanked'])) + $_POST['DateBanked'] = end_fiscalyear(); + } + customer_list_row(_("From Customer:"), 'customer_id', null, false, true); + + if (db_customer_has_branches($_POST['customer_id'])) + { + customer_branches_list_row(_("Branch:"), $_POST['customer_id'], 'BranchID', null, false, true, true); + } + else + { + hidden('BranchID', reserved_words::get_any_numeric()); + } + + read_customer_data(); + + set_global_customer($_POST['customer_id']); + + if (isset($_POST['HoldAccount']) && $_POST['HoldAccount'] != 0) + { + echo "
"; + display_note(_("This customer account is on hold."), 0, 0, "class='redfb'"); + } + else + { + $display_discount_percent = number_format2($_POST['pymt_discount']*100,user_price_dec()) . "%"; + + amount_row(_("Amount:"), 'amount'); + + amount_row(_("Amount of Discount:"), 'discount'); + + label_row(_("Customer prompt payment discount :"), $display_discount_percent); + + date_row(_("Date of Deposit:"), 'DateBanked'); + + echo ""; + echo ""; // outer table + echo ""; + + bank_accounts_list_row(_("Into Bank Account:"), 'bank_account', null, true); + + $cust_currency = get_customer_currency($_POST['customer_id']); + $bank_currency = get_bank_account_currency($_POST['bank_account']); + + if ($cust_currency != $bank_currency) + { + exchange_rate_display($cust_currency, $bank_currency, $_POST['DateBanked']); + } + + bank_trans_types_list_row(_("Type:"), 'ReceiptType', null); + + text_row(_("Reference:"), 'ref', null, 20, 40); + + textarea_row(_("Memo:"), 'memo_', null, 22, 4); + + echo "
"; + + echo ""; + end_table(); // outer table + + if ($cust_currency != $bank_currency) + display_note(_("Amount and discount are in customer's currency.")); + + echo"
"; + + submit_center('AddPaymentItem', _("Add Payment")); + } + + echo "
"; +} + +//---------------------------------------------------------------------------------------------- + +start_form(); + +display_item_form(); + +end_form(); +end_page(); +?> diff --git a/sales/includes/cart_class.inc b/sales/includes/cart_class.inc new file mode 100644 index 00000000..1bb71589 --- /dev/null +++ b/sales/includes/cart_class.inc @@ -0,0 +1,274 @@ +line_items = array(); + $this->default_sales_type = ""; + $this->direct_invoice=false; + } + + function add_to_cart($stock_id, $qty, $price, $disc, $qty_invoiced=0, $standard_cost=0, $description=null) + { + + if (isset($stock_id) && $stock_id != "" && isset($qty) && $qty > 0) + { + + $this->line_items[$stock_id] = new line_details($stock_id, $qty, $price, $disc, + $qty_invoiced, $standard_cost, $description); + return 1; + } + else + { + // shouldn't come here under normal circumstances + display_db_error("unexpected - adding an invalid item or null quantity", "", true); + } + return 0; + } + + function find_cart_item($stock_id) + { + if (isset($this->line_items[$stock_id]) && $this->line_items[$stock_id] != null) + return $this->line_items[$stock_id]; + return null; + } + + function update_cart_item($update_item, $qty, $price, $disc) + { + + if ($qty > 0) + { + $this->line_items[$update_item]->quantity = $qty; + } + $this->line_items[$update_item]->price = $price; + $this->line_items[$update_item]->discount_percent = $disc; + } + + function update_add_cart_item_qty($update_item, $qty) + { + $this->line_items[$update_item]->quantity += $qty; + } + + function remove_from_cart(&$stock_id) + { + if (isset($stock_id)) + { + unset($this->line_items[$stock_id]); + } + } + + function clear_items() + { + unset($this->line_items); + $this->line_items = array(); + $this->default_sales_type = ""; + $this->customer_id = $this->order_no = 0; + } + + function count_items() + { + return count($this->line_items); + } + + function get_items_total_dispatch($tax_group_id=null) + { + $total = 0; + + // preload the taxgroup ! + if ($tax_group_id != null) + $tax_group_array = get_tax_group_items_as_array($tax_group_id); + else + $tax_group_array = null; + + foreach ($this->line_items as $ln_itm) + { + $total += ($ln_itm->qty_dispatched * $ln_itm->taxfree_price($tax_group_id, $tax_group_array) * (1 - $ln_itm->discount_percent)); + } + return $total; + } + + function has_items_dispatch() + { + foreach ($this->line_items as $ln_itm) + { + if ($ln_itm->qty_dispatched > 0) + return true; + } + return false; + } + + function get_items_total($tax_group_id=null) + { + $total = 0; + + // preload the taxgroup ! + if ($tax_group_id != null) + $tax_group_array = get_tax_group_items_as_array($tax_group_id); + else + $tax_group_array = null; + + foreach ($this->line_items as $ln_itm) { + $total += ($ln_itm->quantity * $ln_itm->taxfree_price($tax_group_id, $tax_group_array) * (1 - $ln_itm->discount_percent)); + } + return $total; + } + + function any_already_delivered() + { + /* Checks if there have been deliveries of line items */ + + foreach ($this->line_items as $stock_item) + { + if ($stock_item->qty_inv !=0) + { + return 1; + } + } + + return 0; + + } + + function some_already_delivered($stock_id) + { + /* Checks if there have been deliveries of a specific line item */ + if (isset($stock_id) && isset($this->line_items[$stock_id]) && + $this->line_items[$stock_id]->qty_inv != 0) + { + return 1; + } + return 0; + } + + function get_taxes($tax_group_id=null, $shipping_cost=0) + { + $items = array(); + $prices = array(); + + if ($tax_group_id == null) + $tax_group_id = $this->tax_group_id; + + // preload the taxgroup ! + $tax_group_array = get_tax_group_items_as_array($tax_group_id); + + foreach ($this->line_items as $ln_itm) + { + $items[] = $ln_itm->stock_id; + $prices[] = ($ln_itm->qty_dispatched * $ln_itm->taxfree_price($tax_group_id, $tax_group_array) * (1 - $ln_itm->discount_percent)); + } + + + $taxes = get_tax_for_items($items, $prices, $shipping_cost, $tax_group_id, $tax_group_array); + + return $taxes; + } + +} /* end of class defintion */ + +class line_details +{ + var $stock_id; + var $item_description; + var $units; + var $mb_flag; + var $tax_type; + var $tax_type_name; + + var $quantity; + var $price; + var $discount_percent; + var $qty_inv; + var $qty_dispatched; + var $standard_cost; + + function line_details ($stock_id, $qty, $prc, $disc_percent, + $qty_invoiced, $standard_cost, $description) + { + /* Constructor function to add a new LineDetail object with passed params */ + $item_row = get_item($stock_id); + + if ($item_row == null) + display_db_error("invalid item added to order : $stock_id", ""); + + $this->mb_flag = $item_row["mb_flag"]; + $this->units = $item_row["units"]; + if ($description == null) + $this->item_description = $item_row["description"]; + else + $this->item_description = $description; + //$this->standard_cost = $item_row["material_cost"] + $item_row["labour_cost"] + $item_row["overhead_cost"]; + $this->tax_type = $item_row["tax_type_id"]; + $this->tax_type_name = $item_row["tax_type_name"]; + + $this->stock_id = $stock_id; + $this->quantity = $qty; + $this->price = $prc; + $this->discount_percent = $disc_percent; + $this->qty_inv = $qty_invoiced; + $this->qty_dispatched = $qty - $qty_invoiced; + $this->standard_cost = $standard_cost; + } + + function full_price() + { + return $this->price; + } + + function taxfree_price($tax_group_id, $tax_group_array=null) + { + if ($tax_group_id==null) + return $this->price; + return get_tax_free_price_for_item($this->stock_id, $this->price, $tax_group_id, $tax_group_array); + } +} + +?> diff --git a/sales/includes/db/branches_db.inc b/sales/includes/db/branches_db.inc new file mode 100644 index 00000000..2c4eb522 --- /dev/null +++ b/sales/includes/db/branches_db.inc @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/sales/includes/db/credit_status_db.inc b/sales/includes/db/credit_status_db.inc new file mode 100644 index 00000000..4bf0bdd9 --- /dev/null +++ b/sales/includes/db/credit_status_db.inc @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/sales/includes/db/cust_trans_db.inc b/sales/includes/db/cust_trans_db.inc new file mode 100644 index 00000000..48af1690 --- /dev/null +++ b/sales/includes/db/cust_trans_db.inc @@ -0,0 +1,210 @@ + 1) + { + // can't return multiple + display_db_error("duplicate debtor transactions found for given params", $sql, true); + exit; + } + + return db_fetch($result); +} + +//---------------------------------------------------------------------------------------- + +function get_customer_transactions($extra_fields=null, $extra_conditions=null, $extra_tables=null) +{ + $sql = "SELECT ".TB_PREF."debtor_trans.*, + ov_amount+ov_gst+ov_freight+ov_discount AS Total, + ".TB_PREF."debtors_master.name AS DebtorName, ".TB_PREF."debtors_master.address, + ".TB_PREF."debtors_master.curr_code "; + + if ($extra_fields) + $sql .= ", $extra_fields "; + + $sql .= " FROM ".TB_PREF."debtor_trans, ".TB_PREF."debtors_master "; + if ($extra_tables) + $sql .= ",$extra_tables "; + + $sql .= " WHERE ".TB_PREF."debtor_trans.debtor_no=".TB_PREF."debtors_master.debtor_no"; + + if ($extra_conditions) + $sql .= " AND $extra_conditions "; + + $sql .= " ORDER BY trans_no"; + + return db_query($sql, "Cannot retreive debtor transactions"); +} + +//---------------------------------------------------------------------------------------- + +function exists_customer_trans($type, $type_no) +{ + $sql = "SELECT trans_no FROM ".TB_PREF."debtor_trans WHERE type=$type + AND trans_no=$type_no"; + $result = db_query($sql, "Cannot retreive a debtor transaction"); + + return (db_num_rows($result) > 0); +} + +//---------------------------------------------------------------------------------------- + +// retreives the related sales order for a given trans + +function get_customer_trans_order($type, $type_no) +{ + $sql = "SELECT order_ FROM ".TB_PREF."debtor_trans WHERE type=$type AND trans_no=$type_no"; + + $result = db_query($sql, "The debtor transaction could not be queried"); + + $row = db_fetch_row($result); + + return $row[0]; +} + +//---------------------------------------------------------------------------------------- + +function get_customer_details_from_trans($type, $type_no) +{ + $sql = "SELECT ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.curr_code, ".TB_PREF."cust_branch.br_name + FROM ".TB_PREF."debtors_master,".TB_PREF."cust_branch,".TB_PREF."debtor_trans + WHERE ".TB_PREF."debtor_trans.type=$type AND ".TB_PREF."debtor_trans.trans_no=$type_no + AND ".TB_PREF."debtors_master.debtor_no = ".TB_PREF."debtor_trans.debtor_no + AND ".TB_PREF."cust_branch.branch_code = ".TB_PREF."debtor_trans.branch_code"; + + $result = db_query($sql, "could not get customer details from trans"); + return db_fetch($result); +} + +//---------------------------------------------------------------------------------------- + +function void_customer_trans($type, $type_no) +{ + // clear all values and mark as void + $sql = "UPDATE ".TB_PREF."debtor_trans SET ov_amount=0, ov_discount=0, ov_gst=0, ov_freight=0, + alloc=0 WHERE type=$type AND trans_no=$type_no"; + + db_query($sql, "could not void debtor transactions for type=$type and trans_no=$type_no"); +} + +//---------------------------------------------------------------------------------------- + +function post_void_customer_trans($type, $type_no) +{ + switch ($type) + { + case 10 : + case 11 : + void_sales_invoice($type, $type_no); + break; + case systypes::cust_payment() : + void_customer_payment($type, $type_no); + break; + } +} + +//---------------------------------------------------------------------------------------- + + +?> \ No newline at end of file diff --git a/sales/includes/db/cust_trans_details_db.inc b/sales/includes/db/cust_trans_details_db.inc new file mode 100644 index 00000000..be04db16 --- /dev/null +++ b/sales/includes/db/cust_trans_details_db.inc @@ -0,0 +1,114 @@ + \ No newline at end of file diff --git a/sales/includes/db/custalloc_db.inc b/sales/includes/db/custalloc_db.inc new file mode 100644 index 00000000..0a1c78f2 --- /dev/null +++ b/sales/includes/db/custalloc_db.inc @@ -0,0 +1,120 @@ + 0"; + } + + $cust_sql = ""; + if ($customer_id != null) + $cust_sql = " AND ".TB_PREF."debtor_trans.debtor_no = $customer_id"; + + return get_customer_transactions("round(ABS(ov_amount+ov_gst+ov_freight+ov_discount)-alloc,6) <= 0 AS settled", + "(type=" . systypes::cust_payment(). " OR type=11 OR type=2) AND (".TB_PREF."debtor_trans.ov_amount < 0) " . $settled_sql . $cust_sql); +} + +//------------------------------------------------------------------------------------------------------------- + +function get_allocatable_to_cust_transactions($customer_id, $trans_no=null, $type=null) +{ + if ($trans_no != null and $type != null) + { + return get_customer_transactions("amt", "".TB_PREF."debtor_trans.trans_no = ".TB_PREF."cust_allocations.trans_no_to + AND ".TB_PREF."debtor_trans.type = ".TB_PREF."cust_allocations.trans_type_to + AND ".TB_PREF."cust_allocations.trans_no_from=$trans_no + AND ".TB_PREF."cust_allocations.trans_type_from=$type + AND ".TB_PREF."debtor_trans.debtor_no=$customer_id", + "".TB_PREF."cust_allocations"); + } + else + { + return get_customer_transactions(null, "round(ABS(ov_amount+ov_gst+ov_freight+ov_discount)-alloc,6) > 0 + AND ".TB_PREF."debtor_trans.type != " . systypes::cust_payment() . " + AND ".TB_PREF."debtor_trans.debtor_no=$customer_id"); + } +} + + +?> \ No newline at end of file diff --git a/sales/includes/db/customers_db.inc b/sales/includes/db/customers_db.inc new file mode 100644 index 00000000..9915071a --- /dev/null +++ b/sales/includes/db/customers_db.inc @@ -0,0 +1,173 @@ + 0, + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date)) >= ".TB_PREF."payment_terms.days_before_due + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE 0 END, + + CASE WHEN TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= 0 + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + + )) AS Due, + + Sum(IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $past1) + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= $past1) + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + + )) AS Overdue1, + + Sum(IF (".TB_PREF."payment_terms.days_before_due > 0, + CASE WHEN TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) > ".TB_PREF."payment_terms.days_before_due + AND TO_DAYS('$todate') - TO_DAYS(".TB_PREF."debtor_trans.tran_date) >= (".TB_PREF."payment_terms.days_before_due + $past2) + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END, + + CASE WHEN (TO_DAYS('$todate') - TO_DAYS(DATE_ADD(DATE_ADD(".TB_PREF."debtor_trans.tran_date, + INTERVAL 1 MONTH), INTERVAL (".TB_PREF."payment_terms.day_in_following_month - + DAYOFMONTH(".TB_PREF."debtor_trans.tran_date)) DAY)) >= $past2) + THEN + ".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount + ELSE + 0 + END + + )) AS Overdue2 + + FROM ".TB_PREF."debtors_master, + ".TB_PREF."payment_terms, + ".TB_PREF."credit_status, + ".TB_PREF."debtor_trans + + WHERE + ".TB_PREF."debtors_master.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."debtors_master.credit_status = ".TB_PREF."credit_status.id + AND ".TB_PREF."debtors_master.debtor_no = $customer_id + AND ".TB_PREF."debtor_trans.tran_date <= '$todate' + AND ".TB_PREF."debtors_master.debtor_no = ".TB_PREF."debtor_trans.debtor_no + + GROUP BY + ".TB_PREF."debtors_master.name, + ".TB_PREF."payment_terms.terms, + ".TB_PREF."payment_terms.days_before_due, + ".TB_PREF."payment_terms.day_in_following_month, + ".TB_PREF."debtors_master.credit_limit, + ".TB_PREF."credit_status.dissallow_invoices, + ".TB_PREF."credit_status.reason_description"; + + $result = db_query($sql,"The customer details could not be retrieved"); + + if (db_num_rows($result) == 0) + { + + /*Because there is no balance - so just retrieve the header information about the customer - the choice is do one query to get the balance and transactions for those customers who have a balance and two queries for those who don't have a balance OR always do two queries - I opted for the former */ + + $nil_balance = true; + + $sql = "SELECT ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.curr_code, ".TB_PREF."debtors_master.debtor_no, ".TB_PREF."payment_terms.terms, + ".TB_PREF."debtors_master.credit_limit, ".TB_PREF."credit_status.dissallow_invoices, ".TB_PREF."credit_status.reason_description + FROM ".TB_PREF."debtors_master, + ".TB_PREF."payment_terms, + ".TB_PREF."credit_status + + WHERE + ".TB_PREF."debtors_master.payment_terms = ".TB_PREF."payment_terms.terms_indicator + AND ".TB_PREF."debtors_master.credit_status = ".TB_PREF."credit_status.id + AND ".TB_PREF."debtors_master.debtor_no = '$customer_id'"; + + $result = db_query($sql,"The customer details could not be retrieved"); + + } + else + { + $nil_balance = false; + } + + $customer_record = db_fetch($result); + + if ($nil_balance == true) + { + $customer_record["Balance"] = 0; + $customer_record["Due"] = 0; + $customer_record["Overdue1"] = 0; + $customer_record["Overdue2"] = 0; + } + + return $customer_record; + +} + +function get_customer_name($customer_id) +{ + $sql = "SELECT name FROM ".TB_PREF."debtors_master WHERE debtor_no=$customer_id"; + + $result = db_query($sql, "could not get customer"); + + $row = db_fetch_row($result); + + return $row[0]; +} + +function get_area_name($id) +{ + $sql = "SELECT description FROM ".TB_PREF."areas WHERE area_code=$id"; + + $result = db_query($sql, "could not get sales type"); + + $row = db_fetch_row($result); + return $row[0]; +} + +function get_salesman_name($id) +{ + $sql = "SELECT salesman_name FROM ".TB_PREF."salesman WHERE salesman_code=$id"; + + $result = db_query($sql, "could not get sales type"); + + $row = db_fetch_row($result); + return $row[0]; +} + + + + +?> \ No newline at end of file diff --git a/sales/includes/db/index.php b/sales/includes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/includes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/includes/db/payment_db.inc b/sales/includes/db/payment_db.inc new file mode 100644 index 00000000..b5755857 --- /dev/null +++ b/sales/includes/db/payment_db.inc @@ -0,0 +1,79 @@ + \ No newline at end of file diff --git a/sales/includes/db/sales_credit_db.inc b/sales/includes/db/sales_credit_db.inc new file mode 100644 index 00000000..b77736d6 --- /dev/null +++ b/sales/includes/db/sales_credit_db.inc @@ -0,0 +1,296 @@ +Branch); + + $credit_items_total = $credit_items->get_items_total($tax_group_id); + + $tax_total = 0; + $taxes = $credit_items->get_taxes($tax_group_id, $charge_freight); + foreach ($taxes as $taxitem) + $tax_total += $taxitem['Value']; + + $credit_no = add_customer_trans(11, $credit_items->customer_id, $credit_items->Branch, + $credit_date, $reference, -($credit_items_total), 0, -$tax_total, -$charge_freight, + $sales_type, 0, $credit_items->ship_via); + + foreach ($credit_items->line_items as $credit_line) + { + + if ($credit_line->quantity > 0) + { + // the functions use qty_dispatched - so until that's fixed make sure it's set + // or KABOOOOM + $credit_line->qty_dispatched = $credit_line->quantity; + + add_gl_trans_credit_order_item($credit_items, $credit_line, $credit_no, $credit_date, + $tax_group_id, $credit_type); + + add_gl_trans_credit_costs($credit_items, $credit_line, $credit_no, $credit_date, + $tax_group_id, $credit_type, $write_off_gl_code, $branch_data); + + } /*quantity credited is more than 0 */ + } /*end of credit_line loop */ + + /*Post credit note transaction to GL credit debtors, + debit freight re-charged and debit sales */ + + add_g_trans_credit_common($credit_items, $credit_no, $credit_date, + $credit_items_total, $charge_freight, $taxes, $tax_total, $branch_data); + + add_comments(11, $credit_no, $credit_date, $memo_); + + add_forms_for_sys_type(11, $credit_no, $credit_items->Location); + + references::save_last($reference, 11); + + commit_transaction(); + + return $credit_no; +} + +//---------------------------------------------------------------------------------------- + +function credit_invoice($credit_items, $invoice_no, $order_no, + $default_dispatch_date, $credit_type, $tax_group_id, + $charge_freight, $reference, $memo_, $write_off_gl_code) +{ + begin_transaction(); + + $branch_data = get_branch_accounts($credit_items->Branch); + + $invoice_alloc_balance = get_DebtorTrans_allocation_balance(10, $invoice_no); + + $invoice_items_total = $credit_items->get_items_total_dispatch($tax_group_id); + + $tax_total = 0; + $taxes = $credit_items->get_taxes($tax_group_id, $charge_freight); + foreach ($taxes as $taxitem) + $tax_total += $taxitem['Value']; + + $allocate_amount = 0; + + if ($invoice_alloc_balance > 0) + { /*the invoice is not already fully allocated */ + + if ($invoice_alloc_balance > ($invoice_items_total + $charge_freight + $tax_total)) + { + + $allocate_amount = $invoice_items_total + $charge_freight + $tax_total; + } + else + { /*the balance left to allocate is less than the credit note value */ + $allocate_amount = $invoice_alloc_balance; + } + + update_debtor_trans_allocation(10, $invoice_no, $allocate_amount); + } + + /*Now insert the Credit Note into the debtor_trans table with the allocations as calculated above*/ + // all amounts in debtor's currency + + $credit_no = add_customer_trans(11, $credit_items->customer_id, $credit_items->Branch, + $default_dispatch_date, $reference, -($invoice_items_total), 0, -$tax_total, + -$charge_freight, $credit_items->default_sales_type, $order_no, + $credit_items->ship_via, "", $allocate_amount); + + /*Now insert the allocation record if > 0 */ + if ($allocate_amount != 0) + { + add_cust_allocation($allocate_amount, 11, $credit_no, 10, $invoice_no); + } + + /* Update sales order details quantity invoiced less this credit quantity. */ + foreach ($credit_items->line_items as $order_line) + { + + if ($order_line->qty_dispatched >0) + { + + // always deduct the credited/returned quantities from the sales order + dispatch_sales_order_item($order_no, $order_line->stock_id, -$order_line->qty_dispatched); + + //if (($_POST['credit_type']=="Return") OR ($_POST['ItemsAction']==1)) + /*{ + $sql = "UPDATE ".TB_PREF."sales_order_details + SET qty_invoiced = qty_invoiced - " . $order_line->qty_dispatched . " + WHERE order_no = " . $order_no . " + AND stk_code = '" . $order_line->stock_id . "'"; + $result = db_query($sql,"The sales order detail record could not be updated for the reduced quantity invoiced"); + }*/ + + /*Now update sales_order_details for the quantity invoiced and the actual dispatch dates. */ + + add_gl_trans_credit_order_item($credit_items, $order_line, $credit_no, + $default_dispatch_date, $tax_group_id, $credit_type, $invoice_no); + + add_gl_trans_credit_costs($credit_items, $order_line, $credit_no, $default_dispatch_date, + $tax_group_id, $credit_type, $write_off_gl_code, $branch_data); + + } /*quantity dispatched is more than 0 */ + } /*end of order_line loop */ + + add_g_trans_credit_common($credit_items, $credit_no, $default_dispatch_date, + $invoice_items_total, $charge_freight, $taxes, $tax_total, $branch_data); + + add_comments(11, $credit_no, $default_dispatch_date, $memo_); + + add_forms_for_sys_type(11, $credit_no); + + references::save_last($reference, 11); + + commit_transaction(); + + return $credit_no; +} + +//---------------------------------------------------------------------------------------- + +function add_gl_trans_credit_order_item(&$order, &$order_line, $credit_no, $date_, $tax_group_id, + $credit_type, $credited_invoice=0) +{ + $line_taxfree_price = $order_line->taxfree_price($tax_group_id); + $line_tax = $order_line->full_price() - $line_taxfree_price; + + if ($credit_type == "Return") + { + + /* Insert stock movements for the stock coming back in - with unit cost */ + + $reference = ""; + if ($credited_invoice) + $reference .= "Ex Inv: " . $credited_invoice; + + add_customer_trans_detail_item(11, $credit_no, $order_line->stock_id, + $order_line->item_description, $order->Location, $date_, + $order_line->qty_dispatched, $line_taxfree_price, $line_tax, + $order_line->discount_percent, $reference, $order_line->standard_cost); + + } + elseif ($credit_type == "WriteOff") + { + /*Insert a stock movement coming back in to show the credit note and + a reversing stock movement to show the write off + no mods to location stock records*/ + + $reference = ""; + if ($credited_invoice) + $reference .= "Ex Inv: " . $credited_invoice; + + add_customer_trans_detail_item_writeoff(11, $credit_no, $order_line->stock_id, + $order_line->item_description, $order->Location, $date_, + $order_line->qty_dispatched, $line_taxfree_price, $line_tax, + $order_line->discount_percent, $reference, $order_line->standard_cost); + } +} + +//---------------------------------------------------------------------------------------- + +function add_gl_trans_credit_costs($order, $order_line, $credit_no, $date_, $tax_group_id, + $credit_type, $write_off_gl_code, &$branch_data) +{ + $stock_gl_codes = get_stock_gl_code($order_line->stock_id); + + /* insert gl_trans to credit stock and debit cost of sales at standard cost*/ + if ($order_line->standard_cost != 0) + { + + /*first the cost of sales entry*/ + + add_gl_trans_std_cost(11, $credit_no, $date_, $stock_gl_codes["cogs_account"], + $stock_gl_codes["dimension_id"], $stock_gl_codes["dimension2_id"], "", + -($order_line->standard_cost * $order_line->qty_dispatched), + payment_person_types::customer(), $order->customer_id, + "The cost of sales GL posting could not be inserted"); + + /*now the stock entry*/ + if ($credit_type == "WriteOff") + { + $stock_entry_account = $write_off_gl_code; + } + else + { + $stock_gl_code = get_stock_gl_code($order_line->stock_id); + $stock_entry_account = $stock_gl_code["inventory_account"]; + } + + add_gl_trans_std_cost(11, $credit_no, $date_, $stock_entry_account, 0, 0, + "", ($order_line->standard_cost * $order_line->qty_dispatched), + payment_person_types::customer(), $order->customer_id, + "The stock side (or write off) of the cost of sales GL posting could not be inserted"); + + } /* end of if GL and stock integrated and standard cost !=0 */ + + if ($order_line->price != 0) + { + + $line_taxfree_price = $order_line->taxfree_price($tax_group_id); + $line_tax = $order_line->full_price() - $line_taxfree_price; + + //Post sales transaction to GL credit sales + + add_gl_trans_customer(11, $credit_no, $date_, $stock_gl_codes["sales_account"], 0, 0, + ($line_taxfree_price * $order_line->qty_dispatched), $order->customer_id, + "The credit note GL posting could not be inserted"); + + if ($order_line->discount_percent != 0) + { + + add_gl_trans_customer(11, $credit_no, $date_, $branch_data["sales_discount_account"], 0, 0, + -($line_taxfree_price * $order_line->qty_dispatched * $order_line->discount_percent), + $order->customer_id, + "The credit note discount GL posting could not be inserted"); + + } /*end of if discount !=0 */ + } /*end of if sales integrated with debtors */ +} + +//---------------------------------------------------------------------------------------- + +function add_g_trans_credit_common($order, $credit_no, $date_, + $credit_items_total, $freight, $taxes, $tax_total, &$branch_data) +{ + $company_data = get_company_prefs(); + + /*Post credit note transaction to GL credit debtors, + debit freight re-charged and debit sales */ + + if (($credit_items_total + $freight + $tax_total) != 0) + { + + add_gl_trans_customer(11, $credit_no, $date_, $branch_data["receivables_account"], 0, 0, + -($credit_items_total + $freight + $tax_total), $order->customer_id, + "The total debtor GL posting for the credit note could not be inserted"); + } + + if ($freight !=0) + { + add_gl_trans_customer(11, $credit_no, $date_, $company_data["freight_act"], 0, 0, + $freight, $order->customer_id, + "The freight GL posting for this credit note could not be inserted"); + } + + foreach ($taxes as $taxitem) + { + if ($taxitem['Value'] != 0) + { + + add_customer_trans_tax_detail_item(11, $credit_no, $taxitem['tax_type_id'], + $taxitem['rate'], $taxitem['included_in_price'], $taxitem['Value']); + + add_gl_trans_customer(11, $credit_no, $date_, $taxitem['sales_gl_code'], 0, 0, + $taxitem['Value'], $order->customer_id, + "A tax GL posting for this credit note could not be inserted"); + } + } +} + +//---------------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/sales/includes/db/sales_invoice_db.inc b/sales/includes/db/sales_invoice_db.inc new file mode 100644 index 00000000..617abd7f --- /dev/null +++ b/sales/includes/db/sales_invoice_db.inc @@ -0,0 +1,188 @@ +Branch); + + $invoice_items_total = $invoice->get_items_total_dispatch($tax_group_id); + + $tax_total = 0; + $taxes = $invoice->get_taxes($tax_group_id, $charge_shipping); + foreach ($taxes as $taxitem) + $tax_total += $taxitem['Value']; + + /*Now insert the debtor_trans */ + + $invoice_no = add_customer_trans(10, $invoice->customer_id, $invoice->Branch, $date_, + $reference, $invoice_items_total, 0, $tax_total, $charge_shipping, + $sales_type, $sales_order, $ship_via, $due_date); + + // If balance of the order cancelled update sales order details quantity. + foreach ($invoice->line_items as $order_line) + { + + if ($order_line->qty_dispatched != 0) + { + + $line_taxfree_price = $order_line->taxfree_price($tax_group_id); + $line_tax = $order_line->full_price() - $line_taxfree_price; + + // Now update sales_order_details for the quantity invoiced + dispatch_sales_order_item($sales_order, $order_line->stock_id, + $order_line->qty_dispatched); + + /* add invoice details and stock movements */ + $memo_ = ""; + + add_customer_trans_detail_item(10, $invoice_no, $order_line->stock_id, + $order_line->item_description, $location, $date_, + -$order_line->qty_dispatched, $line_taxfree_price, $line_tax, + $order_line->discount_percent, $memo_, $order_line->standard_cost); + + $stock_gl_code = get_stock_gl_code($order_line->stock_id); + + /* insert gl_trans to credit stock and debit cost of sales at standard cost*/ + if ($order_line->standard_cost != 0) + { + + /*first the cost of sales entry*/ + add_gl_trans_std_cost(10, $invoice_no, $date_, $stock_gl_code["cogs_account"], + $stock_gl_code["dimension_id"], $stock_gl_code["dimension2_id"], "", + $order_line->standard_cost * $order_line->qty_dispatched, + payment_person_types::customer(), $invoice->customer_id, + "The cost of sales GL posting could not be inserted"); + + /*now the stock entry*/ + //$stock_gl_code = get_stock_gl_code($order_line->stock_id); + + add_gl_trans_std_cost(10, $invoice_no, $date_, $stock_gl_code["inventory_account"], 0, 0, "", + (-$order_line->standard_cost * $order_line->qty_dispatched), + payment_person_types::customer(), $invoice->customer_id, + "The stock side of the cost of sales GL posting could not be inserted"); + + } /* end of if GL and stock integrated and standard cost !=0 */ + + if ($order_line->price != 0) + { + + //Post sales transaction to GL credit sales + + add_gl_trans_customer(10, $invoice_no, $date_, $stock_gl_code["sales_account"], + $stock_gl_code["dimension_id"], $stock_gl_code["dimension2_id"], + (-$line_taxfree_price * $order_line->qty_dispatched), + $invoice->customer_id, "The sales price GL posting could not be inserted"); + + if ($order_line->discount_percent != 0) + { + + add_gl_trans_customer(10, $invoice_no, $date_, + $branch_data["sales_discount_account"], $stock_gl_code["dimension_id"], + $stock_gl_code["dimension2_id"], + ($line_taxfree_price * $order_line->qty_dispatched * $order_line->discount_percent), + $invoice->customer_id, "The sales discount GL posting could not be inserted"); + } /*end of if discount !=0 */ + } /*end of if sales integrated with debtors */ + + } /*quantity dispatched is more than 0 */ + } /*end of order_line loop */ + + + if ($bo_policy == 0) + { + // if cancelling any remaining quantities + close_sales_order($sales_order); + } + + /*Post debtors transaction to GL debit debtors, credit freight re-charged and credit sales */ + if (($invoice_items_total + $charge_shipping + $tax_total) != 0) + { + + add_gl_trans_customer(10, $invoice_no, $date_, $branch_data["receivables_account"], 0, 0, + ($invoice_items_total + $charge_shipping + $tax_total), + $invoice->customer_id, "The total debtor GL posting could not be inserted"); + } + + if ($charge_shipping != 0) + { + + add_gl_trans_customer(10, $invoice_no, $date_, $company_data["freight_act"], 0, 0, + (-$charge_shipping), $invoice->customer_id, + "The freight GL posting could not be inserted"); + } + + foreach ($taxes as $taxitem) + { + if ($taxitem['Value'] != 0) + { + add_customer_trans_tax_detail_item(10, $invoice_no, $taxitem['tax_type_id'], + $taxitem['rate'], $taxitem['included_in_price'], $taxitem['Value']); + + add_gl_trans_customer(10, $invoice_no, $date_, $taxitem['sales_gl_code'], 0, 0, + (-$taxitem['Value']), $invoice->customer_id, + "A tax GL posting could not be inserted"); + } + } + + add_comments(10, $invoice_no, $date_, $memo_); + + add_forms_for_sys_type(10, $invoice_no, $location); + + references::save_last($reference, 10); + + commit_transaction(); + + return $invoice_no; +} + +//-------------------------------------------------------------------------------------------------- + +function void_sales_invoice($type, $type_no) +{ + begin_transaction(); + + void_bank_trans($type, $type_no, true); + void_gl_trans($type, $type_no, true); + + // for invoices and credits related to invoices, + // reverse all the changes in the sales order + $items_result = get_customer_trans_details($type, $type_no); + + $order = get_customer_trans_order($type, $type_no); + + if ($order) + { + while ($row = db_fetch($items_result)) + { + dispatch_sales_order_item($order, $row["stock_id"], $row["quantity"]); + } + } + + // clear details after they've been reversed in the sales order + void_customer_trans_details($type, $type_no); + + void_customer_trans_tax_details($type, $type_no); + + void_cust_allocations($type, $type_no); + + // do this last because other voidings can depend on it - especially voiding + // DO NOT MOVE THIS ABOVE VOIDING or we can end up with trans with alloc < 0 + void_customer_trans($type, $type_no); + + commit_transaction(); +} + +//-------------------------------------------------------------------------------------------------- + + + + + +?> \ No newline at end of file diff --git a/sales/includes/db/sales_order_db.inc b/sales/includes/db/sales_order_db.inc new file mode 100644 index 00000000..ee32a37f --- /dev/null +++ b/sales/includes/db/sales_order_db.inc @@ -0,0 +1,258 @@ +delivery_date); + + $sql = "INSERT INTO ".TB_PREF."sales_orders (debtor_no, branch_code, customer_ref, Comments, ord_date, + order_type, ship_via, deliver_to, delivery_address, contact_phone, + contact_email, freight_cost, from_stk_loc, delivery_date) + VALUES ('" . $order->customer_id . "', '" . $order->Branch . "', '". + $order->cust_ref ."','". db_escape($order->Comments) ."','" . + date2sql($order->orig_order_date) . "', '" . + $order->default_sales_type . "', " . + $_POST['ship_via'] .",'" . $order->deliver_to . "', '" . + $order->delivery_address . "', '" . + $order->phone . "', '" . $order->email . "', " . + $order->freight_cost .", '" . $order->Location ."', '" . + $del_date . "')"; + + db_query($sql, "order Cannot be Added"); + + $order_no = db_insert_id(); + + foreach ($order->line_items as $stock_item) + { + $sql = "INSERT INTO ".TB_PREF."sales_order_details (order_no, stk_code, description, unit_price, quantity, discount_percent) VALUES ("; + $sql .= $order_no . + ",'$stock_item->stock_id', '$stock_item->item_description', $stock_item->price, + $stock_item->quantity, + $stock_item->discount_percent)"; + db_query($sql, "order Details Cannot be Added"); + + } /* inserted line items into sales order details */ + + add_forms_for_sys_type(systypes::sales_order(), $order_no); + + commit_transaction(); + + return $order_no; +} + +//---------------------------------------------------------------------------------------- + +function delete_sales_order($order_no) +{ + begin_transaction(); + + $sql = "DELETE FROM ".TB_PREF."sales_orders WHERE order_no=" . $order_no; + db_query($sql, "order Header Delete"); + + $sql = "DELETE FROM ".TB_PREF."sales_order_details WHERE order_no =" . $order_no; + db_query($sql, "order Detail Delete"); + + delete_forms_for_systype(systypes::sales_order(), $order_no); + + commit_transaction(); +} + +//---------------------------------------------------------------------------------------- + +function update_sales_order($order_no, $order) +{ + $del_date = date2sql($order->delivery_date); + $ord_date = date2sql($order->orig_order_date); + + begin_transaction(); + + $sql = "UPDATE ".TB_PREF."sales_orders SET debtor_no = '" . $order->customer_id . "', + branch_code = '" . $order->Branch . "', + customer_ref = '". $order->cust_ref ."', + Comments = '". db_escape($order->Comments) ."', ord_date = '" . $ord_date . "', + order_type = '" . $order->default_sales_type . "', ship_via = " . $order->ship_via .", + deliver_to = '" . $order->deliver_to . "', delivery_address = '" . $order->delivery_address . "', + contact_phone = '" . $order->phone . "', + contact_email = '" . $order->email . "', freight_cost = " . $order->freight_cost .", + from_stk_loc = '" . $order->Location ."', delivery_date = '" . $del_date . "' + WHERE order_no=" . $order_no; + + db_query($sql, "order Cannot be Updated"); + + $sql = "DELETE FROM ".TB_PREF."sales_order_details WHERE order_no =" . $order_no; + + db_query($sql, "Old order Cannot be Deleted"); + + $sql = "INSERT INTO ".TB_PREF."sales_order_details (order_no, stk_code, description, unit_price, quantity, discount_percent, qty_invoiced) VALUES ("; + + foreach ($order->line_items as $stock_item) + { + + $sql .= $order_no . ",'" . $stock_item->stock_id . "','" . $stock_item->item_description . "', " . $stock_item->price . ", " . $stock_item->quantity . ", " . $stock_item->discount_percent . ", " . $stock_item->qty_inv . " )"; + + db_query($sql, "Old order Cannot be Inserted"); + + } /* inserted line items into sales order details */ + + commit_transaction(); +} + +//---------------------------------------------------------------------------------------- + +function get_sales_order($order_no) +{ + $sql = "SELECT ".TB_PREF."sales_orders.*, ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.curr_code, ".TB_PREF."locations.location_name, + ".TB_PREF."debtors_master.payment_terms, ".TB_PREF."debtors_master.discount, ".TB_PREF."sales_types.sales_type, ".TB_PREF."shippers.shipper_name, + ".TB_PREF."tax_groups.name AS tax_group_name , ".TB_PREF."tax_groups.id AS tax_group_id + FROM ".TB_PREF."sales_orders, ".TB_PREF."debtors_master, ".TB_PREF."sales_types, ".TB_PREF."tax_groups, ".TB_PREF."cust_branch, ".TB_PREF."locations, ".TB_PREF."shippers + WHERE ".TB_PREF."sales_orders.order_type=".TB_PREF."sales_types.id + AND ".TB_PREF."cust_branch.branch_code = ".TB_PREF."sales_orders.branch_code + AND ".TB_PREF."cust_branch.tax_group_id = ".TB_PREF."tax_groups.id + AND ".TB_PREF."sales_orders.debtor_no = ".TB_PREF."debtors_master.debtor_no + AND ".TB_PREF."locations.loc_code = ".TB_PREF."sales_orders.from_stk_loc + AND ".TB_PREF."shippers.shipper_id = ".TB_PREF."sales_orders.ship_via + AND ".TB_PREF."sales_orders.order_no = " . $order_no; + + $result = db_query($sql, "order Retreival"); + + $num = db_num_rows($result); + if ($num > 1) + { + display_db_error("FATAL : sales order query returned a duplicate - " . db_num_rows($result), $sql, true); + } + else if ($num == 1) + { + return db_fetch($result); + } + else + display_db_error("FATAL : sales order return nothing - " . db_num_rows($result), $sql, true); + +} + +//---------------------------------------------------------------------------------------- + +function read_sales_order($order_no, &$order, $skip_completed_items=false) +{ + $myrow = get_sales_order($order_no); + + $order->customer_id = $myrow["debtor_no"]; + $order->Branch = $myrow["branch_code"]; + $order->customer_name = $myrow["name"]; + $order->cust_ref = $myrow["customer_ref"]; + $order->default_sales_type =$myrow["order_type"]; + $order->sales_type_name =$myrow["sales_type"]; + $order->customer_currency = $myrow["curr_code"]; + $order->default_discount = $myrow["discount"]; + + $order->Comments = $myrow["comments"]; + + $order->ship_via = $myrow["ship_via"]; + $order->deliver_to = $myrow["deliver_to"]; + $order->delivery_date = sql2date($myrow["delivery_date"]); + $order->freight_cost = $myrow["freight_cost"]; + $order->delivery_address = $myrow["delivery_address"]; + $order->phone = $myrow["contact_phone"]; + $order->email = $myrow["contact_email"]; + $order->Location = $myrow["from_stk_loc"]; + $order->location_name = $myrow["location_name"]; + $order->orig_order_date = sql2date($myrow["ord_date"]); + + $order->tax_group_name = $myrow["tax_group_name"]; + $order->tax_group_id = $myrow["tax_group_id"]; + + $sql = "SELECT stk_code, unit_price, ".TB_PREF."sales_order_details.description, + ".TB_PREF."sales_order_details.quantity, discount_percent, + qty_invoiced, ".TB_PREF."stock_master.units, + ".TB_PREF."stock_master.material_cost + ".TB_PREF."stock_master.labour_cost + ".TB_PREF."stock_master.overhead_cost AS standard_cost + FROM ".TB_PREF."sales_order_details, ".TB_PREF."stock_master + WHERE ".TB_PREF."sales_order_details.stk_code = ".TB_PREF."stock_master.stock_id + AND order_no =" . $order_no; + + if ($skip_completed_items) + $sql .= " + AND ".TB_PREF."sales_order_details.quantity - ".TB_PREF."sales_order_details.qty_invoiced > 0 "; + + $result = db_query($sql, "Retreive order Line Items"); + + if (db_num_rows($result) > 0) + { + + while ($myrow = db_fetch($result)) + { + $order->add_to_cart($myrow["stk_code"],$myrow["quantity"], + $myrow["unit_price"], $myrow["discount_percent"], + $myrow["qty_invoiced"], $myrow["standard_cost"], $myrow["description"]); + } + } + + return true; +} + +//---------------------------------------------------------------------------------------- + +function sales_order_has_invoices($order_no) +{ + $sql = "SELECT COUNT(*) FROM ".TB_PREF."debtor_trans WHERE order_=$order_no"; + + $result = db_query($sql, "could not query for sales order usage"); + + $row = db_fetch_row($result); + + return ($row[0] > 0); +} + +//---------------------------------------------------------------------------------------- + +function close_sales_order($order_no) +{ + // set the quantity of each item to the already invoiced quantity. this will mark item as closed. + $sql = "UPDATE ".TB_PREF."sales_order_details + SET quantity = qty_invoiced + WHERE order_no = $order_no"; + + db_query($sql, "The sales order detail record could not be updated"); +} + +//---------------------------------------------------------------------------------------- + +function dispatch_sales_order_item($order_no, $stock_id, $qty_dispatched) +{ + $sql = "UPDATE ".TB_PREF."sales_order_details + SET qty_invoiced = qty_invoiced + $qty_dispatched "; + $sql .= " WHERE order_no = $order_no + AND stk_code = '$stock_id'"; + + db_query($sql, "The sales order detail record could not be updated"); +} + +//--------------------------------------------------------------------------------------------------------------- + +function get_invoice_duedate($debtorno, $invdate) +{ + if (!is_date($invdate)) + { + return Today(); + } + $disp = user_date_display(); + $sql = "SELECT ".TB_PREF."debtors_master.debtor_no, ".TB_PREF."debtors_master.payment_terms, ".TB_PREF."payment_terms.* FROM ".TB_PREF."debtors_master, + ".TB_PREF."payment_terms WHERE ".TB_PREF."debtors_master.payment_terms = ".TB_PREF."payment_terms.terms_indicator AND + ".TB_PREF."debtors_master.debtor_no = '$debtorno'"; + + $result = db_query($sql,"The customer details could not be retrieved"); + $myrow = db_fetch($result); + + if (db_num_rows($result) == 0) + return $invdate; + $date_array = explode_date_to_dmy($invdate); + if ($myrow['day_in_following_month'] > 0) + $duedate = date($disp, Mktime(0,0,0,$date_array[1]+1, $myrow['day_in_following_month'],$date_array[2])); + else + $duedate = date($disp, Mktime(0,0,0,$date_array[1],$date_array[0] + (int) $myrow['days_before_due'],$date_array[2])); + return $duedate; +} + + +?> \ No newline at end of file diff --git a/sales/includes/db/sales_types_db.inc b/sales/includes/db/sales_types_db.inc new file mode 100644 index 00000000..96acf4fb --- /dev/null +++ b/sales/includes/db/sales_types_db.inc @@ -0,0 +1,52 @@ + \ No newline at end of file diff --git a/sales/includes/index.php b/sales/includes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/includes/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/includes/sales_db.inc b/sales/includes/sales_db.inc new file mode 100644 index 00000000..1bd5842f --- /dev/null +++ b/sales/includes/sales_db.inc @@ -0,0 +1,79 @@ + \ No newline at end of file diff --git a/sales/includes/sales_ui.inc b/sales/includes/sales_ui.inc new file mode 100644 index 00000000..a8abacab --- /dev/null +++ b/sales/includes/sales_ui.inc @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/sales/includes/ui/sales_credit_ui.inc b/sales/includes/ui/sales_credit_ui.inc new file mode 100644 index 00000000..555a9b3f --- /dev/null +++ b/sales/includes/ui/sales_credit_ui.inc @@ -0,0 +1,256 @@ +"; // outer table + echo ""; + + $customer_error = ""; + + if (!isset($_POST['customer_id']) && (get_global_customer() != reserved_words::get_all())) + $_POST['customer_id'] = get_global_customer(); + + customer_list_row(_("Customer:"), 'customer_id', null, false, true); + + if ($order->customer_id != $_POST['customer_id']) + { + // customer has changed + + // delete all the order items - drastic but necessary because of + // change of currency, sales type, etc + $order->clear_items(); + + // clear the branch selection + unset($_POST['branch_id']); + } + + customer_branches_list_row(_("Branch:"), $_POST['customer_id'], 'branch_id', null, false, true, true); + + //if (($_SESSION['Items']->order_no == 0) || + // ($order->customer_id != $_POST['customer_id']) || + // ($order->Branch != $_POST['branch_id'])) + // $customer_error = get_customer_details_to_order($order, $_POST['customer_id'], $_POST['branch_id']); + if (($order->customer_id != $_POST['customer_id']) || + ($order->Branch != $_POST['branch_id'])) + $customer_error = get_customer_details_to_order($order, $_POST['customer_id'], $_POST['branch_id']); + + set_global_customer($_POST['customer_id']); + + if (!isset($_POST['ref'])) + $_POST['ref'] = references::get_next(11); + + ref_row(_("Reference:"), 'ref'); + + echo "
"; + + echo ""; // outer table + + if (!is_company_currency($order->customer_currency)) + { + echo ""; + label_row(_("Customer Currency:"), $order->customer_currency); + exchange_rate_display($order->customer_currency, get_company_currency(), + $_POST['OrderDate'], true); + echo "
"; + echo ""; // outer table + } + + echo ""; + + if (!isset($_POST['sales_type_id'])) + $_POST['sales_type_id'] = $order->default_sales_type; + sales_types_list_row(_("Sales Type"), 'sales_type_id', $_POST['sales_type_id']); + + label_row(_("Customer Discount:"), ($order->default_discount * 100) . "%"); + echo "
"; + + echo ""; // outer table + + echo ""; + + if (!isset($_POST['OrderDate']) || $_POST['OrderDate'] == "") + $_POST['OrderDate'] = $order->orig_order_date; + + date_row(_("Date:"), 'OrderDate'); + + if (!isset($_POST['tax_group_id']) || $_POST['tax_group_id'] == "") + $_POST['tax_group_id'] = $order->tax_group_id; + tax_groups_list_row(_("Tax Group:"), 'tax_group_id', null, true); + + echo "
"; + + echo ""; + + end_table(1); // outer table + + return $customer_error; +} + +//--------------------------------------------------------------------------------- + +function display_credit_items($title, &$order) +{ + global $table_style, $path_to_root; + + display_heading($title); + start_table("$table_style width=90%"); + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), _("Unit"), + _("Price"), _("Discount %"), _("Total")); + table_header($th); + + $subtotal = 0; + $k = 0; //row colour counter + + foreach ($order->line_items as $stock_item) + { + + $line_total = $stock_item->quantity * $stock_item->price * (1 - $stock_item->discount_percent); + + if (!isset($_GET['Edit']) || $_GET['Edit'] != $stock_item->stock_id) + { + alt_table_row_color($k); + + label_cell("$stock_item->stock_id"); + label_cell($stock_item->item_description); + qty_cell($stock_item->quantity); + label_cell($stock_item->units); + amount_cell($stock_item->price); + + amount_cell($stock_item->discount_percent * 100); + amount_cell($line_total); + + edit_link_cell(SID . "Edit=$stock_item->stock_id"); + delete_link_cell(SID . "Delete=$stock_item->stock_id"); + + //labelt_cell(get_tax_free_price_for_item($stock_item->stock_id, $line_total, $_POST['tax_group_id'])); + + end_row(); + } + else + { + credit_edit_item_controls($order, $stock_item->stock_id); + } + + $subtotal += $line_total; + } + + if (!isset($_GET['Edit'])) + credit_edit_item_controls($order); + + $display_sub_total = number_format2($subtotal,user_price_dec()); + label_row(_("Sub-total"), $display_sub_total, "colspan=6 align=right", "align=right"); + + if (!isset($_POST['ChargeFreightCost']) OR ($_POST['ChargeFreightCost'] == "")) + $_POST['ChargeFreightCost'] = 0; + + text_row(_("Shipping"), 'ChargeFreightCost', $_POST['ChargeFreightCost'], 8, 8, "colspan=6 align=right"); + + $taxes = $order->get_taxes($_POST['tax_group_id'], $_POST['ChargeFreightCost']); + + $tax_total = display_edit_tax_items($taxes, 6); + + $display_total = number_format2(($subtotal + $_POST['ChargeFreightCost'] + $tax_total), user_price_dec()); + label_row(_("Credit Note Total"), $display_total, "colspan=6 align=right","align=right"); + + end_table(); +} + +//--------------------------------------------------------------------------------- + +function credit_edit_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) and $stock_id!=null) + { + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$stock_id]->stock_id; + if (!isset($_POST['qty']) OR ($_POST['qty']=="")) + $_POST['qty'] = $order->line_items[$stock_id]->quantity; + if (!isset($_POST['price']) OR ($_POST['price']=="")) + $_POST['price'] = $order->line_items[$stock_id]->price; + if (!isset($_POST['Disc']) OR ($_POST['Disc']=="")) + $_POST['Disc'] = ($order->line_items[$stock_id]->discount_percent)*100; + + $_POST['units'] = $order->line_items[$stock_id]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$stock_id]->item_description); + } + else + { + echo ""; + stock_items_list('stock_id', null, false, true); + echo ""; + + $item_info = get_item_edit_info($_POST['stock_id']); + + $_POST['units'] = $item_info["units"]; + + $_POST['qty'] = 0; + $_POST['price'] = get_price($_POST['stock_id'], $order->customer_id); + // default to the customer's discount % + $_POST['Disc'] = $order->default_discount * 100; + } + + + text_cells(null, 'qty', $_POST['qty'], 13, 15); + label_cell($_POST['units']); + text_cells(null, 'price', null, 13, 15); + text_cells(null, 'Disc', $_POST['Disc'], 7, 5); + amount_cell($_POST['qty'] * $_POST['price'] * (1 - $_POST['Disc']/100)); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add Item"), "colspan=2"); + } + + end_row(); +} + + +//--------------------------------------------------------------------------------- + +function credit_options_controls() +{ + global $table_style2; + echo "
"; + start_table("$table_style2"); + + credit_type_list_row(_("Credit Note Type"), 'CreditType', null, true); + + if ($_POST['CreditType'] == "Return") + { + + /*if the credit note is a return of goods then need to know which location to receive them into */ + if (!isset($_POST['Location'])) + $_POST['Location'] = $_SESSION['credit_items']->Location; + locations_list_row(_("Items Returned to Location"), 'Location', $_POST['Location']); + + } + else + { + /* the goods are to be written off to somewhere */ + gl_all_accounts_list_row(_("Write off the cost of the items to"), 'WriteOffGLCode', null); + } + + textarea_row(_("Memo"), "CreditText", null, 51, 3); + echo ""; +} + + +//--------------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/sales/includes/ui/sales_order_ui.inc b/sales/includes/ui/sales_order_ui.inc new file mode 100644 index 00000000..8c6e0d53 --- /dev/null +++ b/sales/includes/ui/sales_order_ui.inc @@ -0,0 +1,386 @@ +line_items AS $order_item) + { + if (strcasecmp($order_item->stock_id, $new_item) == 0) + { + $already_on_order = 1; + display_error(_("For Part :") . $new_item . " " . "This item is already on this order. You can change the quantity ordered of the existing line if necessary."); + } + } + + + if ($already_on_order != 1) + { + $order->add_to_cart ($new_item, $new_item_qty, $price, $discount); + } /* end of if not already on the order */ +} + +//--------------------------------------------------------------------------------- + +function get_customer_details_to_order(&$order, $customer_id, $branch_id) +{ + $ret_error = ""; + // Now check to ensure this account is not on hold */ + $sql = "SELECT ".TB_PREF."debtors_master.name, ".TB_PREF."debtors_master.address, ".TB_PREF."credit_status.dissallow_invoices, + ".TB_PREF."debtors_master.sales_type AS salestype, ".TB_PREF."sales_types.sales_type, ".TB_PREF."debtors_master.curr_code, + ".TB_PREF."debtors_master.discount + FROM ".TB_PREF."debtors_master, ".TB_PREF."credit_status, ".TB_PREF."sales_types + WHERE ".TB_PREF."debtors_master.sales_type=".TB_PREF."sales_types.id + AND ".TB_PREF."debtors_master.credit_status=".TB_PREF."credit_status.id + AND ".TB_PREF."debtors_master.debtor_no = '" . $customer_id . "'"; + + $result =db_query($sql,"Customer Record Retreive"); + + $myrow = db_fetch($result); + + $order->customer_id = $customer_id; + $order->Branch = $branch_id; + $order->customer_name = $myrow['name']; + + if ($myrow['dissallow_invoices'] == 1) + $ret_error = _("The selected customer account is currently on hold. Please contact the credit control personnel to discuss."); + + if (!isset($_POST['branch_id']) || $_POST['branch_id'] == "") + { + $ret_error = _("The selected customer does not have any branches. Please create at least one branch."); + unset($_POST['branch_id']); + $order->Branch = ""; + } + + # the sales type determines the price list to be used by default + $order->default_sales_type = $myrow['salestype']; + $order->sales_type_name = $myrow['sales_type']; + $order->customer_currency = $myrow['curr_code']; + $order->default_discount = $myrow['discount']; + $deliver = $myrow['address']; // in case no deliveraddress. + + if ($order->Branch != "") + { + # the branch was also selected from the customer selection so default the delivery details from the customer branches table cust_branch. The order process will ask for branch details later anyway + $sql = "SELECT ".TB_PREF."cust_branch.br_name, ".TB_PREF."cust_branch.br_post_address, phone, email, + default_location, default_ship_via, + ".TB_PREF."tax_groups.name AS tax_group_name, ".TB_PREF."tax_groups.id AS tax_group_id + FROM ".TB_PREF."cust_branch, ".TB_PREF."tax_groups + WHERE ".TB_PREF."cust_branch.tax_group_id = ".TB_PREF."tax_groups.id + AND ".TB_PREF."cust_branch.branch_code='" . $order->Branch . "' + AND ".TB_PREF."cust_branch.debtor_no = '" . $order->customer_id . "'"; + + $result = db_query($sql,"Customer Branch Record Retreive"); + + if (db_num_rows($result) == 0) + { + return _("The selected customer and branch are not valid, or the customer does not have any branches."); + } + + $myrow = db_fetch($result); + $order->deliver_to = $myrow["br_name"]; + $order->delivery_address = $myrow["br_post_address"]; + if (strlen($order->delivery_address) <= 1) + $order->delivery_address = $deliver; + $order->phone = $myrow["phone"]; + $order->email = $myrow["email"]; + $order->Location = $myrow["default_location"]; + $order->ship_via = $myrow["default_ship_via"]; + $order->tax_group_name = $myrow["tax_group_name"]; + $order->tax_group_id = $myrow["tax_group_id"]; + } + + return $ret_error; +} + +//--------------------------------------------------------------------------------- + +function display_order_summary($title, &$order, $editable_items=false) +{ + global $table_style, $path_to_root; + + display_heading($title); + start_table("$table_style colspan=7 width=90%"); + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Price"), _("Discount %"), _("Total"), "", ""); + table_header($th); + + $total = 0; + $k = 0; //row colour counter + + foreach ($order->line_items as $stock_item) + { + + $line_total = $stock_item->quantity * $stock_item->price * (1 - $stock_item->discount_percent); + + if (!isset($_GET['Edit'])) + $id = ""; + else + $id = $_GET['Edit']; + if (!$editable_items || $id != $stock_item->stock_id) + { + alt_table_row_color($k); + + view_stock_status_cell($stock_item->stock_id); + + label_cell($stock_item->item_description); + qty_cell($stock_item->quantity); + label_cell($stock_item->units); + amount_cell($stock_item->price); + + amount_cell($stock_item->discount_percent * 100); + amount_cell($line_total); + + if ($editable_items) + { + edit_link_cell(SID . "Edit=$stock_item->stock_id"); + delete_link_cell(SID . "Delete=$stock_item->stock_id"); + } + end_row(); + } + else + { + sales_order_item_controls($order, $stock_item->stock_id); + } + + $total += $line_total; + } + + if (!isset($_GET['Edit']) && $editable_items) + sales_order_item_controls($order); + + $display_total = number_format2($total,user_price_dec()); + label_row(_("Total Excluding Tax/Shipping"), $display_total, "colspan=6 align=right", + "nowrap align=right"); + + end_table(); +} + +// ------------------------------------------------------------------------------ + +function display_order_header(&$order, $editable, $date_text, $display_tax_group=false) +{ + global $table_style; + start_table("width=80% $table_style"); + echo ""; // outer table + echo ""; + + $customer_error = ""; + + if (isset($order) && !$editable) + { + // can't change the customer/branch if items already received on this order + echo $order->customer_name . " - " . $order->deliver_to; + } + else + { + + if (!isset($_POST['customer_id']) && (get_global_customer() != reserved_words::get_all())) + $_POST['customer_id'] = get_global_customer(); + + customer_list_row(_("Customer:"), 'customer_id', null, false, true); + + if (!isset($_POST['delivery_date'])) + { + if ($order->direct_invoice) + $_POST['delivery_date'] = $_SESSION['Items']->delivery_date = + get_invoice_duedate($_POST['customer_id'], $_POST['OrderDate']); + else + $_POST['delivery_date'] = $_SESSION['Items']->delivery_date = + add_days($_POST['OrderDate'], 10); + } + if ($order->customer_id != $_POST['customer_id']) + { + // customer has changed + + // delete all the order items - drastic but necessary because of + // change of currency, sales type, etc + $order->clear_items(); + + // clear the branch selection + unset($_POST['branch_id']); + } + + customer_branches_list_row(_("Branch:"), $_POST['customer_id'], 'branch_id', null, false, true, true); + + if (!isset($_POST['branch_id'])) + $_POST['branch_id'] = ""; + //set_global_customer($_POST['customer_id']); + if (($order->customer_id != $_POST['customer_id']) || + ($order->Branch != $_POST['branch_id'])) + $customer_error = get_customer_details_to_order($order, $_POST['customer_id'], $_POST['branch_id']); + + set_global_customer($_POST['customer_id']); + } + echo "
"; + + echo ""; // outer table + + if (!is_company_currency($order->customer_currency)) + { + echo ""; + label_row(_("Customer Currency:"), $order->customer_currency); + exchange_rate_display($order->customer_currency, get_company_currency(), + ($editable?$_POST['OrderDate']:$order->orig_order_date), $editable); + echo "
"; + echo ""; // outer table + } + + echo ""; + label_row(_("Sales Type:"), $order->sales_type_name); + label_row(_("Customer Discount:"), ($order->default_discount * 100) . "%"); + echo "
"; + + echo ""; // outer table + + echo ""; + + if ($editable) + { + if (!isset($_POST['OrderDate']) || $_POST['OrderDate'] == "") + $_POST['OrderDate'] = $order->orig_order_date; + + date_row($date_text, 'OrderDate'); + } + else + { + label_row($date_text, $order->orig_order_date); + hidden('OrderDate', $order->orig_order_date); + } + + if ($display_tax_group) + { + if ($editable) + { + if (!isset($_POST['tax_group_id'])) + $_POST['tax_group_id'] = $_SESSION['Items']->tax_group_id; + tax_groups_list_row(_("Tax Group:"), 'tax_group_id', $_POST['tax_group_id'], true); + } + else + { + label_row(_("Tax Group:"), $order->tax_group_name); + hidden('tax_group_id', $_SESSION['Items']->tax_group_id); + } + } + echo "
"; + + echo ""; + + end_table(1); // outer table + + return $customer_error; +} + +//-------------------------------------------------------------------------------- + +function sales_order_item_controls(&$order, $stock_id=null) +{ + start_row(); + + if (isset($_GET['Edit']) && $stock_id != null) + { + if (!isset($_POST['stock_id'])) + $_POST['stock_id'] = $order->line_items[$_GET['Edit']]->stock_id; + if (!isset($_POST['qty']) || ($_POST['qty'] == "")) + $_POST['qty'] = $order->line_items[$_GET['Edit']]->quantity; + if (!isset($_POST['price']) || ($_POST['price'] == "")) + $_POST['price'] = $order->line_items[$_GET['Edit']]->price; + if (!isset($_POST['Disc']) || ($_POST['Disc'] == "")) + $_POST['Disc'] = ($order->line_items[$_GET['Edit']]->discount_percent)*100; + + $_POST['units'] = $order->line_items[$_GET['Edit']]->units; + + hidden('stock_id', $_POST['stock_id']); + label_cell($_POST['stock_id']); + label_cell($order->line_items[$stock_id]->item_description); + } + else + { + text_cells(null, "StockID2", "", 12, 10, "", "", "onkeyup='recalcAccounts();' onKeyDown='if(event.keyCode==13) event.keyCode=9;' onblur='return setAccount(0, true);'"); + stock_items_list_cells(null, 'stock_id', null, false, false, "onchange='return setAccount(1, true)'"); + $item_info = get_item_edit_info($_POST['stock_id']); + $_POST['units'] = $item_info["units"]; + + $_POST['qty'] = 1; + $_POST['price'] = get_price ($_POST['stock_id'], $order->customer_id); + // default to the customer's discount % + $_POST['Disc'] = $order->default_discount * 100; + } + + text_cells(null, 'qty', $_POST['qty'], 12, 15); + + label_cell($_POST['units']); + amount_cells(null, 'price'); + text_cells(null, 'Disc', $_POST['Disc'], 7, 5); + + $line_total = $_POST['qty'] * $_POST['price'] * (1 - $_POST['Disc'] / 100); + amount_cell($line_total); + + if (isset($_GET['Edit'])) + { + submit_cells('UpdateItem', _("Update")); + submit_cells('CancelItemChanges', _("Cancel")); + } + else + { + submit_cells('AddItem', _("Add Item"), "colspan=2"); + } + + end_row(); +} + +//-------------------------------------------------------------------------------- + +function display_delivery_details(&$order) +{ + global $table_style2; + + if ($order->direct_invoice) + { + $title = _("Invoice Delivery Details"); + } + else + { + $title = _("Order Delivery Details"); + } + display_heading($title); + echo "
"; + start_table("$table_style2 width=90%"); + echo ""; // outer table + + echo ""; + locations_list_row(_("Deliver from Location:"), 'Location', $order->Location); + + text_row(_("Required Delivery Date:"), 'delivery_date', $order->delivery_date, 14, 14); + + text_row(_("Deliver To:"), 'deliver_to', $order->deliver_to, 40, 40); + + textarea_row(_("Address:"), 'delivery_address', $order->delivery_address, 35, 5); + text_row(_("Contact Phone Number:"), 'phone', $order->phone, 25, 25); + + echo "
"; + + echo ""; // outer table + + echo ""; + + text_row(_("Customer Reference:"), 'cust_ref', $order->cust_ref, 25, 25); + textarea_row(_("Comments:"), "Comments", $order->Comments, 31, 5); + + text_row(_("Shipping Charge:"), 'freight_cost', $order->freight_cost, 10, 10); + + shippers_list_row(_("Shipping Company:"), 'ship_via', $order->ship_via); + if ($_SESSION['Items']->direct_invoice) + textarea_row(_("Memo"), 'InvoiceText', null, 31, 3); + echo "
"; + + echo ""; + end_table(1); // outer table +} + +?> \ No newline at end of file diff --git a/sales/index.php b/sales/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/inquiry/customer_allocation_inquiry.php b/sales/inquiry/customer_allocation_inquiry.php new file mode 100644 index 00000000..67c366a0 --- /dev/null +++ b/sales/inquiry/customer_allocation_inquiry.php @@ -0,0 +1,211 @@ += '$data_after' + AND ".TB_PREF."debtor_trans.tran_date <= '$date_to'"; + + if ($_POST['customer_id'] != reserved_words::get_all()) + $sql .= " AND ".TB_PREF."debtor_trans.debtor_no = '" . $_POST['customer_id'] . "'"; + + if (isset($_POST['filterType']) && $_POST['filterType'] != reserved_words::get_all()) + { + if ($_POST['filterType'] == '1' || $_POST['filterType'] == '2') + { + $sql .= " AND ".TB_PREF."debtor_trans.type = 10 "; + } + elseif ($_POST['filterType'] == '3') + { + $sql .= " AND ".TB_PREF."debtor_trans.type = " . systypes::cust_payment(); + } + elseif ($_POST['filterType'] == '4') + { + $sql .= " AND ".TB_PREF."debtor_trans.type = 11 "; + } + + if ($_POST['filterType'] == '2') + { + $today = date2sql(Today()); + $sql .= " AND ".TB_PREF."debtor_trans.due_date < '$today' + AND (round(abs(".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount) - ".TB_PREF."debtor_trans.alloc,6) > 0) "; + } + } + + if (!check_value('showSettled')) + { + $sql .= " AND (round(abs(".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount) - ".TB_PREF."debtor_trans.alloc,6) != 0) "; + } + + $sql .= " ORDER BY ".TB_PREF."debtor_trans.tran_date"; + + return db_query($sql,"No transactions were returned"); +} + +//------------------------------------------------------------------------------------------------ + +$result = get_transactions(); + +if (db_num_rows($result) == 0) +{ + display_note(_("The selected customer has no transactions for the given dates."), 1, 1); + end_page(); + exit; +} + +//------------------------------------------------------------------------------------------------ + +start_table("$table_style width='80%'"); + +if ($_POST['customer_id'] == reserved_words::get_all()) + $th = array(_("Type"), _("Number"), _("Reference"), _("Order"), _("Date"), _("Due Date"), + _("Customer"), _("Currency"), _("Debit"), _("Credit"), _("Allocated"), _("Balance"), ""); +else + $th = array(_("Type"), _("Number"), _("Reference"), _("Order"), _("Date"), _("Due Date"), + _("Debit"), _("Credit"), _("Allocated"), _("Balance"), ""); + +table_header($th); + + +$j = 1; +$k = 0; //row colour counter +$over_due = false; +while ($myrow = db_fetch($result)) +{ + + if ($myrow['OverDue'] == 1 && (abs($myrow["TotalAmount"]) - $myrow["Allocated"] != 0)) + { + start_row("class='overduebg'"); + $over_due = true; + } + else + alt_table_row_color($k); + + $date = sql2date($myrow["tran_date"]); + + if ($myrow["order_"] > 0) + $preview_order_str = get_customer_trans_view_str(systypes::sales_order(), $myrow["order_"]); + else + $preview_order_str = ""; + + $allocations_str = ""; + + $allocations = "" . _("Allocation") . ""; + + $due_date_str = ""; + + if ($myrow["type"] == 10) + $due_date_str = sql2date($myrow["due_date"]); + elseif ($myrow["type"] == 11 && $myrow['TotalAmount'] < 0) + { + /*its a credit note which could have an allocation */ + $allocations_str = $allocations; + + } + elseif ($myrow["type"] == systypes::cust_payment() && + ($myrow['TotalAmount'] + $myrow['Allocated']) < 0) + { + /*its a receipt which could have an allocation*/ + $allocations_str = $allocations; + + } + elseif ($myrow["type"] == systypes::cust_payment() && $myrow['TotalAmount'] > 0) + { + /*its a negative receipt */ + } + + label_cell(systypes::name($myrow["type"])); + + label_cell(get_customer_trans_view_str($myrow["type"], $myrow["trans_no"])); + label_cell($myrow["reference"]); + label_cell($preview_order_str); + label_cell(sql2date($myrow["tran_date"]), "nowrap"); + label_cell($due_date_str, "nowrap"); + if ($_POST['customer_id'] == reserved_words::get_all()) + { + label_cell($myrow["CustName"]); + label_cell($myrow["CustCurrCode"]); + } + display_debit_or_credit_cells($myrow["TotalAmount"]); + amount_cell(abs($myrow["Allocated"])); + amount_cell(abs($myrow["TotalAmount"]) - $myrow["Allocated"]); + label_cell($allocations_str); + + + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +end_table(1); +if ($over_due) + display_note(_("Marked items are overdue."), 0, 1, "class='overduefg'"); + +end_page(); + +?> diff --git a/sales/inquiry/customer_inquiry.php b/sales/inquiry/customer_inquiry.php new file mode 100644 index 00000000..89200826 --- /dev/null +++ b/sales/inquiry/customer_inquiry.php @@ -0,0 +1,254 @@ +" . _("CUSTOMER ACCOUNT IS ON HOLD") . "
"; + } + + $nowdue = "1-" . $past1 . " " . _('Days'); + $pastdue1 = $past1 + 1 . "-" . $past2 . " " . _('Days'); + $pastdue2 = _('Over') . " " . $past2 . " " . _('Days'); + + start_table("width=80% $table_style"); + $th = array(_("Currency"), _("Terms"), _("Current"), $nowdue, + $pastdue1, $pastdue2, _("Total Balance")); + table_header($th); + + start_row(); + label_cell($customer_record["curr_code"]); + label_cell($customer_record["terms"]); + amount_cell($customer_record["Balance"] - $customer_record["Due"]); + amount_cell($customer_record["Due"] - $customer_record["Overdue1"]); + amount_cell($customer_record["Overdue1"] - $customer_record["Overdue2"]); + amount_cell($customer_record["Overdue2"]); + amount_cell($customer_record["Balance"]); + end_row(); + + end_table();; +} + +//------------------------------------------------------------------------------------------------ + +function get_transactions() +{ + $date_after = date2sql($_POST['TransAfterDate']); + $date_to = date2sql($_POST['TransToDate']); + + $sql = "SELECT ".TB_PREF."debtor_trans.*, + ".TB_PREF."debtors_master.name AS CustName, ".TB_PREF."debtors_master.curr_code AS CustCurrCode, + (".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount) + AS TotalAmount, ".TB_PREF."debtor_trans.alloc AS Allocated, + ((".TB_PREF."debtor_trans.type = 10) + AND ".TB_PREF."debtor_trans.due_date < '" . date2sql(Today()) . "') AS OverDue + FROM ".TB_PREF."debtor_trans, ".TB_PREF."debtors_master + WHERE ".TB_PREF."debtors_master.debtor_no = ".TB_PREF."debtor_trans.debtor_no + AND ".TB_PREF."debtor_trans.tran_date >= '$date_after' + AND ".TB_PREF."debtor_trans.tran_date <= '$date_to'"; + + if ($_POST['customer_id'] != reserved_words::get_all()) + $sql .= " AND ".TB_PREF."debtor_trans.debtor_no = '" . $_POST['customer_id'] . "'"; + + if ($_POST['filterType'] != reserved_words::get_all()) + { + if ($_POST['filterType'] == '1') + { + $sql .= " AND (".TB_PREF."debtor_trans.type = 10 OR ".TB_PREF."debtor_trans.type = 1) "; + } + elseif ($_POST['filterType'] == '2') + { + $sql .= " AND (".TB_PREF."debtor_trans.type = 10) "; + } + elseif ($_POST['filterType'] == '3') + { + $sql .= " AND (".TB_PREF."debtor_trans.type = " . systypes::cust_payment() . " OR ".TB_PREF."debtor_trans.type = 2) "; + } + elseif ($_POST['filterType'] == '4') + { + $sql .= " AND ".TB_PREF."debtor_trans.type = 11 "; + } + + if ($_POST['filterType'] == '2') + { + $today = date2sql(Today()); + $sql .= " AND ".TB_PREF."debtor_trans.due_date < '$today' + AND (".TB_PREF."debtor_trans.ov_amount + ".TB_PREF."debtor_trans.ov_gst + ".TB_PREF."debtor_trans.ov_freight + ".TB_PREF."debtor_trans.ov_discount - ".TB_PREF."debtor_trans.alloc > 0) "; + } + } + + $sql .= " ORDER BY ".TB_PREF."debtor_trans.tran_date"; + + return db_query($sql,"No transactions were returned"); +} + +//------------------------------------------------------------------------------------------------ + +if (($_POST['customer_id'] != "") && ($_POST['customer_id'] != reserved_words::get_all())) +{ + $customer_record = get_customer_details($_POST['customer_id']); + display_customer_summary($customer_record); + echo "
"; +} + +//------------------------------------------------------------------------------------------------ + +$result = get_transactions(); + +if (db_num_rows($result) == 0) +{ + display_note(_("The selected customer has no transactions for the given dates."), 0, 2); + end_page(); + exit; +} + +//------------------------------------------------------------------------------------------------ + +start_table("$table_style width='80%'"); + +if ($_POST['customer_id'] == reserved_words::get_all()) + $th = array(_("Type"), _("#"), _("Order"), _("Reference"), _("Date"), _("Due Date"), + _("Customer"), _("Branch"), _("Currency"), _("Debit"), _("Credit"), "", ""); +else + $th = array(_("Type"), _("#"), _("Order"), _("Reference"), _("Date"), _("Due Date"), + _("Branch"), _("Debit"), _("Credit"), "", ""); +table_header($th); + + +$j = 1; +$k = 0; //row colour counter +$over_due = false; +while ($myrow = db_fetch($result)) +{ + + if ($myrow['OverDue'] == 1) + { + start_row("class='overduebg'"); + $over_due = true; + } + else + alt_table_row_color($k); + + $date = sql2date($myrow["tran_date"]); + + if ($myrow["order_"] > 0) + $preview_order_str = get_customer_trans_view_str(systypes::sales_order(), $myrow["order_"]); + else + $preview_order_str = ""; + + $gl_trans_str = get_gl_view_str_cell($myrow["type"], $myrow["trans_no"]); + + $credit_me_str = ""; + + $credit_invoice_str = "" . _("Credit This") . ""; + + $due_date_str = ""; + + if ($myrow["type"] == 10) + $due_date_str = sql2date($myrow["due_date"]); + + if ($myrow["type"] == 10) + { + /*Show a link to allow an invoice to be credited */ + // only allow crediting if it's not been totally allocated + if ($myrow["TotalAmount"] - $myrow["Allocated"] > 0) + $credit_me_str = $credit_invoice_str; + } + + $branch_name = ""; + if ($myrow["branch_code"] > 0) + { + $branch_name = get_branch_name($myrow["branch_code"]); + } + + $preview_trans_str = get_trans_view_str($myrow["type"], $myrow["trans_no"]); + + label_cell(systypes::name($myrow["type"])); + + label_cell($preview_trans_str); + label_cell($preview_order_str); + label_cell($myrow["reference"]); + label_cell($date, "nowrap"); + label_cell($due_date_str, "nowrap"); + if ($_POST['customer_id'] == reserved_words::get_all()) + label_cell($myrow["CustName"]); + label_cell($branch_name); + if ($_POST['customer_id'] == reserved_words::get_all()) + label_cell($myrow["CustCurrCode"]); + display_debit_or_credit_cells($myrow["TotalAmount"]); + echo $gl_trans_str; + if ($credit_me_str != "") + label_cell($credit_me_str, "nowrap"); + + + end_row(); + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } +//end of page full new headings if +} +//end of while loop + +end_table(1); + +if ($over_due) + display_note(_("Marked items are overdue."), 0, 1, "class='overduefg'"); + +end_page(); + +?> diff --git a/sales/inquiry/index.php b/sales/inquiry/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/inquiry/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/inquiry/sales_orders_view.php b/sales/inquiry/sales_orders_view.php new file mode 100644 index 00000000..81f1ebae --- /dev/null +++ b/sales/inquiry/sales_orders_view.php @@ -0,0 +1,195 @@ += '$date_after'"; + $sql .= " AND ".TB_PREF."sales_orders.ord_date <= '$date_before'"; + + if ($selected_customer != -1) + $sql .= " AND ".TB_PREF."sales_orders.debtor_no='" . $selected_customer . "'"; + + if (isset($selected_stock_item)) + $sql .= " AND ".TB_PREF."sales_order_details.stk_code='". $selected_stock_item ."'"; + + if (isset($_POST['StockLocation']) && $_POST['StockLocation'] != reserved_words::get_all()) + $sql .= " AND ".TB_PREF."sales_orders.from_stk_loc = '". $_POST['StockLocation'] . "' "; + + if ($_POST['OutstandingOnly'] == true) + $sql .= " AND ".TB_PREF."sales_order_details.qty_invoiced < ".TB_PREF."sales_order_details.quantity"; + + $sql .= " GROUP BY ".TB_PREF."sales_orders.order_no, ".TB_PREF."sales_orders.debtor_no, ".TB_PREF."sales_orders.branch_code, + ".TB_PREF."sales_orders.customer_ref, ".TB_PREF."sales_orders.ord_date, ".TB_PREF."sales_orders.deliver_to"; + +} //end not order number selected + +$result = db_query($sql,"No orders were returned"); + +//----------------------------------------------------------------------------------- + +if ($result) +{ + + /*show a table of the orders returned by the sql */ + + start_table("$table_style colspan=6 width=95%"); + $th = array(_("Order #"), _("Customer"), _("Branch"), _("Cust Order #"), _("Order Date"), + _("Required By"), _("Delivery To"), _("Order Total"), _("Currency"), "", ""); + table_header($th); + + $j = 1; + $k = 0; //row colour counter + $overdue_items = false; + while ($myrow = db_fetch($result)) + { + + $view_page = get_customer_trans_view_str(systypes::sales_order(), $myrow["order_no"]); + $formated_del_date = sql2date($myrow["delivery_date"]); + $formated_order_date = sql2date($myrow["ord_date"]); + + // if overdue orders, then highlight as so + if (date1_greater_date2(Today(), $formated_del_date)) + { + start_row("class='overduebg'"); + $overdue_items = true; + } + else + { + alt_table_row_color($k); + } + + label_cell($view_page); + label_cell($myrow["name"]); + label_cell($myrow["br_name"]); + label_cell($myrow["customer_ref"]); + label_cell($formated_order_date); + label_cell($formated_del_date); + label_cell($myrow["deliver_to"]); + amount_cell($myrow["OrderValue"]); + label_cell($myrow["curr_code"]); + + if ($_POST['OutstandingOnly'] == true || $myrow["TotInvoiced"] < $myrow["TotQuantity"]) + { + $modify_page = $path_to_root . "/sales/sales_order_entry.php?" . SID . "ModifyOrderNumber=" . $myrow["order_no"]; + $issue_invoice = $path_to_root . "/sales/customer_invoice.php?" . SID . "OrderNumber=" .$myrow["order_no"]; + + label_cell("" . _("Edit") . ""); + label_cell("" . _("Invoice") . ""); + } + else + { + label_cell(""); + label_cell(""); + } + end_row();; + + $j++; + If ($j == 12) + { + $j = 1; + table_header($th); + } + //end of page full new headings if + } + //end of while loop + + end_table(); + + if ($overdue_items) + display_note(_("Marked items are overdue."), 0, 1, "class='overduefg'"); +} + +echo "
"; + +end_page(); +?> + diff --git a/sales/manage/credit_status.php b/sales/manage/credit_status.php new file mode 100644 index 00000000..da495059 --- /dev/null +++ b/sales/manage/credit_status.php @@ -0,0 +1,150 @@ + 0) + { + display_error(_("Cannot delete this credit status because customer accounts have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_credit_status($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_credit_status(); + +start_table("$table_style width=40%"); +$th = array(_("Description"), _("Dissallow Invoices")); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + if ($myrow["dissallow_invoices"] == 0) + { + $disallow_text = _("Invoice OK"); + } + else + { + $disallow_text = "" . _("NO INVOICING") . ""; + } + + label_cell($myrow["reason_description"]); + label_cell($disallow_text); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Credit Status")); + +start_form(); + +start_table("$table_style2 width=40%"); + +if (isset($selected_id)) +{ + //editing an existing status code + + $myrow = get_credit_status($selected_id); + + $_POST['reason_description'] = $myrow["reason_description"]; + $_POST['DisallowInvoices'] = $myrow["dissallow_invoices"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Description:"), 'reason_description', 50); + +yesno_list_row(_("Dissallow invoicing ?"), 'DisallowInvoices', null); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/sales/manage/customer_branches.php b/sales/manage/customer_branches.php new file mode 100644 index 00000000..51c0aa6f --- /dev/null +++ b/sales/manage/customer_branches.php @@ -0,0 +1,323 @@ + 0) + { + display_error(_("Cannot delete this branch because customer transactions have been created to this branch.")); + + } + else + { + $sql= "SELECT COUNT(*) FROM ".TB_PREF."sales_orders WHERE branch_code='" . $_POST['branch_code']. "' AND debtor_no = '" . $_POST['customer_id']. "'"; + $result = db_query($sql,"could not query sales orders"); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this branch because sales orders exist for it. Purge old sales orders first.")); + } + else + { + $sql="DELETE FROM ".TB_PREF."cust_branch WHERE branch_code='" . $_POST['branch_code']. "' AND debtor_no='" . $_POST['customer_id']. "'"; + db_query($sql,"could not delete branch"); + meta_forward($_SERVER['PHP_SELF'], "debtor_no=" . $_POST['customer_id']); + } + } //end ifs to test if the branch can be deleted +} + +start_form(); + +echo "
" . _("Select a customer: ") . "  "; +customer_list('customer_id', null, false, true); +echo "


"; + +$num_branches = db_customer_has_branches($_POST['customer_id']); +if ($num_branches) +{ + $sql = "SELECT ".TB_PREF."debtors_master.name, ".TB_PREF."cust_branch.*, ".TB_PREF."salesman.salesman_name, + ".TB_PREF."areas.description, ".TB_PREF."tax_groups.name AS tax_group_name + FROM ".TB_PREF."cust_branch, ".TB_PREF."debtors_master, ".TB_PREF."areas, ".TB_PREF."salesman, ".TB_PREF."tax_groups + WHERE ".TB_PREF."cust_branch.debtor_no=".TB_PREF."debtors_master.debtor_no + AND ".TB_PREF."cust_branch.tax_group_id=".TB_PREF."tax_groups.id + AND ".TB_PREF."cust_branch.area=".TB_PREF."areas.area_code + AND ".TB_PREF."cust_branch.salesman=".TB_PREF."salesman.salesman_code + AND ".TB_PREF."cust_branch.debtor_no = '" . $_POST['customer_id']. "'"; + + $result = db_query($sql,"could not get customer branches"); + + start_table("$table_style width=60%"); + + $th = array(_("Name"), _("Contact"), _("Sales Person"), _("Area"), + _("Phone No"), _("Fax No"), _("E-mail"), _("Tax Group"), "", ""); + table_header($th); + + while ($myrow = db_fetch($result)) + { + start_row(); + label_cell($myrow["br_name"]); + label_cell($myrow["contact_name"]); + label_cell($myrow["salesman_name"]); + label_cell($myrow["description"]); + label_cell($myrow["phone"]); + label_cell($myrow["fax"]); + label_cell("" . $myrow["email"]. ""); + label_cell($myrow["tax_group_name"]); + edit_link_cell("debtor_no=" . $_POST['customer_id']. "&SelectedBranch=" . $myrow["branch_code"]); + delete_link_cell("debtor_no=" . $_POST['customer_id']. "&SelectedBranch=" . $myrow["branch_code"]. "&delete=yes"); + end_row(); + } + end_table(); + //END WHILE LIST LOOP +} +else + display_note(_("The selected customer does not have any branches. Please create at least one branch.")); +//else +//{ +//} + + +if (!isset($_POST['New'])) +{ + hyperlink_params($_SERVER['PHP_SELF'], _("New Customer Branch"), "debtor_no=" . $_POST['customer_id']); +} +echo "
"; +start_table("$table_style2 width=60%", 5); +echo ""; // outer table + +echo ""; + + +if (!isset($_POST['New']) && $num_branches) +{ + + //editing an existing branch + $sql = "SELECT * FROM ".TB_PREF."cust_branch + WHERE branch_code='" . $_POST['branch_code'] . "' + AND debtor_no='" . $_POST['customer_id'] . "'"; + + $result = db_query($sql,"check failed"); + $myrow = db_fetch($result); + + $_POST['branch_code'] = $myrow["branch_code"]; + $_POST['br_name'] = $myrow["br_name"]; + $_POST['br_address'] = $myrow["br_address"]; + $_POST['br_post_address'] = $myrow["br_post_address"]; + $_POST['contact_name'] = $myrow["contact_name"]; + $_POST['salesman'] =$myrow["salesman"]; + $_POST['area'] =$myrow["area"]; + $_POST['phone'] =$myrow["phone"]; + $_POST['fax'] =$myrow["fax"]; + $_POST['email'] =$myrow["email"]; + $_POST['tax_group_id'] = $myrow["tax_group_id"]; + $_POST['disable_trans'] = $myrow['disable_trans']; + $_POST['default_location'] = $myrow["default_location"]; + $_POST['default_ship_via'] = $myrow['default_ship_via']; + $_POST['sales_account'] = $myrow["sales_account"]; + $_POST['sales_discount_account'] = $myrow['sales_discount_account']; + $_POST['receivables_account'] = $myrow['receivables_account']; + $_POST['payment_discount_account'] = $myrow['payment_discount_account']; + +} +else +{ //end of if $SelectedBranch only do the else when a new record is being entered + + $sql = "SELECT name, address, email + FROM ".TB_PREF."debtors_master WHERE debtor_no = '" . $_POST['customer_id']. "'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch($result); + $_POST['br_name'] = $myrow["name"]; + $_POST['contact_name'] = _("Main Branch"); + $_POST['br_address'] = $_POST['br_post_address'] = $myrow["address"]; + $_POST['branch_code'] = ""; + $_POST['email'] = $myrow['email']; + if (!isset($_POST['sales_account']) || !isset($_POST['sales_discount_account'])) + { + $company_record = get_company_prefs(); + + $_POST['sales_account'] = $company_record["default_sales_act"]; + $_POST['sales_discount_account'] = $company_record['default_sales_discount_act']; + $_POST['receivables_account'] = $company_record['debtors_act']; + $_POST['payment_discount_account'] = $company_record['default_prompt_payment_act']; + + } + + hidden('New', 'Yes'); +} +hidden('branch_code', $_POST['branch_code']); + +table_section_title(_("Name and Contact")); + +text_row(_("Branch Name:"), 'br_name', $_POST['br_name'], 35, 40); +text_row(_("Contact Person:"), 'contact_name', $_POST['contact_name'], 35, 40); + +text_row(_("Phone Number:"), 'phone', null, 20, 20); +text_row(_("Fax Number:"), 'fax', null, 20, 20); + +text_row("" . _("E-mail:") . "", 'email', $_POST['email'], 35, 55); + +table_section_title(_("Sales")); + +sales_persons_list_row( _("Sales Person:"), 'salesman', null); + +sales_areas_list_row( _("Sales Area:"), 'area', null); + +locations_list_row(_("Default Inventory Location:"), 'default_location', null); + +shippers_list_row(_("Default Shipping Company:"), 'default_ship_via', null); + +tax_groups_list_row(_("Tax Group:"), 'tax_group_id', null, 31, 30); + +yesno_list_row(_("Disable this Branch:"), 'disable_trans', null); + +echo "
"; + +echo ""; // outer table + +echo""; + +table_section_title(_("GL Accounts")); + +gl_all_accounts_list_row(_("Sales Account:"), 'sales_account', $_POST['sales_account']); + +gl_all_accounts_list_row(_("Sales Discount Account:"), 'sales_discount_account', $_POST['sales_discount_account']); + +gl_all_accounts_list_row(_("Accounts Receivable Account:"), 'receivables_account', $_POST['receivables_account']); + +gl_all_accounts_list_row(_("Prompt Payment Discount Account:"), 'payment_discount_account', $_POST['payment_discount_account']); + +table_section_title(_("Addresses")); + +textarea_row(_("Mailing Address:"), 'br_post_address',$_POST['br_post_address'], 35, 5); + +textarea_row(_("Billing Address:"), 'br_address', $_POST['br_address'], 35, 5); + +end_table(); + +end_table(1); // outer table + +submit_add_or_update_center(isset($_POST['New'])); + +end_form(); + +end_page(); + +?> diff --git a/sales/manage/customers.php b/sales/manage/customers.php new file mode 100644 index 00000000..5a57732f --- /dev/null +++ b/sales/manage/customers.php @@ -0,0 +1,331 @@ += 100) || ($_POST['pymt_discount'] < 0)) + { + display_error(_("The payment discount is expected to be less than 100% and greater than or equal to 0.")); + return false; + } + + if (($_POST['discount'] >= 100) || ($_POST['discount'] < 0)) + { + display_error(_("The discount percent is expected to be less than 100 and greater than or equal to 0.")); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------- + +function handle_submit() +{ + global $path_to_root; + if (!can_process()) + return; + + if (!isset($_POST['New'])) + { + + // Sherifoz 22.06.03 convert percent to fraction + $sql = "UPDATE ".TB_PREF."debtors_master SET name='" . $_POST['CustName'] . "', + address='" . $_POST['address'] . "', + tax_id='" . $_POST['tax_id'] . "', + curr_code='" . $_POST['curr_code'] . "', + email='" . $_POST['email'] . "', + dimension_id=" . $_POST['dimension_id'] . ", + dimension2_id=" . $_POST['dimension2_id'] . ", + credit_status='" . $_POST['credit_status'] . "', + payment_terms='" . $_POST['payment_terms'] . "', + discount=" . ($_POST['discount']) / 100 . ", + pymt_discount=" . ($_POST['pymt_discount']) / 100 . ", + credit_limit=" . $_POST['credit_limit'] . ", + sales_type = '" . $_POST['sales_type'] . "' + WHERE debtor_no = '" . $_POST['customer_id'] . "'"; + + db_query($sql,"The customer could not be updated"); + display_notification(_("Customer has been updated.")); + clear_fields(); + + } + else + { //it is a new customer + + begin_transaction(); + + $sql = "INSERT INTO ".TB_PREF."debtors_master (name, address, tax_id, email, dimension_id, dimension2_id, + curr_code, credit_status, payment_terms, discount, pymt_discount,credit_limit, + sales_type) VALUES ('" . $_POST['CustName'] ."', '" . $_POST['address'] . "', '" . $_POST['tax_id'] . "', + '" . $_POST['email'] . "', " . $_POST['dimension_id'] . ", " . $_POST['dimension2_id'] . ", '" . $_POST['curr_code'] . "', + " . $_POST['credit_status'] . ", '" . $_POST['payment_terms'] . "', " . ($_POST['discount'])/100 . ", + " . ($_POST['pymt_discount'])/100 . ", " . $_POST['credit_limit'] . ", '" . $_POST['sales_type'] . "')"; + + db_query($sql,"The customer could not be added"); + + $new_customer_id = db_insert_id(); + + commit_transaction(); + + display_notification(_("A new customer has been added.")); + + hyperlink_params($path_to_root . "/sales/manage/customer_branches.php", _("Add branches for this customer"), "debtor_no=$new_customer_id"); + + clear_fields(); + } +} + +//-------------------------------------------------------------------------------------------- + +if (isset($_POST['submit'])) +{ + + handle_submit(); +} + +//-------------------------------------------------------------------------------------------- + +if (isset($_POST['delete'])) +{ + + //the link to delete a selected record was clicked instead of the submit button + + $cancel_delete = 0; + + // PREVENT DELETES IF DEPENDENT RECORDS IN 'debtor_trans' + + $sql= "SELECT COUNT(*) FROM ".TB_PREF."debtor_trans WHERE debtor_no='" . $_POST['customer_id'] . "'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + $cancel_delete = 1; + display_error(_("This customer cannot be deleted because there are transactions that refer to it.")); + } + else + { + $sql= "SELECT COUNT(*) FROM ".TB_PREF."sales_orders WHERE debtor_no='" . $_POST['customer_id'] . "'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete the customer record because orders have been created against it.")); + } + else + { + $sql = "SELECT COUNT(*) FROM ".TB_PREF."cust_branch WHERE debtor_no='" . $_POST['customer_id'] . "'"; + $result = db_query($sql,"check failed"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this customer because there are branch records set up against it.")); + //echo "
There are " . $myrow[0] . " branch records relating to this customer"; + } + } + } + + if ($cancel_delete == 0) + { //ie not cancelled the delete as a result of above tests + $sql = "DELETE FROM ".TB_PREF."debtors_master WHERE debtor_no='" . $_POST['customer_id'] . "'"; + db_query($sql,"cannot delete customer"); + + meta_forward($_SERVER['PHP_SELF']); + } //end if Delete Customer +} + +function clear_fields() +{ + unset($_POST['CustName']); + unset($_POST['address']); + unset($_POST['tax_id']); + unset($_POST['email']); + unset($_POST['dimension_id']); + unset($_POST['dimension2_id']); + unset($_POST['credit_status']); + unset($_POST['payment_terms']); + unset($_POST['discount']); + unset($_POST['pymt_discount']); + unset($_POST['credit_limit']); + unset($_POST['sales_type']); + unset($_POST['customer_id']); + $_POST['New'] = 1; +} + +check_db_has_sales_types(_("There are no sales types defined. Please define at least one sales type before adding a customer.")); + +start_form(); + +if (db_has_customers()) +{ + start_table("class = 'tablestyle_noborder'"); + start_row(); + customer_list_cells(_("Select a customer: "), 'customer_id', null); + submit_cells('SelectCustomer', _("Edit Customer")); + end_row(); + end_table(); +} +else +{ + hidden('customer_id', $_POST['customer_id']); +} + +hyperlink_params($_SERVER['PHP_SELF'], _("Enter a new customer"), "New=1"); +echo "
"; + +start_table($table_style2, 7, 6); +echo ""; + echo ""; + end_table(1); +} +else +{ + display_error($customer_error); +} + +if ($_SESSION['Items']->direct_invoice) +{ + $porder = _("Place Invoice"); + $corder = _("Commit Invoice Changes"); + $eorder = _("Edit Invoice Items"); +} +else +{ + $porder = _("Place Order"); + $corder = _("Commit Order Changes"); + $eorder = _("Edit Order Items"); +} + +if ($_SESSION['Items']->order_no == 0) +{ + submit_center_first('ProcessOrder', $porder); +} +else +{ + submit_center_first('ProcessOrder', $corder); +} + +/* +echo " "; +submit('EditOrder', $eorder); +if ($_SESSION['Items']->count_items() >= 1) +{ + echo " "; + submit('DeliveryDetails', $deliverydetails); + echo " "; +} +*/ +submit_center_last('CancelOrder', $cancelorder); + +end_form(); + +//-------------------------------------------------------------------------------- + +if (!isset($_SESSION['Items'])) +{ + /* It must be a new order being created $_SESSION['Items'] would be set up from the order + modification code above if a modification to an existing order. */ + + session_register("Items"); + + $_SESSION['Items'] = new cart; + if (isset($_GET['NewInvoice'])) + $_SESSION['Items']->direct_invoice = true; + $_SESSION['Items']->order_no = 0; +} + +//-------------------------------------------------------------------------------- + +end_page(); +?> \ No newline at end of file diff --git a/sales/view/index.php b/sales/view/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/view/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/view/view_credit.php b/sales/view/view_credit.php new file mode 100644 index 00000000..1e98a8e5 --- /dev/null +++ b/sales/view/view_credit.php @@ -0,0 +1,148 @@ +" . _("CREDIT NOTE") . " #$trans_id"); +echo "
"; + +start_table("$table_style2 width=95%"); +echo ""; +end_table(1); // outer table + +$sub_total = 0; + +$result = get_customer_trans_details(11, $trans_id); + +start_table("$table_style width=95%"); + +if (db_num_rows($result) > 0) +{ + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Price"), _("Discount %"), _("Total")); + table_header($th); + + $k = 0; //row colour counter + $sub_total = 0; + + while ($myrow2 = db_fetch($result)) + { + + alt_table_row_color($k); + + $net = ((1 - $myrow2["discount_percent"]) * $myrow2["FullUnitPrice"] * $myrow2["quantity"]); + $sub_total += $net; + + if ($myrow2["discount_percent"] == 0) + { + $display_discount = ""; + } + else + { + $display_discount = number_format2($myrow2["discount_percent"]*100,user_percent_dec()) . "%"; + } + + label_cell($myrow2["stock_id"]); + label_cell($myrow2["StockDescription"]); + qty_cell($myrow2["quantity"]); + label_cell($myrow2["units"], "align=right"); + amount_cell($myrow2["FullUnitPrice"]); + label_cell($display_discount, "align=right"); + amount_cell($net); + end_row(); + } //end while there are line items to print out +} +else + display_note(_("There are no line items on this credit note."), 1, 2); + +$display_sub_tot = number_format2($sub_total,user_price_dec()); +$display_freight = number_format2(-$myrow["ov_freight"],user_price_dec()); + +$display_tax = number_format2(-$myrow["ov_gst"],user_price_dec()); +$credit_total = -$myrow["ov_freight"]-$myrow["ov_gst"]-$myrow["ov_amount"]; +$display_total = number_format2($credit_total,user_price_dec()); + +/*Print out the invoice text entered */ +if ($sub_total != 0) + label_row(_("Sub Total"), $display_sub_tot, "colspan=6 align=right", + "nowrap align=right width=15%"); +label_row(_("Shipping"), $display_freight, "colspan=6 align=right", "nowrap align=right"); + +$tax_items = get_customer_trans_tax_details(11, $trans_id); +display_customer_trans_tax_details($tax_items, 6); + +label_row("" . _("TOTAL CREDIT") . "$display_total", "colspan=6 align=right", "nowrap align=right"); +end_table(1); + +$voided = is_voided_display(11, $trans_id, _("This credit note has been voided.")); + +if (!$voided) + display_allocations_from(payment_person_types::customer(), + $myrow['debtor_no'], 11, $trans_id, $credit_total); + +/* end of check to see that there was an invoice record to print */ + +end_page(true); + +?> \ No newline at end of file diff --git a/sales/view/view_invoice.php b/sales/view/view_invoice.php new file mode 100644 index 00000000..15471f86 --- /dev/null +++ b/sales/view/view_invoice.php @@ -0,0 +1,157 @@ +"; +start_table("$table_style2 width=95%"); +echo ""; +end_table(1); // outer table + + +$result = get_customer_trans_details(10, $trans_id); + +start_table("$table_style width=95%"); + +if (db_num_rows($result) > 0) +{ + $th = array(_("Item Code"), _("Item Description"), _("Quantity"), + _("Unit"), _("Price"), _("Discount %"), _("Total")); + table_header($th); + + $k = 0; //row colour counter + $sub_total = 0; + while ($myrow2 = db_fetch($result)) + { + + alt_table_row_color($k); + + $net = ((1 - $myrow2["discount_percent"]) * $myrow2["FullUnitPrice"] * -$myrow2["quantity"]); + $sub_total += $net; + + if ($myrow2["discount_percent"] == 0) + { + $display_discount = ""; + } + else + { + $display_discount = number_format2($myrow2["discount_percent"]*100,user_percent_dec()) . "%"; + } + + label_cell($myrow2["stock_id"]); + label_cell($myrow2["StockDescription"]); + qty_cell(-$myrow2["quantity"]); + label_cell($myrow2["units"], "align=right"); + amount_cell($myrow2["FullUnitPrice"]); + label_cell($display_discount, "nowrap align=right"); + amount_cell($net); + end_row(); + } //end while there are line items to print out + +} +else + display_note(_("There are no line items on this invoice."), 1, 2); + +$display_sub_tot = number_format2($sub_total,user_price_dec()); +$display_freight = number_format2($myrow["ov_freight"],user_price_dec()); + +/*Print out the invoice text entered */ +label_row(_("Sub-total"), $display_sub_tot, "colspan=6 align=right", + "nowrap align=right width=15%"); +label_row(_("Shipping"), $display_freight, "colspan=6 align=right", "nowrap align=right"); + +$tax_items = get_customer_trans_tax_details(10, $trans_id); +display_customer_trans_tax_details($tax_items, 6); + +$display_total = number_format2($myrow["ov_freight"]+$myrow["ov_gst"]+$myrow["ov_amount"],user_price_dec()); + +label_row(_("TOTAL INVOICE"), $display_total, "colspan=6 align=right", + "nowrap align=right"); +end_table(1); + +is_voided_display(10, $trans_id, _("This invoice has been voided.")); + +end_page(true); + +?> \ No newline at end of file diff --git a/sales/view/view_receipt.php b/sales/view/view_receipt.php new file mode 100644 index 00000000..94e4d4f9 --- /dev/null +++ b/sales/view/view_receipt.php @@ -0,0 +1,50 @@ +"; +start_table("$table_style width=80%"); +start_row(); +label_cells(_("From Customer"), $receipt['DebtorName'], "class='tableheader2'"); +label_cells(_("Into Bank Account"), $receipt['bank_account_name'], "class='tableheader2'"); +label_cells(_("Date of Deposit"), sql2date($receipt['tran_date']), "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Payment Currency"), $receipt['curr_code'], "class='tableheader2'"); +label_cells(_("Amount"), number_format2(-$receipt['ov_amount'], user_price_dec()), "class='tableheader2'"); +label_cells(_("Discount"), number_format2(-$receipt['ov_discount'], user_price_dec()), "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Payment Type"), $receipt['BankTransType'], "class='tableheader2'"); +label_cells(_("Reference"), $receipt['reference'], "class='tableheader2'", "colspan=4"); +end_row(); +comments_display_row(systypes::cust_payment(), $trans_id); + +end_table(1); + +$voided = is_voided_display(systypes::cust_payment(), $trans_id, _("This customer payment has been voided.")); + +if (!$voided) +{ + display_allocations_from(payment_person_types::customer(), $receipt['debtor_no'], systypes::cust_payment(), $trans_id, -$receipt['Total']); +} + +end_page(true); +?> \ No newline at end of file diff --git a/sales/view/view_sales_order.php b/sales/view/view_sales_order.php new file mode 100644 index 00000000..a1b63862 --- /dev/null +++ b/sales/view/view_sales_order.php @@ -0,0 +1,177 @@ +"; + +echo ""; + +end_table(); + +echo "
"; +display_heading2(_("Line Details")); + +start_table("colspan=9 width=95% $table_style"); +$th = array(_("Item Code"), _("Item Description"), _("Quantity"), _("Unit"), + _("Price"), _("Discount"), _("Total"), _("Quantity Delivered")); +table_header($th); + +$k = 0; //row colour counter + +foreach ($_SESSION['Items']->line_items as $stock_item) { + + $line_total = $stock_item->quantity * $stock_item->price * (1 - $stock_item->discount_percent); + + alt_table_row_color($k); + + label_cell($stock_item->stock_id); + label_cell($stock_item->item_description); + qty_cell($stock_item->quantity); + label_cell($stock_item->units); + amount_cell($stock_item->price); + amount_cell($stock_item->discount_percent * 100); + amount_cell($line_total); + + qty_cell($stock_item->qty_inv); + end_row(); +} + +$items_total = $_SESSION['Items']->get_items_total(); + +$display_total = number_format2($items_total + $_SESSION['Items']->freight_cost,user_price_dec()); + +label_row(_("Shipping"), number_format2($_SESSION['Items']->freight_cost,user_price_dec()), + "align=right colspan=6", "nowrap align=right"); +label_row(_("Total Excluding Tax"), $display_total, "align=right colspan=6", + "nowrap align=right"); + +end_table(2); + +end_page(true); + +?> diff --git a/sql/basic.sql b/sql/basic.sql new file mode 100644 index 00000000..a7c1fdf5 --- /dev/null +++ b/sql/basic.sql @@ -0,0 +1,1220 @@ +-- phpMyAdmin SQL Dump +-- version 2.7.0-pl2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Created: 09 februar 2007 at 10:35 +-- Server Version: 4.1.11 +-- PHP-version: 4.4.1 +-- +-- Database: `basic` +-- + +-- -------------------------------------------------------- + +-- +-- Structure for table `areas` +-- + +DROP TABLE IF EXISTS `0_areas`; +CREATE TABLE IF NOT EXISTS `0_areas` ( + `area_code` int(11) NOT NULL auto_increment, + `description` varchar(60) NOT NULL default '', + PRIMARY KEY (`area_code`), + UNIQUE KEY `description` (`description`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `bank_accounts` +-- + +DROP TABLE IF EXISTS `0_bank_accounts`; +CREATE TABLE IF NOT EXISTS `0_bank_accounts` ( + `account_code` varchar(11) NOT NULL default '', + `account_type` smallint(6) NOT NULL default '0', + `bank_account_name` varchar(60) NOT NULL default '', + `bank_account_number` varchar(100) NOT NULL default '', + `bank_name` varchar(60) NOT NULL default '', + `bank_address` tinytext, + `bank_curr_code` char(3) NOT NULL default '', + PRIMARY KEY (`account_code`), + KEY `bank_account_name` (`bank_account_name`), + KEY `bank_account_number` (`bank_account_number`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `bank_trans` +-- + +DROP TABLE IF EXISTS `0_bank_trans`; +CREATE TABLE IF NOT EXISTS `0_bank_trans` ( + `id` int(11) NOT NULL auto_increment, + `type` smallint(6) default NULL, + `trans_no` int(11) default NULL, + `bank_act` varchar(11) default NULL, + `ref` varchar(40) default NULL, + `trans_date` date NOT NULL default '0000-00-00', + `bank_trans_type_id` int(10) unsigned default NULL, + `amount` double default NULL, + `dimension_id` int(11) NOT NULL default '0', + `dimension2_id` int(11) NOT NULL default '0', + `person_type_id` int(11) NOT NULL default '0', + `person_id` tinyblob, + PRIMARY KEY (`id`), + KEY `bank_act` (`bank_act`,`ref`), + KEY `type` (`type`,`trans_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `bank_trans_types` +-- + +DROP TABLE IF EXISTS `0_bank_trans_types`; +CREATE TABLE IF NOT EXISTS `0_bank_trans_types` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `bom` +-- + +DROP TABLE IF EXISTS `0_bom`; +CREATE TABLE IF NOT EXISTS `0_bom` ( + `id` int(11) NOT NULL auto_increment, + `parent` char(20) NOT NULL default '', + `component` char(20) NOT NULL default '', + `workcentre_added` char(5) NOT NULL default '', + `loc_code` char(5) NOT NULL default '', + `quantity` double NOT NULL default '1', + PRIMARY KEY (`parent`,`component`,`workcentre_added`,`loc_code`), + KEY `component` (`component`), + KEY `id` (`id`), + KEY `loc_code` (`loc_code`), + KEY `parent` (`parent`,`loc_code`), + KEY `Parent_2` (`parent`), + KEY `workcentre_added` (`workcentre_added`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `budget_trans` +-- + +DROP TABLE IF EXISTS `0_budget_trans`; +CREATE TABLE IF NOT EXISTS `0_budget_trans` ( + `counter` int(11) NOT NULL auto_increment, + `type` smallint(6) NOT NULL default '0', + `type_no` bigint(16) NOT NULL default '1', + `tran_date` date NOT NULL default '0000-00-00', + `account` varchar(11) NOT NULL default '', + `memo_` tinytext NOT NULL, + `amount` double NOT NULL default '0', + `dimension_id` int(11) default '0', + `dimension2_id` int(11) default '0', + `person_type_id` int(11) default NULL, + `person_id` tinyblob, + PRIMARY KEY (`counter`), + KEY `Type_and_Number` (`type`,`type_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `chart_class` +-- + +DROP TABLE IF EXISTS `0_chart_class`; +CREATE TABLE IF NOT EXISTS `0_chart_class` ( + `cid` int(11) NOT NULL default '0', + `class_name` varchar(60) NOT NULL default '', + `balance_sheet` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`cid`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `chart_master` +-- + +DROP TABLE IF EXISTS `0_chart_master`; +CREATE TABLE IF NOT EXISTS `0_chart_master` ( + `account_code` varchar(11) NOT NULL default '', + `account_code2` varchar(11) default '', + `account_name` varchar(60) NOT NULL default '', + `account_type` int(11) NOT NULL default '0', + `tax_code` int(11) NOT NULL default '0', + PRIMARY KEY (`account_code`), + KEY `account_code` (`account_code`), + KEY `account_name` (`account_name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `chart_types` +-- + +DROP TABLE IF EXISTS `0_chart_types`; +CREATE TABLE IF NOT EXISTS `0_chart_types` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + `class_id` tinyint(1) NOT NULL default '0', + `parent` int(11) NOT NULL default '-1', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `comments` +-- + +DROP TABLE IF EXISTS `0_comments`; +CREATE TABLE IF NOT EXISTS `0_comments` ( + `type` int(11) NOT NULL default '0', + `id` int(11) NOT NULL default '0', + `date_` date default '0000-00-00', + `memo_` tinytext +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `company` +-- + +DROP TABLE IF EXISTS `0_company`; +CREATE TABLE IF NOT EXISTS `0_company` ( + `coy_code` int(11) NOT NULL default '1', + `coy_name` varchar(60) NOT NULL default '', + `gst_no` varchar(25) NOT NULL default '', + `coy_no` varchar(25) NOT NULL default '0', + `tax_prd` int(11) NOT NULL default '1', + `tax_last` int(11) NOT NULL default '1', + `postal_address` tinytext NOT NULL, + `phone` varchar(30) NOT NULL default '', + `fax` varchar(30) NOT NULL default '', + `email` varchar(100) NOT NULL default '', + `coy_logo` varchar(100) NOT NULL default '', + `domicile` varchar(55) NOT NULL default '', + `curr_default` char(3) NOT NULL default '', + `debtors_act` varchar(11) NOT NULL default '', + `pyt_discount_act` varchar(11) NOT NULL default '', + `creditors_act` varchar(11) NOT NULL default '', + `grn_act` varchar(11) NOT NULL default '', + `exchange_diff_act` varchar(11) NOT NULL default '', + `purch_exchange_diff_act` varchar(11) NOT NULL default '', + `retained_earnings_act` varchar(11) NOT NULL default '', + `freight_act` varchar(11) NOT NULL default '', + `default_sales_act` varchar(11) NOT NULL default '', + `default_sales_discount_act` varchar(11) NOT NULL default '', + `default_prompt_payment_act` varchar(11) NOT NULL default '', + `default_inventory_act` varchar(11) NOT NULL default '', + `default_cogs_act` varchar(11) NOT NULL default '', + `default_adj_act` varchar(11) NOT NULL default '', + `default_inv_sales_act` varchar(11) NOT NULL default '', + `default_assembly_act` varchar(11) NOT NULL default '', + `payroll_act` varchar(11) NOT NULL default '', + `custom1_name` varchar(60) NOT NULL default '', + `custom2_name` varchar(60) NOT NULL default '', + `custom3_name` varchar(60) NOT NULL default '', + `custom1_value` varchar(100) NOT NULL default '', + `custom2_value` varchar(100) NOT NULL default '', + `custom3_value` varchar(100) NOT NULL default '', + `allow_negative_stock` tinyint(1) NOT NULL default '0', + `po_over_receive` int(11) NOT NULL default '10', + `po_over_charge` int(11) NOT NULL default '10', + `default_credit_limit` int(11) NOT NULL default '1000', + `default_workorder_required` int(11) NOT NULL default '20', + `default_dim_required` int(11) NOT NULL default '20', + `past_due_days` int(11) NOT NULL default '30', + `use_dimension` tinyint(1) default '0', + `f_year` int(11) NOT NULL default '1', + PRIMARY KEY (`coy_code`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `credit_status` +-- + +DROP TABLE IF EXISTS `0_credit_status`; +CREATE TABLE IF NOT EXISTS `0_credit_status` ( + `id` int(11) NOT NULL auto_increment, + `reason_description` char(100) NOT NULL default '', + `dissallow_invoices` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `reason_description` (`reason_description`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `currencies` +-- + +DROP TABLE IF EXISTS `0_currencies`; +CREATE TABLE IF NOT EXISTS `0_currencies` ( + `currency` varchar(60) NOT NULL default '', + `curr_abrev` char(3) NOT NULL default '', + `curr_symbol` varchar(10) NOT NULL default '', + `country` varchar(100) NOT NULL default '', + `hundreds_name` varchar(15) NOT NULL default '', + PRIMARY KEY (`curr_abrev`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `cust_allocations` +-- + +DROP TABLE IF EXISTS `0_cust_allocations`; +CREATE TABLE IF NOT EXISTS `0_cust_allocations` ( + `id` int(11) NOT NULL auto_increment, + `amt` double unsigned default NULL, + `date_alloc` date NOT NULL default '0000-00-00', + `trans_no_from` int(11) default NULL, + `trans_type_from` int(11) default NULL, + `trans_no_to` int(11) default NULL, + `trans_type_to` int(11) default NULL, + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `cust_branch` +-- + +DROP TABLE IF EXISTS `0_cust_branch`; +CREATE TABLE IF NOT EXISTS `0_cust_branch` ( + `branch_code` int(11) NOT NULL auto_increment, + `debtor_no` int(11) NOT NULL default '0', + `br_name` varchar(60) NOT NULL default '', + `br_address` tinytext NOT NULL, + `area` int(11) default NULL, + `salesman` int(11) NOT NULL default '0', + `phone` varchar(30) NOT NULL default '', + `fax` varchar(30) NOT NULL default '', + `contact_name` varchar(60) NOT NULL default '', + `email` varchar(100) NOT NULL default '', + `default_location` varchar(5) NOT NULL default '', + `tax_group_id` int(11) default NULL, + `sales_account` varchar(11) default NULL, + `sales_discount_account` varchar(11) default NULL, + `receivables_account` varchar(11) default NULL, + `payment_discount_account` varchar(11) default NULL, + `default_ship_via` int(11) NOT NULL default '1', + `disable_trans` tinyint(4) NOT NULL default '0', + `br_post_address` tinytext NOT NULL, + PRIMARY KEY (`branch_code`,`debtor_no`), + KEY `branch_code` (`branch_code`), + KEY `br_name` (`br_name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `debtor_trans` +-- + +DROP TABLE IF EXISTS `0_debtor_trans`; +CREATE TABLE IF NOT EXISTS `0_debtor_trans` ( + `trans_no` int(11) unsigned NOT NULL default '0', + `type` smallint(6) unsigned NOT NULL default '0', + `debtor_no` int(11) unsigned default NULL, + `branch_code` int(11) NOT NULL default '-1', + `tran_date` date NOT NULL default '0000-00-00', + `due_date` date NOT NULL default '0000-00-00', + `reference` varchar(60) NOT NULL default '', + `tpe` int(11) NOT NULL default '0', + `order_` int(11) NOT NULL default '0', + `ov_amount` double NOT NULL default '0', + `ov_gst` double NOT NULL default '0', + `ov_freight` double NOT NULL default '0', + `ov_discount` double NOT NULL default '0', + `alloc` double NOT NULL default '0', + `rate` double NOT NULL default '1', + `ship_via` int(11) default NULL, + PRIMARY KEY (`trans_no`,`type`), + KEY `debtor_no` (`debtor_no`,`branch_code`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `debtor_trans_details` +-- + +DROP TABLE IF EXISTS `0_debtor_trans_details`; +CREATE TABLE IF NOT EXISTS `0_debtor_trans_details` ( + `id` int(11) NOT NULL auto_increment, + `debtor_trans_no` int(11) default NULL, + `debtor_trans_type` int(11) default NULL, + `stock_id` varchar(20) NOT NULL default '', + `description` tinytext, + `unit_price` double NOT NULL default '0', + `unit_tax` double NOT NULL default '0', + `quantity` double NOT NULL default '0', + `discount_percent` double NOT NULL default '0', + `standard_cost` double NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `debtor_trans_tax_details` +-- + +DROP TABLE IF EXISTS `0_debtor_trans_tax_details`; +CREATE TABLE IF NOT EXISTS `0_debtor_trans_tax_details` ( + `id` int(11) NOT NULL auto_increment, + `debtor_trans_no` int(11) default NULL, + `debtor_trans_type` int(11) default NULL, + `tax_type_id` int(11) NOT NULL default '0', + `tax_type_name` varchar(60) default NULL, + `rate` double NOT NULL default '0', + `included_in_price` tinyint(1) NOT NULL default '0', + `amount` double NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `debtors_master` +-- + +DROP TABLE IF EXISTS `0_debtors_master`; +CREATE TABLE IF NOT EXISTS `0_debtors_master` ( + `debtor_no` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + `address` tinytext, + `email` varchar(100) NOT NULL default '', + `tax_id` varchar(55) NOT NULL default '', + `curr_code` char(3) NOT NULL default '', + `sales_type` int(11) NOT NULL default '1', + `dimension_id` int(11) NOT NULL default '0', + `dimension2_id` int(11) NOT NULL default '0', + `credit_status` int(11) NOT NULL default '0', + `payment_terms` int(11) default NULL, + `discount` double NOT NULL default '0', + `pymt_discount` double NOT NULL default '0', + `credit_limit` float NOT NULL default '1000', + PRIMARY KEY (`debtor_no`), + UNIQUE KEY `name` (`name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `dimensions` +-- + +DROP TABLE IF EXISTS `0_dimensions`; +CREATE TABLE IF NOT EXISTS `0_dimensions` ( + `id` int(11) NOT NULL auto_increment, + `reference` varchar(60) NOT NULL default '', + `name` varchar(60) NOT NULL default '', + `type_` tinyint(1) NOT NULL default '1', + `closed` tinyint(1) NOT NULL default '0', + `date_` date NOT NULL default '0000-00-00', + `due_date` date NOT NULL default '0000-00-00', + PRIMARY KEY (`id`), + UNIQUE KEY `reference` (`reference`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `exchange_rates` +-- + +DROP TABLE IF EXISTS `0_exchange_rates`; +CREATE TABLE IF NOT EXISTS `0_exchange_rates` ( + `id` int(11) NOT NULL auto_increment, + `curr_code` char(3) NOT NULL default '', + `rate_buy` double NOT NULL default '0', + `rate_sell` double NOT NULL default '0', + `date_` date NOT NULL default '0000-00-00', + PRIMARY KEY (`id`), + UNIQUE KEY `curr_code` (`curr_code`,`date_`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `fiscal_year` +-- + +DROP TABLE IF EXISTS `0_fiscal_year`; +CREATE TABLE IF NOT EXISTS `0_fiscal_year` ( + `id` int(11) NOT NULL auto_increment, + `begin` date default '0000-00-00', + `end` date default '0000-00-00', + `closed` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `form_items` +-- + +DROP TABLE IF EXISTS `0_form_items`; +CREATE TABLE IF NOT EXISTS `0_form_items` ( + `form_id` int(11) NOT NULL default '0', + `form_type` int(11) NOT NULL default '0', + `trans_type` int(11) NOT NULL default '0', + `trans_id` int(11) NOT NULL default '0', + `param1` varchar(100) NOT NULL default '', + `param2` varchar(100) default NULL, + PRIMARY KEY (`form_id`,`form_type`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `gl_trans` +-- + +DROP TABLE IF EXISTS `0_gl_trans`; +CREATE TABLE IF NOT EXISTS `0_gl_trans` ( + `counter` int(11) NOT NULL auto_increment, + `type` smallint(6) NOT NULL default '0', + `type_no` bigint(16) NOT NULL default '1', + `tran_date` date NOT NULL default '0000-00-00', + `account` varchar(11) NOT NULL default '', + `memo_` tinytext NOT NULL, + `amount` double NOT NULL default '0', + `dimension_id` int(11) NOT NULL default '0', + `dimension2_id` int(11) NOT NULL default '0', + `person_type_id` int(11) default NULL, + `person_id` tinyblob, + PRIMARY KEY (`counter`), + KEY `Type_and_Number` (`type`,`type_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `grn_batch` +-- + +DROP TABLE IF EXISTS `0_grn_batch`; +CREATE TABLE IF NOT EXISTS `0_grn_batch` ( + `id` int(11) NOT NULL auto_increment, + `supplier_id` int(11) NOT NULL default '0', + `purch_order_no` int(11) default NULL, + `reference` varchar(60) NOT NULL default '', + `delivery_date` date NOT NULL default '0000-00-00', + `loc_code` varchar(5) default NULL, + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `grn_items` +-- + +DROP TABLE IF EXISTS `0_grn_items`; +CREATE TABLE IF NOT EXISTS `0_grn_items` ( + `id` int(11) NOT NULL auto_increment, + `grn_batch_id` int(11) default NULL, + `po_detail_item` int(11) NOT NULL default '0', + `item_code` varchar(20) NOT NULL default '', + `description` tinytext, + `qty_recd` double NOT NULL default '0', + `quantity_inv` double NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `item_tax_type_exemptions` +-- + +DROP TABLE IF EXISTS `0_item_tax_type_exemptions`; +CREATE TABLE IF NOT EXISTS `0_item_tax_type_exemptions` ( + `item_tax_type_id` int(11) NOT NULL default '0', + `tax_type_id` int(11) NOT NULL default '0', + PRIMARY KEY (`item_tax_type_id`,`tax_type_id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `item_tax_types` +-- + +DROP TABLE IF EXISTS `0_item_tax_types`; +CREATE TABLE IF NOT EXISTS `0_item_tax_types` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + `exempt` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `loc_stock` +-- + +DROP TABLE IF EXISTS `0_loc_stock`; +CREATE TABLE IF NOT EXISTS `0_loc_stock` ( + `loc_code` char(5) NOT NULL default '', + `stock_id` char(20) NOT NULL default '', + `reorder_level` bigint(20) NOT NULL default '0', + PRIMARY KEY (`loc_code`,`stock_id`), + KEY `stock_id` (`stock_id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `locations` +-- + +DROP TABLE IF EXISTS `0_locations`; +CREATE TABLE IF NOT EXISTS `0_locations` ( + `loc_code` varchar(5) NOT NULL default '', + `location_name` varchar(60) NOT NULL default '', + `delivery_address` tinytext NOT NULL, + `phone` varchar(30) NOT NULL default '', + `fax` varchar(30) NOT NULL default '', + `email` varchar(100) NOT NULL default '', + `contact` varchar(30) NOT NULL default '', + PRIMARY KEY (`loc_code`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `movement_types` +-- + +DROP TABLE IF EXISTS `0_movement_types`; +CREATE TABLE IF NOT EXISTS `0_movement_types` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `payment_terms` +-- + +DROP TABLE IF EXISTS `0_payment_terms`; +CREATE TABLE IF NOT EXISTS `0_payment_terms` ( + `terms_indicator` int(11) NOT NULL auto_increment, + `terms` char(80) NOT NULL default '', + `days_before_due` smallint(6) NOT NULL default '0', + `day_in_following_month` smallint(6) NOT NULL default '0', + PRIMARY KEY (`terms_indicator`), + UNIQUE KEY `terms` (`terms`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `prices` +-- + +DROP TABLE IF EXISTS `0_prices`; +CREATE TABLE IF NOT EXISTS `0_prices` ( + `id` int(11) NOT NULL auto_increment, + `stock_id` varchar(20) NOT NULL default '', + `sales_type_id` int(11) NOT NULL default '0', + `curr_abrev` char(3) NOT NULL default '', + `price` double NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `price` (`stock_id`,`sales_type_id`,`curr_abrev`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `purch_data` +-- + +DROP TABLE IF EXISTS `0_purch_data`; +CREATE TABLE IF NOT EXISTS `0_purch_data` ( + `supplier_id` int(11) NOT NULL default '0', + `stock_id` char(20) NOT NULL default '', + `price` double NOT NULL default '0', + `suppliers_uom` char(50) NOT NULL default '', + `conversion_factor` double NOT NULL default '1', + `supplier_description` char(50) NOT NULL default '', + PRIMARY KEY (`supplier_id`,`stock_id`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `purch_order_details` +-- + +DROP TABLE IF EXISTS `0_purch_order_details`; +CREATE TABLE IF NOT EXISTS `0_purch_order_details` ( + `po_detail_item` int(11) NOT NULL auto_increment, + `order_no` int(11) NOT NULL default '0', + `item_code` varchar(20) NOT NULL default '', + `description` tinytext, + `delivery_date` date NOT NULL default '0000-00-00', + `qty_invoiced` double NOT NULL default '0', + `unit_price` double NOT NULL default '0', + `act_price` double NOT NULL default '0', + `std_cost_unit` double NOT NULL default '0', + `quantity_ordered` double NOT NULL default '0', + `quantity_received` double NOT NULL default '0', + PRIMARY KEY (`po_detail_item`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `purch_orders` +-- + +DROP TABLE IF EXISTS `0_purch_orders`; +CREATE TABLE IF NOT EXISTS `0_purch_orders` ( + `order_no` int(11) NOT NULL auto_increment, + `supplier_id` int(11) NOT NULL default '0', + `comments` tinytext, + `ord_date` date NOT NULL default '0000-00-00', + `reference` tinytext NOT NULL, + `requisition_no` tinytext, + `into_stock_location` varchar(5) NOT NULL default '', + `delivery_address` tinytext NOT NULL, + PRIMARY KEY (`order_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `refs` +-- + +DROP TABLE IF EXISTS `0_refs`; +CREATE TABLE IF NOT EXISTS `0_refs` ( + `id` int(11) NOT NULL default '0', + `type` int(11) NOT NULL default '0', + `reference` varchar(100) NOT NULL default '', + PRIMARY KEY (`id`,`type`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `sales_order_details` +-- + +DROP TABLE IF EXISTS `0_sales_order_details`; +CREATE TABLE IF NOT EXISTS `0_sales_order_details` ( + `order_no` int(11) NOT NULL default '0', + `stk_code` varchar(20) NOT NULL default '', + `description` tinytext, + `qty_invoiced` double NOT NULL default '0', + `unit_price` double NOT NULL default '0', + `quantity` double NOT NULL default '0', + `discount_percent` double NOT NULL default '0', + PRIMARY KEY (`order_no`,`stk_code`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `sales_orders` +-- + +DROP TABLE IF EXISTS `0_sales_orders`; +CREATE TABLE IF NOT EXISTS `0_sales_orders` ( + `order_no` int(11) NOT NULL auto_increment, + `debtor_no` int(11) NOT NULL default '0', + `branch_code` int(11) NOT NULL default '0', + `customer_ref` tinytext NOT NULL, + `comments` tinytext, + `ord_date` date NOT NULL default '0000-00-00', + `order_type` int(11) NOT NULL default '0', + `ship_via` int(11) NOT NULL default '0', + `delivery_address` tinytext NOT NULL, + `contact_phone` varchar(30) default NULL, + `contact_email` varchar(100) default NULL, + `deliver_to` tinytext NOT NULL, + `freight_cost` double NOT NULL default '0', + `from_stk_loc` varchar(5) NOT NULL default '', + `delivery_date` date NOT NULL default '0000-00-00', + PRIMARY KEY (`order_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `sales_types` +-- + +DROP TABLE IF EXISTS `0_sales_types`; +CREATE TABLE IF NOT EXISTS `0_sales_types` ( + `id` int(11) NOT NULL auto_increment, + `sales_type` char(50) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `sales_type` (`sales_type`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `salesman` +-- + +DROP TABLE IF EXISTS `0_salesman`; +CREATE TABLE IF NOT EXISTS `0_salesman` ( + `salesman_code` int(11) NOT NULL auto_increment, + `salesman_name` char(60) NOT NULL default '', + `salesman_phone` char(30) NOT NULL default '', + `salesman_fax` char(30) NOT NULL default '', + `salesman_email` varchar(100) NOT NULL default '', + PRIMARY KEY (`salesman_code`), + UNIQUE KEY `salesman_name` (`salesman_name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `shippers` +-- + +DROP TABLE IF EXISTS `0_shippers`; +CREATE TABLE IF NOT EXISTS `0_shippers` ( + `shipper_id` int(11) NOT NULL auto_increment, + `shipper_name` varchar(60) NOT NULL default '', + `phone` varchar(30) NOT NULL default '', + `contact` tinytext NOT NULL, + `address` tinytext NOT NULL, + PRIMARY KEY (`shipper_id`), + UNIQUE KEY `name` (`shipper_name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `stock_category` +-- + +DROP TABLE IF EXISTS `0_stock_category`; +CREATE TABLE IF NOT EXISTS `0_stock_category` ( + `category_id` int(11) NOT NULL auto_increment, + `description` varchar(60) NOT NULL default '', + `stock_act` varchar(11) default NULL, + `cogs_act` varchar(11) default NULL, + `adj_gl_act` varchar(11) default NULL, + `purch_price_var_act` varchar(11) default NULL, + PRIMARY KEY (`category_id`), + UNIQUE KEY `description` (`description`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `stock_master` +-- + +DROP TABLE IF EXISTS `0_stock_master`; +CREATE TABLE IF NOT EXISTS `0_stock_master` ( + `stock_id` varchar(20) NOT NULL default '', + `category_id` int(11) NOT NULL default '0', + `tax_type_id` int(11) NOT NULL default '0', + `description` varchar(200) NOT NULL default '', + `long_description` tinytext NOT NULL, + `units` varchar(20) NOT NULL default 'each', + `mb_flag` char(1) NOT NULL default 'B', + `sales_account` varchar(11) NOT NULL default '', + `cogs_account` varchar(11) NOT NULL default '', + `inventory_account` varchar(11) NOT NULL default '', + `adjustment_account` varchar(11) NOT NULL default '', + `assembly_account` varchar(11) NOT NULL default '', + `dimension_id` int(11) default NULL, + `dimension2_id` int(11) default NULL, + `actual_cost` double NOT NULL default '0', + `last_cost` double NOT NULL default '0', + `material_cost` double NOT NULL default '0', + `labour_cost` double NOT NULL default '0', + `overhead_cost` double NOT NULL default '0', + PRIMARY KEY (`stock_id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `stock_moves` +-- + +DROP TABLE IF EXISTS `0_stock_moves`; +CREATE TABLE IF NOT EXISTS `0_stock_moves` ( + `trans_id` int(11) NOT NULL auto_increment, + `trans_no` int(11) NOT NULL default '0', + `stock_id` char(20) NOT NULL default '', + `type` smallint(6) NOT NULL default '0', + `loc_code` char(5) NOT NULL default '', + `tran_date` date NOT NULL default '0000-00-00', + `person_id` int(11) default NULL, + `price` double NOT NULL default '0', + `reference` char(40) NOT NULL default '', + `qty` double NOT NULL default '1', + `discount_percent` double NOT NULL default '0', + `standard_cost` double NOT NULL default '0', + `visible` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`trans_id`), + KEY `type` (`type`,`trans_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `supp_allocations` +-- + +DROP TABLE IF EXISTS `0_supp_allocations`; +CREATE TABLE IF NOT EXISTS `0_supp_allocations` ( + `id` int(11) NOT NULL auto_increment, + `amt` double unsigned default NULL, + `date_alloc` date NOT NULL default '0000-00-00', + `trans_no_from` int(11) default NULL, + `trans_type_from` int(11) default NULL, + `trans_no_to` int(11) default NULL, + `trans_type_to` int(11) default NULL, + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `supp_invoice_items` +-- + +DROP TABLE IF EXISTS `0_supp_invoice_items`; +CREATE TABLE IF NOT EXISTS `0_supp_invoice_items` ( + `id` int(11) NOT NULL auto_increment, + `supp_trans_no` int(11) default NULL, + `supp_trans_type` int(11) default NULL, + `gl_code` int(11) NOT NULL default '0', + `grn_item_id` int(11) default NULL, + `po_detail_item_id` int(11) default NULL, + `stock_id` varchar(20) NOT NULL default '', + `description` tinytext, + `quantity` double NOT NULL default '0', + `unit_price` double NOT NULL default '0', + `unit_tax` double NOT NULL default '0', + `memo_` tinytext, + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `supp_invoice_tax_items` +-- + +DROP TABLE IF EXISTS `0_supp_invoice_tax_items`; +CREATE TABLE IF NOT EXISTS `0_supp_invoice_tax_items` ( + `id` int(11) NOT NULL auto_increment, + `supp_trans_no` int(11) default NULL, + `supp_trans_type` int(11) default NULL, + `tax_type_id` int(11) NOT NULL default '0', + `tax_type_name` varchar(60) default NULL, + `rate` double NOT NULL default '0', + `included_in_price` tinyint(1) NOT NULL default '0', + `amount` double NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `supp_trans` +-- + +DROP TABLE IF EXISTS `0_supp_trans`; +CREATE TABLE IF NOT EXISTS `0_supp_trans` ( + `trans_no` int(11) unsigned NOT NULL default '0', + `type` smallint(6) unsigned NOT NULL default '0', + `supplier_id` int(11) unsigned default NULL, + `reference` tinytext NOT NULL, + `supp_reference` varchar(60) NOT NULL default '', + `tran_date` date NOT NULL default '0000-00-00', + `due_date` date NOT NULL default '0000-00-00', + `ov_amount` double NOT NULL default '0', + `ov_discount` double NOT NULL default '0', + `ov_gst` double NOT NULL default '0', + `rate` double NOT NULL default '1', + `alloc` double NOT NULL default '0', + PRIMARY KEY (`trans_no`,`type`), + KEY `supplier_id` (`supplier_id`), + KEY `SupplierID_2` (`supplier_id`,`supp_reference`), + KEY `type` (`type`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `suppliers` +-- + +DROP TABLE IF EXISTS `0_suppliers`; +CREATE TABLE IF NOT EXISTS `0_suppliers` ( + `supplier_id` int(11) NOT NULL auto_increment, + `supp_name` varchar(60) NOT NULL default '', + `address` tinytext NOT NULL, + `email` varchar(100) NOT NULL default '', + `bank_account` varchar(60) NOT NULL default '', + `curr_code` char(3) default NULL, + `payment_terms` int(11) default NULL, + `dimension_id` int(11) default '0', + `dimension2_id` int(11) default '0', + `tax_group_id` int(11) default NULL, + `purchase_account` varchar(11) default NULL, + `payable_account` varchar(11) default NULL, + `payment_discount_account` varchar(11) default NULL, + PRIMARY KEY (`supplier_id`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `sys_types` +-- + +DROP TABLE IF EXISTS `0_sys_types`; +CREATE TABLE IF NOT EXISTS `0_sys_types` ( + `type_id` smallint(6) NOT NULL default '0', + `type_name` varchar(60) NOT NULL default '', + `type_no` int(11) NOT NULL default '1', + `next_reference` varchar(100) NOT NULL default '', + PRIMARY KEY (`type_id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `tax_group_items` +-- + +DROP TABLE IF EXISTS `0_tax_group_items`; +CREATE TABLE IF NOT EXISTS `0_tax_group_items` ( + `tax_group_id` int(11) NOT NULL default '0', + `tax_type_id` int(11) NOT NULL default '0', + `rate` double NOT NULL default '0', + `included_in_price` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`tax_group_id`,`tax_type_id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `tax_groups` +-- + +DROP TABLE IF EXISTS `0_tax_groups`; +CREATE TABLE IF NOT EXISTS `0_tax_groups` ( + `id` int(11) NOT NULL auto_increment, + `name` varchar(60) NOT NULL default '', + `tax_shipping` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `tax_types` +-- + +DROP TABLE IF EXISTS `0_tax_types`; +CREATE TABLE IF NOT EXISTS `0_tax_types` ( + `id` int(11) NOT NULL auto_increment, + `rate` double NOT NULL default '0', + `sales_gl_code` varchar(11) NOT NULL default '', + `purchasing_gl_code` varchar(11) NOT NULL default '', + `name` varchar(60) NOT NULL default '', + `out` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `users` +-- + +DROP TABLE IF EXISTS `0_users`; +CREATE TABLE IF NOT EXISTS `0_users` ( + `user_id` varchar(60) NOT NULL default '', + `password` varchar(100) NOT NULL default '', + `real_name` varchar(100) NOT NULL default '', + `full_access` int(11) NOT NULL default '1', + `phone` varchar(30) NOT NULL default '', + `email` varchar(100) default NULL, + `language` varchar(20) default NULL, + `date_format` tinyint(1) NOT NULL default '0', + `date_sep` tinyint(1) NOT NULL default '0', + `tho_sep` tinyint(1) NOT NULL default '0', + `dec_sep` tinyint(1) NOT NULL default '0', + `theme` varchar(20) NOT NULL default 'default', + `page_size` varchar(20) NOT NULL default 'A4', + `prices_dec` smallint(6) NOT NULL default '2', + `qty_dec` smallint(6) NOT NULL default '2', + `rates_dec` smallint(6) NOT NULL default '4', + `percent_dec` smallint(6) NOT NULL default '1', + `show_gl` tinyint(1) NOT NULL default '1', + `show_codes` tinyint(1) NOT NULL default '0', + `last_visit_date` datetime default NULL, + PRIMARY KEY (`user_id`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `voided` +-- + +DROP TABLE IF EXISTS `0_voided`; +CREATE TABLE IF NOT EXISTS `0_voided` ( + `type` int(11) NOT NULL default '0', + `id` int(11) NOT NULL default '0', + `date_` date NOT NULL default '0000-00-00', + `memo_` tinytext NOT NULL, + UNIQUE KEY `id` (`type`,`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `wo_issue_items` +-- + +DROP TABLE IF EXISTS `0_wo_issue_items`; +CREATE TABLE IF NOT EXISTS `0_wo_issue_items` ( + `id` int(11) NOT NULL auto_increment, + `stock_id` varchar(40) default NULL, + `issue_id` int(11) default NULL, + `qty_issued` double default NULL, + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `wo_issues` +-- + +DROP TABLE IF EXISTS `0_wo_issues`; +CREATE TABLE IF NOT EXISTS `0_wo_issues` ( + `issue_no` int(11) NOT NULL auto_increment, + `workorder_id` int(11) NOT NULL default '0', + `reference` varchar(100) default NULL, + `issue_date` date default NULL, + `loc_code` varchar(5) default NULL, + `workcentre_id` int(11) default NULL, + PRIMARY KEY (`issue_no`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `wo_manufacture` +-- + +DROP TABLE IF EXISTS `0_wo_manufacture`; +CREATE TABLE IF NOT EXISTS `0_wo_manufacture` ( + `id` int(11) NOT NULL auto_increment, + `reference` varchar(100) default NULL, + `workorder_id` int(11) NOT NULL default '0', + `quantity` double NOT NULL default '0', + `date_` date NOT NULL default '0000-00-00', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `wo_requirements` +-- + +DROP TABLE IF EXISTS `0_wo_requirements`; +CREATE TABLE IF NOT EXISTS `0_wo_requirements` ( + `id` int(11) NOT NULL auto_increment, + `workorder_id` int(11) NOT NULL default '0', + `stock_id` char(20) NOT NULL default '', + `workcentre` char(5) NOT NULL default '', + `units_req` double NOT NULL default '1', + `std_cost` double NOT NULL default '0', + `loc_code` char(5) NOT NULL default '', + `units_issued` double NOT NULL default '0', + PRIMARY KEY (`id`) +) TYPE=InnoDB; + +-- -------------------------------------------------------- + +-- +-- Structure for table `workcentres` +-- + +DROP TABLE IF EXISTS `0_workcentres`; +CREATE TABLE IF NOT EXISTS `0_workcentres` ( + `id` int(11) NOT NULL auto_increment, + `name` char(40) NOT NULL default '', + `description` char(50) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Structure for table `workorders` +-- + +DROP TABLE IF EXISTS `0_workorders`; +CREATE TABLE IF NOT EXISTS `0_workorders` ( + `id` int(11) NOT NULL auto_increment, + `wo_ref` varchar(60) NOT NULL default '', + `loc_code` varchar(5) NOT NULL default '', + `units_reqd` double NOT NULL default '1', + `stock_id` varchar(20) NOT NULL default '', + `date_` date NOT NULL default '0000-00-00', + `type` tinyint(4) NOT NULL default '0', + `required_by` date NOT NULL default '0000-00-00', + `released_date` date NOT NULL default '0000-00-00', + `units_issued` double NOT NULL default '0', + `closed` tinyint(1) NOT NULL default '0', + `released` tinyint(1) NOT NULL default '0', + `additional_costs` double NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `wo_ref` (`wo_ref`) +) TYPE=InnoDB; diff --git a/sql/en_US-demo.sql b/sql/en_US-demo.sql new file mode 100644 index 00000000..278f6b6e --- /dev/null +++ b/sql/en_US-demo.sql @@ -0,0 +1,925 @@ +-- phpMyAdmin SQL Dump +-- version 2.7.0-pl2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Created: 09 februar 2007 at 10:54 +-- Server Version: 4.1.11 +-- PHP-version: 4.4.1 +-- +-- Database: `en_US-demo` +-- + +-- +-- Data in table `areas` +-- + +INSERT INTO `0_areas` VALUES (1, 'USA'); +INSERT INTO `0_areas` VALUES (2, 'Far East'); +INSERT INTO `0_areas` VALUES (3, 'Africa'); +INSERT INTO `0_areas` VALUES (4, 'Europe'); + +-- +-- Data in table `bank_accounts` +-- + +INSERT INTO `0_bank_accounts` VALUES ('1700', 0, 'Current account', 'N/A', 'N/A', '', 'USD'); +INSERT INTO `0_bank_accounts` VALUES ('1705', 0, 'Petty Cash account', 'N/A', 'N/A', '', 'USD'); +INSERT INTO `0_bank_accounts` VALUES ('1710', 0, 'Saving account', '10001000', 'Saving Bank', '', 'GBP'); + +-- +-- Data in table `bank_trans` +-- + +INSERT INTO `0_bank_trans` VALUES (1, 12, 2, '1700', '111', '2006-01-18', 1, 5000, 0, 0, 2, 0x31); +INSERT INTO `0_bank_trans` VALUES (2, 12, 3, '1700', '112', '2006-01-18', 1, 240, 0, 0, 2, 0x32); +INSERT INTO `0_bank_trans` VALUES (3, 12, 4, '1700', '113', '2006-01-18', 1, 360, 0, 0, 2, 0x32); +INSERT INTO `0_bank_trans` VALUES (4, 12, 5, '1700', '114', '2006-01-18', 1, 500, 0, 0, 2, 0x31); +INSERT INTO `0_bank_trans` VALUES (5, 1, 2, '1700', '1', '2006-01-18', 1, -25, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (6, 1, 3, '1705', '2', '2006-01-18', 1, -250, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (7, 1, 4, '1700', '3', '2006-01-18', 1, -555, 0, 0, 4, 0x31); +INSERT INTO `0_bank_trans` VALUES (8, 4, 2, '1700', '4', '2006-01-18', 1, -300, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (9, 4, 2, '1710', '4', '2006-01-18', 1, 250, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (10, 22, 2, '1700', '1', '2006-01-18', 1, -5000, 0, 0, 3, 0x31); +INSERT INTO `0_bank_trans` VALUES (11, 22, 3, '1710', '2', '2006-01-18', 1, -3300, 0, 0, 3, 0x32); +INSERT INTO `0_bank_trans` VALUES (12, 2, 2, '1700', '11', '2006-01-20', 1, 1050, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (13, 12, 6, '1700', '115', '2007-01-30', 1, 200, 0, 0, 2, 0x31); +INSERT INTO `0_bank_trans` VALUES (14, 1, 5, '1700', '4', '2007-01-30', 1, -200, 0, 0, 4, 0x31); +INSERT INTO `0_bank_trans` VALUES (15, 2, 3, '1700', '12', '2007-01-30', 3, 70, 0, 0, 4, 0x32); +INSERT INTO `0_bank_trans` VALUES (16, 4, 3, '1700', '5', '2007-03-09', 1, -222, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (17, 4, 3, '1705', '5', '2007-03-09', 1, 222, 0, 0, 0, ''); +INSERT INTO `0_bank_trans` VALUES (18, 2, 4, '1700', '13', '2007-03-09', 3, 200, 0, 0, 2, 0x31); +INSERT INTO `0_bank_trans` VALUES (19, 1, 6, '1700', '5', '2007-03-22', 1, -200, 0, 0, 3, 0x31); +INSERT INTO `0_bank_trans` VALUES (20, 1, 7, '1700', '6', '2007-03-22', 1, -125, 0, 0, 0, 0x67796c6c657472616e73706f7274); + +-- +-- Data in table `bank_trans_types` +-- + +INSERT INTO `0_bank_trans_types` VALUES (1, 'Cash'); +INSERT INTO `0_bank_trans_types` VALUES (2, 'Cheque'); +INSERT INTO `0_bank_trans_types` VALUES (3, 'Transfer'); + +-- +-- Data in table `bom` +-- + +INSERT INTO `0_bom` VALUES (1, '3400', '102', '1', 'DEF', 1); +INSERT INTO `0_bom` VALUES (2, '3400', '103', '1', 'DEF', 1); +INSERT INTO `0_bom` VALUES (3, '3400', '104', '1', 'DEF', 1); +INSERT INTO `0_bom` VALUES (4, '3400', '201', '1', 'DEF', 1); + +-- +-- Data in table `chart_class` +-- + +INSERT INTO `0_chart_class` VALUES (1, 'Assets', 1); +INSERT INTO `0_chart_class` VALUES (2, 'Liabilities', 1); +INSERT INTO `0_chart_class` VALUES (3, 'Income', 0); +INSERT INTO `0_chart_class` VALUES (4, 'Costs', 0); +INSERT INTO `0_chart_class` VALUES (5, 'Gross', 0); + +-- +-- Data in table `chart_master` +-- + +INSERT INTO `0_chart_master` VALUES ('3000', '', 'Sales', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3010', '', 'Sales - Wholesale', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3020', '', 'Sales of Other items', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3400', '', 'Difference On Exchange', 1, 0); +INSERT INTO `0_chart_master` VALUES ('5000', '', 'Direct Labour', 2, 0); +INSERT INTO `0_chart_master` VALUES ('5050', '', 'Direct Labour Recovery', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4200', '', 'Material Usage Varaiance', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4210', '', 'Consumable Materials', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4220', '', 'Purchase price Variance', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4000', '', 'Purchases of materials', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4250', '', 'Discounts Received', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4260', '', 'Exchange Variation', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4300', '', 'Freight Inwards', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4010', '', 'Cost of Goods Sold - Retail', 2, 4); +INSERT INTO `0_chart_master` VALUES ('6790', '', 'Bank Charges', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6800', '', 'Entertainments', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6810', '', 'Legal Expenses', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6600', '', 'Repairs and Maintenance Office', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6730', '', 'phone', 5, 4); +INSERT INTO `0_chart_master` VALUES ('8200', '', 'Bank Interest', 52, 0); +INSERT INTO `0_chart_master` VALUES ('6840', '', 'Credit Control', 5, 0); +INSERT INTO `0_chart_master` VALUES ('7040', '', 'Depreciation Office Equipment', 51, 0); +INSERT INTO `0_chart_master` VALUES ('3800', '', 'Freight Outwards', 5, 4); +INSERT INTO `0_chart_master` VALUES ('4500', '', 'Packaging', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6400', '', 'Commissions', 5, 0); +INSERT INTO `0_chart_master` VALUES ('3200', '', 'Prompt Payment Discounts', 1, 0); +INSERT INTO `0_chart_master` VALUES ('6700', '', 'General Expenses', 5, 4); +INSERT INTO `0_chart_master` VALUES ('5200', '', 'Indirect Labour', 2, 0); +INSERT INTO `0_chart_master` VALUES ('5210', '', 'Overhead Recovery', 5, 0); +INSERT INTO `0_chart_master` VALUES ('1700', '', 'Bank account', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1705', '', 'Petty Cash', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1710', '', 'Foreign currency account', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1500', '', 'Accounts Receivable', 20, 0); +INSERT INTO `0_chart_master` VALUES ('1400', '', 'Stocks of Raw Materials', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1410', '', 'Stocks of Work In Progress', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1420', '', 'Stocks of Finsihed Goods', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1430', '', 'Goods Received Clearing account', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2630', '', 'Accounts Payable', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2660', '', 'VAT out 5', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2662', '', 'VAT out 1', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2664', '', 'VAT out 25', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2680', '', 'VAT In 5', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2682', '', 'VAT In 25', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2050', '', 'Retained Earnings', 50, 0); +INSERT INTO `0_chart_master` VALUES ('2000', '', 'Share Capital', 50, 0); + +-- +-- Data in table `chart_types` +-- + +INSERT INTO `0_chart_types` VALUES (1, 'Sales', 3, -1); +INSERT INTO `0_chart_types` VALUES (2, 'Cost of Sales', 4, -1); +INSERT INTO `0_chart_types` VALUES (5, 'Expenses', 4, -1); +INSERT INTO `0_chart_types` VALUES (10, 'Cash/Bank', 1, -1); +INSERT INTO `0_chart_types` VALUES (20, 'Accounts Receivable', 1, -1); +INSERT INTO `0_chart_types` VALUES (30, 'Accounts Payable', 2, -1); +INSERT INTO `0_chart_types` VALUES (40, 'Fixed Assets', 1, -1); +INSERT INTO `0_chart_types` VALUES (45, 'Inventory', 1, -1); +INSERT INTO `0_chart_types` VALUES (50, 'Equity', 2, -1); +INSERT INTO `0_chart_types` VALUES (51, 'Depreciations', 4, -1); +INSERT INTO `0_chart_types` VALUES (52, 'Financials', 4, -1); + +-- +-- Data in table `comments` +-- + +INSERT INTO `0_comments` VALUES (17, 2, '2006-01-18', 'initial balances'); +INSERT INTO `0_comments` VALUES (10, 6, '2007-01-30', 'Hi there you got it!'); +INSERT INTO `0_comments` VALUES (12, 6, '2007-01-30', 'This is good'); +INSERT INTO `0_comments` VALUES (1, 5, '2007-01-30', 'Totalgylle'); +INSERT INTO `0_comments` VALUES (40, 2, '0000-00-00', 'Gylle projevt'); +INSERT INTO `0_comments` VALUES (0, 6, '2007-02-02', 'A big memo'); +INSERT INTO `0_comments` VALUES (10, 7, '2007-02-03', 'Another big memo, which looks good.'); +INSERT INTO `0_comments` VALUES (4, 3, '2007-03-09', 'A little cash up front.'); + +-- +-- Data in table `company` +-- + +INSERT INTO `0_company` VALUES (1, 'Drill Company Inc.', '987654321', '123123123', 1, 1, 'N/A', '202-122320', '202-18889123', 'delta@delta.com', 'logo_frontaccounting.jpg', 'DownTown', 'USD', '1500', '4250', '2630', '1430', '4260', '4220', '2050', '3800', '3000', '3000', '3200', '1420', '4010', '4210', '3000', '1410', '5000', '', '', '', '', '', '', 0, 10, 10, 1000, 20, 20, 30, 1, 2); + +-- +-- Data in table `credit_status` +-- + +INSERT INTO `0_credit_status` VALUES (1, 'Good History', 0); +INSERT INTO `0_credit_status` VALUES (3, 'No more work until payment received', 1); +INSERT INTO `0_credit_status` VALUES (4, 'In liquidation', 1); + +-- +-- Data in table `currencies` +-- + +INSERT INTO `0_currencies` VALUES ('Kronor', 'SEK', 'kr', 'Sweden', '?ren'); +INSERT INTO `0_currencies` VALUES ('Kroner', 'DKK', 'kr.', 'Denmark', '?re'); +INSERT INTO `0_currencies` VALUES ('Euro', 'EUR', '?', 'Europe', 'Cents'); +INSERT INTO `0_currencies` VALUES ('Pounds', 'GBP', '?', 'England', 'Pence'); +INSERT INTO `0_currencies` VALUES ('US Dollars', 'USD', '$', 'United States', 'Cents'); + +-- +-- Data in table `cust_allocations` +-- + +INSERT INTO `0_cust_allocations` VALUES (1, 200, '2007-01-30', 6, 12, 6, 10); +INSERT INTO `0_cust_allocations` VALUES (4, 133, '2007-03-09', 4, 2, 6, 10); + +-- +-- Data in table `cust_branch` +-- + +INSERT INTO `0_cust_branch` VALUES (1, 1, 'Main', '', 1, 1, '', '', 'Lucky Luke Inc.', 'joe@frontaccounting.com', 'DEF', 2, '3000', '3000', '1500', '3200', 1, 0, 'The Road'); +INSERT INTO `0_cust_branch` VALUES (2, 1, 'Branch 2', '', 1, 1, '', '', '', '', 'DEF', 3, '3000', '3000', '1500', '3200', 1, 0, 'Another Road'); +INSERT INTO `0_cust_branch` VALUES (3, 2, 'Main', '', 1, 1, '', '', 'Money Makers Ltd.', '', 'DEF', 3, '3000', '3000', '1500', '3200', 1, 0, ''); +INSERT INTO `0_cust_branch` VALUES (4, 2, 'Main', '', 1, 1, '', '', 'Money Makers Ltd.', '', 'DEF', 3, '3000', '3000', '1500', '3200', 1, 0, 'UK,UK'); + +-- +-- Data in table `debtor_trans` +-- + +INSERT INTO `0_debtor_trans` VALUES (2, 10, 1, 1, '2006-01-18', '2006-01-18', '1', 1, 1, 1750, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (2, 11, 2, 3, '2006-01-18', '0000-00-00', '33', 1, 0, -1050, 0, 0, 0, 0, 1.2, 1); +INSERT INTO `0_debtor_trans` VALUES (2, 12, 1, 1, '2006-01-18', '0000-00-00', '111', 0, 0, -10000, 0, 0, 0, 0, 1, 0); +INSERT INTO `0_debtor_trans` VALUES (3, 10, 1, 1, '2006-01-18', '2006-01-18', '2', 1, 1, 1000, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (3, 12, 2, 3, '2006-01-18', '0000-00-00', '112', 0, 0, -200, 0, 0, 0, 0, 1.2, 0); +INSERT INTO `0_debtor_trans` VALUES (4, 2, 1, 1, '2007-03-09', '0000-00-00', '13', 0, 0, -200, 0, 0, 0, 133, 1, 0); +INSERT INTO `0_debtor_trans` VALUES (4, 10, 2, 3, '2006-01-18', '2006-01-18', '3', 1, 2, 1057.14285714, 52.8571428571, 0, 0, 0, 1.2, 1); +INSERT INTO `0_debtor_trans` VALUES (4, 12, 2, 3, '2006-01-18', '0000-00-00', '113', 0, 0, -300, 0, 0, 0, 0, 1.2, 0); +INSERT INTO `0_debtor_trans` VALUES (5, 10, 1, 1, '2007-01-28', '2007-01-28', '4', 1, 1, 93050, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (5, 12, 1, 1, '2006-01-18', '0000-00-00', '114', 0, 0, -500, 0, 0, 0, 0, 1, 0); +INSERT INTO `0_debtor_trans` VALUES (6, 10, 1, 1, '2007-01-30', '2007-01-30', '5', 1, 3, 333, 0, 0, 0, 333, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (6, 12, 1, 1, '2007-01-30', '0000-00-00', '115', 0, 0, -200, 0, 0, 0, 200, 1, 0); +INSERT INTO `0_debtor_trans` VALUES (7, 10, 1, 1, '2007-02-03', '2007-02-03', '6', 1, 4, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (8, 10, 1, 1, '2007-02-03', '2007-02-03', '7', 1, 5, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (9, 10, 2, 3, '2007-02-03', '2007-02-03', '8', 1, 6, 2857.1428571429, 142.85714285714, 0, 0, 0, 1.2, 1); +INSERT INTO `0_debtor_trans` VALUES (10, 10, 1, 1, '2007-02-04', '2007-02-04', '9', 1, 9, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (11, 10, 1, 1, '2007-02-04', '2007-03-22', '10', 1, 10, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (12, 10, 1, 1, '2007-02-06', '2007-03-22', '11', 1, 11, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (13, 10, 1, 1, '2007-02-25', '2007-03-22', '12', 1, 12, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (14, 10, 1, 1, '2007-03-04', '2007-03-22', '13', 1, 13, 333, 0, 0, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (15, 10, 1, 1, '2007-03-05', '2007-03-22', '14', 1, 14, 333, 0, 25, 0, 0, 1, 1); +INSERT INTO `0_debtor_trans` VALUES (16, 10, 1, 1, '2007-03-05', '2007-03-22', '15', 1, 15, 3000, 0, 44, 0, 0, 1, 1); + +-- +-- Data in table `debtor_trans_details` +-- + +INSERT INTO `0_debtor_trans_details` VALUES (1, 2, 10, '102', '17 inch VGA Monitor', 250, 0, -2, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (2, 2, 10, '103', '32MB VGA Card', 3000, 0, -10, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (3, 2, 10, '104', '52x CD Drive', 50, 0, -5, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (4, 3, 10, '103', '32MB VGA Card', 3000, 0, -10, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (5, 2, 11, '102', '17 inch VGA Monitor', 210, 0, 5, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (6, 4, 10, '102', '17 inch VGA Monitor', 211.428571429, 10.5714285714, -5, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (7, 5, 10, '102', '17 inch VGA Monitor', 250, 0, -8, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (8, 5, 10, '103', '32MB VGA Card', 3000, 0, -30, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (9, 5, 10, '104', '52x CD Drive', 50, 0, -21, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (10, 6, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (11, 7, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (12, 8, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (13, 9, 10, '3400', 'P4 Business System', 2857.1428571429, 142.85714285714, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (14, 10, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (15, 11, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (16, 12, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (17, 13, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (18, 14, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (19, 15, 10, '102', '17 inch VGA Monitor', 333, 0, -1, 0, 0); +INSERT INTO `0_debtor_trans_details` VALUES (20, 16, 10, '103', '32MB VGA Card', 3000, 0, -1, 0, 0); + +-- +-- Data in table `debtor_trans_tax_details` +-- + +INSERT INTO `0_debtor_trans_tax_details` VALUES (1, 4, 10, 1, NULL, 5, 1, 52.8571428571); +INSERT INTO `0_debtor_trans_tax_details` VALUES (2, 9, 10, 1, NULL, 5, 1, 142.85714285714); + +-- +-- Data in table `debtors_master` +-- + +INSERT INTO `0_debtors_master` VALUES (1, 'Lucky Luke Inc.', '35 Waldorf Street\r\nTown 19358, AR', 'joe@frontaccounting.com', '12311231', 'USD', 1, 0, 0, 1, 1, 0, 0, 1000); +INSERT INTO `0_debtors_master` VALUES (2, 'Money Makers Ltd.', 'N/A', '', '9876543', 'GBP', 1, 0, 0, 1, 1, 0, 0, 1000); +INSERT INTO `0_debtors_master` VALUES (3, 'Junk Beer ApS', 'N/A', '', '123321123', 'DKK', 1, 0, 0, 1, 1, 0, 0, 1000); + +-- +-- Data in table `dimensions` +-- + +INSERT INTO `0_dimensions` VALUES (1, '1', 'Development', 1, 0, '2006-01-18', '2006-02-07'); +INSERT INTO `0_dimensions` VALUES (2, '2', 'Support', 1, 0, '2006-01-18', '2007-03-07'); +INSERT INTO `0_dimensions` VALUES (3, '3', 'Training', 2, 0, '2006-01-18', '2007-03-07'); + +-- +-- Data in table `exchange_rates` +-- + +INSERT INTO `0_exchange_rates` VALUES (1, 'LE', 0.149, 0.149, '2006-01-18'); +INSERT INTO `0_exchange_rates` VALUES (2, 'GBP', 1.2, 1.2, '2006-01-18'); +INSERT INTO `0_exchange_rates` VALUES (3, 'SEK', 0.1667, 0.1667, '2007-01-29'); +INSERT INTO `0_exchange_rates` VALUES (4, 'DKK', 0.2, 0.2, '2007-03-05'); +INSERT INTO `0_exchange_rates` VALUES (5, 'EUR', 1.1, 1.1, '2007-03-05'); + +-- +-- Data in table `fiscal_year` +-- + +INSERT INTO `0_fiscal_year` VALUES (1, '2006-01-01', '2006-12-31', 0); +INSERT INTO `0_fiscal_year` VALUES (2, '2007-01-01', '2007-12-31', 0); +INSERT INTO `0_fiscal_year` VALUES (5, '2005-01-01', '2005-12-31', 1); + +-- +-- Data in table `form_items` +-- + +INSERT INTO `0_form_items` VALUES (1, 10, 10, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 11, 11, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 18, 18, 1, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 26, 26, 1, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 30, 30, 1, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 50, 1, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 51, 12, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (1, 60, 16, 2, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (1, 61, 17, 2, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (1, 62, 11, 2, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (2, 10, 10, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 18, 18, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 26, 26, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 30, 30, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 50, 1, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 51, 12, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (2, 60, 10, 2, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (2, 61, 16, 2, 'CWA', NULL); +INSERT INTO `0_form_items` VALUES (3, 10, 10, 4, '', NULL); +INSERT INTO `0_form_items` VALUES (3, 18, 18, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (3, 26, 26, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (3, 30, 30, 3, '', ''); +INSERT INTO `0_form_items` VALUES (3, 50, 1, 4, '', NULL); +INSERT INTO `0_form_items` VALUES (3, 51, 12, 4, '', NULL); +INSERT INTO `0_form_items` VALUES (3, 60, 10, 3, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (3, 61, 25, 1, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (4, 10, 10, 5, '', ''); +INSERT INTO `0_form_items` VALUES (4, 18, 18, 4, '', NULL); +INSERT INTO `0_form_items` VALUES (4, 26, 26, 4, '', ''); +INSERT INTO `0_form_items` VALUES (4, 30, 30, 4, '', ''); +INSERT INTO `0_form_items` VALUES (4, 50, 4, 2, '1700', NULL); +INSERT INTO `0_form_items` VALUES (4, 51, 12, 5, '', NULL); +INSERT INTO `0_form_items` VALUES (4, 60, 10, 4, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (4, 61, 25, 2, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (5, 10, 10, 6, '', ''); +INSERT INTO `0_form_items` VALUES (5, 18, 18, 5, '', NULL); +INSERT INTO `0_form_items` VALUES (5, 26, 26, 5, '', ''); +INSERT INTO `0_form_items` VALUES (5, 30, 30, 5, '', ''); +INSERT INTO `0_form_items` VALUES (5, 50, 22, 2, '', NULL); +INSERT INTO `0_form_items` VALUES (5, 51, 4, 2, '1710', NULL); +INSERT INTO `0_form_items` VALUES (5, 60, 28, 1, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (5, 61, 25, 3, 'DEF', NULL); +INSERT INTO `0_form_items` VALUES (6, 10, 10, 7, '', ''); +INSERT INTO `0_form_items` VALUES (6, 30, 30, 6, '', ''); +INSERT INTO `0_form_items` VALUES (6, 50, 22, 3, '', NULL); +INSERT INTO `0_form_items` VALUES (6, 51, 2, 2, '0', 'mr. mgoo'); +INSERT INTO `0_form_items` VALUES (6, 60, 10, 5, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (6, 61, 29, 1, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (7, 10, 10, 8, '', ''); +INSERT INTO `0_form_items` VALUES (7, 30, 30, 7, '', ''); +INSERT INTO `0_form_items` VALUES (7, 50, 1, 5, '4', '1'); +INSERT INTO `0_form_items` VALUES (7, 51, 12, 6, '2', '1'); +INSERT INTO `0_form_items` VALUES (7, 60, 10, 6, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (7, 61, 29, 2, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (8, 10, 10, 9, '', ''); +INSERT INTO `0_form_items` VALUES (8, 30, 30, 8, '', ''); +INSERT INTO `0_form_items` VALUES (8, 50, 4, 3, '1700', '1705'); +INSERT INTO `0_form_items` VALUES (8, 51, 2, 3, '4', '2'); +INSERT INTO `0_form_items` VALUES (8, 60, 10, 7, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (9, 10, 10, 10, '', ''); +INSERT INTO `0_form_items` VALUES (9, 30, 30, 9, '', ''); +INSERT INTO `0_form_items` VALUES (9, 50, 1, 6, '3', '1'); +INSERT INTO `0_form_items` VALUES (9, 51, 4, 3, '1705', '1700'); +INSERT INTO `0_form_items` VALUES (9, 60, 10, 8, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (10, 10, 10, 11, '', ''); +INSERT INTO `0_form_items` VALUES (10, 30, 30, 10, '', ''); +INSERT INTO `0_form_items` VALUES (10, 50, 1, 7, '0', 'gylle transport'); +INSERT INTO `0_form_items` VALUES (10, 51, 2, 4, '2', '1'); +INSERT INTO `0_form_items` VALUES (10, 60, 10, 9, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (11, 10, 10, 12, '', ''); +INSERT INTO `0_form_items` VALUES (11, 30, 30, 11, '', ''); +INSERT INTO `0_form_items` VALUES (11, 60, 10, 10, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (12, 10, 10, 13, '', ''); +INSERT INTO `0_form_items` VALUES (12, 30, 30, 12, '', ''); +INSERT INTO `0_form_items` VALUES (12, 60, 10, 11, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (13, 10, 10, 14, '', ''); +INSERT INTO `0_form_items` VALUES (13, 30, 30, 13, '', ''); +INSERT INTO `0_form_items` VALUES (13, 60, 10, 12, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (14, 10, 10, 15, '', ''); +INSERT INTO `0_form_items` VALUES (14, 30, 30, 14, '', ''); +INSERT INTO `0_form_items` VALUES (14, 60, 10, 13, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (15, 10, 10, 16, '', ''); +INSERT INTO `0_form_items` VALUES (15, 30, 30, 15, '', ''); +INSERT INTO `0_form_items` VALUES (15, 60, 10, 14, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (16, 60, 10, 15, 'DEF', ''); +INSERT INTO `0_form_items` VALUES (17, 60, 10, 16, 'DEF', ''); + +-- +-- Data in table `gl_trans` +-- + +INSERT INTO `0_gl_trans` VALUES (1, 10, 2, '2006-01-18', '3000', '', -500, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (2, 10, 2, '2006-01-18', '3000', '', -1000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (3, 10, 2, '2006-01-18', '3000', '', -250, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (4, 10, 2, '2006-01-18', '1500', '', 1750, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (5, 10, 3, '2006-01-18', '3000', '', -1000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (6, 10, 3, '2006-01-18', '1500', '', 1000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (7, 12, 2, '2006-01-18', '1700', '', 5000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (8, 12, 2, '2006-01-18', '1500', '', -10000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (9, 12, 3, '2006-01-18', '1700', '', 240, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (10, 12, 3, '2006-01-18', '1500', '', -240, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (11, 12, 4, '2006-01-18', '1700', '', 360, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (12, 12, 4, '2006-01-18', '1500', '', -360, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (13, 12, 5, '2006-01-18', '1700', '', 500, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (14, 12, 5, '2006-01-18', '1500', '', -500, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (15, 11, 2, '2006-01-18', '3000', '', 1260, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (16, 11, 2, '2006-01-18', '1500', '', -1260, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (17, 10, 4, '2006-01-18', '3000', '', -1268.57142857, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (18, 10, 4, '2006-01-18', '1500', '', 1332, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (19, 10, 4, '2006-01-18', '2660', '', -63.4285714286, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (20, 1, 2, '2006-01-18', '1700', '', -25, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (21, 1, 2, '2006-01-18', '6600', '', 10, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (22, 1, 2, '2006-01-18', '6730', '', 15, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (23, 1, 3, '2006-01-18', '1705', '', -250, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (24, 1, 3, '2006-01-18', '6810', '', 3000, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (25, 1, 3, '2006-01-18', '6700', '', 150, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (26, 1, 4, '2006-01-18', '1700', '', -555, 0, 0, 4, 0x31); +INSERT INTO `0_gl_trans` VALUES (27, 1, 4, '2006-01-18', '4500', '', 555, 0, 0, 4, 0x31); +INSERT INTO `0_gl_trans` VALUES (28, 4, 2, '2006-01-18', '1700', '', -300, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (29, 4, 2, '2006-01-18', '1710', '', 300, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (30, 22, 2, '2006-01-18', '2630', '', 5000, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (31, 22, 2, '2006-01-18', '1700', '', -5000, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (32, 22, 3, '2006-01-18', '2630', '', 3960, 0, 0, 3, 0x32); +INSERT INTO `0_gl_trans` VALUES (33, 22, 3, '2006-01-18', '1710', '', -3960, 0, 0, 3, 0x32); +INSERT INTO `0_gl_trans` VALUES (34, 20, 2, '2006-01-18', '2630', '', -3445, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (35, 20, 2, '2006-01-18', '1420', '', 1000, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (36, 20, 2, '2006-01-18', '1420', '', 2250, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (37, 20, 2, '2006-01-18', '2660', '', 162.5, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (38, 20, 2, '2006-01-18', '2660', '', 32.5, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (39, 20, 3, '2006-01-18', '2630', '', -26, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (40, 20, 3, '2006-01-18', '1420', '', 26, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (41, 2, 2, '2006-01-20', '1700', '', 1050, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (42, 2, 2, '2006-01-20', '4500', '', -1000, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (43, 2, 2, '2006-01-20', '6400', '', -50, 0, 0, 0, NULL); +INSERT INTO `0_gl_trans` VALUES (44, 10, 5, '2007-01-28', '3000', '', -2000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (45, 10, 5, '2007-01-28', '3000', '', -90000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (46, 10, 5, '2007-01-28', '3000', '', -1050, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (47, 10, 5, '2007-01-28', '1500', '', 93050, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (48, 10, 6, '2007-01-30', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (49, 10, 6, '2007-01-30', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (50, 12, 6, '2007-01-30', '1700', '', 200, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (51, 12, 6, '2007-01-30', '1500', '', -200, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (52, 1, 5, '2007-01-30', '1700', '', -200, 0, 0, 4, 0x31); +INSERT INTO `0_gl_trans` VALUES (53, 1, 5, '2007-01-30', '1400', 'Gylle', 200, 0, 0, 4, 0x31); +INSERT INTO `0_gl_trans` VALUES (54, 2, 3, '2007-01-30', '1700', '', 70, 0, 0, 4, 0x32); +INSERT INTO `0_gl_trans` VALUES (55, 2, 3, '2007-01-30', '4500', 'Packing', -50, 0, 0, 4, 0x32); +INSERT INTO `0_gl_trans` VALUES (56, 2, 3, '2007-01-30', '6400', '', -20, 0, 0, 4, 0x32); +INSERT INTO `0_gl_trans` VALUES (57, 20, 4, '2007-01-30', '2630', '', -17350, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (58, 20, 4, '2007-01-30', '1420', '', 15100, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (59, 20, 4, '2007-01-30', '1420', '', 2250, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (60, 0, 2, '2007-02-02', '3000', 'nana', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (61, 0, 2, '2007-02-02', '4010', 'jojo', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (62, 0, 3, '2007-02-02', '3000', '', -25, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (63, 0, 3, '2007-02-02', '4000', '', 25, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (64, 0, 4, '2007-03-01', '3000', '', 25, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (65, 0, 4, '2007-03-01', '4000', '', -25, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (66, 0, 5, '2007-02-02', '3000', '', -50, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (67, 0, 5, '2007-02-02', '4000', '', 50, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (68, 0, 6, '2007-02-02', '3020', 'Til Ejnar', -400, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (69, 0, 6, '2007-02-02', '1500', 'Opdate forrige linje', 400, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (70, 20, 5, '2007-02-03', '2630', '', -6644, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (71, 20, 5, '2007-02-03', '1420', '', 6644, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (72, 10, 7, '2007-02-03', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (73, 10, 7, '2007-02-03', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (74, 10, 8, '2007-02-03', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (75, 10, 8, '2007-02-03', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (76, 10, 9, '2007-02-03', '3000', '', -3428.5714285714, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (77, 10, 9, '2007-02-03', '1500', '', 3600, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (78, 10, 9, '2007-02-03', '2660', '', -171.42857142857, 0, 0, 2, 0x32); +INSERT INTO `0_gl_trans` VALUES (79, 10, 10, '2007-02-04', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (80, 10, 10, '2007-02-04', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (81, 10, 11, '2007-02-04', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (82, 10, 11, '2007-02-04', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (83, 10, 12, '2007-02-06', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (84, 10, 12, '2007-02-06', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (85, 0, 7, '2007-02-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (86, 0, 7, '2007-02-06', '1500', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (87, 0, 8, '2007-02-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (88, 0, 8, '2007-02-06', '2000', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (89, 0, 9, '2006-04-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (90, 0, 9, '2006-04-06', '2000', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (91, 0, 10, '2007-02-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (92, 0, 10, '2007-02-06', '2050', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (93, 0, 11, '2006-04-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (94, 0, 11, '2006-04-06', '3000', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (95, 0, 12, '2007-02-06', '1400', '', 100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (96, 0, 12, '2007-02-06', '3000', '', -100, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (97, 0, 13, '2007-02-13', '1400', '', 10, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (98, 0, 13, '2007-02-13', '1400', '', -10, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (99, 10, 13, '2007-02-25', '3000', '', -333, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (100, 10, 13, '2007-02-25', '1500', '', 333, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (101, 0, 14, '2007-02-25', '1400', '', 10, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (102, 0, 14, '2007-02-25', '3000', '', -10, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (103, 0, 15, '2007-03-02', '1400', '', 10, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (104, 0, 15, '2007-03-02', '1400', '', -10, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (105, 0, 16, '2007-03-02', '3000', '', 100, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (106, 0, 16, '2007-03-02', '1430', '', -100, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (107, 10, 14, '2007-03-04', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (108, 10, 14, '2007-03-04', '1500', '', 333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (109, 10, 15, '2007-03-05', '3000', '', -333, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (110, 10, 15, '2007-03-05', '1500', '', 358, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (111, 10, 15, '2007-03-05', '3800', '', -25, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (112, 10, 16, '2007-03-05', '3000', '', -3000, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (113, 10, 16, '2007-03-05', '1500', '', 3044, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (114, 10, 16, '2007-03-05', '3800', '', -44, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (115, 20, 6, '2007-03-05', '2630', '', -33.34, 0, 0, 3, 0x33); +INSERT INTO `0_gl_trans` VALUES (116, 20, 6, '2007-03-05', '6730', '', 33.34, 1, 0, 3, 0x33); +INSERT INTO `0_gl_trans` VALUES (117, 4, 3, '2007-03-09', '1700', '', -222, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (118, 4, 3, '2007-03-09', '1705', '', 222, 0, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (119, 2, 4, '2007-03-09', '1700', '', 200, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (120, 2, 4, '2007-03-09', '1400', '', -200, 0, 0, 2, 0x31); +INSERT INTO `0_gl_trans` VALUES (121, 1, 6, '2007-03-22', '1700', '', -200, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (122, 1, 6, '2007-03-22', '2630', '', 200, 0, 0, 3, 0x31); +INSERT INTO `0_gl_trans` VALUES (123, 1, 7, '2007-03-22', '1700', '', -125, 0, 0, 0, 0x67796c6c657472616e73706f7274); +INSERT INTO `0_gl_trans` VALUES (124, 1, 7, '2007-03-22', '6700', '', 100, 0, 0, 0, 0x67796c6c657472616e73706f7274); +INSERT INTO `0_gl_trans` VALUES (125, 1, 7, '2007-03-22', '2682', '', 25, 0, 0, 0, 0x67796c6c657472616e73706f7274); +INSERT INTO `0_gl_trans` VALUES (126, 0, 17, '2007-03-25', '3000', '', -300, 1, 0, NULL, NULL); +INSERT INTO `0_gl_trans` VALUES (127, 0, 17, '2007-03-25', '4200', '', 300, 0, 0, NULL, NULL); + +-- +-- Data in table `grn_batch` +-- + +INSERT INTO `0_grn_batch` VALUES (1, 1, 1, '1', '2006-01-18', 'DEF'); +INSERT INTO `0_grn_batch` VALUES (2, 1, 2, '2', '2006-01-18', 'DEF'); +INSERT INTO `0_grn_batch` VALUES (3, 1, 5, '3', '2006-01-18', 'DEF'); + +-- +-- Data in table `grn_items` +-- + +INSERT INTO `0_grn_items` VALUES (1, 1, 1, '102', '17 inch VGA Monitor', 10, 10); +INSERT INTO `0_grn_items` VALUES (2, 1, 2, '103', '32MB VGA Card', 50, 50); +INSERT INTO `0_grn_items` VALUES (3, 2, 3, '104', '52x CD Drive', 1, 1); +INSERT INTO `0_grn_items` VALUES (4, 3, 6, '104', '52x CD Drive (upgraded)', 3020, 302); + +-- +-- Data in table `item_tax_types` +-- + +INSERT INTO `0_item_tax_types` VALUES (1, 'Regular', 0); + +-- +-- Data in table `loc_stock` +-- + +INSERT INTO `0_loc_stock` VALUES ('CWA', '102', 0); +INSERT INTO `0_loc_stock` VALUES ('CWA', '103', 0); +INSERT INTO `0_loc_stock` VALUES ('CWA', '104', 0); +INSERT INTO `0_loc_stock` VALUES ('CWA', '201', 0); +INSERT INTO `0_loc_stock` VALUES ('CWA', '3400', 0); +INSERT INTO `0_loc_stock` VALUES ('DEF', '102', 0); +INSERT INTO `0_loc_stock` VALUES ('DEF', '103', 0); +INSERT INTO `0_loc_stock` VALUES ('DEF', '104', 0); +INSERT INTO `0_loc_stock` VALUES ('DEF', '201', 0); +INSERT INTO `0_loc_stock` VALUES ('DEF', '3400', 0); + +-- +-- Data in table `locations` +-- + +INSERT INTO `0_locations` VALUES ('DEF', 'Default', 'N/A', '', '', '', ''); +INSERT INTO `0_locations` VALUES ('CWA', 'Cool Warehouse', '', '', '', '', ''); + +-- +-- Data in table `movement_types` +-- + +INSERT INTO `0_movement_types` VALUES (1, 'Adjustment'); + +-- +-- Data in table `payment_terms` +-- + +INSERT INTO `0_payment_terms` VALUES (1, 'Due 15th Of the Following Month', 0, 17); +INSERT INTO `0_payment_terms` VALUES (2, 'Due By End Of The Following Month', 0, 30); +INSERT INTO `0_payment_terms` VALUES (3, 'Payment due within 10 days', 10, 0); +INSERT INTO `0_payment_terms` VALUES (4, 'Cash Only', 1, 0); + +-- +-- Data in table `prices` +-- + +INSERT INTO `0_prices` VALUES (1, '102', 1, 'USD', 333); +INSERT INTO `0_prices` VALUES (2, '103', 1, 'USD', 3000); +INSERT INTO `0_prices` VALUES (3, '104', 1, 'USD', 34); +INSERT INTO `0_prices` VALUES (4, '201', 1, 'USD', 40); +INSERT INTO `0_prices` VALUES (5, '3400', 1, 'USD', 600); + +-- +-- Data in table `purch_order_details` +-- + +INSERT INTO `0_purch_order_details` VALUES (1, 1, '102', '17 inch VGA Monitor', '2006-01-28', 10, 3020, 3020, 0, 3000, 10); +INSERT INTO `0_purch_order_details` VALUES (2, 1, '103', '32MB VGA Card', '2006-01-28', 50, 90, 90, 0, 300, 50); +INSERT INTO `0_purch_order_details` VALUES (3, 2, '104', '52x CD Drive', '2006-01-28', 1, 26, 26, 0, 1, 1); +INSERT INTO `0_purch_order_details` VALUES (4, 3, '104', '52x CD Drive', '2006-01-28', 0, 22, 0, 0, 1, 0); +INSERT INTO `0_purch_order_details` VALUES (6, 5, '104', '52x CD Drive', '2006-01-28', 302, 22, 22, 0, 330, 3020); + +-- +-- Data in table `purch_orders` +-- + +INSERT INTO `0_purch_orders` VALUES (1, 1, '', '2006-01-18', '3', '333', 'DEF', 'N/A'); +INSERT INTO `0_purch_orders` VALUES (2, 1, '', '2006-01-18', '4', '44', 'DEF', 'N/A'); +INSERT INTO `0_purch_orders` VALUES (3, 1, '', '2006-01-18', '5', '', 'DEF', 'N/A'); +INSERT INTO `0_purch_orders` VALUES (5, 1, '', '2006-01-18', '7', '', 'DEF', 'N/A'); + +-- +-- Data in table `refs` +-- + +INSERT INTO `0_refs` VALUES (2, 0, 'Joe'); +INSERT INTO `0_refs` VALUES (3, 0, '19'); +INSERT INTO `0_refs` VALUES (4, 0, '19'); +INSERT INTO `0_refs` VALUES (5, 0, '20'); +INSERT INTO `0_refs` VALUES (6, 0, '21'); +INSERT INTO `0_refs` VALUES (7, 0, '22'); +INSERT INTO `0_refs` VALUES (8, 0, '23'); +INSERT INTO `0_refs` VALUES (9, 0, '24'); +INSERT INTO `0_refs` VALUES (10, 0, '25'); +INSERT INTO `0_refs` VALUES (11, 0, '26'); +INSERT INTO `0_refs` VALUES (12, 0, '27'); +INSERT INTO `0_refs` VALUES (13, 0, '28'); +INSERT INTO `0_refs` VALUES (14, 0, '29'); +INSERT INTO `0_refs` VALUES (15, 0, '30'); +INSERT INTO `0_refs` VALUES (16, 0, '31'); +INSERT INTO `0_refs` VALUES (17, 0, '32'); + +-- +-- Data in table `sales_order_details` +-- + +INSERT INTO `0_sales_order_details` VALUES (1, '102', '17 inch VGA Monitor', 10, 250, 10, 0); +INSERT INTO `0_sales_order_details` VALUES (1, '103', '32MB VGA Card', 50, 3000, 50, 0); +INSERT INTO `0_sales_order_details` VALUES (1, '104', '52x CD Drive', 26, 50, 26, 0); +INSERT INTO `0_sales_order_details` VALUES (2, '102', '17 inch VGA Monitor', 5, 222, 25, 0); +INSERT INTO `0_sales_order_details` VALUES (3, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (4, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (5, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (6, '3400', 'P4 Business System', 1, 3000, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (7, '102', '17 inch VGA Monitor', 0, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (8, '102', '17 inch VGA Monitor', 0, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (9, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (10, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (11, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (12, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (13, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (14, '102', '17 inch VGA Monitor', 1, 333, 1, 0); +INSERT INTO `0_sales_order_details` VALUES (15, '103', '32MB VGA Card', 1, 3000, 1, 0); + +-- +-- Data in table `sales_orders` +-- + +INSERT INTO `0_sales_orders` VALUES (1, 1, 1, '', '', '2006-01-18', 1, 1, 'The same', '', '', 'Main', 0, 'DEF', '2006-01-18'); +INSERT INTO `0_sales_orders` VALUES (2, 2, 3, '', '', '2006-01-18', 1, 1, 'His Addy', '', '', 'Main', 0, 'DEF', '2006-01-18'); +INSERT INTO `0_sales_orders` VALUES (3, 1, 1, 'Oops', 'This is a lot of stuff.', '2007-01-30', 1, 1, 'The Road\r\n333 33 Downtown', '040-365045', '', 'Main', 0, 'DEF', '2007-01-30'); +INSERT INTO `0_sales_orders` VALUES (4, 1, 1, '', '', '2007-02-03', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-03'); +INSERT INTO `0_sales_orders` VALUES (5, 1, 1, '', '', '2007-02-03', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-03'); +INSERT INTO `0_sales_orders` VALUES (6, 2, 3, '', '', '2007-02-03', 1, 1, 'Street', '', '', 'Main', 0, 'DEF', '2007-02-03'); +INSERT INTO `0_sales_orders` VALUES (7, 1, 1, '', '', '2007-02-03', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-03'); +INSERT INTO `0_sales_orders` VALUES (8, 1, 1, '', '', '2007-02-03', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-03'); +INSERT INTO `0_sales_orders` VALUES (9, 1, 1, '', '', '2007-02-04', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-04'); +INSERT INTO `0_sales_orders` VALUES (10, 1, 1, '', '', '2007-02-04', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-04'); +INSERT INTO `0_sales_orders` VALUES (11, 1, 1, '', '', '2007-02-06', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-06'); +INSERT INTO `0_sales_orders` VALUES (12, 1, 1, '', '', '2007-02-25', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-02-25'); +INSERT INTO `0_sales_orders` VALUES (13, 1, 1, '', '', '2007-03-04', 1, 1, 'The Road', '', '', 'Main', 0, 'DEF', '2007-03-04'); +INSERT INTO `0_sales_orders` VALUES (14, 1, 1, '', '', '2007-03-05', 1, 1, 'The Road', '', '', 'Main', 25, 'DEF', '2007-03-05'); +INSERT INTO `0_sales_orders` VALUES (15, 1, 1, '', '', '2007-03-05', 1, 1, 'The Road', '', '', 'Main', 44, 'DEF', '2007-03-05'); + +-- +-- Data in table `sales_types` +-- + +INSERT INTO `0_sales_types` VALUES (1, 'Retail'); +INSERT INTO `0_sales_types` VALUES (2, 'Wholesale'); + +-- +-- Data in table `salesman` +-- + +INSERT INTO `0_salesman` VALUES (1, 'Sparc Menser', '', '', ''); +INSERT INTO `0_salesman` VALUES (2, 'Joe Hunt', '', '', ''); + +-- +-- Data in table `shippers` +-- + +INSERT INTO `0_shippers` VALUES (1, 'UPS', '', '', ''); +INSERT INTO `0_shippers` VALUES (2, 'Internet', '', '', ''); + +-- +-- Data in table `stock_category` +-- + +INSERT INTO `0_stock_category` VALUES (1, 'Components', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (2, 'Charges', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (3, 'Systems', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (4, 'Services', NULL, NULL, NULL, NULL); + +-- +-- Data in table `stock_master` +-- + +INSERT INTO `0_stock_master` VALUES ('102', 1, 1, '17 inch VGA Monitor', '', 'each', 'B', '3000', '4010', '1420', '4210', '0', NULL, NULL, 0, 0, 0, 0, 0); +INSERT INTO `0_stock_master` VALUES ('103', 1, 1, '32MB VGA Card', '', 'each', 'B', '3000', '4010', '1420', '4210', '0', NULL, NULL, 0, 0, 0, 0, 0); +INSERT INTO `0_stock_master` VALUES ('104', 1, 1, '52x CD Drive', '', 'each', 'B', '3000', '4010', '1420', '4210', '0', NULL, NULL, 0, 0, 0, 0, 0); +INSERT INTO `0_stock_master` VALUES ('201', 2, 1, 'Assembly Labour', '', 'each', 'D', '3000', '4010', '1420', '4210', '0', NULL, NULL, 0, 0, 0, 0, 0); +INSERT INTO `0_stock_master` VALUES ('3400', 3, 1, 'P4 Business System', '', 'each', 'M', '3000', '4010', '1420', '4210', '0', NULL, NULL, 0, 0, 0, 0, 0); + +-- +-- Data in table `stock_moves` +-- + +INSERT INTO `0_stock_moves` VALUES (1, 2, '102', 17, 'DEF', '2006-01-18', 1, 0, '1', 3000, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (2, 2, '103', 17, 'DEF', '2006-01-18', 1, 0, '1', 3000, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (3, 2, '104', 17, 'DEF', '2006-01-18', 1, 0, '1', 150, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (4, 2, '3400', 17, 'DEF', '2006-01-18', 1, 0, '1', 50, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (5, 2, '102', 16, 'DEF', '2006-01-18', 1, 0, '1', -25, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (6, 2, '102', 16, 'CWA', '2006-01-18', 1, 0, '1', 25, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (7, 2, '102', 10, 'DEF', '2006-01-18', 0, 250, '', -2, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (8, 2, '103', 10, 'DEF', '2006-01-18', 0, 3000, '', -10, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (9, 2, '104', 10, 'DEF', '2006-01-18', 0, 50, '', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (10, 3, '103', 10, 'DEF', '2006-01-18', 0, 3000, '', -10, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (11, 2, '102', 11, 'DEF', '2006-01-18', 0, 210, '', 5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (12, 4, '102', 10, 'DEF', '2006-01-18', 0, 222, '', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (13, 1, '102', 26, 'DEF', '2006-01-18', 0, 0, '1', -20, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (14, 1, '103', 26, 'DEF', '2006-01-18', 0, 0, '1', -20, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (15, 1, '104', 26, 'DEF', '2006-01-18', 0, 0, '1', -20, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (16, 1, '3400', 26, 'DEF', '2006-01-18', 0, 0, '1', 20, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (17, 2, '102', 26, 'DEF', '2006-01-18', 0, 0, '2', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (18, 2, '103', 26, 'DEF', '2006-01-18', 0, 0, '2', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (19, 2, '104', 26, 'DEF', '2006-01-18', 0, 0, '2', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (20, 2, '3400', 26, 'DEF', '2006-01-18', 0, 0, '2', 5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (21, 1, '102', 25, 'DEF', '2006-01-18', 1, 3020, '', 10, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (22, 1, '103', 25, 'DEF', '2006-01-18', 1, 90, '', 50, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (23, 2, '104', 25, 'DEF', '2006-01-18', 1, 26, '', 1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (24, 3, '104', 25, 'DEF', '2006-01-18', 1, 22, '', 3020, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (25, 1, '102', 28, 'DEF', '2006-01-20', 0, 0, '', -10, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (26, 5, '102', 10, 'DEF', '2007-01-28', 0, 250, '', -8, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (27, 5, '103', 10, 'DEF', '2007-01-28', 0, 3000, '', -30, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (28, 5, '104', 10, 'DEF', '2007-01-28', 0, 50, '', -21, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (29, 6, '102', 10, 'DEF', '2007-01-30', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (30, 4, '102', 26, 'DEF', '2007-01-30', 0, 0, '4', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (31, 4, '103', 26, 'DEF', '2007-01-30', 0, 0, '4', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (32, 4, '104', 26, 'DEF', '2007-01-30', 0, 0, '4', -5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (33, 4, '3400', 26, 'DEF', '2007-01-30', 0, 0, '4', 5, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (34, 1, '3400', 29, 'DEF', '2007-01-30', 0, 0, '', 50, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (35, 2, '3400', 29, 'DEF', '2007-01-30', 0, 0, '', 20, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (36, 7, '102', 10, 'DEF', '2007-02-03', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (37, 8, '102', 10, 'DEF', '2007-02-03', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (38, 9, '3400', 10, 'DEF', '2007-02-03', 0, 3000, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (39, 10, '102', 10, 'DEF', '2007-02-04', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (40, 11, '102', 10, 'DEF', '2007-02-04', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (41, 12, '102', 10, 'DEF', '2007-02-06', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (42, 13, '102', 10, 'DEF', '2007-02-25', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (43, 14, '102', 10, 'DEF', '2007-03-04', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (44, 15, '102', 10, 'DEF', '2007-03-05', 0, 333, '', -1, 0, 0, 1); +INSERT INTO `0_stock_moves` VALUES (45, 16, '103', 10, 'DEF', '2007-03-05', 0, 3000, '', -1, 0, 0, 1); + +-- +-- Data in table `supp_allocations` +-- + +INSERT INTO `0_supp_allocations` VALUES (7, 1529, '2007-01-30', 2, 22, 4, 20); +INSERT INTO `0_supp_allocations` VALUES (8, 3445, '2007-01-30', 2, 22, 2, 20); +INSERT INTO `0_supp_allocations` VALUES (9, 26, '2007-01-30', 2, 22, 3, 20); + +-- +-- Data in table `supp_invoice_items` +-- + +INSERT INTO `0_supp_invoice_items` VALUES (1, 2, 20, 0, 1, 1, '102', '17 inch VGA Monitor', 5, 3020, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (2, 2, 20, 0, 2, 2, '103', '32MB VGA Card', 25, 90, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (3, 3, 20, 0, 3, 3, '104', '52x CD Drive', 1, 26, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (4, 4, 20, 0, 1, 1, '102', '17 inch VGA Monitor', 5, 3020, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (5, 4, 20, 0, 2, 2, '103', '32MB VGA Card', 25, 90, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (6, 5, 20, 0, 4, 6, '104', '52x CD Drive (upgraded)', 302, 22, 0, ''); +INSERT INTO `0_supp_invoice_items` VALUES (7, 6, 20, 6730, 0, 0, '', '', 0, 200, 0, 'yes'); + +-- +-- Data in table `supp_invoice_tax_items` +-- + +INSERT INTO `0_supp_invoice_tax_items` VALUES (1, 2, 20, 1, NULL, 5, 0, 162.5); +INSERT INTO `0_supp_invoice_tax_items` VALUES (2, 2, 20, 2, NULL, 1, 0, 32.5); + +-- +-- Data in table `supp_trans` +-- + +INSERT INTO `0_supp_trans` VALUES (2, 20, 1, '22', '22', '2006-01-18', '2006-02-22', 3250, 0, 195, 1, 3445); +INSERT INTO `0_supp_trans` VALUES (2, 22, 1, '1', '', '2006-01-18', '2006-01-18', -5000, 0, 0, 1, 5000); +INSERT INTO `0_supp_trans` VALUES (3, 20, 1, '23', 'asdf', '2006-01-18', '2006-02-22', 26, 0, 0, 1, 26); +INSERT INTO `0_supp_trans` VALUES (3, 22, 2, '2', '', '2006-01-18', '2006-01-18', -3300, 0, 0, 1.2, 0); +INSERT INTO `0_supp_trans` VALUES (4, 20, 1, '24', 'Hamselv', '2007-01-30', '2007-02-22', 17350, 0, 0, 1, 1529); +INSERT INTO `0_supp_trans` VALUES (5, 20, 1, '25', '6789', '2007-02-03', '2007-03-22', 6644, 0, 0, 1, 0); +INSERT INTO `0_supp_trans` VALUES (6, 1, 1, '5', '', '2007-03-22', '0000-00-00', -200, 0, 0, 1, 0); +INSERT INTO `0_supp_trans` VALUES (6, 20, 3, '26', '333333', '2007-03-05', '2007-03-12', 200, 0, 0, 0.2, 0); + +-- +-- Data in table `suppliers` +-- + +INSERT INTO `0_suppliers` VALUES (1, 'Ghostbusters Corp.', '', '', '123456789', 'USD', 1, 0, 0, 2, '4000', '2630', '4250'); +INSERT INTO `0_suppliers` VALUES (2, 'Beefeater Ltd.', '', '', '987654321', 'GBP', 1, 0, 0, 2, '4000', '2630', '4250'); +INSERT INTO `0_suppliers` VALUES (3, 'Super Trooper AB', 'Adress', 'sven@sven.sve', '123456', 'SEK', 3, 0, 0, 2, '4000', '2630', '4250'); + +-- +-- Data in table `sys_types` +-- + +INSERT INTO `0_sys_types` VALUES (0, 'Journal - GL', 17, '33'); +INSERT INTO `0_sys_types` VALUES (1, 'Payment - GL', 7, '7'); +INSERT INTO `0_sys_types` VALUES (2, 'Receipt - GL', 4, '14'); +INSERT INTO `0_sys_types` VALUES (4, 'Funds Transfer', 3, '6'); +INSERT INTO `0_sys_types` VALUES (10, 'Sales Invoice', 16, '16'); +INSERT INTO `0_sys_types` VALUES (11, 'Credit Note', 2, '34'); +INSERT INTO `0_sys_types` VALUES (12, 'Receipt', 6, '116'); +INSERT INTO `0_sys_types` VALUES (16, 'Location Transfer', 2, '2'); +INSERT INTO `0_sys_types` VALUES (17, 'Inventory Adjustment', 2, '2'); +INSERT INTO `0_sys_types` VALUES (18, 'Purchase Order', 1, '8'); +INSERT INTO `0_sys_types` VALUES (20, 'Supplier Invoice', 6, '27'); +INSERT INTO `0_sys_types` VALUES (21, 'Supplier Credit Note', 1, '2'); +INSERT INTO `0_sys_types` VALUES (22, 'Supplier Payment', 3, '3'); +INSERT INTO `0_sys_types` VALUES (25, 'Purchase Order Delivery', 1, '4'); +INSERT INTO `0_sys_types` VALUES (26, 'Work Order', 1, '6'); +INSERT INTO `0_sys_types` VALUES (28, 'Work Order Issue', 1, '2'); +INSERT INTO `0_sys_types` VALUES (29, 'Work Order Production', 1, '201'); +INSERT INTO `0_sys_types` VALUES (30, 'Sales Order', 1, '1'); +INSERT INTO `0_sys_types` VALUES (35, 'Cost Update', 1, '1'); +INSERT INTO `0_sys_types` VALUES (40, 'Dimension', 1, '3'); + +-- +-- Data in table `tax_group_items` +-- + +INSERT INTO `0_tax_group_items` VALUES (1, 1, 5, 0); +INSERT INTO `0_tax_group_items` VALUES (1, 2, 1, 0); +INSERT INTO `0_tax_group_items` VALUES (3, 1, 5, 1); +INSERT INTO `0_tax_group_items` VALUES (4, 3, 25, 0); + +-- +-- Data in table `tax_groups` +-- + +INSERT INTO `0_tax_groups` VALUES (1, 'Tax out', 0); +INSERT INTO `0_tax_groups` VALUES (2, 'Tax-Free', 0); +INSERT INTO `0_tax_groups` VALUES (3, 'Tax Included', 0); +INSERT INTO `0_tax_groups` VALUES (4, 'Tax In', 0); + +-- +-- Data in table `tax_types` +-- + +INSERT INTO `0_tax_types` VALUES (1, 5, '2660', '2680', 'VAT out 5', 1); +INSERT INTO `0_tax_types` VALUES (2, 1, '2662', '2680', 'Manufact tax 1', 1); +INSERT INTO `0_tax_types` VALUES (3, 25, '2664', '2660', 'VAT out 25', 1); +INSERT INTO `0_tax_types` VALUES (4, 5, '2660', '2680', 'VAT in 5', 0); +INSERT INTO `0_tax_types` VALUES (5, 25, '2660', '2682', 'VAT in 25', 0); + +-- +-- Data in table `users` +-- + +INSERT INTO `0_users` VALUES ('demouser', '5f4dcc3b5aa765d61d8327deb882cf99', 'Demo User', 1, '999-999-999', 'demo@demo.nu', 'en_US', 0, 0, 0, 0, 'default', 'Letter', 2, 2, 3, 1, 1, 0, '2007-02-06 19:02:35'); +INSERT INTO `0_users` VALUES ('admin', '5f4dcc3b5aa765d61d8327deb882cf99', 'Administrator', 2, '', 'info@frontaccounting.com', 'en_US', 0, 0, 0, 0, 'default', 'Letter', 2, 2, 4, 1, 1, 0, '2007-03-20 10:52:46'); + +-- +-- Data in table `wo_issue_items` +-- + +INSERT INTO `0_wo_issue_items` VALUES (1, '102', 1, 10); + +-- +-- Data in table `wo_issues` +-- + +INSERT INTO `0_wo_issues` VALUES (1, 3, '1', '2006-01-20', 'DEF', 1); + +-- +-- Data in table `wo_manufacture` +-- + +INSERT INTO `0_wo_manufacture` VALUES (1, 'ab200', 3, 50, '2007-01-30'); +INSERT INTO `0_wo_manufacture` VALUES (2, 'ab201', 5, 20, '2007-01-30'); + +-- +-- Data in table `wo_requirements` +-- + +INSERT INTO `0_wo_requirements` VALUES (1, 1, '102', '1', 1, 0, 'DEF', 20); +INSERT INTO `0_wo_requirements` VALUES (2, 1, '103', '1', 1, 0, 'DEF', 20); +INSERT INTO `0_wo_requirements` VALUES (3, 1, '104', '1', 1, 0, 'DEF', 20); +INSERT INTO `0_wo_requirements` VALUES (4, 1, '201', '1', 1, 0, 'DEF', 20); +INSERT INTO `0_wo_requirements` VALUES (5, 2, '102', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (6, 2, '103', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (7, 2, '104', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (8, 2, '201', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (9, 3, '102', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (10, 3, '103', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (11, 3, '104', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (12, 3, '201', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (13, 4, '102', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (14, 4, '103', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (15, 4, '104', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (16, 4, '201', '1', 1, 0, 'DEF', 5); +INSERT INTO `0_wo_requirements` VALUES (17, 5, '102', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (18, 5, '103', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (19, 5, '104', '1', 1, 0, 'DEF', 0); +INSERT INTO `0_wo_requirements` VALUES (20, 5, '201', '1', 1, 0, 'DEF', 0); + +-- +-- Data in table `workcentres` +-- + +INSERT INTO `0_workcentres` VALUES (1, 'work centre', ''); + +-- +-- Data in table `workorders` +-- + +INSERT INTO `0_workorders` VALUES (1, '1', 'DEF', 20, '3400', '2006-01-18', 0, '2006-01-18', '2006-01-18', 20, 1, 1, 0); +INSERT INTO `0_workorders` VALUES (2, '2', 'DEF', 5, '3400', '2006-01-18', 0, '2006-01-18', '2006-01-18', 5, 1, 1, 0); +INSERT INTO `0_workorders` VALUES (3, '3', 'DEF', 50, '3400', '2006-01-18', 2, '2006-02-07', '2006-01-20', 50, 1, 1, 0); +INSERT INTO `0_workorders` VALUES (4, '4', 'DEF', 5, '3400', '2007-01-30', 0, '2007-01-30', '2007-01-30', 5, 1, 1, 0); +INSERT INTO `0_workorders` VALUES (5, '5', 'DEF', 20, '3400', '2007-01-30', 2, '2007-02-19', '2007-01-30', 20, 1, 1, 0); diff --git a/sql/en_US-new.sql b/sql/en_US-new.sql new file mode 100644 index 00000000..2af10ac6 --- /dev/null +++ b/sql/en_US-new.sql @@ -0,0 +1,206 @@ +-- phpMyAdmin SQL Dump +-- version 2.7.0-pl2 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Created: 09 februar 2007 at 11:03 +-- Server Version: 4.1.11 +-- PHP-version: 4.4.1 +-- +-- Database: `en_US-new` +-- + +-- +-- Data in table `bank_accounts` +-- + +INSERT INTO `0_bank_accounts` VALUES ('1700', 0, 'Current account', 'N/A', 'N/A', NULL, 'USD'); +INSERT INTO `0_bank_accounts` VALUES ('1705', 0, 'Petty Cash account', 'N/A', 'N/A', NULL, 'USD'); + +-- +-- Data in table `bank_trans_types` +-- + +INSERT INTO `0_bank_trans_types` VALUES (1, 'Cash'); +INSERT INTO `0_bank_trans_types` VALUES (2, 'Transfer'); + +-- +-- Data in table `chart_class` +-- + +INSERT INTO `0_chart_class` VALUES (1, 'Assets', 1); +INSERT INTO `0_chart_class` VALUES (2, 'Liabilities', 1); +INSERT INTO `0_chart_class` VALUES (3, 'Income', 0); +INSERT INTO `0_chart_class` VALUES (4, 'Costs', 0); + +-- +-- Data in table `chart_master` +-- + +INSERT INTO `0_chart_master` VALUES ('3000', NULL, 'Sales', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3010', NULL, 'Sales - Wholesale', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3020', NULL, 'Sales of Other items', 1, 1); +INSERT INTO `0_chart_master` VALUES ('3400', NULL, 'Difference On Exchange', 1, 0); +INSERT INTO `0_chart_master` VALUES ('5000', NULL, 'Direct Labour', 2, 0); +INSERT INTO `0_chart_master` VALUES ('5050', NULL, 'Direct Labour Recovery', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4200', NULL, 'Material Usage Varaiance', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4210', NULL, 'Consumable Materials', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4220', NULL, 'Purchase price Variance', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4000', NULL, 'Purchases of materials', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4250', NULL, 'Discounts Received', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4260', NULL, 'Exchange Variation', 2, 0); +INSERT INTO `0_chart_master` VALUES ('4300', NULL, 'Freight Inwards', 2, 4); +INSERT INTO `0_chart_master` VALUES ('4010', NULL, 'Cost of Goods Sold - Retail', 2, 4); +INSERT INTO `0_chart_master` VALUES ('6790', NULL, 'Bank Charges', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6800', NULL, 'Entertainments', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6810', NULL, 'Legal Expenses', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6600', NULL, 'Repairs and Maintenance Office', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6730', NULL, 'phone', 5, 4); +INSERT INTO `0_chart_master` VALUES ('8200', NULL, 'Bank Interest', 52, 0); +INSERT INTO `0_chart_master` VALUES ('6840', NULL, 'Credit Control', 5, 0); +INSERT INTO `0_chart_master` VALUES ('7040', NULL, 'Depreciation Office Equipment', 51, 0); +INSERT INTO `0_chart_master` VALUES ('3800', NULL, 'Freight Outwards', 5, 4); +INSERT INTO `0_chart_master` VALUES ('4500', NULL, 'Packaging', 5, 4); +INSERT INTO `0_chart_master` VALUES ('6400', NULL, 'Commissions', 5, 0); +INSERT INTO `0_chart_master` VALUES ('3200', NULL, 'Prompt Payment Discounts', 1, 0); +INSERT INTO `0_chart_master` VALUES ('6700', NULL, 'General Expenses', 5, 4); +INSERT INTO `0_chart_master` VALUES ('5200', NULL, 'Indirect Labour', 2, 0); +INSERT INTO `0_chart_master` VALUES ('5210', NULL, 'Overhead Recovery', 5, 0); +INSERT INTO `0_chart_master` VALUES ('1700', NULL, 'Bank account', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1705', NULL, 'Petty Cash', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1710', NULL, 'Foreign currency account', 10, 0); +INSERT INTO `0_chart_master` VALUES ('1500', NULL, 'Accounts Receivable', 20, 0); +INSERT INTO `0_chart_master` VALUES ('1400', NULL, 'Stocks of Raw Materials', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1410', NULL, 'Stocks of Work In Progress', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1420', NULL, 'Stocks of Finsihed Goods', 45, 0); +INSERT INTO `0_chart_master` VALUES ('1430', NULL, 'Goods Received Clearing account', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2630', NULL, 'Accounts Payable', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2660', NULL, 'VAT out 5', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2662', NULL, 'VAT out 1', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2664', NULL, 'VAT out 25', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2680', NULL, 'VAT In 5', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2682', NULL, 'VAT In 25', 30, 0); +INSERT INTO `0_chart_master` VALUES ('2050', NULL, 'Retained Earnings', 50, 0); +INSERT INTO `0_chart_master` VALUES ('2000', NULL, 'Share Capital', 50, 0); + +-- +-- Data in table `chart_types` +-- + +INSERT INTO `0_chart_types` VALUES (1, 'Sales', 3, -1); +INSERT INTO `0_chart_types` VALUES (2, 'Cost of Sales', 4, -1); +INSERT INTO `0_chart_types` VALUES (5, 'Expenses', 4, -1); +INSERT INTO `0_chart_types` VALUES (10, 'Cash/Bank', 1, -1); +INSERT INTO `0_chart_types` VALUES (20, 'Accounts Receivable', 1, -1); +INSERT INTO `0_chart_types` VALUES (30, 'Accounts Payable', 2, -1); +INSERT INTO `0_chart_types` VALUES (40, 'Fixed Assets', 1, -1); +INSERT INTO `0_chart_types` VALUES (45, 'Inventory', 1, -1); +INSERT INTO `0_chart_types` VALUES (50, 'Equity', 2, -1); +INSERT INTO `0_chart_types` VALUES (51, 'Depreciations', 4, -1); +INSERT INTO `0_chart_types` VALUES (52, 'Financials', 4, -1); + +-- +-- Data in table `company` +-- + +INSERT INTO `0_company` VALUES (1, 'Company name', '', '', 1, 1, 'N/A', '', '', '', '', '', 'USD', '1500', '4250', '2630', '1430', '4260', '4220', '2050', '3800', '3000', '3000', '3200', '1420', '4010', '4210', '3000', '1410', '5000', '', '', '', '', '', '', 0, 10, 10, 1000, 20, 20, 30, 1, 0); + +-- +-- Data in table `credit_status` +-- + +INSERT INTO `0_credit_status` VALUES (1, 'Good History', 0); +INSERT INTO `0_credit_status` VALUES (3, 'No more work until payment received', 1); +INSERT INTO `0_credit_status` VALUES (4, 'In liquidation', 1); + +-- +-- Data in table `currencies` +-- + +INSERT INTO `0_currencies` VALUES ('Kronor', 'SEK', 'kr', 'Sweden', '?ren'); +INSERT INTO `0_currencies` VALUES ('Kroner', 'DKK', 'kr.', 'Denmark', '?re'); +INSERT INTO `0_currencies` VALUES ('Euro', 'EUR', '?', 'Europe', 'Cents'); +INSERT INTO `0_currencies` VALUES ('Pounds', 'GBP', '?', 'England', 'Pence'); +INSERT INTO `0_currencies` VALUES ('US Dollars', 'USD', '$', 'United States', 'Cents'); + +-- +-- Data in table `locations` +-- + +INSERT INTO `0_locations` VALUES ('DEF', 'Default', 'N/A', '', '', '', ''); + +-- +-- Data in table `movement_types` +-- + +INSERT INTO `0_movement_types` VALUES (1, 'Adjustment'); + +-- +-- Data in table `payment_terms` +-- + +INSERT INTO `0_payment_terms` VALUES (1, 'Due 15th Of the Following Month', 0, 17); +INSERT INTO `0_payment_terms` VALUES (2, 'Due By End Of The Following Month', 0, 30); +INSERT INTO `0_payment_terms` VALUES (3, 'Payment due within 10 days', 10, 0); +INSERT INTO `0_payment_terms` VALUES (4, 'Cash Only', 1, 0); + +-- +-- Data in table `sales_types` +-- + +INSERT INTO `0_sales_types` VALUES (1, 'Retail'); +INSERT INTO `0_sales_types` VALUES (2, 'Wholesale'); + +-- +-- Data in table `salesman` +-- + +INSERT INTO `0_salesman` VALUES (1, 'Sales Person', '', '', ''); + +-- +-- Data in table `shippers` +-- + +INSERT INTO `0_shippers` VALUES (1, 'Default', '', '', ''); + +-- +-- Data in table `stock_category` +-- + +INSERT INTO `0_stock_category` VALUES (1, 'Components', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (2, 'Charges', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (3, 'Systems', NULL, NULL, NULL, NULL); +INSERT INTO `0_stock_category` VALUES (4, 'Services', NULL, NULL, NULL, NULL); + +-- +-- Data in table `sys_types` +-- + +INSERT INTO `0_sys_types` VALUES (0, 'Journal - GL', 17, '0'); +INSERT INTO `0_sys_types` VALUES (1, 'Payment - GL', 7, '0'); +INSERT INTO `0_sys_types` VALUES (2, 'Receipt - GL', 4, '0'); +INSERT INTO `0_sys_types` VALUES (4, 'Funds Transfer', 3, '0'); +INSERT INTO `0_sys_types` VALUES (10, 'Sales Invoice', 16, '0'); +INSERT INTO `0_sys_types` VALUES (11, 'Credit Note', 2, '0'); +INSERT INTO `0_sys_types` VALUES (12, 'Receipt', 6, '0'); +INSERT INTO `0_sys_types` VALUES (16, 'Location Transfer', 2, '0'); +INSERT INTO `0_sys_types` VALUES (17, 'Inventory Adjustment', 2, '0'); +INSERT INTO `0_sys_types` VALUES (18, 'Purchase Order', 1, '0'); +INSERT INTO `0_sys_types` VALUES (20, 'Supplier Invoice', 6, '0'); +INSERT INTO `0_sys_types` VALUES (21, 'Supplier Credit Note', 1, '0'); +INSERT INTO `0_sys_types` VALUES (22, 'Supplier Payment', 3, '0'); +INSERT INTO `0_sys_types` VALUES (25, 'Purchase Order Delivery', 1, '0'); +INSERT INTO `0_sys_types` VALUES (26, 'Work Order', 1, '0'); +INSERT INTO `0_sys_types` VALUES (28, 'Work Order Issue', 1, '0'); +INSERT INTO `0_sys_types` VALUES (29, 'Work Order Production', 1, '0'); +INSERT INTO `0_sys_types` VALUES (30, 'Sales Order', 1, ''); +INSERT INTO `0_sys_types` VALUES (35, 'Cost Update', 1, ''); +INSERT INTO `0_sys_types` VALUES (40, 'Dimension', 1, '3'); + +-- +-- Data in table `users` +-- + +INSERT INTO `0_users` VALUES ('demouser', '5f4dcc3b5aa765d61d8327deb882cf99', 'Demo User', 1, '999-999-999', 'demo@demo.nu', 'en_US', 0, 0, 0, 0, 'default', 'Letter', 2, 2, 3, 1, 1, 0, '2007-02-06 19:02:35'); +INSERT INTO `0_users` VALUES ('admin', '5f4dcc3b5aa765d61d8327deb882cf99', 'Administrator', 2, '', 'info@frontaccounting.com', 'en_US', 0, 0, 0, 0, 'default', 'Letter', 2, 2, 4, 1, 1, 0, '2007-03-20 10:52:46'); + diff --git a/sql/index.php b/sql/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sql/index.php @@ -0,0 +1,3 @@ + diff --git a/taxes/db/index.php b/taxes/db/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/taxes/db/index.php @@ -0,0 +1,3 @@ + diff --git a/taxes/db/item_tax_types_db.inc b/taxes/db/item_tax_types_db.inc new file mode 100644 index 00000000..486bfc78 --- /dev/null +++ b/taxes/db/item_tax_types_db.inc @@ -0,0 +1,98 @@ + \ No newline at end of file diff --git a/taxes/db/tax_groups_db.inc b/taxes/db/tax_groups_db.inc new file mode 100644 index 00000000..e23ab752 --- /dev/null +++ b/taxes/db/tax_groups_db.inc @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/taxes/db/tax_types_db.inc b/taxes/db/tax_types_db.inc new file mode 100644 index 00000000..ce4495bf --- /dev/null +++ b/taxes/db/tax_types_db.inc @@ -0,0 +1,84 @@ + \ No newline at end of file diff --git a/taxes/index.php b/taxes/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/taxes/index.php @@ -0,0 +1,3 @@ + diff --git a/taxes/item_tax_types.php b/taxes/item_tax_types.php new file mode 100644 index 00000000..f274556d --- /dev/null +++ b/taxes/item_tax_types.php @@ -0,0 +1,201 @@ + 0) + { + display_error(_("Cannot delete this item tax type because items have been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_item_tax_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_item_tax_types(); + +start_table("$table_style width=30%"); +$th = array(_("Name"), _("Tax exempt"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + if ($myrow["exempt"] == 0) + { + $disallow_text = _("No"); + } + else + { + $disallow_text = _("Yes"); + } + + label_cell($myrow["name"]); + label_cell($disallow_text); + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Item Tax type")); + +start_form(); + +start_table($table_style2); + +if (isset($selected_id)) +{ + + if (!isset($_POST['name'])) + { + $myrow = get_item_tax_type($selected_id); + + $_POST['name'] = $myrow["name"]; + $_POST['exempt'] = $myrow["exempt"]; + + // read the exemptions and check the ones that are on + $exemptions = get_item_tax_type_exemptions($selected_id); + + if (db_num_rows($exemptions) > 0) + { + while ($exmp = db_fetch($exemptions)) + { + $_POST['ExemptTax' . $exmp["tax_type_id"]] = 1; + } + } + } + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Description:"), 'name', 50); + +yesno_list_row(_("Is Fully Tax-exempt:"), 'exempt', null, "", "", true); + +end_table(1); + +if (!isset($_POST['exempt']) || $_POST['exempt'] == 0) +{ + + display_note(_("Select which taxes this item tax type is exempt from."), 0, 1); + + start_table($table_style2); + $th = array(_("Tax Name"), _("Is exempt")); + table_header($th); + + $tax_types = get_all_tax_types_simple(); + + while ($myrow = db_fetch($tax_types)) + { + + alt_table_row_color($k); + + label_cell($myrow["name"]); + check_cells("", 'ExemptTax' . $myrow["id"], null); + end_row(); + } + + end_table(1); +} + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/taxes/tax_calc.inc b/taxes/tax_calc.inc new file mode 100644 index 00000000..1f00b8a0 --- /dev/null +++ b/taxes/tax_calc.inc @@ -0,0 +1,163 @@ + \ No newline at end of file diff --git a/taxes/tax_groups.php b/taxes/tax_groups.php new file mode 100644 index 00000000..e3393912 --- /dev/null +++ b/taxes/tax_groups.php @@ -0,0 +1,245 @@ + 0) + { + display_note(_("Cannot delete this tax group because customer branches been created referring to it.")); + return false; + } + + $sql = "SELECT COUNT(*) FROM ".TB_PREF."suppliers WHERE tax_group_id=$selected_id"; + $result = db_query($sql, "could not query suppliers"); + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_note(_("Cannot delete this tax group because suppliers been created referring to it.")); + return false; + } + + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_tax_group($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_tax_groups(); + +start_table($table_style); +$th = array(_("Description"), _("Tax Shipping"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["name"]); + if ($myrow["tax_shipping"]) + label_cell(_("Yes")); + else + label_cell(_("No")); + + /*for ($i=0; $i< 5; $i++) + if ($myrow["type" . $i] != reserved_words::get_all_numeric()) + echo "
";*/ + + edit_link_cell("selected_id=" . $myrow["id"]); + delete_link_cell("selected_id=" . $myrow["id"]. "&delete=1"); + end_row();; +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Tax Group")); + +start_form(); + +start_table($table_style2); + +if ($selected_id != -1) +{ + //editing an existing status code + + if (!isset($_POST['name'])) + { + $group = get_tax_group($selected_id); + + $_POST['name'] = $group["name"]; + $_POST['tax_shipping'] = $group["tax_shipping"]; + + $items = get_tax_group_items($selected_id); + + $i = 0; + while ($tax_item = db_fetch($items)) + { + $_POST['tax_type_id' . $i] = $tax_item["tax_type_id"]; + $_POST['rate' . $i] = $tax_item["rate"]; + $_POST['included' . $i] = $tax_item["included_in_price"]; + $i ++; + } + } + + hidden('selected_id', $selected_id); +} +text_row_ex(_("Description:"), 'name', 40); +yesno_list_row(_("Tax Shipping:"), 'tax_shipping', null, "", "", true); + +end_table(); + +display_note(_("Select the taxes that are included in this group."), 1); + +start_table($table_style2); +$th = array(_("Tax"), _("Default Rate (%)"), _("Rate (%)"), _("Include in Price")); +table_header($th); +for ($i = 0; $i < 5; $i++) +{ + start_row(); + if (!isset($_POST['tax_type_id' . $i])) + $_POST['tax_type_id' . $i] = 0; + if (!isset($_POST['included' . $i])) + $_POST['included' . $i] = 0; + tax_types_list_cells(null, 'tax_type_id' . $i, $_POST['tax_type_id' . $i], true, _("None"), true); + + if ($_POST['tax_type_id' . $i] != 0 && $_POST['tax_type_id' . $i] != reserved_words::get_all_numeric()) + { + + $default_rate = get_tax_type_default_rate($_POST['tax_type_id' . $i]); + label_cell(number_format2($default_rate, user_percent_dec()), "nowrap align=right"); + + if (!isset($_POST['rate' . $i]) || $_POST['rate' . $i] == "") + $_POST['rate' . $i] = $default_rate; + text_cells(null, 'rate' . $i, $_POST['rate' . $i], 10, 10); + check_cells(null, 'included' . $i, $_POST['included' . $i]); + } + end_row(); +} + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +//------------------------------------------------------------------------------------ + +end_page(); + +?> diff --git a/taxes/tax_types.php b/taxes/tax_types.php new file mode 100644 index 00000000..101144d2 --- /dev/null +++ b/taxes/tax_types.php @@ -0,0 +1,165 @@ + 0) + { + display_error(_("Cannot delete this tax type because tax groups been created referring to it.")); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------- + +if (isset($_GET['delete'])) +{ + + if (can_delete($selected_id)) + { + delete_tax_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } +} + +//----------------------------------------------------------------------------------- + +$result = get_all_tax_types(); + +start_table($table_style); + +$th = array(_("Description"), _("Default Rate (%)"), + _("Sales GL Account"), _("Purchasing GL Account"), _("Outstanding"), "", ""); +table_header($th); + +$k = 0; +while ($myrow = db_fetch($result)) +{ + + if ($myrow['out'] == 1) + $out = _("Yes"); + else + $out = _("No"); + alt_table_row_color($k); + + label_cell($myrow["name"]); + label_cell(number_format2($myrow["rate"],user_percent_dec()), "align=right"); + label_cell($myrow["sales_gl_code"] . " " . $myrow["SalesAccountName"]); + label_cell($myrow["purchasing_gl_code"] . " " . $myrow["PurchasingAccountName"]); + label_cell($out); + + edit_link_cell("selected_id=".$myrow["id"]); + delete_link_cell("selected_id=".$myrow["id"]."&delete=1"); + end_row(); +} + +end_table(); + +//----------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Tax Type")); + +//----------------------------------------------------------------------------------- + +start_form(); + +start_table($table_style2); + +if (isset($selected_id)) +{ + //editing an existing status code + + $myrow = get_tax_type($selected_id); + + $_POST['name'] = $myrow["name"]; + $_POST['rate'] = $myrow["rate"]; + $_POST['sales_gl_code'] = $myrow["sales_gl_code"]; + $_POST['purchasing_gl_code'] = $myrow["purchasing_gl_code"]; + $_POST['out'] = $myrow["out"]; + + hidden('selected_id', $selected_id); +} +text_row_ex(_("Description:"), 'name', 50); +text_row_ex(_("Default Rate:"), 'rate', 10, 10, "", "%"); + +gl_all_accounts_list_row(_("Sales GL Account:"), 'sales_gl_code', null); +gl_all_accounts_list_row(_("Purchasing GL Account:"), 'purchasing_gl_code', null); + +check_row(_("Outstanding:"), 'out', null); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); + +?> diff --git a/themes/aqua/default.css b/themes/aqua/default.css new file mode 100644 index 00000000..869aac2d --- /dev/null +++ b/themes/aqua/default.css @@ -0,0 +1,332 @@ +/*--------------------------------------------------\ +| aqua | | default.css | +|---------------------------------------------------| +| For use with: | +| FrontAccounting | +| http://FrontAccounting.com/ | +| by Joe Hunt Consulting | +|---------------------------------------------------| +| Developer: | +| Joe Hunt | +| | +|---------------------------------------------------| +| Note: | +| Changes can be made to this CSS that will be | +| reflected throughout FrontAccounting. | +| | +\--------------------------------------------------*/ + +body { + font-family: Verdana, Arial, Helvetica; + background: #518fad; + font-size: 10px; + margin: 5px 0 0 5px; + padding: 0; +} + +tr, td, th { + font-size: 11px; + line-height: 19px; +} + +textarea { + font-size: 12px; +} + +input, select { + font-size: 11px; + padding: 1px; +} + +input.big { + width: 100px; +} + +input.small { + width: 50px; +} + +a { + color: #0000bb; + font-size: 11px; + text-decoration: none; +} + +a:link { + color: #00000bb; + text-decoration: none; +} + +a:active { + color: #000000; + text-decoration: none; +} + +a:hover { + color: #2d8628; + text-decoration: underline; +} + +.login { + background-color: #ffffff; + border: none; +} + +.callout_main { + font-family: Verdana, Arial, Helvetica; + border: none; + width: 99%; + margin: 0; + padding: 0; +} + +.main_page { + background-color: #f9f9f9; + border: none; + width: 100%; + margin: 0; + padding: 0; +} + +.quick_menu { + background-color: #518fad; + border: 0; + margin: 0; + padding: 0; + text-align: right; +} + +.quick_menu_selected{ + font-family: Verdana, Arial, Helvetica; + font-size: 13px; + border: none; + white-space: nowrap; + margin: 2px; + padding: 2px; + color: #00cc00; + font-weight: bolder; +} + +.logoutBar { + padding-right: 1em; + background: #a7d6ce; + color: black; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.bottomBar { + padding-right: 1em; + background: #a7d6ce; + color: black; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.bottomBarCell { + font-size: 10px; + line-height: 12px; +} + +.bottomBar2 { + padding-right: 1em; + background: #a7d6ce; + color: black; + border-top: 1px solid #8cacbb; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.logoutBarRight { + text-align: right; +} + +div.logoutBar { + padding-right: 1em; + background: #a7d6ce; + color: black; + border-bottom: 1px solid #8cacbb; + text-align: right; +} +div.logoutBar a { + font-weight: normal; + margin-left: 1em; + color: #436976; + background-color: transparent; +} +div.logoutBar img { + vertical-align: top; +} + +div.tabs { + padding: 0.5em 0 0 0; + background: none transparent scroll repeat 0% 0%; + white-space: nowrap; + border-collapse: collapse; + border-bottom: 1px solid #8cacbb; + +} +div.tabs a { + border: 1px solid #8cacbb; + padding: 0 1em 3px 1em; + font-weight: normal; + background: white scroll repeat 0% 0%; + color: #436976; + margin-right: 0.0em; + height: 1.0em; +} +div.tabs a.selected { + border-top: 1px solid #8cacbb; + border-right: 1px solid #8cacbb; + border-bottom: 1px solid #dee7ec; + border-left: 1px solid #8cacbb; + font-weight: normal; + background: #a7d6ce; + color: #436976; +} +div.tabs a:hover { + background: #a7d6ce; + color: #436976; +} + +.menu_group { + font-size: 13px; + padding: 0px; + color: #000000; + background-color: #a7d6ce; + padding-left: 3px; + font-weight: bold; +} + +.menu_group_items { + background-color: #f9f9f9; + font-weight: normal; + padding: 9px; + border: 1px solid #8cacbb; +} + +#footer { + position: relative; + bottom: -3px; +} + +.footer { + font-family: Verdana, Arial, Helvetica; + color: #cccccc; + font-weight: normal; + font-size: 9px; +} + +.tableheader { + font-weight: bold; + background-color: #d5cea7; + color: black; + text-align: center; +} + +.tableheader2 { + font-weight: bold; + background-color: #d5cea7; + color: black; + text-align: left; +} + +.tableseparator { + border-left: 1px solid #444466; +} + +.titletext { + font-weight: bold; + font-size: 13px; + border-bottom: 1px solid #8cacbb; + padding: 5px; +} + +.headingtext { + font-weight: bold; + font-size: 13; + color: black; +} + +.headingtext2 { + font-size: 13px; + color: black; +} + +.headingtext3 { + font-weight: bold; + font-size: 10px; + color: black; +} + +.errortext { + font-size: 13px; + color: #ff0000; + font-weight: bold; +} + +.inputsubmit { + font-size: 8pt; + border: 1px solid #0066cc; + padding: 1px 4px; +} + +.oddrow { + background-color: #eeeeee; +} + +.evenrow { + background-color: #dddddd; +} + +.overduebg { + background-color: #dd7777; +} + +.overduefg { + color: #dd7777; +} + +.currentfg { + color: #ff6666; +} + +.redfg { + color: red; + font-weight: bold; +} + +.settledbg { + background-color: #00bb00; +} + +.settledfg { + color: #00bb00; +} + +.inquirybg { + background-color: #fdfeef; +} + +.currencybg { + background-color: #ee8888; +} + +.stockmankobg { + background-color: pink; +} + +.tablestyle { + padding: 3px; + border: 1px solid #8cacbb; + border-collapse: collapse; +} + +.tablestyle2 { + padding: 0 3px; + border: 1px solid #ccc; + border-collapse: collapse; +} +.tablestyle_noborder { + padding: 3px; +} \ No newline at end of file diff --git a/themes/aqua/index.php b/themes/aqua/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/themes/aqua/index.php @@ -0,0 +1,3 @@ + diff --git a/themes/aqua/renderer.php b/themes/aqua/renderer.php new file mode 100644 index 00000000..a446b283 --- /dev/null +++ b/themes/aqua/renderer.php @@ -0,0 +1,66 @@ +get_selected_application(); + + foreach ($selected_app->modules as $module) + { + // image + echo ""; + // values + echo ""; + } + + echo "
"; // outer table + +start_table("class='tablestyle_noborder'"); + +if (isset($_POST['New'])) +{ + + hidden('New', 'Yes'); + + $_POST['CustName'] = $_POST['address'] = $_POST['tax_id'] = ''; + $_POST['dimension_id'] = 0; + $_POST['dimension2_id'] = 0; + $_POST['sales_type'] = -1; + $_POST['curr_code'] = get_company_currency(); + $_POST['credit_status'] = -1; + $_POST['payment_terms'] = ''; + $_POST['discount'] = $_POST['pymt_discount'] = 0; + $_POST['credit_limit'] = sys_prefs::default_credit_limit(); +} +else +{ + + $sql = "SELECT * FROM ".TB_PREF."debtors_master WHERE debtor_no = '" . $_POST['customer_id'] . "'"; + $result = db_query($sql,"check failed"); + + $myrow = db_fetch($result); + + $_POST['CustName'] = $myrow["name"]; + $_POST['address'] = $myrow["address"]; + $_POST['tax_id'] = $myrow["tax_id"]; + $_POST['email'] = $myrow["email"]; + $_POST['dimension_id'] = $myrow["dimension_id"]; + $_POST['dimension2_id'] = $myrow["dimension2_id"]; + $_POST['sales_type'] = $myrow["sales_type"]; + $_POST['curr_code'] = $myrow["curr_code"]; + $_POST['credit_status'] = $myrow["credit_status"]; + $_POST['payment_terms'] = $myrow["payment_terms"]; + $_POST['discount'] = $myrow["discount"] * 100; // Sherifoz 21.6.03 convert to displayable percentage + $_POST['pymt_discount'] = $myrow["pymt_discount"] * 100; // Sherifoz 21.6.03 convert to displayable percentage + $_POST['credit_limit'] = $myrow["credit_limit"]; +} + +text_row(_("Customer Name:"), 'CustName', $_POST['CustName'], 40, 40); +textarea_row(_("Address:"), 'address', $_POST['address'], 35, 5); + +text_row(_("Email:"), 'email', null, 40, 40); +text_row(_("GSTNo:"), 'tax_id', null, 40, 40); + + +// Sherifoz 23.09.03 currency can't be changed if editing +if (isset($_POST['New'])) +{ + currencies_list_row(_("Customer's Currency:"), 'curr_code', $_POST['curr_code']); +} +else +{ + label_row(_("Customer's Currency:"), $_POST['curr_code']); + hidden('curr_code', $_POST['curr_code']); +} +end_table(); + +echo ""; // outer table + +start_table("class='tablestyle_noborder'"); + +sales_types_list_row(_("Sales Type/Price List:"), 'sales_type', $_POST['sales_type']); +$dim = get_company_pref('use_dimension'); +if ($dim >= 1) + dimensions_list_row(_("Dimension")." 1:", 'dimension_id', $_POST['dimension_id'], true, " ", false, 1); +if ($dim > 1) + dimensions_list_row(_("Dimension")." 2:", 'dimension2_id', $_POST['dimension2_id'], true, " ", false, 2); +if ($dim < 1) + hidden('dimension_id', 0); +if ($dim < 2) + hidden('dimension2_id', 0); + +text_row(_("Discount Percent:"), 'discount', $_POST['discount'], 5, 4); +text_row(_("Prompt Payment Discount Percent:"), 'pymt_discount', $_POST['pymt_discount'], 5, 4); +text_row(_("Credit Limit:"), 'credit_limit', $_POST['credit_limit'], 16, 14); + +payment_terms_list_row(_("Payment Terms:"), 'payment_terms', $_POST['payment_terms']); +credit_status_list_row(_("Credit Status:"), 'credit_status', $_POST['credit_status']); + +end_table(); + +end_table(1); // outer table + +if (isset($_POST['New'])) +{ + submit_center('submit', _("Add New Customer")); +} +else +{ + submit_center_first('submit', _("Update Customer")); + submit_center_last('delete', _("Delete Customer")); +} + +end_form(); +end_page(); + +?> diff --git a/sales/manage/index.php b/sales/manage/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/sales/manage/index.php @@ -0,0 +1,3 @@ + diff --git a/sales/manage/sales_areas.php b/sales/manage/sales_areas.php new file mode 100644 index 00000000..7aed3e6e --- /dev/null +++ b/sales/manage/sales_areas.php @@ -0,0 +1,126 @@ + 0) + { + $cancel_delete = 1; + display_error(_("Cannot delete this area because customer branches have been created using this area.")); + } + if ($cancel_delete == 0) + { + $sql="DELETE FROM ".TB_PREF."areas WHERE area_code='" . $selected_id . "'"; + db_query($sql,"could not delete sales area"); + + meta_forward($_SERVER['PHP_SELF']); + } //end if Delete area +} + +//------------------------------------------------------------------------------------------------- + +$sql = "SELECT * FROM ".TB_PREF."areas"; +$result = db_query($sql,"could not get areas"); + +start_table("$table_style width=40%"); +$th = array(_("Area Name"), "", ""); +table_header($th); +$k = 0; + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["description"]); + edit_link_cell("selected_id=" . $myrow["area_code"]); + delete_link_cell("selected_id=" . $myrow["area_code"]. "&delete=1"); + end_row(); +} + + +end_table(); +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Sales Area")); + +//------------------------------------------------------------------------------------------------- + +start_form(); + +start_table("$table_style2 width=40%"); + +if (isset($selected_id)) +{ + //editing an existing area + $sql = "SELECT * FROM ".TB_PREF."areas WHERE area_code='$selected_id'"; + + $result = db_query($sql,"could not get area"); + $myrow = db_fetch($result); + + $_POST['description'] = $myrow["description"]; + hidden("selected_id", $selected_id); +} + +text_row_ex(_("Area Name:"), 'description', 30); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); +?> diff --git a/sales/manage/sales_people.php b/sales/manage/sales_people.php new file mode 100644 index 00000000..e0d4f7b1 --- /dev/null +++ b/sales/manage/sales_people.php @@ -0,0 +1,148 @@ + 0) + { + display_error("Cannot delete this sales-person because branches are set up referring to this sales-person - first alter the branches concerned."); + } + else + { + $sql="DELETE FROM ".TB_PREF."salesman WHERE salesman_code='$selected_id'"; + db_query($sql,"The sales-person could not be deleted"); + + meta_forward($_SERVER['PHP_SELF']); + } +} + +//------------------------------------------------------------------------------------------------ + +$sql = "SELECT * FROM ".TB_PREF."salesman"; +$result = db_query($sql,"could not get sales persons"); + +start_table("$table_style width=40%"); +$th = array(_("Name"), _("Phone"), _("Fax"), _("Email"), "", ""); +table_header($th); + +$k = 0; + +while ($myrow = db_fetch($result)) +{ + + alt_table_row_color($k); + + label_cell($myrow["salesman_name"]); + label_cell($myrow["salesman_phone"]); + label_cell($myrow["salesman_fax"]); + label_cell($myrow["salesman_email"]); + edit_link_cell(SID . "selected_id=" . $myrow["salesman_code"]); + delete_link_cell(SID . "selected_id=" . $myrow["salesman_code"]. "&delete=1"); + end_row(); + +} //END WHILE LIST LOOP + +end_table(); + +//------------------------------------------------------------------------------------------------ + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Sales Person")); + +//------------------------------------------------------------------------------------------------ + +start_form(); + +if (isset($selected_id)) +{ + //editing an existing Sales-person + $sql = "SELECT * FROM ".TB_PREF."salesman WHERE salesman_code='$selected_id'"; + + $result = db_query($sql,"could not get sales person"); + $myrow = db_fetch($result); + + $_POST['salesman_name'] = $myrow["salesman_name"]; + $_POST['salesman_phone'] = $myrow["salesman_phone"]; + $_POST['salesman_fax'] = $myrow["salesman_fax"]; + $_POST['salesman_email'] = $myrow["salesman_email"]; + + hidden('selected_id', $selected_id); +} + +start_table("$table_style2 width=40%"); + +text_row_ex(_("Sales person name:"), 'salesman_name', 30); +text_row_ex(_("Telephone number:"), 'salesman_phone', 20); +text_row_ex(_("Fax number:"), 'salesman_fax', 20); +text_row_ex(_("Email:"), 'salesman_email', 40); + +end_table(1); + +submit_add_or_update_center(!isset($selected_id)); + +end_form(); + +end_page(); + +?> diff --git a/sales/manage/sales_types.php b/sales/manage/sales_types.php new file mode 100644 index 00000000..15e96e10 --- /dev/null +++ b/sales/manage/sales_types.php @@ -0,0 +1,137 @@ + 0) + { + display_error(_("Cannot delete this sale type because customer transactions have been created using this sales type.")); + + } + else + { + + $sql = "SELECT COUNT(*) FROM ".TB_PREF."debtors_master WHERE sales_type='$selected_id'"; + $result = db_query($sql,"check failed"); + check_db_error("The number of customers using this Sales type record could not be retrieved", $sql); + + $myrow = db_fetch_row($result); + if ($myrow[0] > 0) + { + display_error(_("Cannot delete this sale type because customers are currently set up to use this sales type.")); + } + else + { + delete_sales_type($selected_id); + meta_forward($_SERVER['PHP_SELF']); + } + } //end if sales type used in debtor transactions or in customers set up +} + +//---------------------------------------------------------------------------------------------------- + +$result = get_all_sales_types(); + +start_table("$table_style width=30%"); + +$th = array (_("Type Name"), "", ""); +table_header($th); +$k = 0; + +while ($myrow = db_fetch($result)) +{ + alt_table_row_color($k); + label_cell($myrow["sales_type"]); + edit_link_cell("selected_id=".$myrow["id"]); + delete_link_cell("selected_id=".$myrow["id"]."&delete=1"); + end_row(); +} + +end_table(); + +//---------------------------------------------------------------------------------------------------- + +hyperlink_no_params($_SERVER['PHP_SELF'], _("New Sales type")); + +start_form(); + +start_table("$table_style2 width=30%"); + +if ($selected_id != -1) +{ + + $myrow = get_sales_type($selected_id); + + $_POST['sales_type'] = $myrow["sales_type"]; + + hidden('selected_id', $selected_id); +} + +text_row_ex(_("Sales Type Name:"), 'sales_type', 20); + +end_table(1); + +submit_add_or_update_center($selected_id == -1); + +end_form(); + +end_page(); + +?> diff --git a/sales/sales_order_entry.php b/sales/sales_order_entry.php new file mode 100644 index 00000000..1f2d194c --- /dev/null +++ b/sales/sales_order_entry.php @@ -0,0 +1,516 @@ +direct_invoice)) +{ + page(_("Sales Invoices"), false, false, "", $js); +} +else +{ + page(_("Sales Order Entry"), false, false, "", $js); +} + + +//-------------------------------------------------------------------------------- +if (isset($_GET['AddedID'])) +{ + $order_no = $_GET['AddedID']; + $trans_type = systypes::sales_order(); + + display_notification_centered(_("Order has been entered.") . " #$order_no"); + + display_note(get_trans_view_str($trans_type, $order_no, _("View this order"))); + + hyperlink_params($path_to_root . "/sales/customer_invoice.php", _("Confirm Order Delivery Quantities and Produce Invoice"), "OrderNumber=$order_no"); + + hyperlink_params($_SERVER['PHP_SELF'], _("Enter a New Order"), "NewOrder=Yes"); + + display_footer_exit(); +} +//-------------------------------------------------------------------------------- + +if (isset($_GET['UpdatedID'])) +{ + $order_no = $_GET['UpdatedID']; + $trans_type = systypes::sales_order(); + + display_notification_centered(_("Order has been updated.") . " #$order_no"); + + display_note(get_trans_view_str($trans_type, $order_no, _("View this order"))); + + hyperlink_params($path_to_root . "/sales/customer_invoice.php", _("Confirm Order Delivery Quantities and Produce Invoice"), "OrderNumber=$order_no"); + + hyperlink_params($path_to_root . "/sales/inquiry/sales_orders_view.php", _("Select A Different Order"), "OutstandingOnly=1"); + + display_footer_exit(); +} + +//-------------------------------------------------------------------------------------------------- + +function copy_to_so() +{ + if ($_SESSION['Items']->direct_invoice) + $_SESSION['Items']->memo_ = $_POST['InvoiceText']; + + $_SESSION['Items']->orig_order_date = $_POST['OrderDate']; + $_SESSION['Items']->delivery_date = $_POST['delivery_date']; + $_SESSION['Items']->cust_ref = $_POST['cust_ref']; + $_SESSION['Items']->freight_cost = $_POST['freight_cost']; + $_SESSION['Items']->Comments = $_POST['Comments']; + + $_SESSION['Items']->deliver_to = $_POST['deliver_to']; + $_SESSION['Items']->delivery_address = $_POST["delivery_address"]; + $_SESSION['Items']->phone = $_POST["phone"]; + $_SESSION['Items']->Location = $_POST["Location"]; + $_SESSION['Items']->ship_via = $_POST["ship_via"]; +} + +//-------------------------------------------------------------------------------------------------- + +function copy_from_so() +{ + if ($_SESSION['Items']->direct_invoice) + $_POST['InvoiceText'] = $_SESSION['Items']->memo_; + + $_POST['OrderDate'] = $_SESSION['Items']->orig_order_date; + $_POST['delivery_date'] = $_SESSION['Items']->delivery_date; + $_POST['cust_ref'] = $_SESSION['Items']->cust_ref; + $_POST['freight_cost'] = $_SESSION['Items']->freight_cost; + $_POST['Comments'] = $_SESSION['Items']->Comments; + + $_POST['deliver_to'] = $_SESSION['Items']->deliver_to; + $_POST["delivery_address"] = $_SESSION['Items']->delivery_address; + $_POST["phone"] = $_SESSION['Items']->phone; + $_POST["Location"] = $_SESSION['Items']->Location; + $_POST["ship_via"] = $_SESSION['Items']->ship_via; +} + + +function can_process() +{ + if ($_SESSION['Items']->direct_invoice) + { + $edate = _("The entered invoice date is invalid."); + } + else + { + $edate = _("The entered order date is invalid."); + } + if (!is_date($_POST['OrderDate'])) + { + display_error($edate); + return false; + } + if ($_SESSION['Items']->direct_invoice && !is_date_in_fiscalyear($_POST['OrderDate'])) + { + display_error(_("The entered date is not in fiscal year")); + return false; + } + else + { + $_SESSION['Items']->orig_order_date = $_POST['OrderDate']; + } + if (count($_SESSION['Items']->line_items) == 0) + { + display_error(_("You must enter at least one line entry.")); + return false; + } + if (strlen($_POST['deliver_to']) <= 1) + { + display_error(_("You must enter the person or company to whom delivery should be made to.")); + return false; + } + + if (strlen($_POST['delivery_address']) <= 1) + { + display_error( _("You should enter the street address in the box provided. Orders cannot be accepted without a valid street address.")); + return false; + } + + if ($_POST['freight_cost'] == "") + $_POST['freight_cost'] = 0; + + if (!is_numeric($_POST['freight_cost'])) + { + display_error(_("The shipping cost entered is expected to be numeric.")); + return false; + } + + if (!is_date($_POST['delivery_date'])) + { + display_error(_("The delivery date is invalid.")); + return false; + } + + if (date1_greater_date2($_SESSION['Items']->orig_order_date, $_POST['delivery_date'])) + { + display_error(_("The requested delivery date is before the date of the order.")); + return false; + } + + $_SESSION['Items']->deliver_to = $_POST['deliver_to']; + $_SESSION['Items']->delivery_date = $_POST['delivery_date']; + $_SESSION['Items']->delivery_address = $_POST['delivery_address']; + $_SESSION['Items']->phone =$_POST['phone']; + if (isset($_POST['email'])) + $_SESSION['Items']->email =$_POST['email']; + else + $_SESSION['Items']->email = ""; + $_SESSION['Items']->Location = $_POST['Location']; + $_SESSION['Items']->cust_ref = $_POST['cust_ref']; + $_SESSION['Items']->Comments = $_POST['Comments']; + $_SESSION['Items']->freight_cost = $_POST['freight_cost']; + $_SESSION['Items']->ship_via = $_POST['ship_via']; + + return true; +} + +//----------------------------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessOrder']) && $_SESSION['Items']->order_no == 0 && can_process()) +{ + + $order_no = add_sales_order($_SESSION['Items']); + + if ($_SESSION['Items']->direct_invoice) + { + $_SESSION['Items']->memo_ = $_POST['InvoiceText']; + $_SESSION['Items']->memo_ = str_replace("'", "\\'", $_SESSION['Items']->memo_); + $_SESSION['Items']->order_no = $order_no; + meta_forward("$path_to_root/sales/customer_invoice.php", "process_invoice=Yes"); + + } + else + { + + unset($_SESSION['Items']->line_items); + unset($_SESSION['Items']); + + meta_forward($_SERVER['PHP_SELF'], "AddedID=$order_no"); + } +} + +//------------------------------------------------------------------------------------------------------------- + +if (isset($_POST['ProcessOrder']) && $_SESSION['Items']->order_no != 0 && can_process()) +{ + + update_sales_order($_SESSION['Items']->order_no, $_SESSION['Items']); + + $order_no = $_SESSION['Items']->order_no; + + unset($_SESSION['Items']->line_items); + unset($_SESSION['Items']); + + meta_forward($_SERVER['PHP_SELF'], "UpdatedID=$order_no"); +} + + +//-------------------------------------------------------------------------------- + +function check_item_data() +{ + if (!is_numeric($_POST['qty']) || $_POST['qty'] < 0 || $_POST['Disc'] > 100 || + $_POST['Disc'] < 0) + { + display_error( _("The item could not be updated because you are attempting to set the quantity ordered to less than 0, or the discount percent to more than 100.")); + return false; + } + elseif($_SESSION['Items']->some_already_delivered($_POST['stock_id']) != 0 && + $_SESSION['Items']->line_items[$_POST['stock_id']]->price != $_POST['price']) + { + display_error(_("The item you attempting to modify the price for has already had some quantity invoiced at the old price. The item unit price cannot be modified retrospectively.")); + return false; + } + elseif($_SESSION['Items']->some_already_delivered($_POST['stock_id']) != 0 && + $_SESSION['Items']->line_items[$_POST['stock_id']]->discount_percent != ($_POST['Disc']/100)) + { + display_error(_("The item you attempting to modify has had some quantity invoiced at the old discount percent. The items discount cannot be modified retrospectively.")); + return false; + } + elseif (isset($_SESSION['Items']->line_items[$_POST['stock_id']]) && $_SESSION['Items']->line_items[$_POST['stock_id']]->qty_inv > $_POST['qty']) + { + display_error(_("You attempting to make the quantity ordered a quantity less than has already been invoiced. The quantity delivered and invoiced cannot be modified retrospectively.")); + return false; + } + return true; +} + +function handle_update_item() +{ + if($_POST['UpdateItem'] != "" && check_item_data()) + { + $_SESSION['Items']->update_cart_item($_POST['stock_id'], $_POST['qty'], + $_POST['price'], ($_POST['Disc'] / 100)); + } +} + +//-------------------------------------------------------------------------------- + +function handle_delete_item() +{ + if($_GET['Delete'] != "") + { + $stock_id = $_GET['Delete']; + if($_SESSION['Items']->some_already_delivered($stock_id) == 0) + { + $_SESSION['Items']->remove_from_cart($stock_id); + } + else + { + display_error(_("This item cannot be deleted because some of it has already been invoiced.")); + } + } +} + +//-------------------------------------------------------------------------------- + +function handle_new_item() +{ + if (!check_item_data()) + return; + + add_to_order($_SESSION['Items'], $_POST['stock_id'], $_POST['qty'], + $_POST['price'], $_POST['Disc']/100); + $_POST['StockID2'] = $_POST['stock_id'] = ""; +} + +//-------------------------------------------------------------------------------- + +function handle_cancel_order() +{ + global $path_to_root; + + if ($_POST['CancelOrder'] != "") + { + $ok_to_delete = 1; //assume this in the first instance + + if (($_SESSION['Items']->order_no != 0) && + sales_order_has_invoices($_SESSION['Items']->order_no)) + { + $ok_to_delete = 0; + display_error(_("This order cannot be cancelled because some of it has already been invoiced. However, the line item quantities may be modified.")); + } + + if ($ok_to_delete == 1) + { + if($_SESSION['Items']->order_no != 0) + { + delete_sales_order($_SESSION['Items']->order_no); + } + $diriv = $_SESSION['Items']->direct_invoice; + $_SESSION['Items']->clear_items(); + $_SESSION['Items'] = new cart; + $_SESSION['Items']->direct_invoice = $diriv; + if ($diriv) + { + display_note(_("This sales invoice has been cancelled as requested."), 1); + hyperlink_params($path_to_root . "/sales/sales_order_entry.php", _("Enter a New Sales Invoice"), SID . "&NewInvoice=Yes"); + } + else + { + display_note(_("This sales order has been cancelled as requested."), 1); + hyperlink_params($path_to_root . "/sales/sales_order_entry.php", _("Enter a New Sales Order"), SID . "&NewOrder=Yes"); + } + br(1); + end_page(); + exit; + } + } +} + +//-------------------------------------------------------------------------------- + +function handle_new_order() +{ + /*New order entry - clear any existing order details from the Items object and initiate a newy*/ + if (isset($_SESSION['Items'])) + { + unset ($_SESSION['Items']->line_items); + unset ($_SESSION['Items']); + } + + session_register("Items"); + + $_SESSION['Items'] = new cart; + if (isset($_GET['NewInvoice'])) + $_SESSION['Items']->direct_invoice = true; + $_SESSION['Items']->customer_id = ""; + $_POST['OrderDate'] = Today(); + if (!is_date_in_fiscalyear($_POST['OrderDate'])) + $_POST['OrderDate'] = end_fiscalyear(); + $_SESSION['Items']->orig_order_date = $_POST['OrderDate']; +} + +//-------------------------------------------------------------------------------- + +if (isset($_GET['ModifyOrderNumber']) && $_GET['ModifyOrderNumber'] != "") +{ + + if (isset($_SESSION['Items'])) + { + unset ($_SESSION['Items']->line_items); + unset ($_SESSION['Items']); + } + + session_register("Items"); + + $_SESSION['Items'] = new cart; + $_SESSION['Items']->order_no = $_GET['ModifyOrderNumber']; + + /*read in all the selected order into the Items cart */ + + read_sales_order($_SESSION['Items']->order_no, $_SESSION['Items']); +} + +//-------------------------------------------------------------------------------- + +if (isset($_POST['CancelOrder'])) + handle_cancel_order(); + +if (isset($_GET['Delete']) || isset($_GET['Edit'])) + copy_from_so(); + +if (isset($_GET['Delete'])) + handle_delete_item(); + +if (isset($_POST['UpdateItem']) || isset($_POST['AddItem'])) + copy_to_so(); + +if (isset($_POST['UpdateItem'])) + handle_update_item(); + +if (isset($_POST['AddItem'])) + handle_new_item(); + +//-------------------------------------------------------------------------------- + +if (isset($_GET['NewOrder']) || isset($_GET['NewInvoice'])) +{ + handle_new_order(); +} +else +{ + if (!isset($_POST['customer_id'])) + $_POST['customer_id'] = $_SESSION['Items']->customer_id; + if (!isset($_POST['branch_id'])) + $_POST['branch_id'] = $_SESSION['Items']->Branch; + if (!isset($_POST['OrderDate'])) + $_POST['OrderDate'] = $_SESSION['Items']->orig_order_date; +} + +//-------------------------------------------------------------------------------- + +check_db_has_stock_items(_("There are no inventory items defined in the system.")); + +check_db_has_customer_branches(_("There are no customers, or there are no customers with branches. Please define customers and customer branches.")); + +if ($_SESSION['Items']->direct_invoice) +{ + $idate = _("Invoice Date:"); + $orderitems = _("Sales Invoice Items"); + $deliverydetails = _("Enter Delivery Details and Confirm Invoice"); + $cancelorder = _("Cancel Invoice"); +} +else +{ + $idate = _("Order Date:"); + $orderitems = _("Sales Order Items"); + $deliverydetails = _("Enter Delivery Details and Confirm Order"); + $cancelorder = _("Cancel Order"); +} +start_form(false, true); + +$customer_error = display_order_header($_SESSION['Items'], + ($_SESSION['Items']->any_already_delivered() == 0), $idate); + +if ($customer_error == "") +{ + start_table("$table_style width=80%", 10); + echo "
"; + display_order_summary($orderitems, $_SESSION['Items'], true); + echo "
"; + display_delivery_details($_SESSION['Items']); + echo "
"; // outer table + +/*Now the customer charged to details in a sub table*/ +start_table("$table_style width=100%"); +$th = array(_("Customer")); +table_header($th); + +label_row(null, $myrow["DebtorName"] . "
" . nl2br($myrow["address"]), "nowrap"); + +end_table(); +/*end of the small table showing charge to account details */ + +echo "
"; // outer table + +start_table("$table_style width=100%"); +$th = array(_("Branch")); +table_header($th); + +label_row(null, $branch["br_name"] . "
" . nl2br($branch["br_address"]), "nowrap"); +end_table(); + +echo "
"; // outer table + +start_table("$table_style width=100%"); +start_row(); +label_cells(_("Ref"), $myrow["reference"], "class='tableheader2'"); +label_cells(_("Date"), sql2date($myrow["tran_date"]), "class='tableheader2'"); +label_cells(_("Currency"), $myrow["curr_code"], "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Sales Type"), $myrow["sales_type"], "class='tableheader2'"); +label_cells(_("Shipping Company"), $myrow["shipper_name"], "class='tableheader2'"); +end_row(); +comments_display_row(11, $trans_id); +end_table(); + +echo "
"; // outer table + +/*Now the customer charged to details in a sub table*/ +start_table("$table_style width=100%"); +$th = array(_("Charge To")); +table_header($th); + +label_row(null, $myrow["DebtorName"] . "
" . nl2br($myrow["address"]), "nowrap"); + +end_table(); + +/*end of the small table showing charge to account details */ + +echo "
"; // outer table + +/*end of the main table showing the company name and charge to details */ + +start_table("$table_style width=100%"); +$th = array(_("Charge Branch")); +table_header($th); + +label_row(null, $branch["br_name"] . "
" . nl2br($branch["br_address"]), "nowrap"); +end_table(); + +echo "
"; // outer table + +start_table("$table_style width=100%"); +$th = array(_("Delivered To")); +table_header($th); + +label_row(null, $sales_order["deliver_to"] . "
" . nl2br($sales_order["delivery_address"]), + "nowrap"); +end_table(); + +echo "
"; // outer table + +start_table("$table_style width=100%"); +start_row(); +label_cells(_("Reference"), $myrow["reference"], "class='tableheader2'"); +label_cells(_("Currency"), $sales_order["curr_code"], "class='tableheader2'"); +label_cells(_("Our Order No"), + get_customer_trans_view_str(systypes::sales_order(),$sales_order["order_no"]), "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Customer Order Ref."), $sales_order["customer_ref"], "class='tableheader2'"); +label_cells(_("Shipping Company"), $myrow["shipper_name"], "class='tableheader2'"); +label_cells(_("Sales Type"), $myrow["sales_type"], "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Invoice Date"), sql2date($myrow["tran_date"]), "class='tableheader2'", "nowrap"); +label_cells(_("Due Date"), sql2date($myrow["due_date"]), "class='tableheader2'", "nowrap"); +end_row(); +comments_display_row(10, $trans_id); +end_table(); + +echo "
"; +display_heading2(_("Order Information")); +echo ""; +display_heading2(_("Sales Invoices")); +echo ""; +display_heading2(_("Credit Notes")); +echo "
"; + +start_table("$table_style width=95%"); +label_row(_("Customer Name"), $_SESSION['Items']->customer_name, "class='tableheader2'", + "colspan=3"); +start_row(); +label_cells(_("Customer Order Ref."), $_SESSION['Items']->cust_ref, "class='tableheader2'"); +label_cells(_("Deliver To Branch"), $_SESSION['Items']->deliver_to, "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Ordered On"), $_SESSION['Items']->orig_order_date, "class='tableheader2'"); +label_cells(_("Requested Delivery"), $_SESSION['Items']->delivery_date, "class='tableheader2'"); +end_row(); +start_row(); +label_cells(_("Order Currency"), $_SESSION['Items']->customer_currency, "class='tableheader2'"); +label_cells(_("Deliver From Location"), $_SESSION['Items']->location_name, "class='tableheader2'"); +end_row(); + +label_row(_("Delivery Address"), nl2br($_SESSION['Items']->delivery_address), + "class='tableheader2'", "colspan=3"); +label_row(_("Telephone"), $_SESSION['Items']->phone, "class='tableheader2'", "colspan=3"); +label_row(_("E-mail"), "email . "'>" . $_SESSION['Items']->email . "", + "class='tableheader2'", "colspan=3"); +label_row(_("Comments"), $_SESSION['Items']->Comments, "class='tableheader2'", "colspan=3"); +end_table(); + +echo ""; + +start_table($table_style); + +$th = array(_("#"), _("Ref"), _("Date"), _("Total")); +table_header($th); + +$sql = "SELECT * FROM ".TB_PREF."debtor_trans WHERE type=10 AND order_=" . $_GET['trans_no']; +$result = db_query($sql,"The related invoices could not be retreived"); + +$invoices_total = 0; +$k = 0; + +while ($inv_row = db_fetch($result)) +{ + + alt_table_row_color($k); + + $this_total = $inv_row["ov_freight"] + $inv_row["ov_gst"] + $inv_row["ov_amount"]; + $invoices_total += $this_total; + + label_cell(get_customer_trans_view_str($inv_row["type"], $inv_row["trans_no"])); + label_cell($inv_row["reference"]); + label_cell(sql2date($inv_row["tran_date"])); + amount_cell($this_total); + end_row(); + +} + +label_row(null, number_format2($invoices_total,user_price_dec()), "", "colspan=4 align=right"); + +end_table(); + +echo ""; +start_table($table_style); +$th = array(_("#"), _("Ref"), _("Date"), _("Total")); +table_header($th); + +$sql = "SELECT * FROM ".TB_PREF."debtor_trans WHERE type=11 AND order_=" . $_GET['trans_no']; +$result = db_query($sql,"The related credit notes could not be retreived"); + +$credits_total = 0; +$k = 0; + +while ($credits_row = db_fetch($result)) +{ + + alt_table_row_color($k); + + $this_total = $credits_row["ov_freight"] + $credits_row["ov_gst"] + $credits_row["ov_amount"]; + $credits_total += $this_total; + + label_cell(get_customer_trans_view_str($credits_row["type"], $credits_row["trans_no"])); + label_cell($credits_row["reference"]); + label_cell(sql2date($credits_row["tran_date"])); + amount_cell(-$this_total); + end_row(); + +} + +label_row(null, "" . number_format2(-$credits_total,user_price_dec()) . "", + "", "colspan=4 align=right"); + + +end_table(); + +echo "
" . $myrow["type" . $i] . "
"; + } + } + +?> \ No newline at end of file diff --git a/themes/cool/default.css b/themes/cool/default.css new file mode 100644 index 00000000..146063c2 --- /dev/null +++ b/themes/cool/default.css @@ -0,0 +1,337 @@ +/*--------------------------------------------------\ +| cool | | default.css | +|---------------------------------------------------| +| For use with: | +| FrontAccounting | +| http://FrontAccounting.com/ | +| by Joe Hunt Consulting | +|---------------------------------------------------| +| Developer: | +| Joe Hunt | +| | +|---------------------------------------------------| +| Note: | +| Changes can be made to this CSS that will be | +| reflected throughout FrontAccounting. | +| | +\--------------------------------------------------*/ + +body { + font-family: Verdana, Arial, Helvetica; + background: #528cab; + font-size: 10px; + margin: 5px 0 0 5px; + padding: 0; +} + +tr, td, th { + font-size: 11px; + line-height: 19px; +} + +textarea { + font-size: 12px; +} + +input, select { + font-size: 11px; + padding: 1px; +} + +input.big { + width: 100px; +} + +input.small { + width: 50px; +} + +a { + color: #0000bb; + font-size: 11px; + text-decoration: none; +} + +a:link { + color: #00000bb; + text-decoration: none; +} + +a:active { + color: #000000; + text-decoration: none; +} + +a:hover { + color: #2d8628; + text-decoration: underline; +} + + +.login { + background-color: #ffffff; + border: none; +} + +.callout_main { + font-family: Verdana, Arial, Helvetica; + border: none; + width: 99%; + margin: 0; + padding: 0; +} + +.main_page { + background-color: #f9f9f9; + border: none; + width: 100%; + margin: 0; + padding: 0; +} + +.quick_menu { + background-color: #528cab; + border: 0; + margin: 0; + padding: 0; + text-align: right; +} + +.quick_menu_selected { + font-family: Verdana, Arial, Helvetica; + font-size: 13px; + border: none; + white-space: nowrap; + margin: 2px; + padding: 2px; + color: #00cc00; + font-weight: bolder; +} + +.logoutBar { + padding-right: 1em; + background: #d5b7a7; + color: black; + border-bottom: 1px solid #c0b67c; + width: 100%; +} + +.bottomBar { + padding-right: 1em; + background: #d5b7a7; + color: black; + border-bottom: 1px solid #c0b67c; + width: 100%; +} + +.bottomBarCell { + font-size: 10px; + line-height: 12px; +} + +.bottomBar2 { + padding-right: 1em; + background: #d5b7a7; + color: black; + border-top: 1px solid #c0b67c; + border-bottom: 1px solid #c0b67c; + width: 100%; +} + +.logoutBarRight { + text-align: right; +} + +div.logoutBar { + padding-right: 1em; + background: #d5b7a7; + color: black; + border-bottom: 1px solid #c0b67c; + text-align: right; +} +div.logoutBar a { + font-weight: normal; + margin-left: 1em; + color: #436976; + background-color: transparent; +} +div.logoutBar img { + vertical-align: top; +} + +div.tabs { + padding: 0.5em 0 0 0; + background: none transparent scroll repeat 0% 0%; + white-space: nowrap; + border-collapse: collapse; + border-bottom: 1px solid #c0b67c; + +} +div.tabs a { + border: 1px solid #c0b67c; + padding: 0 1em 3px 1em; + font-weight: normal; + background: white scroll repeat 0% 0%; + color: #436976; + margin-right: 0.0em; + height: 1.0em; +} +div.tabs a.selected { + border-top: 1px solid #c0b67c; + border-right: 1px solid #c0b67c; + border-bottom: 1px solid #d5b7a7; + border-left: 1px solid #c0b67c; + font-weight: normal; + background: #d5b7a7; + color: #436976; +} +div.tabs a:hover { + border-top-color: #c0b67c; + border-right-color: #c0b67c + border-bottom-color: #d5b7a7; + border-left-color: #c0b67c; + background: #d5b7a7; + color: #436976; +} + +.menu_group { + font-size: 13px; + padding: 0px; + color: #000000; + background-color: #d5b7a7; + PADDING-LEFT: 3px; + font-weight: bold; +} + +.menu_group_items { + background-color: #f9f9f9; + font-weight: normal; + padding: 9px; + border: 1px solid #c0b67c; +} + +#footer { + position: relative; + bottom: -3px; +} + +.footer { + font-family: Verdana, Arial, Helvetica; + color: #cccccc; + font-weight: normal; + font-size: 9px; +} + +.tableheader { + font-weight: bold; + background-color: #c5d5a7; + color: black; + text-align: center; +} + +.tableheader2 { + font-weight: bold; + background-color: #c5d5a7; + color: black; + text-align: left; +} + +.tableseparator { + border-left: 1px #444466 solid; +} + +.titletext { + font-weight: bold; + font-size: 13px; + border-bottom: 1px solid #c0b67c; + padding: 5px; +} + +.headingtext { + font-weight: bold; + font-size: 13px; + color: black; +} + +.headingtext2 { + font-size: 13px; + color: black; +} + +.headingtext3 { + font-weight: bold; + font-size: 10px; + color: black; +} + +.errortext { + font-size: 13px; + color: #ff0000; + font-weight: bold; +} + +.inputsubmit { + font-size: 11px; + border: 1px solid #0066cc; + padding: 1px 4px; +} + +.oddrow { + background-color: #eeeeee; +} + +.evenrow { + background-color: #dddddd; +} + +.overduebg { + background-color: #dd7777; +} + +.overduefg { + color: #dd7777; +} + +.currentfg { + color: #ff6666; +} + +.redfg { + color: red; + font-weight: bold; +} + +.settledbg { + background-color: #00bb00; +} + +.settledfg { + color: #00bb00; +} + +.inquirybg { + background-color: #fdfeef; +} + +.currencybg { + background-color: #ee8888; +} + +.stockmankobg { + background-color: pink; +} + +.tablestyle { + padding: 3px; + border: 1 solid #c0b67c; + border-collapse: collapse; +} + +.tablestyle2 { + padding: 0 3px; + border: 1px solid #ccc; + border-collapse: collapse; +} +.tablestyle_noborder { + padding: 3px; +} \ No newline at end of file diff --git a/themes/cool/index.php b/themes/cool/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/themes/cool/index.php @@ -0,0 +1,3 @@ + diff --git a/themes/cool/renderer.php b/themes/cool/renderer.php new file mode 100644 index 00000000..84161fe1 --- /dev/null +++ b/themes/cool/renderer.php @@ -0,0 +1,67 @@ +get_selected_application(); + + foreach ($selected_app->modules as $module) + { + // image + echo ""; + // values + echo ""; + echo ""; + echo ""; + echo ""; + //echo "\nOA_current_user name = " . $_SESSION["wa_current_user"]->username; + if (sizeof($module->rappfunctions) > 0) + { + echo ""; + } + + echo "
"; + } + + echo ""; + } + } + +?> \ No newline at end of file diff --git a/themes/default/default.css b/themes/default/default.css new file mode 100644 index 00000000..1aad1825 --- /dev/null +++ b/themes/default/default.css @@ -0,0 +1,332 @@ +/*--------------------------------------------------\ +| default | | default.css | +|---------------------------------------------------| +| For use with: | +| FrontAccounting | +| http://FrontAccounting.com/ | +| by Joe Hunt Consulting | +|---------------------------------------------------| +| Developer: | +| Joe Hunt | +| | +|---------------------------------------------------| +| Note: | +| Changes can be made to this CSS that will be | +| reflected throughout FrontAccounting. | +| | +\--------------------------------------------------*/ + +body { + font-family: Verdana, Arial, Helvetica; + background: #285b86; + font-size: 10px; + margin: 5px 0 0 5px; + padding: 0; +} + +tr, td, th { + font-size: 11px; + line-height: 19px; +} + +textarea { + font-size: 12px; +} + +input, select { + font-size: 11px; + padding: 1px; +} + +input.big { + width: 100px; +} + +input.small { + width: 50px; +} + +a { + color: #0000bb; + font-size: 11px; + text-decoration: none; +} + +a:link { + color: #0000bb; + text-decoration: none; +} + +a:active { + color: #000000; + text-decoration: none; +} + +a:hover { + color: #2d8628; + text-decoration: underline; +} + +.login { + background-color: #ffffff; + border: none; +} + +.callout_main { + font-family: Verdana, Arial, Helvetica; + border: none; + width: 99%; + margin: 0; + padding: 0; +} + +.main_page { + background-color: #f9f9f9; + border: none; + width: 100%; + margin: 0; + padding: 0; +} + +.quick_menu { + background-color: #285b86; + border: 0; + margin: 0; + padding: 0; + text-align: right; +} + +.quick_menu_selected { + font-family: Verdana, Arial, Helvetica; + font-size: 13px; + border: none; + white-space: nowrap; + margin: 2px; + padding: 2px; + color: #00cc00; + font-weight: bolder; +} + +.logoutBar { + padding-right: 1em; + background: #dee7ec; + color: black; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.bottomBar { + padding-right: 1em; + background: #dee7ec; + color: black; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.bottomBarCell { + font-size: 10px; + line-height: 12px; +} + +.bottomBar2 { + padding-right: 1em; + background: #dee7ec; + color: black; + border-top: 1px solid #8cacbb; + border-bottom: 1px solid #8cacbb; + width: 100%; +} + +.logoutBarRight { + text-align: right; +} + +div.logoutBar { + padding-right: 1em; + background: #dee7ec; + color: black; + border-bottom: 1px solid #8cacbb; + text-align: right; +} +div.logoutBar a { + font-weight: normal; + margin-left: 1em; + color: #436976; + background-color: transparent; +} +div.logoutBar img { + vertical-align: top; +} + +div.tabs { + padding: 0.5em 0 0 0; + background: none transparent scroll repeat 0% 0%; + white-space: nowrap; + border-collapse: collapse; + border-bottom: 1px solid #8cacbb; + +} +div.tabs a { + border: 1px solid #8cacbb; + padding: 0 1em 3px 1em; + font-weight: normal; + background: white scroll repeat 0% 0%; + color: #436976; + margin-right: 0.0em; + height: 1.0em; +} +div.tabs a.selected { + border-top: 1px solid #8cacbb; + border-right: 1px solid #8cacbb; + border-bottom: 1px solid #dee7ec; + border-left: 1px solid #8cacbb; + font-weight: normal; + background: #dee7ec; + color: #436976; +} +div.tabs a:hover { + background: #dee7ec; + color: #436976; +} + +.menu_group { + font-size: 13px; + padding: 0px; + color: #000000; + background-color: #dee7ec; + padding-left: 3px; + font-weight: bold; +} + +.menu_group_items { + background-color: #f9f9f9; + font-weight: normal; + padding: 9px; + border: 1px solid #8cacbb; +} + +#footer { + position: relative; + bottom: -3px; +} + +.footer { + font-family: Verdana, Arial, Helvetica; + color: #cccccc; + font-weight: normal; + font-size: 9px; +} + +.tableheader { + font-weight: bold; + background-color: #dee7ec; + color: black; + text-align: center; +} + +.tableheader2 { + font-weight: bold; + background-color: #dee7ec; + color: black; + text-align: left; +} + +.tableseparator { + border-left: 1px solid #444466; +} + +.titletext { + font-weight: bold; + font-size: 13px; + border-bottom: 1px solid #8cacbb; + padding: 5px; +} + +.headingtext { + font-weight: bold; + font-size: 13px; + color: black; +} + +.headingtext2 { + font-size: 13px; + color: black; +} + +.headingtext3 { + font-weight: bold; + font-size: 10px; + color: black; +} + +.errortext { + font-size: 13px; + color: #ff0000; + font-weight: bold; +} + +.inputsubmit { + font-size: 11px; + border: 1px #0066cc solid; + padding: 1px 4px; +} + +.oddrow { + background-color: #eeeeee; +} + +.evenrow { + background-color: #dddddd; +} + +.overduebg { + background-color: #dd7777; +} + +.overduefg { + color: #dd7777; +} + +.currentfg { + color: #ff6666; +} + +.redfg { + color: red; + font-weight: bold; +} + +.settledbg { + background-color: #00bb00; +} + +.settledfg { + color: #00bb00; +} + +.inquirybg { + background-color: #fdfeef; +} + +.currencybg { + background-color: #ee8888; +} + +.stockmankobg { + background-color: pink; +} + +.tablestyle { + padding: 3px; + border: 1px solid #8cacbb; + border-collapse: collapse; +} + +.tablestyle2 { + padding: 0 3px; + border: 1px solid #ccc; + border-collapse: collapse; +} +.tablestyle_noborder { + padding: 3px; +} \ No newline at end of file diff --git a/themes/default/images/logo_frontaccounting.jpg b/themes/default/images/logo_frontaccounting.jpg new file mode 100644 index 0000000000000000000000000000000000000000..130a31dd208964c4affc47537b4bb8878a0b4369 GIT binary patch literal 6467 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 O0m2u}|6hz`&in@l6FX)A literal 0 HcmV?d00001 diff --git a/themes/default/images/logo_frontaccounting.png b/themes/default/images/logo_frontaccounting.png new file mode 100644 index 0000000000000000000000000000000000000000..85150e2bbec2bdf03536d2d3f095e8bd15df1274 GIT binary patch literal 10792 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 literal 0 HcmV?d00001 diff --git a/themes/default/images/spacer.png b/themes/default/images/spacer.png new file mode 100644 index 0000000000000000000000000000000000000000..88178d157565849d9d40004948703b3ebcabf545 GIT binary patch literal 1136 zcmd^7OKTHR6h3Jyd0-@jVJOl?3S9)$;-X+IE~-v+0upLkY6Zd8q^&K2(74mf{^bBWbpI61=y2W9H zEDpvRS547=+XN3=2Ze6xR9KTWX$I%#zpC`{jw#Ykg}7!8xdC6e(nyu|MfsK(xSL;A z#RV`lOq!y1yejey3YCD#U~ea!^CI$muR<>#nc^*c5_t>Nk!x0^y?EPxI2+exEZ3d0 z>vBEjW8-)1Kn%)^sOPe^U+dW>{R<9U)UyC?ZAKe_cK@xZqvd(IqZP92q)8dm_9OK+Sfr*l&dI_Q=$^YDxIfpgd% zIBO$-ENS$|2gX{5hFNO1u~t|!WvL~iHd}LPTXU?FGG@&f7yKL6R_z*t6}5Sd2En!b zS)~!gyU-MCmieFBXUUQ#wfQM??ikN46^nLB5Ci{H^W6V&2px1A`spOmt|@lM^u>t; fHa!vTaCiD~ybtR-a_FzeN3o(vII6um(s%t2Bi|qL literal 0 HcmV?d00001 diff --git a/themes/default/index.php b/themes/default/index.php new file mode 100644 index 00000000..763940a7 --- /dev/null +++ b/themes/default/index.php @@ -0,0 +1,3 @@ + diff --git a/themes/default/login.css b/themes/default/login.css new file mode 100644 index 00000000..1864b5dc --- /dev/null +++ b/themes/default/login.css @@ -0,0 +1,45 @@ +/*--------------------------------------------------\ +| | | login.css | +|---------------------------------------------------| +| For use with: | +| OpenAccounting | +| http://open-accounting.sourceforge.net/ | +| by KylieTech Consulting | +|---------------------------------------------------| +| Developer: | +| Shane Barnaby | +| | +|---------------------------------------------------| +| Note: | +| Changes can be made to this CSS that will be | +| reflected on the login screen. | +| | +| | +\--------------------------------------------------*/ + +body { + background: #518fad; + font-family: arial, verdana; + font-size: 10px; +} + +.loginText { + font-family: arial, verdana; + font-size: 10px; +} + +a:hover { + text-decoration: underline; +} + +input.big { + width: 100px; +} + +input.small { + width: 50px; +} + +td.login { + background: #dddddd; +} \ No newline at end of file diff --git a/themes/default/renderer.php b/themes/default/renderer.php new file mode 100644 index 00000000..d03993a6 --- /dev/null +++ b/themes/default/renderer.php @@ -0,0 +1,66 @@ +get_selected_application(); + foreach ($selected_app->modules as $module) + { + // image + echo ""; + // values + echo ""; + echo ""; + echo ""; + echo ""; + //echo "\nOA_current_user name = " . $_SESSION["wa_current_user"]->username; + if (sizeof($module->rappfunctions) > 0) + { + echo ""; + } + + echo "
"; + } + + echo ""; + } + } + +?> \ No newline at end of file -- 2.30.2