debug("invoked RecurringInvoice"); $sql="SELECT vtiger_salesorder.salesorderid, recurring_frequency, start_period, end_period, last_recurring_date, payment_duration, invoice_status FROM vtiger_salesorder INNER JOIN vtiger_crmentity ON vtiger_salesorder.salesorderid = vtiger_crmentity.crmid AND vtiger_crmentity.deleted = 0 INNER JOIN vtiger_invoice_recurring_info ON vtiger_salesorder.salesorderid = vtiger_invoice_recurring_info.salesorderid WHERE DATE_FORMAT(start_period,'%Y-%m-%d') <= '".date('Y-m-d')."' AND DATE_FORMAT(end_period,'%Y-%m-%d') >= '".date('Y-m-d')."'"; $result = $adb->pquery($sql, array()); $no_of_salesorder = $adb->num_rows($result); for($i=0; $i<$no_of_salesorder;$i++) { $salesorder_id = $adb->query_result($result, $i,'salesorderid'); $start_period = $adb->query_result($result, $i,'start_period'); $end_period = $adb->query_result($result, $i,'end_period'); $last_recurring_date = $adb->query_result($result, $i,'last_recurring_date'); $recurring_frequency = $adb->query_result($result, $i,'recurring_frequency'); if ($last_recurring_date == NULL || $last_recurring_date == '' || $last_recurring_date == '0000-00-00') { $last_recurring_date = $start_period; } $currentDate = date('Y-m-d'); if(strtotime($last_recurring_date) < strtotime($currentDate)){ $last_recurring_date = $currentDate; } $currentRecurringDate = $last_recurring_date; if(strtotime($currentRecurringDate) > strtotime($end_period)) { continue; } switch(strtolower($recurring_frequency)) { case 'daily' : $period = '+1 day'; break; case 'weekly' : $period = '+1 week'; break; case 'monthly' : $period = '+1 month'; break; case 'quarterly': $period = '+3 month'; break; case 'yearly' : $period = '+1 year'; break; default : $period = ''; } if (strtotime($currentRecurringDate) <= strtotime($currentDate)) { list($y, $m, $d) = explode('-', $last_recurring_date); $nextRecurringDate = date('Y-m-d', strtotime($period, mktime(0, 0, 0, $m, $d, $y))); } else { $nextRecurringDate = $currentRecurringDate; } if(strtotime($currentRecurringDate) == strtotime($currentDate)) { createInvoice($salesorder_id); } if(strtotime($nextRecurringDate) != strtotime($last_recurring_date)){ $adb->pquery('UPDATE vtiger_invoice_recurring_info SET last_recurring_date = ? WHERE salesorderid = ?', array($nextRecurringDate, $salesorder_id)); } } /* Function to create a new Invoice using the given Sales Order id */ function createInvoice($salesorder_id) { require_once('include/utils/utils.php'); require_once('modules/SalesOrder/SalesOrder.php'); require_once('modules/Invoice/Invoice.php'); require_once('modules/Users/Users.php'); global $log, $adb; global $current_user; // Payment duration in days $payment_duration_values = Array( 'net 01 day' => '1', 'net 05 days' => '5', 'net 07 days' => '7', 'net 10 days' => '10', 'net 15 days' => '15', 'net 30 days' => '30', 'net 45 days' => '45', 'net 60 days' => '60' ); if(!$current_user) { $current_user = Users::getActiveAdminUser(); } $so_focus = new SalesOrder(); $so_focus->id = $salesorder_id; $so_focus->retrieve_entity_info($salesorder_id,"SalesOrder"); foreach($so_focus->column_fields as $fieldname=>$value) { $so_focus->column_fields[$fieldname] = decode_html($value); } $focus = new Invoice(); // This will only fill in the basic columns from SO to Invoice and also Update the SO id in new Invoice $focus = getConvertSoToInvoice($focus,$so_focus,$salesorder_id); // Pick up the Payment due date based on the Configuration in SO $payment_duration = $so_focus->column_fields['payment_duration']; $due_duration = $payment_duration_values[trim(strtolower($payment_duration))]; $durationinsec = mktime(0,0,0,date('m'),date('d')+$due_duration,date('Y')); // Cleanup focus object, to duplicate the Invoice. $focus->id = ''; $focus->mode = ''; $focus->column_fields['invoicestatus'] = $so_focus->column_fields['invoicestatus']; $focus->column_fields['invoicedate'] = date('Y-m-d'); $focus->column_fields['duedate'] = date('Y-m-d', $durationinsec); // Additional SO fields to copy -> Invoice field name mapped to equivalent SO field name $invoice_so_fields = Array ( 'txtAdjustment' => 'txtAdjustment', 'hdnSubTotal' => 'hdnSubTotal', 'hdnGrandTotal' => 'hdnGrandTotal', 'hdnTaxType' => 'hdnTaxType', 'hdnDiscountPercent' => 'hdnDiscountPercent', 'hdnDiscountAmount' => 'hdnDiscountAmount', 'hdnS_H_Amount' => 'hdnS_H_Amount', 'assigned_user_id' => 'assigned_user_id', 'currency_id' => 'currency_id', 'conversion_rate' => 'conversion_rate', ); foreach($invoice_so_fields as $invoice_field => $so_field) { $focus->column_fields[$invoice_field] = $so_focus->column_fields[$so_field]; } $focus->_salesorderid = $salesorder_id; $focus->_recurring_mode = 'recurringinvoice_from_so'; $focus->save("Invoice"); } ?>