nowa-panda/plugins/pandaGadzety/utils/product-calculator.php
2025-07-07 09:51:16 +02:00

374 lines
13 KiB
PHP

<?php
namespace Foxstudio\Plugins\Template\Utils;
use Foxstudio\Plugins\Template\Repository as Repository;
use Exception;
class PriceCalculator
{
private Repository\ProductRepository $productRepository;
public function __construct()
{
$this->productRepository = new Repository\ProductRepository(SERVER_URL);
add_action('woocommerce_init', [$this, 'ensureWooSession']);
add_action('wp_enqueue_scripts', [$this, 'loadArchiveImages']);
// Calculator
add_filter('woocommerce_single_product_summary', [$this, 'calculatorView']);
add_action('template_redirect', [$this, 'addToCart']);
add_action('woocommerce_before_single_product', [$this, 'addToCart']);
add_action('woocommerce_before_calculate_totals', [$this, 'updatePrice'], 10);
// Show custom data
add_filter('woocommerce_get_item_data', [$this, 'showCustomData'], 10, 3);
add_action('woocommerce_checkout_create_order_line_item', [$this, 'wdm_add_custom_order_line_item_meta'], 10, 4);
// Remove default add to cart
remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart');
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
// Add custom styles
\wp_enqueue_style('hidden-add-to-cart', "/wp-content/plugins/pandaGadzety/assets/css/hidden-add-to-cart.css");
}
function wdm_add_custom_order_line_item_meta($item, $cart_item_key, $values, $order)
{
if (array_key_exists('custom_data', $values)) {
if(!empty($values['custom_data']['option'])) {
$item->add_meta_data('option', $values['custom_data']['option']);
}
if(!empty($values['custom_data']['technology'])) {
$item->add_meta_data('Technologia', $values['custom_data']['technology']);
}
if(!empty($values['custom_data']['labeling_price'])) {
$item->add_meta_data('Cena znakowania', $values['custom_data']['labeling_price']);
}
if(!empty($values['custom_data']['setup_price'])) {
$item->add_meta_data('Cena przygotowania', $values['custom_data']['setup_price']);
}
if(!empty($values['custom_data']['product_price'])) {
$item->add_meta_data('Cena produktu', $values['custom_data']['product_price']);
}
if(!empty($values['custom_data']['colors'])) {
$item->add_meta_data('Ilość kolorów', $values['custom_data']['colors']);
}
if(!empty($values['custom_data']['photo'])) {
$item->add_meta_data('Zdjęcie nadruku', \wp_get_attachment_image($values['custom_data']['photo'], array(800, 600)));
}
}
}
public function ensureWooSession() {
if (!wc()->session->has_session()) {
wc()->session->set_customer_session_cookie(true);
}
}
public function loadArchiveImages() {
$skus = [];
global $wp_query;
foreach ( $wp_query->posts as $post ) {
$p = wc_get_product( $post->ID );
if ( $p && $p->get_sku() ) {
$skus[] = $p->get_sku();
}
}
if ( WC()->cart ) {
foreach ( WC()->cart->get_cart() as $cart_item ) {
$p = $cart_item['data'];
if ( $p && $p->get_sku() ) {
$skus[] = $p->get_sku();
}
}
}
$skus = array_unique( $skus );
$productData = [];
foreach ( $skus as $sku ) {
try {
$info = $this->productRepository->getProductInfo( $sku );
if ( ! empty( $info['message'] ) ) {
$productData[ $sku ] = [
'img' => $info['message']['productBaseInfo']['primary_img'] ?? null,
];
}
} catch ( \Throwable $th ) {}
}
wp_enqueue_script(
'archive-images-js',
plugins_url( '/pandaGadzety/assets/js/archive-images.js' ),
[ 'wc-cart-fragments' ],
null,
true
);
wp_localize_script( 'archive-images-js', 'archiveImagesData', [
'products' => $productData,
] );
}
public function addToCart() {
global $post;
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// $item_data['custom_data']['new_price'] = 99;
// $item_data['custom_data']['color'] = 'red';
// $item_data['custom_data']['uuid'] = uniqid();
$product = wc_get_product($post->ID);
if (!$product) {
wc_add_notice('Nie znaleziono produktu', 'error');
return;
}
$itemData = [];
if(!empty($_POST['option'])) {
$itemData['custom_data']['option'] = $_POST['option'];
}
if(!empty($_POST['technology'])) {
$itemData['custom_data']['technology'] = $_POST['technology'];
}
if(!empty($_POST['quantity'])) {
$itemData['custom_data']['quantity'] = $_POST['quantity'];
}
if(!empty($_POST['labeling_price'])) {
$itemData['custom_data']['labeling_price'] = $_POST['labeling_price'];
} else {
$itemData['custom_data']['labeling_price'] = 0;
}
if(!empty($_POST['setup_price'])) {
$itemData['custom_data']['setup_price'] = $_POST['setup_price'];
} else {
$itemData['custom_data']['setup_price'] = 0;
}
if(!empty($_POST['colors'])) {
$itemData['custom_data']['colors'] = $_POST['colors'];
} else {
$itemData['custom_data']['colors'] = 0;
}
if(!empty($_FILES['photo'])) {
$itemData['custom_data']['photo'] = $this->uploadFile('photo', $product->get_id());
} else {
$itemData['custom_data']['photo'] = null;
}
$itemData['custom_data']['product_price'] = $_POST['product_price'];
$itemData['custom_data']['total_price'] = floatval($_POST['product_price']) + floatval($_POST['labeling_price']);
$attributes = [];
if(!empty($_POST['attributes'])) {
foreach ($_POST['attributes'] as $key => $value) {
$attributes['attribute_' . $key] = $value;
wc_add_notice('Błąd podczas dodawania do koszyka', 'error');
}
}
try {
$cart_item_key = WC()->cart->add_to_cart(
$product->get_id(),
$_POST['quantity'],
0,
$attributes,
$itemData
);
if ($cart_item_key) {
wp_redirect(wc_get_cart_url());
exit;
} else {
wc_add_notice('Błąd podczas dodawania do koszyka', 'error');
}
} catch (\Throwable $th) {
wc_add_notice('Wystąpił błąd: ' . $th->getMessage(), 'error');
}
}
}
public function updatePrice($cart) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if (did_action('woocommerce_before_calculate_totals') >= 2)
return;
foreach ($cart->get_cart() as $cart_item) {
if (isset($cart_item['custom_data']['total_price'])) {
$setup_price = !empty($cart_item['custom_data']['setup_price']) ? $cart_item['custom_data']['setup_price']: 0;
$price = $setup_price / $cart_item['quantity'] + $cart_item['custom_data']['total_price'];
// TODO: calculate data after price update;
$cart_item['data']->set_price($price);
}
}
}
public function showCustomData($item_data, $custom_data)
{
// var_dump($custom_data);
if(!empty($custom_data['custom_data']['option'])) {
$item_data[] = [
'key' => "Pozycja znakowania",
'value' => wc_clean($custom_data['custom_data']['option']),
];
}
if(!empty($custom_data['custom_data']['technology'])) {
$item_data[] = [
'key' => "Technologia znakowania",
'value' => wc_clean($custom_data['custom_data']['technology']),
];
}
// if(!empty($custom_data['custom_data']['quantity'])) {
// $item_data[] = [
// 'key' => "Ilość",
// 'value' => wc_clean($custom_data['custom_data']['quantity']),
// ];
// }
if(!empty($custom_data['custom_data']['labeling_price'])) {
$item_data[] = [
'key' => "Cena znakowania",
'value' => wc_clean($custom_data['custom_data']['labeling_price']),
];
}
if(!empty($custom_data['custom_data']['setup_price'])) {
$item_data[] = [
'key' => "Koszt przygotowania",
'value' => wc_clean($custom_data['custom_data']['setup_price']),
];
}
/*if(!empty($custom_data['custom_data']['product_price'])) {
$item_data[] = [
'key' => "Cena produktu",
'value' => wc_clean($custom_data['custom_data']['product_price']),
];
}*/
if(!empty($custom_data['custom_data']['photo'])) {
$attachment_id = $custom_data['custom_data']['photo'];
if (is_numeric($attachment_id)) {
$image_html = wp_get_attachment_image($attachment_id, array(800, 600));
$item_data[] = [
'key' => "Zdjęcie nadruku",
'value' => $image_html,
];
} else {
$item_data[] = [
'key' => "Zdjęcie nadruku",
'value' => 'Brak przesłanego pliku',
];
}
}
if(!empty($custom_data['custom_data']['color'])) {
$item_data[] = [
'key' => "Kolor",
'value' => wc_clean($custom_data['custom_data']['color']),
];
}
if(!empty($custom_data['custom_data']['colors'])) {
$item_data[] = [
'key' => "Ilość kolorów",
'value' => wc_clean($custom_data['custom_data']['colors']),
];
}
// if(!empty($custom_data['custom_data']['total_price'])) {
// $item_data[] = [
// 'key' => "Suma",
// 'value' => wc_clean($custom_data['custom_data']['total_price']),
// ];
// }
return $item_data;
}
public function calculatorView()
{
global $product;
$productInfo = $this->productRepository->getProductInfo($product->get_sku());
if(!empty($productInfo)) {
$productInfo = $productInfo['message'];
\wp_enqueue_script("calculatorScript", plugins_url("/pandaGadzety/assets/js/calculator.js"));
wp_localize_script('calculatorScript', 'calculatorScriptVariables', array(
'productInfo' => $productInfo
)
);
\wp_enqueue_style("calculatorStyle", plugins_url("/pandaGadzety/assets/css/calculator.css"));
$html = file_get_contents("wp-content/plugins/pandaGadzety/view/calculator.html");
echo $html;
}
}
/*private function uploadFile($key, $id) {
// TODO: verify format
require_once (ABSPATH . 'wp-admin/includes/image.php');
require_once (ABSPATH . 'wp-admin/includes/file.php');
require_once (ABSPATH . 'wp-admin/includes/media.php');
return \media_handle_upload($key, $id);
}*/
private function uploadFile($key, $id) {
require_once (ABSPATH . 'wp-admin/includes/image.php');
require_once (ABSPATH . 'wp-admin/includes/file.php');
require_once (ABSPATH . 'wp-admin/includes/media.php');
$attachment_id = media_handle_upload($key, $id);
if (is_wp_error($attachment_id)) {
// error_log('Błąd przesyłania pliku: ' . $attachment_id->get_error_message());
//wc_add_notice('Błąd przesyłania pliku: ' . $attachment_id->get_error_message(), 'error');
return null;
}
return $attachment_id;
}
}