$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; }