Skip to content

Instantly share code, notes, and snippets.

@harslannet
Last active September 8, 2021 08:58
Show Gist options
  • Save harslannet/0b6461e3b916d732689bbe4cc3447269 to your computer and use it in GitHub Desktop.
Save harslannet/0b6461e3b916d732689bbe4cc3447269 to your computer and use it in GitHub Desktop.
Woocommerce ödeme sayfasında bireysel müşteriler için T.C. numarası kurumsal müşteriler için vergi numarası alanını ekleme.
<?php
/*
* Çalışma koşulu şu şekilde;
* Ödeme ekranına geldiğinde müşteri varsayılan olarak T.C. alanını görecek ama araştırdığım ve öğrendiğim kadarıyla sadece 5000 TL ve üstü siparişler için T.C. numarası zorunluymuş bu yüzden zorunlu olmayacak.
* Zorunlu olmamasına rağmen eğer müşteri buraya yanlış bir T.C. yazarsa doğrulamadan geçecek ve eğer yazmak istemiyorsa boş bırakması için uyarı mesajı gelecek
* Eğer firma adına fatura isterse Kurumsal Sipariş Checkbox'ını işaretleyerek T.C. alanı gizlenecek ve vergi dairesi ile vergi numarası alanı gözükecek ve bu alanlar zorunlu olacak
* Not: T.C. numarası ve Vergi Numarası doğrulamadan geçiyor.
* Eksikler: T.C. Numarasını boş bırakabildikleri için veri tabanına o sipariş için 11111111111 yazdırmayı başaramadım. ->
* Ama 147. satırdaki kod sipariş ekranında bu bilgiyi gösteriyor, bunu nasıl yaparız bilen varsa yazsın ->
* Aslında 'default' => 11111111111 ile veritabanına bunu yazdırabilirim ama bunu set edince sipariş ekranında bu numaranın gözükmesi hoşuma gitmiyor.
*/
//T.C. No, Vergi No ve Vergi Dairesi Alanlarını Oluştur
add_filter('woocommerce_checkout_fields', 'tc_vergi_icin_new_checkout_field');
function tc_vergi_icin_new_checkout_field($fields)
{
$fields['billing']['checkbox_trigger'] = array(
'type' => 'checkbox',
'priority' => 8,
'label' => __('Kurumsal Sipariş', 'woocommerce'),
'class' => array('form-row-wide'),
'clear' => true
);
$fields['billing']['billing_vergi_dairesi'] = array(
'label' => __('Vergi Dairesi', 'woocommerce'),
'placeholder' => _x('Vergi Dairesi', 'placeholder', 'woocommerce'),
'class' => array('form-row form-row-first'),
'required' => true,
'priority' => 31,
'clear' => true
);
$fields['billing']['billing_vergi_nosu'] = array(
'label' => __('Vergi No', 'woocommerce'),
'placeholder' => _x('Vergi No', 'placeholder', 'woocommerce'),
'class' => array('form-row form-row-last'),
'required' => true,
'priority' => 32,
'clear' => true
);
$fields['billing']['shipping_tc'] = array(
'label' => __('TC Kimlik No', 'woocommerce'),
'placeholder' => _x('5.000,00 TL üzeri alışverişlerde zorunludur', 'placeholder', 'woocommerce'),
'class' => array('form-row-wide'),
'priority' => 9,
'clear' => true
);
if (!isset($_POST['checkbox_trigger'])) {
$fields['billing']['shipping_tc']['required'] = false;
$fields['billing']['billing_company']['required'] = false;
$fields['billing']['billing_vergi_dairesi']['required'] = false;
$fields['billing']['billing_vergi_nosu']['required'] = false;
} else {
$fields['billing']['shipping_tc']['required'] = false;
$fields['billing']['billing_company']['required'] = true;
$fields['billing']['billing_vergi_dairesi']['required'] = true;
$fields['billing']['billing_vergi_nosu']['required'] = true;
}
return $fields;
}
// Vergi No Doğrulama Fonksiyonu
function validateTaxNo($taxNo)
{
if (strlen($taxNo) == 10) {
for ($i = 0; $i < 9; $i++) {
$v[$i + 1] = ($taxNo[$i] + (9 - $i)) % 10;
$vv[$i + 1] = ($v[$i + 1] * pow(2, (9 - $i))) % 9;
$vv[$i + 1] = ($v[$i + 1] != 0 && $vv[$i + 1] == 0) ? 9 : $vv[$i + 1];
}
$sum = array_sum($vv);
$sum = ($sum % 10 == 0) ? 0 : (10 - ($sum % 10));
return ($sum == $taxNo[9]) ? true : false;
}
return false;
}
// TC Doğrula Fonksiyonu
function isTcKimlik($tc)
{
// Array içindeki denemeler tc kriterine uyduğu için hariç tuttuk.
$exclude = array('11111111110', '22222222220', '33333333330', '44444444440', '55555555550', '66666666660', '7777777770', '88888888880', '99999999990'); //Bunlar aşağıdaki fonksiyonu yanıltan numaralar dilerseniz kaldırabilirsiniz satırı.
if (in_array($tc, $exclude)) {
return false;
}
if (strlen($tc) < 11) {
return false;
}
if ($tc[0] == '0') {
return false;
}
$plus = ($tc[0] + $tc[2] + $tc[4] + $tc[6] + $tc[8]) * 7;
$minus = $plus - ($tc[1] + $tc[3] + $tc[5] + $tc[7]);
$mod = $minus % 10;
if ($mod != $tc[9]) {
return false;
}
$all = 0;
for ($i = 0; $i < 10; $i++) {
$all += $tc[$i];
}
if ($all % 10 != $tc[10]) {
return false;
}
return true;
}
// TC Kimlik Noyu Doğrula
add_action('woocommerce_checkout_process', 'tc_numara_dogrula');
function tc_numara_dogrula()
{
$tcno = $_POST['shipping_tc'];
if (!empty($tcno)) {
if (!is_numeric($tcno) && !isset($_POST['checkbox_trigger'])) {
wc_add_notice(__('T.C alanına lütfen sayısal bir değer girin yada siparişiniz 5.000,00 TL den küçük ise boş bırakın.'), 'error');
} else if (!empty($tcno) && !isset($_POST['checkbox_trigger'])) {
if (!isTcKimlik($tcno))
wc_add_notice(__('Lütfen doğru bir TC kimlik no girin yada siparişiniz 5.000,00 TL den küçük ise boş bırakın.'), 'error');
}
}
}
// Vergi Noyu Doğrula
add_action('woocommerce_checkout_process', 'vergi_no_dogrula');
function vergi_no_dogrula()
{
$vergiNo = $_POST['billing_vergi_nosu'];
if (isset($_POST['checkbox_trigger'])) {
if (!empty($vergiNo) && !empty($_POST['billing_company'])) {
if (!validateTaxNo($vergiNo))
wc_add_notice(__('Lütfen Doğru Bir Vergi No Girin.'), 'error');
}
}
}
//Adminin Sipariş Detayında Fatura Bilgilerinde TC No ve Vergi Dairesi Görebilmesi İçin
add_action('woocommerce_admin_order_data_after_billing_address', 'vergi_no_dairesi', 10, 1);
function vergi_no_dairesi($order)
{
if (get_post_meta($order->get_id(), '_billing_company', true) == null) {
if (get_post_meta($order->get_id(), '_shipping_tc', true) == null) {
echo '<p><strong>' . __('TC Kimlik No') . ':</strong> ' . 11111111111 . '</p>';
} else {
echo '<p><strong>' . __('TC Kimlik No') . ':</strong> ' . get_post_meta($order->get_id(), '_shipping_tc', true) . '</p>';
}
} else {
echo '<p><strong>' . __('Vergi Dairesi') . ':</strong> ' . $vergiDaire = get_post_meta($order->get_id(), '_billing_vergi_dairesi', true) . '</p>';
echo '<p><strong>' . __('Vergi No') . ':</strong> ' . $vergiNum = get_post_meta($order->get_id(), '_billing_vergi_nosu', true) . '</p>';
}
}
//Koşullara göre alanları göstermek için gerekli javascript kodları
add_action('woocommerce_after_checkout_form', 'kosullu_alan_goster', 6);
function kosullu_alan_goster()
{
?>
<script type="text/javascript">
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_vergi_nosu').hide();
jQuery('#billing_company').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery('#billing_vergi_nosu_field > label').hide();
jQuery('#billing_company_field > label').hide();
jQuery("#billing_company_field > label > span").remove();
jQuery("#billing_company_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");
jQuery("#billing_vergi_dairesi_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");
jQuery("#billing_vergi_nosu_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");
jQuery('input#checkbox_trigger').change(function() {
if (this.checked) {
jQuery('#shipping_tc_field > label').hide();
jQuery('#shipping_tc').hide();
jQuery('#billing_vergi_dairesi').fadeIn();
jQuery('#billing_company').fadeIn();
jQuery('#billing_vergi_nosu').fadeIn();
jQuery('#billing_vergi_dairesi_field > label').fadeIn();
jQuery('#billing_vergi_nosu_field > label').fadeIn();
jQuery('#billing_vergi_dairesi_field > label > span').remove();
jQuery('#billing_vergi_nosu_field > label > span').remove();
jQuery('#billing_vergi_dairesi_field').addClass('validate-required');
jQuery('#billing_company_field > label').fadeIn();
jQuery('#billing_company_field').addClass('validate-required');
jQuery('#billing_vergi_nosu_field').addClass('validate-required');
} else {
jQuery('#billing_vergi_dairesi').fadeOut();
jQuery('#billing_vergi_dairesi_field > label').fadeOut();
jQuery('#billing_vergi_dairesi').fadeOut();
jQuery('#billing_vergi_nosu').fadeOut();
jQuery('#billing_vergi_dairesi_field > label').fadeOut();
jQuery('#billing_vergi_nosu_field > label').fadeOut();
jQuery('#shipping_tc_field > label').fadeIn();
jQuery('#shipping_tc').fadeIn();
jQuery('#billing_company').fadeOut();
jQuery('#billing_company_field > label').fadeOut();
}
});
</script>
<?php
}
@ogzmsl
Copy link

