Dépassement du plafond de chiffre d’affaire et TVA

1 juillet 2011

Ca y est, je vais dépasser le plafond et du coup, de nouvelles formalités sont nécessaires. Il y a finalement assez peu de documentation sur le net sur les démarches à faire dans ce cas.

En tant qu’auto-entrepreneurs, nous sommes une Entreprise Individuelle, sous un régime social et fiscal particulier. De ce fait, il n’y a dans un premier temps qu’une seule démarche à faire,concernant la TVA. En effet, le dépassement du seuil implique de devoir déclarer la TVA (et ce dès le mois où le dépassement est constaté, donc prévoyez en fonction de vos dates de facturation).

Pour ce faire, il faut appeler votre Service des Impots des Entreprises pour qu’il vous crée un numéro de TVA intracommunautaire. Dans la foulée, il faut leur envoyer un courrier stipulant le régime de TVA que vous choisissez. En l’occurrence, si vous restez en EI, vous opterez probablement pour le régime de la TVA simplifié.

Pour parer à toute éventualité, j’ai fait le choix de prendre dès maintenant un comptable. Cela me permettra entre autre de récupérer la TVA sur les quelques charges que je peux déduire (chose que je compte voir avec lui) et de bénéficier d’un accompagnement pour la suite.

Voila, je suis un exemple prouvant que l’auto-entreprise peut être un vrai tremplin pour la création d’entreprise et que tous les articles décriant le statut doivent être pris avec des pincettes.

Debugging an exception raised by Django

3 avril 2011

I know for a while how to trace code with pdb, but I used to use the famous

import pdb;pdb.set_trace()

which enable debugging when this line is reached.

However, I’ve had an exception raised by django when saving an object :

File "/opt/virtualenvs/django1.2/lib/python2.6/site-packages/Django-1.2.5...
    return int(value)
ValueError: invalid literal for int() with base 10: ''
and it’s totally anoying to trace the save() function step by step. After looking at pdb doc, I’ve found what I was looking for : the post_mortem() method :
try:
    object.save()
except:
    import pdb;pdb.post_mortem()
this runs pdb where the exception is raised, and then allows me to see which is that field on my model which is not properly set.

Serving static files with Apache while controlling access with Django

13 mars 2011

Theses days, I’ve added the ability to upload files in Aemanager for Ma Petite Auto Entreprise. Since a user may only access files he owns, a solution could have been putting them into an obfuscated directory (with a uid) in the media directory but I didn’t want to rely on such a solution which I consider not enough secure. I could have then let Apache serve theses files.

An other way to achieve this goal could be putting files in a directory not accessible by http, then in a view, read the file and stream the content with Django. It matches my goal but it isn’t efficient nor recommended to serve static files through Django.

The last solution, the better, is to use mod_xsendfile, a module for Apache. The user ask for a file represented by an arbitrary url and Django just sends a response without content, setting X-Sendfile header to tell Apache where it should read the content.

First, you need to install mod_xsendfile following these instructions :

$ sudo apxs2 -cia mod_xsendfile.c

Restart Apache when finished.

Here is a view of Aemanager which provide protected static files:

