4 byte UTF-8 characters with Symfony2 – Doctrine and MySQL

It’s been years since I was not using MySQL. But one of my partners using MySQL to make some calculations with data and I needed to use it as default database.

Everything was good until I got an error with some emojis. It was telling something like

After making some search, I added these two commands to docker-composer.yml to be sure mysql-side is okay.

But Symfony was still giving the same error and after reading lots of useless Stackoverflow questions & answers -and also Drupal pages, I found a blog post which saved me from cleaning 4byte characters before saving them to db.

Here’s the additional config for doctrine:

 

AWS’den Ayrılış

Artan altyapı kapasite ihtiyaçlarımız, yüksek veri transfer hacimleri, diğer servis sağlayıcılarla birleştiğinde devasa hale gelen sunucu miktarları ve tüm bunları x3.6 ile çarparak maliyetlendirmemize sebep olan Dolar kuru sebebiyle AWS’deki ağırlığımızı azaltarak kendi dedicated sunucularımıza taşınmaya başladık. Bir açıdan iş; kiradan çıkıp, mal sahibi olmaya dönmüş olsa da AWS’yi bırakmak insanı üzüyor.

Drop Duplicated Documents in MongoDB 3+

As you may already know, when defining unique indexes, mongodb does not support dropDups option anymore. And this is a reasonable decision. But you may still need to drop duplicated records on your collections. Here’s an aggregation to do that:

Assume that our key name with having duplicated value is FIELD.

Please try this aggregation on a non-production collection first. This aggregation removes data irreversibly.

This aggregation gets duplicated documents with given key, keeps the first matching document and removes others.

P.S.: Use this method with your own responsibility. You may remove duplicated documents with critical data and left less-critical one.

İnternet Girişimleri için Amortisman ve Demirbaş Olayları

Önceki yazımda girişimler için, işletmeye demirbaş kaydedilerek gelir vergisi üzerinden amortisman düşülebilecek bir kaç ana kalemden bahsetmiştim. Gelir İdaresi Başkanlığının yayınladığı amortisman oranları listesini inceledikten sonra ~30 kalemlik, girişimlerin işine yarayacak bir amortisman listesi özeti çıkardım. Hem ofis ihtiyaçları, hem elektronik ve dijital ihtiyaçları içeren liste şu şekilde,