ogzmsl commented Jan 9, 2020

Bu kodları denedim çalışıyor teşekkürler. Bir sorum daha var bu eklediklerimiz hesap kısmında editleyebileceğimiz ve mail bilgilerine nasıl entegre edebiliyoruz?

@harslannet
Copy link
Author

Bu kodları denedim çalışıyor teşekkürler. Bir sorum daha var bu eklediklerimiz hesap kısmında editleyebileceğimiz ve mail bilgilerine nasıl entegre edebiliyoruz?

admin tarafında düzenlenebilir alanlar olarak görme kısmına hiç kafa patlatmamıştım, şurada bu konu ile ilgili bilgiler var; https://stackoverflow.com/questions/51164248/editable-admin-custom-billing-fields-error-issue-in-woocommerce-3/51164431#51164431

Sipariş e-postalarında bu alanları görmek için;
Woocommerce > Ayarlar > E-Postalar bölümüne gelin.

Ardından "Yeni sipariş" e-postasını tıklayın, açılan sayfada "Dosyayı temaya kopyalayın" diye bir buton var buna tıklayın ve düzenleme yapabilir hale gelsin.

Şablona gözat'a tıklayın ve örneğin T.C. numarasını görmek için resimde ikinci satırdaki kodu ekleyin ; https://pasteboard.co/Hw4D1v4.jpg

