diff --git a/app/Http/Controllers/EventQrcodeCheckInController.php b/app/Http/Controllers/EventQrcodeCheckInController.php new file mode 100644 index 00000000..9cf344c9 --- /dev/null +++ b/app/Http/Controllers/EventQrcodeCheckInController.php @@ -0,0 +1,109 @@ +findOrFail($event_id); + + JavaScript::put([ + 'qrcodeCheckInRoute' => route('postQRCodeCheckInAttendee', ['event_id' => $event->id]) + ]); + + return view('ManageEvent.QrcodeCheckIn', compact('event')); + } + + /** + * Check in an attendee + * + * @param $event_id + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function postCheckInAttendee($event_id, Request $request) + { + $event = Event::scope()->findOrFail($event_id); + + $qrcodeToken = $request->get('qrcode_token'); + + $attendee = Attendee::scope()->withoutCancelled() + ->join('tickets', 'tickets.id', '=', 'attendees.ticket_id') + ->where(function ($query) use ($event, $qrcodeToken) { + $query->where('attendees.event_id', $event->id) + ->where('attendees.private_reference_number', $qrcodeToken); + })->select([ + 'attendees.id', + 'attendees.order_id', + 'attendees.first_name', + 'attendees.last_name', + 'attendees.email', + 'attendees.reference', + 'attendees.arrival_time', + 'attendees.has_arrived', + 'tickets.title as ticket', + ])->first(); + + if(is_null($attendee)){ + return response()->json(['status' => 'error', 'message' => "Invalid Ticket !"]); + } + + $relatedAttendesCount = Attendee::where([ + 'order_id' => $attendee->order_id, + 'has_arrived' => false + ])->count(); + + if($relatedAttendesCount >= 1){ + $confirmOrderTicketsRoute = route('confirmCheckInOrderTickets', [$event->id, $attendee->order_id]); + + $appendedText = '

'. csrf_field() .'
'; + } else { + $appendedText = ''; + } + + if ($attendee->has_arrived) { + return response()->json([ + 'status' => 'error', + 'message' => 'Warning: This Attendee Has Already Been Checked In at '. $attendee->arrival_time->format('H:i A, F j'). '.' . $appendedText + ]); + } + + Attendee::find($attendee->id)->update(['has_arrived' => true, 'arrival_time' => Carbon::now()]); + + return response()->json([ + 'status' => 'success', + 'message' => 'Success !
Name: ' . $attendee->first_name . ' ' . $attendee->last_name . '
Reference: '. $attendee->reference . '
Ticket: '. $attendee->ticket . '.' . $appendedText + ]); + } + + /** + * Confirm tickets of same order. + * + * @param $event_id + * @param $order_id + * @return \Illuminate\Http\Response + */ + public function confirmOrderTickets($event_id, $order_id) + { + $updateRowsCount = Attendee::where(['order_id' => $order_id, 'has_arrived' => false]) + ->update(['has_arrived' => true, 'arrival_time' => Carbon::now()]); + + session()->flash('success_message', $updateRowsCount . ' other tickets checked in.'); + return back(); + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index 5b43fedf..98ccfcf2 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -562,6 +562,27 @@ Route::group(['middleware' => ['auth', 'first.run']], function () { 'uses' => 'EventCheckInController@postCheckInAttendee', ]); + + /* + * ------- + * QRCode Check In App + * ------- + */ + Route::get('{event_id}/qrcode_check_in', [ + 'as' => 'showQRCodeChechIn', + 'uses' => 'EventQrcodeCheckInController@showCheckIn', + ]); + + Route::post('{event_id}/qrcode_check_in', [ + 'as' => 'postQRCodeCheckInAttendee', + 'uses' => 'EventQrcodeCheckInController@postCheckInAttendee', + ]); + + Route::match(['PUT', 'PATCH'], '{event_id}/confirm_order_tickets/{order_id}', [ + 'as' => 'confirmCheckInOrderTickets', + 'uses' => 'EventQrcodeCheckInController@confirmOrderTickets', + ]); + /* * ------- * Promote diff --git a/app/Models/Attendee.php b/app/Models/Attendee.php index 4c29e953..caa548ae 100644 --- a/app/Models/Attendee.php +++ b/app/Models/Attendee.php @@ -32,6 +32,8 @@ class Attendee extends MyBaseModel 'ticket_id', 'account_id', 'reference', + 'has_arrived', + 'arrival_time' ]; /** diff --git a/composer.json b/composer.json index 1054622e..a03a5dd7 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,8 @@ "omnipay/paypal": "*", "omnipay/bitpay": "dev-master", "omnipay/coinbase": "dev-master", - "barryvdh/laravel-ide-helper": "^2.1" + "barryvdh/laravel-ide-helper": "^2.1", + "laracasts/utilities": "^2.1" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 3470e142..49f9932b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "acfabb6575d92d14c44717c0d3e371c7", - "content-hash": "7874f34b6511337f2d983c8e81cf82db", + "hash": "a32ff9293593f1a4ebbba773feb95f77", + "content-hash": "047498c5561f95ec60c3ab8660f2c2dc", "packages": [ { "name": "aws/aws-sdk-php", @@ -370,7 +370,7 @@ }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/eaa6b4f3cb9a779bd9f8ead71bd30427f8e863e1", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/adf81af61c89f0be9c091e905ca7c6f1f2398271", "reference": "eaa6b4f3cb9a779bd9f8ead71bd30427f8e863e1", "shasum": "" }, @@ -1183,6 +1183,50 @@ ], "time": "2015-12-05 17:17:57" }, + { + "name": "laracasts/utilities", + "version": "2.1", + "source": { + "type": "git", + "url": "https://github.com/laracasts/PHP-Vars-To-Js-Transformer.git", + "reference": "4402a0ed774f8eb36ea7ba169341d9d5b6049378" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laracasts/PHP-Vars-To-Js-Transformer/zipball/4402a0ed774f8eb36ea7ba169341d9d5b6049378", + "reference": "4402a0ed774f8eb36ea7ba169341d9d5b6049378", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.0", + "php": ">=5.4.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laracasts\\Utilities\\JavaScript\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeffrey Way", + "email": "jeffrey@laracasts.com" + } + ], + "description": "Transform your PHP to JavaScript", + "keywords": [ + "javascript", + "laravel" + ], + "time": "2015-10-01 05:16:28" + }, { "name": "laravel/framework", "version": "v5.1.20", @@ -2099,6 +2143,121 @@ ], "time": "2016-03-11 14:25:56" }, + { + "name": "omnipay/bitpay", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-bitpay.git", + "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-bitpay/zipball/cf813f1d5436a1d2f942d3df6666695d1e2b5280", + "reference": "cf813f1d5436a1d2f942d3df6666695d1e2b5280", + "shasum": "" + }, + "require": { + "omnipay/common": "~2.0" + }, + "require-dev": { + "omnipay/tests": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Omnipay\\BitPay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-bitpay/contributors" + } + ], + "description": "BitPay driver for the Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-bitpay", + "keywords": [ + "bitcoin", + "bitpay", + "gateway", + "merchant", + "omnipay", + "pay", + "payment" + ], + "time": "2016-03-10 03:16:04" + }, + { + "name": "omnipay/coinbase", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/omnipay-coinbase.git", + "reference": "69c4f07d88ef3bdb2b42cd90234b358b641dfa29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/omnipay-coinbase/zipball/69c4f07d88ef3bdb2b42cd90234b358b641dfa29", + "reference": "69c4f07d88ef3bdb2b42cd90234b358b641dfa29", + "shasum": "" + }, + "require": { + "omnipay/common": "~2.0" + }, + "require-dev": { + "omnipay/tests": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Omnipay\\Coinbase\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrian Macneil", + "email": "adrian@adrianmacneil.com" + }, + { + "name": "Omnipay Contributors", + "homepage": "https://github.com/thephpleague/omnipay-coinbase/contributors" + } + ], + "description": "Coinbase driver for the Omnipay payment processing library", + "homepage": "https://github.com/thephpleague/omnipay-coinbase", + "keywords": [ + "coinbase", + "gateway", + "merchant", + "omnipay", + "pay", + "payment" + ], + "time": "2015-03-06 05:35:39" + }, { "name": "omnipay/common", "version": "v2.5.0", @@ -3822,6 +3981,58 @@ ], "time": "2015-06-14 21:17:01" }, + { + "name": "fzaninotto/faker", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "suggest": { + "ext-intl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2015-05-29 06:29:14" + }, { "name": "phpspec/php-diff", "version": "v1.0.2", @@ -4793,7 +5004,9 @@ "nitmedia/wkhtml2pdf": 20, "dompdf/dompdf": 20, "vinelab/http": 20, - "maxhoffmann/parsedown-laravel": 20 + "maxhoffmann/parsedown-laravel": 20, + "omnipay/bitpay": 20, + "omnipay/coinbase": 20 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/config/app.php b/config/app.php index f8d3b5d2..fd10da83 100644 --- a/config/app.php +++ b/config/app.php @@ -69,7 +69,7 @@ return [ | */ 'key' => env('APP_KEY', 'SomeRandomString'), - 'cipher' => MCRYPT_RIJNDAEL_128, + 'cipher' => 'AES-256-CBC', /* |-------------------------------------------------------------------------- | Logging Configuration @@ -146,6 +146,7 @@ return [ Mews\Purifier\PurifierServiceProvider::class, MaxHoffmann\Parsedown\ParsedownServiceProvider::class, Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, + Laracasts\Utilities\JavaScript\JavaScriptServiceProvider::class, ], /* |-------------------------------------------------------------------------- diff --git a/config/javascript.php b/config/javascript.php new file mode 100644 index 00000000..4d165a6d --- /dev/null +++ b/config/javascript.php @@ -0,0 +1,30 @@ + ['Shared.Layouts.ViewJavascript'], + + /* + |-------------------------------------------------------------------------- + | JavaScript Namespace + |-------------------------------------------------------------------------- + | + | By default, we'll add variables to the global window object. However, + | it's recommended that you change this to some namespace - anything. + | That way, you can access vars, like "SomeNamespace.someVariable." + | + */ + 'js_namespace' => 'Attendize' + +]; diff --git a/public/assets/images/Opera-logo.png b/public/assets/images/Opera-logo.png new file mode 100755 index 00000000..90610937 Binary files /dev/null and b/public/assets/images/Opera-logo.png differ diff --git a/public/assets/images/cam.png b/public/assets/images/cam.png new file mode 100755 index 00000000..ca28c2b1 Binary files /dev/null and b/public/assets/images/cam.png differ diff --git a/public/assets/images/chrome_logo.gif b/public/assets/images/chrome_logo.gif new file mode 100755 index 00000000..c6bcc7bb Binary files /dev/null and b/public/assets/images/chrome_logo.gif differ diff --git a/public/assets/images/down.png b/public/assets/images/down.png new file mode 100755 index 00000000..e0172a10 Binary files /dev/null and b/public/assets/images/down.png differ diff --git a/public/assets/images/firefox.png b/public/assets/images/firefox.png new file mode 100755 index 00000000..df5e72b4 Binary files /dev/null and b/public/assets/images/firefox.png differ diff --git a/public/assets/images/vid.png b/public/assets/images/vid.png new file mode 100755 index 00000000..7d798983 Binary files /dev/null and b/public/assets/images/vid.png differ diff --git a/public/assets/stylesheet/qrcode-check-in.css b/public/assets/stylesheet/qrcode-check-in.css new file mode 100644 index 00000000..2d289264 --- /dev/null +++ b/public/assets/stylesheet/qrcode-check-in.css @@ -0,0 +1,99 @@ +body{ + font-family: "Source Sans Pro", sans-serif; +} + +a:active, a:focus, a:visited{ + text-decoration: none; +} + +a:hover{ + text-decoration: underline; +} + +#outdiv +{ + width: 400px; + height: 250px; + margin: 0; + padding: 0; +} + +#v{ + width: 400px; + height: auto; + margin: 0; + padding: 0; + border: 2px solid #c5c5c5; +} + +#qrfile{ + border: 2px solid #c5c5c5; + width: 400px; + height: 250px; +} + +#qr-canvas{ + display:none; +} + +#help-text{ + z-index: 9999999999; + position: relative; + color: #00AEFB; + top: 0; +} + +#imghelp{ + position:relative; + left:0px; + top:-160px; + z-index:100; + background:#f2f2f2; + margin-left:35px; + margin-right:35px; + padding-top:15px; + padding-bottom:15px; + border-radius:20px; +} + +.selector{ + cursor:pointer; +} + +#result{ + border: 1px solid #eaeaea; + padding: 10px; + margin-top: 3em; + color: #456D86; + width: 50%; + background-color: #f2f2f2; + font-size: 1.5em; + font-weight: 500; + box-shadow: none; + border-radius: 3px; + transition: background 0.4s ease-in-out; +} + +/* Mobile */ +@media only screen and (max-width: 480px) { + #result{ + width: 90%; + } + + #outdiv{ + width: 300px; + height: auto; + } + + #help-text{ + top: -35px; + } + + #qrfile{ + width: 300px; + } + + #v{ + width: 300px; + } +} diff --git a/public/mp3/beep.mp3 b/public/mp3/beep.mp3 new file mode 100644 index 00000000..8c4a6dee Binary files /dev/null and b/public/mp3/beep.mp3 differ diff --git a/public/vendor/qrcode-scan/llqrcode.js b/public/vendor/qrcode-scan/llqrcode.js new file mode 100644 index 00000000..9e34ce45 --- /dev/null +++ b/public/vendor/qrcode-scan/llqrcode.js @@ -0,0 +1 @@ +_aa={};_aa._ab=function(f,e){var d=qrcode.width;var b=qrcode.height;var c=true;for(var g=0;gd||h<-1||h>b){throw"Error._ab "}c=false;if(a==-1){e[g]=0;c=true}else{if(a==d){e[g]=d-1;c=true}}if(h==-1){e[g+1]=0;c=true}else{if(h==b){e[g+1]=b-1;c=true}}}c=true;for(var g=e.length-2;g>=0&&c;g-=2){var a=Math.floor(e[g]);var h=Math.floor(e[g+1]);if(a<-1||a>d||h<-1||h>b){throw"Error._ab "}c=false;if(a==-1){e[g]=0;c=true}else{if(a==d){e[g]=d-1;c=true}}if(h==-1){e[g+1]=0;c=true}else{if(h==b){e[g+1]=b-1;c=true}}}};_aa._af=function(b,d,a){var l=new _ac(d);var k=new Array(d<<1);for(var g=0;g>1)+0.5;k[i+1]=j}a._ad(k);_aa._ab(b,k);try{for(var i=0;i>1,g)}}}catch(c){throw"Error._ab"}}return l};_aa._ah=function(h,o,l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i){var g=_ae._ag(l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i);return _aa._af(h,o,g)};function _a1(b,a){this.count=b;this._fc=a;this.__defineGetter__("Count",function(){return this.count});this.__defineGetter__("_dm",function(){return this._fc})}function _a2(a,c,b){this._bm=a;if(b){this._do=new Array(c,b)}else{this._do=new Array(c)}this.__defineGetter__("_bo",function(){return this._bm});this.__defineGetter__("_dn",function(){return this._bm*this._fo});this.__defineGetter__("_fo",function(){var e=0;for(var d=0;d6){o._bq(r-11,0,3,6);o._bq(0,r-11,6,3)}return o};this._bu=function(i){return this._do[i.ordinal()]}}_a3._bv=new Array(31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017);_a3.VERSIONS=_ay();_a3._av=function(a){if(a<1||a>40){throw"bad arguments"}return _a3.VERSIONS[a-1]};_a3._at=function(b){if(b%4!=1){throw"Error _at"}try{return _a3._av((b-17)>>2)}catch(a){throw"Error _av"}};_a3._aw=function(d){var b=4294967295;var f=0;for(var c=0;c<_a3._bv.length;c++){var a=_a3._bv[c];if(a==d){return this._av(c+7)}var e=_ax._gj(d,a);if(eMath.abs(c-m);if(d){var s=m;m=l;l=s;s=c;c=b;b=s}var j=Math.abs(c-m);var i=Math.abs(b-l);var q=-j>>1;var v=l0){if(g==b){break}g+=v;q-=j}}var k=c-m;var r=b-l;return Math.sqrt((k*k+r*r))};this._bh=function(i,g,h,f){var b=this._bi(i,g,h,f);var e=1;var d=i-(h-i);if(d<0){e=i/(i-d);d=0}else{if(d>=qrcode.width){e=(qrcode.width-1-i)/(d-i);d=qrcode.width-1}}var c=Math.floor(g-(f-g)*e);e=1;if(c<0){e=g/(g-c);c=0}else{if(c>=qrcode.height){e=(qrcode.height-1-g)/(c-g);c=qrcode.height-1}}d=Math.floor(i+(d-i)*e);b+=this._bi(i,g,d,c);return b-1};this._bj=function(c,d){var b=this._bh(Math.floor(c.X),Math.floor(c.Y),Math.floor(d.X),Math.floor(d.Y));var e=this._bh(Math.floor(d.X),Math.floor(d.Y),Math.floor(c.X),Math.floor(c.Y));if(isNaN(b)){return e/7}if(isNaN(e)){return b/7}return(b+e)/14};this._bk=function(d,c,b){return(this._bj(d,c)+this._bj(d,b))/2};this.distance=function(c,b){xDiff=c.X-b.X;yDiff=c.Y-b.Y;return Math.sqrt((xDiff*xDiff+yDiff*yDiff))};this._bx=function(g,f,d,e){var b=Math.round(this.distance(g,f)/e);var c=Math.round(this.distance(g,d)/e);var h=((b+c)>>1)+7;switch(h&3){case 0:h++;break;case 2:h--;break;case 3:throw"Error"}return h};this._bl=function(g,f,d,j){var k=Math.floor(j*g);var h=Math.max(0,f-k);var i=Math.min(qrcode.width-1,f+k);if(i-h0){var f=h.X-j.X+n.X;var e=h.Y-j.Y+n.Y;var c=1-3/k;var u=Math.floor(j.X+c*(f-j.X));var t=Math.floor(j.Y+c*(e-j.Y));for(var q=4;q<=16;q<<=1){l=this._bl(d,u,t,q);break}}var g=this.createTransform(j,h,n,l,s);var m=this._bz(this.image,g,s);var o;if(l==null){o=new Array(n,j,h)}else{o=new Array(n,j,h,l)}return new _bg(m,o)};this.detect=function(){var b=new _cc()._ce(this.image);return this._cd(b)}}var _ca=21522;var _cb=new Array(new Array(21522,0),new Array(20773,1),new Array(24188,2),new Array(23371,3),new Array(17913,4),new Array(16590,5),new Array(20375,6),new Array(19104,7),new Array(30660,8),new Array(29427,9),new Array(32170,10),new Array(30877,11),new Array(26159,12),new Array(25368,13),new Array(27713,14),new Array(26998,15),new Array(5769,16),new Array(5054,17),new Array(7399,18),new Array(6608,19),new Array(1890,20),new Array(597,21),new Array(3340,22),new Array(2107,23),new Array(13663,24),new Array(12392,25),new Array(16177,26),new Array(14854,27),new Array(9396,28),new Array(8579,29),new Array(11994,30),new Array(11245,31));var _ch=new Array(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);function _ax(a){this._cf=_cg.forBits((a>>3)&3);this._fe=(a&7);this.__defineGetter__("_cg",function(){return this._cf});this.__defineGetter__("_dx",function(){return this._fe});this.GetHashCode=function(){return(this._cf.ordinal()<<3)|_fe};this.Equals=function(c){var b=c;return this._cf==b._cf&&this._fe==b._fe}}_ax._gj=function(d,c){d^=c;return _ch[d&15]+_ch[(_ew(d,4)&15)]+_ch[(_ew(d,8)&15)]+_ch[(_ew(d,12)&15)]+_ch[(_ew(d,16)&15)]+_ch[(_ew(d,20)&15)]+_ch[(_ew(d,24)&15)]+_ch[(_ew(d,28)&15)]};_ax._ci=function(a){var b=_ax._cj(a);if(b!=null){return b}return _ax._cj(a^_ca)};_ax._cj=function(d){var b=4294967295;var a=0;for(var c=0;c<_cb.length;c++){var g=_cb[c];var f=g[0];if(f==d){return new _ax(g[1])}var e=this._gj(d,f);if(e=FOR_BITS.length){throw"bad arguments"}return FOR_BITS[a]};var L=new _cg(0,1,"L");var M=new _cg(1,0,"M");var Q=new _cg(2,3,"Q");var H=new _cg(3,2,"H");var FOR_BITS=new Array(M,L,H,Q);function _ac(d,a){if(!a){a=d}if(d<1||a<1){throw"Both dimensions must be greater than 0"}this.width=d;this.height=a;var c=d>>5;if((d&31)!=0){c++}this.rowSize=c;this.bits=new Array(c*a);for(var b=0;b>5);return((_ew(this.bits[f],(e&31)))&1)!=0};this._dq=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]|=1<<(e&31)};this.flip=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]^=1<<(e&31)};this.clear=function(){var e=this.bits.length;for(var f=0;fthis.height||l>this.width){throw"The region must fit inside the matrix"}for(var i=j;i>5)]|=1<<(k&31)}}}}function _dl(a,b){this._dv=a;this._dw=b;this.__defineGetter__("_du",function(){return this._dv});this.__defineGetter__("Codewords",function(){return this._dw})}_dl._gn=function(c,h,s){if(c.length!=h._dp){throw"bad arguments"}var k=h._bu(s);var e=0;var d=k._fb();for(var r=0;r=0){var w=l[b]._dw.length;if(w==u){break}b--}b++;var g=u-k._bo;var a=0;for(var r=0;r=0;c--){g=this._dk(8,c,g)}this._co=_ax._ci(g);if(this._co!=null){return this._co}var f=this._au.Dimension;g=0;var d=f-8;for(var e=f-1;e>=d;e--){g=this._dk(e,8,g)}for(var c=f-7;c>2;if(f<=6){return _a3._av(f)}var g=0;var e=h-11;for(var c=5;c>=0;c--){for(var d=h-9;d>=e;d--){g=this._dk(d,c,g)}}this._cp=_a3._aw(g);if(this._cp!=null&&this._cp._cr==h){return this._cp}g=0;for(var d=5;d>=0;d--){for(var c=h-9;c>=e;c--){g=this._dk(d,c,g)}}this._cp=_a3._aw(g);if(this._cp!=null&&this._cp._cr==h){return this._cp}throw"Error _cq"};this._gk=function(){var r=this._cm();var o=this._cq();var c=_dx._gl(r._dx);var f=this._au.Dimension;c._dj(this._au,f);var k=o._aq();var n=true;var s=new Array(o._dp);var m=0;var q=0;var h=0;for(var e=f-1;e>0;e-=2){if(e==6){e--}for(var l=0;l7){throw"bad arguments"}return _dx._dy[a]};function _fg(){this._dj=function(c,d){for(var b=0;b=Math.floor(R/2)){var rLastLast=rLast;var _ga=sLast;var _gb=tLast;rLast=r;sLast=s;tLast=t;if(rLast.Zero){throw"r_{i-1} was zero"}r=rLastLast;var q=this._fa.Zero;var _df=rLast._ex(rLast._ec);var _fy=this._fa.inverse(_df);while(r._ec>=rLast._ec&&!r.Zero){var _fx=r._ec-rLast._ec;var scale=this._fa.multiply(r._ex(r._ec),_fy);q=q._bd(this._fa._ba(_fx,scale));r=r._bd(rLast._dc(_fx,scale))}s=q.multiply1(sLast)._bd(_ga);t=q.multiply1(tLast)._bd(_gb)}var _de=t._ex(0);if(_de==0){throw"ReedSolomonException sigmaTilde(0) was zero"}var inverse=this._fa.inverse(_de);var sigma=t.multiply2(inverse);var omega=r.multiply2(inverse);return new Array(sigma,omega)};this._ey=function(_ez){var _fz=_ez._ec;if(_fz==1){return new Array(_ez._ex(1))}var result=new Array(_fz);var e=0;for(var i=1;i<256&&e<_fz;i++){if(_ez.evaluateAt(i)==0){result[e]=this._fa.inverse(i);e++}}if(e!=_fz){throw"Error locator degree does not match number of roots"}return result};this._di=function(_fs,_dz,_fq){var s=_dz.length;var result=new Array(s);for(var i=0;i1&&e[0]==0){var d=1;while(dn.length){var j=o;o=n;n=j}var h=new Array(n.length);var k=n.length-o.length;for(var m=0;m=l._ec&&!o.Zero){var m=o._ec-l._ec;var h=this._fa.multiply(o._ex(o._ec),n);var i=l._dc(m,h);var k=this._fa._ba(m,h);j=j._bd(k);o=o._bd(i)}return new Array(j,o)}}function _az(b){this._gh=new Array(256);this._gi=new Array(256);var a=1;for(var e=0;e<256;e++){this._gh[e]=a;a<<=1;if(a>=256){a^=b}}for(var e=0;e<255;e++){this._gi[this._gh[e]]=e}var d=new Array(1);d[0]=0;this.zero=new _bp(this,new Array(d));var c=new Array(1);c[0]=1;this.one=new _bp(this,new Array(c));this.__defineGetter__("Zero",function(){return this.zero});this.__defineGetter__("One",function(){return this.one});this._ba=function(j,f){if(j<0){throw"bad arguments"}if(f==0){return zero}var h=new Array(j+1);for(var g=0;gqrcode.maxImgSize){var k=c.width/c.height;f=Math.sqrt(qrcode.maxImgSize/k);l=k*f}i.width=l;i.height=f;h.drawImage(c,0,0,i.width,i.height);qrcode.width=i.width;qrcode.height=i.height;try{qrcode.imagedata=h.getImageData(0,0,i.width,i.height)}catch(m){qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!";if(qrcode.callback!=null){qrcode.callback(qrcode.result)}return}try{qrcode.result=qrcode.process(h)}catch(m){console.log(m);qrcode.result="error decoding QR Code"}if(qrcode.callback!=null){qrcode.callback(qrcode.result)}};c.src=d}};qrcode.isUrl=function(a){var b=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return b.test(a)};qrcode.decode_url=function(b){var d="";try{d=escape(b)}catch(c){console.log(c);d=b}var a="";try{a=decodeURIComponent(d)}catch(c){console.log(c);a=d}return a};qrcode.decode_utf8=function(a){if(qrcode.isUrl(a)){return qrcode.decode_url(a)}else{return a}};qrcode.process=function(r){var a=new Date().getTime();var c=qrcode.grayScaleToBitmap(qrcode.grayscale());if(qrcode.debug){for(var m=0;mf[a][o][1]){f[a][o][1]=h}}}}}var m=new Array(c);for(var b=0;b=0){return a>>b}else{return(a>>b)+(2<<~b)}}Array.prototype.remove=function(c,b){var a=this.slice((b||c)+1||this.length);this.length=c<0?this.length+c:c;return this.push.apply(this,a)};var _gf=3;var _eh=57;var _el=8;var _eg=2;qrcode._er=function(c){function b(l,k){xDiff=l.X-k.X;yDiff=l.Y-k.Y;return Math.sqrt((xDiff*xDiff+yDiff*yDiff))}function d(k,o,n){var m=o.x;var l=o.y;return((n.x-m)*(k.y-l))-((n.y-l)*(k.x-m))}var i=b(c[0],c[1]);var f=b(c[1],c[2]);var e=b(c[0],c[2]);var a,j,h;if(f>=i&&f>=e){j=c[0];a=c[1];h=c[2]}else{if(e>=f&&e>=i){j=c[1];a=c[0];h=c[2]}else{j=c[2];a=c[0];h=c[1]}}if(d(a,j,h)<0){var g=a;a=h;h=g}c[0]=a;c[1]=j;c[2]=h};function _cz(c,a,b){this.x=c;this.y=a;this.count=1;this._aj=b;this.__defineGetter__("_ei",function(){return this._aj});this.__defineGetter__("Count",function(){return this.count});this.__defineGetter__("X",function(){return this.x});this.__defineGetter__("Y",function(){return this.y});this._ek=function(){this.count++};this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return false}}function _es(a){this._go=a[0];this._gu=a[1];this._gr=a[2];this.__defineGetter__("_gp",function(){return this._go});this.__defineGetter__("_gq",function(){return this._gu});this.__defineGetter__("_gs",function(){return this._gr})}function _cc(){this.image=null;this._cv=[];this._ge=false;this._al=new Array(0,0,0,0,0);this._am=null;this.__defineGetter__("_da",function(){this._al[0]=0;this._al[1]=0;this._al[2]=0;this._al[3]=0;this._al[4]=0;return this._al});this._ao=function(f){var b=0;for(var d=0;d<5;d++){var e=f[d];if(e==0){return false}b+=e}if(b<7){return false}var c=Math.floor((b<<_el)/7);var a=Math.floor(c/2);return Math.abs(c-(f[0]<<_el))=0&&c[j+f*qrcode.width]){b[2]++;f--}if(f<0){return NaN}while(f>=0&&!c[j+f*qrcode.width]&&b[1]<=d){b[1]++;f--}if(f<0||b[1]>d){return NaN}while(f>=0&&c[j+f*qrcode.width]&&b[0]<=d){b[0]++;f--}if(b[0]>d){return NaN}f=a+1;while(f=d){return NaN}while(f=d){return NaN}var e=b[0]+b[1]+b[2]+b[3]+b[4];if(5*Math.abs(e-g)>=2*g){return NaN}return this._ao(b)?this._an(b,f):NaN};this._ej=function(b,a,e,h){var d=this.image;var i=qrcode.width;var c=this._da;var g=b;while(g>=0&&d[g+a*qrcode.width]){c[2]++;g--}if(g<0){return NaN}while(g>=0&&!d[g+a*qrcode.width]&&c[1]<=e){c[1]++;g--}if(g<0||c[1]>e){return NaN}while(g>=0&&d[g+a*qrcode.width]&&c[0]<=e){c[0]++;g--}if(c[0]>e){return NaN}g=b+1;while(g=e){return NaN}while(g=e){return NaN}var f=c[0]+c[1]+c[2]+c[3]+c[4];if(5*Math.abs(f-h)>=h){return NaN}return this._ao(c)?this._an(c,g):NaN};this._cu=function(c,f,e){var d=c[0]+c[1]+c[2]+c[3]+c[4];var n=this._an(c,e);var b=this._ap(f,Math.floor(n),c[2],d);if(!isNaN(b)){n=this._ej(Math.floor(n),Math.floor(b),c[2],d);if(!isNaN(n)){var l=d/7;var m=false;var h=this._cv.length;for(var g=0;g3){var b=0;var j=0;for(var d=0;d3;d++){var f=this._cv[d];if(Math.abs(f._ei-a)>c){this._cv.remove(d);d--}}}if(this._cv.length>3){this._cv.sort(function(k,i){if(k.count>i.count){return -1}if(k.count=_eg){if(c==null){c=a}else{this._ge=true;return Math.floor((Math.abs(c.X-a.X)-Math.abs(c.Y-a.Y))/2)}}}return 0};this._cx=function(){var g=0;var c=0;var a=this._cv.length;for(var d=0;d=_eg){g++;c+=f._ei}}if(g<3){return false}var e=c/a;var b=0;for(var d=0;dd[2]){h+=m-d[2]-a;f=k-1}}}else{do{f++}while(f=h){return false}}return true};this._ap=function(h,r,l,o){var k=this.image;var q=qrcode.height;var j=this._al;j[0]=0;j[1]=0;j[2]=0;var n=h;while(n>=0&&k[r+n*qrcode.width]&&j[1]<=l){j[1]++;n--}if(n<0||j[1]>l){return NaN}while(n>=0&&!k[r+n*qrcode.width]&&j[0]<=l){j[0]++;n--}if(j[0]>l){return NaN}n=h+1;while(nl){return NaN}while(nl){return NaN}var m=j[0]+j[1]+j[2];if(5*Math.abs(m-o)>=2*o){return NaN}return this._ao(j)?this._an(j,n):NaN};this._cu=function(l,o,n){var m=l[0]+l[1]+l[2];var u=this._an(l,n);var k=this._ap(o,Math.floor(u),2*l[1],m);if(!isNaN(k)){var t=(l[0]+l[1]+l[2])/3;var r=this._cv.length;for(var q=0;q>1);var m=new Array(0,0,0);for(var k=0;k>1):-((k+1)>>1));m[0]=0;m[1]=0;m[2]=0;var n=q;while(n=10&&a<=26){this.dataLengthMode=1}else{if(a>=27&&a<=40){this.dataLengthMode=2}}}this._gd=function(f){var k=0;if(f>(this._cw-f+1);this._cw-=f;return k}else{if(f>(8-(f-(this._cw+1))));this._cw=this._cw-f%8;if(this._cw<0){this._cw=8+this._cw}return k}else{if(f>(8-(f-(this._cw+1+8)));k=g+d+l;this._cw=this._cw-(f-8)%8;if(this._cw<0){this._cw=8+this._cw}return k}else{return 0}}}};this.NextMode=function(){if((this._ed>this.blocks.length-this._en-2)){return 0}else{return this._gd(4)}};this.getDataLength=function(d){var e=0;while(true){if((d>>e)==1){break}e++}return this._gd(qrcode._eo[this.dataLengthMode][e])};this.getRomanAndFigureString=function(h){var f=h;var g=0;var j="";var d=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do{if(f>1){g=this._gd(11);var i=Math.floor(g/45);var e=g%45;j+=d[i];j+=d[e];f-=2}else{if(f==1){g=this._gd(6);j+=d[g];f-=1}}}while(f>0);return j};this.getFigureString=function(f){var d=f;var e=0;var g="";do{if(d>=3){e=this._gd(10);if(e<100){g+="0"}if(e<10){g+="0"}d-=3}else{if(d==2){e=this._gd(7);if(e<10){g+="0"}d-=2}else{if(d==1){e=this._gd(4);d-=1}}}g+=e}while(d>0);return g};this.get8bitByteArray=function(g){var e=g;var f=0;var d=new Array();do{f=this._gd(8);d.push(f);e--}while(e>0);return d};this.getKanjiString=function(j){var g=j;var i=0;var h="";do{i=_gd(13);var e=i%192;var f=i/192;var k=(f<<8)+e;var d=0;if(k+33088<=40956){d=k+33088}else{d=k+49472}h+=String.fromCharCode(d);g--}while(g>0);return h};this.__defineGetter__("DataByte",function(){var g=new Array();var e=1;var f=2;var d=4;var n=8;do{var k=this.NextMode();if(k==0){if(g.length>0){break}else{throw"Empty data block"}}if(k!=e&&k!=f&&k!=d&&k!=n){throw"Invalid mode: "+k+" in (block:"+this._ed+" bit:"+this._cw+")"}dataLength=this.getDataLength(k);if(dataLength<1){throw"Invalid data length: "+dataLength}switch(k){case e:var l=this.getFigureString(dataLength);var i=new Array(l.length);for(var h=0;hDrag and drop a QRCode here'+ + '
or select a file


