/** * Generates a Purchase record from the order * * @since 1.1 * * @return void **/ function purchase () { global $Ecart; // Need a transaction ID to create a purchase if (empty($this->txnid)) return false; // Lock for concurrency protection $this->lock(); $Purchase = new Purchase($this->txnid,'txnid'); if (!empty($Purchase->id)) { $this->unlock(); $Ecart->resession(); $this->purchase = $Purchase->id; if ($this->purchase !== false) ecart_redirect(ecarturl(false,'thanks')); } // WordPress account integration used, customer has no wp user if ("wordpress" == $this->accounts && empty($this->Customer->wpuser)) { if ( $wpuser = get_current_user_id() ) $this->Customer->wpuser = $wpuser; // use logged in WordPress account else $this->Customer->create_wpuser(); // not logged in, create new account } // New customer, save hashed password if (!$this->Customer->exists() && !empty($this->Customer->password)) { $this->Customer->id = false; if (ECART_DEBUG) new EcartError('Creating new Ecart customer record','new_customer',ECART_DEBUG_ERR); if ("ecart" == $this->accounts) $this->Customer->notification(); $this->Customer->password = wp_hash_password($this->Customer->password); } else unset($this->Customer->password); // Existing customer, do not overwrite password field! $this->Customer->save(); $this->Billing->customer = $this->Customer->id; $this->Billing->card = substr($this->Billing->card,-4); $paycard = Lookup::paycard($this->Billing->cardtype); $this->Billing->cardtype = !$paycard?$this->Billing->cardtype:$paycard->name; $this->Billing->cvv = false; $this->Billing->save(); // Card data is truncated, switch the cart to normal mode $Ecart->Shopping->secured(false); if (!empty($this->Shipping->address)) { $this->Shipping->customer = $this->Customer->id; $this->Shipping->save(); } $base = $Ecart->Settings->get('base_operations'); $promos = array(); foreach ($this->Cart->discounts as &$promo) { $promos[$promo->id] = $promo->name; $promo->uses++; } $Purchase = new Purchase(); $Purchase->copydata($this); $Purchase->copydata($this->Customer); $Purchase->copydata($this->Billing); $Purchase->copydata($this->Shipping,'ship'); $Purchase->copydata($this->Cart->Totals); $Purchase->customer = $this->Customer->id; $Purchase->billing = $this->Billing->id; $Purchase->shipping = $this->Shipping->id; $Purchase->taxing = ($base['vat'])?'inclusive':'exclusive'; $Purchase->promos = $promos; $Purchase->freight = $this->Cart->Totals->shipping; $Purchase->ip = $Ecart->Shopping->ip; $Purchase->save(); $this->unlock(); Promotion::used(array_keys($promos)); foreach($this->Cart->contents as $Item) { $Purchased = new Purchased(); $Purchased->copydata($Item); $Purchased->price = $Item->option->id; $Purchased->purchase = $Purchase->id; if (!empty($Purchased->download)) $Purchased->keygen(); $Purchased->save(); if ($Item->inventory) $Item->unstock(); } $this->purchase = $Purchase->id; $Ecart->Purchase = &$Purchase; if (ECART_DEBUG) new EcartError('Purchase '.$Purchase->id.' was successfully saved to the database.',false,ECART_DEBUG_ERR); do_action('ecart_order_notifications'); do_action_ref_array('ecart_order_success',array(&$Ecart->Purchase)); }