Exemplo n.º 1
0
		/**
			* Найти наиболее подходящую скидку для заказа $order
			* @param order $order заказ
			* @return orderDiscount самая подходящая скидка для заказа $order
		*/
		public static function search(order $order) {
			$cmsController = cmsController::getInstance();
			$emarket = $cmsController->getModule('emarket');

			if($emarket instanceof def_module == false) {
				throw new coreException('Emarket module must be installed in order to calculate discounts');
			}
			
			$allDiscounts = $emarket->getAllDiscounts('bonus');
			$discounts = array();
			foreach($allDiscounts as $discountObject) {
				$discount = discount::get($discountObject->id);
				if($discount instanceof bonusDiscount == false) continue;
				if($discount->validate($order)) $discounts[] = $discount;
			}
			
			switch(sizeof($discounts)) {
				case 0: return null;
				default:
					$orderPrice = $order->getOriginalPrice();
					$maxDiscount = null; $minPrice = null;
					foreach($discounts as $i => $discount) {
						$price = $discount->recalcPrice($orderPrice);
						if($price <= 0) continue;

						if(is_null($minPrice) || $minPrice > $price) {
							$minPrice = $price;
							$maxDiscount = $discount;
						}
					}
					return $maxDiscount;
			}
		}
Exemplo n.º 2
0
 /**
  * @covers mod_discount\discount::get_all_order_discount_not_register
  */
 public function testGet_all_order_discount_not_register()
 {
     $disc = $this->object->init()->get_all_order_discount_not_register();
     $this->assertEquals(null, $this->object->init()->discount_type['all_order'][0]['for_autorized']);
     $this->assertInternalType('array', $disc);
     $this->assertEquals(16, count($disc));
     $this->assertArrayHasKey('type_discount', $disc);
     $this->assertArrayHasKey('value', $disc);
     $this->assertEquals('all_order', $disc['type_discount']);
     $this->assertEquals(33, $disc['value']);
 }
Exemplo n.º 3
0
 /**
  * Найти наиболее оптимальную скидку для товара $element
  * @param iUmiHierarchyElement $element товар в каталоге
  * @return itemDiscount скидка на товар
  */
 public static final function search(iUmiHierarchyElement $element)
 {
     $cmsController = cmsController::getInstance();
     $emarket = $cmsController->getModule('emarket');
     if ($emarket instanceof def_module == false) {
         throw new privateException('Emarket module must be installed in order to calculate discounts');
     }
     $allDiscounts = $emarket->getAllDiscounts('item');
     $discounts = array();
     foreach ($allDiscounts as $discountObject) {
         $discount = discount::get($discountObject->id);
         if ($discount instanceof itemDiscount == false) {
             continue;
         }
         if ($discount->validate($element)) {
             $discounts[] = $discount;
         }
     }
     switch (sizeof($discounts)) {
         case 0:
             return null;
         default:
             $elementPrice = $element->price;
             $maxDiscount = null;
             $minPrice = null;
             foreach ($discounts as $i => $discount) {
                 $price = $discount->recalcPrice($elementPrice);
                 if ($price <= 0) {
                     continue;
                 }
                 if (is_null($minPrice) || $minPrice > $price) {
                     $minPrice = $price;
                     $maxDiscount = $discount;
                 }
             }
             return $maxDiscount;
     }
 }