'+ + ''+ + ''+ +''; + +var vidhtml = ''; + +function dragenter(e) { + e.stopPropagation(); + e.preventDefault(); +} + +function dragover(e) { + e.stopPropagation(); + e.preventDefault(); +} +function drop(e) { + e.stopPropagation(); + e.preventDefault(); + + var dt = e.dataTransfer; + var files = dt.files; + if(files.length>0) + { + handleFiles(files); + } + else + if(dt.getData('URL')) + { + qrcode.decode(dt.getData('URL')); + } +} + +function handleFiles(f) +{ + var o=[]; + + for(var i =0;i/g, '>').replace(/"/g, '"'); +} + +function read(qrcode_token) +{ + if(workingAway) { + return; + } + + workingAway = true; + + $.ajax({ + type: "POST", + url: Attendize.qrcodeCheckInRoute, + data: {qrcode_token: qrcode_token}, + cache: false, + complete: function(){ + beepSound.play(); + }, + error: function() { + }, + success: function(response) { + document.getElementById("result").innerHTML = "" + response.message +""; + } + }); +} + +function isCanvasSupported(){ + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); +} +function success(stream) { + if(webkit) + v.src = window.webkitURL.createObjectURL(stream); + else + if(moz) + { + v.mozSrcObject = stream; + v.play(); + } + else + v.src = stream; + gUM=true; + setTimeout(captureToCanvas, 500); +} + +function error(error) { + gUM=false; + return; +} + +function load() +{ + if(isCanvasSupported() && window.File && window.FileReader) + { + initCanvas(800, 600); + qrcode.callback = read; + document.getElementById("mainbody").style.display="inline"; + setwebcam(); + } + else + { + document.getElementById("mainbody").style.display="inline"; + document.getElementById("mainbody").innerHTML='

