paolo@bimodesign.com | +34 608 61 64 10

E-Commerce

        

Couponic - Generare numeri di fattura (Bill)

Come anticipato in alcuni post precedenti, Couponic presenta alcuni bug e mancanze abbastanza evidenti, come quella di non gestire i numeri di fattura.
Vediamo come risolvere.

Il risultato sara' quello di generare delle fatture che abbiano questo formato

A0000001

Dove "A" cambiera' alla lettera successiva dell'alfabeto, quando si arrivera' al numero 999999999.
Nel mio caso, non era richiesto che questo numero, fosse relazionato con l'anno in corso, ma potete comunque adattarlo alle vostre esigenze.
Innanzitutto creiamo la tabella che conterra' le fatture

drop table cpns_PaymentBill;

CREATE TABLE  `cpns_PaymentBill` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `orderId` bigint(20) NOT NULL,
  `billNumber` varchar(8) NOT NULL,
  PRIMARY KEY (`id`,`orderId`)
) ENGINE=MyISAM;

ed inseriamo la prima fattura. (questo e' un piccolo bug non risolto della mia procedura ;)

insert into cpns_PaymentBill values (131,'A0000001');

quindi, creiamo il trigger createBill, che si attivera' quando il campo cpns_PaymentOrder.status cambia a "2". Da notare che tale campo puo' assumere vari valori, ma solo questo indica che il pagamento, sia con Paypal o con Carta di Credito (nel mio caso Adyen) e' andato a buon fine.

DROP TRIGGER IF EXISTS createbill;

DELIMITER $$
    CREATE TRIGGER createbill BEFORE UPDATE ON cpns_PaymentOrder
    FOR EACH ROW BEGIN

      DECLARE billnumberactual VARCHAR(8);
      DECLARE billnumberactualfirstletter CHAR(1);
      DECLARE billnumberactualsecondpart CHAR(7);
      DECLARE billnumbernew VARCHAR(8);

      if(NEW.status = 2) THEN
	      SET billnumberactual = (select max(billNumber) from cpns_PaymentBill); 
              
	      SET billnumberactualfirstletter = SUBSTRING(billnumberactual,1,1);
	      SET billnumberactualsecondpart  = SUBSTRING(billnumberactual,2);

 	      if(billnumberactualsecondpart='9999999') THEN
	      	SET billnumberactualfirstletter = CHAR(ORD(billnumberactualfirstletter)+1);
	      	SET billnumberactualsecondpart  = LPAD('1',7,'0');
	      ELSE
	      	SET billnumberactualsecondpart  = LPAD(1 + billnumberactualsecondpart,7,'0');
              END IF;

	      SET billnumbernew = CONCAT(billnumberactualfirstletter,billnumberactualsecondpart);

	      INSERT INTO cpns_PaymentBill (orderId,billNumber) VALUES (NEW.id, billnumbernew);
      END IF;

	      
    END;
$$
DELIMITER ;

Notare come calcolo, in MySql, la lettera dell'alfabeto successiva a quella attuale, ovvero questa istruzione

CHAR(ORD(billnumberactualfirstletter)+1);

dove:
ord()
char()