summaryrefslogtreecommitdiff
path: root/plugins/pythondemo
blob: 911f4d7d9fefd8a4dc2e151ad5d6a638db00bc83 (plain)
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # pythondemo — demo Python ikiwiki plugin
  5. #
  6. # Copyright © martin f. krafft <madduck@madduck.net>
  7. # Released under the terms of the GNU GPL version 2
  8. #
  9. __name__ = 'pythondemo'
  10. __description__ = 'demo Python ikiwiki plugin'
  11. __version__ = '0.1'
  12. __author__ = 'martin f. krafft <madduck@madduck.net>'
  13. __copyright__ = 'Copyright © ' + __author__
  14. __licence__ = 'GPLv2'
  15. from proxy import IkiWikiProcedureProxy
  16. import sys
  17. def debug(s):
  18. sys.stderr.write(__name__ + ':DEBUG:%s\n' % s)
  19. sys.stderr.flush()
  20. proxy = IkiWikiProcedureProxy(__name__, debug_fn=None)
  21. def _arglist_to_dict(args):
  22. if len(args) % 2 != 0:
  23. raise ValueError, 'odd number of arguments, cannot convert to dict'
  24. return dict([args[i:i+2] for i in xrange(0, len(args), 2)])
  25. def getopt_demo(proxy, *args):
  26. # This allows for plugins to perform their own processing of command-line
  27. # options and so add options to the ikiwiki command line. It's called
  28. # during command line processing, with @ARGV full of any options that
  29. # ikiwiki was not able to process on its own. The function should process
  30. # any options it can, removing them from @ARGV, and probably recording the
  31. # configuration settings in %config. It should take care not to abort if
  32. # it sees an option it cannot process, and should just skip over those
  33. # options and leave them in @ARGV.
  34. #
  35. debug("hook `getopt' called with arguments %s" % str(args))
  36. args = proxy.getargv()
  37. if '--demo' in args:
  38. args = [i for i in args if i != '--demo']
  39. proxy.setargv(args)
  40. proxy.hook('getopt', getopt_demo)
  41. def checkconfig_demo(proxy, *args):
  42. # This is useful if the plugin needs to check for or modify ikiwiki's
  43. # configuration. It's called early in the startup process. The function is
  44. # passed no values. It's ok for the function to call error() if something
  45. # isn't configured right.
  46. debug("hook `checkconfig' called with arguments %s" % str(args))
  47. # check that --url has been set
  48. url = proxy.getvar('config', 'url')
  49. if url is None or len(url) == 0:
  50. proxy.error('--url has not been set')
  51. proxy.hook('checkconfig', checkconfig_demo)
  52. def refresh_demo(proxy, *args):
  53. # This hook is called just before ikiwiki scans the wiki for changed
  54. # files. It's useful for plugins that need to create or modify a source
  55. # page. The function is passed no values.
  56. debug("hook `refresh' called with arguments %s" % str(args))
  57. proxy.hook('refresh', refresh_demo)
  58. def needsbuild_demo(proxy, *args):
  59. # This allows a plugin to manipulate the list of files that need to be
  60. # built when the wiki is refreshed. The function is passed a reference to
  61. # an array of pages that will be rebuilt, and can modify the array, either
  62. # adding or removing files from it.
  63. # TODO: how do we modify the array? Joey sees no solution...
  64. # we could just return the array and expect ikiwiki to use that...
  65. debug("hook `needsbuild' called with arguments %s" % str(args))
  66. raise NotImplementedError
  67. #proxy.hook('needsbuild', needsbuild_demo)
  68. def filter_demo(proxy, *args):
  69. # Runs on the raw source of a page, before anything else touches it, and
  70. # can make arbitrary changes. The function is passed named parameters
  71. # "page", "destpage", and "content". It should return the filtered
  72. # content.
  73. kwargs = _arglist_to_dict(args)
  74. debug("hook `filter' called with arguments %s" % kwargs);
  75. return kwargs['content']
  76. proxy.hook('filter', filter_demo)
  77. def preprocess_demo(proxy, *args):
  78. # Each time the directive is processed, the referenced function
  79. # (preprocess in the example above) is called, and is passed named
  80. # parameters. A "page" parameter gives the name of the page that embedded
  81. # the preprocessor directive, while a "destpage" parameter gives the name
  82. # of the page the content is going to (different for inlined pages), and
  83. # a "preview" parameter is set to a true value if the page is being
  84. # previewed. All parameters included in the directive are included as
  85. # named parameters as well. Whatever the function returns goes onto the
  86. # page in place of the directive.
  87. #
  88. # An optional "scan" parameter, if set to a true value, makes the hook be
  89. # called during the preliminary scan that ikiwiki makes of updated pages,
  90. # before begining to render pages. This parameter should be set to true if
  91. # the hook modifies data in %links. Note that doing so will make the hook
  92. # be run twice per page build, so avoid doing it for expensive hooks. (As
  93. # an optimisation, if your preprocessor hook is called in a void contets,
  94. # you can assume it's being run in scan mode.)
  95. #
  96. # Note that if the htmlscrubber is enabled, html in PreProcessorDirective
  97. # output is sanitised, which may limit what your plugin can do. Also, the
  98. # rest of the page content is not in html format at preprocessor time.
  99. # Text output by a preprocessor directive will be linkified and passed
  100. # through markdown (or whatever engine is used to htmlize the page) along
  101. # with the rest of the page.
  102. #
  103. kwargs = _arglist_to_dict(args)
  104. debug("hook `preprocess' called with arguments %s" % kwargs)
  105. del kwargs['preview']
  106. del kwargs['page']
  107. del kwargs['destpage']
  108. ret = 'foobar preprocessor called with arguments:'
  109. for i in kwargs.iteritems():
  110. ret += ' %s=%s' % i
  111. return ret
  112. # put [[!foobar ...]] somewhere to try this
  113. proxy.hook('preprocess', preprocess_demo, id='foobar')
  114. def linkify_demo(proxy, *args):
  115. # This hook is called to convert WikiLinks on the page into html links.
  116. # The function is passed named parameters "page", "destpage", and
  117. # "content". It should return the linkified content.
  118. #
  119. # Plugins that implement linkify must also implement a scan hook, that
  120. # scans for the links on the page and adds them to %links.
  121. kwargs = _arglist_to_dict(args)
  122. debug("hook `linkify' called with arguments %s" % kwargs)
  123. return kwargs['content']
  124. proxy.hook('linkify', linkify_demo)
  125. def scan_demo(proxy, *args):
  126. # This hook is called early in the process of building the wiki, and is
  127. # used as a first pass scan of the page, to collect metadata about the
  128. # page. It's mostly used to scan the page for WikiLinks, and add them to
  129. # %links.
  130. #
  131. # The function is passed named parameters "page" and "content". Its return
  132. # value is ignored.
  133. #
  134. kwargs = _arglist_to_dict(args)
  135. debug("hook `scan' called with arguments %s" % kwargs)
  136. links = proxy.getvar('links', kwargs['page'])
  137. debug("links for page `%s' are: %s" % (kwargs['page'], links))
  138. proxy.setvar('links', kwargs['page'], links)
  139. proxy.hook('scan', scan_demo)
  140. def htmlize_demo(proxy, *args):
  141. # Runs on the raw source of a page and turns it into html. The id
  142. # parameter specifies the filename extension that a file must have to be
  143. # htmlized using this plugin. This is how you can add support for new and
  144. # exciting markup languages to ikiwiki.
  145. #
  146. # The function is passed named parameters: "page" and "content" and should
  147. # return the htmlized content.
  148. kwargs = _arglist_to_dict(args)
  149. debug("hook `htmlize' called with arguments %s" % kwargs)
  150. return kwargs['content']
  151. proxy.hook('htmlize', htmlize_demo)
  152. def pagetemplate_demo(proxy, *args):
  153. # Templates are filled out for many different things in ikiwiki, like
  154. # generating a page, or part of a blog page, or an rss feed, or a cgi.
  155. # This hook allows modifying the variables available on those templates.
  156. # The function is passed named parameters. The "page" and "destpage"
  157. # parameters are the same as for a preprocess hook. The "template"
  158. # parameter is a HTML::Template object that is the template that will be
  159. # used to generate the page. The function can manipulate that template
  160. # object.
  161. #
  162. # The most common thing to do is probably to call $template->param() to
  163. # add a new custom parameter to the template.
  164. # TODO: how do we call $template->param()?
  165. kwargs = _arglist_to_dict(args)
  166. debug("hook `pagetemplate' called with arguments %s" % kwargs)
  167. raise NotImplementedError
  168. #proxy.hook('pagetemplate', pagetemplate_demo)
  169. def templatefile_demo(proxy, *args):
  170. # This hook allows plugins to change the template that is used for a page
  171. # in the wiki. The hook is passed a "page" parameter, and should return
  172. # the name of the template file to use, or undef if it doesn't want to
  173. # change the default ("page.tmpl"). Template files are looked for in
  174. # /usr/share/ikiwiki/templates by default.
  175. #
  176. kwargs = _arglist_to_dict(args)
  177. debug("hook `templatefile' called with arguments %s" % kwargs)
  178. return None #leave the default
  179. proxy.hook('templatefile', templatefile_demo)
  180. def sanitize_demo(proxy, *args):
  181. # Use this to implement html sanitization or anything else that needs to
  182. # modify the body of a page after it has been fully converted to html.
  183. #
  184. # The function is passed named parameters: "page" and "content", and
  185. # should return the sanitized content.
  186. kwargs = _arglist_to_dict(args)
  187. debug("hook `sanitize' called with arguments %s" % kwargs)
  188. return kwargs['content']
  189. proxy.hook('sanitize', sanitize_demo)
  190. def format_demo(proxy, *args):
  191. # The difference between format and sanitize is that sanitize only acts on
  192. # the page body, while format can modify the entire html page including
  193. # the header and footer inserted by ikiwiki, the html document type, etc.
  194. #
  195. # The function is passed named parameters: "page" and "content", and
  196. # should return the formatted content.
  197. kwargs = _arglist_to_dict(args)
  198. debug("hook `format' called with arguments %s" % kwargs)
  199. return kwargs['content']
  200. proxy.hook('format', format_demo)
  201. def delete_demo(proxy, *args):
  202. # Each time a page or pages is removed from the wiki, the referenced
  203. # function is called, and passed the names of the source files that were
  204. # removed.
  205. debug("hook `delete' called with arguments %s" % str(args))
  206. proxy.hook('delete', delete_demo)
  207. def change_demo(proxy, *args):
  208. # Each time ikiwiki renders a change or addition (but not deletion) to the
  209. # wiki, the referenced function is called, and passed the names of the
  210. # source files that were rendered.
  211. debug("hook `change' called with arguments %s" % str(args))
  212. proxy.hook('change', change_demo)
  213. def cgi_demo(proxy, *args):
  214. # Use this to hook into ikiwiki's cgi script. Each registered cgi hook is
  215. # called in turn, and passed a CGI object. The hook should examine the
  216. # parameters, and if it will handle this CGI request, output a page
  217. # (including the http headers) and terminate the program.
  218. #
  219. # Note that cgi hooks are called as early as possible, before any ikiwiki
  220. # state is loaded, and with no session information.
  221. debug("hook `cgi' called with arguments %s" % str(args))
  222. raise NotImplementedError
  223. #proxy.hook('cgi', cgi_demo)
  224. def auth_demo(proxy, *args):
  225. # This hook can be used to implement a different authentication method
  226. # than the standard web form. When a user needs to be authenticated, each
  227. # registered auth hook is called in turn, and passed a CGI object and
  228. # a session object.
  229. #
  230. # If the hook is able to authenticate the user, it should set the session
  231. # object's "name" parameter to the authenticated user's name. Note that if
  232. # the name is set to the name of a user who is not registered, a basic
  233. # registration of the user will be automatically performed.
  234. #
  235. # TODO: how do we set the session parameter?
  236. debug("hook `auth' called with arguments %s" % str(args))
  237. raise NotImplementedError
  238. #proxy.hook('auth', auth_demo)
  239. def sessioncgi_demo(proxy, *args):
  240. # Unlike the cgi hook, which is run as soon as possible, the sessioncgi
  241. # hook is only run once a session object is available. It is passed both
  242. # a CGI object and a session object. To check if the user is in fact
  243. # signed in, you can check if the session object has a "name" parameter
  244. # set.
  245. debug("hook `sessioncgi' called with arguments %s" % str(args))
  246. raise NotImplementedError
  247. #proxy.hook('sessioncgi', sessioncgi_demo)
  248. def canedit_demo(proxy, *args):
  249. # This hook can be used to implement arbitrary access methods to control
  250. # when a page can be edited using the web interface (commits from revision
  251. # control bypass it). When a page is edited, each registered canedit hook
  252. # is called in turn, and passed the page name, a CGI object, and a session
  253. # object.
  254. #
  255. # If the hook has no opinion about whether the edit can proceed, return
  256. # undef, and the next plugin will be asked to decide. If edit can proceed,
  257. # the hook should return "". If the edit is not allowed by this hook, the
  258. # hook should return an error message for the user to see, or a function
  259. # that can be run to log the user in or perform other action necessary for
  260. # them to be able to edit the page.
  261. #
  262. # This hook should avoid directly redirecting the user to a signin page,
  263. # since it's sometimes used to test to see which pages in a set of pages
  264. # a user can edit.
  265. #
  266. # TODO: how do we return a function?
  267. debug("hook `canedit' called with arguments %s" % str(args))
  268. raise NotImplementedError
  269. #proxy.hook('canedit', canedit_demo)
  270. def editcontent_demo(proxy, *args):
  271. # This hook is called when a page is saved (or previewed) using the web
  272. # interface. It is passed named parameters: content, page, cgi, and
  273. # session. These are, respectively, the new page content as entered by the
  274. # user, the page name, a CGI object, and the user's CGI::Session.
  275. #
  276. # It can modify the content as desired, and should return the content.
  277. kwargs = _arglist_to_dict(args)
  278. debug("hook `editcontent' called with arguments %s" % kwargs)
  279. return kwargs['content']
  280. proxy.hook('editcontent', editcontent_demo)
  281. def formbuilder_setup_demo(proxy, *args):
  282. # These hooks allow tapping into the parts of ikiwiki that use
  283. # CGI::FormBuilder to generate web forms. These hooks are passed named
  284. # parameters: cgi, session, form, and buttons. These are, respectively,
  285. # the CGI object, the user's CGI::Session, a CGI::FormBuilder, and
  286. # a reference to an array of names of buttons to go on the form.
  287. #
  288. # Each time a form is set up, the formbuilder_setup hook is called.
  289. # Typically the formbuilder_setup hook will check the form's title, and if
  290. # it's a form that it needs to modify, will call various methods to
  291. # add/remove/change fields, tweak the validation code for the fields, etc.
  292. # It will not validate or display the form.
  293. #
  294. # Just before a form is displayed to the user, the formbuilder hook is
  295. # called. It can be used to validate the form, but should not display it.
  296. #
  297. # TODO: how do we modify the form?
  298. kwargs = _arglist_to_dict(args)
  299. debug("hook `formbuilder_setup' called with arguments %s" % kwargs)
  300. raise NotImplementedError
  301. return kwargs['content']
  302. #proxy.hook('formbuilder_setup', formbuilder_setup_demo)
  303. def formbuilder_demo(proxy, *args):
  304. # These hooks allow tapping into the parts of ikiwiki that use
  305. # CGI::FormBuilder to generate web forms. These hooks are passed named
  306. # parameters: cgi, session, form, and buttons. These are, respectively,
  307. # the CGI object, the user's CGI::Session, a CGI::FormBuilder, and
  308. # a reference to an array of names of buttons to go on the form.
  309. #
  310. # Each time a form is set up, the formbuilder_setup hook is called.
  311. # Typically the formbuilder_setup hook will check the form's title, and if
  312. # it's a form that it needs to modify, will call various methods to
  313. # add/remove/change fields, tweak the validation code for the fields, etc.
  314. # It will not validate or display the form.
  315. #
  316. # Just before a form is displayed to the user, the formbuilder hook is
  317. # called. It can be used to validate the form, but should not display it.
  318. # TODO: how do we modify the form?
  319. kwargs = _arglist_to_dict(args)
  320. debug("hook `formbuilder' called with arguments %s" % kwargs)
  321. raise NotImplementedError
  322. return kwargs['content']
  323. #proxy.hook('formbuilder', formbuilder_demo)
  324. def savestate_demo(proxy, *args):
  325. # This hook is called wheneven ikiwiki normally saves its state, just
  326. # before the state is saved. The function can save other state, modify
  327. # values before they're saved, etc.
  328. #
  329. # TODO: how?
  330. debug("hook `savestate' called with arguments %s" % str(args))
  331. raise NotImplementedError
  332. #proxy.hook('savestate', savestate_demo)
  333. proxy.run()
