Fix image upload structure for Miravia API compliance

🔧 Bug Fixes:
- Fixed product image structure to match Miravia API requirements
- Updated MiraviaProduct.php getData() method to wrap images in {"Image": [...]} format
- Updated MiraviaCombination.php getData() method to wrap SKU images properly
- Resolved error "[4224] The Main image of the product is required"

📋 Changes:
- Modified getData() methods to transform flat image arrays to nested structure
- Product images: images[] → Images: {"Image": [...]}
- SKU images: images[] → Images: {"Image": [...]}
- Maintains backward compatibility for empty image arrays

🎯 Impact:
- Product uploads will now pass Miravia's image validation
- Both product-level and SKU-level images properly formatted
- Complies with official Miravia API documentation structure

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Miravia Connector Bot
2025-07-17 08:11:23 +02:00
commit a7d7dbb164
61 changed files with 8501 additions and 0 deletions

50
.gitignore vendored Normal file
View File

@@ -0,0 +1,50 @@
# WordPress
wp-config.php
wp-content/uploads/
wp-content/cache/
wp-content/backup-db/
wp-content/advanced-cache.php
wp-content/wp-cache-config.php
wp-content/plugins/hello.php
wp-content/plugins/akismet/
.htaccess
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# IDE files
.idea/
.vscode/
*.swp
*.swo
*~
# Logs
*.log
error_log
debug.log
logs/
# Temporary files
*.tmp
*.temp
*.bak
*.backup
# Node modules (if any)
node_modules/
npm-debug.log*
# Composer
vendor/
composer.lock
# Plugin specific
*.zip
data/

View File

@@ -0,0 +1,32 @@
=== Woo for Miravia ===
Contributors: wecommsolutions
Tags: miravia, woocommerce miravia, alibaba, aliexpress
Requires at least: 5.0
Tested up to: 6.3
Requires PHP: 5.0
Stable tag: 1.0.0
License: GPLv2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
== Description ==
Connect your store with Miravia, upload your products to Miravia and Download orders.
== Installation ==
* Upload the add-in folder to the "/ wp-content / plugins /" directory or install the add-in directly from the WordPress add-ons screen.
* Activate the plugin from the «Add-ons» screen in WordPress
* Enjoy!
== FAQ ==
Visit wecomm.es
== Changelog ==
= 1.0.0 =
* Initial version
== Localization ==
English (US).

View File

@@ -0,0 +1,148 @@
/*
PRIMARY: #4c45e6
accent: #6ee786
*/
.showHover {
visibility: hidden;
}
tr:hover .showHover {
visibility: visible;
}
span.minidate {
font-size: 10px;
line-height: 10px;
}
/*
th#miravia_data {
width: 180px;
} */
td.miravia_data.column-miravia_data {
width: 200px !important;
}
th#miravia_data {
width: 200px !important;
}
table.table-view-list.toplevel_page_miravia_settings {
table-layout: inherit !important;
}
span.created_via {
float: right;
font-size: 12px;
color: #08a1de;
}
.btn_config {
text-decoration: none;
color: #4c45e6;
border: 1px solid #dfdfdf;
background: #dfdfdf;
width: 45%;
padding: 0.5rem;
float: left;
margin: 0.5rem;
cursor: pointer;
height: 140px;
display: block;
border-radius: 10px;
transition: all 0.5s ease;
}
.btn_config:hover {
background-color: #b0aed2;
/* color: #FFF; */
}
.btn_config h4 {
color: #4c45e6;
font-size: 30px;
margin: 0;
font-weight: bold;
text-align: center;
}
.btn_config:hover h4 {
/* color: #FFF */
}
.stats {
/* border: 1px solid #4c45e6; */
padding: 0.5rem;
margin: 0.5rem;
height: 140px;
}
.stats-1 {
width: 23%;
float: left;
}
.stats-2 {
width: 48%;
float: left;
}
.stats-3 {
width: 73%;
float: left;
}
.stats-4 {
clear: both;
}
.wrap.miravia-pane {
max-width: 1024px;
margin: auto;
}
.miravia-pane .description {
font-size: 10px;
display: block;
font-weight: lighter;
}
ul.miravia_categories_select {
background-color: '#FFF';
}
ul.miravia_categories_select ul.children {
margin-left: 25px;
}
.region_config_dashboard {
max-width: 1024px;
margin: auto;
left: 0;
right: 0;
position: relative;
display: block;
}
/* tabs */
a.mv-bt-tab {
padding: 10px;
display: block;
border-radius: 4px 4px 0 0;
border: 1px solid #CCC;
border-bottom: 0px solid;
text-decoration: none;
color: #333;
font-weight: bold;
outline: none;
}
.mv-tab-nav {
border-bottom: 1px solid #CCC;
}
.mv-tab-nav li {
margin: 0;
}
a.mv-bt-tab.active {
background: #CCC;
}
.mv-tab {
display:none;
}
.mv-tab-active {
display:block;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -0,0 +1,448 @@
jQuery(document).ready(function($) {
(function($) {
var Defaults = $.fn.select2.amd.require('select2/defaults');
$.extend(Defaults.defaults, {
searchInputPlaceholder: ''
});
var SearchDropdown = $.fn.select2.amd.require('select2/dropdown/search');
var _renderSearchDropdown = SearchDropdown.prototype.render;
SearchDropdown.prototype.render = function(decorated) {
// invoke parent method
var $rendered = _renderSearchDropdown.apply(this, Array.prototype.slice.apply(arguments));
this.$search.attr('placeholder', this.options.get('searchInputPlaceholder'));
return $rendered;
};
})(window.jQuery);
$(".search-select-miravia").select2({ width: '100%', searchInputPlaceholder: 'Search Miravia Category' })
var select2Element = $(".search-select-miravia-brand");
var options = {
searchInputPlaceholder: 'Search Brand',
width: '100%',
ajax: {
url: MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_get_brands',
dataType: 'json',
cache: true,
data: function (params) {
return {
brand_name: params.term,
};
},
processResults: function (data) {
final_data = {
results: $.map(data, function (item) {
return {
text: item.brand_name,
id: item.brand_name
}
})
};
console.log(final_data)
delete options.ajax;
options.data = final_data.results;
select2Element.select2( options ).select2( 'open' );
return final_data;
},
success: function( data ) {
},
}
};
select2Element.select2( options );
$(document).on("click", "a.sendProductsMiravia_BACK", function(){
var id = $(this).attr("data-id");
var control = $(".miravia_controls[data-id='"+id+"']");
var preHTML = control.html();
control.html("Uploading...");
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_upload_product',
data : {
id: id
},
dataType: 'JSON',
error: function(response){
control.html(preHTML);
},
success: function(response) {
if(response['error']) {
alert(response['message']);
return;
}
control.html("<a href='javascript:void(0)' class='button viewProduct' data-id='"+response['id']+"'>View</a> | <a href='javascript:void(0)' class='button updateProduct' data-id='"+id+"'>Update</a>");
}
})
});
$(document).on("click", "a.updateProduct", function(){
var id = $(this).attr("data-id");
var control = $(".miravia_controls[data-id='"+id+"']");
var preHTML = control.html();
control.html("Updating...");
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_update_product',
data : {
id: id
},
dataType: 'JSON',
error: function(response){
control.html(preHTML);
},
success: function(response) {
if(response['error']) {
alert(response['message']);
return;
}
control.html(preHTML);
}
})
});
$(document).on("click", "a.viewProduct, button.viewProduct", function(){
var id = $(this).attr("data-id");
window.open('https://www.miravia.es/p/i'+id+'.html', '_blank');
});
$(document).on("click", ".connectProductRemote", function(){
var control = $(this);
if(control.attr('disabled') == 'disabled') {
return;
}
var id = $(this).attr("data-id");
var sku = $(this).attr("data-sku");
var preHTML = control.html();
var preColor = control.css('color');
control.text("Connecting...");
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_connect_product',
data : {
id_remote: id,
sku: sku
},
dataType: 'JSON',
error: function(response){
alert('Error, please contact with support');
control.html(preHTML);
Swal.close();
},
success: function(response) {
if(response['ok']) {
control.attr('disabled', 'disabled').html('Connected').css('color', 'green').css('border-color', 'green');
}else{
if(response['alert']) {
alert(response['alert']);
control.html(preHTML).css('color', preColor).css('border-color', preColor);
}else{
control.html('No Profile / Product').css('color', 'red').css('border-color', 'red');
setTimeout(() => {
control.html(preHTML).css('color', preColor).css('border-color', preColor);
}, 5000);
}
}
}
})
});
$(document).on("click", ".disconnectProduct", function(){
var id = $(this).attr("data-id");
var control = $(this);
var preHTML = control.html();
control.text("Disconnecting...");
Swal.fire({
title: 'Disconnecting product...',
html: 'Please wait...',
didOpen: () => {
Swal.showLoading()
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=disconnect_product_miravia',
data : {
id: id
},
dataType: 'JSON',
error: function(response){
alert('Error, please contact with support');
control.html(preHTML);
Swal.close();
},
success: function(response) {
if(response['error']) {
Swal.fire(
'Error',
response['message'],
'error'
)
}else{
Swal.fire(
'Success',
'Product disconnected from Miravia',
'success'
)
}
control.html(preHTML);
}
})
},
});
});
$(document).on("click", ".sendProductsMiravia", function(){
console.log("ENVIANDO");
var profile = $(this).attr("data-profile");
var control = $(this);
var preHTML = control.html();
control.text("Updating...");
Swal.fire({
title: 'Uploading products...',
html: 'Please wait...',
didOpen: () => {
Swal.showLoading()
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=send_products_miravia',
data : {
profile: profile
},
dataType: 'JSON',
error: function(response){
alert('Error, please contact with support');
control.html(preHTML);
Swal.close();
},
success: function(response) {
if(response['error']) {
Swal.fire(
'Error',
response['message'],
'error'
)
}else{
Swal.fire(
'Success',
'Send ' + response.length + ' products to Miravia',
'success'
)
}
control.html(preHTML);
}
})
},
});
});
$(document).on("click",".download_order", function(){
var id = $(this).attr("data-id");
var token = $(this).attr("data-token");
var account_id = $(this).attr("data-account");
var control = $(this);
var preHTML = control.html();
control.text("Downloading...");
Swal.fire({
title: 'Download order...',
html: 'Please wait...',
didOpen: () => {
Swal.showLoading()
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_download_order',
data : {
id: id,
token: token,
account_id: account_id
},
dataType: 'JSON',
error: function(response){
control.html(preHTML);
Swal.close();
},
success: function(response) {
if(response['error']) {
Swal.fire(
'Error',
response['message'],
'error'
)
return;
}
Swal.close();
control.html(preHTML);
}
})
},
});
});
$(document).on("click",".checkJob", function(){
var id = $(this).attr("data-id");
var token = $(this).attr("data-token");
var control = $(this).closest('tr');
$(".status_result", control).text('Checking...');
Swal.fire({
title: 'Check Job...',
html: 'Please wait...',
didOpen: () => {
Swal.showLoading()
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_check_job',
data : {
id: id,
token: token
},
dataType: 'JSON',
error: function(response){
$(".status_result", control).text('Error to check status, please try again');
Swal.close();
},
success: function(response) {
if(response['error']) {
Swal.fire(
'Error',
response['message'],
'error'
)
return;
}
Swal.close();
$(".status_result", control).text(response['status']);
}
})
},
});
});
$(document).on("click",".cancelJob", function(){
var id = $(this).attr("data-id");
var token = $(this).attr("data-token");
var control = $(this);
var preHTML = control.html();
if(confirm('You want cancel this job?')) {
control.text("Checking...");
Swal.fire({
title: 'Cancel Job...',
html: '<b>Please wait...</b>',
didOpen: () => {
Swal.showLoading()
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_cancel_job',
data : {
id: id,
token: token
},
dataType: 'JSON',
error: function(response){
control.html(preHTML);
Swal.close();
},
success: function(response) {
control.html(preHTML);
if(response['error']) {
Swal.fire(
'Error',
response['message'],
'error'
)
}else{
Swal.fire(
'Success',
'Job Cancel Success',
'success'
)
}
}
})
},
});
}
});
$(document).on("click",".mv-bt-tab", function(){
var tab = $(this).attr("data-tab");
$(".mv-bt-tab").removeClass("active");
$(this).addClass("active");
$(".mv-tab").removeClass("mv-tab-active");
$(".mv-tab[data-tab='"+tab+"']").addClass('mv-tab-active');
});
$(document).on("click","#packOrderButton", function(){
var id = $(this).attr("data-id");
console.log("Packed Order", id);
$(this).text('Waiting...').prop('disabled', true);
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_packed_order',
data : {
id: id,
},
dataType: 'JSON',
error: function(response){
console.log(response);
$(this).text('Pack Order').prop('disabled', false);
},
success: function(response) {
if(response['error']) {
alert(response['message']);
$(this).text('Pack Order').prop('disabled', false);
return;
}
window.location.reload();
}
})
});
$(document).on("click", ".miraviaprintLabel", function() {
var id = $(this).attr("data-id");
var package_id = $(this).attr("data-package");
$.ajax({
method : "post",
url : MIRAVIA_DATA_JAVASCRIPT.adminAjaxURL+'?action=miravia_print_label',
data : {
id: id,
package_id: package_id,
},
dataType: 'JSON',
error: function(response){
},
success: function(response) {
if(response && response.data) {
if(response.data.pdf_url) {
console.log(response.data);
window.open(response.data.pdf_url, '_blank');
}
}
}
})
});
});

View File

@@ -0,0 +1,495 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('APIMIRAVIA') ) {
class APIMIRAVIA {
function __construct() {
$actionsPrivate = array(
'miravia_upload_product',
'miravia_update_product',
'miravia_authorize',
'miravia_create_profile',
'miravia_download_order',
'send_products_miravia',
'miravia_check_job',
'miravia_cancel_job',
'miravia_notify',
'miravia_request_notify',
'miravia_packed_order',
'miravia_print_label',
'miravia_get_brands',
'miravia_connect_product',
'disconnect_product_miravia'
);
foreach( $actionsPrivate as $action ){
add_action( 'wp_ajax_'.$action, array( $this, $action ) );
add_action( 'wp_ajax_nopriv_'.$action, array( $this, $action ) );
}
}
function miravia_connect_product(){
global $wpdb;
if ( !current_user_can( 'manage_woocommerce' ) ) { exit; }
$res = array('ok' => false);
$sku = sanitize_text_field($_POST['sku']);
$profile_id = MiraviaCore::get_profile_by_product($sku);
LOG::add("Profile encontrado {$profile_id} -> {$sku}");
if($profile_id) {
$id_remote = sanitize_text_field($_POST['id_remote']);
$id_local = wc_get_product_id_by_sku($sku);
$existe = MiraviaCore::get_product_miravia($id_local);
if(!$existe) {
$_product = wc_get_product($id_local);
//Save product data
$wpdb->insert($wpdb->prefix.'miravia_products', array(
'id_woocommerce' => $id_local,
'sku' => $_product->get_sku() ?: $id_local,
'id_miravia' => $id_remote,
'profile_id' => $profile_id,
'stock' => $_product->get_regular_price(),
'price' => $_product->get_regular_price(),
'sale_price' => $_product->get_sale_price(),
));
LOG::add("Conectando producto ({$id_local}) remoto {$sku} con {$id_remote} con el profile {$profile_id}");
update_post_meta($id_local, '_miravia_product_id', $id_remote);
update_post_meta($id_local, '_miravia_sync_date', time());
$res['ok'] = true;
}else{
$res['alert'] = "This product exist";
}
}
wp_send_json($res);
}
function miravia_print_label() {
$id = sanitize_text_field($_POST['id']);
$package_id = sanitize_text_field($_POST['package_id']);
$account_id = get_post_meta($id, '_miravia_account_id', true);
$labelResult = false;
$account = MiraviaCore::get_accounts($account_id);
$link = new MiraviaLink($account['token']);
if($account_id) {
$labelResult = $link->getShippingLabel($package_id);
}
wp_send_json($labelResult);
}
function miravia_get_brands() {
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
$link = new MiraviaCategory($token);
$brands = $link->getBrands();
}else{
$brands = [];
}
wp_send_json($brands);
}
function miravia_packed_order(){
$id = sanitize_text_field($_POST['id']);
$account_id = get_post_meta($id, '_miravia_account_id', true);
$order_miravia_id = get_post_meta($id, '_miravia_order_id', true);
if($account_id) {
$account = MiraviaCore::get_accounts($account_id);
$link = new MiraviaLink($account['token']);
$resultPack = false;
list($order, $items) = MiraviaCore::get_order_woocommerce($id);
$resultPack = $link->orderPack($order_miravia_id, array('products' => $items));
update_post_meta($id, '_miravia_packed_result', $resultPack);
}else{
LOG::add("{$id} no ha sido importado, no tiene ID de Cuenta", false, 'pack_order');
LOG::add([$_POST, $account_id], false, 'pack_order');
}
wp_send_json($resultPack);
}
function miravia_check_job() {
$id = sanitize_text_field($_POST['id']);
if($id) {
$apiKey = sanitize_text_field($_POST['token']);
$link = new MiraviaLink($apiKey);
$result = $link->getFeedInfo($id);
// LOG::add($result, false, 'check_job');
if($result and $result['result']['processing_status'] == 'DONE') {
foreach($result['response'] as $sku => $value) {
if($value['status'] == 'FAIL') {
if($value['detail']['message']['errorDetail'] and count($value['detail']['message']['errorDetail']) > 0) {
LOG::add('SET JOB Detail' . $id . ' -> ' . $value['detail']['message']['errorDetail'][0]['message'] . ' -- ' . $sku, false, 'check_job');
MiraviaCore::set_error_product_job($sku, $id, $value['detail']['message']['errorDetail'][0]['message']);
}else{
LOG::add('SET JOB MSG' . $id . ' -> ' . $value['detail']['message']['errorMsg'] . ' -- ' . $sku, false, 'check_job');
MiraviaCore::set_error_product_job($sku, $id, $value['detail']['message']['errorMsg']);
}
}else{
//Controlar los updates
if(!isset($value['id'])) {
$value['id'] = false;
}
MiraviaCore::set_id_miravia_product_job($sku, $id, $value['id']);
}
}
}
if($result) {
// MiraviaCore::set_status_job($id, $result['result']['processing_status']);
wp_send_json(array('status' => $result['result']['processing_status']));
}else{
wp_send_json(array('status' => false));
}
}
}function miravia_cancel_job() {
$id = sanitize_text_field($_POST['id']);
if($id) {
$apiKey = sanitize_text_field($_POST['token']);
$link = new MiraviaLink($apiKey);
$result = $link->cancelFeed($id);
LOG::add($result, false, 'result_cancel_job');
if($result and $result['success']) {
MiraviaCore::clear_job($id);
wp_send_json(array('success' => true));
}else{
MiraviaCore::clear_job($id);
wp_send_json(array('error' => true, 'message' => 'You can cancel this job, products unlock locally'));
}
}
}
function miravia_request_notify() {
MiraviaCore::request_notify(sanitize_text_field($_POST['token']), sanitize_text_field($_POST['message']));
}
function miravia_download_order($id = false, $token = false) {
$id = $id ?: sanitize_text_field($_POST['id']);
$apiKey = $token ?: sanitize_text_field($_POST['token']);
$existe = MiraviaCore::order_exist($id);
if(count($existe) > 0) {
LOG::add("Order {$id} exists");
return;
}
$link = new MiraviaLink($apiKey);
$order_from_miravia = $link->getOrder($id);
$order_from_miravia['data']['account_id'] = sanitize_text_field($_POST['account_id']);
$miravia_order = new MVOrder();
$miravia_order->create($order_from_miravia['data']);
}
function miravia_notify(){
LOG::add('Datos recibidos de notificación', false, 'notify');
// LOG::add($_REQUEST, false, 'notify');
if(isset($_GET['seller'])) {
$idPedido = false;
$action = sanitize_text_field($_GET['message']);
if(sanitize_text_field($_GET['miravia_action']) == 'notify') {
if(str_contains($action, 'neworder-')) {
$idPedido = substr($action, 9);
$action = 'neworder';
}
switch($action) {
case 'update_stock':
$profiles = MiraviaCore::get_profiles_by_seller(sanitize_text_field($_GET['seller']));
foreach($profiles as $k => $p) {
$this->send_stock_price_miravia($p['id'], false);
}
//update_option('miravia_notify_' . $action . '_in', time());
break;
case 'neworder':
if($idPedido) {
if(isset($_GET['status']) and sanitize_text_field($_GET['status']) == 'pending') {
$account = MiraviaCore::get_miravia_account_default(sanitize_text_field($_GET['seller']), 'userid');
$this->miravia_download_order($idPedido, $account['token']);
}else{
LOG::add("Order status is ".sanitize_text_field($_GET['status'])." => {$idPedido}");
}
}
break;
default:
LOG::add("Action notify no recognized");
break;
}
}elseif(sanitize_text_field($_GET['miravia_action']) == 'feed') {
MiraviaCore::procesarFeed();
}elseif(sanitize_text_field($_GET['miravia_action']) == 'stock_sresync') {
$accounts = MiraviaCore::resync_stock();
if($accounts) {
foreach($accounts as $a) {
MiraviaCore::request_notify($a['token'], 'update_stock');
}
}
}
wp_send_json(array('success' => true), 200);
die();
}
wp_send_json(array('success' => false), 400);
die();
}
function send_products_miravia() {
$profile = sanitize_text_field($_POST['profile']);
LOG::add("Enviando productos del perfil {$profile}");
if ( !current_user_can( 'manage_woocommerce' ) ) { exit; }
$result = array(
'id' => 0,
'error' => false,
'message' => ''
);
$accounts = MiraviaCore::accounts_by_profile($profile);
$product = MiraviaCore::get_products_by_profile($profile);
if($product) {
foreach($accounts as $a) {
//Enviar los productos con cada una de las cuentas de usuario registrados en el profile.
//Comprobar el producto si no se ha enviado
// LOG::add("Comprobando producto en job");
// LOG::add($product);
$productsToSend = array(
'update' => array(),
'create' => array()
);
if($product){
foreach($product as $k => $p) {
if(MiraviaCore::check_product_onjob($p->id)) {
unset($product[$k]);
}else{
if($product and $product[$k]->id_miravia != 0 and $product[$k]->id_miravia != '' and $product[$k]->id_miravia != '0') {
$product[$k]->created = 1;
array_push($productsToSend['update'], $product[$k]);
}else{
array_push($productsToSend['create'], $product[$k]);
}
}
}
}
//Check after check on job
// LOG::add("PRODUCTOS DESPUES");
// LOG::add($product);
if(count($product) == 0) {
wp_send_json(array('error' => true, 'message' => 'All products is on job, please wait to complete this before send again.'));
wp_die();
}
if(count($productsToSend['create']) > 0) {
$link = new MiraviaLink($a['token']);
$feed = new MiraviaFeed();
$feed->setProducts($productsToSend['create']);
//Apply Rules
$feed = MiraviaCore::applyFilter($feed, $a['id'], $profile);
$productJson = $feed->getJsonCreate();
if(MIRAVIA_DEBUG == '0') {
$result = $link->sendFeed($productJson);
if(isset($result['feed_result']) and $result['feed_result']['success']) {
MiraviaCore::set_job_product(array_column($productsToSend['create'], 'id'), $profile, $result['feed_result']['result']);
}
}
}
if(count($productsToSend['update']) > 0) {
$link = new MiraviaLink($a['token']);
$feed = new MiraviaFeed();
$feed->setProducts($productsToSend['update']);
//Apply Rules
$feed = MiraviaCore::applyFilter($feed, $a['id'], $profile);
$productJsonUpdate = $feed->getJsonUpdate();
if(MIRAVIA_DEBUG == '0') {
$result = $link->sendFeed($productJsonUpdate, 'update');
if(isset($result['feed_result']) and $result['feed_result']['success']) {
MiraviaCore::set_job_product(array_column($productsToSend['update'], 'id'), $profile, $result['feed_result']['result']);
}
}
}
if(MIRAVIA_DEBUG == '1') {
wp_send_json(array('error' => true, 'message' => 'Debug Active', 'update' => $productJsonUpdate, 'create' => $productJson, 'initData' => $productsToSend));
die();
}
LOG::add("Enviando " . count($product) . " productos con token {$a['token']}");
LOG::add($result);
}
}
wp_send_json($product);
wp_die();
}
function send_stock_price_miravia($profile = false, $returnValue = true) {
if(!$profile) {
$profile = sanitize_text_field($_POST['profile']);
}
LOG::add("Enviando productos del perfil {$profile}");
if ($returnValue and !current_user_can( 'manage_woocommerce' ) ) { exit; }
$result = array(
'id' => 0,
'error' => false,
'message' => ''
);
$accounts = MiraviaCore::accounts_by_profile($profile);
$product = MiraviaCore::get_products_by_profile($profile, true);
$isOnlyStock = get_option('miravia_only_stock', '0') == '1';
if($product) {
foreach($accounts as $a) {
//Enviar los productos con cada una de las cuentas de usuario registrados en el profile.
//Comprobar el producto si no se ha enviado
foreach($product as $k => $p) {
if(MiraviaCore::check_product_onjob($p->id)) {
unset($product[$k]);
}
}
//Check after check on job
if(count($product) == 0) {
wp_send_json(array('error' => true, 'message' => 'All products is on job, please wait to complete this before send again.'));
wp_die();
}
$link = new MiraviaLink($a['token']);
$feed = new MiraviaFeed();
$feed->setProducts($product);
//Apply Rules
$feed = MiraviaCore::applyFilter($feed, $a['id'], $profile);
$stockJson = $feed->getJsonUpdateStock($isOnlyStock);
if(MIRAVIA_DEBUG == '1') {
wp_send_json($stockJson);
die();
}
$result = $link->updateStock($stockJson);
if(isset($result['feed_result']) and $result['feed_result']['success']) {
MiraviaCore::set_job_product(array_column($product, 'id'), $profile, $result['feed_result']['result']);
}
}
}
if($returnValue) {
wp_send_json($product);
wp_die();
}
}
function miravia_create_profile() {
$apiKey = sanitize_text_field($_REQUEST['api_key']);
$link = new MiraviaLink($apiKey);
$sellerInfo = $link->getSellerInfo(admin_url('admin-ajax.php?action=miravia_notify'));
if($sellerInfo) {
if(!MiraviaCore::get_accounts($sellerInfo['seller_id'], 'userid')) {
$profile = MiraviaCore::add_account(array(
'name' => $sellerInfo['seller_name'],
'token' => $apiKey,
'userid' => $sellerInfo['seller_id'],
'lang' => $sellerInfo['country'],
'email' => $sellerInfo['email'],
'config' => '{short_code: "'.$sellerInfo['short_code'].'"}',
));
}
}
wp_redirect( admin_url('admin.php?page=miravia_settings&subpage=accounts') );
wp_send_json(array('ok' => true));
}
function disconnect_product_miravia(){
if ( !current_user_can( 'manage_woocommerce' ) ) { exit; }
$id = $_POST['id'];
LOG::add("Desconectando producto {$id} de miravia");
update_post_meta($id, '_miravia_product_id', 0);
update_post_meta($id, '_miravia_sync_date', 0);
wp_send_json(array('ok' => true));
}
function miravia_authorize() {
LOG::add("Solicitando autorización a Miravia");
$link = new MiraviaLink();
$register_link = $link->getRegisterUrl(admin_url('admin-ajax.php?action=miravia_create_profile'));
LOG::add("Register link is " . $register_link);
wp_redirect( $register_link );
wp_send_json(array('ok' => true));
}
function miravia_upload_product() {
if ( !current_user_can( 'manage_woocommerce' ) ) { exit; }
$result = array(
'id' => 0,
'error' => false,
'message' => ''
);
$id = sanitize_text_field($_POST['id']);
$product = new MVProduct($id, 2);
wp_send_json($product);
wp_die();
$response = $product->send();
if(isset($response['item_id'])) {
//Producto subido
update_post_meta($id, '_miravia_product_id',$response['item_id']);
update_post_meta($id, '_miravia_sync_date',time());
$result['id'] = $response['item_id'];
}else{
$result['error'] = true;
$result['message'] = $response['errors'][0]['message'];
}
wp_send_json($result);
wp_die();
}
function miravia_update_product() {
if ( !current_user_can( 'manage_woocommerce' ) ) { exit; }
$result = array(
'id' => 0,
'error' => false,
'message' => ''
);
$id = sanitize_text_field($_POST['id']);
$product = new MVProduct($id);
$response = $product;
if(is_array($response) and count($response) == 0) {
//Producto subido
update_post_meta($id, '_miravia_sync_date',time());
$result['id'] = $id;
}else{
$result['error'] = true;
$result['message'] = $response['errors'][0]['message'];
}
wp_send_json($result);
wp_die();
}
}
$APIMIRAVIA = new APIMIRAVIA();
}