@settings_required
@subscription_required
def contract_uploaded_contract_download(request, id):
    contract = get_object_or_404(Contract, pk=id, owner=request.user)
    response = HttpResponse(mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment;filename="%s"'\
                                    % smart_str(contract.contract_file.name)
    response["X-Sendfile"] = "%s%s" % (settings.FILE_UPLOAD_DIR, 
                                       contract.contract_file.name)
    response['Content-length'] = contract.contract_file.size

    return response

Here the important thing is the X-Sendfile header.

However, there’s also a problem with files which have non-ascii characters in their name. The best solution I’ve found is to use:

unicodedata.normalize('NFKD', filename).encode('ascii', 'ignore')

This replaces characters such as « é » by their ascii equivalent, « e » in this case.

Here is my model to let you see how it’s done :

store = FileSystemStorage(location=settings.FILE_UPLOAD_DIR)

def contract_upload_to_handler(instance, filename):
    return "%s/contract/%s" % (instance.owner.username,
                               unicodedata.normalize('NFKD',
                                                     filename).encode('ascii',
                                                                      'ignore'))

class Contract(OwnedObject):
    customer = models.ForeignKey(Contact,
                                 verbose_name=_('Customer'),
                                 related_name="contracts")
    title = models.CharField(max_length=255,
                             verbose_name=_('Title'))
    contract_file = models.FileField(upload_to=contract_upload_to_handler,
                                     null=True,
                                     blank=True,
                                     storage=store,
                                     verbose_name=_('Uploaded contract'))
    content = models.TextField(verbose_name=_('Content'),
                               null=True,
                               blank=True)
    update_date = models.DateField(verbose_name=_('Update date'),
                                   help_text=_('format: mm/dd/yyyy'))

EDIT : The Xsendfile module also exists for nginx and charset issue in filename can be solved with header X-Accel-Charset: utf-8

Copy a directory over ssh

8 mars 2011

The useful command of the night since I’ve bought a new computer and I need to copy some data from the old one to the new one :

tar cj MY_DIR | ssh user@ip tar xj -C ~/

For 30 GB by wifi, it will be a bit more efficient than a sftp transfer.

Auto-entrepreneur et Paypal : quel chiffre d’affaire déclarer ?

6 mars 2011

Dans le cadre de Ma Petite Auto-Entreprise, je gère un abonnement Paypal à 11,88€ par an. Sur chaque transaction, Paypal prend une commission égale à 3,4% + 25 centimes, soit 65 centimes, prélevée à la source. Du coup, je touche réellement 11,23€. Pour autant, j’envoie une facture à chaque abonné portant sur un montant 11,88€.

Beaucoup d’auto-entrepreneurs comme moi se posent alors la question du chiffre à déclarer. Après avoir cherché sur google, je n’ai trouvé que des réponses dans des forums avec des avis divergents. Du coup, j’ai écrit à l’URSSAF pour en avoir le cœur net. J’ai reçu des réponses préformatées et il a fallu que je réitère ma question pour avoir une réponse à peine plus précise. Toujours est-il que la réponse semble bien être : on déclare ce qu’on facture. Donc il faut déclarer 11,88€ et on peut s’asseoir sur les 65 centimes de commissions même si on paie des charges dessus et qu’on ne les a jamais touchés.

J’avais une deuxième question à laquelle je n’ai pas eu de réponse : est-ce que le chiffre d’affaire payé via Paypal doit être compté à partir du moment où on le récupère sur notre compte ou alors dès qu’il est perçu sur Paypal ? D’après ce que j’ai lu sur des forums, je pense qu’il faut considérer Paypal comme un compte bancaire et donc déclarer les paiements dès qu’ils sont touchés sur Paypal.

Sortie officielle de Ma Petite Auto-Entreprise

1 mars 2011

Ca y est, après plus d’une centaine de corrections depuis le lancement de la bêta, Ma Petite Auto-Entreprise est officiellement en ligne.

Logiciel en ligne de gestion pour auto-entrepreneurs

Pour rappel, Ma Petite Auto-Entreprise est un logiciel de gestion pour auto-entrepreneurs permettant de gérer ses clients, devis, factures, relances tout en suivant son chiffre d’affaire, son reste à faire, le plafond du statut et les cotisations à payer.

Bien mieux qu’un long discours, je vous invite à découvrir tout ça directement : http://www.mapetiteautoentreprise.fr/

Apache default NameVirtualHost pitfall

22 février 2011

I was wondering why when I type a domain or subdomain without virtualhost behind I come on my first virtualhost and not the default one.

I tried to rename the default into 000-default without solving the issue. My NameVirtualHost is defined with my server ip :

NameVirtualHost my_ip:80

and I tried

<VirtualHost _default_:80>

or

<VirtualHost *:80>

and at the beginning I forgot to add the ServerName in the default vhost. But none of these worked.

The solution is only to defined your vhost with your server ip :

<VirtualHost my_ip:80>
    ServerName myserver.tld
    ...

And do not forget to set your ssl certificate in your default ssl vhost since it will be the one sent during ssl negociation.

Facturation réflexive

22 février 2011

Un tout petit billet pour parler d’un élément sans complexité technique de Ma Petite Auto Entreprise mais qui me fait sourire.

En effet, le logiciel est réflexif : il permet de faire de la facturation pour les auto-entrepreneurs mais il se facture lui même. A chaque paiement paypal, un client, un projet, un devis et une facture sont créés sur mon propre compte et la facture est envoyée par mail au client. Du coup, mon chiffre d’affaire et mes prévisions de cotisations tiennent automatiquement compte de ces recettes. C’est simple, mais c’est beau :-)

Les coulisses de Ma Petite Auto Entreprise

19 février 2011

Comme je l’avais annoncé, cet article, qui fait référence au lancement de la bêta, va plus traiter de la genèse de Ma Petite Auto Entreprise et de l’aspect technique.

Naissance de l’application

