$valid_from = validate($_POST['valid_from'], html_entity_decode($lng['service']['valid_from']), '/^(19|20)\\d\\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/', '', array('0000-00-00', '0', ''));
                $valid_to = validate($_POST['valid_to'], html_entity_decode($lng['service']['valid_to']), '/^(19|20)\\d\\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/', '', array('0000-00-00', '0', ''));
                if (isset($taxclasses[$_POST['taxclass']])) {
                    $taxclass = $_POST['taxclass'];
                } else {
                    $taxclass_keys = array_keys($taxclasses);
                    $taxclass = $taxclass_keys[0];
                    unset($taxclass_keys);
                }
                $interval_fee = doubleval(str_replace(',', '.', $_POST['interval_fee']));
                $interval_length = intval($_POST['interval_length']);
                $interval_type = in_array($_POST['interval_type'], getIntervalTypes('array')) ? $_POST['interval_type'] : 'm';
                $interval_payment = intval($_POST['interval_payment']);
                $setup_fee = doubleval(str_replace(',', '.', $_POST['setup_fee']));
                if ($interval_payment != '1') {
                    $interval_payment = '0';
                }
                $db->query('UPDATE `' . TABLE_BILLING_SERVICE_DOMAINS_TEMPLATES . '` SET `valid_from` = \'' . $db->escape($valid_from) . '\', `valid_to` = \'' . $db->escape($valid_to) . '\', `interval_fee` = \'' . $db->escape($interval_fee) . '\', `interval_length` = \'' . $db->escape($interval_length) . '\', `interval_type` = \'' . $db->escape($interval_type) . '\', `interval_payment` = \'' . $db->escape($interval_payment) . '\', `setup_fee` = \'' . $db->escape($setup_fee) . '\', `taxclass` = \'' . $db->escape($taxclass) . '\' WHERE `id` = \'' . $id . '\' ');
                redirectTo($filename, array('s' => $s));
            } else {
                $interval_type = getIntervalTypes('option', $result['interval_type']);
                $interval_payment = makeoption($lng['service']['interval_payment_prepaid'], '0', $result['interval_payment'], true) . makeoption($lng['service']['interval_payment_postpaid'], '1', $result['interval_payment'], true);
                $taxclasses_option = '';
                foreach ($taxclasses as $classid => $classname) {
                    $taxclasses_option .= makeoption($classname, $classid, $result['taxclass']);
                }
                eval('echo "' . getTemplate('billing/domains_templates_edit') . '";');
            }
        }
    }
}
 /**
  * This method collects the invoice rows.
  *
  * @param bool   Should we fix invoice (means we call self::setLastInvoiced to latest invoiced date).
  * @param bool   Should we include the setup fee?
  * @param bool   Should we include the interval fees?
  *
  * @return array All invoice rows
  *
  * @author Former03 GmbH :: Florian Lippert <*****@*****.**>
  */
 public function collect($fixInvoice = false, $include_setup_fee = false, $include_interval_fee = false)
 {
     $invoice = array();
     reset($this->service_details);
     foreach ($this->service_details as $serviceId => $service_detail) {
         if (checkDateArray(transferDateToArray($service_detail['servicestart_date'])) === true) {
             // Load template which is valid through our setup date
             $template = $this->findValidTemplate($service_detail['servicestart_date'], $this->selectAppropriateTemplateKey($service_detail));
             foreach ($this->defaultvalues as $field => $value) {
                 // We are using $this->service_details[$serviceId] instead of $service_detail so we can see the original values, as the "working copy" ($service_detail) could have been changed...
                 if ((!isset($this->service_details[$serviceId][$field]) || isset($this->service_details[$serviceId][$field]) && $this->service_details[$serviceId][$field] == $value) && isset($template[$field]) && $template[$field] != $value) {
                     $service_detail[$field] = $template[$field];
                 }
             }
             // If quantity is not set, we do need a value 1, otherwise this doesn't make sense...
             if (!isset($service_detail['quantity'])) {
                 $service_detail['quantity'] = 1;
             }
             // Add setup fee to invoice
             if (checkDateArray(transferDateToArray($service_detail['lastinvoiced_date'])) !== true || $this->allowLastInvoicedDatePastServiceStart === false && calculateDayDifference($service_detail['lastinvoiced_date'], $service_detail['servicestart_date']) > 0) {
                 if ($include_setup_fee === true) {
                     $invoice[] = $this->buildInvoiceRowSetupFee($service_detail, $this->getServiceDescription($service_detail, 'setup'));
                 }
                 $service_detail['lastinvoiced_date'] = $service_detail['servicestart_date'];
             }
             // If payment_every is not set, we do need a value 1, otherwise nextinvoiced_date wouldn't be calculated correctly and we'll get stuck in an infinite loop
             if (!isset($service_detail['payment_every'])) {
                 $service_detail['payment_every'] = 1;
             }
             if ((int) $service_detail['interval_length'] != 0 && (int) $service_detail['payment_every'] != 0 && in_array($service_detail['interval_type'], getIntervalTypes('array'))) {
                 $original_date = $service_detail['lastinvoiced_date'];
                 $service_detail['nextinvoiced_date'] = manipulateDate($service_detail['lastinvoiced_date'], '+', (int) $service_detail['interval_length'] * (int) $service_detail['payment_every'], $service_detail['interval_type'], $original_date);
                 while ($service_detail['interval_payment'] == CONST_BILLING_INTERVALPAYMENT_PREPAID && calculateDayDifference($service_detail['lastinvoiced_date'], time()) >= 0 && !($service_detail['service_active'] == '0' && calculateDayDifference($service_detail['lastinvoiced_date'], $service_detail['serviceend_date']) <= 0) || $service_detail['interval_payment'] == CONST_BILLING_INTERVALPAYMENT_POSTPAID && (calculateDayDifference($service_detail['nextinvoiced_date'], time()) >= 0 || $this->endServiceImmediately === true && $service_detail['service_active'] == '0' && calculateDayDifference($service_detail['lastinvoiced_date'], $service_detail['serviceend_date']) > 0 && calculateDayDifference($service_detail['serviceend_date'], $service_detail['nextinvoiced_date']) >= 0 && calculateDayDifference($service_detail['lastinvoiced_date'], time()) >= 0 && calculateDayDifference($service_detail['serviceend_date'], time()) >= 0)) {
                     // Reload template which is valid through our current invoice period
                     reset($this->defaultvalues);
                     $template = $this->findValidTemplate($service_detail['lastinvoiced_date'], $this->selectAppropriateTemplateKey($service_detail));
                     foreach ($this->defaultvalues as $field => $value) {
                         // We are using $this->service_details[$serviceId] instead of $service_detail so we can see the original values, as the "working copy" ($service_detail) could have been changed...
                         if ((!isset($this->service_details[$serviceId][$field]) || isset($this->service_details[$serviceId][$field]) && $this->service_details[$serviceId][$field] == $value) && isset($template[$field]) && $template[$field] != $value) {
                             $service_detail[$field] = $template[$field];
                         }
                     }
                     if ($this->endServiceImmediately === true && $service_detail['service_active'] == '0' && calculateDayDifference($service_detail['lastinvoiced_date'], $service_detail['serviceend_date']) > 0 && calculateDayDifference($service_detail['serviceend_date'], $service_detail['nextinvoiced_date']) >= 0 && calculateDayDifference($service_detail['lastinvoiced_date'], time()) >= 0 && calculateDayDifference($service_detail['serviceend_date'], time()) >= 0) {
                         $service_detail['nextinvoiced_date'] = $service_detail['serviceend_date'];
                     }
                     // Sanity check, shouldn't be needed...
                     if (calculateDayDifference($service_detail['lastinvoiced_date'], $service_detail['nextinvoiced_date']) >= 0) {
                         $service_detail['service_date_begin'] = $service_detail['lastinvoiced_date'];
                         $service_detail['service_date_end'] = $service_detail['nextinvoiced_date'];
                         if ($include_interval_fee === true) {
                             $invoice[] = $this->buildInvoiceRowIntervalFee($service_detail, $this->getServiceDescription($service_detail, 'interval'));
                         }
                     }
                     // Go on in loop, set lastinvoiced_date to nextinvoiced_date ...
                     $service_detail['lastinvoiced_date'] = $service_detail['nextinvoiced_date'];
                     // ... and recalculate nextinvoiced_date.
                     $service_detail['nextinvoiced_date'] = manipulateDate($service_detail['lastinvoiced_date'], '+', (int) $service_detail['interval_length'] * (int) $service_detail['payment_every'], $service_detail['interval_type'], $original_date);
                 }
             }
             if ($fixInvoice === true) {
                 $this->setLastInvoiced($serviceId, $service_detail);
             }
         }
     }
     return $invoice;
 }