View File

@@ -0,0 +1,66 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('MIRAVIA_Category') ) {
class MIRAVIA_Category {
private $lang = "es_ES";
function __construct($lang = ''){
if($lang != '') {
$this->lang = $lang;
}
}
function get_category_tree() {
global $MIRAVIAWOO;
$categories = $MIRAVIAWOO->client->get('/category/tree/get', array(
'language_code' => $this->lang
));
return $categories;
}
function get_attributes($id) {
global $MIRAVIAWOO;
$attributes = $MIRAVIAWOO->client->get('/category/attributes/get', array(
'primary_category_id' => $id,
'language_code' => $this->lang
));
return $attributes;
}
function get_input_type_attr($attr, $args = array('value' => '')) {
$result = 'Esta propiedad no puede ser establecida por defecto';
if($attr['input_type'] == 'enumInput' or $attr['input_type'] == 'singleSelect' or $attr['input_type'] == 'multiSelect') {
if(isset($attr['options'])) {
$result = "<select name='attr[{$attr['name']}]'>";
$result .= "<option value=''>Seleccione</option>";
foreach($attr['options'] as $opt) {
$selected_html = '';
if($opt['name'] == $args['value']) { $selected_html = "selected='selected'"; }
$result .= "<option {$selected_html} value='{$opt['name']}'>{$opt['name']}</option>";
}
$result .= "</select>";
}else{
$result = "<input type='text' name='attr[{$attr['name']}]' value='{$args['value']}' />";
}
}elseif($attr['input_type'] == 'numeric') {
$result = "<input type='number' name='attr[{$attr['name']}]' value='{$args['value']}' />";
}elseif($attr['input_type'] == 'text') {
$result = "<input type='text' name='attr[{$attr['name']}]' value='{$args['value']}' />";
}elseif($attr['input_type'] == 'richText') {
$result = "<textarea name='attr[{$attr['name']}]'>{$args['value']}</textarea>";
}
return esc_html($result);
}
}
}

View File

@@ -0,0 +1,775 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('MiraviaCore') ) {
class MiraviaCore {
/**
* Add account miravia
*
* @param array $data
* @return bool
*
* name tinytext NOT NULL,
token varchar(200) NOT NULL,
userid varchar(30) DEFAULT '' NOT NULL,
config TEXT NOT NULL DEFAULT '{}',
lang varchar(10) NOT NULL
*/
static function add_account($args) {
global $wpdb;
$default = array(
'name' => '',
'token' => '',
'userid' => '',
'lang' => '',
'email' => '',
'config' => '{}',
);
$args = wp_parse_args( $args, $default );
if($args['token'] == '') {
return false;
}
$wpdb->insert($wpdb->prefix.'miravia_accounts',$args);
$my_id = $wpdb->insert_id;
return $my_id;
}
static function delete_account($id = false) {
global $wpdb;
if($id and current_user_can( 'manage_options' )) {
return $wpdb->delete($wpdb->prefix.'miravia_accounts', array('id' => $id));
}
return false;
}
static function delete_profile($id = false) {
global $wpdb;
if($id and current_user_can( 'manage_options' )) {
return $wpdb->delete($wpdb->prefix.'miravia_profiles', array('id' => $id));
}
return false;
}
static function delete_rule($id = false) {
global $wpdb;
if($id and current_user_can( 'manage_options' )) {
return $wpdb->delete($wpdb->prefix.'miravia_rules', array('id' => $id));
}
return false;
}
static function debug($v, $json = true) {
if($json) {
die(json_encode(($v)));
}
die("<pre>".print_r($v, true)."</pre>");
}
static function add_profile($args) {
global $wpdb;
$default = array(
'name' => '',
'accounts_id' => '',
'categories' => '',
'miravia_category' => '',
'config' => '{}',
);
$args = wp_parse_args( $args, $default );
$wpdb->insert($wpdb->prefix.'miravia_profiles',$args);
$my_id = $wpdb->insert_id;
return $my_id;
}
static function request_notify($apiKey, $message, $customSeconds = false){
$secondsNotify = !$customSeconds ? get_option('miravia_delay_time', 300) : $customSeconds;
$notify_actual = intval(get_option('miravia_notify_' . $message . '_in', 0));
$time_lost = ($notify_actual + ($secondsNotify * 1.1));
$time_now = time();
if($notify_actual >= 0 and $time_now < $time_lost ) {
LOG::add("El notify actual está establecido y es superior a {$time_now} > {$time_lost}");
return -1;
}
LOG::add("Estableciendo info notify {$secondsNotify}");
update_option('miravia_notify_' . $message . '_in', time());
$link = new MiraviaLink($apiKey);
$result = $link->subscribe($secondsNotify, $message);
if($result) {
return true;
}else{
return false;
}
}
static function add_rule($args) {
global $wpdb;
$default = array(
'name_rule' => 'No name',
'accounts' => 0,
'profile_id' => 0,
'rules_json' => '[]',
'action_json' => '[]'
);
$args = wp_parse_args( $args, $default );
$wpdb->insert($wpdb->prefix.'miravia_rules',$args);
LOG::add($wpdb->last_error);
$my_id = $wpdb->insert_id;
return $my_id;
}
static function check_product_onjob($product) {
global $wpdb;
$check = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}miravia_products WHERE id_woocommerce = {$product}");
LOG::add("Comprobando si el producto {$product} esta en job {$check->status_text}");
if($check->status_text == 'IN_QUEUE') {
return true;
}
return false;
}
static function update_rule($args, $id) {
global $wpdb;
$default = array(
'name_rule' => 'No name',
'accounts' => 0,
'profile_id' => 0,
'rules_json' => '[]',
'action_json' => '[]'
);
$args = wp_parse_args( $args, $default );
if($id) {
$wpdb->update($wpdb->prefix.'miravia_rules',$args, $id);
return $id;
}
return false;
}
static function update_profile($args, $id = false) {
global $wpdb;
if($id) {
$wpdb->update($wpdb->prefix.'miravia_profiles',$args, $id);
}
return $id;
}
static function get_products_by_profile($profile = false, $need = false) {
if(!$profile) {
return false;
}
$profile = self::get_profiles($profile);
$args = array(
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => array_map('intval', explode(',', $profile['categories'])),
'operator' => 'IN',
'include_children' => false
)
),
'post_type' => 'product',
);
if($need) {
$args['meta_query'] = array(
array(
'key' => '_miravia_need_update',
'compare' => 'EXISTS'
),
array(
'key' => '_miravia_need_update',
'compare' => '!=',
'value' => '0'
)
);
}
$saved = array();
$products = new WP_Query($args);
if($products->have_posts()) {
//Preparare products
foreach($products->posts as $p) {
$prod = new MVProduct($p->ID, $profile);
$pro = $prod->getData();
if($pro) {
$saved[] = $pro;
}
}
return $saved;
}
return false;
}
static function accounts_by_profile($profile) {
global $wpdb;
$profile = self::get_profiles($profile);
if($profile) {
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_accounts WHERE id IN({$profile['accounts_id']})", ARRAY_A );
}
return [];
}
static function get_local_products($page = 1, $limit = 20) {
global $wpdb;
$ofset = ($limit * $page) - $limit;
$query = "SELECT p.*,
IFNULL(COUNT(pw.ID), 0) as variationsTotal,
pp.post_title as `name`
FROM {$wpdb->prefix}miravia_products AS p
LEFT JOIN {$wpdb->prefix}posts AS pp ON pp.ID = p.id_woocommerce
LEFT JOIN {$wpdb->prefix}posts AS pw ON pw.post_parent = p.id_woocommerce AND pw.post_type = 'product_variation'
GROUP BY p.ID
LIMIT {$ofset},{$limit}";
return $wpdb->get_results( $query, ARRAY_A );
}
static function get_profiles($id = false) {
global $wpdb;
if($id) {
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_profiles WHERE id = '{$id}'", ARRAY_A );
}
$profiles = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_profiles", ARRAY_A );
if($profiles) {
foreach($profiles as &$prof){
$prof['sync'] = self::get_products_by_profile_total($prof['categories']);
}
return $profiles;
}
return [];
}
static function get_products_by_profile_total($categories) {
global $wpdb;
if($categories == "") {
return "No categories selected";
}
$created = (array) $wpdb->get_row("SELECT COUNT(DISTINCT p.ID) AS total_created
FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}term_relationships tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms t ON tt.term_id = t.term_id
WHERE tt.taxonomy = 'product_cat'
AND t.term_id IN ({$categories})");
$sync = (array) $wpdb->get_row("SELECT COUNT(DISTINCT mp.id_woocommerce) AS total_sync
FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}term_relationships tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms t ON tt.term_id = t.term_id
INNER JOIN {$wpdb->prefix}miravia_products mp ON p.ID = mp.id_woocommerce AND mp.id_miravia != 0
WHERE tt.taxonomy = 'product_cat'
AND t.term_id IN ({$categories})");
// MiraviaCore::debug($created);
if($sync) {
$string = "{$sync['total_sync']} / ";
}else{
$string = "0 /";
}
if($created) {
$string .= $created['total_created'];
}else{
$string .= "0";
}
return $string;
}
static function get_profiles_by_seller($account) {
global $wpdb;
return $wpdb->get_results("SELECT
p.id
FROM
{$wpdb->prefix}miravia_profiles AS p
LEFT JOIN {$wpdb->prefix}miravia_accounts AS ma ON ma.id = p.accounts_id
WHERE
ma.userid = '{$account}'", ARRAY_A );
}
static function get_rules($id = false, $customWhere = false) {
global $wpdb;
if($id) {
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_rules WHERE id = '{$id}'", ARRAY_A );
}else{
if($customWhere) {
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_rules WHERE {$customWhere}", ARRAY_A );
}
}
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_rules", ARRAY_A );
}
static function get_profile_by_product($sku = false) {
global $wpdb;
if($sku) {
$_product_id = wc_get_product_id_by_sku($sku);
$categories = get_the_terms( $_product_id, 'product_cat' );
foreach($categories as $c) {
$profiles = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_profiles WHERE FIND_IN_SET('{$c->term_id}', categories) > 0", ARRAY_A );
if(is_array($profiles) and count($profiles) > 0) {
return $profiles[0]['id'];
}
}
}
return false;
}
static function get_product_miravia($id = false) {
global $wpdb;
if($id) {
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_products WHERE id_woocommerce = '{$id}'", ARRAY_A );
}
//Is a variation...
// $parent =
return false;
}
static function get_accounts($id = false, $field = 'id') {
global $wpdb;
if($id) {
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_accounts WHERE {$field} = '{$id}'", ARRAY_A );
}
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}miravia_accounts", ARRAY_A );
}
static function get_miravia_account_default($id = false, $field = 'id') {
global $wpdb;
if($id) {
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_accounts WHERE `{$field}` = '{$id}'", ARRAY_A );
}
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_accounts LIMIT 1", ARRAY_A );
}
static function order_exist($id) {
global $wpdb;
if($id) {
return $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE `meta_value` = '{$id}'", ARRAY_A );
}
return true;
}
static function get_product($id, $profile = 0) {
global $wpdb;
$queryProfile = "";
if($profile) {
$queryProfile = " AND profile_id = '{$profile}'";
}
return $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}miravia_products WHERE id_woocommerce = '{$id}' {$queryProfile}" );
}
static function set_job_product($id, $profile, $job = 0) {
global $wpdb;
if(is_array($id)) {
$where = "id_woocommerce IN(".implode(',', $id).")";
}else{
$where = "id_woocommerce = '$id'";
}
$query = "UPDATE {$wpdb->prefix}miravia_products SET job_id='{$job}', status_text='IN_QUEUE' WHERE profile_id = {$profile} AND ". $where;
$result = $wpdb->query($query);
LOG::add("SET JOB ON PRODUCTS -> " . $query);
LOG::add($result);
}
static function set_job_product_error($id, $profile, $job = 0, $errorText = 'Generic Error') {
global $wpdb;
if(is_array($id)) {
$where = "id_woocommerce IN(".implode(',', $id).")";
}else{
$where = "id_woocommerce = '$id'";
}
$query = "UPDATE {$wpdb->prefix}miravia_products SET job_id='{$job}', lastError='{$errorText}' status_text='FAIL' WHERE profile_id = {$profile} AND ". $where;
$result = $wpdb->query($query);
LOG::add("SET JOB ON PRODUCTS -> " . $query);
LOG::add($result);
}
static function get_order_woocommerce($id) {
$order = wc_get_order($id);
$order_data = new stdClass();
$items_data = [];
$items = false;
if($order) {
$order_data->id = $id;
$order_data->total = $order->get_total();
$items = $order->get_items();
foreach($items as $item) {
array_push($items_data, wc_get_order_item_meta($item->get_id(), '_miravia_order_item_id', true));
}
}
return [$order_data, $items_data];
}
static function getCurrentRules($account_id = 0, $profile_id = 0){
$rules = self::get_rules(false, "(accounts = {$account_id} OR accounts = 0) AND (profile_id = {$profile_id} OR profile_id = '0')");
return $rules;
}
static function applyFilter($feed, $account_id, $profile_id) {
$rules = self::getCurrentRules($account_id, $profile_id);
foreach ($rules as $rule){
$jsonfilter = $rule['rules_json'];
if($jsonfilter){
if($ids = $feed->applyFilter($jsonfilter)){
switch($rule['action_type']){
case 'remove':
$feed->removeProductsById($ids);
break;
case 'only':
$feed->keepProductsById($ids);
break;
case 'price_stock':
$detail = json_decode($rule['action_json'], true);
if(is_array($detail)){
$field = $detail['field'];
$operator = $detail['operator'];
$value = $detail['value'];
$feed->applyNumericFieldAction($ids, $field, $operator, $value);
}
break;
case 'name':
$detail = json_decode($rule['action_json'], true);
if(is_array($detail)){
$field = $detail['field'];
$stringvalue = $detail['stringvalue'];
$feed->applyTextFieldAction($ids, $field, $stringvalue);
}
break;
case 'logistics':
$detail = json_decode($rule['action_json'], true);
if(is_array($detail)){
$delivery = $detail['delivery'];
$warehouse = $detail['warehouse'];
$feed->applyLogisticsAction($ids, $delivery, $warehouse);
}
break;
}
}
}
}
return $feed;
}
static function set_error_product_job($sku, $job = 0, $error = '') {
global $wpdb;
$query = "UPDATE {$wpdb->prefix}miravia_products SET lastError='{$error}', status_text='ERROR' WHERE sku = '{$sku}' AND job_id='{$job}'";
$result = $wpdb->query($query);
}
static function set_status_job($job = 0, $status = '') {
global $wpdb;
if($job) {
$query = "UPDATE {$wpdb->prefix}miravia_products SET status_text='{$status}' WHERE job_id='{$job}'";
$result = $wpdb->query($query);
}
}
static function clear_job($job = 0) {
global $wpdb;
if($job) {
$query = "UPDATE {$wpdb->prefix}miravia_products SET status_text='ND', job_id='', lastError='' WHERE job_id='{$job}'";
$result = $wpdb->query($query);
}
}
static function disconnect_product($id) {
global $wpdb;
$query = "UPDATE {$wpdb->prefix}miravia_products SET status_text='Disconected', lastError='', last_updated='NOW()', id_miravia='' WHERE id_woocommerce = '{$id}'";
$wpdb->query($query);
}
static function set_id_miravia_product_job($sku, $job = 0, $id = '') {
global $wpdb;
if($id === false) {
$query = "UPDATE {$wpdb->prefix}miravia_products SET status_text='DONE', lastError='', last_updated='NOW()' WHERE sku = '{$sku}' AND job_id='{$job}'";
}else{
$query = "UPDATE {$wpdb->prefix}miravia_products SET id_miravia='{$id}',status_text='DONE', lastError='', last_updated='NOW()' WHERE sku = '{$sku}' AND job_id='{$job}'";
}
$result = $wpdb->query($query);
}
static function get_miravia_category($product, $profile) {
$cat = $product->get_category_ids();
$category_profile_search = explode(',', $profile['categories']);
foreach($cat as $c) {
if(in_array($c, $category_profile_search)) {
return $c;
}
}
return 0;
}
static function get_attributes(WC_Product $_product, $attrs) {
$attrs = $_product->get_attributes();
// (
// [color] => WC_Product_Attribute Object
// (
// [data:protected] => Array
// (
// [id] => 0
// [name] => Color
// [options] => Array
// (
// [0] => Rojo
// )
// [position] => 0
// [visible] => 1
// [variation] =>
// )
// )
// )
// var_dump($attrs);
// die();
$attributes = [];
foreach($attrs as $key => $v) {
if(count($v['options']) == 1) {
$value = $v['options'][0];
}else{
$value = $v['options'];
}
$attributes[self::get_key_miravia_attr($key, $attrs)] = $value;
}
return $attributes;
// $map_attrs = get_term_meta($_product->get_category_ids(), "_miravia_attr", true);
}
static function get_key_miravia_attr($key, $attrs) {
if(isset($attrs->attr)) {
$attrs = $attrs->attr;
}
foreach($attrs as $k => $v) {
// MiraviaCore::debug(array($key, $attrs, $k, 'attribute_pa_'.$k == $key));
if($k == $key or 'pa_'.$k == $key or 'attribute_pa_'.$k == $key) {
return $v;
}
}
return false;
}
static function select_category($categories, $args = array('select' => '0', 'name' => 'category')) {
$html = "<select name='{$args['name']}'>";
$html .= "<option value='0'>Seleccione</option>";
foreach($categories as $c) {
// die(var_dump($c['children']));
if(isset($c['children'])) {
$html .= self::get_children_category_select($c, $args);
}else{
$selected_html = "";
if($args['select'] == $c['category_id']) { $selected_html = "selected='selected'"; }
$html .= "<option {$selected_html} value='{$c['category_id']}'>{$c['name']}</option>";
}
}
$html .= "</select>";
return esc_html($html);
}
static function get_children_category_select($categories, $args = array('select' => '0', 'name' => 'category')) {
// die(var_dump($categories));
$html = "<optgroup label='{$categories['name']}'>";
foreach($categories['children'] as $c) {
// die(var_dump($c));
if(isset($c['children'])) {
$html .= self::get_children_category_select($c, $args);
}else{
$selected_html = "";
if($args['select'] == $c['category_id']) { $selected_html = "selected='selected'"; }
$html .= "<option {$selected_html} value='{$c['category_id']}'>{$c['name']}</option>";
}
}
$html .= "</optgroup>";
return esc_html($html);
}
static function get_jobs() {
global $wpdb;
$query = "SELECT
DISTINCT(p.job_id),
COUNT(DISTINCT(p.id_woocommerce)) as total,
ac.token,
f.id,
p.updated
FROM {$wpdb->prefix}miravia_products AS p
INNER JOIN {$wpdb->prefix}miravia_profiles AS f ON p.profile_id = f.id
INNER JOIN {$wpdb->prefix}miravia_accounts AS ac ON f.accounts_id = ac.id
WHERE
p.job_id != '0' and p.job_id != ''
GROUP BY p.job_id, ac.token, f.id";
return $wpdb->get_results( $query, ARRAY_A );
}
static function get_job_detail($id = false) {
global $wpdb;
if(!$id) {
return [];
}
$query = "SELECT
p.*
FROM {$wpdb->prefix}miravia_products AS p
INNER JOIN {$wpdb->prefix}miravia_profiles AS f ON p.profile_id = f.id
INNER JOIN {$wpdb->prefix}miravia_accounts AS ac ON f.accounts_id = ac.id
WHERE
p.job_id = '{$id}'";
return $wpdb->get_results( $query, ARRAY_A );
}
static function resync_stock() {
global $wpdb;
//Actualizar todos los stocks como que necesitan actualizar y responder con un array de tokens de cuentas
$wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->prefix}postmeta AS pm1
INNER JOIN {$wpdb->prefix}miravia_products AS pm2
ON pm1.post_id = pm2.id_woocommerce
SET pm1.meta_value = %s
WHERE pm1.meta_key = %s",
'1',
'_miravia_need_update'
)
);
return MiraviaCore::get_accounts();
}
static function procesarFeed() {
$document = sanitize_text_field($_REQUEST['document']);
$seller = sanitize_text_field($_REQUEST['seller']);
$account = MiraviaCore::get_accounts($seller,'userid');
if(!$account) {
LOG::add("Accont not found on process feed {$document}", false, 'feeds');
return false;
}
$id_seller = $account['id'];
if($id_seller) {
$link = new MiraviaLink($account['token']);
$data = $link->getFeedResult($document);
if (!empty($data)) {
$info = json_decode($data,true);
if(is_array($info) && isset($info['success']) && $info['success'] == false){
$ret['success'] = false;
$ret['error'] = $info['error'];
$txlog .= $info['error'];
}else {
$r = self::processFeedResult($seller, $data);
if ($r != 'ok') {
LOG::add("Error when process feed {$document}: {$r}", false, 'feeds');
return false;
}
}
}
}else{
LOG::add("ID Accont not found on process feed {$document}", false, 'feeds');
return false;
}
}
static public function processFeedResult($seller, $data){
if(!is_array($data)){
$data = json_decode($data, true);
}
$account = MiraviaCore::get_accounts($seller,'userid');
if(!$account){
return 'error: invalid seller';
}
if(!is_array($data)){
return 'error: invalid data';
}
foreach($data as $id => $info){
global $wpdb;
$status = isset($info['status']) ? $info['status'] : false;
$message = '?';
$item_id = '';
if($status){
$message='';
if($status=='FAIL'){
$status = 'error';
$detail = isset($info['detail']) ? $info['detail'] : false;
$message = self::getFeedDetail($detail);
}elseif($status=='SUCCESS'){
$status = 'created';
$item_id = $info['id'];
}
}else{
$status = 'error';
$message = 'Invalid response from server: ' . json_encode($info);
}
$update_fields = [
'status_text' => $status,
'lastError' => $message,
'job_id' => '',
];
if(!empty($item_id)){
$update_fields['id_miravia'] = $item_id;
}
$wpdb->update($wpdb->prefix.'miravia_products', $update_fields, array('sku' => $id,'job_id' => $_GET['feed']));
}
return 'ok';
}
static protected function getFeedDetail($tx)
{
if(is_array($tx)){
$data = $tx;
}else {
$data = json_decode($tx, true);
}
$msg = isset($data['message']) ? $data['message'] : false;
if($msg){
$data = is_array($msg) ? $msg : json_decode($msg, true);
$errorCode = isset($data['errorCode']) ? $data['errorCode'] : '0';
$errorMsg = isset($data['errorMsg']) ? $data['errorMsg'] : '0';
$errorFirst = isset($data['errors'][0]['code']) ? $data['errors'][0]['code'] : '0';
$detail = "[$errorCode] $errorMsg ($errorFirst)";
return $detail;
}
$detail = $tx;
return $detail;
}
}
}