Exemplo n.º 4
0
 function sweep($type)
 {
     $this->charge_construct();
     include_once PATH_MODULES . 'account_billing/account_billing.inc.php';
     $account_billing = new account_billing();
     include_once PATH_MODULES . 'tax/tax.inc.php';
     $taxObj = new tax();
     include_once PATH_MODULES . 'discount/discount.inc.php';
     $db =& DB();
     $sql = "SELECT DISTINCT\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.account_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.service_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.amount,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.taxable,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.attributes,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.quantity,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.product_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.description,  \n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.affiliate_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.reseller_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.country_id,\n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.currency_id, \n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.state \n\t\t\t\tFROM \n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge  \t\t\n\t\t\t\tLEFT JOIN \n\t\t\t\t\t" . AGILE_DB_PREFIX . "account \t\t\t\n\t\t\t\tON \n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.id \t\t = " . AGILE_DB_PREFIX . "charge.account_id \t\t\t\t\t\t\t\n\t\t\t\tWHERE  \n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.site_id \t = " . $db->qstr(DEFAULT_SITE) . " \n\t\t\t\tAND \n\t\t\t\t\t" . AGILE_DB_PREFIX . "account.site_id \t = " . $db->qstr(DEFAULT_SITE) . "\t\t\t\n\t\t\t\tAND\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.status \t = " . $db->qstr('0') . " \n\t\t\t\tAND\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.sweep_type = " . $db->qstr($type) . "\n\t\t\t\tORDER BY\n\t\t\t\t\t" . AGILE_DB_PREFIX . "charge.account_id";
     $rs = $db->Execute($sql);
     if ($rs === false) {
         global $C_debug;
         $C_debug->error('charge.inc.php', 'charge :: sweep()', $db->ErrorMsg() . "\r\n\r\n" . $sql);
         return false;
     }
     $account_id = false;
     $invoice_id = false;
     $i = false;
     $i_total = false;
     $invoice_count = 0;
     $sweep_count = 0;
     while (!$rs->EOF) {
         if ($rs->fields['account_id'] != $account_id) {
             $account_id = $rs->fields['account_id'];
             $i = 0;
             $i_total = $this->count_account_charges($account_id, $rs->CurrentRow(), $rs);
             $sub_total = 0;
             $taxable_amount = 0;
             $this_discount_total = 0;
             $tax_amt = 0;
             $discount_amt = 0;
             # Start a new transaction
             $trans =& DB();
             $trans->StartTrans();
             # Start a new invoice
             $invoice_id = $db->GenID(AGILE_DB_PREFIX . 'invoice_id');
             # check for any discounts for the parent invoice or account_id (applied at checkout and should continue to be applied if recurring type discount)
             $discountObj = new discount();
             # get parent invoice id if service specified (for discount checking)
             $parent_invoice_id = false;
             if ($rs->fields['service_id']) {
                 $parentinv = $db->Execute(sqlSelect($db, "service", "invoice_id", "id={$rs->fields['service_id']}"));
                 if ($parentinv && $parentinv->RecordCount()) {
                     $parent_invoice_id = $parentinv->fields['invoice_id'];
                 }
             }
             # get available discounts to this account/service
             $discountObj->available_discounts($account_id, 1, $parent_invoice_id);
         }
         ###########################
         ##### LINE ITEM ACTIONS ###
         ###########################
         if (!empty($account_id)) {
             ### Get the line item id
             $invoice_item_id = $db->GenID(AGILE_DB_PREFIX . 'invoice_item_id');
             ### Set the invoice item details:
             $product_id = $rs->fields['product_id'];
             if (!empty($product_id) && empty($this->product["{$product_id}"])) {
                 $sql = "SELECT sku FROM " . AGILE_DB_PREFIX . "product WHERE  \n\t\t\t\t\t\t\tid \t= " . $db->qstr($product_id) . " AND\n\t\t\t\t\t\t\tsite_id = " . $db->qstr(DEFAULT_SITE);
                 $prod = $db->Execute($sql);
                 if ($prod->RecordCount() > 0) {
                     $sku = $prod->fields['sku'];
                     $this->product["{$product_id}"] = $sku;
                     $product_attr = '';
                     if (!empty($rs->fields['description'])) {
                         $product_attr = "Description=={$rs->fields['description']}\r\n";
                     }
                     $product_attr .= $rs->fields['attributes'];
                 } else {
                     $sku = $rs->fields['description'];
                     $this->product["{$product_id}"] = $sku;
                     $product_attr = $rs->fields['attributes'];
                 }
             } elseif (!empty($this->product["{$product_id}"])) {
                 $sku = $this->product["{$product_id}"];
                 $product_attr = $rs->fields['attributes'];
             } else {
                 $sku = $rs->fields['description'];
                 $product_attr = $rs->fields['attributes'];
             }
             $quantity = $rs->fields['quantity'];
             $price_base = $rs->fields['amount'];
             $item_total_amt = $price_base * $quantity;
             // Calculate any recurring discounts for this account
             $item_discount_amt = $discountObj->calc_all_discounts(1, $invoice_item_id, $rs->fields['product_id'], $item_total_amt, $account_id, $sub_total + $item_total_amt);
             $item_total_amt -= $item_discount_amt;
             $sub_total += $item_total_amt;
             $discount_amt += $item_discount_amt;
             # calculate any taxes for this item
             $item_tax_amt = 0;
             if ($rs->fields['taxable']) {
                 $item_tax_arr = $taxObj->calculate($item_total_amt, $rs->fields['country_id'], $rs->fields['state']);
                 if (is_array($item_tax_arr)) {
                     foreach ($item_tax_arr as $tx) {
                         $item_tax_amt += $tx['rate'];
                     }
                 }
                 $tax_amt += $item_tax_amt;
             }
             ### Add line item to new invoice
             $sql = "INSERT INTO " . AGILE_DB_PREFIX . "invoice_item SET\n\t\t\t\t\t\tid\t\t\t\t\t    = " . $db->qstr($invoice_item_id) . ",\n\t\t\t\t\t\tsite_id\t\t\t\t    = " . $db->qstr(DEFAULT_SITE) . ",\n\t\t\t\t\t\tinvoice_id\t\t\t    = " . $db->qstr($invoice_id) . ",\n\t\t\t\t\t\taccount_id\t\t\t\t= " . $db->qstr($account_id) . ",\n\t\t\t\t\t\tdate_orig\t\t\t    = " . $db->qstr(time()) . ",\n\t\t\t\t\t\tproduct_id\t\t\t    = " . $db->qstr($product_id) . ",\n\t\t\t\t\t\tsku\t\t\t\t\t    = " . $db->qstr($sku) . ",\n\t\t\t\t\t\tquantity\t\t\t    = " . $db->qstr($quantity) . ",\n\t\t\t\t\t\titem_type\t\t\t    = " . $db->qstr('0') . ",\n\t\t\t\t\t\tproduct_attr\t\t    = " . $db->qstr($product_attr) . ", \n\t\t\t\t\t\tprice_type              = " . $db->qstr('0') . ",\n\t\t\t\t\t\tprice_base\t\t\t    = " . $db->qstr($price_base) . ",\n\t\t\t\t\t\tprice_setup\t\t\t    = " . $db->qstr(0) . ",\n\t\t\t\t\t\ttax_amt\t\t\t\t\t= " . $db->qstr($item_tax_amt) . ",\n\t\t\t\t\t\ttotal_amt\t\t\t\t= " . $db->qstr($item_total_amt) . ",\n\t\t\t\t\t\tdiscount_amt\t\t\t= " . $db->qstr($item_discount_amt);
             $trans->Execute($sql);
             # Insert tax records
             $taxObj->invoice_item($invoice_id, $invoice_item_id, $account_id, @$item_tax_arr);
             # Insert discount records
             $discountObj->invoice_item($invoice_id, $invoice_item_id, $account_id);
             ### Update this charge status to billed
             $sql = "UPDATE " . AGILE_DB_PREFIX . "charge SET\n\t\t\t\t\t\tstatus   \t= " . $db->qstr('1') . " \n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\tsite_id\t    = " . $db->qstr(DEFAULT_SITE) . " AND \n\t\t\t\t\t\tid\t\t    = " . $db->qstr($rs->fields['id']);
             $trans->Execute($sql);
             $i++;
             $sweep_count++;
         }
         #######################
         ### INVOICE ACTIONS ###
         #######################
         if ($i_total == $i || $i == $rs->RecordCount()) {
             if ($invoice_id) {
                 ### Get the most recent billing id for this client:
                 if (!isset($billing_id["{$account_id}"])) {
                     $billing_arr = $account_billing->default_billing($account_id);
                     $billing_id["{$account_id}"] = $billing_arr['billing_id'];
                     $checkout_plugin_id["{$account_id}"] = $billing_arr['checkout_plugin_id'];
                 }
                 ### Affiliate & Reseller info:
                 $affiliate_id = $rs->fields['affiliate_id'];
                 $reseller_id = $rs->fields['reseller_id'];
                 $actual_billed_currency_id = $rs->fields['currency_id'];
                 # calculate any taxes
                 @($total = $sub_total + $tax_amt);
                 if ($total <= 0) {
                     $process_status = 1;
                     $billing_status = 1;
                 } else {
                     $process_status = 0;
                     $billing_status = 0;
                 }
                 ### Generate the invoice insert SQL:
                 $sql = "INSERT INTO " . AGILE_DB_PREFIX . "invoice SET\n\t\t\t\t\t\t\t\tid\t\t\t\t\t\t\t= " . $db->qstr($invoice_id) . ",\n\t\t\t\t\t\t\t\tsite_id\t\t\t\t\t\t= " . $db->qstr(DEFAULT_SITE) . ",\n\t\t\t\t\t\t\t\tdate_orig\t\t\t\t\t= " . $db->qstr(time()) . ",\n\t\t\t\t\t\t\t\tdate_last\t\t\t\t\t= " . $db->qstr(time()) . ",\n\t\t\t\t\t\t\t\tprocess_status\t\t\t\t= " . $db->qstr($process_status) . ",\n\t\t\t\t\t\t\t\tbilling_status\t\t\t\t= " . $db->qstr($billing_status) . ",\n\t\t\t\t\t\t\t\tprint_status\t\t\t\t= " . $db->qstr('0') . ",\n\t\t\t\t\t\t\t\taccount_id\t\t\t\t\t= " . $db->qstr($account_id) . ",\n\t\t\t\t\t\t\t\taccount_billing_id\t\t\t= " . $db->qstr($billing_id["{$account_id}"]) . ",\n\t\t\t\t\t\t\t\taffiliate_id\t\t\t\t= " . $db->qstr($affiliate_id) . ",\n\t\t\t\t\t\t\t\treseller_id\t\t\t\t\t= " . $db->qstr($reseller_id) . ",\n\t\t\t\t\t\t\t\tcheckout_plugin_id\t\t\t= " . $db->qstr($checkout_plugin_id["{$account_id}"]) . ",  \n\t\t\t\t\t\t\t\ttax_amt\t\t\t\t\t\t= " . $db->qstr($tax_amt) . ", \n\t\t\t\t\t\t\t\tdiscount_amt\t\t\t\t= " . $db->qstr($discount_amt) . ",\n\t\t\t\t\t\t\t\tactual_billed_currency_id\t= " . $db->qstr($actual_billed_currency_id) . ",\n\t\t\t\t\t\t\t\tactual_billed_amt\t\t\t= " . $db->qstr('0') . ",\n\t\t\t\t\t\t\t\tbilled_currency_id\t\t\t= " . $db->qstr(DEFAULT_CURRENCY) . ",\n\t\t\t\t\t\t\t\tbilled_amt\t\t\t\t\t= " . $db->qstr('0') . ",\n\t\t\t\t\t\t\t\ttotal_amt\t\t\t\t\t= " . $db->qstr($total) . ",\n\t\t\t\t\t\t\t\tnotice_count\t\t\t\t= " . $db->qstr('0') . ",\n\t\t\t\t\t\t\t\tnotice_max\t\t\t\t\t= " . $db->qstr(MAX_BILLING_NOTICE) . ",\n\t\t\t\t\t\t\t\tnotice_next_date\t\t\t= " . $db->qstr(time()) . ",\n\t\t\t\t\t\t\t\tgrace_period\t\t\t\t= " . $db->qstr(GRACE_PERIOD) . ",\n\t\t\t\t\t\t\t\tdue_date\t\t\t\t\t= " . $db->qstr(time());
                 $trans->Execute($sql);
                 ### Close this transaction
                 $trans->CompleteTrans();
                 $i_total = false;
                 $i = false;
                 $account_id = false;
                 $invoice_id = false;
                 $discount = false;
                 $cookie = false;
                 $invoice_count++;
             }
         }
         $rs->MoveNext();
     }
     global $C_debug;
     $C_debug->alert("Swept {$sweep_count} Charge(s) into {$invoice_count} Invoice(s).");
     return true;
 }
