/var/www/vhosts/ihelp.ro/httpdocs/src/Controller
Edit: /var/www/vhosts/ihelp.ro/httpdocs/src/Controller/OrdersController.php (20317B)
loadComponent('Tools');
}
public function beforeFilter(\Cake\Event\EventInterface $event)
{
parent::beforeFilter($event);
// Configure the login action to not require authentication, preventing
// the infinite redirect loop issue
$this->Authentication->addUnauthenticatedActions(['checkout', 'summary', 'addAddress']);
}
/**
* checkout
*/
public function checkout()
{
$this->loadModel('Carts');
$auth = !empty($this->userAuth->id) ? $this->userAuth->id : false;
if (!empty($this->userAuth->id)) { // daca este logat
$cart = $this->Carts->find()
->contain(['CartProducts', 'Users', 'UserAddresses'])
->where(['Carts.user_id' => $this->userAuth->id, 'Carts.is_active' => true])
->last();
} else { // daca nu este logat
$cart_identifier = $this->identifireIdCartSession();
$cart = $this->Carts->find()
->contain(['CartProducts', 'Users', 'UserAddresses'])
->where(['Carts.uuid' => $cart_identifier, 'Carts.is_active' => true])
->last();
}
if ($cart) { //daca exita cos de cumparaturi
// listare
$this->loadModel('UserAddresses');
if (!empty($this->userAuth->id)) {
$userAddresses = $this->UserAddresses->find()
->where(['UserAddresses.user_id' => $this->userAuth->id])->all();
if (!empty($userAddresses)) {
$addresses = [];
foreach ($userAddresses as $i => $address) {
$addresses[$address->id] = $address->full_address;
}
}
} elseif (!empty($cart->user_address)) {
$userAddresses = $this->UserAddresses->find()
->where(['UserAddresses.user_id' => $cart->user->id])->all();
$addresses = [];
foreach ($userAddresses as $i => $address) {
$addresses[$address->id] = $address->full_address;
}
} else {
$addresses = false;
}
if ($this->request->is(['patch', 'post', 'put'])) {
$data = $this->request->getData();
if (!empty($this->userAuth->id)) { // logat
if (!empty($addresses)) {
//salvam cosul
$cart = $this->Carts->patchEntity($cart, $data, ['validate' => 'checkout']);
if ($this->Carts->save($cart)) {
return $this->redirect(['controller' => 'Orders', 'action' => 'summary']);
}
} else {
$data['user_id'] = $this->userAuth->id;
//salveaza cosul cu id-ul adresei
$cart = $this->Carts->patchEntity($cart, $data, ['validate' => 'checkout']);
if ($this->Carts->save($cart)) {
return $this->redirect(['controller' => 'Orders', 'action' => 'summary']);
}
}
} else { //nelogat
if (!empty($addresses)) {
//salvam cosul
$cart = $this->Carts->patchEntity($cart, $data, ['validate' => 'checkout']);
if ($this->Carts->save($cart)) {
return $this->redirect(['controller' => 'Orders', 'action' => 'summary']);
}
} else {
$this->loadModel('Users');
$dataUser = [];
$dataUser['id'] = (!empty($cart->user_id) ? $cart->user_id : NULL);
if (empty($cart->user)) {
$dataUser['password'] = $data['Users']['password'];
$dataUser['email'] = $data['Users']['email'];
$dataUser['gdpr_active'] = $data['Users']['gdpr_active'];
$dataUser['role_id'] = USER;
$user = $this->Users->newEmptyEntity();
} else {
$user = $cart->user;
}
$dataUser['user_addresses'] = $data['user_addresses'];
$dataUser['user_addresses'][0]['is_default'] = true;
$dataUser['profile']['first_name'] = $dataUser['user_addresses'][0]['first_name'];
$dataUser['profile']['last_name'] = $dataUser['user_addresses'][0]['last_name'];
$dataUser['profile']['phone'] = $dataUser['user_addresses'][0]['phone'];
//se salveaza user nou
$user = $this->Users->patchEntity($user, $dataUser, ['associated' => ['UserAddresses', 'Profiles']]);
if ($this->Users->save($user)) {
$this->Carts->id = $cart->id;
$this->Carts->saveField('user_id', $user->id);
$this->Carts->saveField('user_address_id', $user->user_addresses[0]->id);
$data['user_address_id'] = $user->user_addresses[0]->id;
$data['user_id'] = $user->id;
//salveaza cosul cu id-ul adresei
$cart = $this->Carts->patchEntity($cart, $data, ['validate' => 'checkout']);
if ($this->Carts->save($cart)) {
return $this->redirect(['controller' => 'Orders', 'action' => 'summary']);
}
} else {
$cart->setErrors($user->getErrors());
}
}
}
}
$totalPriceCart = $this->Tools->totalPriceCart($cart);
$this->loadModel('Counties');
$counties = $this->Counties->find('list');
$this->loadModel('Cities');
$cities = $this->Cities->find('list');
$this->loadModel('PaymentMethods');
$paymentMethods = $this->PaymentMethods->find('list');
$this->set(compact('cart', 'totalPriceCart', 'paymentMethods', 'cities', 'auth', 'counties'));
} else {
return $this->redirect(['controller' => 'Carts', 'action' => 'view']);
}
}
/**
* Summary
*/
public function summary()
{
$this->loadModel('Carts');
// daca este user logat
if (!empty($this->userAuth->id)) {
$cart = $this->Carts->find('all')
->contain(['CartProducts', 'UserAddresses', 'PaymentMethods', 'CartProducts.Products'])
->where(['Carts.user_id' => $this->userAuth->id, 'Carts.is_active' => true])
->last();
} else {
$cart_identifier = $this->identifireIdCartSession();
$cart = $this->Carts->find('all')
->contain(['CartProducts', 'UserAddresses', 'PaymentMethods', 'CartProducts.Products'])
->where(['Carts.uuid' => $cart_identifier, 'Carts.is_active' => true])
->last();
}
//daca exita cos de cumparaturi
if ($cart) {
$totalPriceCart = $this->Tools->totalPriceCart($cart);
//verificare stock
$cartItems = $this->Carts->CartProducts->find()
->contain('Products', 'Carts')
->where(['CartProducts.cart_id' => $cart->id])
->toList();
foreach ($cartItems as $cartItem) {
$stock = $cartItem->product->stock;
$qnt = $cartItem['qnt'];
// daca stocul este mai mic decat cantitatea selectata
if ($stock < $qnt) {
if ($stock < 1) {
if ($cartItem && $this->Carts->CartProducts->delete($cartItem)) {
$cartIsUpdated = true;
}
$this->Flash->error(__('Ne pare rău, produsul {0} nu mai este în stoc.', $cartItem->product->name));
$this->redirect(['controller' => 'Orders', 'action' => 'summary']);
return;
} else {
$this->loadModel('CartProducts');
$this->CartProducts->id = $cartItem->id;
$this->CartProducts->saveField('qnt', $stock);
$cartIsUpdated = true;
$this->Flash->error(__('Ne pare rău, produsul {0} mai are doar {1} bucați.', $cartItem->product->name, $stock));
$this->redirect(['controller' => 'Orders', 'action' => 'summary']);
return;
}
}
}
if ($this->request->is(['patch', 'post', 'put'])) {
$this->loadComponent('MailHelp');
$data = $this->request->getData();
$cart = $this->Carts->find()
->contain([
'Users',
'PaymentMethods',
'UserAddresses',
'UserAddresses.Counties',
'UserAddresses.Cities',
'CartProducts',
'CartProducts.Products',
'CartProducts.Products.UserAddresses',
'CartProducts.Products.UserAddresses.Counties',
'CartProducts.Products.UserAddresses.Cities'
])
->where(['Carts.uuid' => $data['uuid'], 'Carts.is_active' => TRUE])->last();
# #####################################
# Insert value donation in causes `donation_sum`
# #####################################
$orderDonations = [];
if (!empty($cart->cart_products)) {
foreach ($cart->cart_products as $i => $cartProduct) {
$orderDonations[$i]['cause_id'] = $cartProduct->product->cause_id;
$orderDonations[$i]['total_price'] = $cartProduct->qnt * (!empty($cartProduct->custom_price) ? $cartProduct->custom_price : $cartProduct->product->price);
}
}
if ($orderDonations) {
foreach ($orderDonations as $orderDonation) {
$valueDonationSumOld = $this->fetchTable('Causes')->get($orderDonation['cause_id'])->donation_sum;
$query = $this->fetchTable('Causes')->query();
$query->update()
->set(['donation_sum' => $valueDonationSumOld + $orderDonation['total_price']])
->where(['id' => $orderDonation['cause_id']])
->execute();
}
}
# #####################################
# Insert cart data in table Orders, update stock, Insert contact data in table AWBS, redirect payment
# #####################################
$orderProducts = [];
if (!empty($cart->cart_products)) {
foreach ($cart->cart_products as $i => $cartProduct) {
$orderProducts[$i]['product_id'] = $cartProduct->product_id;
$orderProducts[$i]['product_user_id'] = $cartProduct->product->user_id;
$orderProducts[$i]['product_name'] = $cartProduct->product->name;
$orderProducts[$i]['qnt'] = $cartProduct->qnt;
$orderProducts[$i]['price'] = !empty($cartProduct->custom_price) ? $cartProduct->custom_price : $cartProduct->product->price;
$orderProducts[$i]['total_price'] = $cartProduct->qnt * (!empty($cartProduct->custom_price) ? $cartProduct->custom_price : $cartProduct->product->price);
}
}
$dataOrder = [
'user_id' => $cart->user_id,
'user_address_id' => $cart->user_address_id,
'payment_method_id' => $cart->payment_method_id,
'order_status_id' => STATUS_NEW,
'order_status_date' => date('Y-m-d H:s'),
'order_status_comment' => __('Comanda a fost creată.'),
'email' => $cart->user->email,
'total' => $totalPriceCart,
'notes' => $cart->notes,
'ip' => $this->request->clientIp(),
'order_products' => $orderProducts
];
if ($cart->uuid == $data['uuid']) {
//update stock
$this->loadModel('Products');
foreach ($orderProducts as $orderProduct) {
$product = $this->Products->find()
->where(['id' => $orderProduct['product_id']])
->first();
$this->Products->id = $orderProduct['product_id'];
$this->Products->saveField('stock', $product->stock - $orderProduct['qnt']);
}
// save from cart to order and redirect to payment
$order = $this->Orders->newEmptyEntity();
$order = $this->Orders->patchEntity($order, $dataOrder, ['associated' => ['OrderProducts']]);
if ($this->Orders->save($order)) {
$this->Carts->id = $cart->id;
$this->Carts->saveField('order_id', $order->id);
$this->Carts->saveField('is_active', FALSE);
// Insert contact data in table AWBS
$this->loadModel('Awbs');
$awbEmptyEntity = $this->Awbs->newEmptyEntity();
$dataAwb = [];
$uniqueSenders = [];
foreach ($cart->cart_products as $key => $cart_product) {
if (!in_array($cart_product->product->user_id, $uniqueSenders)) {
$dataAwb = [
'order_id' => $order->id,
'courier_id' => '',
# sender
'sender_user_id' => $cart_product->product->user_id,
'sender_first_name' => $cart_product->product->user_address->first_name,
'sender_last_name' => $cart_product->product->user_address->last_name,
'sender_phone' => $cart_product->product->user_address->phone,
'sender_county_name' => $cart_product->product->user_address->county->name,
'sender_city_name' => $cart_product->product->user_address->city->name,
'sender_str' => $cart_product->product->user_address->str,
'sender_nr' => $cart_product->product->user_address->nr,
'sender_bl' => $cart_product->product->user_address->bl,
'sender_sc' => $cart_product->product->user_address->sc,
'sender_ap' => $cart_product->product->user_address->ap,
'sender_interfon' => $cart_product->product->user_address->interfon,
'sender_postal_code' => $cart_product->product->user_address->postal_code,
# recever
'recever_user_id' => $cart->user_id,
'recever_first_name' => $cart->user_address->first_name,
'recever_last_name' => $cart->user_address->last_name,
'recever_phone' => $cart->user_address->phone,
'recever_county_name' => $cart->user_address->county->name,
'recever_city_name' => $cart->user_address->city->name,
'recever_str' => $cart->user_address->str,
'recever_nr' => $cart->user_address->nr,
'recever_bl' => $cart->user_address->bl,
'recever_sc' => $cart->user_address->sc,
'recever_ap' => $cart->user_address->ap,
'recever_interfon' => $cart->user_address->interfon,
'recever_postal_code' => $cart->user_address->postal_code,
];
try {
$awbEmptyEntity = $this->Awbs->newEmptyEntity();
$awb = $this->Awbs->patchEntity($awbEmptyEntity, $dataAwb);
if ($this->Awbs->save($awb)) {
$uniqueSenders[] = $cart_product->product->user_id;
} else {
debug($awb->getErrors());
}
} catch (\Exception $ex) {
$this->Flash->error(__('Ne pare rău, a intervenit o eroare. Vă rugăm să încercați din nou.'));
}
}
}
try {
$to['email'] = $cart->user->email;
$oLink = Router::url(['prefix' => false, 'controller' => 'Orders', 'action' => 'viewOrder', $order->uuid], true);
$order = $order;
$orderUuid = $order->uuid;
$this->MailHelp->sendOrder($to, $oLink, $order, $orderUuid);
} catch (\Exception $e) {
//$this->Flash->error($e->getMessage());
$this->Flash->error(__('Comanda nu a putut fi trimisa pe email'));
}
if ($cart->payment_method_id == PAYMENT_METHOD_CARD) {
return $this->redirect(['controller' => 'Payments', 'action' => 'payment', '?' => ['orderId' => $order->uuid]]);
}
return $this->redirect(['controller' => 'Orders', 'action' => 'viewOrder', $order->uuid]);
}
} else {
$this->Flash->error(__('Ne pare rău, a intervenit o eroare. Vă rugăm să încercați din nou.'));
}
}
$this->set(compact('cart', 'totalPriceCart'));
} else {
return $this->redirect(['controller' => 'Carts', 'action' => 'view']);
}
}
/**
* viewOrder
*/
public function viewOrder($uuid)
{
$order = null;
if (!empty($uuid)) {
$order = $this->Orders->find()
->contain([
'OrderStatuses', 'UserAddresses', 'OrderProducts', 'OrderProducts.Products', 'PaymentMethods',
'Awbs'
])
->where(['Orders.uuid' => $uuid])
->first();
} else {
$this->Flash->error(__('A apărut o problemă. Vă rugăm să încercați din nou'));
}
$this->set(compact('order'));
}
}