diff --git a/modules/Migration/schema/720_to_721.php b/modules/Migration/schema/720_to_721.php
index 9722484025280ba8116b044003200765016b9b1d..906473c15d60136ab7037fd98edc9f578bcfe39d 100644
--- a/modules/Migration/schema/720_to_721.php
+++ b/modules/Migration/schema/720_to_721.php
@@ -231,6 +231,7 @@ if (defined('VTIGER_UPGRADE')) {
     $params = array('69', 'image');
     $db->pquery($sql, $params);
     
+    //add options to payment_duration field in SalesOrder module
     $moduleInstance = Vtiger_Module_Model::getInstance('SalesOrder');
     $fieldInstance = Vtiger_Field_Model::getInstance('payment_duration', $moduleInstance);
     $fieldInstance->setPicklistValues(array('Net 01 day', 'Net 05 days', 'Net 07 days', 'Net 10 days', 'Net 15 days'));
@@ -243,4 +244,18 @@ if (defined('VTIGER_UPGRADE')) {
     }
     $query .= ' ELSE sortorderid END';
     $db->pquery($query, array());
+    
+    //Create new read-only field to display the date of the next invoice creation in recurring sales orders.
+    $field  = new Vtiger_Field();
+    $field->name = 'last_recurring_date';
+    $field->label= 'Next Invoice Date';
+    $field->column = 'last_recurring_date';
+    $field->table = 'vtiger_invoice_recurring_info';
+    $field->displaytype = 2;
+    $field->uitype= 5;
+    $field->columntype = "date";
+    $field->typeofdata = 'D~O';
+    
+    $block = Vtiger_Block::getInstance('Recurring Invoice Information', $moduleInstance);
+    $block->addField($field);
 }
\ No newline at end of file
diff --git a/modules/SalesOrder/RecurringInvoiceHandler.php b/modules/SalesOrder/RecurringInvoiceHandler.php
index 36f40d2a43035b3beb3976a64c3f16483c72fcf2..f27c726683b0d20fb1a54cf1db7a6ffb46207dc0 100644
--- a/modules/SalesOrder/RecurringInvoiceHandler.php
+++ b/modules/SalesOrder/RecurringInvoiceHandler.php
@@ -12,39 +12,66 @@
 require_once('include/utils/utils.php');
 
 class RecurringInvoiceHandler extends VTEventHandler {
-	public function handleEvent($handlerType, $entityData){
-		global $log, $adb;
-		$moduleName = $entityData->getModuleName();
-		if ($moduleName == 'SalesOrder') {
-			$soId = $entityData->getId();
-			$data = $entityData->getData();
-			if($data['enable_recurring'] == 'on' || $data['enable_recurring'] == 1) {
-				$frequency = $data['recurring_frequency'];
-				$startPeriod = getValidDBInsertDateValue($data['start_period']);
-				$endPeriod = getValidDBInsertDateValue($data['end_period']);
-				$paymentDuration = $data['payment_duration'];
-				$invoiceStatus = $data['invoicestatus'];
-				if (isset($frequency) && $frequency != '' && $frequency != '--None--') {
-					$check_query = "SELECT * FROM vtiger_invoice_recurring_info WHERE salesorderid=?";
-					$check_res = $adb->pquery($check_query, array($soId));
-					$noofrows = $adb->num_rows($check_res);
-					if ($noofrows > 0) {
-						$row = $adb->query_result_rowdata($check_res, 0);
-						$query = "UPDATE vtiger_invoice_recurring_info SET recurring_frequency=?, start_period=?, end_period=?, payment_duration=?, invoice_status=? WHERE salesorderid=?";
-						$params = array($frequency,$startPeriod,$endPeriod,$paymentDuration,$invoiceStatus,$soId);
-					} else {
-						$query = "INSERT INTO vtiger_invoice_recurring_info VALUES (?,?,?,?,?,?,?)";
-						$params = array($soId,$frequency,$startPeriod,$endPeriod,$startPeriod,$paymentDuration,$invoiceStatus);
-					}
-					$adb->pquery($query, $params);
-				}
-			} else {
-				$query = "DELETE FROM vtiger_invoice_recurring_info WHERE salesorderid = ?";
-				$adb->pquery($query, array($soId));	
+	
+	private $entityData;
+	
+	public function handleEvent($handlerType, $entityData) {
+		$this->entityData = $entityData;
+	
+		if ($this->isSalesOrderModule()) {
+			$this->handleRecurringInvoiceGeneration();
+		}
+	}
+	
+	private function handleRecurringInvoiceGeneration() {
+		if ($this->isRecurringInvoiceEnabled()) {
+			if (empty($this->getNextInvoiceDate()) || $this->isStartDateAfterNextInvoiceDate()) {
+				$this->setNextInvoiceDateEqualsToStartDate();
 			}
+		} else {
+			$this->deleteRecurringInvoiceData();
 		}
 	}
-} 
-
-
-?>
\ No newline at end of file
+	
+	private function isStartDateAfterNextInvoiceDate()
+	{
+		$startPeriod = new DateTime($this->getStartDate());
+		$nextInvoiceDate = new DateTime($this->getNextInvoiceDate());
+		
+		return $startPeriod > $nextInvoiceDate;
+	}
+	
+	private function isSalesOrderModule() {
+		return $this->entityData->getModuleName() == 'SalesOrder';
+	}
+	
+	private function getStartDate()
+	{
+		$data = $this->entityData->getData();
+		return DateTimeField::convertToDBFormat($data['start_period']);
+	}
+	
+	private function getNextInvoiceDate() {
+		$data = $this->entityData->getData();
+		return $data['last_recurring_date'];
+	}
+	
+	private function isRecurringInvoiceEnabled() {
+		$data = $this->entityData->getData();
+		return !empty($data['enable_recurring']);
+	}
+	
+	private function setNextInvoiceDateEqualsToStartDate()
+	{
+		$db = PearDatabase::getInstance();
+		$query = "UPDATE vtiger_invoice_recurring_info SET last_recurring_date = start_period WHERE salesorderid = ?";
+		$db->pquery($query, [$this->entityData->getId()]);
+	}
+	
+	private function deleteRecurringInvoiceData()
+	{
+		$db = PearDatabase::getInstance();
+		$query = "DELETE FROM vtiger_invoice_recurring_info WHERE salesorderid = ?";
+		$db->pquery($query, [$this->entityData->getId()]);	
+	}
+}