Exemplo n.º 5
0
 function list_DiscountsById($id)
 {
     $query = $this->con->genericQuery("select * from " . $this->table . " where _id in ({$id})");
     $objReturn = array();
     foreach ($query as $value) {
         $discount = new discount();
         $discount->open($value);
         $objReturn[] = $discount;
     }
     return $objReturn;
 }
Exemplo n.º 6
0
<?php

//TODO: Include subclasses here...
$config = mainConfiguration::getInstance();
$includePath = CURRENT_WORKING_DIR . '/classes/modules/emarket/classes';
require $includePath . '/discounts/discount.php';
require $includePath . '/discounts/discountModificator.php';
require $includePath . '/discounts/discountRule.php';
discount::init();
require $includePath . '/orders/order.php';
require $includePath . '/orders/orderItem.php';
require $includePath . '/orders/number/' . $config->get('modules', 'emarket.numbers') . '.php';
require $includePath . '/currency/currencyUpdater.php';
require $includePath . '/delivery/delivery.php';
require $includePath . '/payment/payment.php';
require $includePath . '/customer/customer.php';
require $includePath . '/stores/stores.php';
require $includePath . '/social/social_callbacks_handler.php';
require $includePath . '/wishlist/wishlist.php';
interface iOrderStep
{
    public function renderStep();
    public function executeStep();
}
interface iOrderNumber
{
    public function __construct(order $order);
    public function number();
}
Exemplo n.º 7
0
		</ol>
		<!-- End breadcrumb -->
		
		<div class="panel panel-info">
		  <div class="panel-heading">
		  	<div class="right-content">
				<a href="add_discount.php"><button class="btn btn-success btn-perspective btn-lg pull-right">ADD PRODUCT DISCOUNT</button></a>
			</div>
			<h3>View Discount</h3>
		  </div>
		  <div class="panel-body">
			<!-- BEGIN DATA TABLE -->
			<div class="the-box">
				<div class="table-responsive">
					<?php 