n>/S /GoTo /D (subsection.5.7) >>
  • endobj
  • 224 0 obj
  • (Parts)
  • endobj
  • 225 0 obj
  • << /S /GoTo /D (subsection.5.8) >>
  • endobj
  • 228 0 obj
  • (Assemblies and Manufacturing)
  • endobj
  • 229 0 obj
  • << /S /GoTo /D (subsubsection.5.8.1) >>
  • endobj
  • 232 0 obj
  • (Stocking Assemblies)
  • endobj
  • 233 0 obj
  • << /S /GoTo /D (subsection.5.9) >>
  • endobj
  • 236 0 obj
  • (Reporting)
  • endobj
  • 237 0 obj
  • << /S /GoTo /D (subsubsection.5.9.1) >>
  • endobj
  • 240 0 obj
  • (All Items and Parts Reports)
  • endobj
  • 241 0 obj
  • << /S /GoTo /D (subsubsection.5.9.2) >>
  • endobj
  • 244 0 obj
  • (Requirements)
  • endobj
  • 245 0 obj
  • << /S /GoTo /D (subsubsection.5.9.3) >>
  • endobj
  • 248 0 obj
  • (Services and Labor)
  • endobj
  • 249 0 obj
  • << /S /GoTo /D (subsubsection.5.9.4) >>
  • endobj
  • 252 0 obj
  • (Assemblies)
  • endobj
  • 253 0 obj
  • << /S /GoTo /D (subsubsection.5.9.5) >>
  • endobj
  • 256 0 obj
  • (Groups and Pricegroups)
  • endobj
  • 257 0 obj
  • << /S /GoTo /D (subsection.5.10) >>
  • endobj
  • 260 0 obj
  • (Translations)
  • endobj
  • 261 0 obj
  • << /S /GoTo /D (subsection.5.11) >>
  • endobj
  • 264 0 obj
  • (How Cost of Goods Sold is tracked)
  • endobj
  • 265 0 obj
  • << /S /GoTo /D (section.6) >>
  • endobj
  • 268 0 obj
  • (AP)
  • endobj
  • 269 0 obj
  • << /S /GoTo /D (subsection.6.1) >>
  • endobj
  • 272 0 obj
  • (Basic AP Concepts)
  • endobj
  • 273 0 obj
  • << /S /GoTo /D (subsection.6.2) >>
  • endobj
  • 276 0 obj
  • (Vendors)
  • endobj
  • 277 0 obj
  • << /S /GoTo /D (subsection.6.3) >>
  • endobj
  • 280 0 obj
  • (AP Transactions)
  • endobj
  • 281 0 obj
  • << /S /GoTo /D (subsection.6.4) >>
  • endobj
  • 284 0 obj
  • (AP Invoices)
  • endobj
  • 285 0 obj
  • << /S /GoTo /D (subsubsection.6.4.1) >>
  • endobj
  • 288 0 obj
  • (Correcting an AP Invoice)
  • endobj
  • 289 0 obj
  • << /S /GoTo /D (subsection.6.5) >>
  • endobj
  • 292 0 obj
  • (Cash payment And Check Printing)
  • endobj
  • 293 0 obj
  • << /S /GoTo /D (subsubsection.6.5.1) >>
  • endobj
  • 296 0 obj
  • (Rapid Payment Entry Screen)
  • endobj
  • 297 0 obj
  • << /S /GoTo /D (subsection.6.6) >>
  • endobj
  • 300 0 obj
  • (Transaction/Invoice Reporting)
  • endobj
  • 301 0 obj
  • << /S /GoTo /D (subsubsection.6.6.1) >>
  • endobj
  • 304 0 obj
  • (Transactions Report)
  • endobj
  • 305 0 obj
  • << /S /GoTo /D (subsubsection.6.6.2) >>
  • endobj
  • 308 0 obj
  • (Outstanding Report)
  • endobj
  • 309 0 obj
  • << /S /GoTo /D (subsubsection.6.6.3) >>
  • endobj
  • 312 0 obj
  • (AP Aging Report)
  • endobj
  • 313 0 obj
  • << /S /GoTo /D (subsubsection.6.6.4) >>
  • endobj
  • 316 0 obj
  • (Tax Paid and Non-taxable Report)
  • endobj
  • 317 0 obj
  • << /S /GoTo /D (subsection.6.7) >>
  • endobj
  • 320 0 obj
  • (Vendor Reporting)
  • endobj
  • 321 0 obj
  • << /S /GoTo /D (subsubsection.6.7.1) >>
  • endobj
  • 324 0 obj
  • (Vendor Search)
  • endobj
  • 325 0 obj
  • << /S /GoTo /D (subsubsection.6.7.2) >>
  • endobj
  • 328 0 obj
  • (Vendor History)
  • endobj
  • 329 0 obj
  • << /S /GoTo /D (section.7) >>
  • endobj
  • 332 0 obj
  • (AR)
  • endobj
  • 333 0 obj
  • << /S /GoTo /D (subsection.7.1) >>
  • endobj
  • 336 0 obj
  • (Customers)
  • endobj
  • 337 0 obj
  • << /S /GoTo /D (subsubsection.7.1.1) >>
  • endobj
  • 340 0 obj
  • (Customer Price Matrix)
  • endobj
  • 341 0 obj
  • << /S /GoTo /D (subsection.7.2) >>
  • endobj
  • 344 0 obj
  • (AR Transactions)
  • endobj
  • 345 0 obj
  • << /S /GoTo /D (subsection.7.3) >>
  • endobj
  • 348 0 obj
  • (AR Invoices)
  • endobj
  • 349 0 obj
  • << /S /GoTo /D (subsection.7.4) >>
  • endobj
  • 352 0 obj
  • (Cash Receipt)
  • endobj
  • 353 0 obj
  • << /S /GoTo /D (subsubsection.7.4.1) >>
  • endobj
  • 356 0 obj
  • (Cash Receipts for multiple customers)
  • endobj
  • 357 0 obj
  • << /S /GoTo /D (subsection.7.5) >>
  • endobj
  • 360 0 obj
  • (AR Transaction Reporting)
  • endobj
  • 361 0 obj
  • << /S /GoTo /D (subsubsection.7.5.1) >>
  • endobj
  • 364 0 obj
  • (AR Transactions Report)
  • endobj
  • 365 0 obj
  • << /S /GoTo /D (subsubsection.7.5.2) >>
  • endobj
  • 368 0 obj
  • (AR Aging Report)
  • endobj
  • 369 0 obj
  • << /S /GoTo /D (subsection.7.6) >>
  • endobj
  • 372 0 obj
  • (Customer Reporting)
  • endobj
  • 373 0 obj
  • << /S /GoTo /D (section.8) >>
  • endobj
  • 376 0 obj
  • (Projects)
  • endobj
  • 377 0 obj
  • << /S /GoTo /D (subsection.8.1) >>
  • endobj
  • 380 0 obj
  • (Project Basics)
  • endobj
  • 381 0 obj
  • << /S /GoTo /D (subsection.8.2) >>
  • endobj
  • 384 0 obj
  • (Timecards)
  • endobj
  • 385 0 obj
  • << /S /GoTo /D (subsection.8.3) >>
  • endobj
  • 388 0 obj
  • (Projects and Invoices)
  • endobj
  • 389 0 obj
  • << /S /GoTo /D (subsection.8.4) >>
  • endobj
  • 392 0 obj
  • (Reporting)
  • endobj
  • 393 0 obj
  • << /S /GoTo /D (subsubsection.8.4.1) >>
  • endobj
  • 396 0 obj
  • (Timecard Reporting)
  • endobj
  • 397 0 obj
  • << /S /GoTo /D (subsubsection.8.4.2) >>
  • endobj
  • 400 0 obj
  • (Project Transaction Reporting)
  • endobj
  • 401 0 obj
  • << /S /GoTo /D (subsubsection.8.4.3) >>
  • endobj
  • 404 0 obj
  • (List of Projects)
  • endobj
  • 405 0 obj
  • << /S /GoTo /D (subsection.8.5) >>
  • endobj
  • 408 0 obj
  • (Possibilities for Using Projects)
  • endobj
  • 409 0 obj
  • << /S /GoTo /D (section.9) >>
  • endobj
  • 412 0 obj
  • (Quotations and Order Management)
  • endobj
  • 413 0 obj
  • << /S /GoTo /D (subsection.9.1) >>
  • endobj
  • 416 0 obj
  • (Sales Orders)
  • endobj
  • 417 0 obj
  • << /S /GoTo /D (subsection.9.2) >>
  • endobj
  • 420 0 obj
  • (Quotations)
  • endobj
  • 421 0 obj
  • << /S /GoTo /D (subsection.9.3) >>
  • endobj
  • 424 0 obj
  • (Shipping)
  • endobj
  • 425 0 obj
  • << /S /GoTo /D (subsection.9.4) >>
  • endobj
  • 428 0 obj
  • (AR Work Flow)
  • endobj
  • 429 0 obj
  • << /S /GoTo /D (subsubsection.9.4.1) >>
  • endobj
  • 432 0 obj
  • (Service Example)
  • endobj
  • 433 0 obj
  • << /S /GoTo /D (subsubsection.9.4.2) >>
  • endobj
  • 436 0 obj
  • (Single Warehouse Example)
  • endobj
  • 437 0 obj
  • << /S /GoTo /D (subsubsection.9.4.3) >>
  • endobj
  • 440 0 obj
  • (Multiple Warehouse Example)
  • endobj
  • 441 0 obj
  • << /S /GoTo /D (subsection.9.5) >>
  • endobj
  • 444 0 obj
  • (Requests for Quotation \(RFQ\))
  • endobj
  • 445 0 obj
  • << /S /GoTo /D (subsection.9.6) >>
  • endobj
  • 448 0 obj
  • (Purchase Orders)
  • endobj
  • 449 0 obj
  • << /S /GoTo /D (subsection.9.7) >>
  • endobj
  • 452 0 obj
  • (Receiving)
  • endobj
  • 453 0 obj
  • << /S /GoTo /D (subsection.9.8) >>
  • endobj
  • 456 0 obj
  • (AP Work Flow)
  • endobj
  • 457 0 obj
  • << /S /GoTo /D (subsubsection.9.8.1) >>
  • endobj
  • 460 0 obj
  • (Bookkeeper entering the received items, order completed in full)
  • endobj
  • 461 0 obj
  • << /S /GoTo /D (subsubsection.9.8.2) >>
  • endobj
  • 464 0 obj
  • (Bookkeeper entering received items, order completed in part)
  • endobj
  • 465 0 obj
  • << /S /GoTo /D (subsubsection.9.8.3) >>
  • endobj
  • 468 0 obj
  • (Receiving staff entering items)
  • endobj
  • 469 0 obj
  • << /S /GoTo /D (subsection.9.9) >>
  • endobj
  • 472 0 obj
  • (Generation and Consolidation)
  • endobj
  • 473 0 obj
  • << /S /GoTo /D (subsubsection.9.9.1) >>
  • endobj
  • 476 0 obj
  • (Generation)
  • endobj
  • 477 0 obj
  • << /S /GoTo /D (subsubsection.9.9.2) >>
  • endobj
  • 480 0 obj
  • (Consolidation)
  • endobj
  • 481 0 obj
  • << /S /GoTo /D (subsection.9.10) >>
  • endobj
  • 484 0 obj
  • (Reporting)
  • endobj
  • 485 0 obj
  • << /S /GoTo /D (subsection.9.11) >>
  • endobj
  • 488 0 obj
  • (Shipping Module: Transferring Inventory between Warehouses)
  • endobj
  • 489 0 obj
  • << /S /GoTo /D (section.10) >>
  • endobj
  • 492 0 obj
  • (HR)
  • endobj
  • 493 0 obj
  • << /S /GoTo /D (section.11) >>
  • endobj
  • 496 0 obj
  • (POS)
  • endobj
  • 497 0 obj
  • << /S /GoTo /D (subsection.11.1) >>
  • endobj
  • 500 0 obj
  • (Sales Screen)
  • endobj
  • 501 0 obj
  • << /S /GoTo /D (subsection.11.2) >>
  • endobj
  • 504 0 obj
  • (Possibilities for Data Entry)
  • endobj
  • 505 0 obj
  • << /S /GoTo /D (subsection.11.3) >>
  • endobj
  • 508 0 obj
  • (Hardware Support)
  • endobj
  • 509 0 obj
  • << /S /GoTo /D (subsection.11.4) >>
  • endobj
  • 512 0 obj
  • (Reports)
  • endobj
  • 513 0 obj
  • << /S /GoTo /D (subsubsection.11.4.1) >>
  • endobj
  • 516 0 obj
  • (Open Invoices)
  • endobj
  • 517 0 obj
  • << /S /GoTo /D (subsubsection.11.4.2) >>
  • endobj
  • 520 0 obj
  • (Receipts)
  • endobj
  • 521 0 obj
  • << /S /GoTo /D (section.12) >>
  • endobj
  • 524 0 obj
  • (General Ledger)
  • endobj
  • 525 0 obj
  • << /S /GoTo /D (subsection.12.1) >>
  • endobj
  • 528 0 obj
  • (GL Basics)
  • endobj
  • 529 0 obj
  • << /S /GoTo /D (subsubsection.12.1.1) >>
  • endobj
  • 532 0 obj
  • (Paper-based accounting systems and the GL)
  • endobj
  • 533 0 obj
  • << /S /GoTo /D (subsubsection.12.1.2) >>
  • endobj
  • 536 0 obj
  • (Double Entry Examples on Paper)
  • endobj
  • 537 0 obj
  • << /S /GoTo /D (subsubsection.12.1.3) >>
  • endobj
  • 540 0 obj
  • (The GL in Ledger-SMB)
  • endobj
  • 541 0 obj
  • << /S /GoTo /D (subsection.12.2) >>
  • endobj
  • 544 0 obj
  • (Cash Transfer)
  • endobj
  • 545 0 obj
  • << /S /GoTo /D (subsection.12.3) >>
  • endobj
  • 548 0 obj
  • (GL Transactions)
  • endobj
  • 549 0 obj
  • << /S /GoTo /D (subsection.12.4) >>
  • endobj
  • 552 0 obj
  • (Payroll as a GL transaction)
  • endobj
  • 553 0 obj
  • << /S /GoTo /D (subsection.12.5) >>
  • endobj
  • 556 0 obj
  • (Reconciliation)
  • endobj
  • 557 0 obj
  • << /S /GoTo /D (subsection.12.6) >>
  • endobj
  • 560 0 obj
  • (Reports)
  • endobj
  • 561 0 obj
  • << /S /GoTo /D (subsubsection.12.6.1) >>
  • endobj
  • 564 0 obj
  • (GL as access to almost everything else)
  • endobj
  • 565 0 obj
  • << /S /GoTo /D (section.13) >>
  • endobj
  • 568 0 obj
  • (Recurring Transactions)
  • endobj
  • 569 0 obj
  • << /S /GoTo /D (section.14) >>
  • endobj
  • 572 0 obj
  • (Financial Statements and Reports)
  • endobj
  • 573 0 obj
  • << /S /GoTo /D (subsection.14.1) >>
  • endobj
  • 576 0 obj
  • (Cash v. Accrual Basis)
  • endobj
  • 577 0 obj
  • << /S /GoTo /D (subsection.14.2) >>
  • endobj
  • 580 0 obj
  • (Viewing the Chart of Accounts and Transactions)
  • endobj
  • 581 0 obj
  • << /S /GoTo /D (subsection.14.3) >>
  • endobj
  • 584 0 obj
  • (Trial Balance)
  • endobj
  • 585 0 obj
  • << /S /GoTo /D (subsubsection.14.3.1) >>
  • endobj
  • 588 0 obj
  • (The Paper-based function of a Trial Balance)
  • endobj
  • 589 0 obj
  • << /S /GoTo /D (subsubsection.14.3.2) >>
  • endobj
  • 592 0 obj
  • (Running the Trial Balance Report)
  • endobj
  • 593 0 obj
  • << /S /GoTo /D (subsubsection.14.3.3) >>
  • endobj
  • 596 0 obj
  • (What if the Trial Balance doesn't Balance?)
  • endobj
  • 597 0 obj
  • << /S /GoTo /D (subsubsection.14.3.4) >>
  • endobj
  • 600 0 obj
  • (Trial Balance as a Summary of Account Activity)
  • endobj
  • 601 0 obj
  • << /S /GoTo /D (subsubsection.14.3.5) >>
  • endobj
  • 604 0 obj
  • (Trial Balance as a Budget Planning Tool)
  • endobj
  • 605 0 obj
  • << /S /GoTo /D (subsection.14.4) >>
  • endobj
  • 608 0 obj
  • (Income Statement)
  • endobj
  • 609 0 obj
  • << /S /GoTo /D (subsubsection.14.4.1) >>
  • endobj
  • 612 0 obj
  • (Uses of an Income Statement)
  • endobj
  • 613 0 obj
  • << /S /GoTo /D (subsection.14.5) >>
  • endobj
  • 616 0 obj
  • (Balance Sheet)
  • endobj
  • 617 0 obj
  • << /S /GoTo /D (subsection.14.6) >>
  • endobj
  • 620 0 obj
  • (What if the Balance Sheet doesn't balance?)
  • endobj
  • 621 0 obj
  • << /S /GoTo /D (subsection.14.7) >>
  • endobj
  • 624 0 obj
  • (No Statement of Owner Equity?)
  • endobj
  • 625 0 obj
  • << /S /GoTo /D (section.15) >>
  • endobj
  • 628 0 obj
  • (The Template System)
  • endobj
  • 629 0 obj
  • << /S /GoTo /D (subsection.15.1) >>
  • endobj
  • 632 0 obj
  • (Text Templates)
  • endobj
  • 633 0 obj
  • << /S /GoTo /D (subsection.15.2) >>
  • endobj
  • 636 0 obj
  • (HTML Templates)
  • endobj
  • 637 0 obj
  • << /S /GoTo /D (subsection.15.3) >>
  • endobj
  • 640 0 obj
  • (LaTeX Templates)
  • endobj
  • 641 0 obj
  • << /S /GoTo /D (subsubsection.15.3.1) >>
  • endobj
  • 644 0 obj
  • (What is LaTeX ?)
  • endobj
  • 645 0 obj
  • << /S /GoTo /D (subsubsection.15.3.2) >>
  • endobj
  • 648 0 obj
  • (Using L.25emYX to Edit LaTeX Templates)
  • endobj
  • 649 0 obj
  • << /S /GoTo /D (subsection.15.4) >>
  • endobj
  • 652 0 obj
  • (Customizing Logos)
  • endobj
  • 653 0 obj
  • << /S /GoTo /D (subsection.15.5) >>
  • endobj
  • 656 0 obj
  • (How are They Stored in the Filesystem?)
  • endobj
  • 657 0 obj
  • << /S /GoTo /D (subsection.15.6) >>
  • endobj
  • 660 0 obj
  • (Upgrade Issues)
  • endobj
  • 661 0 obj
  • << /S /GoTo /D (part.2) >>
  • endobj
  • 664 0 obj
  • (II Technical Overview)
  • endobj
  • 665 0 obj
  • << /S /GoTo /D (section.16) >>
  • endobj
  • 668 0 obj
  • (Basic Architecture)
  • endobj
  • 669 0 obj
  • << /S /GoTo /D (subsection.16.1) >>
  • endobj
  • 672 0 obj
  • (The Software Stack)
  • endobj
  • 673 0 obj
  • << /S /GoTo /D (subsection.16.2) >>
  • endobj
  • 676 0 obj
  • (Capacity Planning)
  • endobj
  • 677 0 obj
  • << /S /GoTo /D (subsubsection.16.2.1) >>
  • endobj
  • 680 0 obj
  • (Scalability Strategies)
  • endobj
  • 681 0 obj
  • << /S /GoTo /D (subsubsection.16.2.2) >>
  • endobj
  • 684 0 obj
  • (Database Maintenance)
  • endobj
  • 685 0 obj
  • << /S /GoTo /D (subsubsection.16.2.3) >>
  • endobj
  • 688 0 obj
  • (Known issues)
  • endobj
  • 689 0 obj
  • << /S /GoTo /D (section.17) >>
  • endobj
  • 692 0 obj
  • (Customization Possibilities)
  • endobj
  • 693 0 obj
  • << /S /GoTo /D (subsection.17.1) >>
  • endobj
  • 696 0 obj
  • (Brief Guide to the Source Code)
  • endobj
  • 697 0 obj
  • << /S /GoTo /D (subsection.17.2) >>
  • endobj
  • 700 0 obj
  • (Data Entry Screens)
  • endobj
  • 701 0 obj
  • << /S /GoTo /D (subsubsection.17.2.1) >>
  • endobj
  • 704 0 obj
  • (Examples)
  • endobj
  • 705 0 obj
  • << /S /GoTo /D (subsection.17.3) >>
  • endobj
  • 708 0 obj
  • (Extensions)
  • endobj
  • 709 0 obj
  • << /S /GoTo /D (subsubsection.17.3.1) >>
  • endobj
  • 712 0 obj
  • (Examples)
  • endobj
  • 713 0 obj
  • << /S /GoTo /D (subsection.17.4) >>
  • endobj
  • 716 0 obj
  • (Templates)
  • endobj
  • 717 0 obj
  • << /S /GoTo /D (subsubsection.17.4.1) >>
  • endobj
  • 720 0 obj
  • (Examples)
  • endobj
  • 721 0 obj
  • << /S /GoTo /D (subsection.17.5) >>
  • endobj
  • 724 0 obj
  • (Reports)
  • endobj
  • 725 0 obj
  • << /S /GoTo /D (subsubsection.17.5.1) >>
  • endobj
  • 728 0 obj
  • (Examples)
  • endobj
  • 729 0 obj
  • << /S /GoTo /D (section.18) >>
  • endobj
  • 732 0 obj
  • (Integration Possibilities)
  • endobj
  • 733 0 obj
  • << /S /GoTo /D (subsection.18.1) >>
  • endobj
  • 736 0 obj
  • (Reporting Tools)
  • endobj
  • 737 0 obj
  • << /S /GoTo /D (subsubsection.18.1.1) >>
  • endobj
  • 740 0 obj
  • (Examples)
  • endobj
  • 741 0 obj
  • << /S /GoTo /D (subsection.18.2) >>
  • endobj
  • 744 0 obj
  • (Line of Business Tools on PostgreSQL)
  • endobj
  • 745 0 obj
  • << /S /GoTo /D (subsubsection.18.2.1) >>
  • endobj
  • 748 0 obj
  • (Known Issues)
  • endobj
  • 749 0 obj
  • << /S /GoTo /D (subsubsection.18.2.2) >>
  • endobj
  • 752 0 obj
  • (Strategies)
  • endobj
  • 753 0 obj
  • << /S /GoTo /D (subsubsection.18.2.3) >>
  • endobj
  • 756 0 obj
  • (Examples)
  • endobj
  • 757 0 obj
  • << /S /GoTo /D (subsection.18.3) >>
  • endobj
  • 760 0 obj
  • (Line of Business Tools on other RDBMS's)
  • endobj
  • 761 0 obj
  • << /S /GoTo /D (subsubsection.18.3.1) >>
  • endobj
  • 764 0 obj
  • (Strategies)
  • endobj
  • 765 0 obj
  • << /S /GoTo /D (subsubsection.18.3.2) >>
  • endobj
  • 768 0 obj
  • (Integration Products and Open Source Projects)
  • endobj
  • 769 0 obj
  • << /S /GoTo /D (section.19) >>
  • endobj
  • 772 0 obj
  • (Customization Guide)
  • endobj
  • 773 0 obj
  • << /S /GoTo /D (subsection.19.1) >>
  • endobj
  • 776 0 obj
  • (General Information)
  • endobj
  • 777 0 obj
  • << /S /GoTo /D (subsection.19.2) >>
  • endobj
  • 780 0 obj
  • (Customizing Templates)
  • endobj
  • 781 0 obj
  • << /S /GoTo /D (subsubsection.19.2.1) >>
  • endobj
  • 784 0 obj
  • (Page Breaks in LaTeX)
  • endobj
  • 785 0 obj
  • << /S /GoTo /D (subsubsection.19.2.2) >>
  • endobj
  • 788 0 obj
  • (Conditionals)
  • endobj
  • 789 0 obj
  • << /S /GoTo /D (subsubsection.19.2.3) >>
  • endobj
  • 792 0 obj
  • (Loops)
  • endobj
  • 793 0 obj
  • << /S /GoTo /D (subsubsection.19.2.4) >>
  • endobj
  • 796 0 obj
  • (File Inclusion)
  • endobj
  • 797 0 obj
  • << /S /GoTo /D (subsubsection.19.2.5) >>
  • endobj
  • 800 0 obj
  • (Cross-referencing and multiple passes of LaTeX)
  • endobj
  • 801 0 obj
  • << /S /GoTo /D (subsubsection.19.2.6) >>
  • endobj
  • 804 0 obj
  • (Variable Substitution)
  • endobj
  • 805 0 obj
  • << /S /GoTo /D (subsection.19.3) >>
  • endobj
  • 808 0 obj
  • (Customizing Forms)
  • endobj
  • 809 0 obj
  • << /S /GoTo /D (subsection.19.4) >>
  • endobj
  • 812 0 obj
  • (Customizing Modules)
  • endobj
  • 813 0 obj
  • << /S /GoTo /D (subsubsection.19.4.1) >>
  • endobj
  • 816 0 obj
  • (Database Access)
  • endobj
  • 817 0 obj
  • << /S /GoTo /D (subsection.19.5) >>
  • endobj
  • 820 0 obj
  • (CLI Examples)
  • endobj
  • 821 0 obj
  • << /S /GoTo /D (part.3) >>
  • endobj
  • 824 0 obj
  • (III Appendix)
  • endobj
  • 825 0 obj
  • << /S /GoTo /D (section.A) >>
  • endobj
  • 828 0 obj
  • (Where to Go for More Information)
  • endobj
  • 829 0 obj
  • << /S /GoTo /D (section.B) >>
  • endobj
  • 832 0 obj
  • (Quick Tips)
  • endobj
  • 833 0 obj
  • << /S /GoTo /D (subsection.B.1) >>
  • endobj
  • 836 0 obj
  • (Understanding Shipping Addresses and Carriers)
  • endobj
  • 837 0 obj
  • << /S /GoTo /D (subsection.B.2) >>
  • endobj
  • 840 0 obj
  • (Handling bad debts)
  • endobj
  • 841 0 obj
  • << /S /GoTo /D (section.C) >>
  • endobj
  • 844 0 obj
  • (Step by Steps for Vertical Markets)
  • endobj
  • 845 0 obj
  • << /S /GoTo /D (subsection.C.1) >>
  • endobj
  • 848 0 obj
  • (Common Installation Errors)
  • endobj
  • 849 0 obj
  • << /S /GoTo /D (subsection.C.2) >>
  • endobj
  • 852 0 obj
  • (Retail With Light Manufacturing)
  • endobj
  • 853 0 obj
  • << /S /GoTo /D (section.D) >>
  • endobj
  • 856 0 obj
  • (Glossary)
  • endobj
  • 857 0 obj
  • << /S /GoTo /D (section.E) >>
  • endobj
  • 860 0 obj
  • (GNU Free Documentation License)
  • endobj
  • 861 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 864 0 obj
  • (1. APPLICABILITY AND DEFINITIONS)
  • endobj
  • 865 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 867 0 obj
  • (2. VERBATIM COPYING)
  • endobj
  • 868 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 870 0 obj
  • (3. COPYING IN QUANTITY)
  • endobj
  • 871 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 873 0 obj
  • (4. MODIFICATIONS)
  • endobj
  • 874 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 876 0 obj
  • (5. COMBINING DOCUMENTS)
  • endobj
  • 877 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 879 0 obj
  • (6. COLLECTIONS OF DOCUMENTS)
  • endobj
  • 880 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 882 0 obj
  • (7. AGGREGATION WITH INDEPENDENT WORKS)
  • endobj
  • 883 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 885 0 obj
  • (8. TRANSLATION)
  • endobj
  • 886 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 888 0 obj
  • (9. TERMINATION)
  • endobj
  • 889 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 891 0 obj
  • (10. FUTURE REVISIONS OF THIS LICENSE)
  • endobj
  • 892 0 obj
  • << /S /GoTo /D (section*.3) >>
  • endobj
  • 894 0 obj
  • (ADDENDUM: How to use this License for your documents)
  • endobj
  • 895 0 obj
  • << /S /GoTo /D [896 0 R /Fit ] >>
  • endobj
  • 898 0 obj <<
  • /Length 2502
  • /Filter /FlateDecode
  • >>
  • stream
  • x[[s۸~ϯ=Bp1}K&>t@K͉E}. uҬH~:$?ayAT4[_}A<s4% f.H)
  • |!QbHQl!@DpmW7/^a<#
  • Q8|(RݬVwӇ8P6} b  mZbD&`ZZ7<Ư7֛xsi^kc6X&yַ@ՏZ-{*iIa `hI?)󶾻o($0 1E&(R~D̸߰Xj es8| Ƽ`Ov]vqۖM[AqKh  4_ջv[[olV/iB1)z??CL 8_muմY[H