Açıklama Faydalı Ömür (Yıl) Amortisman (Yıllık Yüzde)
İşyerinde Kullanılan Mobilyalar, Ekipmanlar ve Diğer Demirbaşlar: Bu sınıf, masa,
mobilya, sandalye, banko, kontuar, dolap ve ofiste kullanılan iletişim araçları gibi
kıymetler ile işletmelerde müşteriler için tahsis edilen oturma gruplarını kapsar.
(Başka bir sınıflamada yer alan iletişim araçları hariç)
5 20.00%
Televizyonlar 5 20.00%
Cep telefonu ve cep telefonu araç kiti 3 33.33%
Pencere, duvar ve salon tipi klima cihazları 15 6.67%
Buzdolabı, derin dondurucu ve bunlara benzer soğutma dolapları 10 10.00%
Kesintisiz güç kaynakları (Statik ve dinamik UPS) 10 10.00%
Perde, güneşlik, store ve teferruatı ve benzerleri ile yatakhane ve yemekhane
eşyası
5 20.00%
POS cihazları 5 20.00%
Fotoğraf makineleri ve kamera 5 20.00%
Teleks ve data modem cihazları, data terminal ara birim
cihazları, interaktif telekontrolsistemleri, network yan bileşenleri, veri iletişim
sistemleri, plaka tanıma sistemi v.b.
5 20.00%
Telsiz telefon, telsiz telgraf veya radyo yayını alıcı cihazlar ve bunlara ait sistemler 10 10.00%
Video kayıt ve gösterme cihazları, müzik seti, dijital ve diğer ses kaydediciler, amplifikatör, ekolayzır, ses mikser cihazları, uydu antenleri ve uydu alıcı cihazları, uzaktan kumanda cihazlar v.b. 5 20.00%
Projeksiyon cihazları, slayt makinesi, tepegöz, sinema film makinesi, video konferans cihazı, stüdyo tipi veya mobil olarak kullanılan alıcı cihazları v.b. 5 20.00%
Bilgi işlem makinelerinde kullanılan ses, TV, radyo ve görüntü faks modemleri 5 20.00%
Gaz, yangın, güvenlik ve benzeri amaçlarla kullanılan alarm cihazları 8 12.50%
Süs bitkileri 5 20.00%
Su arıtma cihazları 5 20.00%
İşletmelerde kullanılan el, yüz ve banyo havluları, yatak çarşafları ve yastık kılıfları, masa örtüleri, plato ve her nevi peçeteler ve benzerleri 2 50.00%
Kişisel bilgisayarlar, el bilgisayarları (PDA), sunucu bilgisayarlar (Server) 4 25.00%
Bilgisayar Donanımları: Kart okuyucular, kart deliciler, kart seçiciler, manyetik
teyp üniteleri, yüksek hızlı yazıcılar, optik karakter okuyucular, yüksek saklama
kapasitesine sahip üniteler, kağıt bant donanımı, kağıt ve bantlara bilgi kaydeden
klavyeli makineler, yazıcılar, terminaller, teyp sürücüleri, disk sürücüleri, görsel
imaj koruyucu tüpleri ve benzeri araçlar (Eğlence amaçlı kullanılan ekipmanlar bu
sınıfa girmez)
4 25.00%
Bilgisayar yazılımları 3 33.33%
Router (yönlendirici), swicth (anahtarlama birimi), data kablolaması ve bağlantı
elemanları, UPS kablolama ve bağlantı elamanları
5 20.00%
Elle Veri İşlenen Araçlar: Daktilo, hesap makinesi, para sayma makineleri, fotokopi makineleri, faks cihazları, kopyalayıcı ekipmanlar ve benzerleri 5 20.00%
Otomobiller ve taksiler (Jipler ve arazi taşıtları dahil) 5 20.00%
Motosikletler (Mopedler ve Triportörler dahil) 4 25.00%
Bisikletler ve at arabaları 4 25.00%
Uçak ve helikopterler 10 10.00%
Tanıtım ve Dağıtımla İlgili Ticari Faaliyet ve Hizmetler 10 10.00%
Gayri Maddi İktisadi Kıymetler: İmtiyaz hakları (Franchising), patent, formül,
dizayn, örnek kalıp, teknik bilgi (Know-how), format, telif hakkı ve benzeri
kalemler, lisans, kullanım hakkı ve izni veya devlet kurum ve kuruluşları
tarafından verilen diğer haklar (İşletme hakkı gibi) ve bunların benzerleri
15 6.67%
Reklam panoları ve billboardlar (ışıklı) 5 20.00%
Reklam panoları ve billboardlar (Işıksız) 10 10.00%
Araştırma-Geliştirme harcamaları [** Mükelleflerin 5520 sayılı Kurumlar Vergisi ve 193 sayılı Gelir Vergisi Kanunlarında yer alan, “mükelleflerin işletmeleri bünyesinde gerçekleştirdikleri münhasıran yeni teknoloji ve bilgi arayışına yönelik araştırma ve geliştirme harcamaları” kapsamında işletmeleri bünyesinde
gerçekleştirdikleri araştırma ve geliştirme faaliyetleri neticesinde, gayri maddi hak niteliğinde aktifleştirilmesi gereken bir kıymete ulaşılması halinde, gayrimaddi hakka yönelik olarak yaptıkları araştırma ve geliştirme harcamaları bu sınıf uyarınca itfa edilecektir. Ancak, mezkur
Kanunlar kapsamında ar-ge faaliyeti olarak değerlendirilmeyen, mükelleflerin işletmeleri bünyesinde gerçekleştirmedikleri, dışarıdan hizmet satın alma yoluyla veya benzeri şekilde gerçekleştirdikleri gayri maddi hakka yönelik harcama tutarları, iktisap edilen veya yapılan araştırmalar
sonucu ortaya çıkan kıymetin niteliğine göre (patent, formül, dizayn, örnek kalıp vb.), 339 ve 365 Sıra Numaralı Vergi Usul Kanunu Genel Tebliğleri ile değişik 333 Sıra Numaralı Vergi Usul Kanunu Genel Tebliği ekindeki listenin “55. Gayri Maddi İktisadi Kıymetler” sınıfı uyarınca itfa
edilecektir.]
5 20.00%

İşe helikopterle giden girişimcilerin İstanbul’daki varlığını da hesaba katınca, listede yer vermeden duramadım.

 

Muhasebe ve Finans Bilmeyen Girişimcilere Altın Öğretiler