View File

@@ -0,0 +1,77 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
class MIRAVIADB {
static function install() {
global $wpdb;
$installed_ver = get_option( "miravia_db_version", 0 );
if ($installed_ver != MIRAVIA_DB_VERSION) {
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE {$wpdb->prefix}miravia_accounts (
id mediumint(9) NOT NULL AUTO_INCREMENT,
created datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
name tinytext NOT NULL,
token varchar(200) NOT NULL,
userid varchar(30) DEFAULT '' NOT NULL,
config TEXT,
lang varchar(10) NOT NULL,
email varchar(100) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
$sql .= "CREATE TABLE {$wpdb->prefix}miravia_profiles (
id mediumint(9) NOT NULL AUTO_INCREMENT,
created datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
name tinytext NOT NULL,
accounts_id varchar(200) NOT NULL,
categories varchar(250) DEFAULT '' NOT NULL,
miravia_category bigint NOT NULL DEFAULT 0,
config TEXT,
PRIMARY KEY (id)
) $charset_collate;";
$sql .= "CREATE TABLE {$wpdb->prefix}miravia_products (
id mediumint(9) NOT NULL AUTO_INCREMENT,
created datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
last_updated datetime DEFAULT '0000-00-00 00:00:00',
id_woocommerce BIGINT NOT NULL,
sku varchar(100) NOT NULL,
id_miravia BIGINT NOT NULL,
job_id VARCHAR(100) NOT NULL DEFAULT '0',
stock INT NOT NULL DEFAULT 0,
price FLOAT(50,2) NULL DEFAULT NULL,
sale_price FLOAT(50,2) NULL DEFAULT NULL,
profile_id INT DEFAULT 0 NOT NULL,
lastError varchar(255) DEFAULT '',
status_text varchar(100) DEFAULT '',
PRIMARY KEY (id)
) $charset_collate;";
$sql .= "CREATE TABLE {$wpdb->prefix}miravia_rules (
id mediumint(9) NOT NULL AUTO_INCREMENT,
created datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated datetime DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
name_rule VARCHAR(100) NOT NULL,
accounts INT NOT NULL DEFAULT 0,
profile_id INT NOT NULL DEFAULT 0,
rules_json TEXT,
action_json TEXT,
action_type VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
//Run SQL
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta( $sql );
//Update bd version plugin
update_option( 'miravia_db_version', MIRAVIA_DB_VERSION );
LOG::add("La base de datos ha sido actualizada a la versión " . MIRAVIA_DB_VERSION);
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if(!class_exists('MIRAVIA_LOCAL')) {
class MIRAVIA_LOCAL {
function __construct() {
}
}
}

View File

@@ -0,0 +1,60 @@
<?php
if(!class_exists('LOG')) {
class LOG {
/**
* add message to file
*
* @param string $msg String to register
* @param int|string $element Any ID or String
* @param string $type Default: user
* @return int|boolean
*/
static function add($msg, $element = false, $type = false ) {
if(!$type) {
$type = defined('LOG_DEFAULT_FILE') ? LOG_DEFAULT_FILE : 'user';
}
$root = defined('LOG_FOLDER') ? LOG_FOLDER : '/';
//If an element is defined and provided, it will be separated into files by element
$divide = defined('LOG_DIVIDE_ELEMENT');
$y = date('Y');
$m = date('m');
//Create htaccess file if no exist
if(!file_exists($root . "logs/.htaccess")) {
file_put_contents($root . "logs/.htaccess", 'Deny from all');
}
$fileDest = $root . "logs/{$y}/{$m}/";
if(!file_exists($fileDest)) {
$dir = mkdir($fileDest, 0775, true);
}
if($element && $divide) {
return file_put_contents($fileDest.$type."_{$element}.log", self::data($msg, $element, $type),FILE_APPEND);
}
return file_put_contents($fileDest.$type.".log", self::data($msg, $element, $type),FILE_APPEND);
}
/**
* Structure data
*
* @param string $msg
* @param int|string $element
* @param string $type
* @return string
*/
private static function data($msg, $element = '0', $type) {
if(is_array($msg) || is_object($msg)) {
return "[".date('Y-m-d H:i:s') . "] ". json_encode($msg, JSON_PRETTY_PRINT) . " \r\n";
}
return "[".date('Y-m-d H:i:s') . "] $msg \r\n";
}
}
}

View File

@@ -0,0 +1,120 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('MIRAVIABase') ) {
class MIRAVIABase {
private $url = "https://api.miravia.es/rest";
private $token = "50000701b37tSEfdXdiuAq0yiimwLWEyVIf3lsRgyp2yLqwX61b895957sebFoS";
private $appSecret = "8nxjS2TDTevc0AwmXh7AbKQL4XnuaE7t";
private $appKey = "500406";
private $client = false;
function __construct(){
if(!$this->client) {
$this->client = new IopClient($this->url,$this->appKey,$this->appSecret);
}
}
function secure(){
if(!$this->client) {
die(json_encode(array('error' => true, 'message' => 'No se ha establecido la conexión')));
}
}
function get($endpoint = '', $params = array()) {
$this->secure();
$request = new IopRequest($endpoint,'GET');
if($params) {
foreach($params as $k => $v) {
$request->addApiParam($k,$v);
}
}
try{
$result = $this->client->execute($request,$this->token);
}catch(Exception $e) {
return $this->error_control($e);
}
$resp = json_decode($result, true);
return $this->response($resp);
}
function post($endpoint = '', $data = array()) {
$this->secure();
$request = new IopRequest($endpoint);
if($data) {
foreach($data as $k => $v) {
$request->addApiParam($k,$v);
}
}
try{
$result = $this->client->execute($request, $this->token);
}catch(Exception $e) {
return $this->error_control($e);
}
$resp = json_decode($result, true);
return $this->response($resp);
}
function response($result) {
if(isset($result['data'])) {
return $result['data'];
}else{
//Control de errores
return $this->error_control($result);
}
}
function error_control($resp) {
// die('<pre>'.print_r($resp, true).'</pre>');
if($resp->code != '0') {
if(isset($resp->detail)) {
$errors = $resp->detail;
}else{
$errors = [$resp->message];
}
return array(
'code' => $resp->code,
'errors' => $errors
);
}else{
return array(
'code' => '-1',
'errors' => array($resp)
);
}
}
function get_images_batch($batch_id) {
return $this->get('/image/response/get', array('batch_id' => $batch_id));
}
function get_brands($page) {
$to = $page * 20;
$from = $to - 20;
return $this->get('/category/brands/query', array('start_row' => $from, "page_size" => $to));
}
function get_orders($args = array()) {
return $this->get('/orders/get', $args);
}
function get_order($args = array()) {
return $this->get('/order/get', $args);
}
function get_orders_items($args = array()) {
return $this->get('/order/items/get', $args);
}
function get_products($args = array()) {
return $this->get('/products/get', $args);
}
}
}

View File

@@ -0,0 +1,128 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('MVOrder') ) {
class MVOrder {
function __construct(){
}
function create($order_miravia = false) {
//Obtener datos del pedido
$defaultStatus = get_option('miravia_default_status', 'wc-processing');
$order = wc_create_order();
if($order_miravia['address_shipping']['customerEmail']) {
$username = $order_miravia['address_shipping']['customerEmail'];
}else{
$username = $order_miravia['order_number'];
}
$user_id = username_exists( $username );
$billing_address = array(
'first_name' => $order_miravia['address_billing']['first_name'],
'last_name' => $order_miravia['address_billing']['last_name'],
'email' => $order_miravia['address_shipping']['customerEmail'],
'phone' => $order_miravia['address_billing']['phone'],
'address_1' => "{$order_miravia['address_billing']['address1']} {$order_miravia['address_billing']['address2']} {$order_miravia['address_billing']['address3']}",
'address_2' => "{$order_miravia['address_billing']['address4']} {$order_miravia['address_billing']['address5']}",
'city' => $order_miravia['address_billing']['city'],
'state' => $order_miravia['address_billing']['country'], //Ver esto
'postcode' => $order_miravia['address_billing']['post_code'],
'country' => $order_miravia['address_billing']['country'],
);
$shipping_address = array(
'first_name' => $order_miravia['address_shipping']['firstName'],
'last_name' => $order_miravia['address_shipping']['lastName'],
'address_1' => "{$order_miravia['address_shipping']['address1']} {$order_miravia['address_shipping']['address2']} {$order_miravia['address_shipping']['address3']}",
'address_2' => "{$order_miravia['address_shipping']['address4']} {$order_miravia['address_shipping']['address5']}",
'city' => $order_miravia['address_shipping']['city'],
'state' => $order_miravia['address_shipping']['country'], //Ver esto
'postcode' => $order_miravia['address_shipping']['postCode'],
'country' => $order_miravia['address_shipping']['country'],
);
$order->set_address( $billing_address, 'billing' );
$order->set_address( $shipping_address, 'shipping' );
update_post_meta($order->ID, '_miravia_order_id', $order_miravia['order_number']);
update_post_meta($order->ID, '_miravia_account_id', $order_miravia['account_id']);
// update_post_meta($order->ID, '_miravia_order_id', $order_miravia['order_number']);
// 1. User doesn't exist - Create it - send email - set address and define
if ( ! $user_id && $user_id == false ) {
$email = $username;
$password = wp_generate_password( 12, false );
$first_name = $order_miravia['address_shipping']['firstName'];
$last_name = $order_miravia['address_shipping']['lastName'];
$user_data = array(
'user_login' => $username,
'user_pass' => $password,
'user_email' => $email,
'first_name' => $first_name,
'last_name' => $last_name,
'role' => 'customer',
);
$user_id = wp_insert_user( $user_data );
// Update Billing and shipping user data
foreach( $billing_address as $key => $value ) {
update_user_meta( $user_id, 'billing_' . $key, $value );
}
foreach( $shipping_address as $key => $value ) {
update_user_meta( $user_id, 'shipping_' . $key, $value );
}
// No send notification on create user
// WC()->mailer()->get_emails()['WC_Email_Customer_New_Account']->trigger( $user_id, $password, true );
}
// For calculating taxes on items
$calculate_taxes_for = array(
'country' => ! empty($shipping_address['country']) ? $shipping_address['country'] : $billing_address['country'],
'state' => ! empty($shipping_address['state']) ? $shipping_address['state'] : $billing_address['state'],
'postcode' => ! empty($shipping_address['postcode']) ? $shipping_address['postcode'] : $billing_address['postcode'],
'city' => ! empty($shipping_address['city']) ? $shipping_address['city'] : $billing_address['city'],
);
foreach($order_miravia['order_items'] as $k => $item) {
$this->add_product($order, $item, $calculate_taxes_for);
}
$order->set_customer_id( $user_id );
$order->set_currency( get_woocommerce_currency() );
$order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );
$note = 'From MIRAVIA Order';
$order->add_order_note( $note );
$order->set_customer_note( $note );
$order->set_status($defaultStatus, "Created from Miravia");
$order->calculate_totals();
$order->update_status('autoquote', true); // $order->save() is already included with update_status() method
}
function add_product($order, $product, $calculate_taxes_for) {
$product_sku = wc_get_product_id_by_sku($product['sku']);
$_product = $product_sku ? wc_get_product( $product_sku ) : false;
$cantidad = 1; //TODO ver esto
$priceWithOutTax = $product['item_price'] - (($product['item_price'] - $product['tax_amount']) / 100);
$dataLine = [
'name' => $product['name'],
'subtotal' => $priceWithOutTax,
'total' => $product['item_price']
];
$item_id = $order->add_product($_product, $cantidad, $dataLine);
wc_update_order_item_meta($item_id, '_miravia_delivery_option', $product['delivery_option_sof']);
wc_update_order_item_meta($item_id, '_miravia_order_item_id', $product['order_item_id']);
$line_item = $order->get_item( $item_id, false ); // Get the WC_Order_Item_Product Object instance from the Item Id
$line_item->calculate_taxes($calculate_taxes_for); // <== Calculating taxes
$line_item->save(); // Save data to WC_Order_Item_Product Object
}
}
}

View File

@@ -0,0 +1,125 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('ARIProduct') ) {
class ARIProduct {
private $product = false;
private $defaul_image = '';
private $category = 0;
public $ItemId = 0;
public $Images = array('Image' => array());
public $Attributes = array();
public $Skus = array('Sku' => array());
public $PrimaryCategory = 0;
function __construct($id){
$this->product = wc_get_product($id);
//Por defecto de la categoria
$terms = get_the_terms( $this->product->get_id(), 'product_cat' );
$this->category = $terms[0];
//Exist Product
$miraviaId = get_post_meta($id, '_miravia_product_id', true);
if($miraviaId) {
$this->ItemId = $miraviaId;
}
$atributos_guardados = get_term_meta($this->category->term_id, "_miravia_attr", true);
if($atributos_guardados) {
$this->Attributes = $atributos_guardados;
}
//Completar los datos básicos
$this->PrimaryCategory = get_term_meta($this->category->term_id, "_miravia_category", true);
$this->Attributes['name'] = $this->product->get_name();
$this->Attributes['description'] = $this->product->get_description();
//Cargar imagenes
$attachment_ids = $this->product->get_gallery_image_ids();
foreach( $attachment_ids as $attachment_id ) {
$this->Images['Image'][] = $this->defaul_image;
}
$this->get_skus();
}
function get_skus() {
if($this->product->is_type('simple')) {
$skus = [$this->product];
}else{
$skus = $this->product->get_available_variations();
}
foreach($skus as $index => $sku) {
$this->Skus['Sku'][$index]["SellerSku"] = $sku->get_sku();
$this->Skus['Sku'][$index]["quantity"] = $sku->get_stock_quantity();
$this->Skus['Sku'][$index]["price"] = $sku->get_regular_price();
if($sku->is_on_sale()) {
$this->Skus['Sku'][$index]["special_price"] = $sku->get_sale_price();
}
$this->Skus['Sku'][$index]["price"] = $sku->get_regular_price();
if($sku->get_manage_stock() === false) {
if($sku->get_stock_status() == "instock") {
$stock_available = intval(100); //Stock por defecto
}else{
$stock_available = 0;
}
}else{
$stock_available = $sku->get_stock_quantity();
}
$this->Skus['Sku'][$index]["quantity"] = $stock_available;
$this->Skus['Sku'][$index]["package_height"] = $sku->get_height();
$this->Skus['Sku'][$index]["package_length"] = $sku->get_length();
$this->Skus['Sku'][$index]["ean_code"] = '0'; //Implementar
$this->Skus['Sku'][$index]["package_width"] = $sku->get_width();
$this->Skus['Sku'][$index]["package_weight"] = $sku->get_weight();
$this->Skus['Sku'][$index]["package_content"] = ''; //Implementar
$attachment_ids = $sku->get_gallery_image_ids();
foreach( $attachment_ids as $attachment_id ) {
$this->Skus['Sku'][$index]["Images"]["Image"][] = $this->defaul_image;
}
}
}
function send() {
global $MIRAVIAWOO;
$send_product = json_encode(array("Request" => array("Product" => array(
'Attributes' => $this->Attributes,
'PrimaryCategory' => $this->PrimaryCategory,
'Skus' => $this->Skus,
'Images' => $this->Images
))));
$result_product = $MIRAVIAWOO->client->post('/product/create', array(
'body' => $send_product
));
return $result_product;
}
function update() {
global $MIRAVIAWOO;
$send_product = json_encode(array("Request" => array("Product" => array(
'ItemId' => $this->ItemId,
'Attributes' => $this->Attributes,
'PrimaryCategory' => $this->PrimaryCategory,
'Skus' => $this->Skus,
'Images' => $this->Images
))));
$result_product = $MIRAVIAWOO->client->post('/product/update', array(
'payload' => $send_product
));
error_log(json_encode($result_product));
return $result_product;
}
}
}

View File

@@ -0,0 +1,211 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('MVProduct') ) {
class MVProduct {
public $product = false;
public $id = 0;
public $id_woocommerce = 0;
public $id_miravia = 0;
public $profile = 0;
public $defaul_image = '';
public $last_updated = '0000-00-00 00:00:00';
function __construct($id, $profile = 0) {
global $wpdb;
$saved = MiraviaCore::get_product($id, $profile['id']);
$ean = '';
$keyEAN = get_option('miravia_ean_key', '');
if($keyEAN != '') {
$ean = get_post_meta($id, $keyEAN, true);
}
$defaultBrand = get_option('miravia_default_brand', 'No Brand');
$productBrand = get_post_meta($id, '_miravia_brand_product', true);
if($productBrand) {
$defaultBrand = $productBrand;
}
//Units
$defaultUnit = get_option('miravia_default_unit', 'units');
$defaultUnitValue = get_option('miravia_default_unit_value', '1');
$productUnit = get_post_meta($id, '_miravia_unit', true);
$productUnitValue = get_post_meta($id, '_miravia_unit_value', true);
if($productUnit) {
$defaultUnit = $productUnit;
}
if($productUnitValue) {
$defaultUnitValue = $productUnitValue;
}
// LOG::add($saved);
if($saved) {
$this->id = $saved->id;
$this->id_woocommerce = $saved->id_woocommerce;
$this->id_miravia = $saved->id_miravia;
$this->profile = $saved->profile_id;
$this->last_updated = $saved->last_updated;
$_product = wc_get_product(intval($this->id_woocommerce));
}else{
$this->id_woocommerce = $id;
//Load product
$_product = wc_get_product(intval($this->id_woocommerce));
$this->profile = $profile['id'];
$wpdb->insert($wpdb->prefix.'miravia_products', array(
'id_woocommerce' => $this->id_woocommerce,
'sku' => $_product->get_sku() ?: $id,
'id_miravia' => $this->id_miravia,
'profile_id' => $this->profile,
'stock' => $_product->get_regular_price(),
'price' => $_product->get_regular_price(),
'sale_price' => $_product->get_sale_price(),
));
$this->id = $wpdb->insert_id;
}
if($_product->get_manage_stock() === false) {
if($_product->get_stock_status() == "instock") {
$stock_available = get_option('_miravia_default_stock', 100); //Stock por defecto
}else{
$stock_available = 0;
}
}else{
$stock_available = $_product->get_stock_quantity();
}
$local_category = MiraviaCore::get_miravia_category($_product, $profile);
// $attributes_product = MiraviaCore::get_attributes($_product, $local_category);
// $attributes_product = $_product->get_attributes();
// die("<pre>".print_r($attributes_product, true)."</pre>");
$this->product = new MiraviaProduct();
$this->product->id = $this->id_woocommerce;
$this->product->id_miravia = $this->id_miravia;
$this->product->sku = $_product->get_sku() ?: $id;
$this->product->lang = 'es-ES'; // ISO lang cod
$this->product->name = $_product->get_name();
$this->product->short_description = $_product->get_short_description();
$this->product->description = $_product->get_description();
$this->product->brand = $defaultBrand;
$this->product->model = '';
$this->product->ean_code = $ean;
$this->product->warranty = '';
$this->product->id_category = $profile['miravia_category'];
$this->product->id_brand = '';
$this->product->images = []; // Se completa después
$this->product->video = '';
$this->product->price = $_product->get_regular_price();
$this->product->special_price = $_product->get_sale_price();
$this->product->width = $_product->get_width();
$this->product->height = $_product->get_height();
$this->product->length = $_product->get_length();
$this->product->weight = $_product->get_weight();
$this->product->delivery = get_option('miravia_transport_mode', 'dbm');
$this->product->info = array(
'id_category' => $local_category
);
//$this->product->extra_attributes = []; # TODO agregar caracteristicas
//Attrs
$this->product->addAttr("unit_count_type", $defaultUnit);
$this->product->addAttr("Unit_Count", $defaultUnitValue);
if($_product->is_type( 'variable' )) {
$combinations = [];
$variations = $_product->get_available_variations();
// MiraviaCore::debug($variations);
foreach($variations as $v) {
if($v['is_in_stock'] == true) {
if($v['max_qty'] == "") {
$stock_available = get_option('_miravia_default_stock', 100); //Stock por defecto
}else{
$stock_available = $v["max_qty"];
}
}else{
$stock_available = 0; //Stock por defecto
}
$ean = '';
$keyEAN = get_option('miravia_ean_key', '');
if($keyEAN != '') {
$ean = get_post_meta($v['variation_id'], $keyEAN, true);
}
$com = new MiraviaCombination();
$com->sku = $v['sku'];
$com->ean_code = $ean;
$com->price = $v['display_regular_price'];
$com->special_price = $v['display_price'];
$com->quantity = intval($stock_available);
$com->images = [];
$com->width = $v['dimensions']['width'];
$com->height = $v['dimensions']['height'];
$com->length = $v['dimensions']['length'];
$com->weight = $v['weight'];
$com->variation = [];
$encontrados = [];
$labels = [];
$lastAttribute = "";
foreach($v['attributes'] as $k => $a) {
$term_name = ( $term = get_term_by( 'slug', $a, str_replace("attribute_", "", $k) ) ) ? $term->name : $a;
$nameWithOutAttribute = str_replace("attribute_", "", $k);
if(isset($encontrados[$nameWithOutAttribute])) {
$encontrados[$nameWithOutAttribute] .= $term_name;
}else{
$encontrados[$nameWithOutAttribute] = $term_name;
}
}
foreach($encontrados as $b => $c) {
$com->addVariation($b, $c);
}
$combinations[] = $com;
}
$this->product->combinations = $combinations;
}
//Set stock
$this->product->quantity = $stock_available;
//Load images
$attachment_ids = $_product->get_gallery_image_ids();
$sizeImage = get_option('miravia_size_image', 'single-post-thumbnail');
$featured = wp_get_attachment_image_src( get_post_thumbnail_id( $this->product->id ), $sizeImage );
if($featured and is_array($featured)) {
$this->product->images[] = $featured[0];
}
foreach( $attachment_ids as $attachment_id ) {
$this->product->images[] = wp_get_attachment_image_src( $attachment_id, $sizeImage )[0];
}
}
public function getData() {
$error = false;
//Control de productos sin variaciones ni precio
if(($this->product->price == 0 or $this->product->price == "") and count($this->product->combinations) == 0) {
LOG::add("Producto {$this->product->id} no agregado por no tener precio y no tener variaciones", false, 'errors_products_send');
$error = true;
}
if(count($this->product->images) == 0) {
LOG::add("Producto {$this->product->id} no tiene imagenes, no enviado", false, 'errors_products_send');
$error = true;
}
if($error) {
return false;
}
return $this->product;
}
function send() {
return false;
}
}
}

View File

@@ -0,0 +1,11 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
if( !class_exists('ARIUi') ) {
class ARIUi {
function __construct(){
}
}
}

View File

@@ -0,0 +1,90 @@
<?php
require_once dirname(__FILE__) . '/MiraviaLink.php';
class MiraviaCategory extends MiraviaLink
{
public function getCategories($treeFormat = false)
{
$url = $this->api_url . '/category/tree';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
$this->last_error = $resp['error'];
return false;
}
if(isset($resp['data'])){
if($treeFormat) {
return $resp['data'];
}else{
return $this->treeToList($resp['data']);
}
}
return false;
}
public function getBrands()
{
$url = $this->api_url . '/category/brands';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
$this->last_error = $resp['error'];
return false;
}
if(isset($resp['data'])){
return $resp['data'];
}
return false;
}
public function getAttributes($id)
{
$url = $this->api_url . '/category/' . $id . '/attributes';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
$this->last_error = isset($resp['error']) ? $resp['error'] : $ret;
return false;
}
if(isset($resp['data'])){
return $resp['data'];
}
return false;
}
private function treeToList($tree = [], $prefix = '')
{
$ret = [];
$separator = $prefix=='' ? '' : ' / ';
foreach ($tree as $item) {
$name = $item['name'];
if(isset($item['children'])) {
$children = $this->treeToList($item['children'], $prefix . $separator . $name);
foreach($children as $key => $child){
$ret[] = [
'id' => $child['id'],
'name' => $child['name']
];
}
}else{
$ret[] = [
'id' => $item['category_id'],
'name' => $prefix . $separator . $name
];
}
}
return $ret;
}
}

View File

@@ -0,0 +1,59 @@
<?php
class MiraviaCombination
{
public $sku = '';
public $ean_code = '';
public $price = 0;
public $special_price = 0;
public $quantity = 0;
public $images = [];
public $width = 0;
public $height = 0;
public $length = 0;
public $weight = 0;
public $variation = [];
public function addVariation($name, $value)
{
$this->variation[$name] = $value;
}
public function getData()
{
$combination = [];
$this->weight = round((float)$this->weight, 2);
foreach ($this as $key => $value){
if($key=='ean_code' && empty($value)){
continue;
}
if($key === 'images' && is_array($value) && !empty($value)){
$combination['Images'] = ['Image' => $value];
} else if($key !== 'images') {
$combination[$key] = $value;
}
}
return $combination;
}
public function getStockData()
{
$combination = [
'sku' => $this->sku,
'price' => $this->price,
'special_price' => $this->special_price,
'quantity' => $this->quantity >= 0 ? $this->quantity : 0
];
return $combination;
}
public function getOnlyStockData()
{
$combination = [
'sku' => $this->sku,
'quantity' => $this->quantity >= 0 ? $this->quantity : 0
];
return $combination;
}
}

View File

@@ -0,0 +1,243 @@
<?php
class MiraviaFeed
{
private $products = [];
public $miravia_feed_id = '';
public $debug = false;
public $default_width = 0;
public $default_height = 0;
public $default_length = 0;
public $default_weight = 0;
public function __construct()
{
//
}
public function setProducts($products)
{
foreach($products as $p) {
$this->products[$p->id] = $p;
}
}
public function addProduct(MiraviaProduct $product)
{
$this->products[$product->id] = $product;
}
public function getProducts()
{
return $this->products;
}
public function getProductsIds()
{
return array_keys($this->products);
}
public function getJsonCreate($offset = 0, $limit = 200)
{
$ret = [];
$prods = array_slice($this->products, $offset, $limit);
foreach ($prods as $p) {
if($p->created==0){
$this->setDefaultValues($p);
$ret[] = $p->getData();
}
}
if(empty($ret)){
return false;
}
$ret = [
'products' => $ret
];
$flags = $this->debug ? JSON_PRETTY_PRINT : 0;
return json_encode($ret, $flags);
}
public function getJsonUpdate($offset = 0, $limit = 200)
{
$ret = [];
$prods = array_slice($this->products, $offset, $limit);
foreach ($prods as $p) {
if($p->created==1 && strlen($p->id_miravia)>14){
$this->setDefaultValues($p);
$ret[] = $p->getData();
}
}
if(empty($ret)){
return false;
}
$ret = [
'products' => $ret
];
$flags = $this->debug ? JSON_PRETTY_PRINT : 0;
return json_encode($ret, $flags);
}
public function setDefaultValues(MiraviaProduct &$product)
{
if((float)$product->weight == 0) $product->weight = $this->default_weight;
if((int)$product->height == 0) $product->height = $this->default_height;
if((int)$product->width == 0) $product->width = $this->default_width;
if((int)$product->length == 0) $product->length = $this->default_length;
}
public function getJsonUpdateStock($onlyStock = false, $offset = 0, $limit = 200)
{
$ret = [];
$prods = array_slice($this->products, $offset, $limit);
foreach ($prods as $p) {
if(!empty($p->id_miravia)){
if($onlyStock) {
$ret[] = $p->getOnlyStockData();
}else{
$ret[] = $p->getStockData();
}
}
}
if(empty($ret)){
return false;
}
$ret = [
'products' => $ret
];
$flags = $this->debug ? JSON_PRETTY_PRINT : 0;
return json_encode($ret, $flags);
}
public function applyFilter($jsonFilter)
{
if(empty($jsonFilter)){
return false;
}
$filter = new MiraviaFilter($jsonFilter);
if($ids = $filter->parseRecords($this->products)){
return $ids;
}
return false;
}
public function removeProductsById($ids)
{
if(!is_array($ids)){
$ids = [$ids];
}
foreach ($ids as $id){
unset($this->products[$id]);
}
}
public function keepProductsById($ids)
{
if(!is_array($ids)){
$ids = [$ids];
}
$keys = array_keys($this->products);
$ids = array_diff($keys, $ids);
foreach ($ids as $id){
unset($this->products[$id]);
}
}
public function applyNumericFieldAction($ids, $fields, $action, $value)
{
$afields = explode(',',$fields);
foreach ($afields as $field){
foreach ($ids as $id){
if(isset($this->products[$id])){
switch ($action){
case 'increment':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} = (float)$this->products[$id]->{$field} + (float)$value;
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} += (float)$value;
}
break;
case 'decrement':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} -= (float)$value;
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} -= (float)$value;
}
break;
case 'increment_percent':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} += ((float)$this->products[$id]->{$field} * (float)$value / 100);
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} += ((float)$combi->{$field} * (float)$value / 100);
}
break;
case 'decrement_percent':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} -= ((float)$this->products[$id]->{$field} * (float)$value / 100);
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} -= ((float)$combi->{$field} * (float)$value / 100);
}
break;
case 'multiply':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} = ((float)$this->products[$id]->{$field} * (float)$value );
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} = ((float)$combi->{$field} * (float)$value );
}
break;
case 'set':
if($this->products[$id]->{$field}) {
$this->products[$id]->{$field} = (float)$value;
}
foreach($this->products[$id]->combinations as &$combi){
$combi->{$field} = (float)$value;
}
break;
}
}
}
}
}
public function applyTextFieldAction($ids, $field, $template)
{
foreach ($ids as $id) {
if (isset($this->products[$id])) {
$replaces = [
'name' => $this->products[$id]->name,
'description' => $this->products[$id]->description,
'short_description' => $this->products[$id]->short_description,
'manufacturer' => $this->products[$id]->getInfoValue('manufacturer'),
'supplier' => $this->products[$id]->getInfoValue('supplier'),
'category' => $this->products[$id]->getInfoValue('category'),
];
$this->products[$id]->{$field} = $template;
foreach($replaces as $search => $replace){
$this->products[$id]->{$field} = str_replace('%' . $search .'%', $replace, $this->products[$id]->{$field});
}
}
}
}
public function applyLogisticsAction($ids, $delivery, $warehouse)
{
foreach ($ids as $id) {
if (isset($this->products[$id])) {
$this->products[$id]->delivery = $delivery;
$this->products[$id]->warehouse = $warehouse;
}
}
}
public function getProductCount()
{
return sizeof($this->products);
}
}

View File

@@ -0,0 +1,134 @@
<?php
class MiraviaFilter
{
private $definition;
public function __construct($json)
{
$this->definition = json_decode($json, true);
}
/*
* Return a list of keys
*/
public function parseRecords($products)
{
if(!is_array($this->definition)){
return false;
}
$ret = [];
if(is_array($products)) {
foreach ($products as $key => $product) {
if ($this->parseGroup($this->definition, $product)) {
// condition is met
$ret[] = $product->id;
}else{
//$ret[] = "NO: " . $key;
}
}
}
return $ret;
}
private function parseGroup($condition, $product)
{
$final_result = false;
$rules_parsed = 0;
foreach ($condition as $rule){
$operator = $rule['logical_operator'];
if(!isset($rule['element_rule_id'])){
// group
$result = $this->parseGroup($rule, $product);
}else{
$result = $this->parseCondition($rule['condition'], $product);
}
if($rules_parsed==0){
$final_result = $result;
}else{
switch ($operator){
case 'OR':
$final_result = $final_result || $result;
break;
case 'AND':
$final_result = $final_result && $result;
break;
}
}
}
return $final_result;
}
private function parseCondition($condition, $product)
{
switch ($condition['field']){
case 'product_name':
$field = $product->name;
break;
case 'price':
$field = $product->price;
break;
case 'specific_price':
$field = $product->special_price;
break;
case 'stock':
$field = $product->quantity;
break;
case 'category':
$field = $product->info['id_category'];
break;
case 'supplier':
$field = $product->info['id_supplier'];
break;
case 'manufacturer':
$field = $product->info['id_manufacturer'];
break;
}
switch($condition['operator']){
case 'equal':
$value = $condition['filterValue'][0];
return $field==$value;
case 'not_equal':
$value = $condition['filterValue'][0];
return $field!=$value;
case 'less':
$value = $condition['filterValue'][0];
return $field<$value;
case 'less_or_equal':
$value = $condition['filterValue'][0];
return $field<=$value;
case 'greater':
$value = $condition['filterValue'][0];
return $field>$value;
case 'greater_or_equal':
$value = $condition['filterValue'][0];
return $field>=$value;
case 'begins_with':
$value = $condition['filterValue'][0];
return (substr($field, 0, strlen($value)) === $value);
case 'contains':
$value = $condition['filterValue'][0];
return (stripos($field, $value)!=false);
case 'ends_with':
$value = $condition['filterValue'][0];
return (substr($field, -1 * strlen($value)) === $value);
case 'not_begins_with':
$value = $condition['filterValue'][0];
return !(substr($field, 0, strlen($value)) === $value);
case 'not_contains':
$value = $condition['filterValue'][0];
return !(stripos($field, $value)!=false);
case 'not_ends_with':
$value = $condition['filterValue'][0];
return !(substr($field, -1 * strlen($value)) === $value);
case 'is_null':
case 'is_empty':
return empty($field);
case 'is_not_null':
case 'is_not_empty':
return !empty($field);
}
return false;
}
}

View File

@@ -0,0 +1,63 @@
<?php
class MiraviaLang
{
const ENGLISH = 'en';
const ARABIC = 'ar';
const GERMAN = 'de';
const SPANISH = 'es';
const FRENCH = 'fr';
const INDONESIAN = 'in';
const ITALIAN = 'it';
const HEBREW = 'iw';
const JAPANESE = 'ja';
const KOREAN = 'ko';
const DUTCH = 'nl';
const POLISH = 'pl';
const PORTUGUESE = 'pt';
const RUSSIAN = 'ru';
const THAI = 'th';
const TURKISH = 'tr';
const VIETNAMESE = 'vi';
public static $LanguagesISO = [
'ENGLISH' => 'en',
'ARABIC' => 'ar',
'GERMAN' => 'de',
'SPANISH' => 'es',
'FRENCH' => 'fr',
'INDONESIAN' => 'in',
'ITALIAN' => 'it',
'HEBREW' => 'iw',
'JAPANESE' => 'ja',
'KOREAN' => 'ko',
'DUTCH' => 'nl',
'POLISH' => 'pl',
'PORTUGUESE' => 'pt',
'RUSSIAN' => 'ru',
'THAI' => 'th',
'TURKISH' => 'tr',
'VIETNAMESE' => 'vi',
];
public static $Languages = [
'en' => 'en_US',
'ar' => 'ar_MA',
'de' => 'de_DE',
'es' => 'es_ES',
'fr' => 'fr_FR',
'in' => 'in_ID',
'it' => 'it_IT',
'iw' => 'iw_IL',
'ja' => 'ja_JP',
'ko' => 'ko_KR',
'nl' => 'nl_NL',
'pl' => 'pl_PL',
'pt' => 'pt_BR',
'ru' => 'ru_RU',
'th' => 'th_TH',
'tr' => 'tr_TR',
'vi' => 'vi_VN',
];
}

View File

