VvebOIDC/admin/controller/order/order.php

318 lines
9.8 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\Controller\Order;
use function Vvveb\__;
use Vvveb\Controller\Base;
use Vvveb\Controller\Content\AutocompleteTrait;
use function Vvveb\email;
use function Vvveb\orderStatusBadgeClass;
use function Vvveb\paymentStatusBadgeClass;
use function Vvveb\prefixArrayKeys;
use function Vvveb\shippingStatusBadgeClass;
use function Vvveb\siteSettings;
use Vvveb\Sql\Order_LogSQL;
use Vvveb\Sql\OrderSQL;
use Vvveb\System\Cart\Cart;
use Vvveb\System\Cart\Currency;
use Vvveb\System\Cart\Order as SystemOrder;
use Vvveb\System\Cart\OrderCart;
use Vvveb\System\Core\View;
use Vvveb\System\Images;
use Vvveb\System\Payment;
use Vvveb\System\Shipping;
use Vvveb\System\Sites;
use Vvveb\System\Validator;
use function Vvveb\url;
class Order extends Base {
use AutocompleteTrait;
protected $type = 'order';
function index() {
//$_GET['order_id'] = 1;
$site = siteSettings($this->global['site_id']);
$options = array_intersect_key($site,
array_flip(['weight_type_id', 'length_type_id', 'currency_id', 'country_id']));
$cart = Cart::getInstance($options);
$payment = Payment::getInstance();
$shipping = Shipping::getInstance();
$view = $this->view;
$order = [];
/*
$order_id = 1;
//get site default country and region for taxes
$site = siteSettings($this->global['site_id']);
$options = $this->global + $site;
var_dump($options);
unset($options['admin_id']);
$order = new OrderCart($order_id, $options);
$order->add(1);
//$order->add(2);
$order->updateCart();
var_dump($order->getTotals());
//var_dump($order->getGrandTotal());
var_dump($order->getGrandTotalFormatted());
//var_dump($order->getAll());
die(0);
*/
//$order->addProduct(['order_id' => $order_id, 'product' => $product, 'product_options' => []]);
if (isset($this->request->get['order_id'])) {
$options = ['order_id' => (int)$this->request->get['order_id'], 'type' => $this->type] + $this->global;
$orders = new OrderSQL();
$results = $orders->get($options);
if ($results['order']) {
$currency = Currency::getInstance();
if (isset($results['products'])) {
foreach ($results['products'] as $id => &$product) {
$product['url'] = htmlspecialchars(\Vvveb\url('product/product/index', $product));
if (isset($product['images'])) {
$product['images'] = json_decode($product['images'], true);
foreach ($product['images'] as &$image) {
$image['image'] = Images::image($image['image'], 'product');
}
}
if (isset($product['option_value'])) {
$product['option_value'] = json_decode($product['option_value'], true);
foreach ($product['option_value'] as &$option) {
if (isset($option['price'])) {
$option['price_formatted'] = $currency->format($option['price']);
}
}
}
if (isset($product['image']) && $product['image']) {
$product['image'] =Images::image($product['image'], 'product');
//$product['images'][] = ['image' => Images::image($product['image'], 'product')];
}
$product['price_formatted'] = $currency->format($product['price']);
$product['tax_formatted'] = $currency->format($product['tax']);
}
}
foreach ($results['total'] as $id => &$total) {
$total['value_formatted'] = $currency->format($total['value']);
}
$order = &$results['order'];
$order['user_url'] = \Vvveb\url(['module' => 'user/user', 'user_id' => $order['user_id']]);
$order['total_formatted'] = $currency->format($order['total']);
$order['shipping_data'] = json_decode($order['shipping_data'] ?? '', true);
$order['payment_data'] = json_decode($order['payment_data'] ?? '', true);
$order['class'] = orderStatusBadgeClass($order['order_status_id']);
$order['payment_class'] = paymentStatusBadgeClass($order['payment_status_id']);
$order['shipping_class'] = shippingStatusBadgeClass($order['shipping_status_id']);
$order += prefixArrayKeys('shipping_', $order['shipping_data']) ?? [];
$order += prefixArrayKeys('payment_', $order['payment_data']) ?? [];
$data = $orders->getData($order);
$view->set($data);
$view->set($results);
$url = ['module' => 'order/order', 'action' => 'print', 'order_id' => $order['order_id']];
$view->printUrl = \Vvveb\url($url);
$view->printShippingUrl = \Vvveb\url(['action' => 'printShipping'] + $url);
$view->printInvoiceUrl = \Vvveb\url(['action' => 'printInvoice'] + $url);
} else {
$this->notFound(__('Order not found!'));
exit();
}
} else {
//new order
$orders = new OrderSQL();
$data = $orders->getData($this->global);
$view->set($data);
}
$this->view->order_payment = $payment->getMethods($order);
$this->view->order_shipping = $shipping->getMethods($order);
}
function print() {
return $this->index();
}
function printShipping() {
return $this->index();
}
function printInvoice() {
return $this->index();
}
function cart() {
$order_id = $this->request->get['order_id'] ?? false;
$product_id = $this->request->post['product_id'] ?? false;
$quantity = $this->request->post['quantity'] ?? 1;
$name = $this->request->post['name'] ?? '';
$model = $this->request->post['model'] ?? '';
$price = $this->request->post['price'] ?? 1;
if ($order_id && $product_id) {
$product = compact('product_id','quantity', 'name', 'price', 'model');
$site = siteSettings($this->global['site_id']);
$options = $this->global + $site;
unset($options['admin_id']);
$order = new OrderCart($order_id, $options);
$order->addOrderProduct($product_id, false, $quantity, []);
$order->updateCart();
$order->write();
}
$this->index();
}
private function sendNotification($order_id, $customer_order_id, $email, $message) {
try {
$error = __('Error sending order confirmation mail!');
$title = sprintf(__('Order update #%s'), $customer_order_id);
$options = ['order_id' => $order_id] + $this->global;
$orders = new OrderSQL();
$results = $orders->get($options);
if (! email([$email], $title, 'order/update', ['message' => $message, 'title' => $title] + $results + $this->global, [], 'app')) {
$this->session->set('errors', $error);
$this->view->errors[] = $error;
}
} catch (\Exception $e) {
if (DEBUG) {
$error .= "\n" . $e->getMessage();
}
$this->session->set('errors', $error);
$this->view->errors[] = $error;
}
}
function saveLog() {
$order_id = $this->request->get['order_id'] ?? false;
$customer_order_id = $this->request->post['customer_order_id'] ?? false;
$log = $this->request->post['log'] ?? [];
$notify = $log['notify'] ?? false;
$public = $log['public'] ?? false;
$view = $this->view;
$this->index();
if ($order_id && $log) {
// update order status with the last log status
$order = new OrderSQL();
$result = $order->edit(['order_id' => $order_id, 'order' => ['order_status_id' => $log['order_status_id']]]);
if (isset($result['order'])/* && $result['order']*/) {
$orderLog = new Order_LogSQL();
$result = $orderLog->add(['order_id' => $order_id, 'order_log' => $log]);
if (isset($result['order_log']) && $result['order_log']) {
$view->success = [__('Order status saved!')];
$this->view->log[] = $log;
if ($notify) {
$message = '';
if ($public) {
$message = $log['note'];
}
$email = $this->view->order['email'];
$this->sendNotification($order_id, $customer_order_id, $email, $message);
}
} else {
$view->errors[] = $orderLog->error;
}
} else {
$view->errors[] = $order->error;
}
}
}
function save() {
$validator = new Validator(['checkout', 'order', 'checkout_shipping', 'checkout_billing']);
$view = view :: getInstance();
$order_id = $this->request->get['order_id'] ?? false;
$order = $this->request->post ?? [];
$site = Sites :: getSiteData();
$order_url = url('user/orders', [
'host' => $site['host'] ?? false,
'scheme' => $_SERVER['REQUEST_SCHEME'] ?? 'http',
]);
$order['site_url'] = $site['host'];
$order['site_name'] = $site['name'];
$order['products'] = [];
$order['totals'] = [];
if (($errors = $validator->validate($order)) === true) {
$orders = new OrderSQL();
if ($order_id) {
$result = $orders->edit(['order_id' => $order_id, 'order' => $order]);
if ($result >= 0) {
$view->success = [__('Order saved')];
} else {
$view->errors = [$orders->error];
}
} else {
$systemOrder = SystemOrder::getInstance();
$order = $systemOrder->add($order + $this->global);
$order_id = $order['order_id'];
if (isset($order_id)) {
$message = __('Order saved!');
$this->view->success['get'] = $message;
$url = ['module' => 'order/order', 'order_id' => $order_id, 'success' => $message];
$this->redirect($url);
} else {
$view->errors = [$orders->error];
}
}
} else {
$view->errors = $errors;
}
$this->index();
}
}