Skip to content

Instantly share code, notes, and snippets.

@dancameron
Forked from davidwolfpaw/gf_si_int.php
Last active September 8, 2016 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dancameron/dab36ee3b68bd94225e9ee2bccc37060 to your computer and use it in GitHub Desktop.
Save dancameron/dab36ee3b68bd94225e9ee2bccc37060 to your computer and use it in GitHub Desktop.
Gravity Forms / Sprout Invoices Pro Integration
<?php
/**
* Hook into all Gravity Form submissions, check to see if the form id
* matches the one we want to generate an invoice from, and process the
* submission if appropriate.
*
* @param arrat $entry Array of the GF entry
* @return null
*/
function maybe_process_gravity_form_and_create_invoice( $entry = array(), $form = array() ) {
// Change the form ID below
$form_id = 4;
// Only a specific form do this process, if not than stop
if ( $form_id === $entry['form_id'] ) {
return;
}
/**
* The below values need match field id for your custom form
* if your form does not include any information than leave 0
* unless it's a required field.
*/
$subject_field_id = 0;
$name_field_id = 9; // Advanced "name" field
$address_field_id = 14; // Advanced "address" field
$phone_field_id = 11;
$website_field_id = 12;
/**
* These values are required, otherwise a client and user cannot
* be created from the submission
*/
$client_company_name_field_id = 13; // REQUIRED
$email_field_id = 10; // REQUIRED
/**
* Creates variables from submission
*/
$client_name = ( $client_company_name_field_id ) ? $entry[ $client_company_name_field_id ] : '' ;
$email = ( $email_field_id ) ? $entry[ $email_field_id ] : '' ;
$subject = ( $subject_field_id ) ? $entry[ $subject_field_id ] : '' ;
$website = ( $website_field_id ) ? $entry[ $website_field_id ] : '' ;
$contact_phone = ( $phone_field_id ) ? $entry[ $phone_field_id ] : '' ;
$full_name = ( $name_field_id ) ? $entry[ $name_field_id . '.3' ] . ' ' . $entry[ $name_field_id . '.6' ] : '' ;
$contact_street = ( $address_field_id ) ? $entry[ $address_field_id . '.1' ] . ' ' . $entry[ $address_field_id . '.2' ] : '' ;
$contact_city = ( $address_field_id ) ? $entry[ $address_field_id . '.3' ] : '' ;
$contact_zone = ( $address_field_id ) ? $entry[ $address_field_id . '.4' ] : '' ;
$contact_postal_code = ( $address_field_id ) ? $entry[ $address_field_id . '.5' ] : '' ;
$contact_country = ( $address_field_id ) ? $entry[ $address_field_id . '.6' ] : '' ;
/**
* Build args to pass to SI_Invoice::create_invoice
*/
$invoice_args = array(
'subject' => 'FixUpFox Website Maintenance',
'status' => SI_Invoice::STATUS_PENDING, // "publish"
'fields' => $entry,
'form' => $form,
'history_link' => sprintf( '<a href="%s">#%s</a>', add_query_arg( array( 'id' => $entry['form_id'], 'lid' => $entry['id'] ), admin_url( 'admin.php?page=gf_entries&view=entry' ) ), $entry['id'] ),
'is_recurring_invoice' => 1,
);
/**
* Creates the invoice from the arguments
*/
$invoice_id = SI_Invoice::create_invoice( $invoice_args );
$invoice = SI_Invoice::get_instance( $invoice_id );
/**
* DIFFICULT PART
* This is probably the part that may give you the most grief,
* everything above was pretty straightforward and you
* only needed to change some parameter ids to match your form field ids.
* This portion requires that you create the line items
* based on the submissions.
*
* Just remember this is an example for you to use.
* The original GF form this is based on is available upon request.
*/
// line items are an array.
$line_items = array();
// Check to see which options were selected for service
// $entry['16'] is service level
// $entry['17'] is renewal cycle
if ( $entry[16] === 'Professional' ) {
$rate = 199;
} elseif ( $entry[16] === 'Personal' ) {
$rate = 49;
}
// Calculate cycle with rate. Verifying rate as well to ensure no hidden fields interfere
if ( $entry[16] === 'Professional' && $entry[17] === 'annually' ) {
$quantity = 12;
$discount = 33;
$percent = 0.33;
$description = 'Professional service at an annual renewal discount';
} elseif ( $entry[16] === 'Professional' && $entry[17] === 'quarterly' ) {
$quantity = 3;
$discount = 20;
$percent = 0.20;
$description = 'Professional service at a quarterly renewal discount';
} elseif ( $entry[16] === 'Professional' && $entry[17] === 'monthly' ) {
$quantity = 1;
$discount = 0;
$percent = 0.00;
$description = 'Professional service at no monthly renewal discount';
} elseif ( $entry[16] === 'Personal' && $entry[17] === 'annually' ) {
$quantity = 12;
$discount = 33;
$percent = 0.33;
$description = 'Personal service at an annual renewal discount';
} elseif ( $entry[16] === 'Personal' && $entry[17] === 'quarterly' ) {
$quantity = 3;
$discount = 20;
$percent = 0.20;
$description = 'Personal service at a quarterly renewal discount';
} elseif ( $entry[16] === 'Personal' && $entry[17] === 'monthly' ) {
$quantity = 1;
$discount = 0;
$percent = 0.00;
$description = 'Personal service at no monthly renewal discount';
}
$total = $rate * $quantity * (1 - $percent);
// if ( is_numeric( $entry['choice_4_5_0'] ) ) {
$line_items[] = array(
'type' => 'service', // type of line item
'rate' => $rate, // rate per hour
'qty' => $quantity,
'tax' => $discount,
'total' => $total,
'desc' => $description,
);
// }
// /**
// * That's it for creating the line items array. Now it can
// * be set.
// */
$invoice->set_line_items( $line_items );
/**
* Recurring Stuff
*/
if ( $entry[16] === 'Professional' ) {
$start_time = ''; // timestamp, e.g. current_time('timestamp');
$frequency = ''; // weekly, monthly, quarterly, yearly
$duration = 1; // integer
} elseif ( $entry[16] === 'Personal' ) {
$start_time = ''; // timestamp, e.g. current_time('timestamp');
$frequency = ''; // weekly, monthly, quarterly, yearly
$duration = 1; // integer
}
SI_Invoices_Recurring::set_start_time( $invoice_id, $start_time );
SI_Invoices_Recurring::set_frequency( $invoice_id, $frequency );
SI_Invoices_Recurring::set_duration( $invoice_id, $duration );
SI_Invoices_Recurring::set_recurring( $invoice_id ); // let the method handle it.
SI_Invoices_Recurring::set_clone_time( $invoice_id ); // let the method handle it.
/**
* Attempt to create a user before creating a client.
*/
$user_id = get_current_user_id();
if ( ! $user_id ) {
if ( isset( $args['email'] ) && '' !== $args['email'] ) {
// check to see if the user exists by email
$user = get_user_by( 'email', $args['email'] );
if ( $user ) {
$user_id = $user->ID;
}
}
}
// Create a user for the submission if an email is provided.
if ( ! $user_id ) {
// email is critical
if ( isset( $args['email'] ) && '' !== $args['email'] ) {
$user_args = array(
'user_login' => esc_attr__( $email ),
'display_name' => isset( $client_name ) ? esc_attr__( $client_name ) : esc_attr__( $email ),
'user_email' => esc_attr__( $email ),
'first_name' => si_split_full_name( esc_attr__( $full_name ), 'first' ),
'last_name' => si_split_full_name( esc_attr__( $full_name ), 'last' ),
'user_url' => $website,
);
$user_id = SI_Clients::create_user( $user_args );
}
}
// Make up the args in creating a client
$args = array(
'company_name' => $client_name,
'website' => $website,
'phone' => $contact_phone,
'address' => array(
'street' => $contact_street,
'city' => $contact_city,
'zone' => $contact_zone,
'postal_code' => $contact_postal_code,
'country' => $contact_country,
),
'user_id' => $user_id,
);
$client_id = SI_Client::new_client( $args );
/**
* After a client is created assign it to the invoice
*/
$invoice->set_client_id( $client_id );
// Finally associate the invoice with the form submission
add_post_meta( $invoice_id, 'gf_form_id', $entry['id'] );
}
function maybe_redirect_to_invoice_after_submission( $confirmation, $form, $entry, $ajax ) {
// Find the invoice that have been associated with this entry.
$invoice_ids = SI_Post_Type::find_by_meta( SI_Invoice::POST_TYPE, array( 'gf_form_id' => $entry['id'] ) );
if ( ! empty( $invoice_ids ) ) {
$invoice_id = $invoice_ids[0];
}
// var_dump($invoice_ids);
// Modify the confirmation array and add the redirection to the new invoice
if ( get_post_type( $invoice_id ) === SI_Invoice::POST_TYPE ) {
$invoice_url = get_permalink( $invoice_id );
if ( headers_sent() || $ajax ) {
$confirmation = GFFormDisplay::get_js_redirect_confirmation( $invoice_url, $ajax );
} else {
$confirmation = array( 'redirect' => $invoice_url );
}
}
return $confirmation;
// echo '<pre>';
// var_dump($entry);
// echo '</pre>';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment