>"; $LOYVERSE_API = "<>"; $woocommerce = new Client( '<>', '<>', '<>', [ 'version' => 'wc/v3', ] ); $lockfile = __DIR__ . '/sync.lock'; $syncfile = __DIR__ . '/sync.last'; $logfile = __DIR__ . '/sync.csv'; function customError($errno, $errstr) { mail($errormail, 'Loyverse Sync error', "[$errno] $errstr"); die("[$errno] $errstr"); } set_error_handler("customError"); if (file_exists($lockfile)) { mail($errormail, 'Loyverse Sync locked', "Sync is locked, sync stopped. "); echo "locked"; exit; } file_put_contents($lockfile, date('c')); $last_sync = @file_get_contents($syncfile); if ($last_sync === FALSE) { $last_sync = date('Y-m-d\TH:i:s.v\Z'); } file_put_contents($logfile, "$last_sync,,,,,\n", FILE_APPEND); function CallAPI($method, $url, $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_HTTPHEADER, array( "Authorization: Bearer {$GLOBALS['LOYVERSE_API']}", )); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_FAILONERROR, true); if (($result = curl_exec($curl)) === false) { trigger_error("Curl error: $url (". curl_errno($curl) . ') ' . curl_error($curl)); } curl_close($curl); $jresult = json_decode($result); if (isset($result->errors)) { $errors = ""; foreach($result->errors as $error) { $errors .= "({$error->code}) $error->details \n"; } trigger_error("Loyverse API-Error: $errors"); } return $jresult; } $i = 0; $cursor = null; do { $result = CallAPI('GET', 'https://api.loyverse.com/v0.7/receipts?created_at_min='.trim($last_sync) . ($cursor ? '&cursor='.$cursor : '')); $cursor = isset($result->cursor) ? $result->cursor : null; foreach ($result->receipts as $receipt) { foreach($receipt->line_items as $sold_item) { $item = CallAPI('GET', 'https://api.loyverse.com/v0.7/items/'.$sold_item->item_id); foreach($item->variants as $var) { if ($var->variant_id == $sold_item->variant_id) { $barcode = $var->barcode; } } $art = $item->item_name; $amount = $sold_item->quantity; $p = $woocommerce->get('products', array('sku'=>$barcode)); if ($p) { $stock = $p[0]->stock_quantity; $newstock = $stock - $amount; if ($p[0]->type == 'variation') { $woocommerce->put('products/'.$p[0]->parent_id .'/variations/'. $p[0]->id, array('stock_quantity'=> $newstock)); } else { $woocommerce->put('products/'.$p[0]->id, array('stock_quantity'=> $newstock)); } } else { $stock = "Not found"; } $line = "{$receipt->created_at},$barcode,$art,$amount,$stock,$newstock\n"; file_put_contents($logfile, $line, FILE_APPEND); } } } while($cursor); file_put_contents($syncfile, date('Y-m-d\TH:i:s.v\Z')); unlink($lockfile); ?>