Dès que j’ai commencé mon activité d’auto-entrepreneur, en avril 2010, j’ai voulu géré rigoureusement mon activité. J’ai commencé avec une feuille de calcul sous Open Office et des modèles de document éditables pour les contrats. Les informations qui m’importaient étaient mon chiffre d’affaire, les charges à provisionner, les factures à éditer ou en attente de paiement, le reste à faire avant d’atteindre le plafond, etc … cela a bien marché quelques temps, mais j’ai vite été limité par la simplicité du système. En tant qu’informaticien, c’était aussi simple pour moi de réaliser rapidement un prototype d’application web en Django pour faire la même chose et surtout faire bien plus.

La première raison est donc le besoin personnel, mais j’ai essayé de garder en tête que l’application pourrait servir à d’autres. Au fil des semaines, en parallèle de mes missions d’expertise technique, j’ai continué à faire évoluer le logiciel avec comme objectif de le publier. La deuxième raison qui m’a poussé à continuer est que cette application est, je l’espère, une belle démonstration de mes compétences (et une promotion pour python et Django, malheureusement bien trop rare en entreprise). En effet, on me demande souvent de montrer des références, et ayant principalement travaillé sur des intranets, c’est un peu compliqué … Finalement, la dernière raison est évidemment l’espoir d’en tirer un bénéfice financier et ainsi pouvoir concentrer une majeure partie de mon temps à l’édition de ce logiciel.

Aspect technique

Ma Petite Auto Entreprise est en fait le nom du site qui héberge l’application. L’application en elle-même se nomme « aemanager ». Elle est libre et placée sous licence GPLv3. Les sources sont disponibles sur Github.

Aemanager est développé à l’aide de Django, framework web écrit en python vraiment très pratique et jQuery, framework javascript. Les données sont stockées dans une base PostgreSQL. Les sources sont hébergées à l’aide de Git, gestionnaire de version décentralisé (DVCS) initié par Linus Torvald. A l’heure où j’écris cet article il y a plus de 150 tests unitaires pour s’assurer du bon fonctionnement de l’application et elle a été testée sous Chrome, Firefox et IE. Les évolutions effectuées tout au long du développement nécessitent parfois de casser le modèle de données, c’est pourquoi des migrations sont réalisées à l’aide de South, une extension Django dédiée à cela. Voila pour les grandes lignes.

Je peux également ajouter que pour la génération PDF j’utilise Reportlab, pour les graphiques un plugin jQuery : Flot, Elrte pour l’éditeur wysiwyg des devis et contrats et django-registration pour la création de compte utilisateur.

Même si l’application est a priori spécifique à la France, elle est internationalisée car j’ai pris l’habitude de toujours coder en anglais. Concernant les paiements, aemanager est interfacé avec Paypal. Et pour conclure, le tout est hébergé sur un serveur virtualisé en SSL (avec un certificat valide !).

Le tout a déjà représenté quelques semaines de boulot à plein temps et probablement beaucoup d’autres à venir ;-)

Lancement de la bêta de Ma Petite Auto Entreprise

18 février 2011

Après dix mois en tant qu’auto-entrepreneur et presque autant à travailler en parallèle sur un outil pour gérer mes affaires , je suis aujourd’hui fier d’annoncer la sortie de la première version de test de Ma Petite Auto Entreprise, un logiciel de gestion d’auto-entreprise.

Cette application web vous permet de :

  • Gérer votre carnet de clients
  • Définir des projets et établir vos devis
  • Gérer vos factures et vos relances
  • Suivre votre chiffre d’affaire payé et prévisionnel ainsi que vos dépenses et bénéfices
  • Savoir à tout moment combien il vous reste à faire pour atteindre le plafond
  • Prévoir vos cotisations
  • Exporter vos devis, factures, contrats et livre des recettes en pdf

C’est une version bêta, c’est pourquoi je compte sur vous pour la tester, me faire des retours sur les bugs à corriger, les améliorations à apporter et les fautes oubliées avant la sortie officielle de la version 1.0 dans environ un mois. Attention ! cette version est uniquement pour tester. Vous pouvez saisir vos données réelles, mais pour l’instant il n’est pas prévu de migrer les données sur la version finale, et vous serez donc obligé de tout ressaisir le moment venu.

Pour accéder à la bêta de Ma Petite Auto Entreprise : https://test.mapetiteautoentreprise.fr. Pour toute question hors test, envoyez moi un mail à l’adresse indiquée sur la page contact.

Les 20 meilleurs testeurs qui rapporteront les anomalies les plus importantes au travers du formulaire de contact de l’application se verront offrir un an d’abonnement lors de la sortie de la version finale.

Je publierai également un billet plus technique sur l’application dans les jours prochains.

Merci d’avance à tous les testeurs.

Et pour ceux intéressés par les possibles futures fonctionnalités : https://github.com/fgaudin/aemanager/issues (en anglais).