Setting up Square payment processor.
authorSteve Sutton <steve@gaslightmedia.com>
Fri, 5 Apr 2019 11:48:53 +0000 (07:48 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Fri, 5 Apr 2019 11:48:53 +0000 (07:48 -0400)
Creating new fields for the management of square payment processor.
Setting up the billing support class to use square as processor.

17 files changed:
classes/billingSupport.php
classes/data/dataManagement.php
config/plugin.ini
css/sq-payment-form.css [new file with mode: 0644]
index.php
js/sq-payment-form.js [new file with mode: 0644]
models/admin/management/billing.php
models/front/billing/paymentForm.php
setup/databaseScripts/create_database_V0.0.32.sql [deleted file]
setup/databaseScripts/create_database_V0.0.35.sql [deleted file]
setup/databaseScripts/create_database_V0.0.36.sql [new file with mode: 0644]
setup/databaseScripts/dbVersions.php
setup/databaseScripts/update_database_V0.0.36.sql [new file with mode: 0644]
views/admin/management/billing.html
views/common/billing/paymentForm.html
views/common/billing/squarePaymentForm.html [new file with mode: 0644]
views/front/billing/paymentForm.html

index 1073969..75f3bf6 100644 (file)
@@ -1221,7 +1221,7 @@ class GlmBillingSupport
         // Setup the required account information for the selected payment processor
         switch ( $ccProcessor ) {
 
-        case $this->config['proc_method_numb']['Authorize.net']:
+        case $this->config['billing_proc_method_numb']['Authorize.net']:
 
             // Get account data
             $account = array(
@@ -1234,7 +1234,7 @@ class GlmBillingSupport
 
             break;
 
-        case $this->config['proc_method_numb']['MerchantSolutions']:
+        case $this->config['billing_proc_method_numb']['MerchantSolutions']:
 
             // Get account data
             $account = array(
@@ -1247,15 +1247,30 @@ class GlmBillingSupport
 
             break;
 
+        case $this->config['billing_proc_method_numb']['Square']:
+            // Get account data
+            $account = array(
+                'prod_app_id'          => $this->config['billing_settings']['square_prod_app_id'],
+                'prod_access_token'    => $this->config['billing_settings']['square_prod_access_token'],
+                'prod_location_id'     => $this->config['billing_settings']['square_prod_location_id'],
+                'sandbox_app_id'       => $this->config['billing_settings']['square_sandbox_app_id'],
+                'sandbox_access_token' => $this->config['billing_settings']['square_sandbox_access_token'],
+                'sandbox_location_id'  => $this->config['billing_settings']['square_sandbox_location_id'],
+                'use_prod'             => $this->config['billing_settings']['square_use_prod'],
+            );
+            $checkCC = false;
+            break;
+
         // These don't require account data
-        case $this->config['proc_method_numb']['Merchant']:
-        case $this->config['proc_method_numb']['TestAlwaysGood']:
-        case $this->config['proc_method_numb']['TestByCardNumber']:
+        case $this->config['billing_proc_method_numb']['Merchant']:
+        case $this->config['billing_proc_method_numb']['TestAlwaysGood']:
+        case $this->config['billing_proc_method_numb']['TestByCardNumber']:
         default:
             $account = array();
             break;
 
         }
+
         // Get the credit card input
         $cardData = filter_var_array(
             $_REQUEST,
@@ -1348,8 +1363,8 @@ class GlmBillingSupport
         if ( count( $errors ) == 0 ) {
 
             // Determine the directory of the payment processor to load and instantiate it.
-            if ( $ccProcessor && isset( $this->config['proc_dir'][$ccProcessor] ) ) {
-                require_once GLM_MEMBERS_PLUGIN_LIB_PATH . '/paymentProcessors/' . $this->config['proc_dir'][$ccProcessor] . '/paymentGateway.php';
+            if ( $ccProcessor && isset( $this->config['billing_proc_dir'][$ccProcessor] ) ) {
+                require_once GLM_MEMBERS_PLUGIN_LIB_PATH . '/paymentProcessors/' . $this->config['billing_proc_dir'][$ccProcessor] . '/paymentGateway.php';
                 $CcProcessor = new PaymentGateway( $account );
             }
 
@@ -1370,8 +1385,6 @@ class GlmBillingSupport
             // Now try to run the card processor
             $ccResult = $CcProcessor->processPayment( $payment, $billing );
 
-            // echo '<pre>$ccResult: ' . print_r( $ccResult, true ) . '</pre>';
-
             // If successful submission - say we're complete
             if ( is_array( $ccResult ) && isset( $ccResult['status'] ) && $ccResult['status'] == 1 ) {
 
index d50d3b0..be74e04 100644 (file)
@@ -109,35 +109,35 @@ class GlmDataBillingManagement extends GlmDataAbstract
         $this->fields = array (
 
             'id' => array (
-                'field' => 'id',
-                'type' => 'integer',
+                'field'     => 'id',
+                'type'      => 'integer',
                 'view_only' => true,
-                'use' => 'a'
+                'use'       => 'a'
             ),
 
             // Payment Methods Selected - Bitmap
             'payment_methods' => array (
-                'field' => 'payment_methods',
-                'type'     => 'bitmap',
-                'bitmap'    => $this->config['payment_method'],
-                'default'  => 0, // none selected
-                'use'      => 'a'
+                'field'   => 'payment_methods',
+                'type'    => 'bitmap',
+                'bitmap'  => $this->config['payment_method'],
+                'default' => 0, // none selected
+                'use'     => 'a'
             ),
 
             // Processing Methods Selected - Bitmap
             'proc_methods' => array (
                 'field'    => 'proc_methods',
                 'type'     => 'list',
-                'list'     => $this->config['proc_method'],
-                'default'  => $this->config['proc_method_numb']['Merchant'],
+                'list'     => $this->config['billing_proc_method'],
+                'default'  => $this->config['billing_proc_method_numb']['Merchant'],
                 'use'      => 'a'
             ),
 
             // Credit Cards Accepted Selected - Bitmap
             'cc_accepts' => array (
-                'field' => 'cc_accepts',
+                'field'    => 'cc_accepts',
                 'type'     => 'bitmap',
-                'bitmap'    => $this->config['credit_card'],
+                'bitmap'   => $this->config['credit_card'],
                 'default'  => 0, // none selected
                 'use'      => 'a'
             ),
@@ -145,77 +145,77 @@ class GlmDataBillingManagement extends GlmDataAbstract
             // Authorize.net Login
             'authorize_net_login' => array (
                 'field' => 'authorize_net_login',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Authorize.net Key
             'authorize_net_key' => array (
                 'field' => 'authorize_net_key',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Authorize.net Test Mode
             'authorize_net_test' => array (
-                'field' => 'authorize_net_test',
-                'type' => 'list',
-                'list' => $this->config['proc_test_mode'],
+                'field'   => 'authorize_net_test',
+                'type'    => 'list',
+                'list'    => $this->config['proc_test_mode'],
                 'default' => $this->config['proc_test_mode_numb']['Local Approval Test'],
-                'use' => 'a'
+                'use'     => 'a'
             ),
 
             // Always Use Full Billing Info
             'authorize_net_conf' => array (
-                'field' => 'authorize_net_conf',
-                'type' => 'checkbox',
-                'use' => 'a',
-                'default'  => 0,
+                'field'   => 'authorize_net_conf',
+                'type'    => 'checkbox',
+                'use'     => 'a',
+                'default' => 0,
             ),
 
             // Authorize.net Merchant Email
             'authorize_net_merchant_email' => array (
                 'field' => 'authorize_net_merchant_email',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Merchant Solutions Account ID
             'merchant_solutions_acctid' => array (
                 'field' => 'merchant_solutions_acctid',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Merchant Solutions Merchant PIN
             'merchant_solutions_merchantpin' => array (
                 'field' => 'merchant_solutions_merchantpin',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Merchant Solutions Test Mode
             'merchant_solutions_test' => array (
-                'field' => 'merchant_solutions_test',
-                'type' => 'list',
-                'list' => $this->config['proc_test_mode'],
+                'field'   => 'merchant_solutions_test',
+                'type'    => 'list',
+                'list'    => $this->config['proc_test_mode'],
                 'default' => $this->config['proc_test_mode_numb']['Local Approval Test'],
-                'use' => 'a'
+                'use'     => 'a'
             ),
 
             // Always Use Full Billing Info
             'merchant_solutions_conf' => array (
-                'field' => 'merchant_solutions_conf',
-                'type' => 'checkbox',
-                'use' => 'a',
-                'default'  => 0,
+                'field'   => 'merchant_solutions_conf',
+                'type'    => 'checkbox',
+                'use'     => 'a',
+                'default' => 0,
             ),
 
             // Merchant Email
             'merchant_solutions_merchant_email' => array (
                 'field' => 'merchant_solutions_merchant_email',
-                'type' => 'text',
-                'use' => 'a'
+                'type'  => 'text',
+                'use'   => 'a'
             ),
 
             // Use uptra invoice template
@@ -232,10 +232,59 @@ class GlmDataBillingManagement extends GlmDataAbstract
                 'use'   => 'a',
             ),
 
+            // Square
+            'square_prod_access_token' => array (
+                'field' => 'square_prod_access_token',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+            // Square
+            'square_prod_app_id' => array (
+                'field' => 'square_prod_app_id',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+            // Square
+            'square_prod_location_id' => array (
+                'field' => 'square_prod_location_id',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+            // Square
+            'square_sandbox_access_token' => array (
+                'field' => 'square_sandbox_access_token',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+            // Square
+            'square_sandbox_app_id' => array (
+                'field' => 'square_sandbox_app_id',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+            // Square
+            'square_sandbox_location_id' => array (
+                'field' => 'square_sandbox_location_id',
+                'type'  => 'text',
+                'use'   => 'a'
+            ),
+
+
+            // If true use Production creds
+            'square_use_prod' => array (
+                'field'   => 'square_use_prod',
+                'type'    => 'checkbox',
+                'use'     => 'a',
+                'default' => 0,
+            ),
+
         );
 
     }
 
 }
-
-?>
index b3ddf20..e39a6c8 100644 (file)
@@ -85,36 +85,39 @@ credit_card_match[5]                            = '/^([30|36|38]{2})([0-9]{12})$
 ;
 ; Card Processing Methods - Use as Bitmap Index or List
 ;
-proc_method[1]                                  = 'By Merchant'
-proc_method[2]                                  = 'Authorize.net'
-proc_method[3]                                  = 'Merchant Solutions'
-proc_method[98]                                 = 'Test - Card Always Good'
-proc_method[99]                                 = 'Test by Card Number'
-
-proc_method_numb['Merchant']                    = 1
-proc_method_numb['Authorize.net']               = 2
-proc_method_numb['MerchantSolutions']           = 3
-proc_method_numb['TestAlwaysGood']              = 4
-proc_method_numb['TestByCardNumber']            = 5
-
-proc_dir[1]                                     = 'ByMerchant'
-proc_dir[2]                                     = 'Authorize.Net'
-proc_dir[3]                                     = 'MerchantSolutions'
-proc_dir[98]                                    = 'TestGood'
-proc_dir[99]                                    = 'TestByCardNumber'
+billing_proc_method[1]                                  = 'By Merchant'
+billing_proc_method[2]                                  = 'Authorize.net'
+billing_proc_method[3]                                  = 'Merchant Solutions'
+billing_proc_method[4]                                  = 'Square'
+billing_proc_method[98]                                 = 'Test - Card Always Good'
+billing_proc_method[99]                                 = 'Test by Card Number'
+
+billing_proc_method_numb['Merchant']                    = 1
+billing_proc_method_numb['Authorize.net']               = 2
+billing_proc_method_numb['MerchantSolutions']           = 3
+billing_proc_method_numb['Square']                      = 4
+billing_proc_method_numb['TestAlwaysGood']              = 98
+billing_proc_method_numb['TestByCardNumber']            = 99
+
+billing_proc_dir[1]                                     = 'ByMerchant'
+billing_proc_dir[2]                                     = 'Authorize.Net'
+billing_proc_dir[3]                                     = 'MerchantSolutions'
+billing_proc_dir[4]                                     = 'Square'
+billing_proc_dir[98]                                    = 'TestGood'
+billing_proc_dir[99]                                    = 'TestByCardNumber'
 
 ;
 ; Card processing test modes
 ;
-proc_test_mode[0]                               = 'Production Mode'
-proc_test_mode[1]                               = 'Local Transaction Approval Test'
-proc_test_mode[2]                               = 'Local Transaction Decline Test'
-proc_test_mode[3]                               = 'On-Line Transaction Test'
-
-proc_test_mode_numb['Local Approval Test']      =  1
-proc_test_mode_numb['Local Decline Test']       =  2
-proc_test_mode_numb['On-Line Test']             =  3
-proc_test_mode_numb['Production Mode']          =  0
+billing_proc_test_mode[0]                               = 'Production Mode'
+billing_proc_test_mode[1]                               = 'Local Transaction Approval Test'
+billing_proc_test_mode[2]                               = 'Local Transaction Decline Test'
+billing_proc_test_mode[3]                               = 'On-Line Transaction Test'
+
+billing_proc_test_mode_numb['Local Approval Test']      =  1
+billing_proc_test_mode_numb['Local Decline Test']       =  2
+billing_proc_test_mode_numb['On-Line Test']             =  3
+billing_proc_test_mode_numb['Production Mode']          =  0
 
 ;
 ; Card processor result codes
diff --git a/css/sq-payment-form.css b/css/sq-payment-form.css
new file mode 100644 (file)
index 0000000..3e83a9a
--- /dev/null
@@ -0,0 +1,181 @@
+.sq-field-wrapper {
+  display: flex;
+  flex-flow: row nowrap;
+  margin-bottom: 16px;
+}
+
+.sq-field {
+  margin-bottom: 16px;
+  width: 100%;
+}
+
+.sq-field:first-child {
+  margin-left: 0;
+}
+
+.sq-field:last-child {
+  margin-right: 0;
+}
+
+.sq-field--in-wrapper {
+  flex-grow: 1;
+  margin: 0 8px;
+}
+
+.sq-label {
+  margin-bottom: 8px;
+  text-transform: uppercase;
+}
+
+.sq-input {
+  background-color: #fff;
+  border-style: solid;
+  border-width: 1px;
+  overflow: hidden;
+  transition: border-color 0.25s ease;
+  width: 100%;
+}
+
+.sq-input--focus {
+  background-color: #fbfdff;
+}
+
+.sq-input--error {
+  background-color: #fbfdff;
+}
+
+.sq-button {
+  color: #fff;
+  padding: 16px;
+  width: 100%;
+}
+
+.sq-button:active {
+  color: #fff;
+}
+.sq-payment-form {
+  max-width: 100%;
+  padding: 20px 20px 5px;
+  width: 380px;
+}
+
+.sq-label {
+  color: #000000;
+  font-size: 14px;
+  font-family: "Helvetica Neue", "Helvetica", sans-serif;
+  font-weight: 500;
+  letter-spacing: 0.5px;
+}
+
+.sq-input {
+  border-color: #E0E2E3;
+  border-radius: 4px;
+}
+
+.sq-input--focus {
+  border-color: #4A90E2;
+}
+
+.sq-input--error {
+  border-color: #e02e2f;
+}
+
+.sq-button {
+  background: #4A90E2;
+  border-radius: 4px;
+  font-size: 16px;
+  font-weight: 600;
+  letter-spacing: 1px;
+}
+
+.sq-button:active {
+  background: #4A90E2;
+}
+.sq-wallet-divider {
+  margin: 24px 0;
+  position: relative;
+  text-align: center;
+  width: 100%;
+}
+
+.sq-wallet-divider:after, .sq-wallet-divider::after, .sq-wallet-divider:before, .sq-wallet-divider::before {
+  background: #bbb;
+  content: '';
+  display: block;
+  height: 1px;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 9px;
+}
+
+.sq-wallet-divider:after, .sq-wallet-divider::after {
+  right: 65%;
+}
+
+.sq-wallet-divider:before, .sq-wallet-divider::before {
+  left: 65%;
+}
+
+.sq-wallet-divider__text {
+  color: #bbb;
+  padding: 10px;
+  text-transform: uppercase;
+}
+
+/* Indicates how Google Pay button will appear */
+.button-google-pay {
+  width: 100%;
+  min-height: 40px;
+  padding: 11px 24px;
+  margin-bottom: 18px;
+  background-color: #000;
+  background-image: url(data:image/svg+xml,%3Csvg%20width%3D%22103%22%20height%3D%2217%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M.148%202.976h3.766c.532%200%201.024.117%201.477.35.453.233.814.555%201.085.966.27.41.406.863.406%201.358%200%20.495-.124.924-.371%201.288s-.572.64-.973.826v.084c.504.177.912.471%201.225.882.313.41.469.891.469%201.442a2.6%202.6%200%200%201-.427%201.47c-.285.43-.667.763-1.148%201.001A3.5%203.5%200%200%201%204.082%2013H.148V2.976zm3.696%204.2c.448%200%20.81-.14%201.085-.42.275-.28.413-.602.413-.966s-.133-.684-.399-.959c-.266-.275-.614-.413-1.043-.413H1.716v2.758h2.128zm.238%204.368c.476%200%20.856-.15%201.141-.448.285-.299.427-.644.427-1.036%200-.401-.147-.749-.441-1.043-.294-.294-.688-.441-1.183-.441h-2.31v2.968h2.366zm5.379.903c-.453-.518-.679-1.239-.679-2.163V5.86h1.54v4.214c0%20.579.138%201.013.413%201.302.275.29.637.434%201.085.434.364%200%20.686-.096.966-.287.28-.191.495-.446.644-.763a2.37%202.37%200%200%200%20.224-1.022V5.86h1.54V13h-1.456v-.924h-.084c-.196.336-.5.611-.91.826-.41.215-.845.322-1.302.322-.868%200-1.528-.259-1.981-.777zm9.859.161L16.352%205.86h1.722l2.016%204.858h.056l1.96-4.858H23.8l-4.41%2010.164h-1.624l1.554-3.416zm8.266-6.748h1.666l1.442%205.11h.056l1.61-5.11h1.582l1.596%205.11h.056l1.442-5.11h1.638L36.392%2013h-1.624L33.13%207.876h-.042L31.464%2013h-1.596l-2.282-7.14zm12.379-1.337a1%201%200%200%201-.301-.735%201%201%200%200%201%20.301-.735%201%201%200%200%201%20.735-.301%201%201%200%200%201%20.735.301%201%201%200%200%201%20.301.735%201%201%200%200%201-.301.735%201%201%200%200%201-.735.301%201%201%200%200%201-.735-.301zM39.93%205.86h1.54V13h-1.54V5.86zm5.568%207.098a1.967%201.967%200%200%201-.686-.406c-.401-.401-.602-.947-.602-1.638V7.218h-1.246V5.86h1.246V3.844h1.54V5.86h1.736v1.358H45.75v3.36c0%20.383.075.653.224.812.14.187.383.28.728.28.159%200%20.299-.021.42-.063.121-.042.252-.11.392-.203v1.498c-.308.14-.681.21-1.12.21-.317%200-.616-.051-.896-.154zm3.678-9.982h1.54v2.73l-.07%201.092h.07c.205-.336.511-.614.917-.833.406-.22.842-.329%201.309-.329.868%200%201.53.254%201.988.763.457.509.686%201.202.686%202.079V13h-1.54V8.688c0-.541-.142-.947-.427-1.218-.285-.27-.656-.406-1.113-.406-.345%200-.656.098-.931.294a2.042%202.042%200%200%200-.651.777%202.297%202.297%200%200%200-.238%201.029V13h-1.54V2.976zm32.35-.341v4.083h2.518c.6%200%201.096-.202%201.488-.605.403-.402.605-.882.605-1.437%200-.544-.202-1.018-.605-1.422-.392-.413-.888-.62-1.488-.62h-2.518zm0%205.52v4.736h-1.504V1.198h3.99c1.013%200%201.873.337%202.582%201.012.72.675%201.08%201.497%201.08%202.466%200%20.991-.36%201.819-1.08%202.482-.697.665-1.559.996-2.583.996h-2.485v.001zm7.668%202.287c0%20.392.166.718.499.98.332.26.722.391%201.168.391.633%200%201.196-.234%201.692-.701.497-.469.744-1.019.744-1.65-.469-.37-1.123-.555-1.962-.555-.61%200-1.12.148-1.528.442-.409.294-.613.657-.613%201.093m1.946-5.815c1.112%200%201.989.297%202.633.89.642.594.964%201.408.964%202.442v4.932h-1.439v-1.11h-.065c-.622.914-1.45%201.372-2.486%201.372-.882%200-1.621-.262-2.215-.784-.594-.523-.891-1.176-.891-1.96%200-.828.313-1.486.94-1.976s1.463-.735%202.51-.735c.892%200%201.629.163%202.206.49v-.344c0-.522-.207-.966-.621-1.33a2.132%202.132%200%200%200-1.455-.547c-.84%200-1.504.353-1.995%201.062l-1.324-.834c.73-1.045%201.81-1.568%203.238-1.568m11.853.262l-5.02%2011.53H96.42l1.864-4.034-3.302-7.496h1.635l2.387%205.749h.032l2.322-5.75z%22%20fill%3D%22%23FFF%22%2F%3E%3Cpath%20d%3D%22M75.448%207.134c0-.473-.04-.93-.116-1.366h-6.344v2.588h3.634a3.11%203.11%200%200%201-1.344%202.042v1.68h2.169c1.27-1.17%202.001-2.9%202.001-4.944%22%20fill%3D%22%234285F4%22%2F%3E%3Cpath%20d%3D%22M68.988%2013.7c1.816%200%203.344-.595%204.459-1.621l-2.169-1.681c-.603.406-1.38.643-2.29.643-1.754%200-3.244-1.182-3.776-2.774h-2.234v1.731a6.728%206.728%200%200%200%206.01%203.703%22%20fill%3D%22%2334A853%22%2F%3E%3Cpath%20d%3D%22M65.212%208.267a4.034%204.034%200%200%201%200-2.572V3.964h-2.234a6.678%206.678%200%200%200-.717%203.017c0%201.085.26%202.11.717%203.017l2.234-1.731z%22%20fill%3D%22%23FABB05%22%2F%3E%3Cpath%20d%3D%22M68.988%202.921c.992%200%201.88.34%202.58%201.008v.001l1.92-1.918c-1.165-1.084-2.685-1.75-4.5-1.75a6.728%206.728%200%200%200-6.01%203.702l2.234%201.731c.532-1.592%202.022-2.774%203.776-2.774%22%20fill%3D%22%23E94235%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);
+  background-origin: content-box;
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: contain;
+  border: 0;
+  border-radius: 4px;
+  box-shadow: 0 1px 1px 0 rgba(60, 64, 67, 0.30), 0 1px 3px 1px rgba(60, 64, 67, 0.15);
+  outline: 0;
+  cursor: pointer;
+  display: none;
+}
+
+
+.sq-apple-pay {
+  -webkit-appearance: -apple-pay-button;
+  border: none;
+  height: 48px;
+  margin-bottom: 12px;
+  width: 100%;
+  display: none;
+}
+.sq-masterpass {
+  background-color: #000;
+  background-image: url(https://masterpass.com/dyn/img/btn/global/mp_chk_btn_384x048px.svg);
+  background-repeat: no-repeat;
+  background-size: contain;
+  background-position: center right;
+  border-radius: 5px;
+  height: 42px;
+  margin-bottom: 16px;
+  width: 100%;
+  display: none;
+}
+
+.sq-button:hover {
+  cursor: pointer;
+  background-color: #4281CB;
+}
+
+#error {
+  width: 100%;
+  margin-top: 16px;
+  font-size: 14px;
+  color: red;
+  font-weight: 500;
+  text-align: center;
+  opacity: 0.8;
+}
index 9f53a5e..12cd96a 100644 (file)
--- a/index.php
+++ b/index.php
@@ -38,7 +38,7 @@
  *  version from this plugin.
  */
 define('GLM_MEMBERS_BILLING_PLUGIN_VERSION', '1.0.25');
-define('GLM_MEMBERS_BILLING_PLUGIN_DB_VERSION', '0.0.35');
+define('GLM_MEMBERS_BILLING_PLUGIN_DB_VERSION', '0.0.36');
 
 // This is the minimum version of the GLM Members DB plugin require for this plugin.
 define('GLM_MEMBERS_BILLING_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.8.0');
diff --git a/js/sq-payment-form.js b/js/sq-payment-form.js
new file mode 100644 (file)
index 0000000..9ce7773
--- /dev/null
@@ -0,0 +1,225 @@
+/**
+ * Define callback function for "sq-button"
+ * @param {*} event
+ */
+function onGetCardNonce(event) {
+
+  // Don't submit the form until SqPaymentForm returns with a nonce
+  event.preventDefault();
+
+  // Request a nonce from the SqPaymentForm object
+  paymentForm.requestCardNonce();
+}
+
+// Initializes the SqPaymentForm object by
+// initializing various configuration fields and providing implementation for callback functions.
+var paymentForm = new SqPaymentForm({
+  // Initialize the payment form elements
+  applicationId: applicationId,
+  locationId: locationId,
+  inputClass: 'sq-input',
+
+  // Customize the CSS for SqPaymentForm iframe elements
+  inputStyles: [{
+    backgroundColor: 'transparent',
+    color: '#333333',
+    fontFamily: '"Helvetica Neue", "Helvetica", sans-serif',
+    fontSize: '16px',
+    fontWeight: '400',
+    placeholderColor: '#8594A7',
+    placeholderFontWeight: '400',
+    padding: '16px',
+    _webkitFontSmoothing: 'antialiased',
+    _mozOsxFontSmoothing: 'grayscale'
+  }],
+
+  // Initialize Google Pay button ID
+  googlePay: {
+    elementId: 'sq-google-pay'
+  },
+
+  // Initialize Apple Pay placeholder ID
+  applePay: {
+    elementId: 'sq-apple-pay'
+  },
+
+  // Initialize Masterpass placeholder ID
+  masterpass: {
+    elementId: 'sq-masterpass'
+  },
+
+  // Initialize the credit card placeholders
+  cardNumber: {
+    elementId: 'sq-card-number',
+    placeholder: '•••• â€¢â€¢â€¢â€¢ â€¢â€¢â€¢â€¢ â€¢â€¢â€¢â€¢'
+  },
+  cvv: {
+    elementId: 'sq-cvv',
+    placeholder: 'CVV'
+  },
+  expirationDate: {
+    elementId: 'sq-expiration-date',
+    placeholder: 'MM/YY'
+  },
+  postalCode: {
+    elementId: 'sq-postal-code'
+  },
+
+  // SqPaymentForm callback functions
+  callbacks: {
+
+    /*
+     * callback function: methodsSupported
+     * Triggered when: the page is loaded.
+     */
+    methodsSupported: function (methods) {
+      if (!methods.masterpass && !methods.applePay && !methods.googlePay) {
+        var walletBox = document.getElementById('sq-walletbox');
+        walletBox.style.display = 'none';
+      } else {
+        var walletBox = document.getElementById('sq-walletbox');
+        walletBox.style.display = 'block';
+      }
+
+      // Only show the button if Google Pay is enabled
+      if (methods.googlePay === true) {
+        var googlePayBtn = document.getElementById('sq-google-pay');
+        googlePayBtn.style.display = 'inline-block';
+      }
+
+      // Only show the button if Apple Pay for Web is enabled
+      if (methods.applePay === true) {
+        var applePayBtn = document.getElementById('sq-apple-pay');
+        applePayBtn.style.display = 'inline-block';
+      }
+
+      // Only show the button if Masterpass is enabled
+      if (methods.masterpass === true) {
+        var masterpassBtn = document.getElementById('sq-masterpass');
+        masterpassBtn.style.display = 'inline-block';
+      }
+    },
+
+    /*
+     * callback function: createPaymentRequest
+     * Triggered when: a digital wallet payment button is clicked.
+     */
+    createPaymentRequest: function () {
+
+      var paymentRequestJson = {
+        requestShippingAddress: false,
+        requestBillingInfo: true,
+        shippingContact: {
+          familyName: "CUSTOMER LAST NAME",
+          givenName: "CUSTOMER FIRST NAME",
+          email: "mycustomer@example.com",
+          country: "USA",
+          region: "CA",
+          city: "San Francisco",
+          addressLines: [
+            "1455 Market St #600"
+          ],
+          postalCode: "94103",
+          phone:"14255551212"
+        },
+        currencyCode: "USD",
+        countryCode: "US",
+        total: {
+          label: "MERCHANT NAME",
+          amount: "1.00",
+          pending: false
+        },
+        lineItems: [
+          {
+            label: "Subtotal",
+            amount: "1.00",
+            pending: false
+          }
+        ]
+      };
+
+      return paymentRequestJson;
+    },
+
+    /*
+     * callback function: validateShippingContact
+     * Triggered when: a shipping address is selected/changed in a digital
+     *                 wallet UI that supports address selection.
+     */
+    validateShippingContact: function (contact) {
+
+      var validationErrorObj ;
+      /* ADD CODE TO SET validationErrorObj IF ERRORS ARE FOUND */
+      return validationErrorObj ;
+    },
+
+    /*
+     * callback function: cardNonceResponseReceived
+     * Triggered when: SqPaymentForm completes a card nonce request
+     */
+    cardNonceResponseReceived: function(errors, nonce, cardData, billingContact, shippingContact) {
+      if (errors){
+        var error_html = "";
+        for (var i =0; i < errors.length; i++){
+          error_html += "<li> " + errors[i].message + " </li>";
+        }
+        document.getElementById("error").innerHTML = error_html;
+        document.getElementById('sq-creditcard').disabled = false;
+
+        return;
+      }else{
+        document.getElementById("error").innerHTML = "";
+      }
+
+      // Assign the nonce value to the hidden form field
+      document.getElementById('card-nonce').value = nonce;
+
+      // POST the nonce form to the payment processing page
+      document.getElementById('nonce-form').submit();
+
+    },
+
+    /*
+     * callback function: unsupportedBrowserDetected
+     * Triggered when: the page loads and an unsupported browser is detected
+     */
+    unsupportedBrowserDetected: function() {
+      /* PROVIDE FEEDBACK TO SITE VISITORS */
+    },
+
+    /*
+     * callback function: inputEventReceived
+     * Triggered when: visitors interact with SqPaymentForm iframe elements.
+     */
+    inputEventReceived: function(inputEvent) {
+      switch (inputEvent.eventType) {
+        case 'focusClassAdded':
+          /* HANDLE AS DESIRED */
+          break;
+        case 'focusClassRemoved':
+          /* HANDLE AS DESIRED */
+          break;
+        case 'errorClassAdded':
+          /* HANDLE AS DESIRED */
+          break;
+        case 'errorClassRemoved':
+          /* HANDLE AS DESIRED */
+          break;
+        case 'cardBrandChanged':
+          /* HANDLE AS DESIRED */
+          break;
+        case 'postalCodeChanged':
+          /* HANDLE AS DESIRED */
+          break;
+      }
+    },
+
+    /*
+     * callback function: paymentFormLoaded
+     * Triggered when: SqPaymentForm is fully loaded
+     */
+    paymentFormLoaded: function() {
+      /* HANDLE AS DESIRED */
+    }
+  }
+});
index 12164f7..7066bd4 100644 (file)
@@ -118,6 +118,7 @@ class GlmMembersAdmin_management_billing extends GlmDataBillingManagement
         $totalImports        = false;
         $numberProcessed     = false;
 
+        // echo '<pre>Config: ' . print_r( $this->config, true ) . '</pre>';
         // General settings are always stored in a record with ID=1.
         $id = 1;
 
index ede1f51..cfd8548 100644 (file)
@@ -157,6 +157,7 @@ class GlmMembersFront_billing_paymentForm // extends GlmDataBilling
 
         switch ( $option ) {
         case 'payment':
+
             // TODO: only the renew form if the member is not active
             if ( $account_status == 'Active' ) {
                 $view = 'nonrenew';
@@ -197,9 +198,9 @@ class GlmMembersFront_billing_paymentForm // extends GlmDataBilling
             }
             // Pull member invoice
             $memberInvoice = $BillingSupport->getInvoiceById( $invoiceId );
-            echo '<pre>$memberInvoice: ' . print_r( $memberInvoice, true ) . '</pre>';
+            // echo '<pre>$memberInvoice: ' . print_r( $memberInvoice, true ) . '</pre>';
             $memberInvoiceLineItems = $BillingSupport->getLineItemsForInvoice( $invoiceId );
-            echo '<pre>$memberInvoiceLineItems: ' . print_r( $memberInvoiceLineItems, true ) . '</pre>';
+            // echo '<pre>$memberInvoiceLineItems: ' . print_r( $memberInvoiceLineItems, true ) . '</pre>';
             if ( isset( $memberInvoiceLineItems ) && is_array( $memberInvoiceLineItems ) && !empty( $memberInvoiceLineItems ) ) {
                 foreach ( $memberInvoiceLineItems as $lineItem ) {
                     if ( $lineItem['recurring'] ) {
@@ -233,11 +234,14 @@ class GlmMembersFront_billing_paymentForm // extends GlmDataBilling
 
             // Look at the payment option given
             $payment_option = filter_var( $_REQUEST['payment_option'], FILTER_SANITIZE_STRING );
+            echo '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
+            echo '<pre>$payment_option: ' . print_r( $payment_option, true ) . '</pre>';
 
             switch ( $payment_option ) {
             case 'pay_by_credit_card':
                 // Do the Payment Processing.
                 $processErrors = $BillingSupport->processOnlinePayment( $accountId, $invoiceId, $_REQUEST['total_renew_amount'] );
+                // echo '<pre>$processErrors: ' . print_r( $processErrors, true ) . '</pre>';
 
                 if ( $processErrors ) {
                     if ( isset( $processErrors ) && is_array( $processErrors ) && count( $processErrors ) > 0 ) {
@@ -280,48 +284,48 @@ class GlmMembersFront_billing_paymentForm // extends GlmDataBilling
             }
 
             // If there's no error reported then show the invoice
-            if ( !$error ) {
-                $this->wpdb->query( 'COMMIT' );
-                // Now need to show the invoice.
-                $view = 'viewInvoice';
-
-                // Get the invoice.
-                $invoiceHtml = $BillingSupport->viewInvoice( $invoiceId );
-
-                // If the member_type is changing then update member
-                // Get current member type
-                $member_id = filter_var( $_REQUEST['member'], FILTER_VALIDATE_INT );
-                if ( $member_id ) {
-                    $current_member_type = $this->wpdb->get_var(
-                        $this->wpdb->prepare(
-                            "SELECT member_type
-                               FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members
-                              WHERE id = %d",
-                            $member_id
-                        )
-                    );
-                    $new_type = filter_var( $_REQUEST['member_renewing'], FILTER_VALIDATE_INT );
-                    $new_member_type = $this->wpdb->get_var(
-                        $this->wpdb->prepare(
-                            "SELECT member_type
-                               FROM " . GLM_MEMBERS_BILLING_PLUGIN_DB_PREFIX . "invoice_types
-                              WHERE id = %d",
-                            $new_type
-                        )
-                    );
-                    if ( $current_member_type != $new_member_type ) {
-                        $this->wpdb->update(
-                            GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members',
-                            array( 'member_type' => $new_member_type ),
-                            array( 'id' => $member_id ),
-                            array( '%d' ),
-                            array( '%d' )
-                        );
-                    }
-                }
-            } else {
-                $this->wpdb->query( 'ROLLBACK' );
-            }
+            // if ( !$error ) {
+            //     $this->wpdb->query( 'COMMIT' );
+            //     // Now need to show the invoice.
+            //     $view = 'viewInvoice';
+            //
+            //     // Get the invoice.
+            //     $invoiceHtml = $BillingSupport->viewInvoice( $invoiceId );
+            //
+            //     // If the member_type is changing then update member
+            //     // Get current member type
+            //     $member_id = filter_var( $_REQUEST['member'], FILTER_VALIDATE_INT );
+            //     if ( $member_id ) {
+            //         $current_member_type = $this->wpdb->get_var(
+            //             $this->wpdb->prepare(
+            //                 "SELECT member_type
+            //                    FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "members
+            //                   WHERE id = %d",
+            //                 $member_id
+            //             )
+            //         );
+            //         $new_type = filter_var( $_REQUEST['member_renewing'], FILTER_VALIDATE_INT );
+            //         $new_member_type = $this->wpdb->get_var(
+            //             $this->wpdb->prepare(
+            //                 "SELECT member_type
+            //                    FROM " . GLM_MEMBERS_BILLING_PLUGIN_DB_PREFIX . "invoice_types
+            //                   WHERE id = %d",
+            //                 $new_type
+            //             )
+            //         );
+            //         if ( $current_member_type != $new_member_type ) {
+            //             $this->wpdb->update(
+            //                 GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members',
+            //                 array( 'member_type' => $new_member_type ),
+            //                 array( 'id' => $member_id ),
+            //                 array( '%d' ),
+            //                 array( '%d' )
+            //             );
+            //         }
+            //     }
+            // } else {
+            //     $this->wpdb->query( 'ROLLBACK' );
+            // }
 
             break;
 
@@ -370,6 +374,8 @@ class GlmMembersFront_billing_paymentForm // extends GlmDataBilling
             'payable_types'      => $payable_types,
             'account_status'     => $account_status,
             'lockedToMember'     => $lockedToMember,
+            'pluginJsUrl'        => GLM_MEMBERS_BILLING_PLUGIN_URL . '/js',
+            'pluginCssUrl'       => GLM_MEMBERS_BILLING_PLUGIN_URL . '/css',
         );
 
         // Return status, any suggested view, and any data to controller.
diff --git a/setup/databaseScripts/create_database_V0.0.32.sql b/setup/databaseScripts/create_database_V0.0.32.sql
deleted file mode 100644 (file)
index 2012bb6..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
--- Gaslight Media Billing Module
--- File Created: 11/19/2018
--- Database Version: 0.0.27
--- Database Creation Script
---
--- To permit each query below to be executed separately,
--- all queries must be separated by a line with four dashes
---
--- **** BE SURE TO ALSO UPDATE drop_database_Vxxx.sql FILE WHEN CHANGING TABLES ****
---
-
--- Billing Accounts
-CREATE TABLE {prefix}accounts (
-    id INT NOT NULL AUTO_INCREMENT,
-    archived BOOLEAN DEFAULT '0',                          -- Marks account as archived
-    ref_dest INT NOT NULL,                                 -- reference to member id
-    ref_name TINYTEXT NOT NULL,                            -- Name of reference member
-    invoice_type INT NOT NULL DEFAULT '0',                 -- Ref to Invoice Type id
-    billing_contact_name TINYTEXT NULL,                    -- Billing Contact Name
-    billing_fname TINYTEXT NULL,                           -- Billing First Name
-    billing_lname TINYTEXT NULL,                           -- Billing Last Name
-    billing_company TINYTEXT NULL,                         -- Billing Company Name
-    billing_position TINYTEXT NULL,                        -- Billing Title/Position
-    billing_addr1 TINYTEXT NULL,                           -- Billing Address 1
-    billing_addr2 TINYTEXT NULL,                           -- Billing Address 2
-    billing_city TINYTEXT NULL,                            -- Billing City
-    billing_county INT NULL,                               -- Billing County
-    billing_state TINYTEXT NULL,                           -- Billing State
-    billing_zip TINYTEXT NULL,                             -- Billing Zip
-    billing_country TINYTEXT NULL,                         -- Billing Country
-    billing_phone TINYTEXT NULL,                           -- Billing Phone
-    billing_fax TINYTEXT NULL,                             -- Billing Fax
-    anniversary_date DATE NULL,                            -- anniversary date
-    renewal_date DATE NULL,                                -- renewal date of account
-    payment_data TEXT NULL,                                -- stored payment data
-    customer_profile_id TINYTEXT NULL,                     -- Customer Profile Id (Authorize.net)
-    payment_profile_id TINYTEXT NULL,                      -- Payment Profile Id (Authorize.net)
-    payment_profile_card TINYTEXT NULL,                    -- Payment Profile Card (Authorize.net)
-    email TINYTEXT NULL,                                   -- billing email
-    boss BOOLEAN DEFAULT '0',                              -- Boss flag
-    account_number TINYTEXT NULL,                          -- Account Number
-    email_invoice BOOLEAN DEFAULT '0',                     -- Invoice by email
-    usmail_invoice BOOLEAN DEFAULT '0',                    -- Invoice by US Mail
-    fax_invoice BOOLEAN DEFAULT '0',                       -- Invoice by Fax
-    PRIMARY KEY (id),
-    INDEX(ref_dest),
-    INDEX(ref_name(20)),
-    INDEX(email(20)),
-    INDEX(invoice_type),
-    INDEX(renewal_date),
-    INDEX(billing_county)
-);
-
-----
-
--- transactions
-CREATE TABLE {prefix}transactions (
-    id INT NOT NULL AUTO_INCREMENT,
-    type INT NOT NULL,                                     -- type of transaction (payment,invoice,etc)
-    type_id INT NOT NULL,                                  -- reference to type id
-    account INT NOT NULL,                                  -- reference to account id
-    transaction_time DATETIME NOT NULL,                    -- datetime for the transaction
-    current_invoice_total DECIMAL(8, 2) NOT NULL,          -- invoice total
-    current_payment_total DECIMAL(8, 2) NOT NULL,          -- payment total
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(type_id),
-    INDEX(transaction_time)
-);
-
-----
-
--- Invoices
-CREATE TABLE {prefix}invoices (
-    id INT NOT NULL AUTO_INCREMENT,
-    old_invoice_id INT NULL,                               -- old invoice id from uptra
-    transaction_time DATETIME NOT NULL,                    -- datetime for the invoice
-    account INT NOT NULL,                                  -- ref to account id
-    amount_total DECIMAL(8, 2) NOT NULL,                   -- total amount for invoice
-    balance DECIMAL(8, 2) NOT NULL,                        -- balance for this invoice
-    due_date DATE NOT NULL,                                -- Due date for this invoice
-    paid BOOLEAN DEFAULT '0',                              -- true/false if invoice is paid
-    notes TINYTEXT,                                        -- notes for this invoice
-    renewal BOOLEAN DEFAULT '0',                           -- true/false if a renewal
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(transaction_time),
-    INDEX(due_date)
-);
-
-----
-
--- Line Item Types
-CREATE TABLE {prefix}invoice_types (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TINYTEXT NOT NULL,                                -- name
-    parent INT NOT NULL DEFAULT 0,                         -- 0 if top level otherwise ref to another line_item_type as it's parent
-    member_type INT NOT NULL DEFAULT 0,                    -- Member Type assigned Default 0
-    amount DECIMAL(8,2) NOT NULL DEFAULT '0.00',           -- amount
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    dynamic_amount BOOLEAN DEFAULT '0',                    -- true/false if amount is dynamic
-    qcode TINYTEXT NULL,                                   -- qcode for quickbooks
-    category TINYTEXT NULL,                                -- quickbooks category
-    PRIMARY KEY (id)
-);
-
-----
-
--- Line Items
-CREATE TABLE {prefix}line_items (
-    id INT NOT NULL AUTO_INCREMENT,
-    invoice INT NOT NULL,                                  -- reference to invoice
-    line_item_type INT NOT NULL,                           -- reference to line item type
-    account INT NULL DEFAULT 0,                            -- ref to account id (renewal or employee)
-    name TEXT NOT NULL,                                    -- line item name
-    amount DECIMAL(8,2) DEFAULT '0.00',                    -- line item amount per item
-    quantity INT DEFAULT 1,                                -- quantity
-    total DECIMAL(8,2) DEFAULT '0.00',                     -- line item total
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    created DATE NULL,                                     -- Date this line item was first created
-    first_due_date DATE NULL,                              -- The first due date for this item
-    next_due_date DATE NULL,                               -- Next Due Date for this item
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(created),
-    INDEX(first_due_date),
-    INDEX(next_due_date)
-);
-
-----
-
--- payments
-CREATE TABLE {prefix}payments (
-    id INT NOT NULL AUTO_INCREMENT,
-    transaction_time DATETIME NOT NULL,                    -- datetime of payment
-    account INT NOT NULL,                                  -- ref to account table
-    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
-    payment_method TINYTEXT NOT NULL,                      -- payment method
-    payment_data TINYTEXT NULL,                            -- additional payment info
-    notes TEXT NULL,                                       -- Notes/Comments on the payment
-    PRIMARY KEY (id)
-);
-
-----
-
--- pdfs
-CREATE TABLE {prefix}pdfs (
-    id INT NOT NULL AUTO_INCREMENT,
-    ref_type INT NOT NULL,                                 -- reference type
-    ref_dest INT NOT NULL,                                 -- reference types id
-    pdf MEDIUMTEXT NOT NULL,                               -- saved pdf
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notification Types
-CREATE TABLE {prefix}notification_types (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TINYTEXT NOT NULL,                                -- name
-    to_email TINYTEXT NULL,                                -- To email
-    from_header TINYTEXT NOT NULL,                         -- from headers
-    replyto TINYTEXT NULL,                                 -- reply-to headers
-    subject TINYTEXT NOT NULL,                             -- Subject
-    message TEXT NOT NULL,                                 -- Message
-    send_by_date BOOLEAN NULL DEFAULT '0',                 -- true/false send by date based on due date
-    send_by_action BOOLEAN NULL DEFAULT '0',               -- send notice based on an action
-    send_action INT NULL DEFAULT 0,                        -- (create invoice or receive payment)
-    send_date_number INT NULL DEFAULT 0,                   -- number to apply to send by date
-    send_date_period INT NULL DEFAULT 0,                   -- (days,weeks,months,years)
-    send_date_when INT NULL DEFAULT 0,                     -- (before or after)
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notifications
-CREATE TABLE {prefix}notifications (
-    id INT NOT NULL AUTO_INCREMENT,
-    notification_type INT NOT NULL,                        -- ref to notification type
-    account INT NOT NULL,                                  -- ref to account
-    from_replyto TINYTEXT NOT NULL,                        -- from reply-to header
-    subject TEXT NOT NULL,                                 -- subject
-    message TEXT NOT NULL,                                 -- message
-    date_sent DATETIME NOT NULL,                           -- Date the notice was sent
-    email_sent TINYTEXT NOT NULL,                          -- email used
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notification Queue
-CREATE TABLE {prefix}notification_queue (
-    id INT NOT NULL AUTO_INCREMENT,
-    notification_type INT NOT NULL,                        -- ref to notification type
-    account INT NOT NULL,                                  -- ref to account
-    queued_time DATETIME NOT NULL,                         -- Creation time
-    processed_time DATETIME NULL,                          -- The time this queue was processed. (sent out)
-    PRIMARY KEY (id),
-    INDEX (notification_type),
-    INDEX (account),
-    INDEX (queued_time),
-    INDEX (processed_time)
-);
-
-----
-
--- Gateway Settings
-CREATE TABLE {prefix}gateway_settings (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TEXT NOT NULL,
-    login_id TINYTEXT NOT NULL,
-    transaction_key TINYTEXT NOT NULL,
-    PRIMARY KEY (id)
-);
-
-----
-
--- Invoice Payments
-CREATE TABLE {prefix}invoice_payments (
-    id INT NOT NULL AUTO_INCREMENT,
-    invoice INT NOT NULL,                                  -- reference to invoice id
-    payment INT NOT NULL,                                  -- reference to payment id
-    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
-    PRIMARY KEY (id),
-    INDEX(invoice)
-);
-
-----
-
--- Settings
-CREATE TABLE {prefix}settings (
-    id INT NOT NULL AUTO_INCREMENT,
-    company_logo TINYTEXT NULL,                            -- Image logo
-    company_logo_height INT NULL,                          -- Logo Height (only used if creating pdf)
-    company_name TINYTEXT NULL,                            -- Company Name
-    company_name2 TINYTEXT NULL,                           -- Company Name 2
-    company_addr1 TINYTEXT NULL,                           -- Company Address 1
-    company_addr2 TINYTEXT NULL,                           -- Company Address 2
-    company_city TINYTEXT NULL,                            -- Company City
-    company_state TINYTEXT NULL,                           -- Company State
-    company_zip TINYTEXT NULL,                             -- Company Zip
-    company_phone TINYTEXT NULL,                           -- Company Phone
-    company_email TINYTEXT NULL,                           -- Company Email
-    company_url TINYTEXT NULL,                             -- Company URL
-    payment_terms TEXT NULL,                               -- Payment Terms
-    days_before_renewal INT NULL,                          -- Number of days before renewal date to allow renewals
-    days_after_expired INT NULL,                           -- Number of days after renewal date expired
-    allow_membership_choice BOOLEAN DEFAULT '0',           -- If memberships can choose their membership levels when they renew
-    allow_employees BOOLEAN DEFAULT '0',                   -- If memberships have employees
-    member_types_enabled BOOLEAN DEFAULT '1',              -- member types determine invoice types
-    quickbooks_enabled BOOLEAN DEFAULT '0',                -- QuickBooks enabled
-    member_billing_enabled BOOLEAN DEFAULT '1',            -- Member have access to billing info tab
-    billing_fields_required BOOLEAN DEFAULT '1',           -- Require Billing Fields
-    invoice_methods_enabled BOOLEAN DEFAULT '0',           -- Enable Uptra invoice methods
-    renewal_day_static BOOLEAN DEFAULT '0',                -- Renewal dates are same day every year
-    renewal_day INT NULL,                                  -- Day of the month for renewals
-    renewal_month INT NULL,                                -- Month of year for renewals
-    billing_county_enabled BOOLEAN DEFAULT '0',            -- Billing uses county field
-    invoice_pdf_enabled BOOLEAN DEFAULT '0',               -- Create PDF invoices
-    billing_contact_name_enabled BOOLEAN DEFAULT '0',      -- Use billing_contact_name instead of fname lname
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Settings entry
-INSERT INTO {prefix}settings
-    ( id, days_before_renewal ,days_after_expired, member_types_enabled, quickbooks_enabled, member_billing_enabled )
-    VALUES
-    ( 1, 90, 30, true, false, true );
-
-----
-
--- Management
-CREATE TABLE {prefix}management (
-    id INT NOT NULL AUTO_INCREMENT,
-    payment_methods SMALLINT NULL,                              -- Payment methods available for all registrations - Bitmap - see payment_method in plugin.ini
-    proc_methods SMALLINT NULL,                                 -- Credit Cart payment processing methods available - Bitmap - see proc_method in plugin.ini
-    cc_accepts SMALLINT NULL,                                   -- Credit Cards Accepted - Bitmap - See credit_card in plugin.ini
-    -- Authorize.net Credentials
-    authorize_net_login TINYTEXT NULL,
-    authorize_net_key TINYTEXT NULL,
-    authorize_net_test TINYINT NULL,                            -- Authorize.net test mode - List - see proc_test_mode in plugin.ini
-    authorize_net_conf BOOLEAN NULL,                            -- Flag to send payment confirmation Email from Authorize.net
-    authorize_net_merchant_email TINYTEXT NULL,                 -- E-Mail Authorize.net will send copy of confirmation E-Mail
-    -- Merchant Solutions Credentials
-    merchant_solutions_acctid TINYTEXT NULL,                    -- Merchant Solutions credentials
-    merchant_solutions_merchantpin TINYTEXT NULL,
-    merchant_solutions_test TINYINT NULL,                       -- Merchant Solutions test mode - List - see proc_test_mode in plugin.ini
-    merchant_solutions_conf BOOLEAN NULL,                       -- Flag to send payment confirmation Email
-    merchant_solutions_merchant_email TINYTEXT NULL,            -- Merchant Solutions will send copy of confirmation E-Mail
-    uptravel_invoice_template BOOLEAN DEFAULT '0',              -- Use uptravel template for invoices.
-    uptravel_payment_form BOOLEAN DEFAULT '0',                  -- Use uptravel payment form style.
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Management entry
-INSERT INTO {prefix}management
-    ( id )
-    VALUES
-    ( 1 );
-
-----
-
--- Employees table
-CREATE TABLE {prefix}employees (
-    id INT NOT NULL AUTO_INCREMENT,
-    account INT NOT NULL,                                      -- Account Id
-    employee INT NOT NULL,                                     -- Employee Account Id
-    PRIMARY KEY (id)
-);
diff --git a/setup/databaseScripts/create_database_V0.0.35.sql b/setup/databaseScripts/create_database_V0.0.35.sql
deleted file mode 100644 (file)
index 2e3c361..0000000
+++ /dev/null
@@ -1,375 +0,0 @@
--- Gaslight Media Billing Module
--- File Created: 02/19/2019
--- Database Version: 0.0.33
--- Database Creation Script
---
--- To permit each query below to be executed separately,
--- all queries must be separated by a line with four dashes
---
--- **** BE SURE TO ALSO UPDATE drop_database_Vxxx.sql FILE WHEN CHANGING TABLES ****
---
-
--- Billing Accounts
-CREATE TABLE {prefix}accounts (
-    id INT NOT NULL AUTO_INCREMENT,
-    archived BOOLEAN DEFAULT '0',                          -- Marks account as archived
-    ref_dest INT NOT NULL,                                 -- reference to member id
-    ref_name TINYTEXT NOT NULL,                            -- Name of reference member
-    invoice_type INT NOT NULL DEFAULT '0',                 -- Ref to Invoice Type id
-    billing_contact_name TINYTEXT NULL,                    -- Billing Contact Name
-    billing_fname TINYTEXT NULL,                           -- Billing First Name
-    billing_lname TINYTEXT NULL,                           -- Billing Last Name
-    billing_company TINYTEXT NULL,                         -- Billing Company Name
-    billing_position TINYTEXT NULL,                        -- Billing Title/Position
-    billing_addr1 TINYTEXT NULL,                           -- Billing Address 1
-    billing_addr2 TINYTEXT NULL,                           -- Billing Address 2
-    billing_city TINYTEXT NULL,                            -- Billing City
-    billing_county INT NULL,                               -- Billing County
-    billing_state TINYTEXT NULL,                           -- Billing State
-    billing_zip TINYTEXT NULL,                             -- Billing Zip
-    billing_country TINYTEXT NULL,                         -- Billing Country
-    billing_phone TINYTEXT NULL,                           -- Billing Phone
-    billing_fax TINYTEXT NULL,                             -- Billing Fax
-    anniversary_date DATE NULL,                            -- anniversary date
-    renewal_date DATE NULL,                                -- renewal date of account
-    payment_data TEXT NULL,                                -- stored payment data
-    customer_profile_id TINYTEXT NULL,                     -- Customer Profile Id (Authorize.net)
-    payment_profile_id TINYTEXT NULL,                      -- Payment Profile Id (Authorize.net)
-    payment_profile_card TINYTEXT NULL,                    -- Payment Profile Card (Authorize.net)
-    email TINYTEXT NULL,                                   -- billing email
-    boss BOOLEAN DEFAULT '0',                              -- Boss flag
-    account_number TINYTEXT NULL,                          -- Account Number
-    email_invoice BOOLEAN DEFAULT '0',                     -- Invoice by email
-    usmail_invoice BOOLEAN DEFAULT '0',                    -- Invoice by US Mail
-    fax_invoice BOOLEAN DEFAULT '0',                       -- Invoice by Fax
-    PRIMARY KEY (id),
-    INDEX(ref_dest),
-    INDEX(ref_name(20)),
-    INDEX(email(20)),
-    INDEX(invoice_type),
-    INDEX(renewal_date),
-    INDEX(billing_county)
-);
-
-----
-
--- transactions
-CREATE TABLE {prefix}transactions (
-    id INT NOT NULL AUTO_INCREMENT,
-    type INT NOT NULL,                                     -- type of transaction (payment,invoice,etc)
-    type_id INT NOT NULL,                                  -- reference to type id
-    account INT NOT NULL,                                  -- reference to account id
-    transaction_time DATETIME NOT NULL,                    -- datetime for the transaction
-    current_invoice_total DECIMAL(8, 2) NOT NULL,          -- invoice total
-    current_payment_total DECIMAL(8, 2) NOT NULL,          -- payment total
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(type_id),
-    INDEX(transaction_time)
-);
-
-----
-
--- Invoices
-CREATE TABLE {prefix}invoices (
-    id INT NOT NULL AUTO_INCREMENT,
-    old_invoice_id INT NULL,                               -- old invoice id from uptra
-    transaction_time DATETIME NOT NULL,                    -- datetime for the invoice
-    account INT NOT NULL,                                  -- ref to account id
-    amount_total DECIMAL(8, 2) NOT NULL,                   -- total amount for invoice
-    balance DECIMAL(8, 2) NOT NULL,                        -- balance for this invoice
-    due_date DATE NOT NULL,                                -- Due date for this invoice
-    paid BOOLEAN DEFAULT '0',                              -- true/false if invoice is paid
-    notes TINYTEXT,                                        -- notes for this invoice
-    renewal BOOLEAN DEFAULT '0',                           -- true/false if a renewal
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(transaction_time),
-    INDEX(due_date)
-);
-
-----
-
--- Line Item Types
-CREATE TABLE {prefix}invoice_types (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TINYTEXT NOT NULL,                                -- name
-    parent INT NOT NULL DEFAULT 0,                         -- 0 if top level otherwise ref to another line_item_type as it's parent
-    member_type INT NOT NULL DEFAULT 0,                    -- Member Type assigned Default 0
-    amount DECIMAL(8,2) NOT NULL DEFAULT '0.00',           -- amount
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    dynamic_amount BOOLEAN DEFAULT '0',                    -- true/false if amount is dynamic
-    qcode TINYTEXT NULL,                                   -- qcode for quickbooks
-    category TINYTEXT NULL,                                -- quickbooks category
-    PRIMARY KEY (id)
-);
-
-----
-
--- Line Items
-CREATE TABLE {prefix}line_items (
-    id INT NOT NULL AUTO_INCREMENT,
-    invoice INT NOT NULL,                                  -- reference to invoice
-    line_item_type INT NOT NULL,                           -- reference to line item type
-    account INT NULL DEFAULT 0,                            -- ref to account id (renewal or employee)
-    name TEXT NOT NULL,                                    -- line item name
-    amount DECIMAL(8,2) DEFAULT '0.00',                    -- line item amount per item
-    quantity INT DEFAULT 1,                                -- quantity
-    total DECIMAL(8,2) DEFAULT '0.00',                     -- line item total
-    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
-    recurrence INT NULL DEFAULT 0,                         -- recurrence type
-    created DATE NULL,                                     -- Date this line item was first created
-    first_due_date DATE NULL,                              -- The first due date for this item
-    next_due_date DATE NULL,                               -- Next Due Date for this item
-    PRIMARY KEY (id),
-    INDEX(account),
-    INDEX(created),
-    INDEX(first_due_date),
-    INDEX(next_due_date)
-);
-
-----
-
--- payments
-CREATE TABLE {prefix}payments (
-    id INT NOT NULL AUTO_INCREMENT,
-    transaction_time DATETIME NOT NULL,                    -- datetime of payment
-    account INT NOT NULL,                                  -- ref to account table
-    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
-    payment_method TINYTEXT NOT NULL,                      -- payment method
-    payment_data TINYTEXT NULL,                            -- additional payment info
-    notes TEXT NULL,                                       -- Notes/Comments on the payment
-    PRIMARY KEY (id)
-);
-
-----
-
--- pdfs
-CREATE TABLE {prefix}pdfs (
-    id INT NOT NULL AUTO_INCREMENT,
-    ref_type INT NOT NULL,                                 -- reference type
-    ref_dest INT NOT NULL,                                 -- reference types id
-    pdf MEDIUMTEXT NOT NULL,                               -- saved pdf
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notification Types
-CREATE TABLE {prefix}notification_types (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TINYTEXT NOT NULL,                                -- name
-    to_email TINYTEXT NULL,                                -- To email
-    from_header TINYTEXT NOT NULL,                         -- from headers
-    replyto TINYTEXT NULL,                                 -- reply-to headers
-    subject TINYTEXT NOT NULL,                             -- Subject
-    message TEXT NOT NULL,                                 -- Message
-    send_by_date BOOLEAN NULL DEFAULT '0',                 -- true/false send by date based on due date
-    send_by_action BOOLEAN NULL DEFAULT '0',               -- send notice based on an action
-    send_action INT NULL DEFAULT 0,                        -- (create invoice or receive payment)
-    send_date_number INT NULL DEFAULT 0,                   -- number to apply to send by date
-    send_date_period INT NULL DEFAULT 0,                   -- (days,weeks,months,years)
-    send_date_when INT NULL DEFAULT 0,                     -- (before or after)
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notifications
-CREATE TABLE {prefix}notifications (
-    id INT NOT NULL AUTO_INCREMENT,
-    notification_type INT NOT NULL,                        -- ref to notification type
-    account INT NOT NULL,                                  -- ref to account
-    from_replyto TINYTEXT NOT NULL,                        -- from reply-to header
-    subject TEXT NOT NULL,                                 -- subject
-    message TEXT NOT NULL,                                 -- message
-    date_sent DATETIME NOT NULL,                           -- Date the notice was sent
-    email_sent TINYTEXT NOT NULL,                          -- email used
-    type INT NULL,                                         -- Invoice Type
-    type_id INT NULL,                                      -- type id (invoice or payment)
-    PRIMARY KEY (id)
-);
-
-----
-
--- Notification Queue
-CREATE TABLE {prefix}notification_queue (
-    id INT NOT NULL AUTO_INCREMENT,
-    notification_type INT NOT NULL,                        -- ref to notification type
-    account INT NOT NULL,                                  -- ref to account
-    queued_time DATETIME NOT NULL,                         -- Creation time
-    processed_time DATETIME NULL,                          -- The time this queue was processed. (sent out)
-    PRIMARY KEY (id),
-    INDEX (notification_type),
-    INDEX (account),
-    INDEX (queued_time),
-    INDEX (processed_time)
-);
-
-----
-
--- Gateway Settings
-CREATE TABLE {prefix}gateway_settings (
-    id INT NOT NULL AUTO_INCREMENT,
-    name TEXT NOT NULL,
-    login_id TINYTEXT NOT NULL,
-    transaction_key TINYTEXT NOT NULL,
-    PRIMARY KEY (id)
-);
-
-----
-
--- Invoice Payments
-CREATE TABLE {prefix}invoice_payments (
-    id INT NOT NULL AUTO_INCREMENT,
-    invoice INT NOT NULL,                                  -- reference to invoice id
-    payment INT NOT NULL,                                  -- reference to payment id
-    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
-    PRIMARY KEY (id),
-    INDEX(invoice)
-);
-
-----
-
--- Settings
-CREATE TABLE {prefix}settings (
-    id INT NOT NULL AUTO_INCREMENT,
-    -- Invoice Options
-    company_logo TINYTEXT NULL,                            -- Image logo
-    company_logo_width INT NULL,                           -- Logo Width (only used if creating pdf)
-    company_name TINYTEXT NULL,                            -- Company Name
-    company_name2 TINYTEXT NULL,                           -- Company Name 2
-    company_addr1 TINYTEXT NULL,                           -- Company Address 1
-    company_addr2 TINYTEXT NULL,                           -- Company Address 2
-    company_city TINYTEXT NULL,                            -- Company City
-    company_state TINYTEXT NULL,                           -- Company State
-    company_zip TINYTEXT NULL,                             -- Company Zip
-    company_phone TINYTEXT NULL,                           -- Company Phone
-    company_email TINYTEXT NULL,                           -- Company Email
-    company_url TINYTEXT NULL,                             -- Company URL
-    payment_terms TEXT NULL,                               -- Payment Terms
-    invoice_show_account_number BOOLEAN DEFAULT '0',       -- Show Billing Account number on invoices
-    invoice_show_invoice_number BOOLEAN DEFAULT '1',       -- Show Invoice Number on invoices
-    days_before_renewal INT NULL,                          -- Number of days before renewal date to allow renewals
-    days_after_expired INT NULL,                           -- Number of days after renewal date expired
-    -- Renewal Options
-    allow_membership_choice BOOLEAN DEFAULT '0',           -- If memberships can choose their membership levels when they renew
-    allow_employees BOOLEAN DEFAULT '0',                   -- If memberships have employees
-    member_types_enabled BOOLEAN DEFAULT '1',              -- member types determine invoice types
-    quickbooks_enabled BOOLEAN DEFAULT '0',                -- QuickBooks enabled
-    member_billing_enabled BOOLEAN DEFAULT '1',            -- Member have access to billing info tab
-    billing_fields_required BOOLEAN DEFAULT '1',           -- Require Billing Fields
-    invoice_methods_enabled BOOLEAN DEFAULT '0',           -- Enable Uptra invoice methods
-    renewal_day_static BOOLEAN DEFAULT '0',                -- Renewal dates are same day every year
-    renewal_day INT NULL,                                  -- Day of the month for renewals
-    renewal_month INT NULL,                                -- Month of year for renewals
-    billing_county_enabled BOOLEAN DEFAULT '0',            -- Billing uses county field
-    invoice_pdf_enabled BOOLEAN DEFAULT '0',               -- Create PDF invoices
-    billing_contact_name_enabled BOOLEAN DEFAULT '0',      -- Use billing_contact_name instead of fname lname
-    member_types_requiring_billing TEXT NULL,              -- List of member type id's that require billing
-    -- Account Number
-    account_number_enabled BOOLEAN DEFAULT '0',            -- Enable Disable account_number
-    account_number_required BOOLEAN DEFAULT '0',           -- Require account_number
-    account_number_unique BOOLEAN DEFAULT '0',             -- account_number must be unique
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Settings entry
-INSERT INTO {prefix}settings
-    ( id, days_before_renewal ,days_after_expired, member_types_enabled, quickbooks_enabled, member_billing_enabled )
-    VALUES
-    ( 1, 90, 30, true, false, true );
-
-----
-
--- Management
-CREATE TABLE {prefix}management (
-    id INT NOT NULL AUTO_INCREMENT,
-    payment_methods SMALLINT NULL,                              -- Payment methods available for all registrations - Bitmap - see payment_method in plugin.ini
-    proc_methods SMALLINT NULL,                                 -- Credit Cart payment processing methods available - Bitmap - see proc_method in plugin.ini
-    cc_accepts SMALLINT NULL,                                   -- Credit Cards Accepted - Bitmap - See credit_card in plugin.ini
-    -- Authorize.net Credentials
-    authorize_net_login TINYTEXT NULL,
-    authorize_net_key TINYTEXT NULL,
-    authorize_net_test TINYINT NULL,                            -- Authorize.net test mode - List - see proc_test_mode in plugin.ini
-    authorize_net_conf BOOLEAN NULL,                            -- Flag to send payment confirmation Email from Authorize.net
-    authorize_net_merchant_email TINYTEXT NULL,                 -- E-Mail Authorize.net will send copy of confirmation E-Mail
-    -- Merchant Solutions Credentials
-    merchant_solutions_acctid TINYTEXT NULL,                    -- Merchant Solutions credentials
-    merchant_solutions_merchantpin TINYTEXT NULL,
-    merchant_solutions_test TINYINT NULL,                       -- Merchant Solutions test mode - List - see proc_test_mode in plugin.ini
-    merchant_solutions_conf BOOLEAN NULL,                       -- Flag to send payment confirmation Email
-    merchant_solutions_merchant_email TINYTEXT NULL,            -- Merchant Solutions will send copy of confirmation E-Mail
-    uptravel_invoice_template BOOLEAN DEFAULT '0',              -- Use uptravel template for invoices.
-    uptravel_payment_form BOOLEAN DEFAULT '0',                  -- Use uptravel payment form style.
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Management entry
-INSERT INTO {prefix}management
-    ( id )
-    VALUES
-    ( 1 );
-
-----
-
--- Employees table
-CREATE TABLE {prefix}employees (
-    id INT NOT NULL AUTO_INCREMENT,
-    account INT NOT NULL,                                      -- Account Id
-    employee INT NOT NULL,                                     -- Employee Account Id
-    PRIMARY KEY (id)
-);
-
-----
-
--- Terms
-CREATE TABLE {prefix}settings_terms (
-    id INT NOT NULL AUTO_INCREMENT,
-    invoice_name TINYTEXT NOT NULL,
-    invoice_name_plur TINYTEXT NOT NULL,
-    invoice_name_cap TINYTEXT NOT NULL,
-    invoice_name_plur_cap TINYTEXT NOT NULL,
-    invoice_type TINYTEXT NOT NULL,
-    invoice_type_plur TINYTEXT NOT NULL,
-    invoice_type_cap TINYTEXT NOT NULL,
-    invoice_type_plur_cap TINYTEXT NOT NULL,
-    account_number TINYTEXT NOT NULL,
-    PRIMARY KEY (id)
-);
-
-----
-
-INSERT INTO {prefix}settings_terms
-    (
-    id,
-    invoice_name,
-    invoice_name_plur,
-    invoice_name_cap,
-    invoice_name_plur_cap,
-    invoice_type,
-    invoice_type_plur,
-    invoice_type_cap,
-    invoice_type_plur_cap,
-    account_number
-    )
-    VALUES
-    (
-    1,
-    'invoice',
-    'invoices',
-    'Invoice',
-    'Invoices',
-    'invoice type',
-    'invoice types',
-    'Invoice Type',
-    'Invoice Types',
-    'Account Number'
-    );
diff --git a/setup/databaseScripts/create_database_V0.0.36.sql b/setup/databaseScripts/create_database_V0.0.36.sql
new file mode 100644 (file)
index 0000000..63233a6
--- /dev/null
@@ -0,0 +1,384 @@
+-- Gaslight Media Billing Module
+-- File Created: 02/19/2019
+-- Database Version: 0.0.36
+-- Database Creation Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+--
+-- **** BE SURE TO ALSO UPDATE drop_database_Vxxx.sql FILE WHEN CHANGING TABLES ****
+--
+
+-- Billing Accounts
+CREATE TABLE {prefix}accounts (
+    id INT NOT NULL AUTO_INCREMENT,
+    archived BOOLEAN DEFAULT '0',                          -- Marks account as archived
+    ref_dest INT NOT NULL,                                 -- reference to member id
+    ref_name TINYTEXT NOT NULL,                            -- Name of reference member
+    invoice_type INT NOT NULL DEFAULT '0',                 -- Ref to Invoice Type id
+    billing_contact_name TINYTEXT NULL,                    -- Billing Contact Name
+    billing_fname TINYTEXT NULL,                           -- Billing First Name
+    billing_lname TINYTEXT NULL,                           -- Billing Last Name
+    billing_company TINYTEXT NULL,                         -- Billing Company Name
+    billing_position TINYTEXT NULL,                        -- Billing Title/Position
+    billing_addr1 TINYTEXT NULL,                           -- Billing Address 1
+    billing_addr2 TINYTEXT NULL,                           -- Billing Address 2
+    billing_city TINYTEXT NULL,                            -- Billing City
+    billing_county INT NULL,                               -- Billing County
+    billing_state TINYTEXT NULL,                           -- Billing State
+    billing_zip TINYTEXT NULL,                             -- Billing Zip
+    billing_country TINYTEXT NULL,                         -- Billing Country
+    billing_phone TINYTEXT NULL,                           -- Billing Phone
+    billing_fax TINYTEXT NULL,                             -- Billing Fax
+    anniversary_date DATE NULL,                            -- anniversary date
+    renewal_date DATE NULL,                                -- renewal date of account
+    payment_data TEXT NULL,                                -- stored payment data
+    customer_profile_id TINYTEXT NULL,                     -- Customer Profile Id (Authorize.net)
+    payment_profile_id TINYTEXT NULL,                      -- Payment Profile Id (Authorize.net)
+    payment_profile_card TINYTEXT NULL,                    -- Payment Profile Card (Authorize.net)
+    email TINYTEXT NULL,                                   -- billing email
+    boss BOOLEAN DEFAULT '0',                              -- Boss flag
+    account_number TINYTEXT NULL,                          -- Account Number
+    email_invoice BOOLEAN DEFAULT '0',                     -- Invoice by email
+    usmail_invoice BOOLEAN DEFAULT '0',                    -- Invoice by US Mail
+    fax_invoice BOOLEAN DEFAULT '0',                       -- Invoice by Fax
+    PRIMARY KEY (id),
+    INDEX(ref_dest),
+    INDEX(ref_name(20)),
+    INDEX(email(20)),
+    INDEX(invoice_type),
+    INDEX(renewal_date),
+    INDEX(billing_county)
+);
+
+----
+
+-- transactions
+CREATE TABLE {prefix}transactions (
+    id INT NOT NULL AUTO_INCREMENT,
+    type INT NOT NULL,                                     -- type of transaction (payment,invoice,etc)
+    type_id INT NOT NULL,                                  -- reference to type id
+    account INT NOT NULL,                                  -- reference to account id
+    transaction_time DATETIME NOT NULL,                    -- datetime for the transaction
+    current_invoice_total DECIMAL(8, 2) NOT NULL,          -- invoice total
+    current_payment_total DECIMAL(8, 2) NOT NULL,          -- payment total
+    PRIMARY KEY (id),
+    INDEX(account),
+    INDEX(type_id),
+    INDEX(transaction_time)
+);
+
+----
+
+-- Invoices
+CREATE TABLE {prefix}invoices (
+    id INT NOT NULL AUTO_INCREMENT,
+    old_invoice_id INT NULL,                               -- old invoice id from uptra
+    transaction_time DATETIME NOT NULL,                    -- datetime for the invoice
+    account INT NOT NULL,                                  -- ref to account id
+    amount_total DECIMAL(8, 2) NOT NULL,                   -- total amount for invoice
+    balance DECIMAL(8, 2) NOT NULL,                        -- balance for this invoice
+    due_date DATE NOT NULL,                                -- Due date for this invoice
+    paid BOOLEAN DEFAULT '0',                              -- true/false if invoice is paid
+    notes TINYTEXT,                                        -- notes for this invoice
+    renewal BOOLEAN DEFAULT '0',                           -- true/false if a renewal
+    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
+    recurrence INT NULL DEFAULT 0,                         -- recurrence type
+    PRIMARY KEY (id),
+    INDEX(account),
+    INDEX(transaction_time),
+    INDEX(due_date)
+);
+
+----
+
+-- Line Item Types
+CREATE TABLE {prefix}invoice_types (
+    id INT NOT NULL AUTO_INCREMENT,
+    name TINYTEXT NOT NULL,                                -- name
+    parent INT NOT NULL DEFAULT 0,                         -- 0 if top level otherwise ref to another line_item_type as it's parent
+    member_type INT NOT NULL DEFAULT 0,                    -- Member Type assigned Default 0
+    amount DECIMAL(8,2) NOT NULL DEFAULT '0.00',           -- amount
+    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
+    recurrence INT NULL DEFAULT 0,                         -- recurrence type
+    dynamic_amount BOOLEAN DEFAULT '0',                    -- true/false if amount is dynamic
+    qcode TINYTEXT NULL,                                   -- qcode for quickbooks
+    category TINYTEXT NULL,                                -- quickbooks category
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Line Items
+CREATE TABLE {prefix}line_items (
+    id INT NOT NULL AUTO_INCREMENT,
+    invoice INT NOT NULL,                                  -- reference to invoice
+    line_item_type INT NOT NULL,                           -- reference to line item type
+    account INT NULL DEFAULT 0,                            -- ref to account id (renewal or employee)
+    name TEXT NOT NULL,                                    -- line item name
+    amount DECIMAL(8,2) DEFAULT '0.00',                    -- line item amount per item
+    quantity INT DEFAULT 1,                                -- quantity
+    total DECIMAL(8,2) DEFAULT '0.00',                     -- line item total
+    recurring BOOLEAN DEFAULT '0',                         -- true/false if recurring
+    recurrence INT NULL DEFAULT 0,                         -- recurrence type
+    created DATE NULL,                                     -- Date this line item was first created
+    first_due_date DATE NULL,                              -- The first due date for this item
+    next_due_date DATE NULL,                               -- Next Due Date for this item
+    PRIMARY KEY (id),
+    INDEX(account),
+    INDEX(created),
+    INDEX(first_due_date),
+    INDEX(next_due_date)
+);
+
+----
+
+-- payments
+CREATE TABLE {prefix}payments (
+    id INT NOT NULL AUTO_INCREMENT,
+    transaction_time DATETIME NOT NULL,                    -- datetime of payment
+    account INT NOT NULL,                                  -- ref to account table
+    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
+    payment_method TINYTEXT NOT NULL,                      -- payment method
+    payment_data TINYTEXT NULL,                            -- additional payment info
+    notes TEXT NULL,                                       -- Notes/Comments on the payment
+    PRIMARY KEY (id)
+);
+
+----
+
+-- pdfs
+CREATE TABLE {prefix}pdfs (
+    id INT NOT NULL AUTO_INCREMENT,
+    ref_type INT NOT NULL,                                 -- reference type
+    ref_dest INT NOT NULL,                                 -- reference types id
+    pdf MEDIUMTEXT NOT NULL,                               -- saved pdf
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Notification Types
+CREATE TABLE {prefix}notification_types (
+    id INT NOT NULL AUTO_INCREMENT,
+    name TINYTEXT NOT NULL,                                -- name
+    to_email TINYTEXT NULL,                                -- To email
+    from_header TINYTEXT NOT NULL,                         -- from headers
+    replyto TINYTEXT NULL,                                 -- reply-to headers
+    subject TINYTEXT NOT NULL,                             -- Subject
+    message TEXT NOT NULL,                                 -- Message
+    send_by_date BOOLEAN NULL DEFAULT '0',                 -- true/false send by date based on due date
+    send_by_action BOOLEAN NULL DEFAULT '0',               -- send notice based on an action
+    send_action INT NULL DEFAULT 0,                        -- (create invoice or receive payment)
+    send_date_number INT NULL DEFAULT 0,                   -- number to apply to send by date
+    send_date_period INT NULL DEFAULT 0,                   -- (days,weeks,months,years)
+    send_date_when INT NULL DEFAULT 0,                     -- (before or after)
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Notifications
+CREATE TABLE {prefix}notifications (
+    id INT NOT NULL AUTO_INCREMENT,
+    notification_type INT NOT NULL,                        -- ref to notification type
+    account INT NOT NULL,                                  -- ref to account
+    from_replyto TINYTEXT NOT NULL,                        -- from reply-to header
+    subject TEXT NOT NULL,                                 -- subject
+    message TEXT NOT NULL,                                 -- message
+    date_sent DATETIME NOT NULL,                           -- Date the notice was sent
+    email_sent TINYTEXT NOT NULL,                          -- email used
+    type INT NULL,                                         -- Invoice Type
+    type_id INT NULL,                                      -- type id (invoice or payment)
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Notification Queue
+CREATE TABLE {prefix}notification_queue (
+    id INT NOT NULL AUTO_INCREMENT,
+    notification_type INT NOT NULL,                        -- ref to notification type
+    account INT NOT NULL,                                  -- ref to account
+    queued_time DATETIME NOT NULL,                         -- Creation time
+    processed_time DATETIME NULL,                          -- The time this queue was processed. (sent out)
+    PRIMARY KEY (id),
+    INDEX (notification_type),
+    INDEX (account),
+    INDEX (queued_time),
+    INDEX (processed_time)
+);
+
+----
+
+-- Gateway Settings
+CREATE TABLE {prefix}gateway_settings (
+    id INT NOT NULL AUTO_INCREMENT,
+    name TEXT NOT NULL,
+    login_id TINYTEXT NOT NULL,
+    transaction_key TINYTEXT NOT NULL,
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Invoice Payments
+CREATE TABLE {prefix}invoice_payments (
+    id INT NOT NULL AUTO_INCREMENT,
+    invoice INT NOT NULL,                                  -- reference to invoice id
+    payment INT NOT NULL,                                  -- reference to payment id
+    amount DECIMAL(8, 2) NOT NULL,                         -- payment amount
+    PRIMARY KEY (id),
+    INDEX(invoice)
+);
+
+----
+
+-- Settings
+CREATE TABLE {prefix}settings (
+    id INT NOT NULL AUTO_INCREMENT,
+    -- Invoice Options
+    company_logo TINYTEXT NULL,                            -- Image logo
+    company_logo_width INT NULL,                           -- Logo Width (only used if creating pdf)
+    company_name TINYTEXT NULL,                            -- Company Name
+    company_name2 TINYTEXT NULL,                           -- Company Name 2
+    company_addr1 TINYTEXT NULL,                           -- Company Address 1
+    company_addr2 TINYTEXT NULL,                           -- Company Address 2
+    company_city TINYTEXT NULL,                            -- Company City
+    company_state TINYTEXT NULL,                           -- Company State
+    company_zip TINYTEXT NULL,                             -- Company Zip
+    company_phone TINYTEXT NULL,                           -- Company Phone
+    company_email TINYTEXT NULL,                           -- Company Email
+    company_url TINYTEXT NULL,                             -- Company URL
+    payment_terms TEXT NULL,                               -- Payment Terms
+    invoice_show_account_number BOOLEAN DEFAULT '0',       -- Show Billing Account number on invoices
+    invoice_show_invoice_number BOOLEAN DEFAULT '1',       -- Show Invoice Number on invoices
+    days_before_renewal INT NULL,                          -- Number of days before renewal date to allow renewals
+    days_after_expired INT NULL,                           -- Number of days after renewal date expired
+    -- Renewal Options
+    allow_membership_choice BOOLEAN DEFAULT '0',           -- If memberships can choose their membership levels when they renew
+    allow_employees BOOLEAN DEFAULT '0',                   -- If memberships have employees
+    member_types_enabled BOOLEAN DEFAULT '1',              -- member types determine invoice types
+    quickbooks_enabled BOOLEAN DEFAULT '0',                -- QuickBooks enabled
+    member_billing_enabled BOOLEAN DEFAULT '1',            -- Member have access to billing info tab
+    billing_fields_required BOOLEAN DEFAULT '1',           -- Require Billing Fields
+    invoice_methods_enabled BOOLEAN DEFAULT '0',           -- Enable Uptra invoice methods
+    renewal_day_static BOOLEAN DEFAULT '0',                -- Renewal dates are same day every year
+    renewal_day INT NULL,                                  -- Day of the month for renewals
+    renewal_month INT NULL,                                -- Month of year for renewals
+    billing_county_enabled BOOLEAN DEFAULT '0',            -- Billing uses county field
+    invoice_pdf_enabled BOOLEAN DEFAULT '0',               -- Create PDF invoices
+    billing_contact_name_enabled BOOLEAN DEFAULT '0',      -- Use billing_contact_name instead of fname lname
+    member_types_requiring_billing TEXT NULL,              -- List of member type id's that require billing
+    -- Account Number
+    account_number_enabled BOOLEAN DEFAULT '0',            -- Enable Disable account_number
+    account_number_required BOOLEAN DEFAULT '0',           -- Require account_number
+    account_number_unique BOOLEAN DEFAULT '0',             -- account_number must be unique
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Set default billing Settings entry
+INSERT INTO {prefix}settings
+    ( id, days_before_renewal ,days_after_expired, member_types_enabled, quickbooks_enabled, member_billing_enabled )
+    VALUES
+    ( 1, 90, 30, true, false, true );
+
+----
+
+-- Management
+CREATE TABLE {prefix}management (
+    id INT NOT NULL AUTO_INCREMENT,
+    payment_methods SMALLINT NULL,                              -- Payment methods available for all registrations - Bitmap - see payment_method in plugin.ini
+    proc_methods SMALLINT NULL,                                 -- Credit Cart payment processing methods available - Bitmap - see proc_method in plugin.ini
+    cc_accepts SMALLINT NULL,                                   -- Credit Cards Accepted - Bitmap - See credit_card in plugin.ini
+    -- Authorize.net Credentials
+    authorize_net_login TINYTEXT NULL,
+    authorize_net_key TINYTEXT NULL,
+    authorize_net_test TINYINT NULL,                            -- Authorize.net test mode - List - see proc_test_mode in plugin.ini
+    authorize_net_conf BOOLEAN NULL,                            -- Flag to send payment confirmation Email from Authorize.net
+    authorize_net_merchant_email TINYTEXT NULL,                 -- E-Mail Authorize.net will send copy of confirmation E-Mail
+    -- Merchant Solutions Credentials
+    merchant_solutions_acctid TINYTEXT NULL,                    -- Merchant Solutions credentials
+    merchant_solutions_merchantpin TINYTEXT NULL,
+    merchant_solutions_test TINYINT NULL,                       -- Merchant Solutions test mode - List - see proc_test_mode in plugin.ini
+    merchant_solutions_conf BOOLEAN NULL,                       -- Flag to send payment confirmation Email
+    merchant_solutions_merchant_email TINYTEXT NULL,            -- Merchant Solutions will send copy of confirmation E-Mail
+    -- Square Credentials
+    square_prod_access_token TINYTEXT NULL,                     -- Square production access token
+    square_prod_app_id TINYTEXT NULL,                           -- Square production application id
+    square_prod_location_id TINYTEXT NULL,                      -- Square production location id
+    square_sandbox_access_token TINYTEXT NULL,                  -- Square sandbox access token
+    square_sandbox_app_id TINYTEXT NULL,                        -- Square sandbox application id
+    square_sandbox_location_id TINYTEXT NULL,                   -- Square sandbox location id
+    square_use_prod BOOLEAN DEFAULT '0',                        -- If true use Production creds
+    -- Uptravel options
+    uptravel_invoice_template BOOLEAN DEFAULT '0',              -- Use uptravel template for invoices.
+    uptravel_payment_form BOOLEAN DEFAULT '0',                  -- Use uptravel payment form style.
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Set default billing Management entry
+INSERT INTO {prefix}management
+    ( id )
+    VALUES
+    ( 1 );
+
+----
+
+-- Employees table
+CREATE TABLE {prefix}employees (
+    id INT NOT NULL AUTO_INCREMENT,
+    account INT NOT NULL,                                      -- Account Id
+    employee INT NOT NULL,                                     -- Employee Account Id
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Terms
+CREATE TABLE {prefix}settings_terms (
+    id INT NOT NULL AUTO_INCREMENT,
+    invoice_name TINYTEXT NOT NULL,
+    invoice_name_plur TINYTEXT NOT NULL,
+    invoice_name_cap TINYTEXT NOT NULL,
+    invoice_name_plur_cap TINYTEXT NOT NULL,
+    invoice_type TINYTEXT NOT NULL,
+    invoice_type_plur TINYTEXT NOT NULL,
+    invoice_type_cap TINYTEXT NOT NULL,
+    invoice_type_plur_cap TINYTEXT NOT NULL,
+    account_number TINYTEXT NOT NULL,
+    PRIMARY KEY (id)
+);
+
+----
+
+INSERT INTO {prefix}settings_terms
+    (
+    id,
+    invoice_name,
+    invoice_name_plur,
+    invoice_name_cap,
+    invoice_name_plur_cap,
+    invoice_type,
+    invoice_type_plur,
+    invoice_type_cap,
+    invoice_type_plur_cap,
+    account_number
+    )
+    VALUES
+    (
+    1,
+    'invoice',
+    'invoices',
+    'Invoice',
+    'Invoices',
+    'invoice type',
+    'invoice types',
+    'Invoice Type',
+    'Invoice Types',
+    'Account Number'
+    );
index 3c80121..fdff678 100644 (file)
@@ -49,5 +49,6 @@ $glmMembersBillingDbVersions = array(
     '0.0.33' => array('version' => '0.0.33', 'tables' => 15, 'date' => '02/19/2019'),
     '0.0.34' => array('version' => '0.0.34', 'tables' => 16, 'date' => '03/19/2019'),
     '0.0.35' => array('version' => '0.0.35', 'tables' => 16, 'date' => '03/20/2019'),
+    '0.0.36' => array('version' => '0.0.36', 'tables' => 16, 'date' => '04/02/2019'),
 );
 
diff --git a/setup/databaseScripts/update_database_V0.0.36.sql b/setup/databaseScripts/update_database_V0.0.36.sql
new file mode 100644 (file)
index 0000000..ef5f64d
--- /dev/null
@@ -0,0 +1,33 @@
+-- Gaslight Media Billing Database
+-- File Created: 12/26/2018
+-- Database Version: 0.0.32
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+
+-- Update the accounts table
+ALTER TABLE {prefix}management ADD square_prod_access_token TINYTEXT NULL;                     -- Square production access token
+
+----
+
+ALTER TABLE {prefix}management ADD square_prod_app_id TINYTEXT NULL;                           -- Square production application id
+
+----
+
+ALTER TABLE {prefix}management ADD square_prod_location_id TINYTEXT NULL;                      -- Square production location id
+
+----
+
+ALTER TABLE {prefix}management ADD square_sandbox_access_token TINYTEXT NULL;                  -- Square sandbox access token
+
+----
+
+ALTER TABLE {prefix}management ADD square_sandbox_app_id TINYTEXT NULL;                        -- Square sandbox application id
+
+----
+
+ALTER TABLE {prefix}management ADD square_sandbox_location_id TINYTEXT NULL;                   -- Square sandbox location id
+
+----
+
+ALTER TABLE {prefix}management ADD square_use_prod BOOLEAN DEFAULT '0';                        -- If true use Production creds
index a78250d..97fc1de 100644 (file)
@@ -55,6 +55,7 @@
                             </select>
                         </td>
                     </tr>
+                    {* Authorize.net *}
                     <tr class="authorize-net">
                         <td></td>
                         <th><p>Authorize.net</p></th>
                             {if $regSettings.fieldFail.authorize_net_merchant_email}<p>{$regSettings.fieldFail.authorize_net_merchant_email}</p>{/if}
                         </td>
                     </tr>
+                    {* Merchant Solutions *}
                     <tr class="merchant-solutions">
                         <td></td>
                         <th><p>Merchant Solutions</p></th>
                             {if $regSettings.fieldFail.merchant_solutions_merchant_email}<p>{$regSettings.fieldFail.merchant_solutions_merchant_email}</p>{/if}
                         </td>
                     </tr>
-
+                    {* Square *}
+                    <tr class="square">
+                        <td></td>
+                        <th><p>Square</p></th>
+                    </tr>
+                    <tr class="square">
+                        <th>Mode:</th>
+                        <td {if $regSettings.fieldFail.square_use_prod}class="glm-form-bad-input"{/if}>
+                            <input type="checkbox" name="square_use_prod" {if $regSettings.fieldData.square_use_prod.value} checked{/if}>Use Production Mode
+                            {if $regSettings.fieldFail.square_use_prod}<p>{$regSettings.fieldFail.square_use_prod}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_prod_access_token} glm-required{/if}"> Production Access Token:</th>
+                        <td {if $regSettings.fieldFail.square_prod_access_token}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_prod_access_token" value="{$regSettings.fieldData.square_prod_access_token}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_prod_access_token}<p>{$regSettings.fieldFail.square_prod_access_token}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_prod_app_id} glm-required{/if}"> Production App Id:</th>
+                        <td {if $regSettings.fieldFail.square_prod_app_id}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_prod_app_id" value="{$regSettings.fieldData.square_prod_app_id}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_prod_app_id}<p>{$regSettings.fieldFail.square_prod_app_id}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_prod_location_id} glm-required{/if}"> Production Location Id:</th>
+                        <td {if $regSettings.fieldFail.square_prod_location_id}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_prod_location_id" value="{$regSettings.fieldData.square_prod_location_id}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_prod_location_id}<p>{$regSettings.fieldFail.square_prod_location_id}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_sandbox_access_token} glm-required{/if}"> Sandbox Access Token:</th>
+                        <td {if $regSettings.fieldFail.square_sandbox_access_token}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_sandbox_access_token" value="{$regSettings.fieldData.square_sandbox_access_token}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_sandbox_access_token}<p>{$regSettings.fieldFail.square_sandbox_access_token}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_sandbox_app_id} glm-required{/if}"> Sandbox App id:</th>
+                        <td {if $regSettings.fieldFail.square_sandbox_app_id}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_sandbox_app_id" value="{$regSettings.fieldData.square_sandbox_app_id}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_sandbox_app_id}<p>{$regSettings.fieldFail.square_sandbox_app_id}</p>{/if}
+                        </td>
+                    </tr>
+                    <tr class="square">
+                        <th class="glm-nowrap-left-align{if $regSettings.fieldRequired.square_sandbox_location_id} glm-required{/if}"> Sandbox Location Id:</th>
+                        <td {if $regSettings.fieldFail.square_sandbox_location_id}class="glm-form-bad-input"{/if}>
+                            <input type="text" name="square_sandbox_location_id" value="{$regSettings.fieldData.square_sandbox_location_id}" class="glm-form-text-input-medium">
+                            {if $regSettings.fieldFail.square_sandbox_location_id}<p>{$regSettings.fieldFail.square_sandbox_location_id}</p>{/if}
+                        </td>
+                    </tr>
                     <tr>
                         <td></td>
                         <th><p>Templates</p></th>
     </tr>
 </table>
 
-<script type="text/javascript">
-    jQuery(function($){
-
-        function showSelectedCardProcessor() {
+<script>
+jQuery(function($){
 
-            // Get the value from the selected Payment Method
-            var processor = $('#proc_methods').val();
+    function showSelectedCardProcessor() {
 
-            // This is a hack, we should be looking at the plugin.ini for these numbers but I'm just too lazy today
-            if (processor == 2) {
-                $('.authorize-net').removeClass('glm-hidden');
-                $('.merchant-solutions').addClass('glm-hidden');
-            } else if (processor == 3) {
-                $('.authorize-net').addClass('glm-hidden');
-                $('.merchant-solutions').removeClass('glm-hidden');
-            } else {
-                $('.authorize-net').addClass('glm-hidden');
-                $('.merchant-solutions').addClass('glm-hidden');
-            }
+        // Get the value from the selected Payment Method
+        var processor = $('#proc_methods').val();
 
+        // This is a hack, we should be looking at the plugin.ini for these numbers but I'm just too lazy today
+        if (processor == 2) {
+            $('.authorize-net').removeClass('glm-hidden');
+            $('.merchant-solutions').addClass('glm-hidden');
+            $('.square').addClass('glm-hidden');
+        } else if (processor == 3) {
+            $('.authorize-net').addClass('glm-hidden');
+            $('.merchant-solutions').removeClass('glm-hidden');
+            $('.square').addClass('glm-hidden');
+        } else if (processor == 4) {
+            $('.authorize-net').addClass('glm-hidden');
+            $('.merchant-solutions').addClass('glm-hidden');
+            $('.square').removeClass('glm-hidden');
+        } else {
+            $('.authorize-net').addClass('glm-hidden');
+            $('.merchant-solutions').addClass('glm-hidden');
+            $('.square').addClass('glm-hidden');
         }
 
-        // When payment method selection changes
-        $('#proc_methods').on('change', function() {
-            showSelectedCardProcessor();
-        });
+    }
 
-        // Start with all pay method inputs dissabled
-        $( document ).ready(function() {
-            showSelectedCardProcessor();
-        });
+    // When payment method selection changes
+    $('#proc_methods').on('change', function() {
+        showSelectedCardProcessor();
+    });
 
+    // Start with all pay method inputs dissabled
+    $( document ).ready(function() {
+        showSelectedCardProcessor();
     });
+
+});
 </script>
 
 {include file='admin/management/footer.html'}
index f1911d4..1d3a60d 100644 (file)
+<fieldset>
+    <legend>Billing Information</legend>
 
-    <fieldset>
-        <legend>Billing Information</legend>
-
-        {if $settings.billing_contact_name_enabled}
-            <div class="glm-billing-field glm-billing">
-                <div class="glm-billing-label glm-required">
-                    Billing Contact Name
-                </div>
-                <div class="glm-billing-input">
-                    <input type="text" name="billing_contact_name" value="{$account.fieldData.billing_contact_name}" required />
-                </div>
-            </div>
-        {else}
-            <div class="glm-billing-field glm-billing-left-half">
-                <div class="glm-billing-label glm-required">
-                    First Name
-                </div>
-                <div class="glm-billing-input">
-                    <input type="text" name="billing_fname" value="{$account.fieldData.billing_fname}" required />
-                </div>
-            </div>
-            <div class="glm-billing-field glm-billing-right-half">
-                <div class="glm-billing-label glm-required">
-                    Last Name
-                </div>
-                <div class="glm-billing-input">
-                    <input type="text" name="billing_lname" value="{$account.fieldData.billing_lname}" required />
-                </div>
-            </div>
-        {/if}
-        <div class="glm-billing-field">
+    {if $settings.billing_contact_name_enabled}
+        <div class="glm-billing-field glm-billing">
             <div class="glm-billing-label glm-required">
-                Address
+                Billing Contact Name
             </div>
             <div class="glm-billing-input">
-                <input type="text" name="billing_addr1" value="{$account.fieldData.billing_addr1}" required />
+                <input type="text" name="billing_contact_name" value="{$account.fieldData.billing_contact_name}" required />
             </div>
         </div>
+    {else}
         <div class="glm-billing-field glm-billing-left-half">
             <div class="glm-billing-label glm-required">
-                City
+                First Name
             </div>
             <div class="glm-billing-input">
-                <input type="text" name="billing_city" value="{$account.fieldData.billing_city}" required />
+                <input type="text" name="billing_fname" value="{$account.fieldData.billing_fname}" required />
             </div>
         </div>
         <div class="glm-billing-field glm-billing-right-half">
             <div class="glm-billing-label glm-required">
-                State / Province
+                Last Name
             </div>
             <div class="glm-billing-input">
-                <select name="billing_state" required>
-                    <option value=""></option>
-                    {foreach $account.fieldData.billing_state.list as $s}
-                        <option value="{$s.value}"{if $account.fieldData.billing_state.value == $s.value} selected="selected"{/if}>
-                            {$s.name}
-                        </option>
-                    {/foreach}
-                </select>
+                <input type="text" name="billing_lname" value="{$account.fieldData.billing_lname}" required />
             </div>
         </div>
-        <div class="glm-billing-field">
-            <div class="glm-billing-label glm-required">
-                Zip
-            </div>
-            <div class="glm-billing-input">
-                <input type="text" name="billing_zip" value="{$account.fieldData.billing_zip}" required />
-            </div>
+    {/if}
+    <div class="glm-billing-field">
+        <div class="glm-billing-label glm-required">
+            Address
         </div>
-        <div class="glm-billing-field">
-            <div class="glm-billing-label glm-required">
-                Email Address
-            </div>
-            <div class="glm-billing-input">
-                <input type="text" name="email" value="{$account.fieldData.email}" required />
-            </div>
+        <div class="glm-billing-input">
+            <input type="text" name="billing_addr1" value="{$account.fieldData.billing_addr1}" required />
+        </div>
+    </div>
+    <div class="glm-billing-field glm-billing-left-half">
+        <div class="glm-billing-label glm-required">
+            City
+        </div>
+        <div class="glm-billing-input">
+            <input type="text" name="billing_city" value="{$account.fieldData.billing_city}" required />
+        </div>
+    </div>
+    <div class="glm-billing-field glm-billing-right-half">
+        <div class="glm-billing-label glm-required">
+            State / Province
         </div>
+        <div class="glm-billing-input">
+            <select name="billing_state" required>
+                <option value=""></option>
+                {foreach $account.fieldData.billing_state.list as $s}
+                    <option value="{$s.value}"{if $account.fieldData.billing_state.value == $s.value} selected="selected"{/if}>
+                        {$s.name}
+                    </option>
+                {/foreach}
+            </select>
+        </div>
+    </div>
+    <div class="glm-billing-field">
+        <div class="glm-billing-label glm-required">
+            Zip
+        </div>
+        <div class="glm-billing-input">
+            <input type="text" name="billing_zip" value="{$account.fieldData.billing_zip}" required />
+        </div>
+    </div>
+    <div class="glm-billing-field">
+        <div class="glm-billing-label glm-required">
+            Email Address
+        </div>
+        <div class="glm-billing-input">
+            <input type="text" name="email" value="{$account.fieldData.email}" required />
+        </div>
+    </div>
 
-        </fieldset>
+</fieldset>
 
-    <fieldset>
-        <legend>Payment Options</legend>
+<fieldset>
+    <legend>Payment Options</legend>
 
-        <div class="glm-billing-field">
-            <div class="glm-billing-label">
-                Select Payment Option
-            </div>
-            <div class="glm-billing-input">
-                <label> <input class="payment_option" type="radio" name="payment_option" value="pay_by_credit_card" checked> Pay by Credit Card </label>
-                <label> <input class="payment_option" type="radio" name="payment_option" value="pay_by_check"> Pay by Check </label>
-                {if !$lockedToMember}
-                <label> <input class="payment_option" type="radio" name="payment_option" value="mark_paid"> Mark Paid </label>
-                {/if}
-            </div>
+    <div class="glm-billing-field">
+        <div class="glm-billing-label">
+            Select Payment Option
+        </div>
+        <div class="glm-billing-input">
+            <label> <input class="payment_option" type="radio" name="payment_option" value="pay_by_credit_card" checked> Pay by Credit Card </label>
+            <label> <input class="payment_option" type="radio" name="payment_option" value="pay_by_check"> Pay by Check </label>
+            {if !$lockedToMember}
+            <label> <input class="payment_option" type="radio" name="payment_option" value="mark_paid"> Mark Paid </label>
+            {/if}
         </div>
+    </div>
 
-        {if isset( $account.fieldData.payment_profile_card ) && $account.fieldData.payment_profile_card}
-            <div class="glm-billing-field glm-billing-credit">
-                <div class="glm-billing-input">
-                    <label>
-                        <input id="glm-billing-use-saved-card" type="checkbox" name="use_saved_cc_profile">
-                        <strong>Use the saved credit card ending in {$account.fieldData.payment_profile_card}</strong>
-                    </label>
-                </div>
+    {if isset( $account.fieldData.payment_profile_card ) && $account.fieldData.payment_profile_card}
+        <div class="glm-billing-field glm-billing-credit">
+            <div class="glm-billing-input">
+                <label>
+                    <input id="glm-billing-use-saved-card" type="checkbox" name="use_saved_cc_profile">
+                    <strong>Use the saved credit card ending in {$account.fieldData.payment_profile_card}</strong>
+                </label>
             </div>
-        {/if}
+        </div>
+    {/if}
 
+    {* Include the Payment Form template *}
+    {if $billing_settings.proc_methods == 4}
+        {include file='common/billing/squarePaymentForm.html'}
+    {else}
         <div class="glm-billing-field glm-billing-credit glm-billing-card">
             <div class="glm-billing-label glm-required">
                 Name on Card
             </div>
         </div>
         {/if}
+    {/if}
 
-        </fieldset>
+</fieldset>
 
 <script>
 jQuery(document).ready(function($){
@@ -204,14 +208,22 @@ jQuery(document).ready(function($){
         var payment_option = $('.payment_option:checked').val();
         console.log( 'payment_option: ', payment_option );
         if ( payment_option == 'pay_by_check' ) {
-            $('.glm-billing-credit').hide();
-            $('.ccard').prop('disabled', true);
+            {if $billing_settings.proc_methods == 4}
+                $('.sq-payment-form').hide();
+            {else}
+                $('.glm-billing-credit').hide();
+                $('.ccard').prop('disabled', true);
+            {/if}
         } else if ( payment_option == 'mark_paid' ) {
             $('.glm-billing-credit').hide();
             $('.ccard').prop('disabled', true);
         } else {
-            $('.glm-billing-credit').show();
-            $('.ccard').prop('disabled', false);
+            {if $billing_settings.proc_methods == 4}
+                $('.sq-payment-form').show();
+            {else}
+                $('.glm-billing-credit').show();
+                $('.ccard').prop('disabled', false);
+            {/if}
         }
     });
 
diff --git a/views/common/billing/squarePaymentForm.html b/views/common/billing/squarePaymentForm.html
new file mode 100644 (file)
index 0000000..05b3467
--- /dev/null
@@ -0,0 +1,64 @@
+{* Square Payment Form *}
+{* link to the SqPaymentForm library *}
+<script src="https://js.squareup.com/v2/paymentform"></script>
+<script>
+window.applicationId = '{if $billing_settings.square_use_prod}{$billing_settings.square_prod_app_id}{else}{$billing_settings.square_sandbox_app_id}{/if}';
+window.locationId = '{if $billing_settings.square_use_prod}{$billing_settings.square_prod_location_id}{else}{$billing_settings.square_sandbox_location_id}{/if}';
+</script>
+
+{* link to the local SqPaymentForm initialization *}
+<script src="{$pluginJsUrl}/sq-payment-form.js"></script>
+{* link to the custom styles for SqPaymentForm *}
+<link rel="stylesheet" type="text/css" href="{$pluginCssUrl}/sq-payment-form.css">
+
+{* Begin Payment Form *}
+<div class="sq-payment-form">
+    {*
+     * Square's JS will automatically hide these buttons if they are unsupported
+     * by the current device.
+     *}
+    <div id="sq-walletbox">
+        <button id="sq-google-pay" class="button-google-pay"></button>
+        <button id="sq-apple-pay" class="sq-apple-pay"></button>
+        <button id="sq-masterpass" class="sq-masterpass"></button>
+        <div class="sq-wallet-divider">
+            <span class="sq-wallet-divider__text">Or</span>
+        </div>
+    </div>
+    <div id="sq-ccbox">
+        {*
+         * You should replace the action attribute of the form with the path of
+         * the URL you want to POST the nonce to (for example, "/process-card").
+
+         * You need to then make a "Charge" request to Square's transaction API with
+         * this nonce to securely charge the customer.
+
+         * Learn more about how to setup the server component of the payment form here:
+         * https://docs.connect.squareup.com/payments/transactions/processing-payment-rest
+         *}
+        <div class="sq-field">
+            <label class="sq-label">Card Number</label>
+            <div id="sq-card-number"></div>
+        </div>
+        <div class="sq-field-wrapper">
+            <div class="sq-field sq-field--in-wrapper">
+                <label class="sq-label">CVV</label>
+                <div id="sq-cvv"></div>
+            </div>
+            <div class="sq-field sq-field--in-wrapper">
+                <label class="sq-label">Expiration</label>
+                <div id="sq-expiration-date"></div>
+            </div>
+            <div class="sq-field sq-field--in-wrapper">
+                <label class="sq-label">Postal</label>
+                <div id="sq-postal-code"></div>
+            </div>
+        </div>
+        {*
+         * After a nonce is generated it will be assigned to this hidden input field.
+         *}
+        <div id="error"></div>
+        <input type="hidden" id="card-nonce" name="nonce">
+    </div>
+</div>
+{* End Payment Form *}
index 36ac87f..9fd0249 100644 (file)
@@ -11,7 +11,7 @@
         {/foreach}
     {/if}
 
-    <form action="{$thisUrl}" method="post">
+    <form action="{$thisUrl}" method="post"{if $billing_settings.proc_methods == 4} id="nonce-form" novalidate{/if}>
         <input type="hidden" name="option" value="paymentProcess" />
         <input type="hidden" id="member_id" name="member" value="{$memberId}" />
         <input type="hidden" id="account_id" name="account_id" value="{$accountId}" />
@@ -58,7 +58,7 @@
         {* Include the Payment Form template *}
         {include file='common/billing/paymentForm.html'}
 
-        <input class="button button-primary" type="submit" value="Renew">
+        <input class="button button-primary" type="submit" value="Pay Now" {if $billing_settings.proc_methods == 4} onclick="onGetCardNonce(event)"{/if}>
 
     </form>
 </div>