@ogzmsl
Copy link

ogzmsl commented Jan 22, 2020

üstad bir konuyu yapamıyorum. yardımcı olabilmen mümkün mü çok uğraştım ama sonuç vermedi kimlik no'yu zorunlu yaptım böyle bi istek oldu. kurumsal siparişe basınca tc no gidiyor ama validate ediyor hide olduğunda zorunlu olmaması vs veritabanına hiç bişey göndermemek gerektiriyor ancak sadece hide olduğundan arkada tc no girmeyi zorunlu kılıyor. Javascript koşullu göstermede ne yaptıysam olmadı sana ulaşabileceğim bi kanal varsa gösterebilirim.

@harslannet
Copy link
Author

harslannet commented Jan 23, 2020

üstad bir konuyu yapamıyorum. yardımcı olabilmen mümkün mü çok uğraştım ama sonuç vermedi kimlik no'yu zorunlu yaptım böyle bi istek oldu. kurumsal siparişe basınca tc no gidiyor ama validate ediyor hide olduğunda zorunlu olmaması vs veritabanına hiç bişey göndermemek gerektiriyor ancak sadece hide olduğundan arkada tc no girmeyi zorunlu kılıyor. Javascript koşullu göstermede ne yaptıysam olmadı sana ulaşabileceğim bi kanal varsa gösterebilirim.

