REBOL [
    Title: "Generic receipt object"
    Purpose: {Create a basic printable receipt file from minimal
    generic input.  These constraints create a receipt object that
    can be plugged into many programs that need such functionality.}
]

;; [---------------------------------------------------------------------------]
;; [ This module encapsulates code for producing a basic printed receipt       ]
;; [ for money paid for something; very generic.  This module would be used    ]
;; [ as part of a larger program where it was necessary to produce such a      ]
;; [ a receipt.  One would include it in the larger program by coding:         ]
;; [     do %receiptobj.r                                                      ]
;; [ One then would be able to use the functions in this module.               ]
;; [                                                                           ]
;; [ To use this module, one first would make an instance of the object,       ]
;; [ something like this:                                                      ]
;; [     RCPT: make RECEIPT []                                                 ]
;; [ This declaration is where you could modify the FOLDER and LOG items       ]
;; [ if you wanted the printed receipts and the log to go to some location     ]
;; [ other than the one coded into the module.  Something like this:           ]
;; [     RCPT: make RECEIPT [                                                  ]
;; [         FOLDER: %/I/RECEIPTFILES/                                         ]
;; [         LOG: %/I/RECEIPTFILES/LOG.CSV                                     ]
;; [     ]                                                                     ]
;; [ Note that any folders in the path to the log file must exist.  The        ]
;; [ module will not make them.  You could change that if you wanted to.       ]
;; [                                                                           ]
;; [ There are two functions available.                                        ]
;; [                                                                           ]
;; [ MAKE-RECEIPT:  This function must be provided with a block of             ]
;; [ pre-formatted data items that will apppear on the printed receipt.        ]
;; [ Those items are:  (Note that they all are strings.)                       ]
;; [     Date of the transaction                                               ]
;; [     Name of the person making the payment                                 ]
;; [     Whatever thing the person paid for                                    ]
;; [     The amount of money paid                                              ]
;; [     The payment method (cash, check, etc.)                                ]
;; [     A check number or confirmation number or something like that          ]
;; [     The name of the person taking the payment                             ]
;; [     A short note                                                          ]
;; [ Note that the above items are strings in the form they are to be          ]
;; [ printed.  It would be the job of any calling program to take care of      ]
;; [ appropriate formatting.  This module just prints what it gets.            ]
;; [ The result of this function will be that the infomation supplied will     ]
;; [ be formatted into an html file that could be printed, and that the        ]
;; [ same information will be appended to a log file in the CSV format.        ]
;; [ Also, the function will return the full name of the html file, so one     ]
;; [ could use the "browse" function with that name to show the receipt        ]
;; [ immediately for printing.                                                 ]
;; [                                                                           ]
;; [ SHOW-RECEIPT-WINDOW:  This function is designed to be called from         ]
;; [ a VID window.  It displays a window for entering that same information    ]
;; [ that is printed on the html receipts.  One enters that data into the      ]
;; [ window and clicks a "submit" button, and the code for the "submit"        ]
;; [ button uses the MAKE-RECEIPT function to produce a receipt. This          ]
;; [ structuring of the code allows this module to be used in a program        ]
;; [ with a graphical interface, and in a program that has to print a          ]
;; [ receipt without any graphical interface.                                  ]
;; [---------------------------------------------------------------------------]

RECEIPT: make object! [

;; -- Change these items when you make your own specific receipt object.
    FOLDER: %/C/receipts/             ;; storage for receipt files
    LOG: %/C/receipts/receiptslog.csv ;; one-line-per-receipt log file

;; -- html template for printed receipt.  We could use a text file for
;; -- a printable receipts, but with html we would have the option of
;; -- modifying the template to include some graphics, like a logo.
    HTML: {Receipt
    

Receipt

Date %%DATE%%
From %%FROM%%
Received for %%FOR%%
Amount %%AMOUNT%%
Payment type %%TYPE%%
Check/Confirmation %%NUMBER%%
Taken by %%BY%%
Note %%NOTE%%
} ;; -- A function to be used later, to make a date-time stamp from ;; -- the current date. Refer to: ;; -- http://www.rebol.net/cookbook/recipes/0008.html MAKE-TIMESTAMP: does [ TIMESTAMP: copy "" DATE-TIME: now append TIMESTAMP to-string DATE-TIME/year either DATE-TIME/month < 10 [ append TIMESTAMP rejoin ["0" to-string DATE-TIME/month] ] [ append TIMESTAMP to-string DATE-TIME/month ] either DATE-TIME/day < 10 [ append TIMESTAMP rejoin ["0" to-string DATE-TIME/day] ] [ append TIMESTAMP to-string DATE-TIME/day ] ;; -- REBOL uses 24-hour clock. append TIMESTAMP trim/with to-string DATE-TIME/time ":" return TIMESTAMP ] ;; -- A receipts is created by this function. The reason for using a ;; -- function is so that a receipt can be created by the window that ;; -- is included in this object, or by some other program. ;; -- The function takes a block of pre-fomatted date items to put on ;; -- the receipt. Those parts, in order, are: ;; -- DATE ;; Date of receipt ;; -- FROM ;; Person making payment ;; -- FOR ;; Reason for payment ;; -- AMOUNT ;; Amount of money ;; -- TYPE ;; Method of payment ;; -- NUMBER ;; Check number, confirmation number, etc. ;; -- BY ;; Person taking payment ;; -- NOTE ;; Free-form note MAKE-RECEIPT: func [ PARTS [block!] /local TEMPHTML FILEID FILEPATH ] [ if not exists? FOLDER [ make-dir FOLDER ] if not exists? LOG [ write LOG rejoin [ "DATE," "FROM," "RECEIVEDFOR," "AMOUNT," "PMTMETHOD," "NUMBER," "BY," "NOTE," "FILEID" newline ] ] TEMPHTML: copy HTML replace TEMPHTML "%%DATE%%" PARTS/1 replace TEMPHTML "%%FROM%%" PARTS/2 replace TEMPHTML "%%FOR%%" PARTS/3 replace TEMPHTML "%%AMOUNT%%" PARTS/4 replace TEMPHTML "%%TYPE%%" PARTS/5 replace TEMPHTML "%%NUMBER%%" PARTS/6 replace TEMPHTML "%%BY%%" PARTS/7 replace TEMPHTML "%%NOTE%%" PARTS/8 FILEID: rejoin [ MAKE-TIMESTAMP "-" trim/all/with copy PARTS/2 " .,/" ".html" ] FILEPATH: to-file rejoin [ FOLDER FILEID ] write FILEPATH TEMPHTML write/append LOG rejoin [ mold PARTS/1 "," mold PARTS/2 "," mold PARTS/3 "," mold PARTS/4 "," mold PARTS/5 "," mold PARTS/6 "," mold PARTS/7 "," mold PARTS/8 "," to-string FILEID newline ] return FILEPATH ] ;; -- This function is called by the window, to create a receipt ;; -- using the data items on the window. MAKE-RECEIPT-FROM-WINDOW: does [ PARTS: copy [] append PARTS copy get-face WIN-DATE append PARTS copy get-face WIN-FROM append PARTS copy get-face WIN-FOR append PARTS copy get-face WIN-AMOUNT append PARTS copy get-face WIN-TYPE append PARTS copy get-face WIN-NUMBER append PARTS copy get-face WIN-BY append PARTS copy get-face WIN-NOTE MAKE-RECEIPT PARTS ] ;; -- This object includes a window for requesting receipt data ;; -- so it can be used as part of a larger program. SHOW-RECEIPT-WINDOW: does [ view/new layout [ across text 150 right "Date" WIN-DATE: field 200 return text 150 right "Received from" WIN-FROM: field 200 return text 150 right "Received for" WIN-FOR: field 200 return text 150 right "Amount" WIN-AMOUNT: field 200 return text 150 right "Method" WIN-TYPE: drop-down "Check" "Credit" "Cash" "Other" return text 150 right "Check/Conf number" WIN-NUMBER: field 200 return text 150 right "Received by" WIN-BY: field 200 return text 150 right "Note" WIN-NOTE: field 200 return button "Close" [unview] button "Submit" [MAKE-RECEIPT-FROM-WINDOW alert "Done." unview] ] ] ] ;;Uncomment to test ;RCPT: make RECEIPT [] ;RCPT/MAKE-RECEIPT [ ; "2018-03-01" ; "Mr. Smith" ; "Room rental" ; "$25.00" ; "Check" ; "1001" ; "Mr. Jones" ; "Monthly room rental" ;] ;FILE-NAME: RCPT/MAKE-RECEIPT [ ; "2018-03-01" ; "Mr. Johnson" ; "DVD rental" ; "$2.00" ; "Cash" ; "" ; "Mr. Jones" ; "" ;] ;print ["Showing " FILE-NAME] ;browse FILE-NAME ;view center-face layout [ ; button 400 "Click this button to bring up window" [RCPT/SHOW-RECEIPT-WINDOW] ;] ;halt