Correctif sur la position des étoiles dans la fiche de saisie de réglement sous windows
[bilio:bilio.git] / src / saisie_reglement.rb
1 # coding: utf-8
2
3 class Saisie_reglement < Gtk::Dialog
4         
5         def initialize window, type, id_tiers, id_paiement=-1, suppr=false
6                 
7                 super("Saisie de réglements", window, Gtk::Dialog::DESTROY_WITH_PARENT)
8                 
9                 @type = type
10                 @id_tiers = id_tiers
11                 @montant_total = 0
12                 @id_paiement = id_paiement
13                 @window = window
14                 
15                 set_default_size 900, 500
16                 
17                 vbox = Gtk::VBox.new false, 3
18                 
19                 frame = Gtk::Frame.new
20                 frame.label = type.eql?(4) ? "Saisie d'un réglement reçu d'un client" : "Saisie d'un paiement envoyé à un fournisseur"
21                 frame.add vbox
22                 
23                 vbox.pack_start( entete(id_tiers), false, false, 3 )
24                 vbox.pack_start( corps(type,id_tiers), true, true, 3 )
25                 vbox.pack_start( pieds, false, false, 3 )
26                 
27                 self.vbox.add frame
28                 
29                 self.vbox.show_all
30                 
31                 remplir_compte
32         
33         end
34         
35         def entete id_tiers
36                 tiers = Tiers.find(id_tiers)
37                 
38                 @date = Gtk::Entry.new
39                 @date.text = DateTime.now.strftime("%d/%m/%Y")
40                 @mode = Gtk::ComboBox.new mode
41                 renderer_mode = Gtk::CellRendererText.new
42                 @mode.pack_start(renderer_mode, true)
43                 @mode.set_attributes(renderer_mode, :text => 1)
44                 @mode.active = 0
45                 @compte = Gtk::ComboBox.new Gtk::ListStore.new(Integer, String)
46                 renderer_compte = Gtk::CellRendererText.new 
47                 @compte.pack_start(renderer_compte, true)
48                 @compte.set_attributes(renderer_compte, :text => 1)
49                 @compte.active = 0
50                 @num = Gtk::Entry.new
51                 @emetteur = Gtk::Entry.new
52                 @banque = Gtk::Entry.new
53                 @note = Gtk::TextView.new
54                 scroll_note = Gtk::ScrolledWindow.new
55                 scroll_note.add @note
56                 scroll_note.set_policy Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC
57                 scroll_note.shadow_type = Gtk::SHADOW_IN
58                 
59                 table = Gtk::Table.new 3, 2, false
60                 label_tiers = Gtk::Alignment.new 0, 0, 0, 0
61                 label_tiers.add Gtk::Label.new("Tiers:") 
62                 table.attach( label_tiers, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL, 2, 2 )
63                 label_tiers_nom = Gtk::Alignment.new 0, 0, 0, 0
64                 label_tiers_nom.add Gtk::Label.new(tiers.nom)
65                 table.attach( label_tiers_nom, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL, 2, 2 )
66                 label_date = Gtk::Alignment.new 0, 0, 0, 0
67                 label_date.add Gtk::Label.new("Date:") 
68                 table.attach( label_date, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL, 2, 2 )
69                 table.attach( @date, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL, 2, 2 )
70                 label_mode = Gtk::Alignment.new 0, 0, 0, 0
71                 label_mode.add Gtk::Label.new("Mode de réglement:") 
72                 table.attach( label_mode, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL, 2, 2 )
73                 table.attach( @mode, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL, 2, 2 )
74                 label_compte = Gtk::Alignment.new 0, 0, 0, 0
75                 label_compte.add Gtk::Label.new("Compte à #{type.eql?(4) ? 'créditer' : 'débiter'}:")
76                 table.attach( label_compte, 0, 1, 3, 4, Gtk::FILL, Gtk::FILL, 2, 2 )
77                 table.attach( @compte, 1, 2, 3, 4, Gtk::FILL, Gtk::FILL, 2, 2 )
78                 label_numero = Gtk::Alignment.new 0, 0, 0, 0
79                 label_numero.add Gtk::Label.new("Numéro chèque:")
80                 table.attach( label_numero, 0, 1, 4, 5, Gtk::FILL, Gtk::FILL, 2, 2 )
81                 table.attach( @num, 1, 2, 4, 5, Gtk::FILL, Gtk::FILL, 2, 2 )
82                 label_emetteur = Gtk::Alignment.new 0, 0, 0, 0
83                 label_emetteur.add Gtk::Label.new("Emetteur chèque:")
84                 table.attach( label_emetteur, 0, 1, 5, 6, Gtk::FILL, Gtk::FILL, 2, 2 )
85                 table.attach( @emetteur, 1, 2, 5, 6, Gtk::FILL, Gtk::FILL, 2, 2 )
86                 label_banque = Gtk::Alignment.new 0, 0, 0, 0
87                 label_banque.add Gtk::Label.new("Banque:")
88                 table.attach( label_banque, 0, 1, 6, 7, Gtk::FILL, Gtk::FILL, 2, 2 )
89                 table.attach( @banque, 1, 2, 6, 7, Gtk::FILL, Gtk::FILL, 2, 2 )
90                 label_note = Gtk::Alignment.new 0, 0, 0, 0
91                 label_note.add Gtk::Label.new("Note:") 
92                 table.attach( label_note, 2, 3, 1, 2, Gtk::FILL, Gtk::FILL, 2, 2 )
93                 table.attach( scroll_note, 2, 3, 2, 7, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 2, 2 )
94                 
95                 table
96         end
97         
98         def corps type, id_tiers
99                                                                         # ID     Ref     Date   Montant  Reçu    Reste  Reglement  Etoile
100                 @liste = Gtk::ListStore.new(Integer, String, String, String, String, String, String, Gdk::Pixbuf)
101                 table_factures = Gtk::TreeView.new(@liste)
102                 
103                 star = Gdk::Pixbuf.new("resources/icons/starred.png", 16, 16)
104                 
105                 # Create a renderer with the background property set
106                 renderer_left = Gtk::CellRendererText.new
107                 renderer_right = Gtk::CellRendererText.new
108                 renderer_left.background = renderer_right.background = "white"
109                 renderer_left.yalign = renderer_right.yalign = 0
110                 renderer_left.xalign = 0
111                 renderer_right.xalign = 1
112                 
113                 col = Gtk::TreeViewColumn.new("ID", renderer_left, :text => 0)
114                 #table_factures.append_column(col)
115                 
116                 col = Gtk::TreeViewColumn.new("Factures", renderer_left, :text => 1)
117                 col.expand = true
118                 table_factures.append_column(col)               
119                 
120                 col = Gtk::TreeViewColumn.new("Date", renderer_right, :text => 2)
121                 table_factures.append_column(col)
122                 
123                 col = Gtk::TreeViewColumn.new("Montant TTC", renderer_right, :text => 3)
124                 table_factures.append_column(col)
125                 
126                 col = Gtk::TreeViewColumn.new("Reçu", renderer_right, :text => 4)
127                 table_factures.append_column(col)
128                 
129                 col = Gtk::TreeViewColumn.new("Reste à payer", renderer_right, :text => 5)
130                 table_factures.append_column(col)
131                 
132                 renderer_reglement = Gtk::CellRendererSpin.new
133                 renderer_reglement.adjustment = Gtk::Adjustment.new(0, 0, 999999, 1, 10, 0)
134                 renderer_reglement.xalign = 1
135                 renderer_reglement.digits = 2
136                 renderer_reglement.yalign = 0
137                 renderer_reglement.mode = Gtk::CellRendererText::MODE_EDITABLE
138                 renderer_reglement.editable = true
139                 renderer_reglement.signal_connect('edited') { |combo, data, text|
140                         # TODO
141                         change_reglement data, text
142                 } 
143                 col = Gtk::TreeViewColumn.new("Montant règlement", renderer_reglement, :text => 6)
144                 table_factures.append_column(col)
145                 
146                 renderer_pix = Gtk::CellRendererPixbuf.new              
147                 col = Gtk::TreeViewColumn.new("", renderer_pix, :pixbuf => 7)
148                 table_factures.append_column(col)
149                 
150                 factures = Document.where("tiers_id=? AND documenttype_id=? AND montant_regle<montant_ttc AND suppr=?", id_tiers, type, false).order(:date_document)
151                 factures.each { |f|
152                         if f.montant_regle<f.montant_ttc
153                                 iter = @liste.append
154                                 iter[0] = f.id
155                                 iter[1] = f.ref
156                                 iter[2] = f.date_document.strftime("%d/%m/%Y")
157                                 iter[3] = "%.2f" % f.montant_ttc        
158                                 iter[4] = "%.2f" % f.montant_regle      
159                                 iter[5] = "%.2f" % (f.montant_ttc-f.montant_regle)
160                                 iter[7] = star
161                         end
162                 }
163                 
164                 table_factures.signal_connect ("button-release-event") { |tree,event|
165                         # Si clic gauche et clic sur colonne étoile alors on écrit le reste à payer dans le montant
166                         e = table_factures.get_path_at_pos(event.x, event.y)
167                         if (e and event.button.eql?(1))
168                                 colonne = e[1]
169                                 if colonne.eql?(table_factures.get_column(6))
170                                         l = @liste.get_iter(e[0])
171                                         change_reglement e[0], l[5]
172                                 end
173                         end
174                 }
175                 
176                 scroll = Gtk::ScrolledWindow.new
177         scroll.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)
178         scroll.add table_factures
179         
180         scroll          
181                 
182         end
183         
184         def change_reglement data, text
185                 if text.to_f>@liste.get_iter(data)[3].to_f
186                         dialog = Gtk::MessageDialog.new(self, 
187                                 Gtk::Dialog::DESTROY_WITH_PARENT,
188                                 Gtk::MessageDialog::QUESTION,
189                                 Gtk::MessageDialog::BUTTONS_YES_NO,
190                                 "La somme saisie dépasse le montant du document, confirmez-vous ce montant ?")
191                         response = dialog.run
192                         case response
193                                 when Gtk::Dialog::RESPONSE_YES
194                                         @liste.get_iter(data)[6] = text
195                                         calcule_pieds
196                                 when Gtk::Dialog::RESPONSE_NO
197                                         @liste.get_iter(data)[6] = "0"
198                                         calcule_pieds
199                         end 
200                         dialog.destroy
201                 else
202                         @liste.get_iter(data)[6] = text
203                         calcule_pieds
204                 end
205         end
206         
207         def pieds
208                 
209                 hbox = Gtk::HBox.new false, 3
210                 
211                 align_compteur = Gtk::Alignment.new 0, 0, 0, 0
212                 @compteur = Gtk::Label.new
213                 align_compteur.add @compteur
214                 hbox.add align_compteur
215                 
216                 ok_button = Gtk::Button.new Gtk::Stock::OK
217                 ok_button.signal_connect ("clicked") { save }
218                 cancel_button = Gtk::Button.new Gtk::Stock::CANCEL
219                 cancel_button.signal_connect ("clicked") { self.destroy }
220                 align_button = Gtk::Alignment.new 1, 1, 0, 0
221                 hbox_button = Gtk::HBox.new false, 5
222                 hbox_button.add cancel_button
223                 hbox_button.add ok_button
224                 align_button.add hbox_button
225                 
226                 hbox.add align_button
227                 
228         end
229         
230         def calcule_pieds
231                 compte = 0
232                 @liste.each { |model, path, iter|
233                         compte += @liste.get_iter(path)[6].to_f
234                 }
235                 @montant_total = compte.round(2)
236                 @compteur.text = "Montant total = #{"%.2f €" % compte}"
237         end
238         
239         def mode
240                 liste = Gtk::ListStore.new(Integer, String)
241                 modes = Paiementtype.order(:id)
242                 modes.each { |m|
243                         iter = liste.append
244                         iter[0] = m.id
245                         iter[1] = m.designation                 
246                 }
247                 liste
248         end
249         
250         def remplir_compte
251                 iter_default = nil
252                 iter = nil
253                 comptes = Compte.order(:id)
254                 comptes.each { |c|
255                         iter = @compte.model.append
256                         iter[0] = c.id
257                         iter[1] = c.designation
258                         iter_default = iter if c.defaut
259                 }
260                 @compte.active_iter = (iter_default ? iter_default : iter)
261         end
262                 
263         def save
264                 
265                 if @id_paiement<1
266                         save_new_paiement
267                 else
268                         update_paiement
269                 end
270                 
271                 self.destroy
272                 
273         end
274         
275         def save_new_paiement
276         
277                 paiement = Paiement.new
278                 paiement.paiementtype_id = @mode.model.get_value(@mode.active_iter,0)
279                 paiement.tiers_id = @id_tiers
280                 paiement.compte_id = @compte.model.get_value(@compte.active_iter,0)
281                 paiement.montant = @montant_total
282                 paiement.numero = @num.text
283                 paiement.emetteur = @emetteur.text
284                 paiement.banque = @banque.text
285                 paiement.note = @note.buffer.text
286                 paiement.date_paiement = Date.parse(@date.text)
287                 paiement.date_comptable = Date.parse(@date.text)
288                 paiement.fournisseur = !@type.eql?(4)
289                 res = paiement.save
290         
291                 if res
292                         docs = []
293                         @liste.each { |model, path, iter|
294                                 if @liste.get_iter(path)[6].to_f>0
295                                         paiementdoc = Paiementdocument.new
296                                         paiementdoc.paiement_id = paiement.id
297                                         paiementdoc.document_id = @liste.get_iter(path)[0]
298                                         paiementdoc.montant = @liste.get_iter(path)[6].to_f
299                                         res = paiementdoc.save
300                                         if res 
301                                                 docs << paiementdoc.document_id unless docs.include?(paiementdoc.document_id)
302                                         end
303                                 end
304                         }
305                         ReglementController.update_montant_regle_docs docs
306                 end
307                 
308         end
309
310 end