btDescuentosTotal.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 
7 using sage.ew.objetos;
8 using sage.ew.formul;
9 using sage.ew.global;
10 using sage.ew.netvfp;
11 using sage.ew.empresa;
12 using sage.ew.functions;
13 using sage.ew.ewbase;
14 using sage.ew.interficies;
15 using sage.ew.docsven;
17 
18 namespace sage.ew.docventatpv.Clases
19 {
24  {
25  #region PROPIEDADES
26 
27  private dynamic _oDocLinea = null;
28  private dynamic _oDocumento;
29 
33  public dynamic _DocLinea
34  {
35  get { return _oDocLinea; }
36  set { _oDocLinea = value; }
37  }
38 
42  public dynamic _Documento
43  {
44  get { return this._oDocumento; }
45  set { this._oDocumento = value; }
46  }
47 
51  public docsven.UserControls.gridArtDocVenta _GridArt
52  {
53  get { return _oGridArt; }
54  set { _oGridArt = value; }
55  }
56  private docsven.UserControls.gridArtDocVenta _oGridArt;
57 
58  #endregion PROPIEDADES
59 
64  {
65  // Asociamos el texto del botón
66  this.Text = "Descuentos totales";
68  this.Click += new EventHandler(btDescuentosTotal_Click);
69  }
70 
71  void btDescuentosTotal_Click(object sender, EventArgs e)
72  {
73  bool llMateixaMoneda = false;
74 
75  decimal lnDescuento = 0; //fDESCOM_TPV.TAN_APLICAT
76  bool llNota = false; // fDESCOM_TPV.chNota.Value
77  bool llTipoDescuen = false; // fDESCOM_TPV.opgTipoDescuen.Value==1
78  decimal lnValorDto = 0; // fDESCOM_TPV.spDescuento.Value
79 
80  string lcTipoIva = string.Empty;
81  decimal lnTeorico = 0;
82  dynamic loLineaNueva = null;
83 
84 
85  //Sino tengo documento acabo
86  if (this._Documento == null)
87  return;
88 
89  //PE80955
90  if (!this._Documento._Botones._Validar_Documento())
91  return;
92 
93  //Control de solo para tickets PE-85325
94  if (_Documento._TipoDocumento != eTipoDocumento.Ticket)
95  {
96  _Documento._MessageBox("Solo aplicable a documentos tipo ticket.", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, DialogResult.None);
97  return;
98  }
99 
100  if (_Documento._Documento_CobradoOPagado())
101  {
102  _Documento._MessageBox("No es posible aplicar descuentos lineales, el documento está cobrado.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, DialogResult.OK);
103  return;
104  }
105  //fi pe80955
106 
108  dynamic loLineaActual = null;
109  if (_oDocLinea != null)
110  {
111  loLineaActual = _oDocLinea;
112  _oDocLinea = null; //Reinicio la variable
113  }
114  else
115  loLineaActual = _oDocumento._Lineas[_oGridArt._Grid.CurrentRow.Index];
116 
117  // busquem index per saber quina es la linia
118  int lnIndice = this._oGridArt._Grid.CurrentRow.Index;
119  int lnLinia = this._oGridArt._Documento._Lineas[lnIndice]._Linea;
120 
121  foreach (ewDocVentaLinTPV loLinea in _Documento._Lineas)
122  {
123  if (!String.IsNullOrWhiteSpace(loLinea._TipoIva))
124  {
125  lcTipoIva = loLinea._TipoIva;
126  break;
127  }
128 
129  }
130 
131  //llNovaLinea = (this._gridArt._Grid.RowCount == lnLinia);
132 
133  string[] lcParams = new string[4];
134 
135  //Comrpobamos si se debe abrir el formulario en FOX o en .NET
136  if (this.__Abrir_Formulario_En() <= 1)
137  {
138  //FOX
139  object[] loParametros = new object[4]
140  {
141  this._Documento._Numero, // Numero
142  this._Documento._Letra, // Letra
143  this._Documento._Pie._TotalDocumento, // Total Documento
144  true // Parametre especial
145  };
146  string lcValor = NETVFP._Ejecutar_Funcion_VFP("DESC_TOTAL_NET", loParametros);
147 
148  // S'ha de parsejar, el valor retornat
149  if (String.IsNullOrEmpty(lcValor))
150  return;
151 
152  lcParams = lcValor.Split('#');
153  if (lcParams.Length != 4)
154  return;
155 
156  // 81731
157  string lcSeparator = Convert.ToString(EW_GLOBAL._GetVariable("wc_separator"));
158  string lcPoint = Convert.ToString(EW_GLOBAL._GetVariable("wc_point"));
159  // fi 81731
160 
161  lnDescuento = Convert.ToDecimal(lcParams[0].Replace(lcSeparator, lcPoint));
162  llNota = Convert.ToBoolean(lcParams[1] == "true");
163  llTipoDescuen = Convert.ToBoolean(lcParams[2] == "true");
164  lnValorDto = Convert.ToDecimal(lcParams[3].Replace(lcSeparator, lcPoint));
165  }
166  else
167  {
168  //.NET
170  //Total del documento
171  form._TotalDocumento = this._Documento._Pie._TotalDocumento;
172  //Tipo de descuento
173  form._TipoDescuento = 1;
174  form._ShowDialog(); //Bug 114218 Cambiar .ShowDialog() por ._ShowDialog()
175 
176  //Mostramos el formulario
177  if (form.DialogResult == System.Windows.Forms.DialogResult.OK)
178  {
179  //Recogemos los resultados
180  lnDescuento = form._TotalDescuento;
181  llNota = form._AnadirNota;
182  //Tipo de descuento
183  if (form._TipoDescuento == 1)
184  {
185  llTipoDescuen = true; //Descuento por cantidad
186  lnValorDto = form._DtoImporte;
187  }
188  else
189  {
190  llTipoDescuen = false; //Descuento por tanto por ciento
191  lnValorDto = form._DtoTPC;
192  }
193  }
194  else
195  {
196  //Cancelo
197  return;
198  }
199  }
200 
201  string lcDivisa = _Documento._Cabecera._Divisa;
202  string lcMoneda = Convert.ToString(EW_GLOBAL._GetVariable("wc_moneda"));
203  string lcMascara = Convert.ToString(EW_GLOBAL._GetVariable("wc_mascaramon"));
204 
205  llMateixaMoneda = (lcDivisa == lcMoneda);
206 
207 
208  if (llTipoDescuen)
209  //Dto. por cantidad
210  lnTeorico = this._Documento._Pie._TotalDocumento - lnDescuento;
211  else
212  //Dto. por %
213  lnDescuento = lnValorDto;
214 
215 
216  decimal lnTotalTicket = this._Documento._Pie._TotalDocumento;
217  int lnActual = 0;
218 
219  if (llTipoDescuen)
220  {
221  // Intentamos ir descontando hasta cuadrar **
222  while (lnDescuento != 0 && lnActual < 4)
223  {
224  lnActual++;
225  _Aplicar_Dto_Diferencia(lnTotalTicket,lnDescuento,llTipoDescuen);
226 
227  // Revisamos si ya hemos descontado suficiente
228  lnTotalTicket = _Documento._Pie._TotalDocumento;
229 
230  lnDescuento = (lnTotalTicket - lnTeorico);
231 
232  // Diferencia tan pequeña que hay que quadrar
233  if (Math.Abs(lnDescuento) <= Convert.ToDecimal(0.01))
234  break;
235  }
236 
237 
238 
239  // Si hay descuadre, corregimos aplicando la diferencia entre % con/sin redondeo
240  // ya sé que es un poco patillero pero no encuentro ninguna solución alternativa
241  // si alguien tiene una idea de cómo hacerlo mejor...
242  if (lnDescuento != 0)
243  {
244  // añadir la dif. como línea nueva **
245  _Documento._MessageBox("Se ha detectado una diferencia por aplicación de descuento por importe de " +
246  Convert.ToString(this._Documento._Cabecera._oDivisa._MascaraImporte.Redondeo(lnValorDto)) + System.Environment.NewLine +
247  "Se creará una línea de descuento adicional para cuadrar el importe total del ticket.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, DialogResult.OK);
248 
249 
250  lnDescuento = lnDescuento * (-1);
251 
252  // Añadir línea dto. por diferencia
253  loLineaNueva = this._Documento._AddLinea();
254 
255 
256  loLineaNueva._Cuenta = Convert.ToString(EW_GLOBAL._GetVariable("wc_vcta_dol"));
257  if (String.IsNullOrWhiteSpace(lcTipoIva))
258  lcTipoIva = Convert.ToString(EW_GLOBAL._GetVariable("wc_viva_dol"));
259 
260  loLineaNueva._TipoIva = lcTipoIva;
261 
262 
263 
264 
265 
266  // El dto. siempre será con iva inc.
267  if (llMateixaMoneda)
268  {
269  loLineaNueva._PrecioIva = lnDescuento;
270  loLineaNueva._PrecioDivisaIva = lnDescuento;
271  }
272  else
273  {
274  // Dto. en divisa
275  loLineaNueva._PrecioDivisaIva = lnDescuento;
276  loLineaNueva._PrecioIva = Divisa._Conversion_En_Divisa(lnDescuento,lcDivisa,lcMoneda,lcMascara,_Documento._Cambio);
277  }
278 
279  if (_Documento._Cabecera._IvaInc)
280  {
281 
282  decimal lnIva = Convert.ToDecimal(sage.ew.db.DB.SQLValor("TIPO_IVA","CODIGO", lcTipoIva, "iva"));
283  decimal lnRecargo = Convert.ToDecimal(sage.ew.db.DB.SQLValor("TIPO_IVA","CODIGO", lcTipoIva, "recarg"));
284  decimal lnDto = this._Documento._Cabecera._oDivisa._MascaraImporte.Redondeo(lnDescuento * 100 / (100+(lnIva + lnRecargo)));
285 
286  if (llMateixaMoneda)
287  {
288  loLineaNueva._Precio = lnDto;
289  loLineaNueva._PrecioDivisa = lnDto;
290  }
291  else
292  {
293  // en divisa
294  loLineaNueva._PrecioDivisa = lnDto;
295  loLineaNueva._PrecioIva = Divisa._Conversion_En_Divisa(lnDto,lcDivisa,lcMoneda,lcMascara,_Documento._Cambio);
296  }
297  }
298 
299 
300  loLineaNueva._Coste = lnDescuento;
301  loLineaNueva._Unidades = 1;
302  loLineaNueva._Definicion = "Descuento total";
303  loLineaNueva._Escandal = "INTERNAL"; //CCR 117972 - marquem la linia pq no l'ha compti com article
304 
305  loLineaNueva._Recalcular_Importe();
306  loLineaNueva._Save();
307  }
308  }
309  else
310  {
311  // Si es por %, solo hay que aplicar una vez
312  _Aplicar_Dto_Diferencia(lnTotalTicket,lnDescuento,llTipoDescuen);
313  }
314 
315  // afegeixo una nota pel descompte
316  if (llNota)
317  {
318 
319  loLineaNueva = _Documento._AddLinea();
320 
321  if (llTipoDescuen)
322  {
323  //per quantitat
324  //REPLACE DEFINICION WITH "DESCUENTO TOTAL "+ALLTRIM(TRANSFORMAR(fDesc_TOTAL.spDescuento.Value,THISFORM.Divisa.Mascara_Importe))+" "+UPPER(THISFORM.Divisa.cmbMoneda.Value)
325  //loLineaNueva._Definicion = "DESCUENTO TOTAL " + Convert.ToString(this._Documento._Cabecera._oDivisa._MascaraImporte.Redondeo(lnValorDto));
326  // 85320
327  lnValorDto = this._Documento._Cabecera._oDivisa._MascaraImporte.Redondeo(lnValorDto);
328  loLineaNueva._Definicion = "DESCUENTO TOTAL " + lnValorDto.ToString(this._Documento._Cabecera._oDivisa._MascaraImporte._Mascara_Net) + " " + this._Documento._Cabecera._oDivisa._Nombre;
329  // fi 85320
330  }
331  else
332  {
333  // per %
334  //REPLACE DEFINICION WITH "DESCUENTO TOTAL "+ALLTRIM(TRANSFORMAR(fDesc_TOTAL.spDescuento.Value,wc_Tpc))+" %"
335 
336 
337  ewMascara loMascaraDto = new ewMascara(ew.global.EW_GLOBAL._GetMascara(KeyDiccionarioMascara.wc_tpc));
338  //loLineaNueva._Definicion = "DESCUENTO TOTAL " + lnValorDto.ToString(loMascaraDto._Mascara_Net) + " % ";
339  // 85320
340  lnValorDto = loMascaraDto.Redondeo(lnValorDto);
341  loLineaNueva._Definicion = "DESCUENTO TOTAL " + lnValorDto.ToString(loMascaraDto._Mascara_Net) + " % ";
342  // fi 85320
343  }
344 
345  // Marco que és la descripció del descompte
346  loLineaNueva._Tipo = 10;
347  loLineaNueva._Save();
348  }
349 
350 
351 
352  //Thisform.Situarse_Linea(nLinea)
353  //THISFORM.Actualizar_IVA()
354  }
355 
356  private void _Aplicar_Dto_Diferencia(decimal tnTotalTicket, decimal tnDescuento, bool tlTipoDescuen)
357  {
358  decimal lnActual = 0;
359  decimal lnTeorico = 0;
360  bool llPositivo = false;
361  decimal lnDto = 0;
362 
363  if (tnTotalTicket != 0 && tnDescuento != 0)
364  {
365  lnActual = _Documento._Pie._TotalDocumento;
366 
367  if (tlTipoDescuen)
368  {
369  lnTeorico = (tnTotalTicket - tnDescuento);
370  llPositivo = (lnTeorico > 0);
371 
372  if (lnActual != 0)
373  lnDto = Math.Round((tnDescuento / lnActual)*100,2);
374  else
375  lnDto = 0;
376  }
377  else
378  lnDto = tnDescuento;
379 
380  // Fem un recorregut per les linies
381  foreach (ewDocVentaLinTPV loLinea in _Documento._Lineas)
382  {
383  if (!String.IsNullOrWhiteSpace(loLinea._TipoIva) && loLinea._Importe != 0)
384  {
385  if (loLinea._Dto1 == 0)
386  loLinea._Dto1 = lnDto;
387  else
388  loLinea._Dto1 = loLinea._Dto1 + lnDto;
389 
390  loLinea._Recalcular_Importe();
391 
392  lnActual = _Documento._Pie._TotalDocumento;
393 
394  if (tlTipoDescuen && lnActual == lnTeorico)
395  break;
396  }
397  }
398  }
399  }
400  }
401 }
decimal _TotalDocumento
_TotalDocumento (decimal) : contendra el total del documento sobre el que aplicar el descuento ...
Clase de recurso fuertemente tipado, para buscar cadenas traducidas, etc.
KeyDiccionarioMascara
Clave para diccionario de máscaras
Interfaz utilizada en los controles que se añaden en los perfiles
Botón de descuentos totales del TPV
Crear el formulario en .NET que realice lo mismo que hace el formulario de DESC_TOTAL.SCX Este formulario deberá tener el mismo estilo que en VFP pero se le añadirá una botonera táctil en la parte derecha Este formulario tendrá 4 propiedades publicas que seran
Proporciona características adicionales de las máscaras de Eurowin
Definition: clsEwBase.cs:6212
eTipoDocumento
Detalle los tipos de documento posibles de ventas y compras
Definition: docsvenenum.cs:32
Base para los botones de Eurowin
static System.Drawing.Bitmap total_discount
Busca un recurso adaptado de tipo System.Drawing.Bitmap.
decimal Redondeo(decimal tnImporte)
Aplica el redondeo segun los decimales de la moneda
Definition: clsEwBase.cs:6296
string _Mascara_Net
Máscara convertida en formato .Net
Definition: clsEwBase.cs:6235
Clase de negocio para la DIVISA (Moneda)
Definition: Divisa.cs:76
static decimal _Conversion_En_Divisa(decimal tnImporte, string tcEnMoneda, string tcToMoneda, string tcMascara, decimal tnCambioAplicado=0)
Función que convierte un importe expresado en una moneda a otra moneda.
Definition: Divisa.cs:1064
Clase estática de acceso a Base de Datos
Definition: DB.cs:26