$discount = new discount();
$results = $discount->get_products();
if ($results) {
    ?>
						<table class="table table-striped table-hover" id="datatable-example">
							<thead class="the-box dark full">
								<tr>
									<th>Name</th>
									<th>Discount Type</th>
									<th>Discount Amount</th>
									<th>Min Purchase</th>
									<th>Status</th>
								</tr>
							</thead>
							<tbody>
								<?php 
Exemplo n.º 8
0
<?php

require_once "../config.php";
verify_access($list_modules);
$discAdd = false;
$discUpd = false;
$discDel = false;
$newDisc = new discount();
$country = new country();
if ($_POST['action'] == 'Save') {
    if (isset($_POST['hdIdAct'])) {
        if ($_POST['hdIdAct'] == "") {
            $newDisc->save($company->id, $_POST['code'], $_POST['percent'], $_POST['condition_start'], $_POST['condition_end']);
            $discAdd = true;
        } else {
            $newDisc->open($_POST['hdIdAct']);
            $newDisc->save($company->id, $_POST['code'], $_POST['percent'], $_POST['condition_start'], $_POST['condition_end']);
            $discUpd = true;
        }
    }
}
if ($_POST['action'] == 'Delete') {
    if (isset($_POST['hdIdDE'])) {
        $newDisc->open($_POST['hdIdDE']);
        $newDisc->del();
        $discDel = true;
    }
}
$list_discounts = $newDisc->list_discounts($company->id);
$country->open($company->fk_country);
?>
Exemplo n.º 9
0
<section>
	<hr/>
	<div class="container">
		<div class="row">
			<div class="tableHeading">
				<p class="nomargin alignCenter"><?php 
echo isset($_GET['id']) ? 'Update' : 'Add';
?>
 Discount</p>
			</div>
			
			<?php 
$product = new product();
$all_product = $product->get_product();
$discount = new discount();
$ID = isset($_GET['id']) ? $_GET['id'] : NULL;
if (isset($_POST['add_discount'])) {
    // Update old record
    if (isset($ID)) {
        $results = $discount->update_discount($_POST, $ID);
    } else {
        // Insert new
        $results = $discount->insert_discount($_POST);
    }
    if ($results) {
        echo '<div class="alert alert-success" role="alert"> Add Discount Sucessfully </div>';
    } else {
        echo '<div class="alert alert-danger" role="alert"> Error </div>';
    }
}
Exemplo n.º 10
0
 function generateInvoices($ids, $account_id, $invoice_id, $charge_installed = false)
 {
     if (empty($ids)) {
         return false;
     }
     # load required elements
     include_once PATH_MODULES . 'service/service.inc.php';
     include_once PATH_MODULES . 'discount/discount.inc.php';
     include_once PATH_MODULES . 'tax/tax.inc.php';
     $taxObj = new tax();
     $serviceObj = new service();
     # start a transaction
     $db =& DB();
     #$db->debug=true;
     if (AGILE_DB_TYPE == 'mysqlt') {
         $db->StartTrans();
         if (!$db->hasTransactions) {
             global $C_debug;
             $msg = "Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver";
             $C_debug->alert($msg);
             $C_debug->error('invoice.inc.php', 'generateInvoices()', "Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
             return false;
         }
     }
     # generate an invoice id
     $invoice = sqlGenID($db, 'invoice');
     # check for any discounts for the parent invoice or account_id
     # applied at checkout and should continue to be applied if recurring type discount
     $discountObj = new discount();
     $discountObj->available_discounts($account_id, 1, $invoice_id);
     # beginning totals
     $sub_total = 0;
     $taxable_amount = 0;
     $tax_amt = 0;
     $discount_amt = 0;
     # get the full account and service and invoice details
     $p = AGILE_DB_PREFIX;
     $s = DEFAULT_SITE;
     $sql = "SELECT DISTINCT \n\t\tservice.id, service.parent_id, service.invoice_id, service.invoice_item_id, service.account_id, service.account_billing_id, service.product_id,\n\t\tservice.sku, service.active, service.bind, service.type, service.price, service.price_type, service.taxable, service.date_last_invoice, service.date_next_invoice,\n\t\tservice.recur_type, service.recur_schedule, service.recur_weekday, service.recur_week, service.domain_name,\n\t\tservice.domain_tld, service.domain_type, service.domain_term, service.prod_attr, service.prod_attr_cart,\n\t\taccount.currency_id, account.first_name, account.last_name, account.country_id, account.state, account.invoice_grace, account.invoice_advance_gen, account.affiliate_id as account_affiliate_id,\n\t\tinvoice.affiliate_id, invoice.campaign_id, invoice.reseller_id, invoice.checkout_plugin_id, invoice.checkout_plugin_data, invoice.billed_currency_id, invoice.actual_billed_currency_id \n\t\tFROM {$p}service as service \n\t\tJOIN {$p}account as account ON ( service.account_id=account.id and account.site_id={$s} )\n\t\tLEFT JOIN {$p}invoice as invoice ON ( service.invoice_id=invoice.id and invoice.site_id={$s} )\n\t\tWHERE service.id in ({$ids})";
     $service = $db->Execute($sql);
     if ($service === false) {
         global $C_debug;
         $C_debug->error('invoice.inc.php', 'generateInvoices()1', $sql . " \r\n\r\n " . @$db->ErrorMsg());
         $db->FailTrans();
         return false;
     }
     if ($service && $service->RecordCount()) {
         while (!$service->EOF) {
             if (empty($service->fields['billed_currency_id'])) {
                 $service->fields['billed_currency_id'] = DEFAULT_CURRENCY;
             }
             if (empty($service->fields['actual_billed_currency_id'])) {
                 $service->fields['actual_billed_currency_id'] = $service->fields['billed_currency_id'];
             }
             $this->account_id = $service->fields['account_id'];
             $this->parent_id = $service->fields['invoice_id'];
             $this->account_billing_id = $service->fields['account_billing_id'];
             if (!empty($service->fields['account_affiliate_id'])) {
                 $this->affiliate_id = $service->fields['account_affiliate_id'];
             } else {
                 $this->affiliate_id = $service->fields['affiliate_id'];
             }
             $this->campaign_id = $service->fields['campaign_id'];
             $this->reseller_id = $service->fields['reseller_id'];
             $this->checkout_plugin_id = $service->fields['checkout_plugin_id'];
             $this->checkout_plugin_data = $service->fields['checkout_plugin_data'];
             $this->billed_currency_id = $service->fields['billed_currency_id'];
             $this->actual_billed_currency_id = $service->fields['actual_billed_currency_id'];
             $this->invoice_grace = $service->fields['invoice_grace'];
             $item_tax_amt = 0;
             $item_total_amt = 0;
             $item_discount_amt = 0;
             # gen item_id
             $item = sqlGenID($db, "invoice_item");
             # Calculate any recurring discounts for this item
             $item_total_amt = $service->fields['price'];
             $item_discount_amt = $discountObj->calc_all_discounts(1, $item, $service->fields['product_id'], $service->fields['price'], $service->fields['account_id'], $sub_total + $service->fields['price']);
             $item_total_amt -= $item_discount_amt;
             $sub_total += $item_total_amt;
             $discount_amt += $item_discount_amt;
             # calculate any taxes for this item
             if ($service->fields['taxable'] == 1) {
                 $item_tax_amt = 0;
                 $item_tax_arr = $taxObj->calculate($item_total_amt, $service->fields['country_id'], $service->fields['state']);
                 if (is_array($item_tax_arr)) {
                     foreach ($item_tax_arr as $tx) {
                         $item_tax_amt += $tx['rate'];
                     }
                 }
                 $tax_amt += $item_tax_amt;
             }
             # Calculate next invoice date
             $next_invoice = $serviceObj->calcNextInvoiceDate($service->fields['date_next_invoice'], $service->fields['recur_schedule'], $service->fields['recur_type'], $service->fields['recur_weekday']);
             $due_date = $service->fields['date_next_invoice'];
             $recur_schedule = 0;
             if (!empty($service->fields['recur_schedule'])) {
                 $recur_schedule = $service->fields['recur_schedule'];
             }
             // create the invoice item
             $sql = "INSERT INTO {$p}invoice_item SET\n\t\t\t\t\tid={$item},\n\t\t\t\t\tsite_id={$s}, \n\t\t\t\t\tdate_orig=" . time() . ", \n\t\t\t\t\tinvoice_id = {$invoice}, \n\t\t\t\t\taccount_id={$service->fields['account_id']}, \n\t\t\t\t\tservice_id={$service->fields['id']}, \t\n\t\t\t\t\tproduct_id={$service->fields['product_id']}, \n\t\t\t\t\tproduct_attr=" . $db->qstr($service->fields['prod_attr']) . ", \n\t\t\t\t\tproduct_attr_cart=" . $db->qstr($service->fields['prod_attr_cart']) . ", \t\n\t\t\t\t\tsku=" . $db->qstr($service->fields['sku']) . ", \n\t\t\t\t\tquantity=1, \n\t\t\t\t\titem_type=0, \n\t\t\t\t\tprice_type={$service->fields['price_type']}, \n\t\t\t\t\tprice_base={$service->fields['price']}, \n\t\t\t\t\tprice_setup=0, \n\t\t\t\t\trecurring_schedule={$recur_schedule}, \n\t\t\t\t\tdate_start={$service->fields['date_next_invoice']}, \n\t\t\t\t\tdate_stop={$next_invoice}, \n\t\t\t\t\tdomain_name=" . $db->qstr($service->fields['domain_name']) . ", \n\t\t\t\t\tdomain_tld=" . $db->qstr($service->fields['domain_tld']) . ", \n\t\t\t\t\tdomain_type=" . $db->qstr($service->fields['domain_type']) . ", \n\t\t\t\t\ttax_amt={$tax_amt}, \n\t\t\t\t\ttotal_amt={$item_total_amt}, \n\t\t\t\t\tdiscount_amt={$item_discount_amt}";
             $itemrs = $db->Execute($sql);
             if ($itemrs === false) {
                 global $C_debug;
                 $C_debug->error('invoice.inc.php', 'generateInvoices()2', $sql . " \r\n\r\n " . @$db->ErrorMsg());
                 $db->FailTrans();
                 return false;
             }
             // Insert tax records
             $taxObj->invoice_item($invoice, $item, $service->fields['account_id'], @$item_tax_arr);
             # Insert discount records
             $discountObj->invoice_item($invoice, $item, $service->fields['account_id'], @$discountObj->discount_arr);
             // Update the last & next invoice date for this service
             $sql = "UPDATE {$p}service \n\t\t\t\t\tSET \n\t\t\t\t\tdate_last_invoice = {$service->fields['date_next_invoice']}, \n\t\t\t\t\tdate_next_invoice = {$next_invoice} \n\t\t\t\t\tWHERE\n\t\t\t\t\tsite_id={$s} AND id = {$service->fields['id']} ";
             $srvsrs = $db->Execute($sql);
             if ($srvsrs === false) {
                 global $C_debug;
                 $C_debug->error('invoice.inc.php', 'generateInvoices()3', $sql . " \r\n\r\n " . @$db->ErrorMsg());
                 $db->FailTrans();
                 return false;
             }
             // get any charges for this service and create them as invoice items
             if ($charge_installed) {
                 $sql = "SELECT * FROM " . AGILE_DB_PREFIX . "charge WHERE (status=0 or status is null) and site_id=" . DEFAULT_SITE . " AND service_id = " . $service->fields['id'] . " AND date_orig < " . $service->fields['date_next_invoice'];
                 $charge = $db->Execute($sql);
                 if ($charge && $charge->RecordCount()) {
                     while (!$charge->EOF) {
                         $item_tax_amt = 0;
                         $item_total_amt = 0;
                         $item_discount_amt = 0;
                         // Calculate any recurring discounts for this charge item
                         $item_total_amt = $charge->fields['quantity'] * $charge->fields['amount'];
                         $item_discount_amt = $discountObj->calc_all_discounts(1, $item, $charge->fields['product_id'], $item_total_amt, $service->fields['account_id'], $sub_total + $item_total_amt);
                         $item_total_amt -= $item_discount_amt;
                         $sub_total += $item_total_amt;
                         $discount_amt += $item_discount_amt;
                         // calculate any taxes for this item
                         if ($charge->fields['taxable'] == 1) {
                             $item_tax_amt = 0;
                             $item_tax_arr = $taxObj->calculate($chargeamt, $service->fields['country_id'], $service->fields['state']);
                             if (is_array($item_tax_arr)) {
                                 foreach ($item_tax_arr as $tx) {
                                     $item_tax_amt += $tx['rate'];
                                 }
                             }
                             $tax_amt += $item_tax_amt;
                         }
                         // create the invoice item
                         $charge_item_id = sqlGenID($db, 'invoice_item');
                         $sql = "INSERT INTO {$p}invoice_item SET \n\t\t\t\t\t\t\t\tid\t\t\t= {$charge_item_id},\t\t\n\t\t\t\t\t\t\t\tsite_id\t\t= {$s},\n\t\t\t\t\t\t\t\tcharge_id\t= {$charge->fields['id']},\n\t\t\t\t\t\t\t\tdate_orig \t= " . time() . ",\n\t\t\t\t\t\t\t\tinvoice_id \t= {$invoice}, \n\t\t\t\t\t\t\t\taccount_id \t= " . $this->account_id . ", \n\t\t\t\t\t\t\t\tservice_id \t= " . $db->qstr($service->fields['id']) . ",\n\t\t\t\t\t\t\t\tproduct_id \t= " . $db->qstr($charge->fields['product_id']) . ", \n\t\t\t\t\t\t\t\tproduct_attr= " . $db->qstr($charge->fields['attributes']) . ",  \t\n\t\t\t\t\t\t\t\tsku \t\t= " . $db->qstr($service->fields['sku']) . ", \n\t\t\t\t\t\t\t\tprice_base \t= " . $db->qstr($charge->fields['amount']) . ", \n\t\t\t\t\t\t\t\tquantity \t= " . $charge->fields['quantity'] . ",  \n\t\t\t\t\t\t\t\titem_type \t= 5,\n\t\t\t\t\t\t\t\tprice_type \t= 0,\n\t\t\t\t\t\t\t\tprice_setup = 0,  \n\t\t\t\t\t\t\t\ttax_amt \t= {$item_tax_amt}, \n\t\t\t\t\t\t\t\ttotal_amt \t= {$item_total_amt}, \n\t\t\t\t\t\t\t\tdiscount_amt= {$item_discount_amt}";
                         $itemrs = $db->Execute($sql);
                         if ($itemrs === false) {
                             global $C_debug;
                             $C_debug->error('invoice.inc.php', 'generateInvoices()4', $sql . " \r\n\r\n " . @$db->ErrorMsg());
                             $db->FailTrans();
                             return false;
                         }
                         # Insert tax records
                         $taxObj->invoice_item($invoice, $charge_item_id, $charge->fields['account_id'], @$item_tax_arr);
                         # Insert discount records
                         $discountObj->invoice_item($invoice, $charge_item_id, $charge->fields['account_id'], @$discountObj->discount_arr);
                         # update charge status
                         $chargers = $db->Execute("UPDATE " . AGILE_DB_PREFIX . "charge set status=1 WHERE id={$charge->fields['id']} AND site_id=" . DEFAULT_SITE);
                         if ($chargers === false) {
                             global $C_debug;
                             $C_debug->error('invoice.inc.php', 'generateInvoices()2', $sql . " \r\n\r\n " . @$db->ErrorMsg());
                             $db->FailTrans();
                             return false;
                         }
                         $charge->MoveNext();
                     }
                 }
             }
             $service->MoveNext();
         }
         // add any taxes
         @($total = $sub_total + $tax_amt);
         // get invoice grace period from global/account
         if (!empty($this->invoice_grace)) {
             $grace_period = $this->invoice_grace;
         } else {
             $grace_period = GRACE_PERIOD;
         }
         $sql = "INSERT INTO {$p}invoice SET \n\t\t\t\tid={$invoice},\n\t\t\t\tsite_id={$s},\n\t\t\t\tdate_orig = " . time() . ", \n\t\t\t\tdate_last = " . time() . ",  \n\t\t\t\tnotice_next_date = " . time() . ",\n\t\t\t\ttype = 1, \n\t\t\t\tprocess_status = 0, \n\t\t\t\tbilling_status = 0, \n\t\t\t\tsuspend_billing = 0, \n\t\t\t\tprint_status = 0, \n\t\t\t\trefund_status = 0, \n\t\t\t\tbilled_amt = 0, \n\t\t\t\tactual_billed_amt = 0, \n\t\t\t\tnotice_count = 0, \n\t\t\t\tparent_id = " . $db->qstr($this->parent_id) . ",\n\t\t\t\taccount_id = {$this->account_id},  \n\t\t\t\taccount_billing_id = " . $db->qstr($this->account_billing_id) . ",\n\t\t\t\taffiliate_id = " . $db->qstr($this->affiliate_id) . ",\n\t\t\t\tcampaign_id = " . $db->qstr($this->campaign_id) . ",\n\t\t\t\treseller_id = " . $db->qstr($this->reseller_id) . ",\n\t\t\t\tcheckout_plugin_id = " . $db->qstr($this->checkout_plugin_id) . ",\n\t\t\t\tcheckout_plugin_data = " . $db->qstr($this->checkout_plugin_data) . ",\n\t\t\t\tactual_billed_currency_id = " . $db->qstr($this->actual_billed_currency_id) . ",\n\t\t\t\tbilled_currency_id = " . $db->qstr($this->billed_currency_id) . ",\n\t\t\t\tnotice_max = " . $db->qstr(MAX_BILLING_NOTICE) . ",  \n\t\t\t\tgrace_period = " . $db->qstr($grace_period) . ",\n\t\t\t\ttax_amt = " . $tax_amt . ",  \n\t\t\t\tdiscount_amt = " . $discount_amt . ",  \n\t\t\t\ttotal_amt = " . $total . ",     \n\t\t\t\tdue_date = {$due_date}";
         $invoicers = $db->Execute($sql);
         if ($invoicers === false) {
             global $C_debug;
             $C_debug->error('invoice.inc.php', 'generateInvoices()2', $sql . " \r\n\r\n " . @$db->ErrorMsg());
             $db->FailTrans();
             return false;
         }
     }
     if (AGILE_DB_TYPE == 'mysqlt') {
         $db->CompleteTrans();
     }
 }
Exemplo n.º 11
0
 /**
  * Назначить скидку на заказ
  * @param discount $discount скидка на заказ
  */
 public function setDiscount(discount $discount = null)
 {
     if ($discount && $discount->validate($this) == false) {
         $discount = null;
     }
     $this->discount = $discount;
 }
Exemplo n.º 12
0
 /**
  * Create the Invoice Record and send user to checkout	 
  */
 function checkoutnow($VAR)
 {
     global $C_translate, $C_list, $smarty;
     $db =& DB();
     // Validate user is logged in:
     if (!SESS_LOGGED) {
         echo '<script language="JavaScript">alert("You must be logged in to complete this purchase! Please refresh this page in your browser to login now...");</script>';
         return false;
     }
     // check for admin
     if (!$this->admin_checkout && !empty($VAR['account_id'])) {
         global $C_auth;
         if (!empty($VAR['account_id']) && $C_auth->auth_method_by_name('checkout', 'admin_checkoutnow')) {
             $this->account_id = $VAR['account_id'];
             $this->admin_checkout = true;
         } else {
             $this->account_id = SESS_ACCOUNT;
         }
     }
     if (empty($this->session_id)) {
         $this->session_id = SESS;
     }
     if (empty($this->account_id)) {
         $this->account_id = SESS_ACCOUNT;
     }
     include_once PATH_MODULES . '/cart/cart.inc.php';
     $cartObj = new cart();
     $cartObj->account_id = $this->account_id;
     $cartObj->session_id = $this->session_id;
     $result = $cartObj->get_contents($db);
     if ($result->RecordCount() == 0) {
         return false;
     }
     // load invoice object
     include_once PATH_MODULES . 'invoice/invoice.inc.php';
     $invoice = new invoice();
     $invoice->account_id = $this->account_id;
     $invoice->initNew(0);
     // Get the account details:
     $account = $db->Execute(sqlSelect($db, "account", "*", "id=::{$this->account_id}::"));
     $invoice->country_id = $account->fields['country_id'];
     $invoice->state = $account->fields['state'];
     // load tax object for tax calculation
     include_once PATH_MODULES . 'tax/tax.inc.php';
     $taxObj = new tax();
     // load discount object for discount calculation
     include_once PATH_MODULES . 'discount/discount.inc.php';
     $discountObj = new discount();
     $discountObj->available_discounts($invoice->account_id);
     // put cart contents into invoice format
     $cartObj->put_contents_invoice($db, $result, $invoice, $smart, $taxObj, $discountObj);
     // Validate and init a checkout plugin
     $checkout = false;
     if ($this->admin_checkout_option) {
         // admin checkout option specified
         include_once PATH_MODULES . 'checkout/checkout_admin.inc.php';
         $PLG = new checkout_admin();
         $checkout = true;
         $invoice->checkout_plugin_id = false;
     } else {
         // get available checkout options and check against the one provided
         $invoice->checkout_plugin_id = $VAR['option'];
         foreach ($invoice->invoice_item as $item) {
             if (!empty($item['product_id'])) {
                 $product_arr[] = $item['product_id'];
             }
         }
         $checkout_options = $this->get_checkout_options($this->account_id, $invoice->total_amt, @$product_arr, $invoice->country_id, $invoice->any_new, $invoice->any_trial, $invoice->any_recurring);
         if ($checkout_options) {
             foreach ($checkout_options as $a) {
                 if ($a['fields']['id'] == $invoice->checkout_plugin_id) {
                     // load the selected checkout plugin and run pre-validation
                     $checkout_plugin = $a['fields']['checkout_plugin'];
                     $plugin_file = PATH_PLUGINS . 'checkout/' . $checkout_plugin . '.php';
                     include_once $plugin_file;
                     eval('$PLG = new plg_chout_' . $checkout_plugin . '("' . $invoice->checkout_plugin_id . '");');
                     $plugin_validate = $PLG->validate($VAR, $this);
                     if ($plugin_validate != true) {
                         echo $plugin_validate;
                         return false;
                     }
                     $checkout = true;
                     break;
                 }
             }
         }
     }
     if (!$checkout) {
         echo '<script language=Javascript> alert("Unable to checkout with the selected method, please select another."); </script> ';
         return false;
     }
     // validate credit card on file details
     global $VAR;
     if (!empty($VAR['account_billing_id']) && @$VAR['new_card'] == 2) {
         $invoice->account_billing_id = $VAR['account_billing_id'];
         /* validate credit card on file details */
         if (!$PLG->setBillingFromDB($this->account_id, $invoice->account_billing_id, $invoice->checkout_plugin_id)) {
             global $C_debug;
             $C_debug->alert("Sorry, we cannot use that billing record for this purchase.");
             return false;
         }
     } else {
         /* use passed in vars */
         $PLG->setBillingFromParams($VAR);
     }
     // validate recurring processing options
     if ($PLG->recurr_only) {
         if ($invoice->recur_amt <= 0) {
             echo '<script language=Javascript> alert("Cannot process non-recurring charges with this payment option, please select another payment option."); </script> ';
             return false;
         }
         if (is_array($invoice->recur_arr) && count($invoice->recur_arr) > 1) {
             $recurring = true;
             // validate recur day and recurring schedule are the same for both products
             foreach ($invoice->recur_arr as $a) {
                 foreach ($invoice->recur_arr as $b) {
                     foreach ($b as $key => $val) {
                         if ($key != 'price' && $key != 'recurr_week' && $a[$key] != $val) {
                             $recurring = false;
                             break;
                         }
                     }
                 }
             }
             if (!$recurring) {
                 echo '<script language=Javascript> alert("This payment option cannot be used when ordering both prorated and non-prorated subscriptions, or when ordering two or more subscriptions with different billing schedules selected. Please make sure all your subscriptions have the same billing schedule selected, try another payment option, or order one subscription at a time. We apologize for any inconvenience."); </script> ';
                 return false;
             }
         }
     }
     # Affiliate
     if (empty($this->affiliate_id)) {
         if (!empty($account->fields['affiliate_id'])) {
             $invoice->affiliate_id = $account->fields['affiliate_id'];
         } else {
             $invoice->affiliate_id = SESS_AFFILIATE;
         }
     }
     # Campaign
     if (empty($this->campaign_id)) {
         if (!empty($account->fields['campaign_id'])) {
             $invoice->campaign_id = $account->fields['campaign_id'];
         } else {
             $invoice->campaign_id = SESS_CAMPAIGN;
         }
     }
     $invoice->record_id = sqlGenID($db, "invoice");
     $invoice->actual_billed_currency_id = SESS_CURRENCY;
     $invoice->billed_currency_id = DEFAULT_CURRENCY;
     $invoice->checkout_type = $PLG->type;
     // initial invoice status
     if ($invoice->total_amt == 0 || $PLG->type == 'gateway') {
         $invoice->billing_status = 1;
         $invoice->actual_billed_amt = $C_list->format_currency_decimal($invoice->total_amt, SESS_CURRENCY);
         $invoice->billed_amt = $invoice->total_amt;
     }
     // Currency conversion:
     if (SESS_CURRENCY != DEFAULT_CURRENCY) {
         $bill_amt = $C_list->format_currency_decimal($invoice->total_amt, SESS_CURRENCY);
         $recur_amt = $C_list->format_currency_decimal($invoice->recur_amt, SESS_CURRENCY);
     } else {
         $bill_amt = round($invoice->total_amt, 2);
         $recur_amt = round($invoice->recur_amt, 2);
     }
     // Get currency ISO (three_digit) for checkout plugin
     $currrs = $db->Execute(sqlSelect($db, "currency", "three_digit", "id=" . SESS_CURRENCY));
     if ($currrs && $currrs->RecordCount()) {
         $currency_iso = $currrs->fields['three_digit'];
     }
     // Run the plugin bill_checkout() method:
     $currency_iso = $C_list->currency_iso(SESS_CURRENCY);
     $invoice->checkout_plugin_data = $PLG->bill_checkout($bill_amt, $invoice->record_id, $currency_iso, $account->fields, $recur_amt, $invoice->recur_arr);
     if ($invoice->checkout_plugin_data === false || $invoice->checkout_plugin_data == '') {
         if (!empty($PLG->redirect)) {
             echo $PLG->redirect;
         }
         return false;
     } elseif ($PLG->type == "gateway" || empty($PLG->redirect)) {
         $VAR['id'] = $invoice->record_id;
         if (!$this->admin_checkout) {
             $VAR['_page'] = "invoice:thankyou";
         }
         $invoice->checkout_plugin_data = false;
     } elseif (!$this->admin_checkout) {
         echo "<html><head></head><body><center>\n\t\t\t\tPlease wait while we redirect you to the secure payment site....\n\t\t\t\t{$PLG->redirect}</center></body></html>";
     }
     // Call the Plugin method for storing the checkout data:
     $invoice->account_billing_id = $PLG->store_billing($VAR, $invoice->account_id);
     // clear user discounts
     $fields = array('discounts' => "");
     $db->Execute(sqlUpdate($db, "session", $fields, "id = ::" . SESS . "::"));
     // admin options
     $email = true;
     if ($this->admin_checkout) {
         if (empty($VAR['send_email']) || $VAR['send_email'] == 'false') {
             $email = false;
         } else {
             $email = true;
         }
         if (!empty($VAR['due_date'])) {
             $invoice->due_date = $this->getInputDate($VAR['due_date']);
         }
         if (!empty($VAR['grace_period'])) {
             $invoice->grace_period = $VAR['grace_period'];
         }
         if (!empty($VAR['notice_max'])) {
             $invoice->notice_max = $VAR['notice_max'];
         }
     }
     if ($invoice->commitNew($taxObj, $discountObj, $email)) {
         // delete all cart items
         $db->Execute(sqlDelete($db, "cart", "(session_id=::" . SESS . ":: OR account_id={$invoice->account_id})"));
         // admin redirect
         if ($this->admin_checkout) {
             $url = URL . 'admin.php?_page=invoice:view&id=' . $invoice->record_id;
             echo '<script language="javascript"> parent.location.href=\'' . $url . '\';</script>';
         }
     }
     return false;
 }
Exemplo n.º 13
0
 private function applyDiscount()
 {
     $discount = new discount();
     $discount->applyDiscount();
 }
Exemplo n.º 14
0
 public function getDiscountTypeId($codeName)
 {
     return discount::getTypeId($codeName);
 }
 public function getRules($discountTypeId = false, $discountId = false)
 {
     $items = discountRule::getList($discountTypeId);
     if ($discountId) {
         $discount = discount::get($discountId);
         $discountRules = $discount->getDiscountRules();
         $discountRulesId = array();
         foreach ($discountRules as $rule) {
             $discountRulesId[] = $rule->getObject()->rule_type_id;
         }
         foreach ($items as $i => $rule) {
             $items[$i] = array('attribute:id' => $rule->id, 'attribute:name' => $rule->name);
             if (in_array($rule->id, $discountRulesId)) {
                 $items[$i]['attribute:selected'] = 'selected';
             }
         }
     }
     return array('items' => array('nodes:item' => $items));
 }