Updating db with payment fields for Authorize.net CIM
authorSteve Sutton <steve@gaslightmedia.com>
Fri, 6 Apr 2018 19:57:04 +0000 (15:57 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Fri, 6 Apr 2018 19:57:04 +0000 (15:57 -0400)
CIM Authorize.net to save the credit card on authorize.net.

classes/billingSupport.php
classes/data/dataAccounts.php
index.php
setup/databaseScripts/create_database_V0.0.18.sql [deleted file]
setup/databaseScripts/create_database_V0.0.19.sql [new file with mode: 0644]
setup/databaseScripts/dbVersions.php
setup/databaseScripts/update_database_V0.0.19.sql [new file with mode: 0644]

index c98e70b..445211e 100644 (file)
@@ -1057,12 +1057,20 @@ class GlmBillingSupport
         );
     }
 
-    public function processPayment()
+    public function processPayment( $account_id, $payment_id )
     {
         $errors = array();
         // Get the selected credit card processor type
         $ccProcessor = $this->config['billing_settings']['proc_methods'];
 
+        // Other data fields that might be supplied
+        $transOpt          = 0;
+        $customerProfileId = false;
+        $paymentProfileId  = false;
+        $profileStatus     = false;
+        $profileStatusText = false;
+        $checkCC           = true;
+
         // Setup the required account information for the selected payment processor
         switch ( $ccProcessor ) {
 
@@ -1130,52 +1138,83 @@ class GlmBillingSupport
 
         // Add billing information to billing array
         $billing = array(
+            'id'      => false,
             'fname'   => $paymentData['billing_fname'],
             'lname'   => $paymentData['billing_lname'],
             'addr1'   => $paymentData['billing_addr1'],
             'addr2'   => $paymentData['billing_addr2'],
             'city'    => $paymentData['billing_city'],
             'state'   => $paymentData['billing_state'],
+            'country' => '',
             'zip'     => $paymentData['billing_zip'],
             'phone'   => $paymentData['billing_phone'],
             'email'   => $paymentData['email']
         );
         $cardMatch = $this->config['credit_card_match'];
 
-        // Check all credit card input
-        if ( $cardData['cc_type'] && $cardData['cc_type'] > 0
-            && $cardData['cc_name'] && $cardData['cc_name'] != ''
-            && $cardData['cc_numb'] && $cardData['cc_numb'] > 0
-            && $cardData['cc_exp'] && $cardData['cc_exp'] != ''
-            && $cardData['cc_cvv'] && $cardData['cc_cvv'] > 0
-        ) {
-            if ( !isset( $this->config['credit_card_match'][$cardData['cc_type']] ) ||
-                !preg_match( $this->config['credit_card_match'][$cardData['cc_type']], $cardData['cc_numb'] )
+        switch ( $ccProcessor ) {
+        case $this->config['proc_method_numb']['Authorize.net']:
+            // Add payment fields for Payment Profiles
+            if ( isset( $_REQUEST['use_saved_cc_profile'] )
+                && trim($_REQUEST['use_saved_cc_profile'] ) != ''
             ) {
-                $errors[] = 'The credit card number you entered does not match the selected type of credit card.';
+                $transOpt          = 2;
+                $checkCC           = false;
+                $customerProfileId = $regAccount['fieldData']['customer_profile_id'];
+                $paymentProfileId  = $regAccount['fieldData']['payment_profile_id'];
+
+            } elseif ( isset( $_REQUEST['cc_save'] )
+                && trim( $_REQUEST['cc_save'] ) != ''
+            ) {
+                $transOpt = 1;
             }
 
-        } else {
-            $errors[] = 'You did not supply all required credit card information correctly.';
+            // Convert card expiration date to required format
+            if ($transOpt < 2) {
+                $cardExp = explode('/', $cardData['cc_exp']);
+                $cardData['cc_exp'] = '20'.$cardExp[1].'-'.$cardExp[0];
+            }
+            break;
+        }
+
+        // If we need to check for proper credit card data
+        if ($checkCC) {
+            // Check all credit card input
+            if ( $cardData['cc_type'] && $cardData['cc_type'] > 0
+                && $cardData['cc_name'] && $cardData['cc_name'] != ''
+                && $cardData['cc_numb'] && $cardData['cc_numb'] > 0
+                && $cardData['cc_exp'] && $cardData['cc_exp'] != ''
+                && $cardData['cc_cvv'] && $cardData['cc_cvv'] > 0
+            ) {
+                if ( !isset( $this->config['credit_card_match'][$cardData['cc_type']] ) ||
+                    !preg_match( $this->config['credit_card_match'][$cardData['cc_type']], $cardData['cc_numb'] )
+                ) {
+                    $errors[] = 'The credit card number you entered does not match the selected type of credit card.';
+                }
+
+            } else {
+                $errors[] = 'You did not supply all required credit card information correctly.';
+            }
         }
-        if (count($errors) == 0) {
+        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_BILLING_PLUGIN_LIB_PATH . '/paymentProcessors/' . $this->config['proc_dir'][$ccProcessor] . '/paymentGateway.php';
+                require_once GLM_MEMBERS_PLUGIN_LIB_PATH . '/paymentProcessors/' . $this->config['proc_dir'][$ccProcessor] . '/paymentGateway.php';
                 $CcProcessor = new PaymentGateway( $account );
             }
 
             // TODO: Need to update the $invoice_id to something better for billing.
             $payment = array(
-                'name'    => $this->config['settings']['company_name'],  // Company Name
-                'charge'  => $amount,                                    // Total charges
-                'cctype'  => $cardData['cc_type'],                       // Card Type
-                'ccname'  => $cardData['cc_name'],                       // Name on Card
-                'ccnumb'  => $cardData['cc_numb'],                       // Card Number
-                'ccexp'   => $cardData['cc_exp'],                        // Expiration Date
-                'cccode'  => $cardData['cc_cvv'],                        // CCV - security code
-                'invoice' => 'billing-'//.$invoice_id                    // Invoice # is "reg-" plus cart ID
+                'transOpt' => $transOpt,                                  // 0 = charge card, 1 = charge and store, 2 = charge stored card
+                'name'     => $this->config['settings']['company_name'],  // Company Name
+                'charge'   => $amount,                                    // Total charges
+                'cctype'   => $cardData['cc_type'],                       // Card Type
+                'ccname'   => $cardData['cc_name'],                       // Name on Card
+                'ccnumb'   => $cardData['cc_numb'],                       // Card Number
+                'ccexp'    => $cardData['cc_exp'],                        // Expiration Date
+                'cccode'   => $cardData['cc_cvv'],                        // CCV - security code
+                'invoice'  => 'billing-' . $payment_id                    // Invoice # is "reg-" plus cart ID
             );
 
             // Now try to run the card processor
@@ -1183,6 +1222,39 @@ class GlmBillingSupport
 
             // If successful submission - say we're complete
             if ( is_array( $ccResult ) && isset( $ccResult['status'] ) && $ccResult['status'] == 1 ) {
+
+                // Check if we need to store new card profile data
+                if ( $transOpt == 1 ) {
+                    $customerProfileId = filter_var( $ccResult['customerProfileId'], FILTER_SANITIZE_NUMBER_INT );
+                    $paymentProfileId  = filter_var( $ccResult['paymentProfileId'], FILTER_SANITIZE_NUMBER_INT );
+                    $profileStatus     = filter_var( $ccResult['profileStatus'], FILTER_SANITIZE_NUMBER_INT );
+                    $profileStatusText = filter_var( $ccResult['profileStatusText'], FILTER_SANITIZE_STRING );
+
+                    // If saving the credit card was successful
+                    if ( $profileStatus ) {
+
+                        // Save the profile information in the submitting account
+                        $updated = $this->wpdb->update(
+                            GLM_MEMBERS_BILLING_PLUGIN_DB_PREFIX.'accounts',
+                            array(
+                                'customer_profile_id'  => $customerProfileId,
+                                'payment_profile_id'   => $paymentProfileId,
+                                'payment_profile_card' => $cc_numb_store
+                            ),
+                            array( 'id' => $account_id ),
+                            array(
+                                '%s',
+                                '%s',
+                                '%s'
+                            )
+                        );
+
+                    } else {
+                        $messages[] = "Sorry, we were unable to store your credit card data for future use, but we did try.";
+                    }
+
+                }
+
                 $result = array(
                     'status'   => 1,
                     'errors'   => array(),
@@ -1213,7 +1285,7 @@ class GlmBillingSupport
      */
     public function processMemberRenewal( $account_id, $invoice_id, $amount, $employees = array() )
     {
-        $result = $this->processPayment();
+        $result = $this->processPayment( $account_id, $invoice_id );
 
         if ( $result['status'] === 1 ) {
 
@@ -1264,7 +1336,8 @@ class GlmBillingSupport
 
     public function makePayment( $account_id, $invoices, $amount )
     {
-        $result = $this->processPayment();
+        $payment_id = implode( '-', $invoices );
+        $result = $this->processPayment( $account_id, $payment_id );
         if ( $result['status'] === 1 ) {
 
             // Need to record the payment.
index e269f12..7d86f73 100644 (file)
@@ -240,6 +240,25 @@ class GlmDataAccounts extends GlmDataAbstract
                 'required' => false,
             ),
 
+            // Customer Profile Id
+            'customer_profile_id' => array(
+                'field'    => 'customer_profile_id',
+                'type'     => 'text',
+                'use'      => 'a',
+            ),
+            // Payment Profile Id
+            'payment_profile_id' => array(
+                'field'    => 'payment_profile_id',
+                'type'     => 'text',
+                'use'      => 'a',
+            ),
+            // Payment Profile Card
+            'payment_profile_card' => array(
+                'field'    => 'payment_profile_card',
+                'type'     => 'text',
+                'use'      => 'a',
+            ),
+
          );
 
 
index 3cb10ea..83475b4 100644 (file)
--- a/index.php
+++ b/index.php
@@ -38,7 +38,7 @@
  *  version from this plugin.
  */
 define('GLM_MEMBERS_BILLING_PLUGIN_VERSION', '0.0.1');
-define('GLM_MEMBERS_BILLING_PLUGIN_DB_VERSION', '0.0.18');
+define('GLM_MEMBERS_BILLING_PLUGIN_DB_VERSION', '0.0.19');
 
 // 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/setup/databaseScripts/create_database_V0.0.18.sql b/setup/databaseScripts/create_database_V0.0.18.sql
deleted file mode 100644 (file)
index 15c38ee..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
--- Gaslight Media Billing Module
--- File Created: 11/08/2017
--- Database Version: 0.0.15
--- 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
-    billing_fname TINYTEXT NULL,                           -- Billing First Name
-    billing_lname TINYTEXT NULL,                           -- Billing Last Name
-    billing_addr1 TINYTEXT NULL,                           -- Billing Address 1
-    billing_addr2 TINYTEXT NULL,                           -- Billing Address 2
-    billing_city TINYTEXT NULL,                            -- Billing City
-    billing_state TINYTEXT NULL,                           -- Billing State
-    billing_zip TINYTEXT NULL,                             -- Billing Zip
-    billing_phone TINYTEXT NULL,                           -- Billing Phone
-    anniversary_date DATE NOT NULL,                        -- anniversary date - used for main invoice generation
-    renewal_date DATE NULL,                                -- renewal date of account
-    payment_data TEXT NULL,                                -- stored payment data
-    email TINYTEXT NULL,                                   -- billing email
-    PRIMARY KEY (id),
-    INDEX(ref_dest),
-    INDEX(ref_name(20)),
-    INDEX(email(20))
-);
-
-----
-
--- 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,
-    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
-    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
-    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
-    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
-    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
-    PRIMARY KEY (id)
-);
-
-----
-
--- 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
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Settings entry
-INSERT INTO {prefix}settings
-    ( id, days_before_renewal ,days_after_expired )
-    VALUES
-    ( 1, 90, 30 );
-
-----
-
--- 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
-    PRIMARY KEY (id)
-);
-
-----
-
--- Set default billing Management entry
-INSERT INTO {prefix}management
-    ( id )
-    VALUES
-    ( 1 );
diff --git a/setup/databaseScripts/create_database_V0.0.19.sql b/setup/databaseScripts/create_database_V0.0.19.sql
new file mode 100644 (file)
index 0000000..ba08d4d
--- /dev/null
@@ -0,0 +1,267 @@
+-- Gaslight Media Billing Module
+-- File Created: 11/08/2017
+-- Database Version: 0.0.19
+-- 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
+    billing_fname TINYTEXT NULL,                           -- Billing First Name
+    billing_lname TINYTEXT NULL,                           -- Billing Last Name
+    billing_addr1 TINYTEXT NULL,                           -- Billing Address 1
+    billing_addr2 TINYTEXT NULL,                           -- Billing Address 2
+    billing_city TINYTEXT NULL,                            -- Billing City
+    billing_state TINYTEXT NULL,                           -- Billing State
+    billing_zip TINYTEXT NULL,                             -- Billing Zip
+    billing_phone TINYTEXT NULL,                           -- Billing Phone
+    anniversary_date DATE NOT NULL,                        -- anniversary date - used for main invoice generation
+    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
+    PRIMARY KEY (id),
+    INDEX(ref_dest),
+    INDEX(ref_name(20)),
+    INDEX(email(20))
+);
+
+----
+
+-- 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,
+    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
+    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
+    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
+    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
+    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
+    PRIMARY KEY (id)
+);
+
+----
+
+-- 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
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Set default billing Settings entry
+INSERT INTO {prefix}settings
+    ( id, days_before_renewal ,days_after_expired )
+    VALUES
+    ( 1, 90, 30 );
+
+----
+
+-- 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
+    PRIMARY KEY (id)
+);
+
+----
+
+-- Set default billing Management entry
+INSERT INTO {prefix}management
+    ( id )
+    VALUES
+    ( 1 );
index 729b630..c12c896 100644 (file)
@@ -32,5 +32,6 @@ $glmMembersBillingDbVersions = array(
     '0.0.16' => array('version' => '0.0.16', 'tables' => 14),
     '0.0.17' => array('version' => '0.0.17', 'tables' => 14),
     '0.0.18' => array('version' => '0.0.18', 'tables' => 14),
+    '0.0.19' => array('version' => '0.0.19', 'tables' => 14),
 );
 
diff --git a/setup/databaseScripts/update_database_V0.0.19.sql b/setup/databaseScripts/update_database_V0.0.19.sql
new file mode 100644 (file)
index 0000000..4079815
--- /dev/null
@@ -0,0 +1,19 @@
+-- Gaslight Media Billing Database
+-- File Created: 04/06/2018
+-- Database Version: 0.0.19
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+
+-- Add customer profile id
+ALTER TABLE {prefix}accounts ADD customer_profile_id TINYTEXT NULL;  -- Customer Profile Id (Authorize.net)
+
+----
+
+-- Add payment profile id
+ALTER TABLE {prefix}accounts ADD payment_profile_id TINYTEXT NULL;  -- Payment Profile Id (Authorize.net)
+
+----
+
+-- Add payment profile id
+ALTER TABLE {prefix}accounts ADD payment_profile_card TINYTEXT NULL;  -- Payment Profile Card (Authorize.net)