Attendize Checkpoint Manager for HTML5 capable browsers


'+ + '

sorry your browser is not supported



'+ + '

try or or

'; + } +} + +function setwebcam() +{ + document.getElementById("help-text").style.display = "block"; + document.getElementById("result").innerHTML='Scanning   '; + if(stype==1) + { + setTimeout(captureToCanvas, 500); + return; + } + var n=navigator; + document.getElementById("outdiv").innerHTML = vidhtml; + v=document.getElementById("v"); + + if(n.getUserMedia) + n.getUserMedia({video: true, audio: false}, success, error); + else + if(n.webkitGetUserMedia) + { + webkit=true; + n.webkitGetUserMedia({video:true, audio: false}, success, error); + } + else + if(n.mozGetUserMedia) + { + moz=true; + n.mozGetUserMedia({video: true, audio: false}, success, error); + } + + stype=1; + setTimeout(captureToCanvas, 500); +} +function setimg() +{ + document.getElementById("help-text").style.display = "none"; + document.getElementById("result").innerHTML='Waiting for a QRCode  '; + if(stype==2) + return; + document.getElementById("outdiv").innerHTML = imghtml; + document.getElementById("qrimg").style.opacity=1.0; + document.getElementById("webcamimg").style.opacity=0.2; + var qrfile = document.getElementById("qrfile"); + qrfile.addEventListener("dragenter", dragenter, false); + qrfile.addEventListener("dragover", dragover, false); + qrfile.addEventListener("drop", drop, false); + stype=2; +} diff --git a/resources/views/ManageEvent/QrcodeCheckIn.blade.php b/resources/views/ManageEvent/QrcodeCheckIn.blade.php new file mode 100644 index 00000000..7f4bf5eb --- /dev/null +++ b/resources/views/ManageEvent/QrcodeCheckIn.blade.php @@ -0,0 +1,105 @@ + + + + + Attendize QRCode Check In: {{ $event->title }} + + + + + + {!! HTML::style('assets/stylesheet/qrcode-check-in.css') !!} + {!! HTML::script('vendor/jquery/jquery.js') !!} + + + + @include('Shared/Layouts/ViewJavascript') + + + + + + + {!! HTML::script('vendor/qrcode-scan/llqrcode.js') !!} + {!! HTML::script('vendor/qrcode-scan/webqr.js') !!} + + +
+ + +
+ + @if(session()->has('success_message')) +
+
+
+ +
+
+
+ @endif + +
+ + + + + + + + + + +
+ + + + + + + + +
+ + + +
+
+
+
+
+

Put the QR code in front of your Camera

+
+

Scan another ticket

+
+
+
  + +
+
+
+
© Attendize {{ date('Y') }} · All Rights Reserved.
+
+
+ + + + + + diff --git a/resources/views/Shared/Layouts/ViewJavascript.blade.php b/resources/views/Shared/Layouts/ViewJavascript.blade.php new file mode 100644 index 00000000..e69de29b