Merhaba,
tc_numara_dogrula fonksiyonunu şu şekilde düzenleyin;
function tc_numara_dogrula(){ $tcno = $_POST['shipping_tc']; if (!isset($_POST['checkbox_trigger']) && !isTcKimlik($tcno)) { wc_add_notice(__('Bireysel siparişlerde T.C. kimlik alanı zorunludur, Lütfen doğru bir T.C. kimlik no girin.'), 'error'); } }

Jquery'de koşuldan önceki kısıma da şunları ekleyin (bu sadece görüntünün düzgün olması için)
jQuery("#shipping_tc_field > label > span").remove(); jQuery("#shipping_tc_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");

Son olarak $fields['billing']['shipping_tc'] deki placeholder'ı da istediğiniz şekilde düzenleyin şu anda 5000 TL üzeri zorunlu gibi bir şey yazıyor.

@ogzmsl
Copy link

ogzmsl commented Jan 31, 2020

üstad bir konuyu yapamıyorum. yardımcı olabilmen mümkün mü çok uğraştım ama sonuç vermedi kimlik no'yu zorunlu yaptım böyle bi istek oldu. kurumsal siparişe basınca tc no gidiyor ama validate ediyor hide olduğunda zorunlu olmaması vs veritabanına hiç bişey göndermemek gerektiriyor ancak sadece hide olduğundan arkada tc no girmeyi zorunlu kılıyor. Javascript koşullu göstermede ne yaptıysam olmadı sana ulaşabileceğim bi kanal varsa gösterebilirim.

Merhaba,
tc_numara_dogrula fonksiyonunu şu şekilde düzenleyin;
function tc_numara_dogrula(){ $tcno = $_POST['shipping_tc']; if (!isset($_POST['checkbox_trigger']) && !isTcKimlik($tcno)) { wc_add_notice(__('Bireysel siparişlerde T.C. kimlik alanı zorunludur, Lütfen doğru bir T.C. kimlik no girin.'), 'error'); } }

Jquery'de koşuldan önceki kısıma da şunları ekleyin (bu sadece görüntünün düzgün olması için)
jQuery("#shipping_tc_field > label > span").remove(); jQuery("#shipping_tc_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");

Son olarak $fields['billing']['shipping_tc'] deki placeholder'ı da istediğiniz şekilde düzenleyin şu anda 5000 TL üzeri zorunlu gibi bir şey yazıyor.

teşekkür ederim baya uğraştırdı ama son verdiğiniz kodu içeriye entegre ettim bazı noktalarda hatalar alıyorum onlarıda düzeltirim sağolun :)

@selqs
Copy link

selqs commented May 30, 2020

merhaba, tc kimlik numarayı sürekli zorunlu hale getirmeye çalıştım olmadı. ancak ondan önce de vergi dairesi zorunlu olduğu halde boş bırakarak adım geçebiliyorum zorunlu yapmak için ne yapmam gerekir?