@@ -0,0 +1,541 @@
<?php
class MiraviaLink
{
protected $api_url = 'https://miravia.wecomm.es';
protected $api_key = '';
public $last_error = '';
public $request_id = '';
public $insecure_mode = true;
public $sandbox_mode = false;
public function __construct($api_key = '')
{
$this->api_key = $api_key;
if( strpos($api_key, '_f6649cb881216ce050bd0e3') ){
$this->sandbox_mode = true;
$this->api_url = 'https://sandbox.miravia.wecomm.es';
}
}
public function getRegisterUrl($callback_url)
{
$url = $this->api_url . '/token';
$ret = $this->CallAPI($url, 'POST',
array('callback_url' => $callback_url));
if($ret === false){
return '';
}
$response = json_decode($ret, true);
if(!is_array($response)){
$last_error = $ret;
return '';
}
if(isset($response['error'])){
$this->last_error = $response['error'];
}
$url = isset($response['url']) ? $response['url'] : '';
$this->request_id = isset($response['request_id']) ? $response['request_id'] : '';
return $url;
}
public function getSellerInfo($notify_endpoint = '')
{
$url = $this->api_url . '/seller/info';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
//$this->last_error = print_r($resp,true);
return false;
}
// update data
$url = $this->api_url . '/seller/update';
if(!empty($notify_endpoint)){
$data = [ 'notification_url' => $notify_endpoint ];
}
$data = json_encode($data);
$ret = $this->CallAPI($url, 'POST', $data);
if(isset($resp['seller'])){
return $resp['seller'];
}
//$this->last_error = print_r($resp,true);
return false;
}
public function getWarehouses()
{
$url = $this->api_url . '/seller/warehouses';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
$this->last_error = print_r($resp,true);
return false;
}
if(isset($resp['module'])){
return $resp['module'];
}
return false;
}
public function getFeedResult($document)
{
$url = $this->api_url . '/feed/result/' . $document;
$ret = $this->CallAPI($url);
return $ret;
}
public function createProduct($json_product)
{
$url = $this->api_url . '/product/create';
$ret = $this->CallAPI($url, 'POST', $json_product);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else if(!$resp['success']){
$this->last_error = $resp['message'];
if(isset($resp['detail'])){
foreach ($resp['detail'] as $det){
$this->last_error .= "\r" . $det['field'] . ': ' . $det['message'];
}
}
}
return $resp;
}
public function updateProduct($miravia_id, $json_product)
{
$url = $this->api_url . '/product/' . $miravia_id . '/update';
$ret = $this->CallAPI($url, 'POST', $json_product);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else if(!$resp['success']){
$this->last_error = $resp['message'];
if(isset($resp['detail'])){
foreach ($resp['detail'] as $det){
$this->last_error .= "\r" . $det['field'] . ': ' . $det['message'];
}
}
}
return $resp;
}
public function getProductList($page = 1, $pagesize = 50)
{
$url = $this->api_url . '/product/list?pagesize=' . $pagesize . '&page=' . $page;
$ret = $this->CallAPI($url);
return json_decode($ret, true);
}
public function getProductBySku($sku)
{
$url = $this->api_url . '/product/' . $sku . '/find';
$ret = $this->CallAPI($url);
return json_decode($ret);
}
public function getProductById($id)
{
$url = $this->api_url . '/product/' . $id . '/get';
$ret = $this->CallAPI($url);
return json_decode($ret);
}
public function updateStock($json_stock, $use_feed = false)
{
if($use_feed){
$url = $this->api_url . '/feed/stock';
}else{
$url = $this->api_url . '/product/update_stock';
}
$ret = $this->CallAPI($url, 'POST', $json_stock);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else if(!$resp['success']){
$this->last_error = $resp['message'];
if(isset($resp['detail'])){
foreach ($resp['detail'] as $det){
$this->last_error .= "\r" . $det['field'] . ': ' . $det['message'];
}
}
}
return $resp;
}
public function disableProducts($itemids)
{
if(!is_array($itemids)){
$itemids = [$itemids];
}
$itemids = json_encode([
'item_ids' => $itemids
]);
$url = $this->api_url . '/product/disable';
$ret = $this->CallAPI($url, 'POST', $itemids);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else {
return (bool) $resp['success'];
}
}
public function enableProducts($itemids)
{
if(!is_array($itemids)){
$itemids = [$itemids];
}
$itemids = json_encode([
'item_ids' => $itemids
]);
$url = $this->api_url . '/product/enable';
$ret = $this->CallAPI($url, 'POST', $itemids);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else {
return (bool) $resp['success'];
}
}
public function deleteProduct($itemid)
{
$url = $this->api_url . '/product/' . $itemid . '/delete';
$ret = $this->CallAPI($url, 'GET');
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else {
return (bool) $resp['success'];
}
}
public function getFeeds()
{
$url = $this->api_url . '/feed/list';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
if(isset($resp['feeds'])){
return $resp['feeds'];
}
//$this->last_error = print_r($resp,true);
return false;
}
public function getFeedInfo($id)
{
$url = $this->api_url . '/feed/' . $id . '/get' ;
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(isset($resp['feed_result'])) {
$response = [];
if(isset($resp['response'])) {
$response = $resp['response'];
}
$resp = $resp['feed_result'];
$resp['response'] = $response;
}else{
if(isset($resp['code'])){
$this->last_error = $resp['code'] . ': ' .
@$resp['message'] ?: '';
}
}
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function cancelFeed($id)
{
$url = $this->api_url . '/feed/' . $id . '/cancel' ;
$ret = $this->CallAPI($url, 'POST');
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(isset($resp['feed_result'])) {
$resp = $resp['feed_result'];
}
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function sendFeed($data, $type = 'create')
{
$url = $this->api_url . '/feed/' . $type;
$ret = $this->CallAPI($url, 'POST', $data);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success'])){
return false;
}else if(!$resp['success']){
// $this->last_error = $resp['message'];
if(isset($resp['detail'])){
foreach ($resp['detail'] as $det){
$this->last_error .= "\r" . $det['field'] . ': ' . $det['message'];
}
}
}
return $resp;
}
/*
* $fromDate format: YYYY-MM-DD ('Y-m-d')
*/
public function getOrders(string $fromDate)
{
if($d = date_parse_from_format('Y-m-d', $fromDate)){
$fromDate = date('Y-m-d', mktime(0, 0, 0, $d['month'], $d['day'], $d['year']));
}else{
$this->last_error= 'Invalid date';
return false;
}
$url = $this->api_url . '/order/list';
$url .= '?from_date=' . $fromDate;
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function getOrder($order_number)
{
$url = $this->api_url . '/order/' . $order_number . '/get';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function orderConfirmation($order_number, $status)
{
$url = $this->api_url . '/order/confirmation/' . $order_number . '/' . $status;
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function orderPack($id_order, $products)
{
$url = $this->api_url . '/order/' . $id_order . '/pack';
if(is_array($products)){
$data = json_encode($products);
}else{
$data = $products;
}
$ret = $this->CallAPI($url , 'POST', $data);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function getShippingLabel($package_id)
{
$url = $this->api_url . '/order/label/' . $package_id;
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function getDBSCarriers()
{
$url = $this->api_url . '/order/dbs/providers';
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(isset($resp['result'])){
$resp = $resp['result'];
}
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return $resp;
}
public function setDBSTracking($packages, $tracking, $provider)
{
if(!is_array($packages)){
$packages = [$packages];
}
$payload = [];
foreach ($packages as $package){
$payload['packages'][] = [
'package_id' => $package,
'tracking_number' => $tracking,
'shipment_provider_code' => $provider
];
}
$url = $this->api_url . '/order/dbs/update_tracking';
$data = json_encode($payload);
$ret = $this->CallAPI($url, 'POST', $data);
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
$this->last_error = $ret;
return false;
}
return true;
}
public function subscribe($seconds, $message='')
{
$url = $this->api_url . '/seller/notify/' . (int)$seconds;
if(!empty($message)){
$url .= '?message=' . urlencode($message);
}
$ret = $this->CallAPI($url);
if($ret === false){
return false;
}
$resp = json_decode($ret, true);
if(!isset($resp['success']) || !$resp['success']){
return false;
}
return true;
}
public function purgeImageCache()
{
$url = $this->api_url . '/image/cache/purge';
$ret = $this->CallAPI($url);
return json_decode($ret, true);
}
protected function CallAPI($url, $method='GET', $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if($this->insecure_mode) {
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
}
if(!empty($this->api_key)){
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Api-Token: ' . $this->api_key
));
}
$result = curl_exec($curl);
if($result === false){
$this->last_error = curl_error($curl);
}
curl_close($curl);
return $result;
}
}

View File

@@ -0,0 +1,186 @@
<?php
class MiraviaProduct
{
public $id = 0;
public $id_miravia = '';
public $miravia_status = '';
public $created = 0;
public $sku = '';
public $reference_sku = '';
public $lang = 'es-ES'; // ISO lang code
public $name = '';
public $short_description = '';
public $description = '';
public $brand = 'no brand';
public $model = '';
public $ean_code = '';
public $warranty = '';
public $id_category = '';
public $id_brand = '';
public $images = []; // Public URLs
public $video = '';
public $price = 0;
public $special_price = 0;
public $quantity = 0;
public $width = 0;
public $height = 0;
public $length = 0;
public $weight = 0;
public $warehouse = '';
public $delivery = '';
public $extra_attributes = []; // [ "id_attribute" => "value", ... ]
public $combinations = []; // Array of MiraviaCombination class
public $info = []; // Internal info (for filters)
protected $private_vars = ['private_vars', 'error', 'id', 'combinations', 'info'];
public $error = '';
public function __construct()
{
//
}
public function addAttr($key = false, $value = false) {
if($key and $value) {
$this->extra_attributes[$key] = $value;
}
}
public function getData()
{
$product = [];
foreach ($this as $key => $value){
if(!in_array($key, $this->private_vars)){
if($key === 'images' && is_array($value) && !empty($value)){
$product['Images'] = ['Image' => $value];
} else if($key !== 'images') {
$product[$key] = $value;
}
}
}
$combinations = $this->getCombinations();
$product['combinations'] = $combinations;
return $product;
}
public function getStockData()
{
$combis = [];
foreach ($this->combinations as $combination){
$combis[] = $combination->getStockData();
}
if(count($combis)==0){
$combis =[[
'sku' => $this->sku,
'price' => $this->price,
'special_price' => $this->special_price,
'quantity' => $this->quantity >= 0 ? $this->quantity : 0
]];
$this->reference_sku = $this->sku;
}
$ret = [
'id' => $this->id,
'id_miravia' => $this->id_miravia,
'sku' => $this->sku,
'combinations' => $combis
];
if(!empty($this->warehouse)){
$ret['warehouse'] = $this->warehouse;
}
return $ret;
}
public function getOnlyStockData()
{
$combis = [];
foreach ($this->combinations as $combination){
$combis[] = $combination->getOnlyStockData();
}
if(count($combis)==0){
$combis =[[
'sku' => $this->sku,
'quantity' => $this->quantity >= 0 ? $this->quantity : 0
]];
$this->reference_sku = $this->sku;
}
$ret = [
'id' => $this->id,
'id_miravia' => $this->id_miravia,
'sku' => $this->sku,
'combinations' => $combis
];
if(!empty($this->warehouse)){
$ret['warehouse'] = $this->warehouse;
}
return $ret;
}
public function getJSON($pretty = false)
{
$flags = $pretty ? JSON_PRETTY_PRINT : 0;
return json_encode($this->getData(), $flags);
}
public function getCombinations()
{
$ret = [];
foreach ($this->combinations as $combination){
$ret[] = $combination->getData();
}
return $ret;
}
public function createProduct($apiKey)
{
if(!empty($this->id_miravia)){
return $this->updateProduct($apiKey);
}
$jreq = json_encode($this->getData());
$link = new MiraviaLink($apiKey);
$ret = $link->createProduct($jreq);
if($ret == false) {
$this->error = $link->last_error;
}
if(isset($ret['data'])){
if(isset($ret['data']['item_id'])){
$this->id_miravia = $ret['data']['item_id'];
}
}
return true;
}
public function updateProduct($apiKey)
{
if(empty($this->id_miravia)){
$this->error = 'Invalid Miravia Id Product';
return false;
}
$jreq = json_encode($this->getData());
$link = new MiraviaLink($apiKey);
$ret = $link->updateProduct($this->id_miravia, $jreq);
if($ret == false) {
$this->error = $link->last_error;
}
if(isset($ret['data'])){
if(isset($ret['data']['item_id'])){
$this->id_miravia = $ret['data']['item_id'];
}
return true;
}
if(isset($ret['message'])){
$this->error = $ret['message'];
}
return false;
}
public function getInfoValue($field)
{
if(isset($this->info[$field])){
return $this->info[$field];
}
return '';
}
}

View File

@@ -0,0 +1,173 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
// WP_List_Table is not loaded automatically so we need to load it in our application
if( ! class_exists( 'WP_List_Table' ) ) {
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}
/**
* Create a new table class that will extend the WP_List_Table
*/
class MiraviaTable extends WP_List_Table
{
/**
* Prepare the items for the table to process
*
* @return Void
*/
public $data_table = array();
public $total_elements = 0;
public $perPage = 10;
public $columns = [];
public $custom_actions = [];
public $sortable_custom_columns = [];
public $default_column_name = 'name';
function extra_tablenav( $which ) {
// if ( $which == "top" ){
// echo '<h2>Letter Templates <a href="admin.php?page=letter-template&type=new">Add New</a></h2>';
// }
}
public function prepare_items()
{
$hidden = $this->get_hidden_columns();
$sortable = $this->get_sortable_columns();
$data = $this->table_data();
usort( $data, array( &$this, 'sort_data' ) );
$perPage = $this->perPage;
$currentPage = $this->get_pagenum();
$totalItems = $this->total_elements;
$this->set_pagination_args( array(
'total_items' => $totalItems,
'per_page' => $perPage
) );
$data = array_slice($data,(($currentPage-1)*$perPage),$perPage);
$this->_column_headers = array($this->columns, $hidden, $sortable);
$this->items = $data;
}
/**
* Override the parent columns method. Defines the columns to use in your listing table
*
* @return Array
*/
public function get_columns()
{
return $this->columns;
}
/**
* Define which columns are hidden
*
* @return Array
*/
public function get_hidden_columns()
{
return array();
}
/**
* Define the sortable columns
*
* @return Array
*/
public function get_sortable_columns()
{
$sortable = array();
// if($this->total_elements and count($this->data_table) > 0) {
// foreach($this->data_table[0] as $k => $v) {
// $sortable[$k] = array($k, false);
// }
// }
return $this->sortable_custom_columns;
}
/**
* Get the table data
*
* @return Array
*/
private function table_data()
{
return $this->data_table;
}
/**
* Define what data to show on each column of the table
*
* @param Array $item Data
* @param String $column_name - Current column name
*
* @return Mixed
*/
public function column_default( $item, $column_name )
{
return $item[ $column_name ];
}
public function column_name($item){
$item_json = json_decode(json_encode($item), true);
$copy = $this->custom_actions;
foreach($this->custom_actions as $k => $action) {
foreach($item_json as $key => $d) {
$action = str_replace("[".$key."]", $item_json[$key], $action);
}
$this->custom_actions[$k] = $action;
}
$result = sprintf('%s %s', $item_json[$this->default_column_name], $this->row_actions($this->custom_actions));
$this->custom_actions = $copy;
return $result;
}
/**
* Allows you to sort the data by the variables set in the $_GET
*
* @return Mixed
*/
private function sort_data( $a, $b )
{
// Set defaults
$orderby = 'title';
$order = 'asc';
// If orderby is set, use this as the sort column
if(!empty($_GET['orderby']))
{
$orderby = sanitize_text_field($_GET['orderby']);
}
// If order is set use this as the order
if(!empty($_GET['order']))
{
$order = sanitize_text_field($_GET['order']);
}
$result = '';
if(isset($a[$orderby])) {
$result = strcmp( $a[$orderby], $b[$orderby] );
}
if($order === 'asc')
{
return $result;
}
return -$result;
}
}

View File

@@ -0,0 +1,357 @@
<?php
/**
* Plugin Name: Connector for Miravia
* Description: Upload your products and download orders from Miravia
* Version: 1.0.0
* Author: WeComm Solutions
* Author URI: https://wecomm.es
* Plugin URI: https://wecomm.es/miravia-woocommerce
* Text Domain: miraviawoo
* WC requires at least: 3.0
* WC tested up to: 7.7.2
* Required WP: 5.0
* Tested WP: 6.3
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }
define('MIRAVIA_CLASSES_PATH', plugin_dir_path( __FILE__ ) . 'classes/');
define('MIRAVIA_SHARED_CLASSES_PATH', MIRAVIA_CLASSES_PATH . 'shared/');
define('MIRAVIA_VIEWS_PATH', plugin_dir_path( __FILE__ ) . 'views/');
define('MIRAVIA_ASSETS_PATH', plugin_dir_path( __FILE__ ) . 'assets/');
define('MIRAVIA_WOO_VERSION', '1.0.0');
define('MIRAVIA_BUILD_VERSION', '14');
define('MIRAVIA_DB_VERSION', 101);
define('MIRAVIA_DEBUG', get_option('miravia_debug_mode', '0'));
define('LOG_FOLDER', plugin_dir_path( __FILE__ ));
$isSetter = false;
require_once(MIRAVIA_CLASSES_PATH . 'class.log.php'); //Log CLASS
require_once(MIRAVIA_CLASSES_PATH . 'class.core.php'); //Core CLASS
require_once(MIRAVIA_CLASSES_PATH . 'class.db.php'); //DB CLASS
//require_once(MIRAVIA_CLASSES_PATH . 'class.miravia.base.php'); //BASE SDK
require_once(MIRAVIA_CLASSES_PATH . 'class.categories.php'); //ORDER CLASS
require_once(MIRAVIA_CLASSES_PATH . 'class.product.php'); //PRODUCT CLASS
require_once(MIRAVIA_CLASSES_PATH . 'class.order.php'); //ORDER CLASS
require_once(MIRAVIA_CLASSES_PATH . 'tables/class.table.php'); //TABLE CLASS
require_once(MIRAVIA_CLASSES_PATH . 'class.api.php'); //API CLASS
//Wecomm Server
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaFilter.php');
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaFeed.php');
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaLink.php');
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaCategory.php');
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaCombination.php');
require_once(MIRAVIA_SHARED_CLASSES_PATH . 'MiraviaProduct.php');
if(is_admin()) {
$iconUrl = plugins_url('/assets/img/icon.png', __FILE__);
}
if( !class_exists('MiraviaWOO') ) {
class MiraviaWOO {
function __construct(){
//Menu
add_action('admin_menu', array(&$this, 'admin_menu'));
add_action('admin_init', array(&$this, 'admin_init'));
add_action( 'admin_enqueue_scripts', array(&$this, 'load_style') );
add_action( 'manage_product_posts_custom_column' , array(&$this, 'colum_product'), 10, 2 );
add_filter( 'manage_product_posts_columns' , array(&$this, 'add_colum_products') );
// register_activation_hook( __FILE__, array('MIRAVIADB', 'install_db') );
add_action( 'plugins_loaded', array('MIRAVIADB', 'install') );
//Actions Table
add_filter( 'miravia_profiles_row_actions', array( &$this, 'miravia_profiles_actions' ), 10, 2 );
add_action( 'add_meta_boxes', array($this, 'create_miravia_order_metabox') );
register_deactivation_hook(
__FILE__,
array($this, 'miravia_desactivation')
);
add_action( 'manage_shop_order_posts_custom_column' , array($this, 'colum_orders'), 10, 2 );
add_action( 'woocommerce_update_product', array($this, 'miravia_update_product'), 10, 1 );
add_action('woocommerce_variation_set_stock', array($this, 'miravia_update_product'), 10, 1);
add_action('woocommerce_product_set_stock', array($this, 'miravia_update_product'), 10, 1);
add_action('woocommerce_variation_set_stock_status', array($this, 'miravia_update_product'), 10, 1);
add_action('woocommerce_product_set_stock_status', array($this, 'miravia_update_product'), 10, 1);
add_action( 'woocommerce_save_product_variation', array($this, 'miravia_update_product'), 10, 1 );
add_action( 'woocommerce_product_options_general_product_data', array($this, 'miravia_product_metabox') );
add_action( 'woocommerce_process_product_meta', array($this, 'miravia_save_metadata_product') );
add_action( 'woocommerce_variation_set_stock', array($this, 'miravia_change_stock_hook'), 15, 1);
add_action( 'woocommerce_product_set_stock', array($this, 'miravia_change_stock_hook'), 15, 1);
}
function miravia_change_stock_hook($product) {
if(get_option('miravia_only_stock', '0') == '1') {
LOG::add("Cambio de stock para el producto {$product}");
$profile = MiraviaCore::get_profile_by_product($product->sku);
$accounts = MiraviaCore::accounts_by_profile($profile);
if(count($accounts) > 0) {
MiraviaCore::request_notify($accounts[0]['token'], 'update_stock');
}
}
return true;
}
function miravia_save_metadata_product( $id ){
if(isset($_POST['miravia_brand_product'])) {
$product = wc_get_product( $id );
$product->update_meta_data( '_miravia_brand_product', sanitize_text_field( $_POST[ 'miravia_brand_product' ] ) );
$product->update_meta_data( '_miravia_unit', sanitize_text_field( $_POST[ 'miravia_unit' ] ) );
$product->update_meta_data( '_miravia_unit_value', sanitize_text_field( $_POST[ 'miravia_unit_value' ] ) );
$product->save_meta_data();
}
}
function miravia_product_metabox() {
require_once(MIRAVIA_VIEWS_PATH . "/metabox/miravia-product.php");
}
function colum_orders( $column, $post_id ) {
if ($column == 'order_status'){
$orderID = get_post_meta($post_id, '_miravia_order_id', true);
if($orderID != '' and $orderID != 0) {
echo '<span class="created_via">'.sprintf(__('Created Vía %s','aliexpress'), 'Miravia').'</span>';
}
}
}
function miravia_update_product( $product_id ) {
if(get_option('miravia_only_stock', '0') == '1') {
return;
}
global $isSetter;
if($product_id instanceof WC_Product) {
$product_id = $product_id->ID;
}elseif(isset($product_id['id'])) {
$product_id = $product_id['id'];
}
if(get_post_meta($product_id, '_miravia_need_update', true) == '1') {
LOG::add("{$product_id} no necesita notificación, ya programada.");
return;
}
LOG::add("Estableciendo notificación para el producto {$product_id}");
update_post_meta($product_id, '_miravia_need_update', '1');
if($isSetter) {
LOG::add("No es necesario establecer aviso");
return;
}
if($product_id) {
$sync = MiraviaCore::get_product_miravia($product_id);
if($sync) {
//ESTABLECER NOTIFICACIÓN
$apiKey = MiraviaCore::get_miravia_account_default();
$resultNotify = MiraviaCore::request_notify($apiKey['token'], 'update_stock');
if($resultNotify === -1) {
LOG::add("Existe una notificación pendiente");
return;
}
if($resultNotify) {
LOG::add("Seteada notificación correctamente");
$isSetter = true;
}
}
}
}
function miravia_desactivation() {
update_option('miravia_db_version', 0);
}
public function miravia_profiles_actions( $actions, $post ) {
if ( current_user_can( 'edit_posts' ) ) {
$actions['miravia'] = '<a href="'.admin_url('admin.php?page=miravia_settings&subpage=edit_profile&nonce=' . wp_create_nonce( 'miravia_edit_profile_' . $post->ID )) . '" rel="permalink">' . __('Edit') . '</a>';
}
return $actions;
}
function colum_product($column, $post_id){
if($column == 'miravia_data') {
$html = '<div class="miravia_controls" data-id="'.$post_id.'">';
$sync = MiraviaCore::get_product_miravia($post_id);
$dateUpdated = 'ND';
if($sync and count($sync) > 0) {
if($sync[0]['last_updated'] == '0000-00-00 00:00:0') {
$dateUpdated = date('d-m-Y H:i:s', strtotime($sync[0]['last_updated']));
}
//MiraviaCore::debug($sync);
if(count($sync) > 1) {
$html .= __('Uploaded with multiple accounts','miraviawoo');
}else{
if($sync[0]['id_miravia'] != '' and $sync[0]['id_miravia'] != 0) {
$html .= "<a class='button viewProduct' data-id='{$sync[0]['id_miravia']}'>View</a><span class='minidate'><br>".__('Last Update:','miraviawoo')." ".$dateUpdated."</span>";
$html .= "<p>Status: {$sync[0]['status_text']}</p>";
}
}
if(trim($sync[0]['lastError']) != '') {
$html .= '<i class="fa fa-info" style="border-radius:100px;padding:5px;background-color:#CCC;margin-left:5px" title="'.$sync[0]['lastError'].'"></i>';
}
}else{
}
$html .= '</div>';
echo wp_kses($html, array(
'a' => array(
'href' => array(),
'class' => array(),
'data-id' => array(),
),
'span' => array(
'class' => array()
),
'i' => array('class' => array(),),
'p' => array()
));
}
}
function add_colum_products( $columns ) {
return array_merge( $columns,
array( 'miravia_data' => __( 'Miravia', 'miraviawoo' ) ) );
}
function load_style() {
if(is_admin()) {
wp_enqueue_style( 'cssmiravia', plugins_url('assets/css/miravia-admin.css?v='.time(), __FILE__) );
wp_enqueue_script( 'productmiravia', plugins_url('assets/js/products.js?v='.time(), __FILE__), array( 'wp-i18n' ) );
wp_localize_script( 'productmiravia', 'MIRAVIA_DATA_JAVASCRIPT', array(
'adminAjaxURL' => admin_url('admin-ajax.php'),
));
wp_enqueue_script( 'jquery-ui-core', false, array('jquery') );
wp_enqueue_script('jquery');
wp_enqueue_script( 'filter_rules_plugin_miravia_localization', plugins_url('lib/filter_rules/localization/es.min.js', __FILE__));
wp_enqueue_script( 'filter_rules_plugin_miravia', plugins_url('lib/filter_rules/jquery.jui_filter_rules.min.js', __FILE__),array('jquery'));
wp_enqueue_script( 'filter_rules_miravia', plugins_url('lib/filter_rules_miravia.js?v='.time(), __FILE__), array('jquery'));
wp_enqueue_style( 'fontawesome_miravia_css', plugins_url('lib/fontawesome-6.1.2.all.min.css', __FILE__) );
if(isset($_GET['page']) and sanitize_text_field($_GET['page']) == 'miravia_settings') {
wp_enqueue_script( 'sweetalert_lib', plugins_url('lib/sweetalert2.min.js', __FILE__) );
wp_enqueue_script( 'select2_lib', plugins_url('lib/select2.min.js', __FILE__) );
wp_enqueue_style( 'select2_css', plugins_url('lib/select2.min.css', __FILE__) );
}
wp_enqueue_style( 'filter_rules_css', plugins_url('lib/filter_rules/jquery.jui_filter_rules.bs.min.css', __FILE__) );
wp_enqueue_script( 'fontawesome_miravia_js', plugins_url('lib/fontawesome-6.1.2.all.min.js', __FILE__) );
}
}
function admin_menu() {
global $iconUrl;
add_menu_page(
esc_html__( 'Miravia', 'miraviawoo' ),
esc_html__( 'Miravia', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings',
array($this, 'settings_page'),
$iconUrl,
55.5
);
// add_submenu_page(
// 'miravia_settings',
// esc_html__( 'Brands', 'miraviawoo' ),
// esc_html__( 'Brands', 'miraviawoo'),
// 'manage_woocommerce',
// 'miravia_settings&subpage=brands',
// array($this, 'settings_page'),
// 10
// );
add_submenu_page(
'miravia_settings',
esc_html__( 'Orders', 'miraviawoo' ),
esc_html__( 'Orders', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=orders',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Jobs', 'miraviawoo' ),
esc_html__( 'Jobs', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=jobs',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Accounts', 'miraviawoo' ),
esc_html__( 'Accounts', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=accounts',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Profiles', 'miraviawoo' ),
esc_html__( 'Profiles', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=profiles',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Products', 'miraviawoo' ),
esc_html__( 'Products', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=products',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Miravia Products', 'miraviawoo' ),
esc_html__( 'Miravia Products', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=products_remote',
array($this, 'settings_page'),
10
);
add_submenu_page(
'miravia_settings',
esc_html__( 'Rules', 'miraviawoo' ),
esc_html__( 'Rules', 'miraviawoo'),
'manage_woocommerce',
'miravia_settings&subpage=rules',
array($this, 'settings_page'),
10
);
}
function create_miravia_order_metabox() {
global $post;
if(get_post_meta($post->ID, '_miravia_order_id', true)){
add_meta_box( 'aew_number_shipping_metabox', __('Miravia Tracker','miraviawoo'), array($this, 'content_metabox_miravia_order'), 'shop_order', 'normal', 'high' );
}
}
function content_metabox_miravia_order($post) {
require_once(MIRAVIA_VIEWS_PATH . '/metabox/miravia-order.php');
}
public function settings_page() {
include MIRAVIA_VIEWS_PATH . 'settings.php';
}
public function brands_page() {
include MIRAVIA_VIEWS_PATH . 'brands.php';
}
function admin_init() {
}
}
}
$MIRAVIAWOO = new MIRAVIAWOO();

View File

@@ -0,0 +1,181 @@
/*
* jui_filter_rules v1.0.7 CSS (for Bootstrap) *********************************
*/
/*
DO NOT CHANGE this file, as it will be overwritten in next update.
Write your own classes in other css file.
*/
/* container ---------------------------------------------------------------- */
.filter_rules_container {
padding: 10px 0;
}
/* rules group -------------------------------------------------------------- */
.rules_group_container {
padding: 0;
margin: 0;
}
.rules_group_header {
padding: 5px 0;
}
.rules_group_body {
padding: 0;
margin: 0;
}
.rules_group_condition_container {
display: inline-block;
padding: 0;
}
.rules_group_condition_list {
border: 1px solid;
}
.rules_group_tools_container {
display: inline-block;
padding: 0;
margin-left: 5px;
}
.rules_group_tools_list {
border: 1px solid;
padding: 2px;
margin: 0;
width: 35px;
}
/* rules list --------------------------------------------------------------- */
.rules_list {
width: auto !important;
list-style-type: none;
padding: 0 0 0 25px;
border-left: dotted 1px !important;
border-right: none !important;
border-top: none !important;
border-bottom: none !important;
}
.rules_list_li {
margin: 0 0 2px 0 !important;
padding: 0 !important;
display: block !important;
}
.rules_list_applied_li {
}
.rules_list_error_li {
background-color: #df0202 !important;
}
/* filter name -------------------------------------------------------------- */
.filter_container {
display: inline-block;
padding: 5px 5px 5px 0;
vertical-align: top;
}
.filter_list {
}
/* operator ----------------------------------------------------------------- */
.operators_list_container {
display: inline-block;
padding: 5px;
vertical-align: top;
}
.operators_list {
}
/* filter value ------------------------------------------------------------- */
.filter_value_container {
display: inline-block;
padding: 5px;
}
.filter_input_text {
}
.filter_input_number {
width: 80px;
}
.filter_input_date {
}
.filter_input_checkbox {
margin: 0 5px 0 0;
display: inline !important;
}
.filter_input_radio {
margin: 0 5px 0 0;
}
.filter_select {
margin: 0 5px;
}
.filter_group_list {
list-style-type: none;
padding: 0;
}
.filter_group_list_item_horizontal {
display: inline !important;
margin: 0 5px;
padding: 0;
}
.filter_group_list_item_vertical {
display: block !important;
margin: 0 0 5px 5px !important;
padding: 0 !important;
}
/* filter tools ------------------------------------------------------------- */
.rule_tools_container {
display: inline-block !important;
padding: 5px !important;
vertical-align: top !important;
}
.rule_tools_list {
padding: 0;
margin: 0;
width: 35px;
}
/* no filters div ----------------------------------------------------------- */
.no_filters_found{
text-align: center;
margin-top: 10px;
margin-left: auto;
margin-right: auto;
}
/* IE8 CSS hack ------------------------------------------------------------- */
/* http://dimox.net/personal-css-hacks-for-ie6-ie7-ie8/ */
@media \0screen {
.rules_group_tools_list {
border: 1px solid;
padding: 2px;
margin: 0;
width: auto;
}
.rule_tools_list {
padding: 0;
margin: 0;
width: auto;
}
}
/* -------------------------------------------------------------------------- */

View File

@@ -0,0 +1,5 @@
/*
* jui_filter_rules v1.0.7 CSS *************************************************
* Minified using http://gpbmike.github.io/refresh-sf/
*/
.filter_rules_container{padding:5px 10px 10px}.rules_group_container{padding:0;margin:0}.rules_group_header{padding:5px 0}.rules_group_body{padding:0;margin:0}.rules_group_condition_container{display:inline-block;padding:0}.rules_group_condition_list{border:1px solid;padding:2px 0;margin:0}.rules_group_tools_container{display:inline-block;padding:0;margin-left:5px}.rules_group_tools_list{border:1px solid;padding:2px;margin:0;width:35px}.rules_list{width:auto!important;list-style-type:none;padding:0 0 0 25px;border-left:dotted 1px!important;border-right:none!important;border-top:none!important;border-bottom:none!important}.rules_list_li{margin:0 0 2px!important;padding:0!important;background-color:#f3f3f3!important;display:block!important}.rules_list_applied_li{background-color:#CF9!important}.rules_list_error_li{background-color:#df0202!important}.filter_container{display:inline-block;padding:5px 5px 5px 0;vertical-align:top}.filter_list{padding:0;margin:0;background:0 0}.operators_list_container{display:inline-block;padding:5px;width:180px;vertical-align:top}.operators_list{padding:0;margin:0;background:0 0}.filter_value_container{display:inline-block;padding:5px}.filter_input_text{width:180px;margin:0 5px;padding:0}.filter_input_number{width:75px;margin:0 5px;padding:0}.filter_input_date{width:150px;margin:0 5px;padding:0}.filter_input_checkbox,.filter_input_radio{margin:0 5px 0 0}.filter_select{margin:0 5px}.filter_group_list{list-style-type:none;padding:0}.filter_group_list_item_horizontal{display:inline!important;margin:0 5px;padding:0}.filter_group_list_item_vertical{display:block!important;margin:0 0 5px 5px!important;padding:0!important}.rule_tools_container{display:inline-block!important;padding:5px!important;float:right!important;vertical-align:top!important}.rule_tools_list{padding:0;margin:0;width:35px}.no_filters_found{text-align:center;margin-top:10px;margin-left:auto;margin-right:auto}@media \0screen{.rules_group_tools_list{border:1px solid;padding:2px;margin:0;width:auto}.rule_tools_list{padding:0;margin:0;width:auto}}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,4 @@
/**
* jui_filter_rules v1.0.7 simple localization - GREEK *************************
*/
var rsc_jui_fr={no_filters_found:"Δεν έχουν ορισθεί φίλτρα",rules_group_AND:"σε ίσχύ όλα",rules_group_OR:"σε ίσχύ ένα τουλάχιστον",rule:"κριτήριο",group:"ομάδα",tools_please_select:"&raquo;",rule_insert_before:"εισαγωγή πριν",rule_insert_after:"εισαγωγή μετά",rule_insert_inside:"εισαγωγή εντός",rule_clear:"καθαρισμός",rule_delete:"διαγραφή",group_insert_before:"εισαγωγή πριν",group_insert_after:"εισαγωγή μετά",group_insert_inside:"εισαγωγή εντός",group_delete:"διαγραφή",filter_please_select:"&raquo; επιλογή",operator_equal:"ισούται",operator_not_equal:"δεν ισούται",operator_in:"περιλαμβάνεται σε",operator_not_in:"δεν περιλαμβάνεται σε",operator_less:"μικρότερο",operator_less_or_equal:"μικρότερο είτε ίσο",operator_greater:"μεγαλύτερο",operator_greater_or_equal:"μεγαλύτερο είτε ίσο",operator_between:"ανάμεσα",operator_not_between:"όχι ανάμεσα",operator_begins_with:"ξεκινά με",operator_not_begins_with:"δεν ξεκινά με",operator_contains:"περιέχει",operator_not_contains:"δεν περιέχει",operator_ends_with:"καταλήγει σε",operator_not_ends_with:"δεν καταλήγει σε",operator_is_empty:"είναι κενό",operator_is_not_empty:"δεν είναι κενό",operator_is_null:"δεν έχει δοθεί",operator_is_not_null:"έχει δοθεί",error_no_value_given:"Δεν δόθηκε τιμή",error_invalid_number:"Η τιμή δεν είναι αριθμός",error_invalid_datetime:"Η ημερομηνία δεν είναι σωστή",error_converting_value:"Λάθος κατά τη μετατροπή της τιμής που δόθηκε"};

View File

@@ -0,0 +1,4 @@
/**
* jui_filter_rules v1.0.7 simple localization - ENGLISH ***********************
*/
var rsc_jui_fr={no_filters_found:"No filters defined",rules_group_AND:"all rules",rules_group_OR:"any rule",rule:"rule",group:"group",tools_please_select:"&raquo;",rule_insert_before:"insert before",rule_insert_after:"insert after",rule_insert_inside:"insert inside",rule_clear:"clear",rule_delete:"delete",group_insert_before:"insert before",group_insert_after:"insert after",group_insert_inside:"insert inside",group_delete:"delete",filter_please_select:"&raquo; select",operator_equal:"equal",operator_not_equal:"not_equal",operator_in:"in",operator_not_in:"not in",operator_less:"less",operator_less_or_equal:"less or equal",operator_greater:"greater",operator_greater_or_equal:"greater or equal",operator_between:"between",operator_not_between:"not between",operator_begins_with:"begins with",operator_not_begins_with:"does not begin with",operator_contains:"contains",operator_not_contains:"does not contain",operator_ends_with:"ends with",operator_not_ends_with:"does not end with",operator_is_empty:"is empty",operator_is_not_empty:"is not empty",operator_is_null:"is null",operator_is_not_null:"is not null",error_no_value_given:"Value not given",error_invalid_number:"Value is not numeric",error_invalid_datetime:"Invalid date format",error_converting_value:"Error converting value"};

View File

@@ -0,0 +1,55 @@
/**
* jui_filter_rules v1.0.7 simple localization - ENGLISH
*
* DO NOT CHANGE this file, as it will be overwritten in next update.
* To use different values, write and use a similar structure js file.
*
*/
var rsc_jui_fr = {
no_filters_found: "No hay filtros definidos",
rules_group_AND: "Todas las reglas",
rules_group_OR: "Cualquier regla",
rule: "regla",
group: "grupo",
tools_please_select: "Añadir",
rule_insert_before: "Insertar antes",
rule_insert_after: "Insertar después",
rule_insert_inside: "Insertar dentro",
rule_clear: "limpiar",
rule_delete: "borrar",
group_insert_before: "Insertar antes",
group_insert_after: "Insertar después",
group_insert_inside: "Insertar dentro",
group_delete: "borrar",
filter_please_select: 'Seleccione',
operator_equal: 'igual',
operator_not_equal: 'no igual',
operator_in: 'sea',
operator_not_in: 'no sea',
operator_less: 'menor',
operator_less_or_equal: 'menor o igual',
operator_greater: 'mayor',
operator_greater_or_equal: 'mayor o igual',
operator_between: 'entre',
operator_not_between: 'no esté entre',
operator_begins_with: 'empiece por',
operator_not_begins_with: 'no empiece por',
operator_contains: 'contenga',
operator_not_contains: 'no contenga',
operator_ends_with: 'termine en',
operator_not_ends_with: 'no termine en',
operator_is_empty: 'esté vacio',
operator_is_not_empty: 'no esté vacio',
operator_is_null: 'sea nulo',
operator_is_not_null: 'no sea nulo',
error_no_value_given: "Valor no declarado",
error_invalid_number: "Valor no numerico",
error_invalid_datetime: "Formato de fecha incorrecto",
error_converting_value: "Error al convertir el valor"
};

View File

@@ -0,0 +1,55 @@
/**
* jui_filter_rules v1.0.7 simple localization - ENGLISH
*
* DO NOT CHANGE this file, as it will be overwritten in next update.
* To use different values, write and use a similar structure js file.
*
*/
var rsc_jui_fr = {
no_filters_found: "No filters defined",
rules_group_AND: "all rules",
rules_group_OR: "any rule",
rule: "rule",
group: "group",
tools_please_select: "&raquo;",
rule_insert_before: "insert before",
rule_insert_after: "insert after",
rule_insert_inside: "insert inside",
rule_clear: "clear",
rule_delete: "delete",
group_insert_before: "insert before",
group_insert_after: "insert after",
group_insert_inside: "insert inside",
group_delete: "delete",
filter_please_select: '&raquo; select',
operator_equal: 'equal',
operator_not_equal: 'not_equal',
operator_in: 'in',
operator_not_in: 'not in',
operator_less: 'less',
operator_less_or_equal: 'less or equal',
operator_greater: 'greater',
operator_greater_or_equal: 'greater or equal',
operator_between: 'between',
operator_not_between: 'not between',
operator_begins_with: 'begins with',
operator_not_begins_with: 'does not begin with',
operator_contains: 'contains',
operator_not_contains: 'does not contain',
operator_ends_with: 'ends with',
operator_not_ends_with: 'does not end with',
operator_is_empty: 'is empty',
operator_is_not_empty: 'is not empty',
operator_is_null: 'is null',
operator_is_not_null: 'is not null',
error_no_value_given: "Value not given",
error_invalid_number: "Value is not numeric",
error_invalid_datetime: "Invalid date format",
error_converting_value: "Error converting value"
};

View File

@@ -0,0 +1,235 @@
jQuery(document).ready(function($) {
if(typeof categories == 'undefined') {
return;
}
$("#filter_editor").jui_filter_rules( getFilterConfig() );
if(filter !== false){
setRules(filter);
}
$("#miravia_rules_form").submit(function(){
var data = '';
data = getRulesJson();
$("#miravia_rules_form").append('<input type="hidden" name="filter_data" value="'+encodeURIComponent(data)+'">');
data = getActionDetailJson();
$("#miravia_rules_form").append('<input type="hidden" name="action_detail_data" value="'+encodeURIComponent(data)+'">');
});
$("#action_type").change(function(){
setActionDetail();
});
setActionDetail();
function getFilterConfig() {
var filter_config = {
bootstrap_version: "3",
filters: [
{
filterName: "Name", "filterType": "text", field: "product_name", filterLabel: "Product name",
excluded_operators: ["in", "not_in"],
filter_interface: [
{
filter_element: "input",
filter_element_attributes: {"type": "text", "value": ""}
}
]
},
{
filterName: "Price",
"filterType": "number",
"numberType": "double",
field: "price",
filterLabel: "Product price",
excluded_operators: ["in", "not_in"]
},
{
filterName: "SpecificPrice",
"filterType": "number",
"numberType": "double",
field: "specific_price",
filterLabel: "Product specific price",
excluded_operators: ["in", "not_in"]
},
{
filterName: "Stock",
"filterType": "number",
"numberType": "integer",
field: "stock",
filterLabel: "Stock",
excluded_operators: ["in", "not_in"]
},
{
filterName: "Category",
"filterType": "number",
"numberType": "integer",
field: "category",
filterLabel: "Category",
excluded_operators: ["in", "not_in", "less", "less_or_equal", "greater", "greater_or_equal"],
filter_interface: [
{
filter_element: "select"
}
],
lookup_values: categories
},
// {
// filterName: "Supplier",
// "filterType": "number",
// "numberType": "integer",
// field: "supplier",
// filterLabel: "Supplier",
// excluded_operators: ["in", "not_in", "less", "less_or_equal", "greater", "greater_or_equal"],
// filter_interface: [
// {
// filter_element: "select"
// }
// ],
// lookup_values: suppliers
// },
// {
// filterName: "Manufacturer",
// "filterType": "number",
// "numberType": "integer",
// field: "manufacturer",
// filterLabel: "Manufacturer",
// excluded_operators: ["in", "not_in", "less", "less_or_equal", "greater", "greater_or_equal"],
// filter_interface: [
// {
// filter_element: "select"
// }
// ],
// lookup_values: manufacturers
// },
],
onValidationError: function (event, data) {
alert(data["err_description"] + ' (' + data["err_code"] + ')');
if (data.hasOwnProperty("elem_filter")) {
data.elem_filter.focus();
}
}
};
return filter_config;
}
function setActionDetail()
{
var action_type = $("#action_type").val();
$("#action_detail").html(getActionDetail(action_type));
}
function getActionDetail(action_type)
{
switch (action_type) {
case 'price_stock':
return getActionDetailModifyPriceStock();
case 'name':
return getActionDetailModifyName();
case 'logistics':
return getActionDetailLogistics();
default:
return '';
}
}
function getActionDetailModifyPriceStock()
{
var v =action_detail.field || '';
var html = '<select id="action_detail_field" class="fixed-width-xl pull-left mr-1">';
html += '<option value="price,special_price" ' + ((v=='price,special_price')?'selected':'') + '>Price & Specific price</option>';
html += '<option value="price" ' + ((v=='price')?'selected':'') + '>Price</option>';
html += '<option value="special_price" ' + ((v=='special_price')?'selected':'') + '>Specific price</option>';
html += '<option value="stock" ' + ((v=='stock')?'selected':'') + '>Stock</option>';
html += '</select>';
v = action_detail.operator || '';
html += '<select id="action_detail_operator" class="fixed-width-xl pull-left">';
html += '<option value="increment" ' + ((v=='increment')?'selected':'') + '>Increment €</option>';
html += '<option value="decrement" ' + ((v=='decrement')?'selected':'') + '>Decrement €</option>';
html += '<option value="increment_percent" ' + ((v=='increment_percent')?'selected':'') + '>Increment %</option>';
html += '<option value="decrement_percent" ' + ((v=='decrement_percent')?'selected':'') + '>Decrement %</option>';
html += '<option value="multiply" ' + ((v=='multiply')?'selected':'') + '>Multiply</option>';
html += '<option value="set" ' + ((v=='set')?'selected':'') + '>Set to</option>';
html += '</select> &nbsp; ';
v = action_detail.value || '';
v = v.replaceAll('"', '');
html += '<input type="text" id="action_detail_value" value="' + v + '" class="fixed-width-xl pull-left">';
return html;
}
function getActionDetailModifyName()
{
var v =action_detail.field || '';
var html = '<select id="action_detail_field" class="fixed-width-xl pull-left mr-1">';
html += '<option value="name" ' + ((v=='name')?'selected':'') + '>Mofify "Name"</option>';
html += '<option value="description" ' + ((v=='description')?'selected':'') + '>Modify "Description"</option>';
html += '<option value="short_description" ' + ((v=='short_description')?'selected':'') + '>Modify "Short description"</option>';
html += '</select><br><br>';
v = action_detail.stringvalue || '';
html += '<textarea id="action_detail_value">' + v;
html += '</textarea>';
html += '<div>';
html += 'You can use these variables:<strong> %name%, %description%, %short_description%, %manufacturer%, %supplier%, %category%</strong>';
html += '</div>';
return html;
}
function getActionDetailLogistics()
{
var v = action_detail.delivery || '';
var html = '<select id="action_detail_field" class="fixed-width-xl pull-left mr-1">';
html += '<option value="dbs" ' + ((v=='dbs')?'selected':'') + '>Delivery by Seller</option>';
html += '<option value="dbm" ' + ((v=='dbm')?'selected':'') + '>Delivery by Miravia</option>';
html += '<option value="" ' + ((v=='')?'selected':'') + '>Use defaults</option>';
html += '</select><br><br>';
v = action_detail.warehouse || '';
html += '<input type="text" id="action_detail_value" placeholder="Warehouse code" ';
html += 'value="' + v + '" class="input fixed-width-xl pull-left mr-1">';
html += '<br><br>';
return html;
}
function getActionDetailJson()
{
var action_type = $("#action_type").val();
switch (action_type) {
case 'price_stock':
var ret = {
field: $('#action_detail_field').val(),
operator: $('#action_detail_operator').val(),
value: $('#action_detail_value').val()
};
return JSON.stringify(ret);
case 'name':
var ret = {
field: $('#action_detail_field').val(),
stringvalue: $('#action_detail_value').val()
};
return JSON.stringify(ret);
case 'logistics':
var ret = {
delivery: $('#action_detail_field').val(),
warehouse: $('#action_detail_value').val()
}
return JSON.stringify(ret);
default:
return '';
}
}
function getRulesJson()
{
return JSON.stringify($("#filter_editor").jui_filter_rules('getRules', 0, []));
}
function setRules(a_rules)
{
$("#filter_editor").jui_filter_rules('setRules', a_rules);
}
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
connector-miravia/lib/select2.min.css vendored Normal file

File diff suppressed because one or more lines are too long

2
connector-miravia/lib/select2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,33 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
list($order, $items) = MiraviaCore::get_order_woocommerce($post->ID);
?>
<div id="miravia_order_gestion">
<?php
$package_data = get_post_meta($post->ID, '_miravia_packed_result', true);
if(isset($package_data['data']['pack_order_list'])){
$packages = [];
foreach ($package_data['data']['pack_order_list'] as $item){
if(isset($item['order_item_list'])){
foreach($item['order_item_list'] as $package){
$packages[$package['package_id']] = true;
}
}
}
foreach($packages as $p => $v) {
if($v) {
echo wp_kses('<a href="javascript:void(0)" class="miraviaprintLabel" data-id="'.$post->ID.'" data-package="'.$p.'"><i class="fa fa-print"></i> Print Shipping Label ['.$p.']</a>', wp_kses_allowed_html());
}
}
}else{
echo wp_kses(' <p>'.__('Ready to ship?','miraviawoo').'</p>
<button type="button" id="packOrderButton" data-id="'.$post->ID.'">Pack Order</button>', wp_kses_allowed_html());
}
?>
</div>

View File

@@ -0,0 +1,43 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $post;
$defaultBrand = get_option('miravia_default_brand', 'No Brand');
$productBrand = get_post_meta($post->ID, '_miravia_brand_product', true);
$productUnit = get_post_meta($post->ID, '_miravia_unit', true);
$productUnitValue = get_post_meta($post->ID, '_miravia_unit_value', true);
$defaultUnit = get_option('miravia_default_unit', 'units');
$defaultUnitValue = get_option('miravia_default_unit_value', '1');
if($productBrand) {
$defaultBrand = $productBrand;
}
?>
<div class="options_group show_if_simple show_if_external show_if_variable" style="">
<p class=" form-field miravia_brand_product_field">
<label for="miravia_brand_product"><?php echo __('Product Brand', 'miraviawoo') ?></label>
<select id="miravia_brand_product" name="miravia_brand_product" class="search-select-miravia-brand">
<option value="<?php echo $defaultBrand ?>" <?php selected($defaultBrand, $defaultBrand) ?>><?php echo $defaultBrand ?></option>
</select>
</p>
<p class=" form-field miravia_unit_type_field">
<label for="miravia_unit_type"><?php echo __('Unit Type', 'miraviawoo') ?></label>
<select id="miravia_unit_type" name="miravia_unit_type">
<option value="">Default: <?php echo $defaultUnit ?></option>
<option <?php echo selected('Units',$productUnit)?> value="Units">Units</option>
<option <?php echo selected('Liters',$productUnit)?> value="Liters">Liters</option>
<option <?php echo selected('Kilograms',$productUnit)?> value="Kilograms">Kilograms</option>
<option <?php echo selected('Grams',$productUnit)?> value="Grams">Grams</option>
<option <?php echo selected('Milliliters',$productUnit)?> value="Milliliters">Milliliters</option>
</select>
</p>
<p class=" form-field miravia_brand_product_field">
<label for="miravia_brand_product"><?php echo __('Unit Value', 'miraviawoo') ?></label>
<input type="text" name="miravia_unit_value" value="<?php echo $productUnitValue ?>" placeholder="Default: <?php echo $defaultUnitValue?>" />
</p>
</div>

View File

@@ -0,0 +1,38 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
if(isset($_GET['action']) and $_GET['action'] == 'delete') {
if(current_user_can( 'manage_options' )){
MiraviaCore::delete_account(sanitize_text_field( $_GET['id'] ));
wp_safe_redirect(admin_url("admin.php?page=miravia_settings&subpage=accounts"));
}
}
$miraviaTable = new MiraviaTable();
$miraviaTable->custom_actions = array(
'delete' => sprintf('<a href="admin.php?page=%s&subpage=%s&action=%s&id=[id]">Delete</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'delete'),
);
$miraviaTable->columns = [
'name' => 'Name',
'lang' => 'Language',
'userid' => 'User ID',
'created' => 'Created',
'updated' => 'Updated'
];
$miraviaTable->data_table = $accounts = MiraviaCore::get_accounts();
$miraviaTable->total_elements = count($accounts);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<form method="post" action="<?php echo admin_url('admin-ajax.php?action=miravia_authorize')?>">
<h1 class="wp-heading-inline">Miravia Seller Accounts</h1>
<input type="submit" name="authorize" class="page-title-action" value="Add Account" />
</form>
<hr class="wp-header-end">
<?php
$miraviaTable->display();
?>
</div>

View File

@@ -0,0 +1,109 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
$categories_end = array();
$categories = get_terms(array('taxonomy' => 'product_cat'));
foreach($categories as $cat) {
$categories_end[] = (object) array('lk_option' => $cat->name, 'lk_value' => $cat->term_id);
}
$profiles = MiraviaCore::get_profiles();
$accounts = MiraviaCore::get_accounts();
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_rule') {
if(sanitize_text_field($_POST['name_rule']) != "") {
$account = sanitize_text_field($_POST['apply_accounts']);
$profiles = sanitize_text_field($_POST['apply_profile']);
$filterDecoded = urldecode($_POST['filter_data']);
$actionsDecoded = urldecode($_POST['action_detail_data']);
$saveProfile = MiraviaCore::add_rule(array(
'name_rule' => sanitize_text_field($_POST['name_rule']),
'accounts' => $account,
'profile_id' => $profiles,
'rules_json' => $filterDecoded,
'action_json' => $actionsDecoded
));
if($saveProfile) {
wp_safe_redirect('?page=miravia_settings&subpage=rules');
}
}else{
echo "Error: Rule need Name";
}
}
?>
<script>
const filter = [];
const categories = <?php echo json_encode($categories_end)?>;
</script>
<div class="wrap miravia-pane">
<h1 class="wp-heading-inline">Add Rule to Miravia</h1>
<hr class="wp-header-end">
<form id="miravia_rules_form" method="post">
<input type="hidden" name="action" value="save_rule" />
<table class="form-table">
<tr valign="top">
<th scope="row"><?php echo __('Name of Rule', 'miraviawoo')?>
<span class="description"><?php echo __('Describe your rule', 'miraviawoo')?></span>
</th>
<td>
<input type="text" name="name_rule" placeholder="Rule Name..." />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Accounts', 'miraviawoo')?>
<span class="description"><?php echo __('Select all or one account to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<select name="apply_accounts">
<option value="0">Apply all accounts</option>
<?php
foreach($accounts as $acc) {
echo " <option value='{$acc['id']}'>{$acc['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Profile', 'miraviawoo')?>
<span class="description"><?php echo __('Select all or one profile to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<select name="apply_profile">
<option value="0">Select one profile</option>
<?php
foreach($profiles as $pro) {
echo "<option value='{$pro['id']}'>{$pro['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Rules', 'miraviawoo')?>
<span class="description"><?php echo __('Create a conditionals to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<div id="filter_editor" style="border:1px solid #CCC; padding:10px; background-color:#FFF;border-radius:5px"></div>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Actions', 'miraviawoo')?>
<span class="description"><?php echo __('If conditionals is true, what happens?', 'miraviawoo')?></span>
</th>
<td>
<div style="border:1px solid #CCC; padding:10px; margin-top:20px; background-color:#FFF; border-radius:5px">
<select id="action_type" style="margin-bottom:10px">
<option value="remove">Do not send these products</option>
<option value="only" >Only send these products</option>
<option value="price_stock">Change price or stock</option>
<option value="name">Name</option>
</select>
<div id="action_detail"></div>
</div>
</td>
</tr>
</table>
<input type="submit" name="submit" class="button" value="Save Rule" />
</form>
</div>

View File

@@ -0,0 +1,65 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
$category = get_term(sanitize_text_field($_GET['cat_id']));
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_miravia_attr_default') {
update_term_meta($category->term_id, "_miravia_attr", sanitize_text_field($_POST['attr']));
}
$miravia_category = get_term_meta($category->term_id, '_miravia_category', true);
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
}else{
die('Error: Account is not ready');
}
$link = new MiraviaCategory($token);
$attributes = $link->getAttributes($miravia_category);
$default_attributes = get_term_meta($category->term_id, "_miravia_attr", true);
$attributes_woocommerce = wp_list_pluck( wc_get_attribute_taxonomies(), 'attribute_label', 'attribute_name' );
?>
<h1>MIRAVIA - Attributes <?php echo $category->name ?> Configuration</h1>
<form method="post">
<table width="100%">
<?php
if($attributes_woocommerce) {
foreach($attributes_woocommerce as $slug => $attr) {
// if(isset($default_attributes[$attr['name']])) {
// $value = $default_attributes[$attr['name']];
// }else{
// $value = '';
// }
// $obligatorio = '';
// if($attr['is_mandatory'] == '1') {
// $obligatorio = '*';
// }
$options = '';
if (!empty ($attributes ) ) {
foreach ( $attributes as $key => $v ) {
if($v['is_sale_prop'] == 0) {
continue;
}
$selected = '';
if($default_attributes != '' and $v['name'] == $default_attributes[$slug]) {
$selected = 'selected="selected"';
}
$options .= "<option value='{$v['name']}' {$selected}>{$v['label']}</option>";
}
}
echo wp_kses("<tr>
<td style='text-transform: capitalize;'>{$attr}</td>
<td><select class='attribute' name='attr[{$slug}]'>
<option disabled value='0'> - Select - </option>{$options}</select></td>
</tr>", wp_kses_allowed_html());
}
echo wp_kses("<button type='submit' name='action' value='save_miravia_attr_default'>Guardar Atributos</button>",wp_kses_allowed_html());
}else{
echo esc_html('No hay atributos en el id ' . $category->term_id);
}
?>
</table>
</form>

View File

@@ -0,0 +1,10 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
// $brands = $MIRAVIAWOO->client->get_brands(1);
// die('<pre>'.print_r($brands, true).'</pre>');
?>
<div class="wrap">
<h2>Brands</h2>
</div>

View File

@@ -0,0 +1,45 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
?>
<h1>MIRAVIA - Category Configuration</h1>
<?php
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
}else{
die('Error: Account is not ready');
}
$link = new MiraviaCategory($token);
$miravia_categories = $link->getCategories(true);
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_miravia_categories') {
if(is_array($_POST['miravia_category'])) {
foreach($_POST['miravia_category'] as $woocommerce_cat_id => $miravia_cat) {
update_term_meta(sanitize_text_field($woocommerce_cat_id), "_miravia_category", sanitize_text_field($miravia_cat));
}
}
}
$woocommerce_categories = get_terms('product_cat');
?>
<form method="post">
<table width="100%">
<thead>
<td>WooCommerce Category</td>
<td>MIRAVIA Category</td>
<td>Opciones</td>
</thead>
<?php
foreach($woocommerce_categories as $category) {
$selected = get_term_meta($category->term_id, "_miravia_category", true);
echo wp_kses("<tr>
<td>{$category->name}</td>
<td>".MiraviaCore::select_category($miravia_categories, array('select' => $selected, 'name' => 'miravia_category['.$category->term_id.']'))."</td>
<td>
<a href='?page=miravia_settings&subpage=attributes&cat_id={$category->term_id}'>Atributos por defecto</a>
</td>
</tr>", wp_kses_allowed_html());
}
?>
<button type="submit" name="action" value="save_miravia_categories">Guardar Categorias</button>
</table>
</form>

View File

@@ -0,0 +1,175 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $wpdb;
if(isset($_POST['miravia_action_nonce'])) {
if(wp_verify_nonce(sanitize_text_field($_POST['miravia_action_nonce']), 'save_miravia_conf')) {
update_option('miravia_delay_time', sanitize_text_field($_POST['secondsNotify']));
update_option('miravia_default_status', sanitize_text_field($_POST['miravia_order_defuault_status']));
update_option('_miravia_default_stock', sanitize_text_field($_POST['_miravia_default_stock']));
update_option('miravia_transport_mode', sanitize_text_field($_POST['miravia_transport_mode']));
update_option('miravia_ean_key', sanitize_text_field($_POST['miravia_ean_key']));
update_option('miravia_default_brand', sanitize_text_field($_POST['miravia_default_brand']));
update_option('miravia_default_unit', sanitize_text_field($_POST['miravia_default_unit']));
update_option('miravia_default_unit_value', sanitize_text_field($_POST['miravia_default_unit_value']));
if(isset($_POST['miraviaDebugMode']) and sanitize_text_field($_POST['miraviaDebugMode']) == '1') {
update_option('miravia_debug_mode', '1');
}else{
update_option('miravia_debug_mode', '0');
}
if(isset($_POST['miravia_only_stock']) and sanitize_text_field($_POST['miravia_only_stock']) == '1') {
update_option('miravia_only_stock', '1');
}else{
update_option('miravia_only_stock', '0');
}
}
}
$defaultUnit = get_option('miravia_default_unit', 'units');
$defaultUnitValue = get_option('miravia_default_unit_value', '1');
$timeDelay = get_option('miravia_delay_time', 300);
$debugMode = get_option('miravia_debug_mode', '0');
$transportMode = get_option('miravia_transport_mode', 'dbm');
$defaultBrand = get_option('miravia_default_brand', 'No Brand');
$statuses = wc_get_order_statuses();
$statusDefaultSelected = get_option('miravia_default_status', 'wc-processing');
$categories = get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );
// MiraviaCore::debug($categories);
// $notifies = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}options WHERE option_name LIKE '%miravia_notify%'", ARRAY_A );
// // delete_option('miravia_notify_update_stock_in');
// LOG::add("Get notifies");
// LOG::add($notifies);
?>
<div class="wrap">
<h2>Configuration</h2>
<form method="post">
<?php wp_nonce_field( 'save_miravia_conf', 'miravia_action_nonce' ); ?>
<table class="form-table">
<tr valign="top">
<th scope="row"><?php echo __('Time Delay', 'miraviawoo')?>
</th>
<td>
<select name="secondsNotify">
<option value="30" <?php echo selected($timeDelay, 30,false)?>>30 secs</option>
<option value="60" <?php echo selected($timeDelay, 60,false)?>>1 min</option>
<option value="120" <?php echo selected($timeDelay, 120,false)?>>2 min</option>
<option value="240" <?php echo selected($timeDelay, 240,false)?>>4 min</option>
<option value="300" <?php echo selected($timeDelay, 300,false)?>>5 min</option>
<option value="300" <?php echo selected($timeDelay, 600,false)?>>10 min</option>
<option value="300" <?php echo selected($timeDelay, 3600,false)?>>1 h</option>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Debug Mode', 'miraviawoo')?>
<p class="description"><?php echo __('This active debug mode, developer support','miraviawoo')?></p>
</th>
<td>
<input type="checkbox" value="1" name="miraviaDebugMode" <?php echo checked($debugMode, '1', false)?> />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Default Status Orders', 'miraviawoo')?>
<p class="description"><?php echo __('Set default status for Miravia Orders','miraviawoo')?></p>
</th>
<td>
<select name="miravia_order_defuault_status">
<?php
foreach($statuses as $key => $status) {
if($key == 'wc-completed' || $key == 'wc-refunded' || $key == 'wc-failed' || $key == 'wc-cancelled') { continue; }
$selected = selected($key, $statusDefaultSelected, false);
echo '<option value="'.$key.'" '.$selected.'>'.$status.'</option>';
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Transport Mode', 'miraviawoo')?>
<p class="description"><?php echo __('Select DBM or DBS','miraviawoo')?></p>
</th>
<td>
<select name="miravia_transport_mode">
<option value="dbm" <?php selected($transportMode, 'dbm') ?>>DBM</option>
<option value="dbs" <?php selected($transportMode, 'dbs') ?>>DBS</option>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Stock Default', 'miraviawoo')?>
<p class="description"><?php echo __('When products have "In Stock" without quantity, set stock to send Miravia','miraviawoo')?></p>
</th>
<td>
<input type="number" value="<?php echo get_option('_miravia_default_stock', 100)?>" name="_miravia_default_stock" />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('EAN Key', 'miraviawoo')?>
<p class="description"><?php echo __('This use for extract EAN code from products, enter the meta key for your EAN code','miraviawoo')?></p>
</th>
<td>
<input type="text" name="miravia_ean_key" value="<?php echo get_option('miravia_ean_key', '')?>" />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Default Brand', 'miraviawoo')?>
<p class="description"><?php echo __('Set default Brand for your products','miraviawoo')?></p>
</th>
<td>
<select name="miravia_default_brand" class="search-select-miravia-brand">
<option value="<?php echo $defaultBrand ?>" <?php selected($defaultBrand, $defaultBrand) ?>><?php echo $defaultBrand ?></option>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Default Unit', 'miraviawoo')?>
<p class="description"><?php echo __('Set default unit for all products','miraviawoo')?></p>
</th>
<td>
<select name="miravia_default_unit">
<option <?php echo selected('Units',$defaultUnit)?>value="Units">Units</option>
<option <?php echo selected('Liters',$defaultUnit)?>value="Liters">Liters</option>
<option <?php echo selected('Kilograms',$defaultUnit)?>value="Kilograms">Kilograms</option>
<option <?php echo selected('Grams',$defaultUnit)?>value="Grams">Grams</option>
<option <?php echo selected('Milliliters',$defaultUnit)?>value="Milliliters">Milliliters</option>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Default Unit Value', 'miraviawoo')?>
<p class="description"><?php echo __('Set default unit value for all products','miraviawoo')?></p>
</th>
<td>
<input type="text" name="miravia_default_unit_value" value="<?php echo $defaultUnitValue ?>" />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Default Category', 'miraviawoo')?>
<p class="description"><?php echo __('Set default unit value for all products','miraviawoo')?></p>
</th>
<td>
<select name="miravia_default_unit">
<?php
foreach($categories as $cat) {
echo "<option value='{$cat->term_id}'>{$cat->name}</option>";
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Only Stock', 'miraviawoo')?>
<p class="description"><?php echo __('Check this if you want sync only stock','miraviawoo')?></p>
</th>
<td>
<input type="checkbox" value="1" name="miravia_only_stock" <?php echo checked(get_option('miravia_only_stock', '0'), '1', false)?>" />
</td>
</tr>
</table>
<input type="submit" class="button" value="<?php echo __('Save')?>" />
</form>
</div>

View File

@@ -0,0 +1,81 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$profiles = MiraviaCore::get_accounts();
if($profiles) {
$category = new MiraviaCategory($profiles[0]['token']);
$tree = $category->getCategories();
}
//Save data
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_profile') {
$categories_recibed = implode(",", array_map('sanitize_text_field', $_POST['tax_input']['product_cat']));
$acounts_recibed = implode(",", array_map('sanitize_text_field', $_POST['profile']));
// die(var_dump($categories_recibed));
if($_POST['description'] == '') {
echo "<p>Profile need description</p>";
}else{
$saveProfile = MiraviaCore::add_profile(array(
'name' => sanitize_text_field($_POST['description']),
'accounts_id' => $acounts_recibed,
'categories' => $categories_recibed,
'miravia_category' => sanitize_text_field($_POST['miravia_category'])
));
if($saveProfile) {
wp_safe_redirect(admin_url("admin.php?page=miravia_settings&subpage=edit_profile&action=edit&id={$saveProfile}"));
}
}
}
?>
<div class="wrap miravia-pane">
<h1 class="wp-heading-inline">Create new profile</h1>
<hr class="wp-header-end">
<form method="post">
<input type="hidden" name="action" value="save_profile" />
<table class="form-table">
<tr valign="top">
<th scope="row"><?php echo __('Description Profile', 'miraviawoo')?></th>
<td>
<input required type="text" name="description" value="" />
</td>
</tr>
<tr>
<td>Categories
<span class="description">Select the categories with this profile</span>
</td>
<td>
<ul class="miravia_categories_select" style="height: 400px; overflow: auto;">
<?php wp_terms_checklist(0, array(
'taxonomy' => 'product_cat'
));?>
</ul>
</td>
</tr>
<tr>
<td>Miravia Category</td>
<td>
<select name="miravia_category" class="search-select-miravia">
<?php
foreach($tree as $cat) {
echo "<option value='{$cat['id']}'>{$cat['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td>Seller Accounts</td>
<td>
<?php
foreach($profiles as $profile) {
echo "<p><input type='checkbox' name='profile[]' value='{$profile['id']}' /> {$profile['name']}</p>";
}
?>
</td>
</tr>
</table>
<input type="submit" name="submit" class="button" value="Save profile" />
</form>
</div>

View File

@@ -0,0 +1,29 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
?>
<div class="wrap">
<div class="region_config_dashboard">
<img style="width:300px" src="<?php echo plugins_url('assets/img/miravia-logo-new.svg', MIRAVIA_ASSETS_PATH)?>" />
<h2>Dashboard</h2>
<p>Welcome to Miravia Dashboard for WooCommerce, manage your products on Miravia Store and download orders on your WooCommerce site.</p>
<a href="admin.php?page=miravia_settings&subpage=orders" class="btn_config">
<h4><i class="fa fa-file"></i> Orders</h4>
<p>Manage orders from Miravia, download and change status from your WooCommerce</p>
</a>
<a href="admin.php?page=miravia_settings&subpage=profiles" class="btn_config">
<h4><i class="fa-solid fa-tree"></i> Profiles</h4>
<p>Create o Edit your profiles to send products to Miravia</p>
</a>
<a href="admin.php?page=miravia_settings&subpage=products" class="btn_config">
<h4><i class="fa-solid fa-store"></i> Products</h4>
<p>View Miravia products, status, stock and connect with your WooCommerce products</p>
</a>
<a href="admin.php?page=miravia_settings&subpage=configuration" class="btn_config">
<h4><i class="fa-solid fa-gear"></i> Configuration</h4>
<p>Change plugin configuration for attributes, default values, etc.</p>
</a>
<div class="clear"></div>
<p>Connector version <?php echo MIRAVIA_WOO_VERSION ?> (Build <?php echo MIRAVIA_BUILD_VERSION ?>)</p>
</div>
</div>

View File

@@ -0,0 +1,49 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$id = sanitize_text_field($_GET['id']);
$jobs = MiraviaCore::get_job_detail($id);
$miraviaTable = new MiraviaTable();
$data = array();
// MiraviaCore::debug($jobs);
if($jobs) {
$token = $jobs[0];
$miraviaTable->custom_actions = array(
'download' => sprintf('<a href="/wp-admin/post.php?post=[id_woocommerce]&action=edit" target="_blank">Edit</a>' ),
'view' => '<a href="https://www.miravia.es/p/i[id_miravia].html" target="_blank">View on Miravia</a>',
);
$miraviaTable->columns = [
'name' => 'SKU',
'id_miravia' => 'ID Miravia',
'id_woocommerce' => 'ID WooCommerce',
'lastError' => 'Last Error',
'created' => 'Created',
'updated' => 'Updated',
'status_text' => 'Status'
];
foreach($jobs as $k => $p) {
$data[] = array(
'name' => $p['sku'],
'id_miravia' => $p['id_miravia'],
'id_woocommerce' => $p['id_woocommerce'],
'lastError' => $p['lastError'],
'created' => date('d-m-Y H:i:s', strtotime($p['created'])),
'updated' => date('d-m-Y H:i:s', strtotime($p['updated'])),
'status_text' => $p['status_text']
);
}
}
// die('<pre>' . print_r($data, true) . '</pre>');
$miraviaTable->data_table = $data;
$miraviaTable->total_elements = count($data);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h2>Job Detail</h2>
<?php echo $miraviaTable->display(); ?>
</div>

View File

@@ -0,0 +1,208 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
if($_GET['id']) {
$id = sanitize_text_field($_GET['id']);
$prof =MiraviaCore::get_profiles($id);
}else{
exit('Validation error');
}
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
}else{
die('Error: Account is not ready');
}
$link = new MiraviaCategory($token);
$profiles = MiraviaCore::get_accounts();
if($profiles) {
$category = new MiraviaCategory($token);
$tree = $category->getCategories();
}
$attributes = $link->getAttributes($prof['miravia_category']);
// var_dump($prof['config']);
try {
$default_attributes = $prof['config'] ? json_decode($prof['config'], true) : [];
}catch(Exception $e) {
$default_attributes = [];
}
// MiraviaCore::debug($default_attributes);
$attributes_woocommerce = wp_list_pluck( wc_get_attribute_taxonomies(), 'attribute_label', 'attribute_name' );
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_miravia_attr_default') {
$default_attributes = sanitize_text_field($_POST['attr']);
$args = array('config' => json_encode(array('attr' => sanitize_text_field($_POST['attr']))));
LOG::add($args);
if(MiraviaCore::update_profile($args, array('id' => $id))) {
echo esc_html('Attributes profile saved');
}
}
//Save data
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'update_profile') {
if($_POST['description'] == '') {
echo "<p>Profile need description</p>";
}elseif ($_POST['tax_input']['product_cat'] == null) {
echo "<p>Profile need categories</p>";
}else{
$categories_recibed = implode(",", array_map('sanitize_text_field', $_POST['tax_input']['product_cat']));
$acounts_recibed = implode(",", array_map('sanitize_text_field', $_POST['profile']));
// die(var_dump($categories_recibed));
$saveProfile = MiraviaCore::update_profile(array(
'name' => sanitize_text_field($_POST['description']),
'accounts_id' => $acounts_recibed,
'categories' => $categories_recibed,
'miravia_category' => sanitize_text_field($_POST['miravia_category'])
), array('id' => $id));
if($saveProfile) {
wp_safe_redirect('?page=miravia_settings&subpage=profiles');
}
}
}
//Rules
$miraviaTable = new MiraviaTable([
'sccren' => 'miravia_rules'
]);
$miraviaTable->custom_actions = array(
'edit' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Editar</a>', sanitize_text_field($_REQUEST['page']), 'edit_rule', 'edit', ),
'delete' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Eliminar</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'delete'),
);
$miraviaTable->columns = [
'id' => "ID",
'name' => "Name",
'created' => 'Created',
'updated' => 'Updated'
];
$miraviaTable->default_column_name = 'name_rule';
$rules = MiraviaCore::get_rules(false, "profile_id = {$id} or profile_id = '0'");
$miraviaTable->data_table = $rules;
$miraviaTable->total_elements = count($rules);
$miraviaTable->prepare_items();
?>
<div class="wrap miravia-pane">
<h1 class="wp-heading-inline">Edit Profile</h1>
<hr class="wp-header-end">
<div class="text-sm font-medium text-center text-gray-500">
<ul style="display:flex" class="mv-tab-nav">
<li>
<a href="javascript:void(0);" data-tab="profile" class="mv-bt-tab active" style="margin-right:10px">Profile</a>
</li>
<li>
<a href="javascript:void(0);" data-tab="attributes" class="mv-bt-tab" style="margin-right:10px">Attributes</a>
</li>
<li>
<a href="javascript:void(0);" data-tab="rules" class="mv-bt-tab" style="margin-right:10px">Rules</a>
</li>
</ul>
</div>
<div class="mv-tabs">
<div class="mv-tab mv-tab-active" data-tab="profile">
<form method="post">
<input type="hidden" name="action" value="update_profile" />
<table class="form-table">
<tr valign="top">
<td scope="row"><?php echo __('Description Profile', 'miraviawoo')?>
<span class="description"><?php echo __('Describe your Profile, this use on admin site only') ?></span>
</td>
<td>
<input type="text" name="description" value="<?php echo $prof['name']?>" />
</td>
</tr>
<tr>
<td>Categories
<span class="description">Select the categories with this profile</span>
</td>
<td>
<ul class="miravia_categories_select" style="height: 350px; overflow: auto; border:1px solid #ccc; padding: 15px;">
<?php wp_terms_checklist(0, array(
'taxonomy' => 'product_cat',
'selected_cats' => explode(",", $prof['categories'])
));?>
</ul>
</td>
</tr>
<tr>
<td>Miravia Category</td>
<td>
<select name="miravia_category" class="search-select-miravia">
<?php
foreach($tree as $cat) {
$selected = "";
if($cat['id'] == $prof['miravia_category']) {
$selected = 'selected="selected"';
}
echo "<option value='{$cat['id']}' {$selected}>{$cat['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td>Seller Accounts</td>
<td>
<?php
$profiles_array = explode(',', $prof['accounts_id']);
foreach($profiles as $profile) {
$selected = '';
if(in_array($profile['id'], $profiles_array)) {
$selected = 'checked="checked"';
}
echo "<p><input type='checkbox' name='profile[]' {$selected} value='{$profile['id']}' /> {$profile['name']}</p>";
}
?>
</td>
</tr>
</table>
<input type="submit" name="submit" class="button" value="Update profile" />
<button type="button" class="button sendProductsMiravia" data-profile="<?php echo $id?>">Send Products</button>
</form>
</div>
<div class="mv-tab" data-tab="attributes">
<form method="post">
<input type="hidden" name="action" value="save_miravia_attr_default" />
<table width="100%">
<?php
if($attributes_woocommerce) {
foreach($attributes_woocommerce as $slug => $attr) {
$options = '';
if (!empty ($attributes ) ) {
foreach ( $attributes as $key => $v ) {
if($v['is_sale_prop'] == 0) {
continue;
}
$selected = '';
if($default_attributes != '' and isset($default_attributes[$slug]) and $v['name'] == $default_attributes[$slug]) {
$selected = 'selected="selected"';
}
$options .= "<option value='{$v['name']}' {$selected}>{$v['label']}</option>";
}
}
echo "<tr>
<td style='text-transform: capitalize;'>{$attr}</td>
<td><select class='attribute' name='attr[{$slug}]'>
<option value='0'> - Select - </option>{$options}</select></td>
</tr>";
}
}
?>
</table>
<input type="submit" name="submit" class="button" value="Save Attributes" />
</form>
</div>
<div class="mv-tab" data-tab="rules">
<?php
$miraviaTable->display();
?>
</div>
</div>
</div>

View File

@@ -0,0 +1,129 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
$categories_end = array();
if($_GET['id']) {
$id = sanitize_text_field($_GET['id']);
$rule =MiraviaCore::get_rules($id);
}else{
exit('Validation error');
}
$profiles = MiraviaCore::get_profiles();
$accounts = MiraviaCore::get_accounts();
$actions_json = json_decode($rule['action_json']);
$categories = get_terms(array('taxonomy' => 'product_cat'));
foreach($categories as $cat) {
$categories_end[] = (object) array('lk_option' => $cat->name, 'lk_value' => $cat->term_id);
}
if(isset($_POST['action']) and sanitize_text_field($_POST['action']) == 'save_rule') {
$filterDecoded = urldecode($_POST['filter_data']);
$actionsDecoded = urldecode($_POST['action_detail_data']);
$account = sanitize_text_field($_POST['apply_accounts']);
$profile = sanitize_text_field($_POST['apply_profile']);
$arrayDatosRule = array(
'name_rule' => sanitize_text_field($_POST['name_rule']),
'accounts' => intval($account),
'profile_id' => intval($profile),
'rules_json' => $filterDecoded,
'action_json' => $actionsDecoded,
'action_type' => sanitize_text_field($_POST['action_type'])
);
$saveProfile = MiraviaCore::update_rule($arrayDatosRule, array('id' => $id));
if($saveProfile) {
$rule = $arrayDatosRule;
echo esc_html('Rule saved');
}
}
// var_dump($rule);
?>
<script>
const action_detail = <?php echo $rule['action_json']?>;
const filter = <?php echo $rule['rules_json']?>;
const categories = <?php echo json_encode($categories_end)?>;
</script>
<div class="wrap miravia-pane">
<h1 class="wp-heading-inline">Edit Rule to Miravia</h1>
<hr class="wp-header-end">
<form id="miravia_rules_form" method="post">
<input type="hidden" name="action" value="save_rule" />
<table class="form-table">
<tr valign="top">
<th scope="row"><?php echo __('Name of Rule', 'miraviawoo')?>
<span class="description"><?php echo __('Describe your rule', 'miraviawoo')?></span>
</th>
<td>
<input type="text" name="name_rule" placeholder="Rule Name..." value="<?php echo $rule['name_rule']?>" />
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Accounts', 'miraviawoo')?>
<span class="description"><?php echo __('Select all or one account to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<select name="apply_accounts">
<option value="0">Apply all accounts</option>
<?php
$accounts_array = explode(',', $rule['accounts']);
foreach($accounts as $acc) {
$selected = '';
if(in_array($acc['id'], $accounts_array)) {
$selected = 'selected="selected"';
}
echo "<option value='{$acc['id']}' {$selected}>{$acc['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Profile', 'miraviawoo')?>
<span class="description"><?php echo __('Select all or one profile to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<select name="apply_profile">
<option value="0">Apply all profiles</option>
<?php
foreach($profiles as $pro) {
$selected = '';
if($pro['id'] == $rule['profile_id']) {
$selected = 'selected="selected"';
}
echo " <option value='{$pro['id']}' {$selected}>{$pro['name']}</option>";
}
?>
</select>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Rules', 'miraviawoo')?>
<span class="description"><?php echo __('Create a conditionals to apply this rule', 'miraviawoo')?></span>
</th>
<td>
<div id="filter_editor" style="border:1px solid #CCC; padding:10px; background-color:#FFF;border-radius:5px"></div>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php echo __('Actions', 'miraviawoo')?>
<span class="description"><?php echo __('If conditionals is true, what happens?', 'miraviawoo')?></span>
</th>
<td>
<div style="border:1px solid #CCC; padding:10px; margin-top:20px; background-color:#FFF; border-radius:5px">
<select id="action_type" name="action_type" style="margin-bottom:10px">
<option value="remove" <?php echo $rule['action_type'] == 'remove' ? 'selected="selected"' : ''?>>Do not send these products</option>
<option value="only" <?php echo $rule['action_type'] == 'only' ? 'selected="selected"' : ''?>>Only send these products</option>
<option value="price_stock" <?php echo $rule['action_type'] == 'price_stock' ? 'selected="selected"' : ''?>>Change price or stock</option>
<option value="name" <?php echo $rule['action_type'] == 'name' ? 'selected="selected"' : ''?>>Name</option>
</select>
<div id="action_detail"></div>
</div>
</td>
</tr>
</table>
<input type="submit" name="submit" class="button" value="Save Rule" />
</form>
</div>

View File

@@ -0,0 +1,45 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$jobs = MiraviaCore::get_jobs();
$miraviaTable = new MiraviaTable();
$data = array();
if($jobs) {
$token = $jobs[0];
$miraviaTable->custom_actions = array(
'detail' => sprintf('<a href="?page=%s&subpage=%s&id=[name]">Detail</a>', sanitize_text_field($_REQUEST['page']), 'detail-job' ),
'download' => sprintf('<a href="javascript:void(0);" class="checkJob" data-token="[token]" data-id="[name]">Check Status</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'download', ),
'cancel' => sprintf('<a href="javascript:void(0);" class="cancelJob" data-token="[token]" data-id="[name]">Cancel Job</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'download', ),
);
$miraviaTable->columns = [
'name' => 'Job',
'status' => 'Status',
'total' => 'Total Products',
'updated' => 'Updated',
];
foreach($jobs as $k => $p) {
$data[] = array(
'name' => $p['job_id'],
'status' => '<span class="status_result">...</span>',
'token' => $p['token'],
'total' => $p['total'],
'updated' => date('d-m-Y H:i:s', strtotime($p['updated'])),
);
}
}
// die('<pre>' . print_r($data, true) . '</pre>');
$miraviaTable->data_table = $data;
$miraviaTable->total_elements = count($data);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h2>Miravia Jobs</h2>
<?php echo $miraviaTable->display(); ?>
</div>

View File

@@ -0,0 +1,63 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
if(isset($_GET['account'])) {
$link = new MiraviaLink(sanitize_text_field($_GET['token']));
$orders = $link->getOrders('2022-09-01');
$miraviaTable = new MiraviaTable();
// die('<pre>'.print_r($orders,true).'</pre>');
$data = array();
$miraviaTable->custom_actions = array(
'download' => sprintf('<a href="javascript:void(0);" class="download_order" data-account="'.sanitize_text_field($_GET['account_id']).'" data-token="'.sanitize_text_field($_GET['token']).'" data-id="[id]">Download</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'download', ),
);
$miraviaTable->columns = [
'id' => "Order Number",
'name' => 'Customer Name',
'price' => "Price",
'statuses' => "Status",
'created_at' => 'Created',
'updated_at' => 'Updated',
];
foreach($orders['data']['orders'] as $k => $p) {
$data[] = array(
'id' => $p['order_number'],
'name' => $p['customer_first_name'],
'price' => number_format($p['price'], 2) . '€',
'statuses' => $p['statuses'][0],
'created_at' => date('d-m-Y H:i', strtotime($p['created_at'])),
'updated_at' => date('d-m-Y H:i', strtotime($p['updated_at'])),
);
}
// die('<pre>' . print_r($data, true) . '</pre>');
$miraviaTable->data_table = $data;
$miraviaTable->total_elements = $orders['data']['count'];
$miraviaTable->prepare_items();
}else{
$accounts = MiraviaCore::get_accounts();
$html_accounts = "";
if(count($accounts) == 1) {
wp_safe_redirect( "?page=miravia_settings&subpage=orders&account={$accounts[0]['name']}&token={$accounts[0]['token']}&account_id={$accounts[0]['id']}", 301);
die();
}
foreach($accounts as $a) {
$html_accounts .= "<a href='?page=miravia_settings&subpage=orders&account={$a['name']}&token={$a['token']}&account_id={$a['id']}'>{$a['name']} ({$a['email']})</a>";
}
}
?>
<div class="wrap">
<h2>Miravia Orders</h2>
<?php if(!isset($_GET['account'])) {
echo wp_kses('<p>'.__('Select an account', 'miravia').'</p>', array('p' => array()));
echo wp_kses($html_accounts, array('a' => array()));
}else{
echo wp_kses('<p>'.__('Orders by account', 'miravia').' '.sanitize_text_field($_GET['account']).'</p>', array('p' => array()));
$miraviaTable->display();
} ?>
</div>

View File

@@ -0,0 +1,7 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$result = MiraviaCore::get_profile_by_product('LO52027');
MiraviaCore::debug($result);

View File

@@ -0,0 +1,72 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$page = isset($_GET['paged']) ? intval($_GET['paged']) - 1 : 1;
$pagesize = 10;
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
}else{
die('Error: Account is not ready');
}
if(isset($_GET['action']) and $_GET['action'] == 'disconect') {
if(current_user_can( 'manage_options' )){
MiraviaCore::disconnect_product(sanitize_text_field( $_GET['id'] ));
wp_safe_redirect(admin_url("admin.php?page=miravia_settings&subpage=products"));
}
}
$link = new MiraviaLink($token);
$products = MiraviaCore::get_local_products($page, $pagesize);
// MiraviaCore::debug([$page, $pagesize, $products], false);
$miraviaTable = new MiraviaTable();
$miraviaTable->custom_actions = array(
'woocommerce' => '<a href="admin.php?page=miravia_settings&subpage=products&action=disconect&id=[id_woocommerce]">Disconect</a>',
//'upload' => '<a href="javascript:void(0)" data-profile="[ID]" class="sendProductsMiravia">Upload products</a>'
);
$data = array();
$miraviaTable->columns = [
'sku' => "SKU",
'name' => "Title",
'variationsTotal' => 'Total Variations',
'price' => "Price",
'lastError' => "Last Error",
'status_text' => "Status",
'created' => 'Created',
'updated' => 'Updated',
'actions' => 'Actions',
];
foreach($products as $k => $p) {
try {
$_product = new WC_Product($p['id_woocommerce']);
$data[] = array(
'id_woocommerce' => $p['id_woocommerce'],
'sku' => $p['sku'],
'name' => $p['name'],
'variationsTotal' => $p['variationsTotal'],
'price' => $_product->get_price_html(),
'lastError' =>$p['lastError'],
'status_text' => $p['status_text'],
'created' => $p['created'],
'updated' => $p['updated'],
'actions' => $p['id_miravia'] != 0 ? "<a target='_blank' href='https://www.miravia.es/p/i{$p['id_miravia']}.html' class='button'>View on Miravia</a>" : 'Not on Miravia',
);
}catch(Exception $e){
continue;
}
}
$miraviaTable->data_table = $data;
$miraviaTable->total_elements = count($data);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h2>Products</h2>
<p><?php echo __('Your products for Miravia', 'miravia')?></p>
<?php $miraviaTable->display(); ?>
</div>

View File

@@ -0,0 +1,58 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
$page = isset($_GET['paged']) ? intval($_GET['paged']) - 1 : '0';
$pagesize = 10;
$token = MiraviaCore::get_miravia_account_default();
if($token) {
$token = $token['token'];
}else{
die('Error: Account is not ready');
}
$link = new MiraviaLink($token);
$products = $link->getProductList($page);
// MiraviaCore::debug($products['data'], false);
$miraviaTable = new MiraviaTable();
$data = array();
$miraviaTable->custom_actions = array(
'view' => '<a href="https://www.miravia.es/p/i[id].html">View</a>',
//'upload' => '<a href="javascript:void(0)" data-profile="[ID]" class="sendProductsMiravia">Upload products</a>'
);
$miraviaTable->columns = [
'id' => "ID",
'image' => "Image",
'name' => "Name",
'price' => "Price",
'status' => "Status",
'created' => 'Created',
'updated' => 'Updated',
'connect' => 'Connect'
];
foreach($products['data']['products'] as $k => $p) {
$image = count($p['images']) > 0 ? $p['images'][0] : false;
$sku = $p['skus'][0]['SellerSku'];
$id_remote = $p['item_id'];
$data[] = array(
'id' => $id_remote,
'image' => $image ? "<img width='50px' src='{$image}' />" : '',
'name' => $p['attributes']['name'],
'price' => number_format($p['skus'][0]['price'], 2) . '€',
'status' => $p['status'],
'created' => date('d-m-Y H:i', intval($p['created_time'])),
'updated' => date('d-m-Y H:i', intval($p['updated_time'])),
'connect' => "<a href='javascript:void(0);' class='button connectProductRemote' data-sku='{$sku}' data-id='{$id_remote}'>Connect</a>"
);
}
// die('<pre>' . print_r($data, true) . '</pre>');
$miraviaTable->data_table = $data;
$miraviaTable->total_elements = $products['data']['total_products'];
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h2>Miravia Products</h2>
<p><?php echo __('Your remote products created in Miravia account', 'miravia')?></p>
<?php $miraviaTable->display(); ?>
</div>

View File

@@ -0,0 +1,39 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
if(isset($_GET['action']) and $_GET['action'] == 'delete') {
if(current_user_can( 'manage_options' )){
MiraviaCore::delete_profile(sanitize_text_field( $_GET['id'] ));
wp_safe_redirect(admin_url("admin.php?page=miravia_settings&subpage=profiles"));
}
}
$miraviaTable = new MiraviaTable([
'sccren' => 'miravia_profiles'
]);
$miraviaTable->custom_actions = array(
'edit' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Editar</a>', sanitize_text_field($_REQUEST['page']), 'edit_profile', 'edit', ),
'delete' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Eliminar</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'delete'),
'upload' => '<a href="javascript:void(0)" data-profile="[id]" class="sendProductsMiravia">Upload products</a>'
);
$miraviaTable->columns = [
'id' => "ID",
'name' => "Name",
'created' => 'Created',
'updated' => 'Updated',
'sync' => 'Status Sync'
];
$profiles = MiraviaCore::get_profiles();
$miraviaTable->data_table = $profiles;
$miraviaTable->total_elements = count($profiles);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h1 class="wp-heading-inline">Mapping Profiles</h1>
<a href="<?php echo admin_url('admin.php?page=miravia_settings&subpage=create_profile')?>" class="page-title-action">Create Profile</a>
<hr class="wp-header-end">
<?php
$miraviaTable->display();
?>
</div>

View File

@@ -0,0 +1,37 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
$miraviaTable = new MiraviaTable([
'sccren' => 'miravia_rules'
]);
if(isset($_GET['action']) and $_GET['action'] == 'delete') {
if(current_user_can( 'manage_options' )){
MiraviaCore::delete_rule(sanitize_text_field( $_GET['id'] ));
wp_safe_redirect(admin_url("admin.php?page=miravia_settings&subpage=rules"));
}
}
$miraviaTable->custom_actions = array(
'edit' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Editar</a>', sanitize_text_field($_REQUEST['page']), 'edit_rule', 'edit', ),
'delete' => sprintf('<a href="?page=%s&subpage=%s&action=%s&id=[id]">Eliminar</a>', sanitize_text_field($_REQUEST['page']), sanitize_text_field($_REQUEST['subpage']), 'delete'),
);
$miraviaTable->columns = [
'id' => "ID",
'name' => "Name",
'created' => 'Created',
'updated' => 'Updated'
];
$miraviaTable->default_column_name = 'name_rule';
$rules = MiraviaCore::get_rules();
$miraviaTable->data_table = $rules;
$miraviaTable->total_elements = count($rules);
$miraviaTable->prepare_items();
?>
<div class="wrap">
<h1 class="wp-heading-inline">Rules</h1>
<a href="<?php echo admin_url('admin.php?page=miravia_settings&subpage=add-rule')?>" class="page-title-action">Create Rule</a>
<hr class="wp-header-end">
<?php
$miraviaTable->display();
?>
</div>

View File

@@ -0,0 +1,11 @@
<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }
global $MIRAVIAWOO;
if(!isset($_GET['subpage'])) {
$page = 'dashboard';
}else{
$page = sanitize_text_field($_GET['subpage']);
}
require_once(MIRAVIA_VIEWS_PATH . 'pages/' . $page . '.php');

244
deploy_miravia.sh Executable file
View File

@@ -0,0 +1,244 @@
#!/bin/bash
# Miravia Connector - Git Deployment Script
# This script commits and pushes changes to the Git repository
set -e # Exit on any error
# Configuration
REPO_URL="https://devops.cloudhost.es/CloudHost/MiraviaConnector.git"
BRANCH="main"
PLUGIN_DIR="/home/malin/c0ding/miravia"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Function to print colored output
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to check if git is installed
check_git() {
if ! command -v git &> /dev/null; then
print_error "Git is not installed. Please install Git first."
exit 1
fi
}
# Function to set Git credentials
get_credentials() {
GIT_USERNAME="Malin"
GIT_PASSWORD="MuieSteaua09!@"
print_status "Using configured Git credentials..."
}
# Function to configure Git user
configure_git_user() {
print_status "Configuring Git user..."
git config user.name "Miravia Connector Bot"
git config user.email "development@cloudhost.es"
}
# Function to initialize git repository if needed
init_git_repo() {
if [ ! -d ".git" ]; then
print_status "Initializing Git repository..."
git init
git remote add origin "${REPO_URL}"
else
print_status "Git repository already initialized."
# Update remote URL if it changed
git remote set-url origin "${REPO_URL}"
fi
}
# Function to create .gitignore if it doesn't exist
create_gitignore() {
if [ ! -f ".gitignore" ]; then
print_status "Creating .gitignore file..."
cat > .gitignore << 'EOF'
# WordPress
wp-config.php
wp-content/uploads/
wp-content/cache/
wp-content/backup-db/
wp-content/advanced-cache.php
wp-content/wp-cache-config.php
wp-content/plugins/hello.php
wp-content/plugins/akismet/
.htaccess
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# IDE files
.idea/
.vscode/
*.swp
*.swo
*~
# Logs
*.log
error_log
debug.log
logs/
# Temporary files
*.tmp
*.temp
*.bak
*.backup
# Node modules (if any)
node_modules/
npm-debug.log*
# Composer
vendor/
composer.lock
# Plugin specific
*.zip
data/
EOF
fi
}
# Function to check for uncommitted changes
check_changes() {
if [ -z "$(git status --porcelain)" ]; then
print_warning "No changes detected. Nothing to commit."
return 1
fi
return 0
}
# Function to add all changes
add_changes() {
print_status "Adding changes to staging area..."
git add .
# Show what will be committed
print_status "Files to be committed:"
git diff --cached --name-only
}
# Function to commit changes
commit_changes() {
print_status "Committing changes..."
# Create detailed commit message
COMMIT_MSG=$(cat << 'EOF'
Fix image upload structure for Miravia API compliance
🔧 Bug Fixes:
- Fixed product image structure to match Miravia API requirements
- Updated MiraviaProduct.php getData() method to wrap images in {"Image": [...]} format
- Updated MiraviaCombination.php getData() method to wrap SKU images properly
- Resolved error "[4224] The Main image of the product is required"
📋 Changes:
- Modified getData() methods to transform flat image arrays to nested structure
- Product images: images[] → Images: {"Image": [...]}
- SKU images: images[] → Images: {"Image": [...]}
- Maintains backward compatibility for empty image arrays
🎯 Impact:
- Product uploads will now pass Miravia's image validation
- Both product-level and SKU-level images properly formatted
- Complies with official Miravia API documentation structure
🤖 Generated with Claude Code (https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)
git commit -m "$COMMIT_MSG"
}
# Function to push changes
push_changes() {
print_status "Pushing changes to remote repository..."
# Configure Git to use credentials
git config credential.helper store
# Create credentials file temporarily
echo "https://${GIT_USERNAME}:${GIT_PASSWORD}@devops.cloudhost.es" > ~/.git-credentials
# Push changes
git push -u origin $BRANCH
# Clean up credentials
rm -f ~/.git-credentials
git config --unset credential.helper
print_status "Changes pushed successfully!"
}
# Function to show repository status
show_status() {
print_status "Repository Status:"
echo "Repository URL: $REPO_URL"
echo "Branch: $BRANCH"
echo "Last commit:"
git log -1 --oneline
}
# Main execution
main() {
print_status "Starting Miravia Connector Git deployment process..."
# Change to plugin directory
cd "$PLUGIN_DIR"
# Check prerequisites
check_git
# Get credentials
get_credentials
# Initialize and configure Git
init_git_repo
configure_git_user
create_gitignore
# Check for changes
if ! check_changes; then
exit 0
fi
# Add, commit, and push changes
add_changes
commit_changes
push_changes
# Show final status
show_status
print_status "Deployment completed successfully! 🎉"
print_status "You can view the changes at: $REPO_URL"
}
# Run main function
main "$@"