Développer avec RBS Change : [Résolu] Numérotation de facture et stratégie perso

  • 74461.1

    13/02/2013 16:38


    Mathias
    Rang : Expert
    Bonjour,

    suite à ce ticket du bugtracker, j'ai besoin d'aide pour résoudre mon problème décrit dans le ticket de bug et qui n'est toujours pas corrigé du fait que j'utilise une stratége perso pour générer mes numéro de facture.
    Cette stratégie perso permet d'avoir des numéros de facture de la sorte :
    [yXXXXX] où X est un numéro qui s'incrémente sur 5 chiffres donc par exemple :
    1300001 (la 1ère facture de l'année 2013)

    - j'ai du mal à comprendre pourquoi la correction du ticket n'est valable que pour le cas où la génération des numéro est différée, car finalement la tâche planifiée utilise la même méthode order_BillService::applyNumber($doc, true); en forçant dans ce cas la génération du numéro quoi qu'il arrive. cette méthode (applynumber) utilise la stratégie par défaut de numérotation, qui est elle même injectée par ma stratégie perso.

    voici le code que j'utilise pour ma stratégie perso, je l'ai mis à jour en essayant d'appliquer les principes de la nouvelle stratégie, mais sans succès... j'ai toujours des trous dans mes génération de n° de facture:
    /**
    	* @param order_persistentdocument_bill $bill
    	* @return String
    	*/
    	public function generate($bill)
    	{
    		//format souhaité : <yearShort><countOn5Digits>
    		
    		//récupérer l'année sur 2 chiffres
    		$year = ($bill->getCreationdate()) ? substr($bill->getCreationdate(), 0, 4) : date("Y");
    		$shortYear = substr($year,-2);
    		
    		//calculer le count sur 5 digits
    		$row = $bill->getDocumentService()->createQuery()
    			->add(Restrictions::ne('publicationstatus', 'DRAFT'))
    			->add(Restrictions::like('label', '_______', MatchMode::EXACT()))
    			->setProjection(Projections::max('label', 'max'))
    			->findColumn('max');
    		if (is_array($row))
    		{
    			$newCount = strval(intval(substr($row[0], -5))+1);
    		}
    		else
    		{
    			$newCount = '1';
    		}
    		
    		$number = $shortYear.str_pad($newCount, 5, '0', STR_PAD_LEFT);
    		
    		return $number;
    	}


    Quelle est la partie que je dois mettre à jour afin de bénéficier du correctif ?

    Édité par Mathias 13/02/2013 16:45


    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 74461.2 en réponse à 74461.1 écrit par Mathias

    13/02/2013 17:17


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    En fait un premier problème que je vois dans votre adaptation du code c'est que la restriction Restrictions::like('label', '_______', MatchMode::EXACT()) dans la requête sert à ne prendre en compte que les factures déjà numérotées, du coup on s'assure de ne pas avoir de trou.

    Par contre là votre format c'est $shortYear.str_pad($newCount, 5, '0', STR_PAD_LEFT), du coup la restriction n'est pas correcte et devrait être plutôt Restrictions::like('label', $shortYear.'_____', MatchMode::EXACT()) (d'abord les deux caractères de l'année puis les 5 caractères quelconques).

    Là avec votre restriction vous remonterez le plus élevé de tous les numéros gérés sur 7 caractères. Du coup lors des changements d'années vous allez générer des trous puisque par exemple vous pourrez avoir les premières factures de 2014 qui seront numérotées avant les dernières de 2013 (si ces dernières sont payées un peu plus tard).


    D'autre part, une facture qui aurait obtenu un numéro puis serait ensuite annulée gardera son numéro. Mais dans ce cas il ne s'agit pas d'un trou a priori puisque pour qu'elle ait eu un numéro, il faut qu'elle ait à un moment donné été dans un statut payé ou en attente de paiement (chèque).

    Édité par Gaël Port 13/02/2013 17:19

  • 74461.3 en réponse à 74461.2 écrit par Gaël Port

    13/02/2013 18:04


    Mathias
    Rang : Expert
    Merci Gaël pour ta réactivité !

    Il semble que j'ai corrigé mon problème de la sorte :
    $year = ($bill->getCreationdate()) ? substr($bill->getCreationdate(), 0, 4) : date("Y");
    		$shortYear = substr($year,-2);
    		
    		//calculer le count sur 5 digits
    		$row = $bill->getDocumentService()->createQuery()
    			->add(Restrictions::ne('publicationstatus', 'DRAFT'))
    			->add(Restrictions::like('label', $shortYear.'_____', MatchMode::EXACT()))
    			->add(Restrictions::orExp(Restrictions::eq('status',order_BillService::SUCCESS), Restrictions::eq('status', order_BillService::WAITING)))
    			->setProjection(Projections::max('label', 'max'))
    			->findColumn('max');
    		if (is_array($row))
    		{
    			$newCount = strval(intval(substr($row[0], -5))+1);
    		}
    		else
    		{
    			$newCount = '1';
    		}
    		
    		$number = $shortYear.str_pad($newCount, 5, '0', STR_PAD_LEFT);
    		
    		return $number;


    J'ai suivi ton conseil sur la restriction sur le label, en la corrigeant par Restrictions::like('label', $shortYear.'_____', MatchMode::EXACT()) , ce qui me permet de ne pas avoir de trou d'années en années (bien vu :)).

    Ensuite j'ai ajouté une restriction qui valide que la facture a soit un statut payé, soit un statut en attente !

    Merci !

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 74461.4 en réponse à 74461.2 écrit par Gaël Port

    13/02/2013 18:07


    Mathias
    Rang : Expert
    Par contre, je ne vois pas, ce qui, dans le commit initial corrigeant le ticket concerné, permet de ne prendre en compte que les factures ayant un statut payé ou en attente ?


    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 74461.5 en réponse à 74461.4 écrit par Mathias

    14/02/2013 09:03


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    En fait avant cette correction, pour générer le nouveau numéro de facture, on comptait simplement les factures dont la date de transaction était dans la bonne année, sans se préoccuper de savoir si elles avaient toutes bien un numéro définitif ou non. Du coup la tâche de numérotation qui numérote par lot pouvait donner le même numéro à plusieurs factures et en même temps générer des trous. La correction consiste donc à ne prendre en compte que les factures qui ont un numéro définitif.

    Dans le cas où l'on n'a pas de numérotation différée, ça ne n'arrange pas grand chose par contre, si ce n'est que si jamais la numérotation ne démarre à 0 (en cas d'import de fichier d'exemples notamment) on poursuit bien après le dernier numéro attribué au lieu de générer des doublons, voire démarrer avant la première facture existante.
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1471 membres
Aucun membre connecté