@leventkaramanoglu
Copy link

Merhaba, kodunuzdan faydalandım, gayet güzel çalışıyor. Fakat kodu kullandıktan sonra iki eksiklik gözüme çarptı
1-Kurumsal Faturayı seçtiğimizde ad soyad bölümünün kalkması ve zorunlulukdan çıkması gerekiyor. kurumsal için firma adı, vergi dairesi ve no bölümü yeterli
2-hesabım bölümündeki adres bölümünü düzenlerken aynı yapının orada da çalışması daha güzel olacaktır.

  1. ve 2. maddedeki işlemleri nasıl yapabiliriz? Emeğiniz için çok teşekkürler

@holymong
Copy link

holymong commented Oct 4, 2020

Merhaba,

Paylaştığınız kodu editleyerek kendim kullandım çok işime yaradı teşekkür ediyorum. Eksikleri de büyük oranda kapattım ihtiyacı olanlar aşağıdaki linkten bakabilir.

https://gist.github.com/holymong/6747e622b186dbc78459ce1b26c6bf5e

@harslannet
Copy link
Author

Merhaba,

Paylaştığınız kodu editleyerek kendim kullandım çok işime yaradı teşekkür ediyorum. Eksikleri de büyük oranda kapattım ihtiyacı olanlar aşağıdaki linkten bakabilir.

https://gist.github.com/holymong/6747e622b186dbc78459ce1b26c6bf5e

Elinize sağlık

@holymong
Copy link

holymong commented Oct 5, 2020

Merhaba,
Paylaştığınız kodu editleyerek kendim kullandım çok işime yaradı teşekkür ediyorum. Eksikleri de büyük oranda kapattım ihtiyacı olanlar aşağıdaki linkten bakabilir.
https://gist.github.com/holymong/6747e622b186dbc78459ce1b26c6bf5e

Elinize sağlık

Sizinde elinize sağlık. Kodu tekrar revize ettim son haliyle fazlasıyla kullanışlı.

@ned-bs
Copy link

ned-bs commented Jun 17, 2021

Ellerinize sağlık çok temiz olarak çalışıyor. Kodda ufak bir değişiklik yaptım.

Bu değişiklik ile kurumsal sipariş seçilirse veritabanına sipariş tipi olarak kurumsal, seçilmezse bireysel yazıyor.
Aynı bilgiyi admin panelde de gösteriyor.
Böylece hem tc hem de vergi no girmiş olan biri faturasını nasıl istiyor anlayabiliyoruz.

Ayrıca bireysel siparişte vergi no'yu zorunlu yaptım. Aynı kişi ay içinde toplamda 5000 tl yi geçerse gene tc kimlik istiyor maliye.

Kodları yapıştırdığımda hatalı çıkıyor. Bu yüzden eklenti olarak yapıp şuraya yükledim.
https://1drv.ms/u/s!AvgroyWJuB7Hsy3PAIKN9kfh6fXV?e=5dSpLz

@harslannet
Copy link
Author

harslannet commented Jun 18, 2021

Ellerinize sağlık çok temiz olarak çalışıyor. Kodda ufak bir değişiklik yaptım.

Bu değişiklik ile kurumsal sipariş seçilirse veritabanına sipariş tipi olarak kurumsal, seçilmezse bireysel yazıyor.
Aynı bilgiyi admin panelde de gösteriyor.
Böylece hem tc hem de vergi no girmiş olan biri faturasını nasıl istiyor anlayabiliyoruz.

Ayrıca bireysel siparişte vergi no'yu zorunlu yaptım. Aynı kişi ay içinde toplamda 5000 tl yi geçerse gene tc kimlik istiyor maliye.

Yaptığınız değişikliği paylaştığınız için teşekkürler, bu şekilde bir ihtiyacı olanlar faydalanacaktır.

@bulentsakarya
Copy link

Hesabım sayfasında bulunan Fatura adresi kısmına bu değerleri nasıl getirebiliriz? Orada çıkmıyor değerler.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment