Óåëßäá 1 áðü 2 12 ÔåëåõôáßáÔåëåõôáßá
ÅìöÜíéóç áðïôåëåóìÜôùí 1 ìÝ÷ñé 10 áðü 13

ÈÝìá: ISO8583 - Ôñáðåæéêü ðñùôüêïëëï

  1. #1
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99

    ISO8583 - Ôñáðåæéêü ðñùôüêïëëï


    Çëåêôñïíéêü êáôÜóôçìá åéäþí èÝñìáíóçò êáé êëéìáôéóìïý

    Óýíïøç

    Ðëçñþíïõìå ìå êÜñôá Þ êÜíïõìå áíÜëçøç ÷ñçìÜôùí áðü ôï ATM. Áíçóõ÷ïýìå ãéá ïñèüôçôá ôçò óõãêåêñéìÝíçò óõíáëëáãÞò ? ÌÜëëïí ü÷é. ºóùò íá áíçóõ÷ïýìå ãéá ôï áí êÜðïéïò ôñßôïò ìáò êëÝøåé ôçí êÜñôá êáé ôï pin êáé ìáò ÷ñåþóåé ôéò äéêÝò ôïõ áãïñÝò. Áí êÜíïõìå áãïñÝò óôï internet åðéâÜëëåôáé íá ÷ñçóéìïðïéïýìå ðñïðëçñùìÝíç êÜñôá «öïñôùìÝíç» ìå ðïóü ßóï ìå ôçí áãïñÜ ìáò.

    Ôï ðñùôüêïëëï ISO8583 (http://en.wikipedia.org/wiki/ISO_8583) åßíáé Ýíá ôñáðåæéêü ðñùôüêïëëï ðïõ ÷ñçóéìïðïéåßôáé üôáí êÜíïõìå ïéêïíïìéêÝò óõíáëëáãÝò óå ATM, EFT, web banking êôë êáé êáèïñßæåé

    1. Ôéò äýï Üêñåò ôçò åðéêïéíùíßáò. Ôï Ýíá Üêñï (ôåñìáôéêü) ðïõ åêêéíåß ôçí óõíáëëáãÞ (EFT, ATM Þ ìéá åöáñìïãÞ óå Ýíá PC) êáé ôï äåýôåñï Üêñï, ôçí ôñÜðåæá (ôïí processor ãéá ôçí áêñßâåéá). Ôï êáíÜëé åðéêïéíùíßáò ìðïñåß íá åßíáé ìéá áðëÞ ôçëåöùíéêÞ ãñáììÞ óõíäåäåìÝíç óå Ýíá modem êáé ìéá óåéñéáêÞ èýñá Þ ìéá TCP/IP ãñáììÞ.

    2. ÊÜèå ôåñìáôéêü Ý÷åé äéêü ôïõ ìïíáäéêü êùäéêü TerminalID êáé ôïí êùäéêü ôïõ åìðüñïõ MerchantID, ï ëïãáñéáóìüò ôïõ ïðïßïõ èá ðéóôùèåß áðü ôçí áãïñÜ ìå áíôßóôïé÷ç ÷ñÝùóç ôïõ ëïãáñéáóìïý ôçò êÜñôáò. Óôá ATMs ç óõíáëëáãÞ áíÜëçøçò áöïñÜ ìüíï Ýíá ëïãáñéáóìü.

    3. ÊÜèå ôåñìáôéêü õðÜñ÷åé äçëùìÝíï (ëïãéêÜ) êáé óôçí ôñÜðåæá. ÊÜèå êßíçóç óôçí ìßá Üêñç áíôéãñÜöåôáé óôï ëïãéêü ôåñìáôéêü óôç ôñÜðåæá.

    4. Ôçí ìïñöÞ êáé ôï ðåñéå÷üìåíï ôùí ìçíõìÜôùí ðïõ áíôáëëÜóóïíôáé. Ç ìïñöÞ ôùí ìçíõìÜôùí åßíáé ìéá áðëÞ ëåðôïìÝñåéá.

    5. Ôï ôåñìáôéêü ðïõ åêêéíåß ôçí óõíáëëáãÞ åßíáé êáé ï áðüëõôïò êñéôÞò ôçò åðéôõ÷ßáò Þ ôçò áðïôõ÷ßáò ôçò. Åðéôõ÷çìÝíç óõíáëëáãÞ åßíáé áõôÞ ðïõ ï client Ý÷åé áðïóôåßëåé ìÞíõìá êáé Ý÷åé ëÜâåé êáé êáôáãñÜøåé ôçí áðÜíôçóç ôïõ Server. Ç óõíáëëáãÞ ìðïñåß íá åßíáé åðéôõ÷çìÝíç åðéêïéíùíéáêÜ áëëÜ ìå áñíçôéêÞ áðÜíôçóç ùò ðñïò ôï åñþôçìá (áí ð÷ äåí õðÜñ÷ïõí ÷ñÞìáôá ãéá áíÜëçøç).

    6. ×åéñéóìü êÜèå áðïôõ÷ßáò åðéêïéíùíßáò áðü ôï ôåñìáôéêü.

    Óå êÜèå TCP/IP óõíáëëáãÞ åêôåëïýíôáé ôá åîÞò âÞìáôá.
    • Óýíäåóç ôïõ ôåñìáôéêïý ìå ôïí server (ôñÜðåæá). Ç áäõíáìßá óýíäåóçò óçìáßíåé áäõíáìßá åêôÝëåóçò ôçò óõíáëëáãÞò êáé äåí åßíáé óöÜëìá åðéêïéíùíßáò.
    • ÁðïóôïëÞ ISO8583 ìçíýìáôïò áðü ôï ôåñìáôéêü óôï server
    • ËÞøç áéôÞìáôïò áðü ôïí server.
    • Åðåîåñãáóßá áéôÞìáôïò áðü ôïí server.
    • ÁðïóôïëÞ ôçò ISO8583 áðÜíôçóçò áðü ôïí server óôïí client
    • ÐáñáëáâÞ áðÜíôçóçò áðü ôïí client.
    • Áðïóýíäåóç ôïõ server ìå ôçí ïëïêëÞñùóç ôçò áðïóôïëÞò ôçò áðÜíôçóçò.
    • Åðåîåñãáóßá áðÜíôçóçò áðü ôïí client.

    Óå êÜèå óçìåßï ìðïñåß ç åðéêïéíùíßá íá äéáêïðåß. Ìðïñåß ç áðÜíôçóç íá Ý÷åé ðáñáëçöèåß áðü ôï ôåñìáôéêü áëëÜ ãéá ïðïéïäÞðïôå ëüãï (äéáêïðÞ ñåýìáôïò) íá ìçí ïëïêëçñþèçêå ç êáôáãñáöÞ êáé ç åðåîåñãáóßá ôçò.

    ÌåôÜ áðü êÜèå áðïôõ÷çìÝíç åðéêïéíùíßá, ôï ôåñìáôéêü ðñïóðáèåß íá áíôéëïãßóåé (reverse) ôçí ôåëåõôáßá áðïôõ÷çìÝíç óõíáëëáãÞ. Ç Üëëç ðëåõñÜ (ôñÜðåæá) ãíùñßæåé ðïéá åßíáé ç ôåëåõôáßá óõíáëëáãÞ ôïõ óõãêåêñéìÝíïõ ôåñìáôéêïý ðïõ Ý÷åé ëÜâåé. Êáé ðñÜôôåé áíÜëïãá. Áêõñþíåé ôçí ôåëåõôáßá óõíáëëáãÞ Þ áãíïåß ôçí åíôïëÞ êáé åðéóôñÝöåé åðéôõ÷ßá.
    Ôá ìçíýìáôá áíôéëïãéóìïý äåí áíôéëïãßæïíôáé áëëÜ åðáíáëáìâÜíïíôáé ìÝ÷ñé íá åðéôý÷ïõí.

    7. Ôçí ôÞñçóç áñ÷åßïõ óõíáëëáãþí óôï ôåñìáôéêü (batch) êáé êëåßóéìï ôïõ batch, äéáäéêáóßá ðïõ åêôåëåßôáé óõíÞèùò óôï ôÝëïò ôçò çìÝñáò. Ãéá êÜèå åðéôõ÷çìÝíç óõíáëëáãÞ áõîÜíåôáé Ýíá ìåôñçôÞò óõíáëëáãþí êáé Ýíáò áèñïéóôÞò áîéþí. Ôï êëåßóéìï ôïõ batch áðïóôåßëåé óôïí server ôá óýíïëá (ôïí áñéèìü êáé ôçí áîßá ôùí óõíáëëáãþí) ðïõ ãíùñßæåé ôï ôåñìáôéêü. Ï server ôá óõãêñßíåé ìå ôá óýíïëá ðïõ ôçñåß ãéá ôï óõãêåêñéìÝíï ôåñìáôéêü. Áí ôá óýíïëá óõìöùíïýí, ôï batch êëåßíåé åðéôõ÷þò, áíïßãåé Ýíá íÝï Üäåéï êáé ç äéáäéêáóßá åðáíáëáìâÜíåôáé.
    Ãéá êÜðïéï ëüãï ôá óýíïëá áíÜìåóá óôá äýï Üêñá äåí óõìöùíïýí. Ôüôå ôï ôåñìáôéêü, ôï óçìåßï äçëáäÞ ðïõ Ýãéíáí ïé óõíáëëáãÝò êáé õðÜñ÷ïõí áðïäåéêôéêÜ vouchers, óôÝëíåé åîáñ÷Þò üëåò ôéò óõíáëëáãÝò ôïõ batch.
    Ç äéáäéêáóßá ôåëåéþíåé üôáí óõìöùíÞóïõí ôá óýíïëá.

    Êñßóéìç åöáñìïãÞ

    Óôï modbus ðñüôåéíá ìåñéêÝò åðáíáëÞøåéò óôç áðïóôïëÞ ôïõ ìçíýìáôïò, ãéá íá áíôáëëÜîïõìå äåäïìÝíá óå ðåñßðôùóç óöáëìÜôùí.

    Óôï ISO8583 oé áðáéôÞóåéò åðéâÜëïõí ôïí ÷åéñéóìü óöáëìÜôùí óôçí äéáäéêáóßá.

    1. Ôçñïýíôáé äýï áíôßãñáöá ôùí óõíáëëáãþí, óôï ôåñìáôéêü êáé óôç ôñÜðåæá.
    2. Óå ïðïéïäÞðïôå óöÜëìá åðéêïéíùíßáò ç óõíáëëáãÞ áíôéëïãßæåôáé (äéáãñÜöåôáé).
    3. Ç óõíáëëáãÞ áíôéëïãéóìïý åðáíáëáìâÜíåôáé Ýùò üôïõ ðåôý÷åé.
    4. Óôï êëåßóéìï batch åëÝã÷ïíôáé ôá óýíïëá ôùí óõíáëëáãþí ôïõ ôåñìáôéêïý êáé ôùí óõíáëëáãþí ôçò ôñÜðåæáò.
    5. Óå äéáöùíßá óõíüëùí ôï ôåñìáôéêü "áöÝíôçò" óôÝëíåé îáíÜ ôéò óõíáëëáãÝò.

    Óõíå÷ßæåôáé…

  2. #2
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99
    Ðïõ áëëïý èá ìðïñïýóáìå íá ÷ñçóéìïðïéÞóïõìå ìéá ôÝôïéá ó÷åäßáóç ?

    ºóùò íá åß÷áôå ÷ñçóéìïðïéÞóåé ôá ðáëéÜ VT100 character terminals óõíäåäåìÝíá óå unix servers. Ôï unix äçìéïõñãïýóå Ýíá process ãéá êÜèå óõíäåäåìÝíï (logged in) ôåñìáôéêü.
    Ôï «÷áæü» ôåñìáôéêü Ýóôåëíå ôéò ðëçêôñïëïãÞóåéò óôï unix, ç åöáñìïãÞ ëÜìâáíå êáé áöïý åðåîåñãáæüôáí ôá äåäïìÝíá, Ýóôåëíå ðßóù ìçíýìáôá óôçí ïèüíç Þ ôïí åêôõðùôÞ ôïõ ôåñìáôéêïý.

    Ç äéáäéêáóßá ôçò ðþëçóçò óå Ýíá super market ìðïñïýóå íá õëïðïéçèåß åýêïëá êáé äåí õðÞñ÷å ðüôå ðñüâëçìá åíçìÝñùóçò ôùí êåñäéóìÝíùí ðüíôùí áðü ôçí ôåëåõôáßá áãïñÜ. ¼ëá ôá äåäïìÝíá Þôáí óå Ýíá óçìåßï (unix host) ðñïóâÜóéìï áðü êÜèå åíäéáöåñüìåíï.
    Ìðïñïýóåò íá óõíäÝóåéò Ýíá barcode scanner, óôç óåéñéáêÞ ðüñôá ôïõ ôåñìáôéêïý êáé ôá barcodes ðïõ äéÜâáæåò «ôáîßäåõáí» áðåõèåßáò ãéá åðåîåñãáóßá óôï unix. Ìå Ýíá modem óôá 2400 baud ìðïñïýóåò íá ðïõëÜò óå êáôÜóôçìá óôç ÊïìïôçíÞ ìå ôïí unix server óôçí ÁèÞíá.

    ÊÜíáìå êÜðïéïõò êýêëïõò, åêóõã÷ñïíéóèÞêáìå [:0], åãêáôáóôÞóáìå óôá ôáìåßï POSes ìå ôïðéêÞ åðåîåñãáóßá êáé ôïðéêÜ äåäïìÝíá. Êáé êÜèå ìåôáâïëÞ äåäïìÝíùí (íÝá åßäç, áëëáãÝò ôéìþí, êåñäéóìÝíïé ðüíôïé áðü áãïñÝò) Ýðñåðå íá äéáíåìçèïýí óå üëá ôá ôáìåßá ôçò áëõóßäáò (óôï êáôÜóôçìá, ôçí ðüëç, ôïí íïìü..). Êáé áðáéôïýóáìå äéêôõáêÞ õðïäïìÞ ìå éêáíïðïéçôéêü bandwidth þóôå ìÝóù åíüò êåíôñéêïý server íá íÝá äåäïìÝíá íá öôÜóïõí óå üëïõò ôïõò ðáñáëÞðôåò. Êáé, ëüãù ôçò õøçëÞò ôå÷íïëïãßáò, ïé ðüíôïé ðïõ êåñäßóáìå óÞìåñá, Þôáí äéáèÝóéìïé ðñïò åîáñãýñùóç ôçí åðüìåíç ìÝñá.

    Êáé îáíáãõñíÜìå óôçí áñ÷Þ…

    Web retail Application

    O öõëëïìåôñçôÞò óõíäÝåôáé ìå Ýíá Web Server êáé äçìéïõñãåß Ýíá session ìå ÷ñÞóç cookies.
    O browser äÝ÷åôáé ôï barcode áðü ôïí usb barcode scanner ôïõ ðÜãêïõ.
    O browser áðïóôÝëëåé ôï barcode êáé ðéèáíÜ ôçí ðïóüôçôá óôï Web Server êáé ëáìâÜíåé ðßóù êùäéêü, ðåñéãñáöÞ åßäïõò, ôéìÞ ìïíÜäïò, Ýêðôùóç êáé óõíïëéêÞ áîßá.
    O browser áðïèçêåýåé ôïðéêÜ, óå Ýíá xml island, ôçí ðëçñïöïñßá ðïõ ìüëéò Ýëáâå êáé áèñïßæåé ôçí ðïóüôçôá êáé ôçí áîßá ôùí åéäþí.
    O browser óôÝëíåé ìüíï ôá óýíïëá óôï WebServer ãéá óõìöùíßá êáé åêôýðùóç ôçò áðüäåéîçò. Ï WebServer ôá óõãêñßíåé ìå ôá óýíïëá ðïõ ôçñåß ãéá ôï óõãêåêñéìÝíï browser (ôåñìáôéêü) êáé áðüäåéîç (batch)

    Ç ôïðéêÞ TCP/IP ÅÁÖÄÓÓ äÝ÷åôáé ôï êåßìåíï ôçò áðüäåéîçò áðü ôïí Web server êáé åðéóôñÝöåé ôçí øçöéáêÞ õðïãñáöÞ (SHA1 digest).

    Ï Web Server åêôõðþíåé óå ôïðéêü TCP/IP èåñìéêü åêôõðùôÞ ôçí áðüäåéîç ìå ôçí øçöéáêÞ õðïãñáöÞ.

    ÐñïóðÜèçóá íá ôïíßóù ôçí ó÷åäéáóôéêÞ áñ÷Þ ðïõ «êñýâåôáé» óôï ISO8583. Óôçí óõíÝ÷åéá, ìÝóù Ëáìßáò ôï ïìïëïãþ, íá ðåñéãñÜøù ôçí ÷ñÞóç ôçò óå Ýíá óçìåñéíü ðñüâëçìá.

    Ç óõíÝ÷åéá Ý÷åé êëÜóåéò, ìçíýìáôá êáé ïëßãïí SPDH. Stay tuned..

    ÕÃ. ¸ãñáøá üôé óôçí ðåñßðôùóç ôïõ ÁÔÌ õðÜñ÷åé ìüíï Ýíáò ëïãáñéáóìüò. Åßíáé ëÜèïò. Óôï äéðëïãñáöéêü óýóôçìá õðÜñ÷åé ðÜíôá Ýíáò ëïãáñéáóìüò ðïõ ÷ñåþíåôáé êáé Ýíáò ðïõ ðéóôþíåôáé. ÂÝâáéá õðÜñ÷åé êáé ç äçìéïõñãéêÞ ëïãéóôéêÞ ðïõ õðçñåôåß äçìéïõñãéêïýò áíèñþðïõò êáé ðáñÜãåé áîßåò áðü áÝñá.

  3. #3
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99
    Web retail application óõíÝ÷åéá

    Êáé áíôß íá ðçãáßíïõìå óôï supermarket ãéá íá øùíßóïõìå ìðïñïýìå íá øùíßæïõìå áðü ôï óðßôé ìáò ìå ðáñáããåëßåò ìÝóù ôïõ internet. Áíôß ãéá barcode scanner åðéëÝãïõìå ôá åßäç ìÝóù åéêüíùí. Ðëçñþíïõìå ìå ðéóôùôéêÞ êÜñôá, åéóÜãïíôáò ôá óôïé÷åßá ìáò óôï áóöáëÝò site ôçò ôñÜðåæáò êáé ï Ýìðïñïò ëáìâÜíåé áðëÜ ôçí åðéâåâáßùóç ôçò ðëçñùìÞò.
    Ç áñ÷éôåêôïíéêÞ ôïõ ëïãéóìéêïý ðáñáìÝíåé ç ßäéá. Ìå åëÜ÷éóôç ðñïóðÜèåéá ïé 2 ëýóåéò èá ÷ñçóéìïðïéïýí ôïí ßäéï server. Êáé ïé êåñäéóìÝíïé ðüíôïé, ìáæß ìå Üëëá ðñïùèçôéêÜ ìçíýìáôá èá êáôáöèÜíïõí ìå sms. Ç ìåãáëýôåñç ðëÝïí ÅëëçíéêÞ åôáéñåßá, ìå ãáëëéêü Üñùìá, óôñÝöåôáé óôï internet óáí íÝï ôñüðï áãïñþí ãéá ôï supermarket. Ìßá êåíôñéêÞ áðïèÞêç èá åîõðçñåôåß ôéò ðáñáããåëßåò, ôá êáôáóôÞìáôá èá ìéêñýíïõí (ëéãüôåñïé ðåëÜôåò) êáé ôá êüóôç èá ìåéùèïýí. Êáé âÝâáéá üóï ðåñéóóüôåñï ìÝíïõìå óôï óðßôé ôüóï êáëýôåñá.[V]

    ÔñÜðåæá Ýêäïóçò ôçò êÜñôáò (issuer) êáé ôñÜðåæá ôïõ EFT (aquirer).

    Ôçí êÜñôá ìáò êáé ï óõíäåäåìÝíïò ìå áõôÞ ëïãáñéáóìüò ìáò ôçñåßôáé óå ìßá ôñÜðåæá Á. Ï áñéèìüò ôçò êÜñôáò (15 øçößá + 1 øçößï LUHN check digit ) ðáñáðÝìðïõí óôçí ôñÜðåæá Ýêäïóçò. Ôï ôåñìáôéêü, óôçí ãåíéêüôçôÜ ôïõ, áíÞêåé óå êÜðïéá Üëëç ôñÜðåæá  äéáöïñåôéêÞ áðü ôïí åêäüôç ôçò êÜñôáò ðïõ ÷ñçóéìïðïéïýìå. Ôï ôåñìáôéêü èá åîõðçñåôÞóåé áðåõèåßáò ôéò êÜñôåò ôçò ßäéáò ôñÜðåæáò  êáé èá óôåßëåé üëåò ôéò îÝíåò óõíáëëáãÝò óôçí VISA, MC, ÁÌÅ× êôë. ÁõôÝò ìå ôçí óåéñÜ ôïõ èá ôéò ðñïùèÞóïõí óôçí åêäüôñéá ôñÜðåæá Á, ðïõ îÝñåé ôï õðüëïéðï ôïõ ëïãáñéáóìïý ìáò êáé ç áðÜíôçóç èá áêïëïõèÞóåé ôçí áíôßèåôç äéáäéêáóßá.

    ÁíÜëõóç & ó÷åäßáóç åíüò éäåáôïý (virtual) ISO8583 POS.

    ¸íá Üëëï äéáäåäïìÝíï ôñáðåæéêü ðñùôüêïëëï åßíáé ôï
    SPDH.

    Ðùò ðñï÷ùñÜìå ?. Äåí Ý÷ïõìå óýíïøç ãéá ôï SPDH. Èá ôï áãíïÞóïõìå Þ èá ëÜâïõìå óôïé÷åéþäç ðñüíïéá þóôå íá åßíáé åýêïëç ç ðëÞñçò õðïóôÞñéîÞ ôïõ óôçí óõíÝ÷åéá ?

    ÅðéëÝãù íá ôï õðïóôçñßîù. Îå÷íÜù ôéò éäéáéôåñüôçôåò ôïõ ISO8583 êáé óõãêåíôñþíïìáé óôéò ëåéôïõñãéêÝò ðñïäéáãñáöÝò. Ôé ðñÝðåé íá êÜíåé Ýíá ôåñìáôéêü ãéá ðéóôùôéêÝò êÜñôåò ? Êáé ôá äýï ðñùôüêïëëá Ý÷ïõí ó÷åäéáóèåß ãéá íá éêáíïðïéïýí áõôÝò áêñéâþò ôéò áíÜãêåò.

    Èá ïñßóïõìå ìéá éäåáôÞ (abstract) êëÜóç ÔBaseEFTPos ìå ìåèüäïõò ôéò ÷ñçìáôïïéêïíïìéêÝò õðçñåóßåò (ðïõ åßíáé áíåîÜñôçôåò ôïõ ðñùôïêüëëïõ) êáé óôçí óõíÝ÷åéá ôá 2 ðáéäéÜ ôçò ÔSPDHEFT êáé TISO8583EFT ðïõ õëïðïéïýí áõôÝò ôéò õðçñåóßåò ìå ôçí ÷ñÞóç êÜèå ðñùôïêüëëïõ.


    Ç ÔBaseEFTPos Ý÷åé ìåèüäïõò

    Áñ÷éêïðïßçóç - Initialization
    ÐñïÝãêñéóç - Áuthorization (óôïé÷åßá êÜñôáò, ðïóü) óå Îåíïäï÷åßá, åíïéêéÜóåéò áõôïêéíÞôùí
    Ðþëçóç - Sale(óôïé÷åßá êÜñôáò, ðïóü)
    Áêýñùóç Ðþëçóçò - Void Sale (óôïé÷åßá êÜñôáò, ðïóü)
    ÅðéóôñïöÞ - Refund (óôïé÷åßá êÜñôáò, ðïóü) Óå Üëëç ÷ñïíéêÞ óôéãìÞ
    Áêýñùóç ÅðéóôñïöÞ – Void Refund(óôïé÷åßá êÜñôáò, ðïóü)
    Ïñéóôéêïðïßçóç - Finalization

    Ç êëÜóç TISO8583EFT ðñÝðåé

    A. íá õëïðïéåß ôéò ìåèüäïõò ôïõ TBaseEFT
    B. íá ìðïñåß íá áíáêáëåß êáé íá óþæåé ôá óôïé÷åßá ôùí óõíáëëáãþí óå ìéá âÜóç äåäïìÝíùí
    Ã. íá ìïñöïðïéåß êáé íá áíáëýåé ISO8583 ìçíýìáôá
    Ä. íá áíôáëëÜóåé, ìÝóù tcp/ip, ISO8583 ìçíýìáôá ìå ôçí ôñÜðåæá.
    Å. íá åëÝã÷åé êáé íá õëïðïéåß ôïõò áíôéëïãéóìïýò (reversals)
    Æ. íá ôçñåß êáé íá êëåßíåé ôï batch
    Ç. íá îáíáóôÝëíåé ôï batch

    Ç êëÜóç TSPDHEFT ðñÝðåé
    Á. íá õëïðïéåß ôéò ìåèüäïõò ôïõ TBaseEFT
    Â. íá ìðïñåß íá áíáêáëåß êáé íá óþæåé ôá óôïé÷åßá ôùí óõíáëëáãþí óå ìéá âÜóç äåäïìÝíùí
    Ã. íá ìïñöïðïéåß êáé íá áíáëýåé SPDH ìçíýìáôá
    Ä. íá áíôáëëÜóåé, ìÝóù x25 SPDH ìçíýìáôá ìå ôçí ôñÜðåæá.
    Å. íá åëÝã÷åé êáé íá õëïðïéåß ôïõò áíôéëïãéóìïýò (reversals)
    Æ. íá ôçñåß êáé íá êëåßíåé ôï batch

    Ïé óçìáíôéêüôåñåò äéáöïñÝò óôá 2 ôñáðåæéêÜ ðñùôüêïëëá åßíáé ç ëïãéêÞ ôïõ reversal êáé ôï êëåßóéìï batch. Óôï SPDÇ ôçñïýíôáé êáé óõãêñßíïíôáé ôá óýíïëá êáé óå ðåñßðôùóç óöÜëìáôïò ç äéáäéêáóßá óôáìáôÜåé êáé áðáéôåß áíèñþðéíç åðÝìâáóç.

    ÊëÜóåéò

    ¸÷ïõìå ïñßóåé ôçí éåñáñ÷ßá ðïõ áðïôõðþíåôáé óôï ðáñáêÜôù ó÷Þìá.



    Ï Ýîù êüóìïò âëÝðåé ôéò õðçñåóßåò ðïõ ðáñÝ÷åé ôï TBasePos. ÁõôÝò áðáéôïýí ôçí åðéëïãÞ åíüò ôåñìáôéêïý, Ýíá ðïóü, ìéá êÜñôá êáé ìßá åíÝñãåéá, äëä, ï Ýìðïñïò ïëïêëÞñùóå ìéá óõíáëëáãÞ ðëçñùìÞò óôï ôåñìáôéêü ôçò ôñÜðåæáò Á ãéá ôï ðïóü ×.

    Ôï ôåñìáôéêü ÄÅÍ Ý÷åé áðåõèåßáò ðñüóâáóç óôá äåäïìÝíá ôçò âÜóçò äåäïìÝíùí. ¸ôóé ìðïñþ íá ÷ñçóéìïðïéÞóù flat áñ÷åßá Þ oracle Þ mysql ÷ùñßò íá åðçñåÜóù ôçí ëåéôïõñãéêüôçôá ôïõ TBaseEft.

    Ãéá íá áðïìïíþóù ôï TBasePos áðü ôçí âÜóç äåäïìÝíùí äçìéïõñãþ Ýíá ìßá åíäéÜìåóç êëÜóç dbHandler. ÁõôÞ åðéêïéíùíåß ìå ôï TBasePos êáé áíôáëëÜóåé äåäïìÝíá ìå ÷ñÞóç ôùí êëÜóåùí NeutralTerm êáé NeutralTrn. ÅðéðëÝïí ãíùñßæåé ðþò íá ôéò «ãåìßæåé» ìå óôïé÷åßá áðü ôçí âÜóç äåäïìÝíùí.

    Óôçí âÜóç äåäïìÝíùí äçìéïõñãþ ðßíáêåò ãéá üëåò ôéò ïíôüôçôåò ðïõ ÷ñçóéìïðïéïýìå. Ïé áíôßóôïé÷åò êëÜóåéò Ý÷ïõí óáí attributes ôá ðåäßá ôçò âÜóçò êáé êëçñïíïìïýí ôéò ìåèüäïõò ôïõò áðü ôçí êëÜóç dbTable.

    ÌÝ÷ñé ôþñá Ýìåéíá óôçí ó÷åäßáóç. Ìçí ãåëáóôåßôå. Äåí Ý÷åé óçìáóßá ðïõ ôï software åßíáé soft. Äåí Ý÷åé óçìáóßá ðïõ áëëÜæåé ó÷åôéêÜ åýêïëá. Ç ó÷åäßáóç åßíáé ôï ðñþôï âÞìá óå êÜèå project. Ôï cash flow åßíáé ôï äåýôåñï. Ç õëïðïßçóç Ýðåôáé.

    Äåí áíáöÝñù êÜôé ãéá áóöÜëåéá êáé passwords êáé encryption. Èåùñþ üôé áõôÝò ïé åöáñìïãÝò «æïõí» óå áóöáëÞ ðåñéâÜëëïíôá. ÅðéðëÝïí äåí áíáöÝñïìáé óôá êëåéäéÜ ðïõ áíôáëëÜóóïíôáé ãéá ôçí êùäéêïðïßçóç êáé áðïêùäéêïðïßçóç ôïõ PIN. Ôï èÝìá ôïõ Chip åßíáé áðü ìüíï ôïõ Ýíá èçñßï

    Ìçíýìáôá ôýðïõ ISO8583.

    ¸íá ìÞíõìá áðïôåëåßôáé áðü ôçí óýíèåóç ôùí åðéìÝñïõò ðåäßùí ôïõ. ÊÜèå ìÞíõìá Ý÷åé ìéá åðéêåöáëßäá Ýíá ðåñéå÷üìåíï êáé ðéèáíÜ Ýíá êùäéêü åðáëÞèåõóçò (crc).
    ÓõíÞèùò ôá ðåäßá áðïèçêåýïíôáé ôï Ýíá ìåôÜ ôï Üëëï êáé ÷ùñßæïíôáé ìå Ýíá ÷áñáêôÞñá (Field Separator).

    ¼ôáí üìùò Ý÷åéò ìéá áðëÞ ôçëåöùíéêÞ ãñáììÞ êáé Ýíá modem 2400 baud êÜèå åðéðëÝïí byte ìåôñÜåé. Ç ÷ñüíïò åðéêïéíùíßáò åßíáé áíÜëïãïò ìå ôï ìÝãåèïò ôïõ ìçíýìáôïò.

    ÐñÝðåé ï ó÷åäéáóôÞò íá âñåé ôñüðï þóôå íá ìåôáöÝñåé ìüíï üóá ðåäßá áðáéôïýíôáé ôçí öïñÜ. ¸ôóé åéóÜãåôáé ôï bitmap. ×ñçóéìïðïéïýìå ôá bits áðü 8 óõíå÷üìåíá bytes ãéá íá äåßîïõìå ðéá ðåäßá, (1..64) õðÜñ÷ïõí Þ ü÷é.

    Ôo ISO8583 ìÞíõìá áðïôåëåßôáé áðü ascii ÷áñáêôÞñåò êáé áñ÷ßæåé ìå êÜðïéá óôáèåñÜ ðåäßá, ôï primary bitmap (óå äåêáåîáäéêÞ áðåéêüíéóç) êáé óôçí óõíÝ÷åéá ôá ðåäßá ôïõ.
    ÅðåéäÞ üìùò ôá 64 ðåäßá äåí Þôáí áñêåôÜ ÷ñçóéìïðïéÞèçêå êáé Ýíá 2ï bitmap (secondary). Ôï 1o bit ôïõ primary bitmap óçìáôïäïôïýóå ôçí ýðáñîç Þ ü÷é ôïõ 2ïõ bitmap êáé êáôÜ óõíÝðåéá ôçí ýðáñîç 64 Þ 128 ðåäßùí óôï ìÞíõìá.

    Êþäéêáò:
    function TISO8583.FieldExists(fieldNo: integer): boolean;
     begin
      if fieldNo>64 then
       result:=TestBit(PrimaryBitmap,1) and TestBit(SecondaryBitmap,fieldNo-64)
      else
       result:=TestBit(PrimaryBitmap,fieldNo)
     end;
    ÊÜèå ðåäßï, áðåéêïíßæåôáé óå ascii áëëÜ Ý÷åé ôýðï êáé ìÞêïò. Ðùò åëÝã÷ïõìå 128 ðåäßá ?. ¸íá ìåãÜëï case statement êáé ôåëåéþóáìå. ¸íáò Üëëïò ôñüðïò åßíáé íá ðåñéãñÜøïõìå ôéò éäéüôçôåò ôùí ðåäßùí êáé íá åëÝã÷ïõìå êáèïäçãïýìåíïé áðü áõôÝò.

    Êþäéêáò:
    type  TNibble = 0..15;
          T8583FieldTypes  = (ftb,ftn,ftx_n,ftns,fta,ftan,ftans,ftz,fta_n);
          T8583FieldFormat = (ffNone,ffLLVAR,ffLLLVAR,ffMMDDhhmmss,
                              ffhhmmss,ffMMDD,ffYYMM,ffYYMMDD,ffx,ffb);
    
          T8583FieldDef = packed record
                           bit:byte;
                           kind:T8583FieldTypes;
                           len:word;
                           opt:T8583FieldFormat;
                          end; 
    
    
          T8583FieldDef = packed record
                           bit:byte;
                           kind:T8583FieldTypes;
                           len:word;
                           opt:T8583FieldFormat;
                          end;
    
    
    const FieldDefs  : array[1..128] of T8583FieldDef =
                     ((bit:  1; kind:  ftb; len:  1; Opt:ffNone),
                      (bit:  2; kind:  ftn; len: 19; Opt:ffLLVAR),
                      (bit:  3; kind:  ftn; len:  6; Opt:ffNone),
    ..
                      (bit:  7; kind:  ftn; len: 10; Opt:ffMMDDhhmmss),
    ..
                      (bit: 12; kind:  ftn; len:  6; Opt:ffhhmmss),
                      (bit: 13; kind:  ftn; len:  4; Opt:ffMMDD),
                      (bit: 14; kind:  ftn; len:  4; Opt:ffYYMM),
                      (bit: 15; kind:  ftn; len:  4; Opt:ffMMDD),
    ..
                      (bit: 28; kind:ftx_n; len:  8; Opt:ffx),
    ..
    Äéáöïñåôéêïß ôýðïé ðåäßùí ìå óôáèåñü Þ ìåôáâëçôü ìÞêïò, óôç áðïóôïëÞ áëëÜ êáé óôçí ëÞøç. Ðåäßá ìÝóá óå ðåäßá.

    Êþäéêáò:
    procedure TISO8583.SetField(fieldNo: integer;const Value: string);
     var ok:boolean;
     begin
      with FieldDefs[fieldNo] do
       begin
        case opt of
         ffLLVAR,
         ffLLLVAR : ok:=length(value)<=len;
         ffx      : ok:=length(Value)=len+1;
         ffb      : ok:=length(value)=(len div 8)*2
        else
         ok:=length(Value)=len;
        end;
    
        if not ok then
         raise Exception.CreateFmt('Invalid Field %d length %d vs %d',
                                  [fieldNo,length(value),len]);
    
        case kind of
         ftb   : ok:=isHex(Value);
         ftn   : begin
                  ok:=isN(Value);
                  if ok then
                   case opt of
                    ffMMDDhhmmss : ok:=isMMDD(copy(value,1,4)) and
                                       isHHMMSS(copy(value,5,6));
                    ffhhmmss     : ok:=isHHMMSS(value);
                    ffMMDD       : ok:=isMMDD(value);
                    ffYYMM       : ok:=isYYMM(value);
                    ffYYMMDD     : ok:=isYYMMDD(value);
                   end
                 end;
         ftx_n : ok:=(value[1] in ['C','D']) and
                     isN(copy(Value,2,length(value)-1));
         ftns  :;
         fta   :ok:=isA(Value);
         ftan  :ok:=isAN(Value);
         ftans :ok:=isANS(Value);
         ftz   :;
         fta_n :ok:=isN(Value) or isA(value);             // a or n
        end;
        if not ok then
         raise Exception.CreateFmt('Invalid Field data %d [%s]',
                                   [FieldNo,Value]);
       end;
    
      // Valid field value, store it
      fFields[pred(fieldNo)]:=value;
      if (fieldNo>64) then
       begin
        SetBit(SecondaryBitmap,fieldNo-64);
        SetBit(PrimaryBitmap,1);
       end
      else
       SetBit(PrimaryBitmap,fieldNo)
     end;
    
    
    TISO8583 = class
      private
       fFields:TStringList;
       fID:string;
       fMTI: string;
       PrimaryBitmap : array[1..8] of byte;  // 16 hex bytes
       SecondaryBitmap : array[1..8] of byte;
       function  GetData: string;
       procedure SetData(Value: string);
       function  GetField(fieldNo: integer): string;
       procedure SetField(fieldNo: integer; const Value: string);
       function  AsString(fieldNo:integer;value:int64):string;
       procedure SetBit(var buf;bitNo: integer);
       function  TestBit(var buf;bitNo: integer): boolean;
      protected
       function  isN(value:string):boolean;
       function  isANS(value:string):boolean;
       function  isA(value:string):boolean;
       function  isAN(value: string): boolean;
       ..
    
       constructor Create(const aMerchantId,aTerminalId, 
                          aAcquirerId : string); overload; virtual;
      public
       constructor Create; reintroduce; overload;
       constructor Create(const msg:string); overload;
       destructor  Destroy; override;
       procedure   AssignTo(source:TISO8583);
    
       function    FieldExists(fieldNo:integer):boolean;
       procedure   Clear; virtual;
       property    MTI: string read fMTI write fMTI;
       property    Data:string read GetData write SetData;
    
       property    Fields[fieldNo:integer]:string read GetField 
                                                  write SetField;
      end;

    ÈÝëïõìå íá óðÜóïõìå Ýíá ascii iso8583 ìÞíõìá óôá ðåäßá ðïõ ôï ó÷çìáôßæïõí.

    Êþäéêáò:
    iso8583 := TISO8583.Create;
    iso8583.Data:=msg;
    
    procedure TISO8583.SetData(Value: string);
     var i,ilen:integer;
         s:string;
         p:pByte;
         w:pword;
         b:byte;
     begin
      Clear;
      fID:=copy(value,1,6);  delete(value,1,6);
      fMTI:=copy(value,1,4); delete(value,1,4);
    
      BitCopy(value, PrimaryBitmap); delete(value,1,16);
    
      if TestBit(PrimaryBitmap,1) then begin
       BitCopy(value, SecondaryBitmap); delete(value,1,16);
       end;
    
      for i:=1 to 128 do // skip Primary and Secondary bitmaps
       if (i<>1) and (i<>65) and fieldExists(i) then
        with FieldDefs[i] do begin
          case Opt of
           ffLLVAR : begin
                      ilen:=StrToInt(copy(value,1,2));
                      delete(value,1,2);
                     end;
           ffLLLVAR: begin
                      ilen:=StrToInt(copy(value,1,3));
                      delete(value,1,3);
                     end;
           ffx     : ilen:=len+1;
           ffb     : ilen:=(len div 8)*2;
          else
           { ffMMDDhhmmss, ffhhmmss, ffMMDD, ffYYMM, ffYYMMDD, ffNone :}
           ilen:=len;
          end;
          s:=copy(value,1,ilen); delete(value,1,ilen);
    
    // áöïý ðÞñáìå ôï ðåñéå÷üìåíï ôïõ ðåäßïõ
    // ôþñá áò ôï áðïèçêåýóïõìå 
    // property Fields[FieldNo:integer]:string ... write SetField;
    
          Fields[i]:=s;
         end;
     end;
    Óõíå÷ßæåôáé…

  4. #4
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99
    Ìçíýìáôá ôýðïõ SPH.
    Êáé åäþ Ý÷ïõìå áíÜãêç íá ó÷çìáôßóïõìå ìçíýìáôá ìå ìåôáâëçôü áñéèìü ðåäßùí.
    ÊÜèå ðåäßï Ý÷åé ãéá üíïìá Ýíá ascii ÷áñáêôÞñá. Ôá ðåäßá ÷ùñßæïíôáé ìåôáîý ôïõò ìå ôïí ÷áñáêôÞñá FS (0x1C). ¸íá SPDH ìÞíõìá áðïôåëåßôáé áðü ôçí åðéêåöáëßäá êáé óôçí óõíÝ÷åéá FS+êùäéêüò_ðåäßïõ+ôéìÞ ðåäßïõ.

    Äçìéïõñãßá & áðïóôïëÞ ìçíýìáôïò
    ÐñÝðåé íá ôï óõíèÝóïõìå ôçí åðéêåöáëßäá, ôá ðåäßá ôïõ êáé ðéèáíÜ ôïí êùäéêü åëÝã÷ïõ óöÜëìáôïò. ÃñÜöïõìå ôï ìÞíõìá ôõöëÜ óå Ýíá êáíÜëé (óåéñéáêü Þ TCP/IP) , åëÝã÷ïíôáò ãéá ðéèáíÜ óöÜëìáôá êáé ôá ÷åéñéæüìáóôå êáôÜëëçëá.

    ÐáñáëáâÞ êáé áíÜëõóç ìçíõìÜôùí.
    Ç ðáñáëáâÞ åîáñôÜôáé áðü ôï êáíÜëé. Óå óåéñéáêÞ åðéêïéíùíßá ëáìâÜíïõìå Ýíá ÷áñáêôÞñá ôçí öïñÜ åíþ óôçí TCP/IP ëáìâÜíïõìå ïëüêëçñï ôï ìÞíõìá. (character vs block streams).

    Óôçí ðñþôç ðåñßðôùóç Ýíá state machine ìáò êáèïäçãåß þóôå áíÜëïãá ìå ôçí êáôÜóôáóç (åðéêåöáëßäá, ðåäßá, checksum) íá åëÝã÷ïõìå ôçí ëÞøç (êáé ôá timeouts).
    Óôï state machine åëÝã÷ïõìå ôçí äïìÞ ôïõ ìçíýìáôïò. Ï áêñéâÞò Ýëåã÷ïò ôïõ ðåñéå÷ïìÝíïõ (ôýðïò êáé äïìÞ êÜèå ðåäßïõ) Ýðåôáé.

    Óôç ðåñßðôùóç ôçò TCP/IP åðéêïéíùíßáò ðéèáíÜ äåí Ý÷ïõìå checksum (ôï ßäéï ôï TCP/IP åããõÜôáé ôçí ïñèüôçôá ôïõ ìçíýìáôïò). Äåí áðáéôåßôáé state machine êáôÜ ôçí ëÞøç êáé ðñï÷ùñÜìå áðåõèåßáò óôïí Ýëåã÷ï ôïõ ðåñéå÷ïìÝíïõ

    ¸ëåã÷ïò ôýðïõ êáé äïìÞò êÜèå ðåäßïõ
    1. Ìðïñïýìå óå Ýíá ôåñÜóôéï case íá åëÝíîïõìå êÜèå Ýíá ðåäßï (Chuck Norris way).
    2. ÕðÜñ÷åé, ç óôáôéêÞ ðåñéãñáöÞ ôùí ðåäßùí (schema) êáé ï Ýëåã÷ïò ïñèüôçôáò êÜèå ðåäßïõ ìå âÜóç ôï ó÷Þìá. ¸ôóé Ýãñáöá óå C êáé üôáí ðñï÷þñçóá óôï Delphi ÷ñçóéìïðïßçóá ôçí ßäéá ôå÷íéêÞ. Ç óõíÞèåéá åßíáé 2ç öýóç. (ðáñÜ ôïí åéêïíïãñáöçìÝíï éó÷õñéóìü ìïõ ðñïò ôïí dipoli).
    3. Óå ðñïçãïýìåíï post ðåñéÝãñáøá ôï óåéñéáêü ðñùôüêïëëï åíüò öïñïëïãéêïý åêôõðùôÞ. Óå áõôü, ï êáôáóêåõáóôÞò üñéæå ãéá êÜèå ðåäßï ôïõ ìçíýìáôïò åðéêïéíùíßáò êáé ôïí ôýðï ôïõ. (Integer, String, Amount, Price, Quantity, Rate, Date8, Time, Flags). ÊÜèå ðåäßï ëïéðüí åßíáé äéáöïñåôéêïý ôýðïõ êáé üëá Ý÷ïõí êïéíÞ ôçí áðåéêüíéóç ôïõò óå ascii.
    ÔáéñéÜæåé áðüëõôá ìå ôçí Ýííïéá ôùí domains óôéò databases.
    Íá èõìßóù üôé óôï Delphi ïé âáóéêïß ôýðïé (integer, long, double, string) ÄÅÍ åßíáé objects êáé üëá ôá objects åßíáé áðüãïíïé ôïõ TObject.

    Âáóéêïß ôýðïé êáé/Þ objects
    ¸êáíá ìÜèçìá OOP óå Ýíá ðñùôïåôÞ öïéôçôÞ ðëçñïöïñéêÞò óôï Ïéêïíïìéêü ðáíåðéóôÞìéï. Ôï Ýíá èÝìá ðïõ õðÞñîå Þôáí üôé åðñüêåéôï ãéá Java. Êáé ÷ñåéÜóôçêå íá äéáâÜóù êáé ëßãï þóôå íá êáôáíïþ ôçí óýíôáîç ôçò ãëþóóáò. Ôï 2ï êáé óçìáíôéêüôåñï èÝìá ðïõ ðñïÝêõøå Þôáí ç ÅëëçíéêÞ ïñïëïãßá. (class=ôÜîç, methods=ìçíýìáôá êôë)
    ¼ìùò ïé äõíáôüôçôåò ôçò Java ïäçãïýí óå äéáöïñåôéêü, áðüëõôá áíôéêåéìåíïóôñåöÞ, ôñüðï õëïðïßçóçò. Ç Delphi åßíáé áðüãïíïò ôçò Turbo pascal êáé Ýðñåðå íá äéáôçñÞóåé üëåò ôéò äõíáôüôçôåò ôïõ ðñïãüíïõ (óõìâáôüôçôá ðñïò ôá ðßóù Þ êëçñïíïìéêüôçôá åßíáé ôåëéêÜ ôï ßäéï ðñÜãìá)

    ¼ëïé ïé ôýðïé åßíáé objects êáé êëçñïíïìïýí áðü Ýíá âáóéêü ðáôÝñá ôï ïbject.

    Ðùò êáôáëÞãïõìå ëïéðüí.

    Êþäéêáò:
    type TObjClass = class of TObj;
    
         TObj = class
           protected
            procedure fromAscii(const a:string); virtual;
            function  toAscii:string; virtual;
            procedure nag;
           public
            function  equals(a:TObj):boolean; virtual;// same instance
            property  Ascii:string read toAscii write fromAscii;
         end;
    
         TString = class(TObj)
           private
            Fs:string;
           public
            constructor Create(const a:string);
            procedure fromAscii(const a:string); override;
            function  toAscii:string; override;
            function  equals(a:TObj):boolean; override;
           end;
    
         TA = class(TString) // alpha
           protected
            procedure fromAscii(const a:string); override;
         end;
    
         TAN  = class(TString) // alphanumeric
           protected
            procedure fromAscii(const a:string); override;
         end;
    
         TNumber = class(TObj)
           private
            Ftype: integer;
    // êáé áðëÝò ìåôáâëçôÝò èá áñêïýóáí ... :)
            FNum : record case integer of
                     0 : (b  : byte);
                     1 : (w  : word);
                     2 : (sh : shortInt);
                     3 : (sm : smallInt);
                     4 : (i  : integer);
                     5 : (c  : cardinal);
                     6 : (i64: int64);
                    end;
           public
            constructor Create(const b:byte); overload;
            constructor Create(const w:word); overload;
            constructor Create(const i:ShortInt); overload;
            constructor Create(const i:SmallInt); overload;
            constructor Create(const i:integer); overload;
            constructor Create(const c:cardinal); overload;
            constructor Create(const i:int64); overload;
            function equals(a:TObj):boolean; override;// same instance
           end;
    …
    
    { TObj }
    
    function TObj.equals(a: TObj): boolean;
     begin
      result:=self=a;
     end;
    
    procedure TObj.fromAscii(const a: string);
     begin
     end;
    
    procedure TObj.nag;
     begin
      raise Exception.CreateFmt('Invalid ascii for type %s',[ClassName]);
     end;
    
    function TObj.toAscii: string;
     begin
      result:='';
     end;
    
    { TString }
    
    constructor TString.Create(const a: string);
     begin
      Fs:=a;
     end;
    
    function TString.equals(a: TObj): boolean;
     begin
      result:=(a is ClassType) and (TString(a).Fs=Fs);
     end;
    
    procedure TString.fromAscii(const a: string);
     begin
      fs:=a;
     end;
    
    function TString.toAscii: string;
     begin
      result:=fs;
     end;
    
    { TNumber }
    
    constructor TNumber.Create(const w: word);
     begin
      FType   := 1;
      FNum.w  := w;
     end;
    
    constructor TNumber.Create(const b: byte);
     begin
      FType   := 0;
      FNum.b  := b;
     end;
    …
    function TNumber.equals(a: TObj): boolean;
     begin
      result:=(a is ClassType);
      if result then
       case Ftype of
        0 : result :=  FNum.b=TNumber(a).FNum.b;
        1 : result :=  FNum.w=TNumber(a).FNum.w;
        2 : result :=  FNum.sh=TNumber(a).FNum.sh;
        3 : result :=  FNum.sm=TNumber(a).FNum.sm;
        4 : result :=  FNum.i=TNumber(a).FNum.i;
        5 : result :=  FNum.c=TNumber(a).FNum.c;
        6 : result :=  FNum.i64=TNumber(a).FNum.i64;
       else
        result:=false;
       end;
     end;
    
    { TA }
    
    procedure TA.fromAscii(const a: string);
     var i:integer;
     begin
      for i:=1 to length(a) do
       if not (a[i] in ['A'..'Z','a'..'z']) then nag;
      fs:=a;
     end;
    
    
    { TAN }
    
    procedure TAN.fromAscii(const a: string);
     var i:integer;
     begin
      for i:=1 to length(a) do
       if not (a[i] in ['0'..'9','A'..'Z','a'..'z']) then nag;
      fs:=a;
     end;
    Äçëþíïõìå Ýíá ðßíáêá áðü Í ÔObjs.

    Êþäéêáò:
    var Fields : array[0..3] of TObj;
    Äçëþíïõìå ôçí êëÜóç êÜèå óôïé÷åßïõ ôïõ ðßíáêá

    Êþäéêáò:
    const FieldTypes : array[0..3] of TObjClass =
                       ( TString,
                         TNumber,
                         TA,
                         TAN
                       );
    Óå êÜèå èÝóç ôïõ ðßíáêá áíáèÝôïõìå Ýíá áíôéêåßìåíï ôçò êáôÜëëçëçò êëÜóçò.

    Êþäéêáò:
      for i:=low(Fields) to High(Fields) do
       Fields[i]:=FieldTypes[i].Create;
    Ï ðïëõìïñöéóìüò åí äñÜóåé.
    Êþäéêáò:
      Fields[0].Ascii:='Panos';
      Fields[1].Ascii:='12345';
      Fields[2].Ascii:='12345'; // invalid assignment, nag is called
      Fields[3].Ascii:='12345';
    Óõíå÷ßæåôáé…

  5. #5
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99
    ÐÞñá ôçëÝöùíï óôï Ãñçãüñç ãéá êÜôé Üó÷åôï. Êáé ìå ñþôçóå ãéáôß Ý÷ù ôüóï êáéñü íá ãñÜøù óôï Site. ¸êáíá êÜðïéïõò ãñÞãïñïõò õðïëïãéóìïýò êáé êáôÝëçîá óôï óõìðÝñáóìá üôé ïé áíáãíþóôåò ìïõ ìðïñåß, ìáæß ìå ôïí Ãñçãüñç íá ðëçóéÜæïõí ôïõò 6.

    ÔñïìáêôéêÞ åðéôõ÷ßá. ÏðëéóìÝíïò ëïéðüí ìå ôïí åíèïõóéáóìü ôçò óõããñáöéêÞò åðéôõ÷ßáò óõíå÷ßæù óôï ãíùóôéêü ìïõ áíôéêåßìåíï, ôï software. (ºóùò óôï ìÝëëïí üôáí áñ÷ßóù íá áíáãíùñßæù êáé ôá åîáåñéóôéêÜ íá óõíäñÜìù êáé áëëïý[8D]).

    ¸ëåã÷ïò ïñèüôçôáò ðåäßùí åíüò ìçíýìáôïò.

    ¸íá ìÞíõìá áðïôåëåßôáé áðü óõãêåêñéìÝíï Þ ìåôáâëçôü áñéèìü ðåäßùí. Ôá ðåäßá ìðïñåß íá åßíáé ðñïêáèïñéóìÝíïõ ìÞêïõò Þ íá ÷ùñßæïíôáé ìåôáîý ôïõò ìå field separators (äéá÷ùñéóôÝò ðåäßùí) Þ ôï ìÞêïò ôïõò ðåäßïõ íá åßíáé ïé 2Þ 3 ðñþôïé ÷áñáêôÞñåò.

    Ìüëéò ëÜâïõìå Ýíá ìÞíõìá ôï åëÝã÷ïõìå ãéá ôçí ïñèüôçôÜ ôïõ êáé óôç óõíÝ÷åéá ôï «óðÜìå» óôá ðåäßá ðïõ ôï óõíèÝôïõí.

    ÊÜèå ðåäßï áíÞêåé óå Ýíá ôýðï Þ domain. Ôï domain åßíáé õøçëïôÝñïõ åðéðÝäïõ Ýííïéá. Ôï double åßíáé ôýðïò áëëÜ ôï Quantity, Price, Amount åßíáé domains ìå âáóéêü ôýðï ôï double êáé åðéðëÝïí éäéüôçôåò (ìïíÜäåò, üñéá ôéìþí). Áí ôá ðåäßá åßíáé óå ascii ìïñöÞ ôüôå ÷ñçóéìïðïéïýìå Ýíá TStringList ãéá íá ôá áðïèçêåýïõìå. ÅíáëëáêôéêÜ ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå Ýíá array áðü TObjs Þ (åðçñåáóìÝíïé áðü ôçí VB êáé ôï scripting) Ýíá array of variants.

    Ôá variants óáí data type åßíáé áêñéâÞ ëýóç áðü Üðïøç ìåãÝèïõò êáé ôá÷ýôçôáò êþäéêá.

    Åßôå ìå procedural ôñüðï åßôå ìå OOP óôï ôÝëïò ðñÝðåé íá åëÝíîïõìå áí ç ôéìÞ ðïõ ðñüêåéôáé íá áíáèÝóïõìå óå Ýíá ðåäßï åßíáé åðéôñåðôÞ. Áõôü ãßíåôáé ìå êáôÜëëçëç ñïõôßíá

    Êþäéêáò:
        case kind of
         ftb   : ok:=isHex(Value);
         ftn   : begin
                  ok:=isN(Value);
                  if ok then
                   case opt of
                    ffMMDDhhmmss : ok:=isMMDD(copy(value,1,4)) and
                                       isHHMMSS(copy(value,5,6));
                    ffhhmmss     : ok:=isHHMMSS(value);
                    ffMMDD       : ok:=isMMDD(value);
                    ffYYMM       : ok:=isYYMM(value);
                    ffYYMMDD     : ok:=isYYMMDD(value);
                   end
                 end;
         ftx_n : ok:=(value[1] in ['C','D']) and
                     isN(copy(Value,2,length(value)-1));
         ftns  :;
         fta   :ok:=isA(Value);
         ftan  :ok:=isAN(Value);
         ftans :ok:=isANS(Value);
         ftz   :;
         fta_n :ok:=isN(Value) or isA(value);             // a or n
        end;
        if not ok then
         raise Exception.CreateFmt('Invalid Field data %d [%s]',
                                   [FieldNo,Value]);
       end;
    Þ ìå ôçí ÷ñÞóç regular expressions.

    Regular Expressions

    Åßíáé ìéá óåéñÜ áðü êáíüíåò (ãñáììáôéêÞ äçëáäÞ) ìå ôïõò ïðïßïõò ðåñéãñÜöïõìå áëëçëïõ÷ßåò ÷áñáêôÞñùí.

    Êþäéêáò:
    \n: ôáéñéÜæåé ìå ôçí íÝá ãñáììÞ 0x0a
    \r: ôáéñéÜæåé ìå ôçí áëëáãÞ ãñáììÞ 0x0d
    \d: ôáéñéÜæåé ìå øçößï
    . : ôáéñéÜæåé ìå ïðïéïäÞðïôá ÷áñáêôÞñá åêôüò ôïõ \n
    \:  ðñéí áðü ÷áñáêôÞñá éóïäõíáìåß ìå ôïí ÷áñáêôÞñá.
     
    ^ : ôáéñéÜæåé ìå ôçí áñ÷Þ åíüò string
    $ : ôáéñéÜæåé ìå ôï ôÝëïò åíüò string
    
    ? : ôáéñéÜæåé ìå ôï ðñïçãïýìåíï óôïé÷åßï êáìßá Þ ìßá öïñÜ (0,1)
    * : ôáéñéÜæåé ìå ôï ðñïçãïýìåíï óôïé÷åßï êáìßá Þ ðåñéóóüôåñåò öïñÝò (0,ðïëëÝò)
    + : ôáéñéÜæåé ìå ôï ðñïçãïýìåíï óôïé÷åßï ìßá Þ ðåñéóóüôåñåò öïñÝò (1,ðïëëÝò)
    {n}: ôáéñéÜæåé ìå ôï ðñïçãïýìåíï óôïé÷åßï n öïñÝò
    
    (..) : õðïÝêöñáóç, áñßèìçóç áðü ôï 0
    [..] : ïìÜäá ÷áñáêôÞñùí ðïõ ôáéñéÜæåé ìüíï ìå Ýíá ÷áñáêôÞñá
    [^..]: not ôï ðáñáðÜíù
    Áñéèìüò ôçëåöþíïõ : \d{10}
    ¸íáò ðñáãìáôéêüò áñéèìüò ìå Ýùò 2 äåêáäéêÜ : ^[\+|\-]?(\d*\.?\d{0,2})$

    ÅêðôùôéêÜ êïõðüíéá 981-982 : 98[1|2]\d{10}

    ¸ëå÷ãïò ãéá ôï ôýðï ðéóôùôéêÞò êÜñôáò
    Visa (length 16, prefix 4),
    Mastercard (length 16, prefix 51-55),
    Discover (length 16, prefix 6011),
    American Express (length 15, prefix 34 or 37).
    Êþäéêáò:
    ^((4\d{3})|(5[1-5]\d{2})|(6011))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$
    ¸ëåã÷ïò êáíüíùí ãéá éó÷õñÜ passwords

    1 Case Sensitive
    2 Íá ðåñéÝ÷ïõí ôïõëÜ÷éóôïí Ýíáí áñéèìçôéêü êáé Ýíáí áëöáâçôéêü ÷áñáêôÞñá.
    3 Íá åßíáé ôïõëÜ÷éóôïí ìÞêïõò 6 áëöáñéèìçôéêþí ÷áñáêôÞñùí (êáé ìÝãéóôï 10)
    4 Íá åðéôñÝðïíôáé óçìåßá óôßîçò(!@#$%^&*()_+|~=\‘{}[]:";’<>?,./).
    5 Ï ðñþôïò êáé ôï ôåëåõôáßïò ÷áñáêôÞñáò ôïõ íá ìçí åßíáé áñéèìüò.
    Êþäéêáò:
    ^[\D](?=.+\d)[\w!@#$%^&*()_+|~={}]{4,8}[\D]$
    Èõìçèåßôå. ¼ôáí èÝëåôå íá øÜîåôå ãéá êÜôé óýíèåôï Þ íá åëÝíîåôå ìéá êáôá÷þñçóç ãéá ïñèüôçôá ÷ñçóéìïðïéåßóôå regular expressions.



    Åðßëïãïò
    Ïé ÷ñåùóôéêÝò êÜñôåò áðáéôïýí íá õðÜñ÷åé ôï ðñïò áíÜëçøç – ðëçñùìÞ ðïóü óôïí ëïãáñéáóìü ìáò.
    Ïé ðéóôùôéêÝò êÜñôåò ðáñÝ÷ïõí ðßóôùóç êáé åßíáé óçìáíôéêü åñãáëåßï åöüóïí ðëçñþíïíôáé óôçí þñá ôïõò óå üëï ôï ðïóü êáé ü÷é ôçí åëÜ÷éóôç äïóç.
    Ôï ìåãáëýôåñï ðïóïóôü áðÜôçò ìå ðéóôùôéêÝò êÜñôåò ãßíåôáé áðü ôá óôïé÷åßá ðïõ ôçñïýí ïé Ýìðïñïé. ÐëÝïí ïé ôñÜðåæåò áðáéôïýí ôçí óõììüñöùóç ôùí ìç÷áíïãñáöéêþí óõóôçìÜôùí ôùí åìðüñùí ìå ôïí PCI DSS êáíïíéóìü.
    Ïé êÜñôåò ìå chip ÄÅÍ ðñÝðåé íá ÷ñçóéìïðïéïýíôáé óáí ìáãíçôéêÝò.
    Äåí åðéôñÝðåôáé óõíáëëáãÞ ìå ÷ñåùóôéêÞ êÜñôá ÷ùñßò PIN.

    Êáé öõóéêÜ ÌÇÍ ãñÜöåôå ôá PIN ðÜíù óôéò êÜñôåò óáò.
    ÌÇÍ ÷ñçóéìïðïéÞóôå ôï Ýôïò ãÝííçóçò óáò Þ ôï 1234 óáí PIN.
    ÂñÝóôå êÜôé ëéãüôåñï ðñïöáíÝò.

    Êáé ãéá áãïñÝò áðü ôï internet ðñïôåßíù ÌÏÍÏ prepaid êÜñôá "ãåìÜôç" ìüíï ìå ôï ðïóü ôçò áãïñÜò.

    Ó÷üëéá/äéïñèþóåéò êáé åñùôÞóåéò äåêôÝò.

    ÐÖ
    Mature software developer.

  6. #6
    ÅîÝ÷ïí ìÝëïò
    Çìåñïìçíßá åããñáöÞò
    Oct 2010
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    1,632
    Ç ìïíç "äéáöùíéá ìïõ" åéíáé ãéá ôéò prepaid.

    Åéíáé êáëåò ìïíï ãéá ôéò ôñáðåæåò ãéáôé áðïöåñïõí êåñäïò... (êáé ãéá ðéôóéñéêáäåò, ãåíéêïôåñá ãéá unbanked êáôáóôáóåéò..)
    Ãéá ôïí áðëï ÷ñçóôç å÷ïõí ôïõò éäéïõò êéíäõíïõò ïðïùò êáé ïé êáíïíéêåò.

    (ïðïïéïò äéáöùíåé íá ìïõ äùóåé ôçí prepaid ôïõ ìå 100 åõñù ìåóá êáé íá ðåñéìåíåé ôçëåöùíï áðï ôçí ôñáðåæá ôïõ ïôé ÷ñùóôáåé... )

    Ãéá ïðïéïí ðáñïëá áõôá öïâáôáé, áò öôéáîåé åíá äùñåáí ëïãáñéáóìï óõíäåäåìåíï ìå debit êáé íá âáæåé åêåé ôï ðïóï ðïõ èåëåé íá îïäåøåé ìå web-banking.
    Ìçäåíéêï êïóôïò åêäïóçò, ìçäåíéêï êïóôïò ÷ñçóçò..


    Burn baby, burn

  7. #7
    Åðßëåêôï ìÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2011
    ÈÝóç
    ×ÁÍÉÁ, , Greece.
    Éäéüôçôá:
    ÁðáíôÞóåéò
    163
    quoteïðïïéïò äéáöùíåé íá ìïõ äùóåé ôçí prepaid ôïõ ìå 100 åõñù ìåóá êáé íá ðåñéìåíåé ôçëåöùíï áðï ôçí ôñáðåæá ôïõ ïôé ÷ñùóôáåé... )
    ÄçëáäÞ ÓùôÞñç åííïåßò üôé åíþ Ý÷ù ìÝóá 100 åõñþ ìðïñåß êÜðïéïò íá ìå ÷ñåþóåé ìå 200 åõñþ êáé íá ìå åéäïðïéÞóåé ç ôñÜðåæá ìïõ üôé ÷ñùóôÜù êáé Üëëá 100 åõñþ ;

    quote:Ãéá ïðïéïí ðáñïëá áõôá öïâáôáé, áò öôéáîåé åíá äùñåáí ëïãáñéáóìï óõíäåäåìåíï ìå debit êáé íá âáæåé åêåé ôï ðïóï ðïõ èåëåé íá îïäåøåé ìå web-banking.
    Ìçäåíéêï êïóôïò åêäïóçò, ìçäåíéêï êïóôïò ÷ñçóçò..
    Ãéá áíÜëõóå ôï áõôü ðåñéóóüôåñï ìðáò êáé êáôáëÜâïõìå ôßðïôá…. Åóý ðþò áãïñÜæåéò áðü ôï éíôåñíÝô ìå áóöÜëåéá ;

  8. #8
    ÅîÝ÷ïí ìÝëïò
    Çìåñïìçíßá åããñáöÞò
    Oct 2010
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    1,632
    Õðáñ÷ïõí äéáäéêáóéåò ðïõ ìðñåé íá ãéíïõí abuse êáé íá âñåèåéò íá ÷ñùóôáò ðáñáðáíù.

    Êáé ïìùò ôï ðéï áóöáëåò ãéá áãïñåò åéíáé ç êáíïíéêç ðéóôùôéêç, ìå ôçí ðñïõðïèåóç ïôé ôçí âëåðåéò áðï ôï web banking.

    Ïôé óôñáâç êáé íá ãéíåé, åéíáé ôá ëåöôá ôïõ ðéóôùôéêïõ óïõ ïñéïõ (äëä ôçò ôñáðåæáò).
    Êáé åðåéäç ç óõíáëëáãç åéíáé ôõðïõ card not present ìðïñåéò íá ìå åõêïëéá íá áñíçèåéò ôá ðáíôá.
    Ìåôá ðñåðåé íá áðïäåéîåé ç áëëç ðëåõñá ïôé óïõ ðïõëçóå...

    Èåëù íá ðù ïôé ôåëéêá ï êéíäõíïò åéíáé éäéïò åéôå ìå prepaid åéôå ìå ÷ùñéò.
    Áðëá ïé prepaid å÷ïõí öôéáîåé åíá êëéìá øåõäïõò áóöáëåéáò.
    Íáé åéíáé ãéá ïðïéïí äåí áó÷ïëåéôáé, ãéá ôïí áó÷åôï, ãéá ôïí unbanked êëð, áëëá ï ëïãïò ðïõ ðñïùèåéôáé åéíáé ïôé ïé ôñáðåæåò ÂÃÁÆÏÕÍ ðïëõ ðåñéóóïôåñá
    Áí óêåöôåéò ïôé ðåñéðïõ 20% ôùí êáñôùí îå÷íéåôáé ìå ðïóï ôçò ôáîåùò ôïõ 15-20% ôçò áñ÷éêçò áîéáò ôï ïðïéï êáé ÷áíåôáé ìåôá áðï êáðïéïõò ìçíåò, ìéá ÷áñá ìðéæíá åéíáé.


    Burn baby, burn

  9. #9
    ÅîÝ÷ïí ìÝëïò
    Çìåñïìçíßá åããñáöÞò
    Jul 2007
    ÈÝóç
    Athens
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    4,177
    quote:ÐÞñá ôçëÝöùíï óôï Ãñçãüñç ãéá êÜôé Üó÷åôï. Êáé ìå ñþôçóå ãéáôß Ý÷ù ôüóï êáéñü íá ãñÜøù óôï Site. ¸êáíá êÜðïéïõò ãñÞãïñïõò õðïëïãéóìïýò êáé êáôÝëçîá óôï óõìðÝñáóìá üôé ïé áíáãíþóôåò ìïõ ìðïñåß, ìáæß ìå ôïí Ãñçãüñç íá ðëçóéÜæïõí ôïõò 6.
    ÐÝñá ðïõ óå åêôéìþ êáé óå ãïõóôÜñù âñÞêåò êáé åóý íá ãñÜøåéò ãéá ôéò ôñÜðåæåò...
    Ï Ýñìïò ï Ãñçãüñçò.... üóï ëáúêßóôéêï íá öáßíåôáé áõôü óå ìåñéêïýò...ìå ôéò ôñÜðåæåò åßíáé å÷èñïß....
    Ôï îÝñåéò êáé ôï îÝñù...

    http://udravlikos.gr

  10. #10
    ÌÝëïò
    Çìåñïìçíßá åããñáöÞò
    Mar 2012
    ÈÝóç
    Athens, , Greece.
    Éäéüôçôá:
    Áãíùóôç
    ÁðáíôÞóåéò
    99

    Çëåêôñïíéêü êáôÜóôçìá åéäþí èÝñìáíóçò êáé êëéìáôéóìïý

    ÃåéÜ óïõ ñå ìÜóôïñá ìå ôïõò ï÷ôñïýò óïõ. Óå Ý÷áóá ôï ïìïëïãþ.
    Åóý áðëÜ ìå ðáñáêßíçóåò íá óõíå÷ßóù ôï thread.

    ¸ãñáøá ãéá Ýíá ðñùôüêïëëï ìå óõã÷ñïíéóìü ôùí 2 Üêñùí.
    ÐåñéÝãñáøá ôïí ìåôáâëçôü áñéèìüò ðåäßï ìå bitmap Þ äéá÷ùñéóôéêÜ ðåäßùí.
    Ìßëçóá ãéá types & domains êáé õëïðïßçóç ôïõò ìå ðïëõìïñöéóìü
    êôë
    êôë

    Ìå ðëÞãùóåò. Ìå Ýñéîåò ðïëý ÷áìçëÜ êáé ÷ñåéÜæïìáé áðáñáßôçôá ãåñÞ äüóç êïøéäßùí ìå ôï áðáñáßôçôï ïßíï ãéá íá óõíÝëèù. ºóùò êáé ëßãï ñáêß íá âïçèïýóå.

    ÁëëÜ ìçí áíçóõ÷åßò. Õðüó÷ïìáé íá óõíå÷ßóù ìå ðïéü åíäéáöÝñïíôá èÝìáôá üðùò

    ÂÜóåéò äåäïìÝíùí êáé êëåéäéÜ (indexes).
    ÊáôáíåìçìÝíåò åöáñìïãÝò.

    êáé âëÝðïõìå...


Äéêáéþìáôá áðÜíôçóçò

  • You may not post new threads
  • ÄÅÍ Ý÷åôå ôï äéêáßùìá áðÜíôçóçò
  • You may not post attachments
  • ÄÅÍ ìðïñåßôå íá åðåîåñãáóôåéôå ôéò áðáíôçóåéò óáò
  •  
  • BB code is Áíïéêôü
  • Smilies are Áíïéêôü
  • [IMG] code is Áíïéêôü
  • [VIDEO] code is Êëåéóôü
  • HTML code is Êëåéóôü