1430 lines
62 KiB
PHP
1430 lines
62 KiB
PHP
<?php
|
||
include_once(plugin_dir_path(__DIR__) . 'services/ssbhesabixItemService.php');
|
||
include_once(plugin_dir_path(__DIR__) . 'services/ssbhesabixCustomerService.php');
|
||
include_once(plugin_dir_path(__DIR__) . 'services/HesabixLogService.php');
|
||
include_once(plugin_dir_path(__DIR__) . 'services/HesabixWpFaService.php');
|
||
|
||
/**
|
||
* @class Ssbhesabix_Admin_Functions
|
||
* @version 2.0.93
|
||
* @since 1.0.0
|
||
* @package ssbhesabix
|
||
* @subpackage ssbhesabix/admin/functions
|
||
* @author Saeed Sattar Beglou <saeed.sb@gmail.com>
|
||
* @author HamidReza Gharahzadeh <hamidprime@gmail.com>
|
||
* @author Sepehr Najafi <sepehrn249@gmail.com>
|
||
* @author Babak Alizadeh <alizadeh.babak@gmail.com>
|
||
*/
|
||
class Ssbhesabix_Admin_Functions
|
||
{
|
||
public static function isDateInFiscalYear($date)
|
||
{
|
||
$hesabixApi = new Ssbhesabix_Api();
|
||
$fiscalYear = $hesabixApi->settingGetFiscalYear();
|
||
|
||
if (is_object($fiscalYear)) {
|
||
|
||
if ($fiscalYear->Success) {
|
||
$fiscalYearStartTimeStamp = strtotime($fiscalYear->Result->StartDate);
|
||
$fiscalYearEndTimeStamp = strtotime($fiscalYear->Result->EndDate);
|
||
$dateTimeStamp = strtotime($date);
|
||
|
||
if ($dateTimeStamp >= $fiscalYearStartTimeStamp && $dateTimeStamp <= $fiscalYearEndTimeStamp) {
|
||
return 1;
|
||
} else {
|
||
return 0;
|
||
}
|
||
} else {
|
||
HesabixLogService::log(array("Cannot get FiscalDate. Error Code: $fiscalYear->ErrroCode. Error Message: $fiscalYear->ErrorMessage"));
|
||
return false;
|
||
}
|
||
}
|
||
HesabixLogService::log(array("Cannot connect to Hesabix for get FiscalDate."));
|
||
return false;
|
||
}
|
||
//====================================================================================================================
|
||
public function getProductVariations($id_product)
|
||
{
|
||
if (!isset($id_product)) {
|
||
return false;
|
||
}
|
||
$product = wc_get_product($id_product);
|
||
|
||
if (is_bool($product)) return false;
|
||
if ($product->is_type('variable')) {
|
||
$children = $product->get_children($args = '', $output = OBJECT);
|
||
$variations = array();
|
||
foreach ($children as $value) {
|
||
$product_variatons = new WC_Product_Variation($value);
|
||
if ($product_variatons->exists()) {
|
||
$variations[] = $product_variatons;
|
||
}
|
||
}
|
||
return $variations;
|
||
}
|
||
return false;
|
||
}
|
||
//========================================================================================================
|
||
public function setItems($id_product_array)
|
||
{
|
||
if (!isset($id_product_array) || $id_product_array[0] == null) return false;
|
||
if (is_array($id_product_array) && empty($id_product_array)) return true;
|
||
|
||
$items = array();
|
||
foreach ($id_product_array as $id_product) {
|
||
$product = new WC_Product($id_product);
|
||
if ($product->get_status() === "draft") continue;
|
||
|
||
$items[] = ssbhesabixItemService::mapProduct($product, $id_product, false);
|
||
|
||
$variations = $this->getProductVariations($id_product);
|
||
if ($variations)
|
||
foreach ($variations as $variation)
|
||
$items[] = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product, false);
|
||
}
|
||
|
||
if (count($items) === 0) return false;
|
||
if (!$this->saveItems($items)) return false;
|
||
return true;
|
||
}
|
||
//====================================================================================================================
|
||
public function saveItems($items)
|
||
{
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$wpFaService = new HesabixWpFaService();
|
||
|
||
$response = $hesabix->itemBatchSave($items);
|
||
if ($response->Success) {
|
||
foreach ($response->Result as $item)
|
||
$wpFaService->saveProduct($item);
|
||
return true;
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add/update Hesabix items. Error Code: " . (string)$response->ErrorCode . ". Error Message: $response->ErrorMessage."));
|
||
return false;
|
||
}
|
||
}
|
||
//====================================================================================================================
|
||
public function getContactCodeByCustomerId($id_customer)
|
||
{
|
||
if (!isset($id_customer)) {
|
||
return false;
|
||
}
|
||
|
||
global $wpdb;
|
||
$row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_customer AND `obj_type` = 'customer'");
|
||
|
||
if (is_object($row)) {
|
||
return $row->id_hesabix;
|
||
} else {
|
||
return null;
|
||
}
|
||
}
|
||
//====================================================================================================================
|
||
public function setContact($id_customer, $type = 'first', $id_order = '')
|
||
{
|
||
if (!isset($id_customer)) return false;
|
||
|
||
$code = $this->getContactCodeByCustomerId($id_customer);
|
||
|
||
$hesabixCustomer = ssbhesabixCustomerService::mapCustomer($code, $id_customer, $type, $id_order);
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->contactSave($hesabixCustomer);
|
||
|
||
if ($response->Success) {
|
||
$wpFaService = new HesabixWpFaService();
|
||
$wpFaService->saveCustomer($response->Result);
|
||
return $response->Result->Code;
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add/update customer. Error Code: " . (string)$response->ErrroCode . ". Error Message: " . (string)$response->ErrorMessage . ". Customer ID: $id_customer"));
|
||
return false;
|
||
}
|
||
}
|
||
//====================================================================================================================
|
||
public function setGuestCustomer($id_order)
|
||
{
|
||
if (!isset($id_order)) return false;
|
||
|
||
//$order = new WC_Order($id_order);
|
||
$order = wc_get_order($id_order);
|
||
|
||
$contactCode = $this->getContactCodeByPhoneOrEmail($order->get_billing_phone(), $order->get_billing_email());
|
||
|
||
$hesabixCustomer = ssbhesabixCustomerService::mapGuestCustomer($contactCode, $id_order);
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->contactSave($hesabixCustomer);
|
||
|
||
if ($response->Success) {
|
||
$wpFaService = new HesabixWpFaService();
|
||
$wpFaService->saveCustomer($response->Result);
|
||
return (int)$response->Result->Code;
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add/update contact. Error Code: " . (string)$response->ErrroCode . ". Error Message: " . (string)$response->ErrorMessage . ". Customer ID: Guest Customer"));
|
||
return false;
|
||
}
|
||
}
|
||
//====================================================================================================================
|
||
public function getContactCodeByPhoneOrEmail($phone, $email)
|
||
{
|
||
if (!$email && !$phone) return null;
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->contactGetByPhoneOrEmail($phone, $email);
|
||
|
||
if (is_object($response)) {
|
||
if ($response->Success && $response->Result->TotalCount > 0) {
|
||
$contact_obj = $response->Result->List;
|
||
|
||
if (!$contact_obj[0]->Code || $contact_obj[0]->Code == '0' || $contact_obj[0]->Code == '000000') return null;
|
||
|
||
foreach ($contact_obj as $contact) {
|
||
if (($contact->phone == $phone || $contact->mobile = $phone) && $contact->email == $email)
|
||
return (int)$contact->Code;
|
||
}
|
||
foreach ($contact_obj as $contact) {
|
||
if ($phone && $contact->phone == $phone || $contact->mobile = $phone)
|
||
return (int)$contact->Code;
|
||
}
|
||
foreach ($contact_obj as $contact) {
|
||
if ($email && $contact->email == $email)
|
||
return (int)$contact->Code;
|
||
}
|
||
return null;
|
||
}
|
||
} else {
|
||
HesabixLogService::log(array("Cannot get Contact list. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode."));
|
||
}
|
||
|
||
return null;
|
||
}
|
||
//====================================================================================================================
|
||
//Invoice
|
||
public function setOrder($id_order, $orderType = 0, $reference = null)
|
||
{
|
||
if (!isset($id_order)) {
|
||
return false;
|
||
}
|
||
|
||
$wpFaService = new HesabixWpFaService();
|
||
|
||
$number = $this->getInvoiceNumberByOrderId($id_order);
|
||
if (!$number) {
|
||
$number = null;
|
||
if ($orderType == 2) //return if saleInvoice not set before
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// $order = new WC_Order($id_order);
|
||
$order = wc_get_order($id_order);
|
||
|
||
$dokanOption = get_option("ssbhesabix_invoice_dokan", 0);
|
||
|
||
if ($dokanOption && is_plugin_active("dokan-lite/dokan.php")) {
|
||
$orderCreated = $order->get_created_via();
|
||
if ($dokanOption == 1 && $orderCreated !== 'checkout')
|
||
return false;
|
||
else if ($dokanOption == 2 && $orderCreated === 'checkout')
|
||
return false;
|
||
}
|
||
|
||
$id_customer = $order->get_customer_id();
|
||
if ($id_customer !== 0) {
|
||
|
||
$contactCode = $this->setContact($id_customer, 'first', $id_order);
|
||
|
||
if ($contactCode == null) {
|
||
if (!$contactCode) {
|
||
return false;
|
||
}
|
||
}
|
||
HesabixLogService::writeLogStr("order ID " . $id_order);
|
||
if (get_option('ssbhesabix_contact_address_status') == 2) {
|
||
$this->setContact($id_customer, 'billing', $id_order);
|
||
} elseif (get_option('ssbhesabix_contact_address_status') == 3) {
|
||
$this->setContact($id_customer, 'shipping', $id_order);
|
||
}
|
||
} else {
|
||
$contactCode = $this->setGuestCustomer($id_order);
|
||
if (!$contactCode) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
global $notDefinedProductID;
|
||
$notDefinedItems = array();
|
||
$products = $order->get_items();
|
||
foreach ($products as $product) {
|
||
if ($product['product_id'] == 0) continue;
|
||
$itemCode = $wpFaService->getProductCodeByWpId($product['product_id'], $product['variation_id']);
|
||
if ($itemCode == null) {
|
||
$notDefinedItems[] = $product['product_id'];
|
||
}
|
||
}
|
||
|
||
if (!empty($notDefinedItems)) {
|
||
if (!$this->setItems($notDefinedItems)) {
|
||
HesabixLogService::writeLogStr("Cannot add/update Invoice. Failed to set products. Order ID: $id_order");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
$invoiceItems = array();
|
||
$i = 0;
|
||
$failed = false;
|
||
foreach ($products as $key => $product) {
|
||
$itemCode = $wpFaService->getProductCodeByWpId($product['product_id'], $product['variation_id']);
|
||
|
||
if ($itemCode == null) {
|
||
$pId = $product['product_id'];
|
||
$vId = $product['variation_id'];
|
||
HesabixLogService::writeLogStr("Item not found. productId: $pId, variationId: $vId, Order ID: $id_order");
|
||
|
||
$failed = true;
|
||
break;
|
||
}
|
||
|
||
// $wcProduct = new WC_Product($product['product_id']);
|
||
|
||
if($product['variation_id']) {
|
||
$wcProduct = wc_get_product($product['variation_id']);
|
||
} else {
|
||
$wcProduct = wc_get_product($product['product_id']);
|
||
}
|
||
|
||
global $discount, $price;
|
||
if( $wcProduct->is_on_sale() && get_option('ssbhesabix_set_special_sale_as_discount') === 'yes' ) {
|
||
$price = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price());
|
||
$discount = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price() - $wcProduct->get_sale_price());
|
||
$discount *= $product['quantity'];
|
||
} else {
|
||
$price = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] / $product['quantity']);
|
||
$discount = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] - $product['total']);
|
||
}
|
||
|
||
$item = array(
|
||
'RowNumber' => $i,
|
||
'ItemCode' => $itemCode,
|
||
'Description' => Ssbhesabix_Validation::invoiceItemDescriptionValidation($product['name']),
|
||
'Quantity' => (int)$product['quantity'],
|
||
'UnitPrice' => (float)$price,
|
||
'Discount' => (float)$discount,
|
||
'Tax' => (float)$this->getPriceInHesabixDefaultCurrency($product['total_tax']),
|
||
);
|
||
|
||
$invoiceItems[] = $item;
|
||
$i++;
|
||
}
|
||
|
||
if ($failed) {
|
||
HesabixLogService::writeLogStr("Cannot add/update Invoice. Item code is NULL. Check your invoice products and relations with Hesabix. Order ID: $id_order");
|
||
return false;
|
||
}
|
||
|
||
if (empty($invoiceItems)) {
|
||
HesabixLogService::log(array("Cannot add/update Invoice. At least one item required."));
|
||
return false;
|
||
}
|
||
|
||
$date_obj = $order->get_date_created();
|
||
switch ($orderType) {
|
||
case 0:
|
||
$date = $date_obj->date('Y-m-d H:i:s');
|
||
break;
|
||
case 2:
|
||
$date = date('Y-m-d H:i:s');
|
||
break;
|
||
default:
|
||
$date = $date_obj->date('Y-m-d H:i:s');
|
||
}
|
||
|
||
if ($reference === null)
|
||
$reference = $id_order;
|
||
|
||
$order_shipping_method = "";
|
||
foreach ($order->get_items('shipping') as $item)
|
||
$order_shipping_method = $item->get_name();
|
||
|
||
$note = $order->customer_note;
|
||
if ($order_shipping_method)
|
||
$note .= "\n" . __('Shipping method', 'ssbhesabix') . ": " . $order_shipping_method;
|
||
|
||
global $freightOption, $freightItemCode;
|
||
$freightOption = get_option("ssbhesabix_invoice_freight");
|
||
|
||
if($freightOption == 1) {
|
||
$freightItemCode = get_option('ssbhesabix_invoice_freight_code');
|
||
if(!isset($freightItemCode) || !$freightItemCode) HesabixLogService::writeLogStr("کد هزینه حمل و نقل تعریف نشده است" . "\n" . "Freight service code is not set");
|
||
|
||
$freightItemCode = $this->convertPersianDigitsToEnglish($freightItemCode);
|
||
|
||
if($this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()) != 0) {
|
||
$invoiceItem = array(
|
||
'RowNumber' => $i,
|
||
'ItemCode' => $freightItemCode,
|
||
'Description' => 'هزینه حمل و نقل',
|
||
'Quantity' => 1,
|
||
'UnitPrice' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()),
|
||
'Discount' => 0,
|
||
'Tax' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_tax())
|
||
);
|
||
$invoiceItems[] = $invoiceItem;
|
||
}
|
||
}
|
||
|
||
$data = array(
|
||
'Number' => $number,
|
||
'InvoiceType' => $orderType,
|
||
'ContactCode' => $contactCode,
|
||
'Date' => $date,
|
||
'DueDate' => $date,
|
||
'Reference' => $reference,
|
||
'Status' => 2,
|
||
'Tag' => json_encode(array('id_order' => $id_order)),
|
||
'InvoiceItems' => $invoiceItems,
|
||
'Note' => $note,
|
||
'Freight' => ''
|
||
);
|
||
|
||
if($freightOption == 0) {
|
||
$freight = $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total() + $order->get_shipping_tax());
|
||
$data['Freight'] = $freight;
|
||
}
|
||
|
||
$invoice_draft_save = get_option('ssbhesabix_invoice_draft_save_in_hesabix', 'no');
|
||
if ($invoice_draft_save != 'no')
|
||
$data['Status'] = 0;
|
||
|
||
$invoice_project = get_option('ssbhesabix_invoice_project', -1);
|
||
$invoice_salesman = get_option('ssbhesabix_invoice_salesman', -1);
|
||
$invoice_salesman_percentage = get_option('ssbhesabix_invoice_salesman_percentage', 0);
|
||
if ($invoice_project != -1) $data['Project'] = $invoice_project;
|
||
if ($invoice_salesman != -1) $data['SalesmanCode'] = $invoice_salesman;
|
||
if($invoice_salesman_percentage) if($invoice_salesman_percentage != 0) $data['SalesmanPercent'] = $this->convertPersianDigitsToEnglish($invoice_salesman_percentage);
|
||
|
||
$GUID = $this->getGUID($id_order);
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->invoiceSave($data, $GUID);
|
||
// $response = $hesabix->invoiceSave($data, '');
|
||
|
||
if ($response->Success) {
|
||
global $wpdb;
|
||
|
||
switch ($orderType) {
|
||
case 0:
|
||
$obj_type = 'order';
|
||
break;
|
||
case 2:
|
||
$obj_type = 'returnOrder';
|
||
break;
|
||
}
|
||
|
||
if ($number === null) {
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array(
|
||
'id_hesabix' => (int)$response->Result->Number,
|
||
'obj_type' => $obj_type,
|
||
'id_ps' => $id_order,
|
||
));
|
||
HesabixLogService::log(array("Invoice successfully added. Invoice number: " . (string)$response->Result->Number . ". Order ID: $id_order"));
|
||
} else {
|
||
$wpFaId = $wpFaService->getWpFaId($obj_type, $id_order);
|
||
|
||
$wpdb->update($wpdb->prefix . 'ssbhesabix', array(
|
||
'id_hesabix' => (int)$response->Result->Number,
|
||
'obj_type' => $obj_type,
|
||
'id_ps' => $id_order,
|
||
), array('id' => $wpFaId));
|
||
HesabixLogService::log(array("Invoice successfully updated. Invoice number: " . (string)$response->Result->Number . ". Order ID: $id_order"));
|
||
}
|
||
|
||
$warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1");
|
||
if ($warehouse != "-1" && $orderType === 0)
|
||
$this->setWarehouseReceipt($invoiceItems, (int)$response->Result->Number, $warehouse, $date, $invoice_project);
|
||
|
||
return true;
|
||
} else {
|
||
foreach ($invoiceItems as $item) {
|
||
HesabixLogService::log(array("Cannot add/update Invoice. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ". Order ID: $id_order" . "\n"
|
||
. "Hesabix Id:" . $item['ItemCode']
|
||
));
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function setWarehouseReceipt($items, $invoiceNumber, $warehouseCode, $date, $project)
|
||
{
|
||
$invoiceOption = get_option('ssbhesabix_invoice_freight');
|
||
if($invoiceOption == 1) {
|
||
$invoiceFreightCode = get_option('ssbhesabix_invoice_freight_code');
|
||
for ($i = 0 ; $i < count($items) ; $i++) {
|
||
if($items[$i]["ItemCode"] == $invoiceFreightCode) {
|
||
unset($items[$i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
$data = array(
|
||
'WarehouseCode' => $warehouseCode,
|
||
'InvoiceNumber' => $invoiceNumber,
|
||
'InvoiceType' => 0,
|
||
'Date' => $date,
|
||
'Items' => $items
|
||
);
|
||
|
||
if ($project != -1)
|
||
$data['Project'] = $project;
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->saveWarehouseReceipt($data);
|
||
|
||
if ($response->Success)
|
||
HesabixLogService::log(array("Warehouse receipt successfully saved/updated. warehouse receipt number: " . (string)$response->Result->Number . ". Invoice number: $invoiceNumber"));
|
||
else
|
||
HesabixLogService::log(array("Cannot save/update Warehouse receipt. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ". Invoice number: $invoiceNumber"));
|
||
}
|
||
//========================================================================================================================
|
||
public static function getPriceInHesabixDefaultCurrency($price)
|
||
{
|
||
if (!isset($price)) return false;
|
||
|
||
$woocommerce_currency = get_woocommerce_currency();
|
||
$hesabix_currency = get_option('ssbhesabix_hesabix_default_currency');
|
||
|
||
if (!is_numeric($price))
|
||
$price = intval($price);
|
||
|
||
if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT')
|
||
$price *= 10;
|
||
|
||
if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR')
|
||
$price /= 10;
|
||
|
||
return $price;
|
||
}
|
||
//========================================================================================================================
|
||
public static function getPriceInWooCommerceDefaultCurrency($price)
|
||
{
|
||
if (!isset($price)) return false;
|
||
|
||
$woocommerce_currency = get_woocommerce_currency();
|
||
$hesabix_currency = get_option('ssbhesabix_hesabix_default_currency');
|
||
|
||
if (!is_numeric($price))
|
||
$price = intval($price);
|
||
|
||
if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT')
|
||
$price /= 10;
|
||
|
||
if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR')
|
||
$price *= 10;
|
||
|
||
return $price;
|
||
}
|
||
//========================================================================================================================
|
||
public function setOrderPayment($id_order)
|
||
{
|
||
if (!isset($id_order)) {
|
||
return false;
|
||
}
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$number = $this->getInvoiceCodeByOrderId($id_order);
|
||
if (!$number) {
|
||
return false;
|
||
}
|
||
|
||
//$order = new WC_Order($id_order);
|
||
$order = wc_get_order($id_order);
|
||
|
||
if ($order->get_total() <= 0) {
|
||
return true;
|
||
}
|
||
$bank_code = $this->getBankCodeByPaymentMethod($order->get_payment_method());
|
||
|
||
if ($bank_code == -1) {
|
||
return true;
|
||
} elseif ($bank_code != false) {
|
||
$transaction_id = $order->get_transaction_id();
|
||
//transaction id cannot be null or empty
|
||
if ($transaction_id == '') {
|
||
$transaction_id = '-';
|
||
}
|
||
|
||
$payTempValue = substr($bank_code, 0, 4);
|
||
global $financialData;
|
||
if(get_option('ssbhesabix_payment_option') == 'no') {
|
||
switch($payTempValue) {
|
||
case 'bank':
|
||
$payTempValue = substr($bank_code, 4);
|
||
$financialData = array('bankCode' => $payTempValue);break;
|
||
case 'cash':
|
||
$payTempValue = substr($bank_code, 4);
|
||
$financialData = array('cashCode' => $payTempValue);break;
|
||
}
|
||
} elseif (get_option('ssbhesabix_payment_option') == 'yes') {
|
||
$defaultBankCode = $this->convertPersianDigitsToEnglish(get_option('ssbhesabix_default_payment_method_code'));
|
||
$financialData = array('bankCode' => $defaultBankCode);
|
||
}
|
||
|
||
$date_obj = $order->get_date_paid();
|
||
if ($date_obj == null) {
|
||
$date_obj = $order->get_date_modified();
|
||
}
|
||
|
||
global $accountPath;
|
||
|
||
if(get_option("ssbhesabix_cash_in_transit") == "1" || get_option("ssbhesabix_cash_in_transit") == "yes") {
|
||
$func = new Ssbhesabix_Admin_Functions();
|
||
$cashInTransitFullPath = $func->getCashInTransitFullPath();
|
||
if(!$cashInTransitFullPath) {
|
||
HesabixLogService::writeLogStr("Cash in Transit is not Defined in Hesabix ---- وجوه در راه در حسابیکس یافت نشد");
|
||
return false;
|
||
} else {
|
||
$accountPath = array("accountPath" => $cashInTransitFullPath);
|
||
}
|
||
}
|
||
|
||
$response = $hesabix->invoiceGet($number);
|
||
if ($response->Success) {
|
||
if ($response->Result->Paid > 0) {
|
||
// payment submited before
|
||
} else {
|
||
$response = $hesabix->invoiceSavePayment($number, $financialData, $accountPath, $date_obj->date('Y-m-d H:i:s'), $this->getPriceInHesabixDefaultCurrency($order->get_total()), $transaction_id);
|
||
|
||
if ($response->Success) {
|
||
HesabixLogService::log(array("Hesabix invoice payment added. Order ID: $id_order"));
|
||
return true;
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add Hesabix Invoice payment. Order ID: $id_order. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . "."));
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
} else {
|
||
HesabixLogService::log(array("Error while trying to get invoice. Invoice Number: $number. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . "."));
|
||
return false;
|
||
}
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add Hesabix Invoice payment - Bank Code not defined. Order ID: $id_order"));
|
||
return false;
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function getCashInTransitFullPath() {
|
||
$api = new Ssbhesabix_Api();
|
||
$accounts = $api->settingGetAccounts();
|
||
foreach ($accounts->Result as $account) {
|
||
if($account->Name == "وجوه در راه") {
|
||
return $account->FullPath;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
//========================================================================================================================
|
||
public function getInvoiceNumberByOrderId($id_order)
|
||
{
|
||
if (!isset($id_order)) return false;
|
||
|
||
global $wpdb;
|
||
$row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'");
|
||
|
||
if (is_object($row)) {
|
||
return $row->id_hesabix;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function getBankCodeByPaymentMethod($payment_method)
|
||
{
|
||
$code = get_option('ssbhesabix_payment_method_' . $payment_method);
|
||
|
||
if (isset($code))
|
||
return $code;
|
||
else
|
||
return false;
|
||
}
|
||
//========================================================================================================================
|
||
public function getInvoiceCodeByOrderId($id_order)
|
||
{
|
||
if (!isset($id_order)) return false;
|
||
|
||
global $wpdb;
|
||
$row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'");
|
||
|
||
if (is_object($row)) {
|
||
return $row->id_hesabix;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function exportProducts($batch, $totalBatch, $total, $updateCount)
|
||
{
|
||
HesabixLogService::writeLogStr("Exporting Products");
|
||
try {
|
||
$wpFaService = new HesabixWpFaService();
|
||
$extraSettingRPP = get_option("ssbhesabix_set_rpp_for_export_products");
|
||
$rpp=500;
|
||
if($extraSettingRPP) {
|
||
if($extraSettingRPP != '-1' && $extraSettingRPP != '0') {
|
||
$rpp=$extraSettingRPP;
|
||
}
|
||
}
|
||
$result = array();
|
||
$result["error"] = false;
|
||
global $wpdb;
|
||
|
||
if ($batch == 1) {
|
||
$total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'product' AND post_status IN('publish','private')");
|
||
$totalBatch = ceil($total / $rpp);
|
||
}
|
||
|
||
$offset = ($batch - 1) * $rpp;
|
||
$products = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC LIMIT $offset,$rpp");
|
||
|
||
$items = array();
|
||
|
||
foreach ($products as $item) {
|
||
$id_product = $item->ID;
|
||
$product = new WC_Product($id_product);
|
||
|
||
$id_obj = $wpFaService->getWpFaId('product', $id_product, 0);
|
||
|
||
if (!$id_obj) {
|
||
$hesabixItem = ssbhesabixItemService::mapProduct($product, $id_product);
|
||
array_push($items, $hesabixItem);
|
||
$updateCount++;
|
||
}
|
||
|
||
$variations = $this->getProductVariations($id_product);
|
||
if ($variations) {
|
||
foreach ($variations as $variation) {
|
||
$id_attribute = $variation->get_id();
|
||
$id_obj = $wpFaService->getWpFaId('product', $id_product, $id_attribute);
|
||
|
||
if (!$id_obj) {
|
||
$hesabixItem = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product);
|
||
array_push($items, $hesabixItem);
|
||
$updateCount++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!empty($items)) {
|
||
$count = 0;
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->itemBatchSave($items);
|
||
if ($response->Success) {
|
||
foreach ($response->Result as $item) {
|
||
$json = json_decode($item->Tag);
|
||
|
||
global $wpdb;
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array(
|
||
'id_hesabix' => (int)$item->Code,
|
||
'obj_type' => 'product',
|
||
'id_ps' => (int)$json->id_product,
|
||
'id_ps_attribute' => (int)$json->id_attribute,
|
||
));
|
||
HesabixLogService::log(array("Item successfully added. Item Code: " . (string)$item->Code . ". Product ID: $json->id_product - $json->id_attribute"));
|
||
}
|
||
$count += count($response->Result);
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add bulk item. Error Message: " . (string)$response->ErrorMessage . ". Error Code: " . (string)$response->ErrorCode . "."));
|
||
}
|
||
sleep(2);
|
||
}
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
$result["updateCount"] = $updateCount;
|
||
return $result;
|
||
} catch(Error $error) {
|
||
HesabixLogService::writeLogStr("Error in export products: " . $error->getMessage());
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function importProducts($batch, $totalBatch, $total, $updateCount)
|
||
{
|
||
HesabixLogService::writeLogStr("Import Products");
|
||
try {
|
||
$wpFaService = new HesabixWpFaService();
|
||
$rpp=500;
|
||
$result = array();
|
||
$result["error"] = false;
|
||
global $wpdb;
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$filters = array(array("Property" => "ItemType", "Operator" => "=", "Value" => 0));
|
||
|
||
if ($batch == 1) {
|
||
$total = 0;
|
||
$response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters));
|
||
if ($response->Success) {
|
||
$total = $response->Result->FilteredCount;
|
||
$totalBatch = ceil($total / $rpp);
|
||
} else {
|
||
HesabixLogService::log(array("Error while trying to get products for import. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode."));
|
||
$result["error"] = true;
|
||
return $result;
|
||
};
|
||
}
|
||
|
||
$id_product_array = array();
|
||
$offset = ($batch - 1) * $rpp;
|
||
|
||
$response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters));
|
||
if ($response->Success) {
|
||
$items = $response->Result->List;
|
||
$from = $response->Result->From;
|
||
$to = $response->Result->To;
|
||
|
||
foreach ($items as $item) {
|
||
$wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code);
|
||
if ($wpFa) continue;
|
||
|
||
$clearedName = preg_replace("/\s+|\/|\\\|\(|\)/", '-', trim($item->Name));
|
||
$clearedName = preg_replace("/\-+/", '-', $clearedName);
|
||
$clearedName = trim($clearedName, '-');
|
||
$clearedName = preg_replace(["/۰/", "/۱/", "/۲/", "/۳/", "/۴/", "/۵/", "/۶/", "/۷/", "/۸/", "/۹/"],
|
||
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], $clearedName);
|
||
|
||
// add product to database
|
||
$wpdb->insert($wpdb->prefix . 'posts', array(
|
||
'post_author' => get_current_user_id(),
|
||
'post_date' => date("Y-m-d H:i:s"),
|
||
'post_date_gmt' => date("Y-m-d H:i:s"),
|
||
'post_content' => '',
|
||
'post_title' => $item->Name,
|
||
'post_excerpt' => '',
|
||
'post_status' => 'private',
|
||
'comment_status' => 'open',
|
||
'ping_status' => 'closed',
|
||
'post_password' => '',
|
||
'post_name' => $clearedName,
|
||
'to_ping' => '',
|
||
'pinged' => '',
|
||
'post_modified' => date("Y-m-d H:i:s"),
|
||
'post_modified_gmt' => date("Y-m-d H:i:s"),
|
||
'post_content_filtered' => '',
|
||
'post_parent' => 0,
|
||
'guid' => get_site_url() . '/product/' . $clearedName . '/',
|
||
'menu_order' => 0,
|
||
'post_type' => 'product',
|
||
'post_mime_type' => '',
|
||
'comment_count' => 0,
|
||
));
|
||
|
||
$postId = $wpdb->insert_id;
|
||
$id_product_array[] = $postId;
|
||
$price = self::getPriceInWooCommerceDefaultCurrency($item->SellPrice);
|
||
|
||
// add product link to hesabix
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array(
|
||
'obj_type' => 'product',
|
||
'id_hesabix' => (int)$item->Code,
|
||
'id_ps' => $postId,
|
||
'id_ps_attribute' => 0,
|
||
));
|
||
|
||
update_post_meta($postId, '_manage_stock', 'yes');
|
||
update_post_meta($postId, '_sku', $item->Barcode);
|
||
update_post_meta($postId, '_regular_price', $price);
|
||
update_post_meta($postId, '_price', $price);
|
||
update_post_meta($postId, '_stock', $item->Stock);
|
||
|
||
$new_stock_status = ($item->Stock > 0) ? "instock" : "outofstock";
|
||
wc_update_product_stock_status($postId, $new_stock_status);
|
||
$updateCount++;
|
||
}
|
||
|
||
} else {
|
||
HesabixLogService::log(array("Error while trying to get products for import. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode."));
|
||
$result["error"] = true;
|
||
return $result;
|
||
}
|
||
sleep(2);
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
$result["updateCount"] = $updateCount;
|
||
return $result;
|
||
} catch(Error $error) {
|
||
HesabixLogService::writeLogStr("Error in importing products" . $error->getMessage());
|
||
}
|
||
}
|
||
|
||
//========================================================================================================================
|
||
public function exportCustomers($batch, $totalBatch, $total, $updateCount)
|
||
{
|
||
HesabixLogService::writeLogStr("Export Customers");
|
||
$wpFaService = new HesabixWpFaService();
|
||
|
||
$result = array();
|
||
$result["error"] = false;
|
||
$rpp = 500;
|
||
global $wpdb;
|
||
|
||
if ($batch == 1) {
|
||
$total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "users`");
|
||
$totalBatch = ceil($total / $rpp);
|
||
}
|
||
|
||
$offset = ($batch - 1) * $rpp;
|
||
$customers = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "users` ORDER BY ID ASC LIMIT $offset,$rpp");
|
||
|
||
$items = array();
|
||
foreach ($customers as $item) {
|
||
$id_customer = $item->ID;
|
||
$id_obj = $wpFaService->getWpFaId('customer', $id_customer);
|
||
if (!$id_obj) {
|
||
$hesabixCustomer = ssbhesabixCustomerService::mapCustomer(null, $id_customer);
|
||
array_push($items, $hesabixCustomer);
|
||
$updateCount++;
|
||
}
|
||
}
|
||
|
||
if (!empty($items)) {
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$response = $hesabix->contactBatchSave($items);
|
||
if ($response->Success) {
|
||
foreach ($response->Result as $item) {
|
||
$json = json_decode($item->Tag);
|
||
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array(
|
||
'id_hesabix' => (int)$item->Code,
|
||
'obj_type' => 'customer',
|
||
'id_ps' => (int)$json->id_customer,
|
||
));
|
||
|
||
HesabixLogService::log(array("Contact successfully added. Contact Code: " . $item->Code . ". Customer ID: " . (int)$json->id_customer));
|
||
}
|
||
} else {
|
||
HesabixLogService::log(array("Cannot add bulk contacts. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode."));
|
||
}
|
||
}
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
$result["updateCount"] = $updateCount;
|
||
|
||
return $result;
|
||
}
|
||
//========================================================================================================================
|
||
public function syncOrders($from_date, $batch, $totalBatch, $total, $updateCount)
|
||
{
|
||
|
||
HesabixLogService::writeLogStr("Sync Orders");
|
||
$wpFaService = new HesabixWpFaService();
|
||
|
||
$result = array();
|
||
$result["error"] = false;
|
||
$rpp = 10;
|
||
global $wpdb;
|
||
|
||
if (!isset($from_date) || empty($from_date)) {
|
||
$result['error'] = 'inputDateError';
|
||
return $result;
|
||
}
|
||
|
||
if (!$this->isDateInFiscalYear($from_date)) {
|
||
$result['error'] = 'fiscalYearError';
|
||
return $result;
|
||
}
|
||
|
||
if ($batch == 1) {
|
||
$total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'shop_order' AND post_date >= '" . $from_date . "'");
|
||
$totalBatch = ceil($total / $rpp);
|
||
}
|
||
|
||
$offset = ($batch - 1) * $rpp;
|
||
$orders = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'shop_order' AND post_date >= '" . $from_date . "'
|
||
ORDER BY ID ASC LIMIT $offset,$rpp");
|
||
HesabixLogService::writeLogStr("Orders count: " . count($orders));
|
||
|
||
$statusesToSubmitInvoice = get_option('ssbhesabix_invoice_status');
|
||
$statusesToSubmitInvoice = implode(',', $statusesToSubmitInvoice);
|
||
$statusesToSubmitReturnInvoice = get_option('ssbhesabix_invoice_return_status');
|
||
$statusesToSubmitReturnInvoice = implode(',', $statusesToSubmitReturnInvoice);
|
||
$statusesToSubmitPayment = get_option('ssbhesabix_payment_status');
|
||
$statusesToSubmitPayment = implode(',', $statusesToSubmitPayment);
|
||
|
||
$id_orders = array();
|
||
foreach ($orders as $order) {
|
||
//$order = new WC_Order($order->ID);
|
||
$order = wc_get_order($order->ID);
|
||
|
||
$id_order = $order->get_id();
|
||
$id_obj = $wpFaService->getWpFaId('order', $id_order);
|
||
$current_status = $order->get_status();
|
||
|
||
if (!$id_obj) {
|
||
if (strpos($statusesToSubmitInvoice, $current_status) !== false) {
|
||
if ($this->setOrder($id_order)) {
|
||
array_push($id_orders, $id_order);
|
||
$updateCount++;
|
||
|
||
if (strpos($statusesToSubmitPayment, $current_status) !== false)
|
||
$this->setOrderPayment($id_order);
|
||
|
||
// set return invoice
|
||
if (strpos($statusesToSubmitReturnInvoice, $current_status) !== false) {
|
||
$this->setOrder($id_order, 2, $this->getInvoiceCodeByOrderId($id_order));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
$result["updateCount"] = $updateCount;
|
||
return $result;
|
||
}
|
||
//========================================================================================================================
|
||
public function syncProducts($batch, $totalBatch, $total)
|
||
{
|
||
try {
|
||
HesabixLogService::writeLogStr("Sync products price and quantity from hesabix to store: part $batch");
|
||
$result = array();
|
||
$result["error"] = false;
|
||
$extraSettingRPP = get_option("ssbhesabix_set_rpp_for_sync_products_into_woocommerce");
|
||
|
||
$rpp=200;
|
||
if($extraSettingRPP) {
|
||
if($extraSettingRPP != '-1' && $extraSettingRPP != '0') {
|
||
$rpp=$extraSettingRPP;
|
||
}
|
||
}
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
$filters = array(array("Property" => "ItemType", "Operator" => "=", "Value" => 0));
|
||
|
||
if ($batch == 1) {
|
||
$response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters));
|
||
if ($response->Success) {
|
||
$total = $response->Result->FilteredCount;
|
||
$totalBatch = ceil($total / $rpp);
|
||
} else {
|
||
HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode."));
|
||
$result["error"] = true;
|
||
return $result;
|
||
}
|
||
}
|
||
|
||
$offset = ($batch - 1) * $rpp;
|
||
$response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters));
|
||
|
||
$warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1");
|
||
|
||
if ($warehouse != "-1") {
|
||
$products = $response->Result->List;
|
||
$codes = [];
|
||
foreach ($products as $product)
|
||
$codes[] = $product->Code;
|
||
$response = $hesabix->itemGetQuantity($warehouse, $codes);
|
||
}
|
||
|
||
if ($response->Success) {
|
||
$products = $warehouse == "-1" ? $response->Result->List : $response->Result;
|
||
foreach ($products as $product) {
|
||
self::setItemChanges($product);
|
||
}
|
||
} else {
|
||
HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode."));
|
||
$result["error"] = true;
|
||
return $result;
|
||
}
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
return $result;
|
||
} catch (Error $error) {
|
||
HesabixLogService::writeLogStr("Error in sync products: " . $error->getMessage());
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
public function syncProductsManually($data)
|
||
{
|
||
HesabixLogService::writeLogStr('Sync Products Manually');
|
||
|
||
$hesabix_item_codes = array();
|
||
foreach ($data as $d) {
|
||
if ($d["hesabix_id"]) {
|
||
$hesabix_item_codes[] = str_pad($d["hesabix_id"], 6, "0", STR_PAD_LEFT);
|
||
}
|
||
}
|
||
|
||
$hesabix = new Ssbhesabix_Api();
|
||
|
||
$filters = array(array("Property" => "Code", "Operator" => "in", "Value" => $hesabix_item_codes));
|
||
$response = $hesabix->itemGetItems(array('Take' => 100, 'Filters' => $filters));
|
||
|
||
if ($response->Success) {
|
||
$products = $response->Result->List;
|
||
$products_codes = array();
|
||
foreach ($products as $product)
|
||
$products_codes[] = $product->Code;
|
||
$diff = array_diff($hesabix_item_codes, $products_codes);
|
||
if (is_array($diff) && count($diff) > 0) {
|
||
return array("result" => false, "data" => $diff);
|
||
}
|
||
}
|
||
|
||
$id_product_array = array();
|
||
global $wpdb;
|
||
|
||
foreach ($data as $d) {
|
||
$row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps_attribute` = " . $d["id"] . " AND `obj_type` = 'product'");
|
||
|
||
if (!is_object($row)) {
|
||
$row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = " . $d["id"] . " AND `obj_type` = 'product'");
|
||
}
|
||
if (is_object($row)) {
|
||
if (!$d["hesabix_id"])
|
||
$wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $row->id));
|
||
else
|
||
$wpdb->update($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $d["hesabix_id"]), array('id' => $row->id));
|
||
} else {
|
||
if (!$d["hesabix_id"])
|
||
continue;
|
||
if ($d["parent_id"])
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["parent_id"], 'id_ps_attribute' => $d["id"]));
|
||
else
|
||
$wpdb->insert($wpdb->prefix . 'ssbhesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["id"], 'id_ps_attribute' => '0'));
|
||
}
|
||
|
||
if ($d["hesabix_id"]) {
|
||
if ($d["parent_id"]) {
|
||
if (!in_array($d["parent_id"], $id_product_array))
|
||
$id_product_array[] = $d["parent_id"];
|
||
} else {
|
||
if (!in_array($d["id"], $id_product_array))
|
||
$id_product_array[] = $d["id"];
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->setItems($id_product_array);
|
||
return array("result" => true, "data" => null);
|
||
}
|
||
//========================================================================================================================
|
||
public function updateProductsInHesabixBasedOnStore($batch, $totalBatch, $total)
|
||
{
|
||
HesabixLogService::writeLogStr("Update Products In Hesabix Based On Store");
|
||
$result = array();
|
||
$result["error"] = false;
|
||
$extraSettingRPP = get_option('ssbhesabix_set_rpp_for_sync_products_into_hesabix');
|
||
|
||
$rpp=500;
|
||
if($extraSettingRPP) {
|
||
if($extraSettingRPP != '-1' && $extraSettingRPP != '0') {
|
||
$rpp=$extraSettingRPP;
|
||
}
|
||
}
|
||
|
||
global $wpdb;
|
||
|
||
if ($batch == 1) {
|
||
$total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'product' AND post_status IN('publish','private')");
|
||
$totalBatch = ceil($total / $rpp);
|
||
}
|
||
|
||
$offset = ($batch - 1) * $rpp;
|
||
$products = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts`
|
||
WHERE post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC LIMIT $offset,$rpp");
|
||
|
||
$products_id_array = array();
|
||
foreach ($products as $product)
|
||
$products_id_array[] = $product->ID;
|
||
$this->setItems($products_id_array);
|
||
sleep(2);
|
||
|
||
$result["batch"] = $batch;
|
||
$result["totalBatch"] = $totalBatch;
|
||
$result["total"] = $total;
|
||
return $result;
|
||
}
|
||
//========================================================================================================================
|
||
public static function updateProductsInHesabixBasedOnStoreWithFilter($offset=0, $rpp=0)
|
||
{
|
||
HesabixLogService::writeLogStr("Update Products With Filter In Hesabix Based On Store");
|
||
$result = array();
|
||
$result["error"] = false;
|
||
|
||
global $wpdb;
|
||
if($offset != 0 && $rpp != 0) {
|
||
if(abs($rpp - $offset) <= 200) {
|
||
if($rpp > $offset) {
|
||
$products = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "posts`
|
||
WHERE ID BETWEEN $offset AND $rpp AND post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC");
|
||
|
||
$products_id_array = array();
|
||
foreach ($products as $product)
|
||
$products_id_array[] = $product->ID;
|
||
$response = (new Ssbhesabix_Admin_Functions)->setItems($products_id_array);
|
||
if(!$response) $result['error'] = true;
|
||
} else {
|
||
$products = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "posts`
|
||
WHERE ID BETWEEN $rpp AND $offset AND post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC");
|
||
|
||
$products_id_array = array();
|
||
foreach ($products as $product)
|
||
$products_id_array[] = $product->ID;
|
||
$response = (new Ssbhesabix_Admin_Functions)->setItems($products_id_array);
|
||
if(!$response) $result['error'] = true;
|
||
}
|
||
} else {
|
||
$result['error'] = true;
|
||
echo '<script>alert("بازه ID نباید بیشتر از 200 عدد باشد")</script>';
|
||
}
|
||
} else {
|
||
echo '<script>alert("کد کالای معتبر وارد نمایید")</script>';
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
//========================================================================================================================
|
||
public function cleanLogFile()
|
||
{
|
||
HesabixLogService::clearLog();
|
||
return true;
|
||
}
|
||
//========================================================================================================================
|
||
public static function setItemChanges($item)
|
||
{
|
||
if (!is_object($item)) return false;
|
||
|
||
if ($item->Quantity || !$item->Stock)
|
||
$item->Stock = $item->Quantity;
|
||
|
||
$wpFaService = new HesabixWpFaService();
|
||
global $wpdb;
|
||
|
||
$wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code);
|
||
if (!$wpFa) return false;
|
||
|
||
$id_product = $wpFa->idWp;
|
||
$id_attribute = $wpFa->idWpAttribute;
|
||
|
||
if ($id_product == 0) {
|
||
HesabixLogService::log(array("Item with code: $item->Code is not defined in Online store"));
|
||
return false;
|
||
}
|
||
|
||
$found = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` WHERE ID = $id_product");
|
||
|
||
if (!$found) {
|
||
HesabixLogService::writeLogStr("product not found in woocommerce.code: $item->Code, product id: $id_product, variation id: $id_attribute");
|
||
return false;
|
||
}
|
||
|
||
$product = wc_get_product($id_product);
|
||
$variation = $id_attribute != 0 ? wc_get_product($id_attribute) : null;
|
||
|
||
|
||
// $product = new WC_Product($id_product);
|
||
// $variation = $id_attribute != 0 ? new WC_Product($id_attribute) : null;
|
||
|
||
$result = array();
|
||
$result["newPrice"] = null;
|
||
$result["newQuantity"] = null;
|
||
|
||
$p = $variation ? $variation : $product;
|
||
|
||
if (get_option('ssbhesabix_item_update_price') == 'yes')
|
||
$result = self::setItemNewPrice($p, $item, $id_attribute, $id_product, $result);
|
||
|
||
if (get_option('ssbhesabix_item_update_quantity') == 'yes')
|
||
$result = self::setItemNewQuantity($p, $item, $id_product, $id_attribute, $result);
|
||
|
||
return $result;
|
||
}
|
||
//========================================================================================================================
|
||
private static function setItemNewPrice($product, $item, $id_attribute, $id_product, array $result)
|
||
{
|
||
try {
|
||
$option_sale_price = get_option('ssbhesabix_item_update_sale_price', 0);
|
||
$woocommerce_currency = get_woocommerce_currency();
|
||
$hesabix_currency = get_option('ssbhesabix_hesabix_default_currency');
|
||
|
||
$old_price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price();
|
||
$old_price = Ssbhesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($old_price);
|
||
|
||
$post_id = $id_attribute && $id_attribute > 0 ? $id_attribute : $id_product;
|
||
|
||
if ($item->SellPrice != $old_price) {
|
||
$new_price = Ssbhesabix_Admin_Functions::getPriceInWooCommerceDefaultCurrency($item->SellPrice);
|
||
update_post_meta($post_id, '_regular_price', $new_price);
|
||
update_post_meta($post_id, '_price', $new_price);
|
||
|
||
|
||
$sale_price = $product->get_sale_price();
|
||
if ($sale_price && is_numeric($sale_price)) {
|
||
$sale_price = Ssbhesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($sale_price);
|
||
if (+$option_sale_price === 1) {
|
||
update_post_meta($post_id, '_sale_price', null);
|
||
} elseif (+$option_sale_price === 2) {
|
||
update_post_meta($post_id, '_sale_price', round(($sale_price * $new_price) / $old_price));
|
||
update_post_meta($post_id, '_price', round(($sale_price * $new_price) / $old_price));
|
||
} else {
|
||
if($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRR') update_post_meta($post_id, '_price', ($sale_price/10));
|
||
elseif($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRT') update_post_meta($post_id, '_price', ($sale_price*10));
|
||
elseif($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRR') update_post_meta($post_id, '_price', $sale_price);
|
||
elseif($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRT') update_post_meta($post_id, '_price', $sale_price);
|
||
}
|
||
}
|
||
|
||
HesabixLogService::log(array("product ID $id_product-$id_attribute Price changed. Old Price: $old_price. New Price: $new_price"));
|
||
$result["newPrice"] = $new_price;
|
||
}
|
||
|
||
return $result;
|
||
} catch (Error $error) {
|
||
HesabixLogService::writeLogStr("Error in Set Item New Price -> $error");
|
||
}
|
||
}
|
||
//========================================================================================================================
|
||
private static function setItemNewQuantity($product, $item, $id_product, $id_attribute, array $result)
|
||
{
|
||
try {
|
||
$old_quantity = $product->get_stock_quantity();
|
||
if ($item->Stock != $old_quantity) {
|
||
$new_quantity = $item->Stock;
|
||
if (!$new_quantity) $new_quantity = 0;
|
||
|
||
$new_stock_status = ($new_quantity > 0) ? "instock" : "outofstock";
|
||
|
||
$post_id = ($id_attribute && $id_attribute > 0) ? $id_attribute : $id_product;
|
||
|
||
update_post_meta($post_id, '_stock', $new_quantity);
|
||
wc_update_product_stock_status($post_id, $new_stock_status);
|
||
|
||
HesabixLogService::log(array("product ID $id_product-$id_attribute quantity changed. Old quantity: $old_quantity. New quantity: $new_quantity"));
|
||
$result["newQuantity"] = $new_quantity;
|
||
}
|
||
|
||
return $result;
|
||
} catch (Error $error) {
|
||
HesabixLogService::writeLogStr("Error in Set Item New Price -> $error");
|
||
}
|
||
}
|
||
//=========================================================================================================================
|
||
function CheckNationalCode($NationalCode): void
|
||
{
|
||
$identicalDigits = ['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666', '7777777777', '8888888888', '9999999999'];
|
||
|
||
if(strlen($NationalCode) === 10) {
|
||
$summation = 0;
|
||
$j = 10;
|
||
for($i = 0 ; $i < 9 ; $i++) {
|
||
$digit = substr($NationalCode, $i, 1);
|
||
$temp = $digit * $j;
|
||
$j -= 1;
|
||
$summation += $temp;
|
||
}
|
||
$controlDigit = substr($NationalCode, 9, 1);
|
||
$retrieve = $summation % 11;
|
||
|
||
if(in_array($NationalCode, $identicalDigits) === false) {
|
||
if($retrieve < 2) {
|
||
if($controlDigit != $retrieve) {
|
||
wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error');
|
||
}
|
||
} else {
|
||
if($controlDigit != (11 - $retrieve)) {
|
||
wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error');
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error');
|
||
}
|
||
}
|
||
//=========================================================================================================================
|
||
function CheckWebsite($Website): void
|
||
{
|
||
if (filter_var($Website, FILTER_VALIDATE_URL)) {
|
||
//
|
||
} else {
|
||
wc_add_notice(__('please enter a valid Website URL', 'ssbhesabix'), 'error');
|
||
}
|
||
}
|
||
//=========================================================================================================================
|
||
public static function enableDebugMode(): void {
|
||
update_option('ssbhesabix_debug_mode', 1);
|
||
}
|
||
|
||
public static function disableDebugMode(): void {
|
||
update_option('ssbhesabix_debug_mode', 0);
|
||
}
|
||
//=========================================================================================================================
|
||
public function convertPersianDigitsToEnglish($inputString) : int {
|
||
$newNumbers = range(0, 9);
|
||
$persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
|
||
$arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩');
|
||
$arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩');
|
||
$persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
|
||
|
||
$string = str_replace($persianDecimal, $newNumbers, $inputString);
|
||
$string = str_replace($arabicDecimal, $newNumbers, $string);
|
||
$string = str_replace($persian, $newNumbers, $string);
|
||
|
||
return str_replace($arabic, $newNumbers, $string);
|
||
}
|
||
//=========================================================================================================================
|
||
function generateGUID() : string {
|
||
$characters = '0123456789ABCDEF';
|
||
$guid = '';
|
||
|
||
for ($i = 0; $i < 32; $i++) {
|
||
$guid .= $characters[mt_rand(0, 15)];
|
||
if ($i == 7 || $i == 11 || $i == 15 || $i == 19) {
|
||
$guid .= '-';
|
||
}
|
||
}
|
||
|
||
return $guid;
|
||
}
|
||
//=========================================================================================================================
|
||
public function getGUID($id_order): string {
|
||
$option = get_option($id_order);
|
||
|
||
if ($option === false || $option == 0) {
|
||
$GUID = $this->generateGUID();
|
||
$expirationDateTime = new DateTime('now', new DateTimeZone('UTC'));
|
||
add_option($id_order, $expirationDateTime->format('Y-m-d H:i:s') . $GUID);
|
||
} else {
|
||
$expirationDateTime = new DateTime(substr($option, 0, 19), new DateTimeZone('UTC'));
|
||
$currentDateTime = new DateTime('now', new DateTimeZone('UTC'));
|
||
|
||
$diff = $currentDateTime->diff($expirationDateTime);
|
||
|
||
if ($diff->days < 1) {
|
||
// GUID is still valid, continue processing
|
||
} else {
|
||
// GUID expired, reset the option to allow saving a new invoice
|
||
$GUID = $this->generateGUID();
|
||
$expirationDateTime = new DateTime('now', new DateTimeZone('UTC'));
|
||
update_option($id_order, $expirationDateTime->format('Y-m-d H:i:s') . $GUID);
|
||
}
|
||
}
|
||
|
||
return substr(get_option($id_order), 20);
|
||
}
|
||
//=========================================================================================================================
|
||
} |