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()]); + } +}