Skip to content

Instantly share code, notes, and snippets.

@ugurunver
Last active June 2, 2018 12:19
Show Gist options
  • Save ugurunver/02ba1e2e8cbe375901383f1bb463c907 to your computer and use it in GitHub Desktop.
Save ugurunver/02ba1e2e8cbe375901383f1bb463c907 to your computer and use it in GitHub Desktop.
send_invoice birlestirildi
<?php
/*
PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
PHP 5.5.9-1ubuntu4.6 (cli) (built: Feb 13 2015 19:17:11)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
`apt-get install php-curl`
*/
define('API_ROOT', 'https://api.propars.net/api/v1/');
function api_request($token, $endpoint, $method='GET', $data=null){
$crl = curl_init();
$headr = array();
$headr[] = 'Content-type: application/json';
if($token){
$headr[] = 'Authorization: Token '.$token;
}
curl_setopt($crl, CURLOPT_URL, API_ROOT.$endpoint);
curl_setopt($crl, CURLOPT_HTTPHEADER, $headr);
curl_setopt($crl,CURLOPT_RETURNTRANSFER,1);
if(strtoupper($method) === 'POST'){
curl_setopt($crl, CURLOPT_POST,true);
curl_setopt($crl, CURLOPT_POSTFIELDS, json_encode($data));
}
$rest = curl_exec($crl);
$httpcode = curl_getinfo($crl, CURLINFO_HTTP_CODE);
curl_close($crl);
if($httpcode >= 400){
var_dump($rest);
die();
}
return json_decode($rest, true);
}
class SiparisClient
{
/*
Fatura olusturma sureci boyunca kullanilacak api metotlarini saglayan siniftir.
*/
private $token;
function __construct($username, $password)
{
$this->customer_endpoint = API_ROOT.'core/customer/';
$this->customer_address_endpoint = API_ROOT.'core/customeraddress/';
$this->sale_endpoint = API_ROOT.'core/sale/';
$this->invoice_endpoint = API_ROOT.'finance/saleinvoice/';
$this->item_endpoint = API_ROOT.'core/item/';
$this->token = api_request('', 'api-token-auth/', 'POST', array('username'=>$username, 'password'=> $password))['token'];
}
public function get_currencies(){
return api_request($this->token, 'core/currency/')['results'];
}
public function get_units(){
return api_request($this->token, API_ROOT.'core/liquidstockunits/')['results'];
}
public function get_customer_by_id($customer_code){
// Verilen koda gore arama yapar, sonuc bulunursa ilk bulunan musteriyi doner
$response = api_request($this->token, $this->customer_endpoint.'?integration_store_id='.$customer_code);
if (sizeof($response['results'])){
return $response['results'][0];
}
return null;
}
public function create_customer($data){
return api_request($this->token, $this->customer_endpoint, 'POST', $data);
}
public function create_address($data){
return api_request($this->token, $this->customer_address_endpoint, 'POST', $data);
}
public function get_item_by_code($product_code){
// Verilen koda gore arama yapar, sonuc bulunursa ilk bulunan urunu doner
$response = api_request($this->token, $this->item_endpoint.'?product_code='.$product_code);
if(sizeof($response['results'])){
return $response['results'][0];
}
return null;
}
public function create_item($urun_data){
return api_request($this->token, $this->item_endpoint, 'POST', $urun_data);
}
public function create_sale($data){
return api_request($this->token, $this->sale_endpoint, 'POST', $data);
}
public function get_or_create_category($kategori_data){
/*
Verilen datadaki category_code alanina gore sunucuda arama yapar, sonuc bulursa buldugu sonucu, bulamazsa
olusturdugu yeni kategoriyi doner.
*/
$url = API_ROOT.'core/category/';
$response = api_request($this->token, $url.'?category_code='.$kategori_data['category_code']);
if(sizeof($response['results'])){
return $response['results'][0];
} else {
return api_request($this->token, $url, 'POST', $kategori_data);
}
}
public function get_or_create_brand($marka_data){
/*
Verilen datadaki brand_code alanina gore sunucuda arama yapar, sonuc bulursa buldugu sonucu, bulamazsa
olusturdugu yeni markayi doner.
*/
$url = API_ROOT.'core/brand/';
$response = api_request($this->token, $url.'?brand_code='.$marka_data['brand_code']);
if(sizeof($response['results'])){
return $response['results'][0];
} else {
return api_request($this->token, $url, 'POST', $marka_data);
}
}
public function send_invoice($fatura_id, $fatura_tarihi){
$endpoint = $this->invoice_endpoint.'send_invoice_for_sale/?sale_id='.$fatura_id;
if($fatura_tarihi){$endpoint .= '&invoice_date='.urlencode($fatura_tarihi);}
return api_request($this->token, $endpoint, 'POST', []);
}
}
function ornek_fatura_olustur(){
/*
Asagida ortalama bir fatura bilgisi parcalar halinde ve Propars apisindeki alan isimleriyle (urunKodu haric) bulunmakta.
currency ve unit id'leri cok seyrek olarak guncellendigi icin kod icinde kullanilabilir. Degerleri gormek icin
print_r($api_client->get_currencies());
print_r($api_client->get_units());
*/
$api_client = new SiparisClient('[email protected]', 'parola'); # panele giris yapilabilen bir eposta-parola cifti
// $kaynak = 'website' => web sitesinden yapilan satislar icin kullanilir.
// $kaynak = 'store' => Fiziki magazada yapilan satislar icin kullanilir.
$kaynak = 'website';
// kaynak website iken website url girilmelidir, kaynak store iken website_url bos birakilabilir.
$website_url = 'http://orneksiteadi.com';
/*
Odeme yontemleri:
'finance.cash' => Nakit
'finance.payatthedoor' => Kapida odeme
'finance.creditcard' => Kredi karti
'finance.virtualpos' => Sanal pos
'finance.check' => Cek
'finance.eft' => EFT
'finance.voucher' => Senet
'finance.moneyorder' => Havale
*/
$odeme_yontemi = 'finance.virtualpos';
/*
Kargo odeme secenekleri:
's' => "Satıcı öder"
'b' => "Alıcı öder"
'h' => "Elden teslim" (varsayilan deger budur. alan bos gonderilirse siparis elden teslim olarak kaydedilir.)
*/
$kargo_ucreti = 's';
$kargo_kampanya_kodu = '1231212412312312321';
$musteri_data = array(
"name"=> 'Test Müşteri',
"integration_store_id"=> 'abc-123', # musteri kodu
"email"=> "[email protected]",
"telephone_number"=> "02120001122",
"fax_number"=> "",
"city_name"=> "İstanbul",
"district"=> "Avcılar",
"company_title"=> "Firma Ünvanı",
"tax_office"=> "Avcılar", # vergi dairesi
"tax_number"=> "1234567890", # kurumsal musteride bu alana 10 haneli vkn yazilacak
"tc_identity_number"=> "", # bireysel musteride bu alana 11 haneli vkn yazilacak
"customer_type"=> "organizational", # bireyselde individual, kurumsalda organizational
"source"=> $kaynak,
"website_url"=> $website_url
);
$fatura_adres_data = array(
"name"=> "Fatura alıcı adı veya ünvan",
"code"=> "xyz-123", # adres kodu
"telephone_number"=> "02129998877",
"fax_number"=> "",
"city_name"=> "İstanbul",
"district"=> "Avcılar",
"address"=> "Test mahallesi. Test sokak. No: 1"
);
$fatura_data = array(
'source'=> $kaynak,
'website_url'=> $website_url,
'order_number' => '012345678a', // secmeli alandir, bos birakilabilir
'customer'=> "<asagida tespit edilen musteri'nin id'si ile doldurulacak>",
'billing_address'=> "<asagida tespit edilen fatura_adresi'nin id'si ile doldurulacak>",
'order_date'=> '2017-07-01T09:00:00+0300',
'notes'=> 'Fatura notları serbest metin',
'currency'=> 1,
'box'=> 'SENTBOX', # SENTBOX: Giden fatura, INBOX: Gelen fatura (varsayilani SENTBOX)
'einvoice_type' => 'SATIS',
'einvoice_profile' => 'TEMELFATURA',
'payment_method_model' => $odeme_yontemi,
'cargo_payment' => $kargo_ucreti,
'items'=> [
[
'product_name'=> 'Test Ürünü 1',
'urunKodu'=> 'abc-321---', # sunucuya fatura icinde gonderilmeyecek, urun tespiti icin asagida kullaniliyor
'price'=> '123.45', # decimal birim fiyat
'quantity'=> '10', # integer miktar
'vat_rate'=> '18', # kdv orani
'discount_rate'=> '10', # iskonto orani,
'unit'=> 1,
'cargo_campaign_code'=> $kargo_kampanya_kodu, // urune ozel kod da girilebilir
],
[
'product_name'=> 'Test Ürünü 2',
'urunKodu'=> 'abc-321-2---', # sunucuya gonderilmeyecek, urun tespiti icin asagida kullaniliyor
'price'=> '10.00', # decimal birim fiyat
'quantity'=> '1', # integer miktar
'vat_rate'=> '8', # kdv orani
'discount_rate'=> '0', # decimal iskonto orani,
'unit'=> 1,
'cargo_campaign_code'=> $kargo_kampanya_kodu // urune ozel kod da girilebilir
]
]
);
# Urunler icin urun kodu mevcutsa sunucuda kodla arama yapilir ve bulunan urun fatura ile eslenerek stok takibi vb.
# islemleri yapilabilir. Urun kodunuz yoksa bu adimi atlabilirsiniz ve faturada sadece urun adi (product_name) kullanabilirsiniz.
# Baska bir deyisle, fatura urunu icin 'item' alani zorunlu degildir, 'product_name' alani yeterlidir.
foreach ($fatura_data['items'] as $fatura_urunu) {
// product_code okunur ve fatura_urunu'nden silinir.
$product_code = $fatura_urunu['urunKodu'];
unset($fatura_urunu['urunKodu']);
$item = $api_client->get_item_by_code($product_code);
if($item){
$fatura_urunu['item'] = $item['id'];
} else {
# Yine dilerseniz fatura urunlerinizi stok olarak kaydedebilirsiniz. Ancak bu durumda kategori ve marka
# bilgisine ihtiyac duyulacaktir.
$kategori_data = ['category_name'=> 'Genel', 'category_code'=> 'genel'];
$marka_data = ['brand_name'=> 'Genel', 'brand_code'=> 'genel'];
$urun_data = $fatura_urunu; # fatura urunu icerigine sahip yeni bir obje uretir
$urun_data['product_code'] = $product_code;
$urun_data['currency'] = 1;
# quantity alaninin adini amount ile degistiriyoruz
$urun_data['amount'] = $urun_data['quantity'];
unset($urun_data['quantity']);
# vat_rate alaninin adini tax_rate ile degistiriyoruz
$urun_data['tax_rate'] = $urun_data['vat_rate'];
unset($urun_data['vat_rate']);
$urun_data['category'] = $api_client->get_or_create_category($kategori_data)['id'];
$urun_data['brand'] = $api_client->get_or_create_brand($marka_data)['id'];
$item = $api_client->create_item($urun_data);
$fatura_urunu['item'] = $item['id'];
}
}
# 1) Musteri koduna gore musteri tespiti
# NOT: musteri kodunuz yoksa bu alani atlayabilirsiniz ancak her fatura icin yeni musteri olusturulacaktir
$musteri = $api_client->get_customer_by_id($musteri_data['integration_store_id']);
if(!$musteri){
# musteri koduna gore sunucuda musteri bulunamadi ise yeni musteri olusturulur
# NOT: (musteri kodunuz yoksa bu adimdan baslayabilrsiniz)
# billing_address alani kullanilarak, yeni musteri olusturulurken fatura adresi ile beraber olusturulur
$musteri_data['billing_address'] = $fatura_adres_data;
$musteri = $api_client->create_customer($musteri_data);
$fatura_adresi = $musteri['billing_address'];
} else {
# Musteri kodunuz mevcutsa ve sunucuda o kodla eslesen musteri bulunmus ise buraya girilecektir. Burada,
# yukarida mevcut musterilerden getirilmis olan musteri verisinin icinde 'addresses' keyi ile bir adres listesi
# gelecektir. Bu liste icindeki adreslerde ele alinan adres kodu (fatura_adres_data['code']) ile eslesen
# adres aranir, bulunamazsa yeni adres olusturulur.
$fatura_adresi = null;
foreach($musteri['addresses'] as $_musteri_adres){
if($_musteri_adres['code'] == $fatura_adres_data['code']){
$fatura_adresi = $_musteri_adres;
break;
}
}
if($fatura_adresi === null){
$fatura_adres_data['customer'] = $musteri['id'];
$fatura_adresi = $api_client->create_address($fatura_adres_data);
}
}
$fatura_data['customer'] = $musteri['id'];
$fatura_data['billing_address'] = $fatura_adresi['id'];
$fatura_siparis = $api_client->create_sale($fatura_data);
# olusturulan faturayi efatura/earsiv olarak gonderebilmek icin son bir api istegi yapilir
$fatura_tarihi = '2017-07-01T09:00:00+0300'; // null verilirse siparis tarihi, fatura tarihi olarak kullanilir.
$fatura = $api_client->send_invoice($fatura_siparis['id'], $fatura_tarihi);
print_r($fatura);
}
ornek_fatura_olustur();
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment