Έχω δουλέψει με φορολογικό μηχανισμό, γι αυτό σου είπα όσα σου είπα. Κάπου έχω και τα ΦΕΚ που περιγράφουν τί στοιχεία πρέπει να κρατάει μία εφαρμογή και τί να τυπώνει στην απόδειξη. Μήπως υπάρχουν διαφορετικά μοντέλα? Ή μήπως δουλεύουν με διαφορετικό τρόπο? Στη δική μου περίπτωση έγραφα το κείμενο της απόδειξης σε ένα αρχείο (συν κάποια επιπλέον στοιχεία) και περίμενα από το πρόγραμμα του φορολογικού μηχανισμού να επιστρέψει ένα άλλο αρχείο με την υπογραφή (και άλλα στοιχεία). Αυτό το αρχείο το διάβαζα και πρόσθετα την υπογραφή στο κείμενο της απόδειξης. Ο υπολογιστής συνδεόταν με τον φορολογικό μηχανισμό με σειριακή θύρα, και είχε ένα προγραμματάκι το οποίο επικοινωνούσε με το μηχανισμό και του έστελνε τα δικά μου αρχεία και έγραφε τις απαντήσεις.
Τώρα, ίσως ο δικός σου μηχανισμός δουλεύει διαφορετικά. Πρώτα απ' όλα, πως τυπώνεις? Χρησιμοποιώντας το PrintDocument ή τυπώνεις σε ASCII printer? Αν χρησιμοποιείς το PrintDocument ουσιαστικά στέλνεις γραφικά και εντολές στον εκτυπωτή. Το βρίσκω απίθανο ο μηχανισμός να υπογράφει τα γραφικά που του στέλνει ο printer, καθώς θα είναι αδύνατη η διασταύρωση στοιχείων από την εφορία. Πιο πιθανό φαίνεται να τυπώνεις σε text printer.
Έτσι κι αλλιώς, αυτό που ρώτησες στην αρχή δεν έχει να κάνει με το πως δουλεύει ο φορολογικός μηχανισμός. Είτε δουλεύει όπως στη δική μου περίπτωση, είτε όπως στη δική σου, αυτό που ζητάς είναι το τί γίνεται μετά. Ήδη το εικονιδιάκι του εκτυπωτή σου λέει αν εκτυπώθηκε κάτι ή αν υπάρχει πρόβλημα στην εκτύπωση. Αυτό είναι απλά ρύθμιση των Windows. Δυστυχώς όμως, αυτό μπορεί να σου πει τί γίνεται μέχρι να στείλει ο spooler την εκτύπωση στον εκτυπωτή και μόνο. Αν ο εκτυπωτής δεν έχει χαρτί, αν το χαρτί κοντεύει να τελειώσει, αν κόλλησε το χαρτί, αν έχει υπερθερμανθεί ο εκτυπωτής, αν, αν δεν μπορεί να το ξέρει ο υπολογιστής. Καθώς οι αποδείξεις είναι εξαιρετικά μικρές σε μέγεθος, κατά κανόνα θα καταλήξουν πολύ γρήγορα στο buffer του εκτυπωτή. Συνεπώς, δεν σε βοηθάει και τόσο να ξέρεις σε τί κατάσταση βρίσκεται ο spooler του υπολογιστή. Γι αυτό το λόγο κι εγώ δεν χρησιμοποίησα τελικά το PrinterQueueWatch.
Στην δική μου περίπτωση επικοινωνούσα μέσω Serial over IP με τον εκτυπωτή αποδείξεων, καθώς υπήρχε η απαίτηση πολλοί υπολογιστές να επικοινωνούν με 1 ή περισσότερους εκτυπωτές αποδείξεων οι οποίοι μπορεί να είχαν συνδεθεί σε άλλο υπολογιστή. Έτσι κι αλλιώς τις αποδείξεις τις έστελνα ως text στον εκτυπωτή μετά την υπογραφή τους από το φορολογικό μηχανισμό. Έτσι μπορούσα να στείλω κα status commands στον εκτυπωτή για να δω σε τί κατάσταση βρίσκεται, ακόμα και να τον ρυθμίσω ώστε να με ειδοποιήσει αυτόματα σε περίπτωση υπερθέρμανσης, out-of-paper κλπ. Χρησιμοποίησα την System.IO.SerialPort και άκουγα τα events για να δω το status του εκτυπωτή. Σε περίπτωση timeout, αλλά και πριν από κάθε εκτύπωση απόδειξης, χρησιμοποιούσα τα status commands για να δω σε τί κατάσταση βρίσκεται ο εκτυπωτής.
Θα μπορούσα επίσης να χρησιμοποιήσω τον printer driver του εκτυπωτή αποδείξεων για να τυπώσω, καθώς την απόδειξη την είχα ήδη έτοιμη και υπογραμμένη από το φορολογικό μηχανισμό πριν την στείλω στον εκτυπωτή. Τον κώδικα όμως τον είχα βρει ήδη να χρησιμοποιεί την σειριακή οπότε δεν θέλησα να τον αλλάξω σημαντικά. Εξάλλου, αν εκτύπωνα μέσω του PrintDocument θα έχανα τα status codes, οπότε, ούτε γάτα ούτε ζημιά.
Τέλος θέλω να κάνω μία παρατήρηση. Τα πολλά ... και οι κομμένες προτάσεις κάνουν εξαιρετικά δυσανάγνωστα όσα γράφεις και δημιουργούν κακή εντύπωση. Όσο πιο δυσανάγνωστα είναι αυτά που γράφεις, τόσο πιθανότερο είναι να σε αγνοήσουν και να μην λάβεις απάντηση. Αυτό είναι διαπιστωμένο σε όλα τα newsgroups και forums. Το έχουμε πει άπειρες φορές και εδώ.
Στη δική σου περίπτωση είσαι τυχερός που έχω ήδη κάνει αυτό που προσπαθείς να κάνεις οπότε μπόρεσα να συμπληρώσω τα κενά και να καταλάβω τί θέλεις να κάνεις.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos