/** Initialize transaction variable in session. This function is called after the end of every transaction so these values will be the the defaults every time. */ public static function transReset() { /** @var End Indicates transaction has ended 0 => transaction in progress 1 => transaction is complete */ CoreLocal::set("End", 0); /** @var memberID Current member number */ CoreLocal::set("memberID", "0"); /** @var TaxExempt Tax exempt status flag 0 => transaction is taxable 1 => transaction is tax exempt */ CoreLocal::set("TaxExempt", 0); /** @var yousaved Total savings on the transaction (as float). Includes any if applicable: - transaction level percent discount - sale prices (localtemptrans.discount) - member prices (localtemptrans.memDiscount) */ CoreLocal::set("yousaved", 0); /** @var couldhavesaved Total member savings that were not applied. Consists of localtemptrans.memDiscount on non-member purchases */ CoreLocal::set("couldhavesaved", 0); /** @var specials Total saving via sale prices. Consists of localtemptrans.discount and when applicable localtemptrans.memDiscount */ CoreLocal::set("specials", 0); /** @var tare Current tare setting (as float) */ CoreLocal::set("tare", 0); /** @var change Amount of change due (as float) */ CoreLocal::set("change", 0); /** @var toggletax Alter the next item's tax status - 0 => do nothing - 1 => change next tax status */ CoreLocal::set("toggletax", 0); /** @var togglefoodstamp Alter the next item's foodstamp status - 0 => do nothing - 1 => change next foodstamp status */ CoreLocal::set("togglefoodstamp", 0); /** @var toggleDiscountable Alter the next item's discount status - 0 => do nothing - 1 => change next discount status */ CoreLocal::set("toggleDiscountable", 0); /** @var refund Indicates current ring is a refund. This is set as a session variable as it could apply to items, open rings, or potentially other kinds of input. - 0 => not a refund - 1 => refund */ CoreLocal::set("refund", 0); /** @var casediscount Line item case discount percentage (as integer; 5 = 5%). This feature may be redundant in that it could be handled with the generic line-item discount. It more or less just differs in that the messages say "Case". */ CoreLocal::set("casediscount", 0); /** @var multiple Cashier used the "*" key to enter a multiplier. This currently makes the products.qttyEnforced flag work. This may be redundant and the quantity setting below is likely sufficient to determine whether a multiplier was used. */ CoreLocal::set("multiple", 0); /** @var quantity Quantity for the current ring. A non-zero value usually means the cashier used "*" to enter a multiplier. A value of zero gets converted to one unless the item requires a quantity via products.scale or products.qttyEnforced. */ CoreLocal::set("quantity", 0); /** @var strEntered Stores the last user input from the main POS screen. Used in conjunction with the msgrepeat option. */ CoreLocal::set("strEntered", ""); /** @var strRemembered Value to use as input the next time the main POS screen loads. Used in conjunction with the msgrepeat option. */ CoreLocal::set("strRemembered", ""); /** @var msgrepeat Controls repeat input behavior - 0 => do nothing - 1 => set POS input to the value in strRemembered strEntered, strRemembered, and msgrepeat are strongly interrelated. When parsing user input on the main POS screen, the entered value is always stored as strEntered. msgrepeat gets used in two slightly different ways. If you're on a page other than the main screen, set msgrepeat to 1 and strRemembered to the desired input, then redirect to pos2.php. This will run the chosen value through standard input processing. The other way msgrepeat is used is with boxMsg2.php. This page is a generic enter to continue, clear to cancel prompt. If you redirect to boxMsg2.php and the user presses enter, POS will set msgrepeat to 1 and copy strEntered into strRemembered effectively repeating the last input. Code using this feature will interpret a msgrepeat value of 1 to indicate the user has given confirmation. msgrepeat is always cleared back to zero when input processing finishes. */ CoreLocal::set("msgrepeat", 0); /** @var lastRepeat [Optional] Reason for the last repeated message Useful to set & check in situations where multiple confirmations may be required. */ CoreLocal::set('lastRepeat', ''); /** @var boxMsg Message string to display on the boxMsg2.php page */ CoreLocal::set("boxMsg", ""); /** @var itemPD Line item percent discount (as integer; 5 = 5%). Applies a percent discount to the current ring. */ CoreLocal::set("itemPD", 0); /** @var cashierAgeOverride This flag indicates a manager has given approval for the cashier to sell age-restricted items. This setting only comes into effect if the cashier is too young. The value persists for the remainder of the transaction so the manager does not have to give approval for each individual item. - 0 => no manager approval - 1 => manager has given approval */ CoreLocal::set("cashierAgeOverride", 0); /** @var voidOverride This flag indicates a manager has given approval for the cashier to void items beyond the per transaction limit. The value persists for the remainder of the transaction so the manager does not have to give approval for each individual item. - 0 => no manager approval - 1 => manager has given approval */ CoreLocal::set("voidOverride", 0); /** @var lastWeight The weight of the last by-weight item entered into the transaction. It's used to monitor for scale problems. Consecutive items with the exact same weight often indicate the scale is stuck or not responding properly. */ CoreLocal::set("lastWeight", 0.0); /** @var CachePanEncBlcok Stores the encrypted string of card information provided by the CC terminal. If the terminal is facing the customer, the customer may swipe their card before the cashier is done ringing in items so the value is stored in session until the cashier is ready to process payment */ CoreLocal::set("CachePanEncBlock", ""); /** @var CachePinEncBlock Stores the encrypted string of PIN data. Similar to CachePanEncBlock. */ CoreLocal::set("CachePinEncBlock", ""); /** @var CacheCardType Stores the selected card type. Similar to CachePanEncBlock. Known values are: - CREDIT - DEBIT - EBTFOOD - EBTCASH */ CoreLocal::set("CacheCardType", ""); /** @var CacheCardCashBack Stores the select cashback amount. Similar to CachePanEncBlock. */ CoreLocal::set("CacheCardCashBack", 0); /** @var ccTermState Stores a string representing the CC terminals current display. This drives an optional on-screen icon to let the cashier know what the CC terminal is doing if they cannot see its screen. */ CoreLocal::set('ccTermState', 'swipe'); /** @var paycard_voiceauthcode Stores a voice authorization code for use with a paycard transaction. Not normally used but required to pass Mercury's certification script. */ CoreLocal::set("paycard_voiceauthcode", ""); /** @var ebt_authcode Stores a foodstamp authorization code. Similar to paycard_voiceauthcode. */ CoreLocal::set("ebt_authcode", ""); /** @var ebt_vnum Stores a foodstamp voucher number. Similar to paycard_voiceauthcode. */ CoreLocal::set("ebt_vnum", ""); /** @var paycard_keyed - True => card number was hand keyed - False => card was swiped Normally POS figures this out automatically but it has to be overriden to pass Mercury's certification script. They require some keyed transactions even though the CC terminal is only capable of producing swipe-style data. */ CoreLocal::set("paycard_keyed", False); if (!is_array(CoreLocal::get('PluginList'))) { CoreLocal::set('PluginList', array()); } if (is_array(CoreLocal::get('PluginList'))) { foreach (CoreLocal::get('PluginList') as $p) { if (!class_exists($p)) { continue; } $obj = new $p(); $obj->plugin_transaction_reset(); } } if (is_array(CoreLocal::get('Notifiers'))) { foreach (CoreLocal::get('Notifiers') as $n) { if (!class_exists($n)) { continue; } $obj = new $n(); $obj->transactionReset(); } } FormLib::clearTokens(); DiscountModule::transReset(); }
public function testDiscountModules() { $ten = new DiscountModule(10, 'ten'); $fifteen = new DiscountModule(15, 'fifteen'); // verify stacking discounts CoreLocal::set('percentDiscount', 0); CoreLocal::set('NonStackingDiscounts', 0); DiscountModule::updateDiscount($ten, false); $this->assertEquals(10, CoreLocal::get('percentDiscount')); DiscountModule::updateDiscount($fifteen, false); $this->assertEquals(25, CoreLocal::get('percentDiscount')); DiscountModule::transReset(); // verify non-stacking discounts CoreLocal::set('percentDiscount', 0); CoreLocal::set('NonStackingDiscounts', 1); DiscountModule::updateDiscount($ten, false); $this->assertEquals(10, CoreLocal::get('percentDiscount')); DiscountModule::updateDiscount($fifteen, false); $this->assertEquals(15, CoreLocal::get('percentDiscount')); DiscountModule::transReset(); // verify best non-stacking discount wins CoreLocal::set('percentDiscount', 0); DiscountModule::updateDiscount($fifteen, false); $this->assertEquals(15, CoreLocal::get('percentDiscount')); DiscountModule::updateDiscount($ten, false); $this->assertEquals(15, CoreLocal::get('percentDiscount')); DiscountModule::transReset(); // verify same-name discounts overwrite $one = new DiscountModule(1, 'custdata'); $two = new DiscountModule(2, 'custdata'); CoreLocal::set('percentDiscount', 0); CoreLocal::set('NonStackingDiscounts', 0); DiscountModule::updateDiscount($one, false); $this->assertEquals(1, CoreLocal::get('percentDiscount')); DiscountModule::updateDiscount($two, false); $this->assertEquals(2, CoreLocal::get('percentDiscount')); DiscountModule::transReset(); // same-name should overwrite in the order called CoreLocal::set('percentDiscount', 0); DiscountModule::updateDiscount($two, false); $this->assertEquals(2, CoreLocal::get('percentDiscount')); DiscountModule::updateDiscount($one, false); $this->assertEquals(1, CoreLocal::get('percentDiscount')); }