Muhasebe ve finans cahili bir girişimciyim. Bu yüzden ki, yaklaşık üç yıldır neredeyse hiçbir masrafını vergiden düşmemiş %99.997 karlı bir işletme sahibiyim. Ödediğim vergilere bakınca kafamı vuracak duvar arıyorum. Zira, can yakıcı boyutlara ulaşmış vergi tahakkuklarıyla geleneksel olarak, aylık kdv ve üçer aylık geçici vergi dönemlerinde cebelleşip duruyorum. Canıma tak eden bir dizi olay sonucunda, işe el atıp nedir/ne değildirlere giriştim. Altın değerindeki kurallar ve faydalar şu şekilde,

  • Halkbank Kobi, demirbaş/hammadde alımlarında 30.000 TL’ye kadar işletmelere %0 faizli kredi veriyor. Tek yapmanız gereken Esnaf Odası sicil belgeniz ve vergi levhanızla başvurmak.
  • İşinizde kullanacağınız bilgisayarı demirbaş olarak aldığınızda %18 KDV ödemenizden ve %20 gelir verginizden düşülüyor. Buraya kadar bildiğimiz kısmı. Çoğunlukla bilmediğimiz kısmı ise devam eden dört yıl boyunca daha gelir vergisinden %20 amortisman düşerek, 5 sene sonunda bilgisayarınızın tamamını vergilerle ödemiş oluyorsunuz.
  • Cep telefonunu da demirbaş olarak kaydettiğinizde amortisman durumu geçerli oluyor. 3 sene boyunca %33.3 amortisman hakedişi var. Ancak Büyük Mükellefler VD’nin özelgesine göre 4 sene ve %25.
  • Ofis masası, koltuğu aynı şekilde demirbaş olarak kaydedilebiliyor.
  • Yemek kartlarını (ticket, sodexo, multinet, setcard.. vs) bir kişi için dahi alabiliyorsunuz. Bu da, yediğiniz içtiğiniz (tabii ki kartın geçerli olduğu noktalardaki, şanslıysanız geçerli olduğu marketlerdeki) her şeyin verginizden düşmesi anlamına geliyor.
  • Yurtdışı harcamalarını, KDV-2 beyannamesi ile girerek, KDV’sini ödüyorsunuz ve böylece masraf kalemlerinize dahil edebiliyorsunuz. Facebook reklamları, Google İşletme hizmetler, AWS, DigitalOcean.. vs. gibi tüm harcamalarınızı bu kaleme dahil edebiliyorsunuz. Çıkan KDV, ödeyeceğiniz toplam KDV’den ay sonu hesabında aynı yurt içi harcamalarında olduğu gibi düşüyor.
  • Ola ki yaparsanız, Bağkur ödemeleriniz de aynı şekilde gelir verginizden senelik olarak düşüyor.
  • Bireysel emeklilik ödemelerini taze araştırıyorum. Güncelleyeceğim.

Sağlıcakla ve kârlılıkla kalın.

Block Disposable Emails with Symfony, Doctrine and MongoDB

If you want your users to use their real email addresses when registering to your app, there are a few ways to do this. The most effective way to do this is sending a confirmation email and after activating their accounts. And also, if you want to make some validations before sending activation email you can use MX records validation or host validation of domain with using Symfony’s email validator.

But even if the given email is valid and confirmation email reaches the user, you may also want your users to use their real email addresses. One way to increase the possibility of real email addresses is to block disposable email providers. In this post I will try to explain how to block disposable email addresses on your forms with Symfony.

What we need

  • Symfony
  • FoS User Bundle
  • Doctrine ODM
  • DoctrineFixturesBundle

The steps we will follow

  1. Create Doctrine documents
  2. Load disposable domains to MongoDB
  3. Create a custom email validator
  4. Define our custom email validator as service (we need this to connect MongoDB from validator)
  5. Add our validation rule to our form

1. Create Doctrine Documents

We will use MongoDB to check if user’s email domain is in our list. So, we need to create the Document.

And create getters and setters with running this command:

2. Load Disposable Email Domains to MongoDB

We will use DoctrineFixturesBundle to load our domain data. If you don’t have this bundle or don’t know about it, you can read about it here.

We will first get the domain list from this gist and load it to our disposable_email_domains collection in MongoDB.

3. Create Custom Email Validator

You can learn more about custom validators in Symfony here. We will split user’s email address from “@” symbol and check if the domain is in our list. Since we have our list on MongoDB, we need to use Doctrine. So, to provide Doctrine dependency to our custom validator we need to define our validator as service. I will explain this next step.

Let’s create our Custom Email Constraint

And here’s our validator

4. Define our custom email validator as service

As I mentioned before, custom validators don’t support dependencies. To provide our Doctrine dependency we need to define our validator as service.

5. Add disposable email blocker to forms

Finally, add custom email validator to all forms you ask for email address. Here’s how to apply it to my registration form. It only has email and password fields.

The trick is to add our custom validator’s namespace and add the validator to email address field’s annotation

And again, create getters and setters:

Regex Password Strength Chek

We always need our users to create strength passwords. To check their password if it’s strength with regular expressions is very easy.

Here are the explanations,

  • (?=.*[A-Z]) check for uppercase letters
  • (?=.*[!@#$&*]) check for special characters
  • (?=.*[0-9]) check for digits
  • (?=.*[a-z]) check for lowercase letters
  • {8,50} length must be at least 8 characters and max 50 characters long

If you don’t want to check length, change {8,50} to asterisk character. Or if you don’t want some parts of the regex, just remove it. Others will still work.

Inspired from: http://stackoverflow.com/questions/5142103/regex-to-validate-password-strength

Change Symfony Form Theme including FOSUserBundle’s

I’m new to Symfony and I was playing with FOSUserBundle for user management. It makes everything about user management like login, register, profile pages and password reset operations really easy. But the forms are not looking good. I implemented FOSUserBundle’s forms into my project’s theme but it was still looking bad. I even tried to create every input with hand in a static twig layout but it was a total disaster. It’s obviously the worst option. So after digging in documents I got it’s really easy to make Symfony forms have a better look.

Symfony has built-in support for Bootstrap 3 and Foundation Framework. You have other customization options but I prefer to change form theme application-wide. Just add the code below to your app/config/config.yml and your forms will be generated compatible with Bootstrap 3.

Look here for other options and layout-specific customizations: http://symfony.com/doc/current/cookbook/form/form_customization.html#what-are-form-themes