QString ServerLight::categoryArticleXML() { QString textoXML = ""; QString query; BlDbRecordSet *familias; BlDbRecordSet *articulos; query = "SELECT idfamilia, codigocompletofamilia, nombrefamilia FROM familia ORDER BY nombrefamilia"; familias = mainCompany()->loadQuery(query); while (!familias->eof()) { textoXML += "<CATEGORIA>\\\n"; textoXML += "<CODCATEGORIA>"; textoXML += familias->value("codigocompletofamilia"); textoXML += "</CODCATEGORIA>\\\n"; textoXML += "<NOMCATEGORIA>"; textoXML += familias->value("nombrefamilia"); textoXML += "</NOMCATEGORIA>\\\n"; query = "SELECT idarticulo, nomarticulo, pvpivaincarticulo FROM articulo WHERE idfamilia = " + familias->value("idfamilia") + "ORDER BY nomarticulo"; articulos = mainCompany()->loadQuery(query); if (articulos->numregistros() > 0) { while (!articulos->eof()) { textoXML += "<ARTICULO>\\\n"; textoXML += "<IDARTICULO>"; textoXML += articulos->value("idarticulo"); textoXML += "</IDARTICULO>\\\n"; textoXML += "<NOMARTICULO>"; textoXML += articulos->value("nomarticulo"); textoXML += "</NOMARTICULO>\\\n"; textoXML += "<PVPARTICULO>"; textoXML += articulos->value("pvpivaincarticulo"); textoXML += "</PVPARTICULO>\\\n"; textoXML += "</ARTICULO>\\\n"; articulos->nextRecord(); } // end while } // end if textoXML += "</CATEGORIA>\\\n\\\n\\\n"; familias->nextRecord(); } // end while return textoXML; }
void FacturaView::on_mui_veralbaranes_clicked() { BL_FUNC_DEBUG AlbaranClienteView *bud = NULL; BlDbRecordSet *cur = NULL; try { QString SQLQuery = "SELECT * FROM albaran WHERE refalbaran = '" + dbValue ( "reffactura" ) + "'"; cur = mainCompany() ->loadQuery ( SQLQuery ); if ( !cur->eof() ) { while ( !cur->eof() ) { /// Como estamos en un plugin buscamos nuevas formas de creacion de objetos. int resur = g_plugins->run ( "SNewAlbaranClienteView", mainCompany() ); if ( !resur ) { blMsgInfo ( _ ( "No se pudo crear instancia de albaran" ) ); return; } // end if bud = ( AlbaranClienteView * ) g_plugParams; mainCompany() ->m_pWorkspace->addSubWindow ( bud ); bud->load ( cur->value( "idalbaran" ) ); bud->show(); cur->nextRecord(); } // end while } else { blMsgInfo ( _ ( "No hay albaranes con esta referencia" ), this ); } // end if delete cur; } catch ( ... ) { blMsgInfo ( _ ( "Error inesperado" ), this ); if ( cur ) delete cur; if ( bud ) delete bud; } // end try }
Trabajadores::Trabajadores ( BlMainCompany *emp, QWidget *parent, bool deleteOnClose ) : QDialog ( parent ), BlMainCompanyPointer ( emp ) { setupUi ( this ); connect (this, SIGNAL(rejected()), this, SLOT(closeDialog()) ); mui_password->setFocus(Qt::OtherFocusReason); installEventFilter(this); m_validUser = false; m_deleteOnClose = deleteOnClose; BlDbRecordSet *cur = mainCompany() ->loadQuery ( "SELECT * FROM trabajador" ); while ( !cur->eof() ) { QPushButton * toolbutton = new QPushButton ( mui_frame ); toolbutton->setText ( cur->value( "nomtrabajador" ) + " " + cur->value( "apellidostrabajador" ) ); toolbutton->setMaximumHeight(200); QVBoxLayout *m_hboxLayout1 = mui_frame->findChild<QVBoxLayout *> ( "hboxLayout1" ); if ( !m_hboxLayout1 ) { m_hboxLayout1 = new QVBoxLayout ( mui_frame ); m_hboxLayout1->setSpacing ( 0 ); m_hboxLayout1->setMargin ( 0 ); m_hboxLayout1->setObjectName ( QString::fromUtf8 ( "hboxLayout1" ) ); } // end if m_hboxLayout1->addWidget ( toolbutton ); connect ( toolbutton, SIGNAL ( clicked() ), this, SLOT ( trabajadorClicked() ) ); cur->nextRecord(); } // end while delete cur; }
/** \param emp \param parent **/ BalanceView::BalanceView ( BcCompany *emp, QWidget *parent, int ) : BcForm ( emp, parent ) { BL_FUNC_DEBUG setupUi ( this ); setAttribute(Qt::WA_DeleteOnClose); setTitleName ( _ ( "Balance" ) ); /// Establezco cual es la tabla en la que basarse para el sistema de permisos. setDbTableName ( "asiento" ); /// Para imprimir usaremos la plantilla balance setTemplateName("balance"); mui_cuentaInicial->setMainCompany ( emp ); /// Arreglamos la cuenta. mui_cuentaInicial->setLabel ( _ ( "Cuenta inicial:" ) ); mui_cuentaInicial->setTableName ( "cuenta" ); mui_cuentaInicial->setFieldId("idcuenta"); mui_cuentaInicial->m_valores["descripcion"] = ""; mui_cuentaInicial->m_valores["codigo"] = ""; mui_cuentaInicial->hideLabel(); mui_cuentaFinal->setMainCompany ( emp ); /// Arreglamos la cuenta. mui_cuentaFinal->setLabel ( _ ( "Cuenta final:" ) ); mui_cuentaFinal->setTableName ( "cuenta" ); mui_cuentaFinal->setFieldId("idcuenta"); mui_cuentaFinal->m_valores["descripcion"] = ""; mui_cuentaFinal->m_valores["codigo"] = ""; mui_cuentaFinal->hideLabel(); QString query = "SELECT DISTINCT length(codigo) AS orden FROM cuenta ORDER BY orden DESC"; BlDbRecordSet *niveles = NULL; /// Primero, averiguaremos la cantidad de ramas iniciales que nacen de la raíz /// (tantas como número de cuentas de nivel 2) y las vamos creando. niveles = mainCompany() ->loadQuery ( query ); while ( !niveles->eof() ) { mui_nivel->insertItem ( 0, niveles->value("orden") ); niveles->nextRecord(); } // end while delete niveles; /// Iniciamos los componentes de la fecha para que al principio aparezcan /// como el año inicial. QString cadena; cadena.sprintf ( "%2.2d/%2.2d/%4.4d", 1, 1, QDate::currentDate().year() ); mui_fechaInicial->setText ( cadena ); cadena.sprintf ( "%2.2d/%2.2d/%4.4d", 31, 12, QDate::currentDate().year() ); mui_fechaFinal->setText ( cadena ); mainCompany() ->insertWindow ( windowTitle(), this ); /// Llamamos a los scripts blScript(this); }
void TicketQToolButton::click() { BL_FUNC_DEBUG QString txt = ""; /// Copiamos el archivo. QString archivo = g_confpr->value( CONF_DIR_OPENREPORTS ) + "etiquetas.rml"; QString archivod = g_confpr->value( CONF_DIR_USER ) + "etiquetas.rml"; blCopyFile(archivo,archivod); BlFile file; file.setFileName ( archivod ); file.open ( QIODevice::ReadOnly ); QTextStream stream ( &file ); QString buff = stream.readAll(); file.close(); QString fitxersortidatxt = ""; /// Hacemos el texto de las etiquetas. m_companyact = m_albaranProveedorView->mainCompany(); QString query = "SELECT * , ceil(cantlalbaranp) AS cantidad FROM lalbaranp NATURAL LEFT JOIN articulo WHERE idalbaranp = " + m_albaranProveedorView->dbValue ( "idalbaranp" ); BlDbRecordSet *cur = m_companyact->loadQuery ( query ); while ( !cur->eof() ) { int i = 0; while ( i < cur->value( "cantidad" ).toInt() ) { fitxersortidatxt += "<blockTable><tr><td>"; fitxersortidatxt += "<para><font face=\"Helvetica\" size=\"4\">" + cur->value( "nomarticulo" ) + "</font></para>\n"; fitxersortidatxt += "<barCode code=\"code128\" height=\"0.60cm\">" + cur->value( "codigocompletoarticulo" ) + "</barCode>\n"; fitxersortidatxt += "<para><font face=\"Helvetica\" size=\"4\">" + cur->value( "codigocompletoarticulo" ) + " - (" + m_albaranProveedorView->dbValue ( "fechaalbaranp" ).left ( 10 ) + ")</font></para>\n"; // if (cur->numcampo("lotelalbaranp") != -1) // fitxersortidatxt += "<para><font face=\"Helvetica\" size=\"4\"> Lote: " + cur->value("lotelalbaranp") + "</font></para>\n"; fitxersortidatxt += "</td></tr></blockTable>"; fitxersortidatxt += "<spacer length=\"0.5cm\"/>\n"; i++; } // end while cur->nextRecord(); } // end while delete cur; buff.replace ( "[story]", fitxersortidatxt ); if ( file.open ( QIODevice::WriteOnly ) ) { QTextStream stream ( &file ); stream << buff; file.close(); } // end if blCreateAndLoadPDF ( "etiquetas" ); }
int BfBuscarReferencia_on_mui_abrirtodo_clicked_Post ( BfBuscarReferencia *ref ) { QString SQLQuery = "SELECT * FROM facturap WHERE reffacturap = '" + ref->mui_referencia->text() + "'"; BlDbRecordSet *cur = ref->mainCompany() ->loadQuery ( SQLQuery ); while ( !cur->eof() ) { FacturaProveedorView * bud = new FacturaProveedorView ( ( BfCompany * ) ref->mainCompany(), NULL ); ref->mainCompany() ->m_pWorkspace->addSubWindow ( bud ); bud->load ( cur->value( "idfacturap" ) ); bud->show(); cur->nextRecord(); } // end while delete cur; return 0; }
void Compra::on_mui_codigoarticulo_returnPressed() { QString texto = "<TABLE width=\"100%\">"; QString tventas = "0"; QString tcompras = "0"; QString bgcolor = "#FFFFFF"; texto += "<TR bgcolor=\"#BBBBBB\">"; texto += "<TD width=\"100\">Color</TD>"; texto += "<TD width=\"100\">Talla</TD>"; texto += "<TD width=\"100\">Comprados</TD>"; texto += "<TD width=\"100\">Vendidos</TD>"; texto += "<TD width=\"100\">Stock</TD>"; texto += "</TR>"; QString query = "SELECT * FROM articulo LEFT JOIN tc_articulo_alias AS t3 ON articulo.idarticulo = t3.idarticulo LEFT JOIN tc_talla AS t1 ON t3.idtc_talla = t1.idtc_talla LEFT JOIN tc_color AS t2 ON t3.idtc_color = t2.idtc_color WHERE t3.aliastc_articulo_tallacolor = '" + mui_codigoarticulo->text() + "' OR articulo.codigocompletoarticulo = '" + mui_codigoarticulo->text() + "' ORDER BY nomtc_color, nomtc_talla"; BlDbRecordSet *cur = mainCompany()->loadQuery ( query ); while ( ! cur->eof() ) { QString query1 = "SELECT SUM(cantlalbaranp) AS suma FROM lalbaranp WHERE idarticulo=" + cur->value( "idarticulo" ) + " AND idtc_talla=" + cur->value( "idtc_talla" ) + " AND idtc_color=" + cur->value( "idtc_color" ); QString query2 = "SELECT SUM(cantlalbaran) AS suma FROM lalbaran WHERE idarticulo=" + cur->value( "idarticulo" ) + " AND idtc_talla=" + cur->value( "idtc_talla" ) + " AND idtc_color=" + cur->value( "idtc_color" ); BlDbRecordSet *cur1 = mainCompany()->loadQuery ( query1 ); BlDbRecordSet *cur2 = mainCompany()->loadQuery ( query2 ); if ( !cur2->eof() ) { tventas = cur2->value( "suma" ); } // end if if ( !cur1->eof() ) { tcompras = cur1->value( "suma" ); } // end if if ( !cur1->eof() ) { texto += "<TR bgcolor=\"" + bgcolor + "\">"; texto += "<TD>" + cur->value( "nomtc_color" ) + "</TD>"; texto += "<TD>" + cur->value( "nomtc_talla" ) + "</TD>"; texto += "<TD align=\"right\">" + tcompras + "</TD>"; texto += "<TD align=\"right\">" + tventas + "</TD>"; texto += "<TD align=\"right\">" + QString::number ( tcompras.toFloat() - tventas.toFloat() ) + "</TD>"; texto += "</TR>"; } // end if delete cur1; delete cur2; cur->nextRecord(); if ( bgcolor == "#FFFFFF" ) { bgcolor = "#CCCCFF"; } else { bgcolor = "#FFFFFF"; } // end if } // end while delete cur; mui_subform->setText ( texto ); }
/** \param as \return **/ int BcAsientoForm_guardaAsiento1_post ( BcAsientoForm *asientoForm ) { BL_FUNC_DEBUG BcCompany *companyact = asientoForm->company(); QString cuentas = ""; QString query = "SELECT valor FROM configuracion WHERE nombre = 'RegistroEmitida' OR nombre = 'RegistroSoportada'"; BlDbRecordSet *curvalor = companyact->loadQuery ( query ); while ( !curvalor->eof() ) { /// Preparamos una expresión regular para usar en la consulta. cuentas += curvalor->value( "valor" ) + "%|"; curvalor->nextRecord(); } // end while delete curvalor; /// Le quitamos el último '|' que nos sobra. cuentas.truncate ( cuentas.length() - 1 ); /// Recorremos la tabla en busca de entradas de factura no introducidas y las /// preguntamos antes de cerrar nada. QString SQLQuery = "SELECT bcontrapartidaborr(idborrador) AS contra FROM borrador LEFT JOIN cuenta ON borrador.idcuenta = cuenta.idcuenta WHERE idasiento = " + asientoForm->dbValue ( "idasiento" ) + " AND codigo SIMILAR TO '" + companyact->sanearCadena ( cuentas.toAscii().constData() ) + "' GROUP BY contra"; BlDbRecordSet *cursborr = companyact->loadQuery ( SQLQuery ); while ( !cursborr->eof() ) { int idborrador = cursborr->value( "contra" ).toInt(); RegistroIvaView *reg = new RegistroIvaView ( companyact, 0 ); reg->inicializa1 ( idborrador ); companyact->pWorkspace() ->addSubWindow ( reg ); reg->show(); cursborr->nextRecord(); } // end while delete cursborr; return 0; }
void AlbaranProveedorView::on_mui_verpedidosproveedor_clicked() { BL_FUNC_DEBUG QString query = "SELECT * FROM pedidoproveedor WHERE refpedidoproveedor = '" + dbValue ( "refalbaranp" ) + "'"; BlDbRecordSet *cur = mainCompany() ->loadQuery ( query ); while ( !cur->eof() ) { /// Como estamos en un plugin buscamos nuevas formas de creacion de objetos. int resur = g_plugins->run ( "SNewPedidoProveedorView", ( BfCompany * ) mainCompany() ); if ( !resur ) { blMsgInfo (_( "no se pudo crear instancia de pedido proveedor" )); return; } // end if PedidoProveedorView * pedpro = ( PedidoProveedorView * ) g_plugParams; pedpro->load ( cur->value( "idpedidoproveedor" ) ); mainCompany() ->m_pWorkspace->addSubWindow ( pedpro ); pedpro->show(); cur->nextRecord(); } // end while delete cur; }
/** \param parent **/ BcModelo300Imprimir2PS::BcModelo300Imprimir2PS ( QWidget *parent ) : QDialog ( parent ) { BL_FUNC_DEBUG setupUi ( this ); QString query = "SELECT descripcion, bancoent_cuenta, codigo FROM cuenta WHERE codigo LIKE '572%%' AND codigo > 572"; BlPostgreSqlClient *metabase = new BlPostgreSqlClient(); metabase->inicializa ( "bulmages" ); ///[TODO] CAMBIAR!!!! metabase->begin(); fprintf ( stderr, "%s\n", query.toAscii().constData() ); BlDbRecordSet *cur = metabase->loadQuery ( query, "bancos" ); int nTuples = cur->numregistros(); nombresccc = new QString[nTuples]; numerccc = new QString[nTuples]; for ( int i = 0; i < nTuples; i++ ) { nombresccc[i] = cur->value( "descripcion" ); nombresccc[i] += " "; nombresccc[i] += cur->value( "codigo" ); numerccc[i] = cur->value( "bancoent_cuenta" ); // cout << nombresccc[i].toAscii().constData() << "\t" << numerccc[i].toAscii().constData() << "\n"; combocuentas->addItem ( nombresccc[i] ); cur->nextRecord(); } // end for delete cur; delete metabase; if ( nTuples == 0 ) { /// Si no tenemos ninguna cuenta de banco... sincuentasbancarias = true; personalButton->setChecked ( true ); personalButtonPressed(); cuentaButton->setDisabled ( true ); } // end if }
void generarVencimientos (FacturaView *art) { BlDbRecordSet *cur1 = art->mainCompany()->loadQuery("SELECT totalfactura FROM factura WHERE idfactura = " + art->dbValue("idfactura")); blMsgInfo( _("El total de la factura es :") + cur1->value("totalfactura")); BlFixed contado("0.00"); BlDbRecordSet *cur = art->mainCompany()->loadQuery("SELECT * FROM vencimientocliente WHERE idcliente = " + art->dbValue("idcliente")); while (!cur->eof()) { QString query = "SELECT ffactura + " + cur->value("diasvencimientocliente") + " AS fechav, totalfactura / 100 * "+cur->value("porcentajevencimientocliente")+" AS porcent FROM factura WHERE idfactura = " + art->dbValue("idfactura"); if (cur->isLastRecord()) { query = "SELECT ffactura + " + cur->value("diasvencimientocliente") + " AS fechav, totalfactura - "+ contado.toQString('.') +" AS porcent FROM factura WHERE idfactura = " + art->dbValue("idfactura"); } //end if BlDbRecordSet *cur2 = art->mainCompany()->loadQuery(query); /// REALIZAMOS EL QUERY query = "INSERT INTO vencimientoc (idfactura, fechavencimientoc, cantvencimientoc, idforma_pago, refvencimientoc, idcliente) VALUES ("+art->dbValue("idfactura")+",'"+cur2->value("fechav")+"',"+cur2->value("porcent")+","+cur->value("idforma_pago")+",'"+art->dbValue("reffactura")+"',"+art->dbValue("idcliente")+")"; contado = contado + BlFixed(cur2->value("porcent")); art->mainCompany()->runQuery(query); delete cur2; cur->nextRecord(); } // end while delete cur; delete cur1; }
/** \param emp **/ BalancePrintView::BalancePrintView ( BfCompany *emp, QWidget *parent, int ) : BfForm(emp, parent) // : QDialog ( 0 ), BlMainCompanyPointer ( emp ) { BL_FUNC_DEBUG setupUi ( this ); mui_cuentaInicial->setMainCompany ( emp ); mui_cuentaInicial->setLabel ( _ ( "Cuenta inicial:" ) ); mui_cuentaInicial->setTableName ( "cuenta" ); mui_cuentaInicial->setFieldId("idcuenta"); mui_cuentaInicial->m_valores["descripcion"] = ""; mui_cuentaInicial->m_valores["codigo"] = ""; mui_cuentaInicial->hideLabel(); mui_cuentaFinal->setMainCompany ( emp ); mui_cuentaFinal->setLabel ( _ ( "Cuenta final:" ) ); mui_cuentaFinal->setTableName ( "cuenta" ); mui_cuentaFinal->setFieldId("idcuenta"); mui_cuentaFinal->m_valores["descripcion"] = ""; mui_cuentaFinal->m_valores["codigo"] = ""; mui_cuentaFinal->hideLabel(); /// Buscamos los diferentes niveles que existen según existan en la tabla /// de cuentas. mainCompany() ->begin(); QString query = "SELECT nivel(codigo) FROM cuenta GROUP BY nivel ORDER BY nivel"; BlDbRecordSet *niveles = mainCompany() ->loadQuery ( query, "Niveles" ); int i = 0; while ( !niveles->eof() ) { /// Inicializamos la tabla de nivel. mui_nivel->insertItem ( i, niveles->value( "nivel" ) ); niveles->nextRecord(); i++; } // end while mainCompany() ->commit(); delete niveles; }
/** \param cuentas \param ramas **/ void BcPlanContableArbol::SintetizarRamas ( BlDbRecordSet **cuentas, tiporama **ramas ) { BL_FUNC_DEBUG tiporama *guia, *rama; tipohoja *hoja; int nivel; BlDbRecordSet *ptrcuentas = *cuentas; nivel = atoi ( ptrcuentas->value( "nivel" ).toAscii().constData() ); ptrcuentas->nextRecord(); guia = NULL; while ( !ptrcuentas->eof() && ( atoi ( ptrcuentas->value( "nivel" ).toAscii().constData() ) > nivel ) ) { /// Reservamos un huequecito de memoria para almacenar los datos de la rama. rama = new tiporama; if ( !guia ) { *ramas = guia = rama; } else { guia->sgte = rama; guia = guia->sgte; } // end if hoja = new tipohoja; /// Idem para una hojita. hoja->idcuenta = atoi ( ptrcuentas->value( "idcuenta" ).toAscii().constData() ); hoja->codigo = ptrcuentas->value( "codigo" ); hoja->descripcion = ptrcuentas->value( "descripcion" ); hoja->saldoant = hoja->debe = hoja->haber = hoja->saldo = hoja->debeej = hoja->haberej = hoja->saldoej = BlFixed ( "0.00" ); hoja->numapuntes = 0; hoja->ramas = NULL; guia->hoja = hoja; guia->sgte = NULL; /// Pero aún puede haber más ramas que crezcan, en tal caso habrá /// que sintetizarlas SintetizarRamas ( &ptrcuentas, & ( hoja->ramas ) ); } // end while }
/** \return **/ void BcCuentasAnualesImprimirView::on_mui_aceptar_clicked() { BL_FUNC_DEBUG QString finicial = mui_fechainicial->text(); QString ffinal = mui_fechafinal->text(); QString finicial1 = mui_fechainicial1->text(); QString ffinal1 = mui_fechafinal1->text(); if ( finicial1 == "" ) { finicial1 = finicial; } // end if if ( ffinal1 == "" ) { ffinal1 = ffinal; } if ( finicial == "" || ffinal == "" ) { return; } // end if /** Version sin ARBOL /// Ponemos todos los valores de las cuentas. Hacemos la carga. QDomNodeList lcuentas = m_doc.elementsByTagName("CUENTA"); for (int i = 0; i < lcuentas.count(); i++) { QDomNode cuenta = lcuentas.item(i); QDomElement e1 = cuenta.toElement(); /// try to convert the node to an element. if( !e1.isNull() ) { /// the node was really an element. /// Este es el cálculo de los saldos para la cuenta. QString query = "SELECT saldototal('" + e1.text() + "','" + finicial + "','" + ffinal + "') AS valoract, saldototal('" + e1.text() + "','" + finicial1 + "','" + ffinal1 + "') AS valorant"; BlDbRecordSet *cur = mainCompany()->loadQuery(query); if (!cur->eof()) { QString valoract = cur->value("valoract"); QString valorant = cur->value("valorant"); QDomNode c = e1.parentNode(); agregaValores(c, valoract, valorant); } // end if delete cur; } // end if } // end for **/ /** Version con ARBOL: mas rollo de codigo pero muuuucho mas eficiente **/ /// Vamos a crear un arbol en la memoria dinamica con /// los distintos niveles de cuentas. /// Primero, averiguaremos la cantidad de ramas iniciales (tantos como /// numero de cuentas de nivel 2) y las vamos creando. mainCompany() ->begin(); QString query = "SELECT *, nivel(codigo) AS nivel FROM cuenta ORDER BY codigo"; BlDbRecordSet *ramas; ramas = mainCompany() ->loadQuery ( query, "Ramas" ); BcPlanContableArbol *arbolP1, *arbolP2; /// un arbol por cada periodo arbolP1 = new BcPlanContableArbol; arbolP2 = new BcPlanContableArbol; while ( !ramas->eof() ) { if ( atoi ( ramas->value( "nivel" ).toLatin1().constData() ) == 2 ) { /// Cuenta raíz. arbolP1->nuevaRama ( ramas ); arbolP2->nuevaRama ( ramas ); } // end if ramas->nextRecord(); } // end while arbolP1->inicializa ( ramas ); arbolP2->inicializa ( ramas ); delete ramas; mainCompany() ->commit(); QRegExp rx ( "^.*perdidas y ganancias.*$" ); /// filtro para saber si es el de perdidas y ganancias rx.setCaseSensitivity ( Qt::CaseInsensitive ); QString asiento; /// Discernimos entre Balances y Cuenta de Resultados if ( rx.exactMatch ( m_doc.elementsByTagName ( "TITULO" ).item ( 0 ).toElement().text() ) ) /// Hay que excluir el asiento de Regularizacion para el calculo de beneficios o perdidas si existe ya en el periodo asiento = "%Asiento de Regularizaci%"; else asiento = "%Asiento de Cierre%"; /// No hay que tener en cuenta el asiento de cierre para obtener los saldos /// OJO!! Antes de nada, hay que calcular el asiento de REGULARIZACION que nos guarda el resultado en la 129 BcAsientoView *asientoReg; int resur = g_plugins->run ( "SNewBcAsientoView", (BcCompany *) mainCompany() ); if ( ! resur) { blMsgInfo("No se pudo crear instancia de asientos"); return; } // end if asientoReg = (BcAsientoView *) g_plugParams; // ( ( BcCompany * ) mainCompany() ) ->regularizaempresa ( finicial, ffinal ); asientoReg ->asientoRegularizacion ( finicial, ffinal ); /// Ahora, recopilamos todos los apuntes agrupados por cuenta para poder /// establecer así los valores de cada cuenta para el periodo 1. mainCompany() ->begin(); query = "SELECT cuenta.idcuenta, numapuntes, cuenta.codigo, saldoant, debe, haber, saldo, debeej, haberej, saldoej FROM (SELECT idcuenta, codigo FROM cuenta) AS cuenta NATURAL JOIN (SELECT idcuenta, count(idcuenta) AS numapuntes,sum(debe) AS debeej, sum(haber) AS haberej, (sum(debe)-sum(haber)) AS saldoej FROM apunte WHERE EXTRACT(year FROM fecha) = EXTRACT(year FROM timestamp '" + finicial + "') GROUP BY idcuenta) AS ejercicio LEFT OUTER JOIN (SELECT idcuenta,sum(debe) AS debe, sum(haber) AS haber, (sum(debe)-sum(haber)) AS saldo FROM apunte WHERE fecha >= '" + finicial + "' AND fecha <= '" + ffinal + "' AND conceptocontable NOT SIMILAR TO '" + asiento + "' GROUP BY idcuenta) AS periodo ON periodo.idcuenta=ejercicio.idcuenta LEFT OUTER JOIN (SELECT idcuenta, (sum(debe)-sum(haber)) AS saldoant FROM apunte WHERE fecha < '" + finicial + "' GROUP BY idcuenta) AS anterior ON cuenta.idcuenta=anterior.idcuenta ORDER BY codigo"; BlDbRecordSet *hojas; hojas = mainCompany() ->loadQuery ( query, "Periodo1" ); /// Para cada cuenta con sus saldos calculados hay que actualizar hojas del árbol. while ( !hojas->eof() ) { arbolP1->actualizaHojas ( hojas ); hojas->nextRecord(); } // end while mainCompany() ->commit(); asientoReg->on_mui_borrar_clicked ( false ); /// borramos el asiento temporal creado indicando que no queremos confirmacion /// Para el segundo periodo, calculamos el asiento de REGULARIZACION que nos guarda el resultado en la 129 // ( ( BcCompany * ) mainCompany() ) ->regularizaempresa ( finicial1, ffinal1 ); asientoReg ->asientoRegularizacion ( finicial1, ffinal1 ); // asientoReg = ( ( BcCompany * ) mainCompany() ) ->intapuntsempresa2(); /// Ahora, recopilamos todos los apuntes agrupados por cuenta para poder /// establecer así los valores de cada cuenta para el periodo 2. mainCompany() ->begin(); query = "SELECT cuenta.idcuenta, numapuntes, cuenta.codigo, saldoant, debe, haber, saldo, debeej, haberej, saldoej FROM (SELECT idcuenta, codigo FROM cuenta) AS cuenta NATURAL JOIN (SELECT idcuenta, count(idcuenta) AS numapuntes,sum(debe) AS debeej, sum(haber) AS haberej, (sum(debe)-sum(haber)) AS saldoej FROM apunte WHERE EXTRACT(year FROM fecha) = EXTRACT(year FROM timestamp '" + finicial1 + "') GROUP BY idcuenta) AS ejercicio LEFT OUTER JOIN (SELECT idcuenta,sum(debe) AS debe, sum(haber) AS haber, (sum(debe)-sum(haber)) AS saldo FROM apunte WHERE fecha >= '" + finicial1 + "' AND fecha <= '" + ffinal1 + "' AND conceptocontable NOT SIMILAR TO '" + asiento + "' GROUP BY idcuenta) AS periodo ON periodo.idcuenta=ejercicio.idcuenta LEFT OUTER JOIN (SELECT idcuenta, (sum(debe)-sum(haber)) AS saldoant FROM apunte WHERE fecha < '" + finicial1 + "' GROUP BY idcuenta) AS anterior ON cuenta.idcuenta=anterior.idcuenta ORDER BY codigo"; hojas = mainCompany() ->loadQuery ( query, "Periodo2" ); /// Para cada cuenta con sus saldos calculados hay que actualizar hojas del árbol. while ( !hojas->eof() ) { arbolP2->actualizaHojas ( hojas ); hojas->nextRecord(); } // end while delete hojas; mainCompany() ->commit(); asientoReg->on_mui_borrar_clicked ( false ); /// borramos indicando que no queremos confirmacion QDomNodeList lcuentas = m_doc.elementsByTagName ( "CUENTA" ); for ( int i = 0; i < lcuentas.count(); i++ ) { QDomNode cuenta = lcuentas.item ( i ); QDomElement e1 = cuenta.toElement(); QString valorP1, valorP2; BlFixed valor = BlFixed ( "0.00" ); if ( !e1.isNull() ) { if ( arbolP1->irHoja ( e1.text() ) ) valor = BlFixed ( arbolP1->hojaActual ( "saldo" ) ); else valor = BlFixed ( "0.00" ); valorP1 = valor.toQString(); if ( arbolP2->irHoja ( e1.text() ) ) valor = BlFixed ( arbolP2->hojaActual ( "saldo" ) ); else valor = BlFixed ( "0.00" ); valorP2 = valor.toQString(); QDomNode c = e1.parentNode(); agregaValores ( c, valorP1, valorP2 ); } // end if } // end for /// Eliminamos el árbol y cerramos la conexión con la BD. delete arbolP1; delete arbolP2; /** Fin de la version con ARBOL **/ /// Hacemos el calculo recursivo del balance. bool terminado = false; while ( !terminado ) { terminado = true; /// Recogemos los valores de cuenta. QDomNodeList litems = m_doc.elementsByTagName ( "FORMULA" ); for ( int i = 0; i < litems.count(); i++ ) { QDomNode item = litems.item ( i ); QDomElement e1 = item.toElement(); /// Try to convert the node to an element. if ( !e1.isNull() ) { /// The node was really an element. terminado &= procesaFormula ( item ); } // end if } // end for } // end while /// Una vez que tenemos el objeto bien generado y a punto pasamos a la generacion del PDF. imprimir ( finicial, ffinal, finicial1, ffinal1 ); }
void AlbaranClienteView::on_mui_verpedidocliente_clicked() { BL_FUNC_DEBUG PedidoClienteView *bud = NULL; BlDbRecordSet *cur = NULL; try { /// Comprueba si disponemos de los datos mínimos. Si no se hace esta /// comprobación la consulta a la base de datos será erronea y al hacer /// el siguiente cur->eof() el programa fallará. /// Comprobamos que existe el pedido con esos datos, y en caso afirmativo lo mostramos. QString SQLQuery = ""; if ( dbValue ( "refalbaran" ).isEmpty() || dbValue ( "idcliente" ).isEmpty() ) { /// El presupuesto no se ha guardado y no se dispone en la base de datos /// de estos datos. Se utilizan en su lugar los del formulario. /// Verifica que exista, por lo menos, un cliente seleccionado. if ( mui_idcliente->id().isEmpty() ) { blMsgInfo ( _ ( "Tiene que seleccionar un cliente" ), this ); return; } else { SQLQuery = "SELECT * FROM pedidocliente WHERE refpedidocliente = '" + mui_refalbaran->text() + "' AND idcliente = " + mui_idcliente->id(); } // end if } else { SQLQuery = "SELECT * FROM pedidocliente WHERE refpedidocliente = '" + dbValue ( "refalbaran" ) + "' AND idcliente = " + dbValue ( "idcliente" ); } // end if cur = mainCompany() ->loadQuery ( SQLQuery ); if ( !cur->eof() ) { while ( !cur->eof() ) { /// Como estamos en un plugin buscamos nuevas formas de creacion de objetos. int resur = g_plugins->run ( "SNewPedidoClienteView", ( BfCompany * ) mainCompany() ); if ( !resur ) { blMsgInfo (_( "no se pudo crear instancia de pedido cliente" )); return; } // end if bud = ( PedidoClienteView * ) g_plugParams; mainCompany() ->m_pWorkspace->addSubWindow ( bud ); bud->load ( cur->value( "idpedidocliente" ) ); bud->show(); cur->nextRecord(); } // end while } else { blMsgInfo ( _ ( "No hay pedidos con la misma referencia." ), this ); BlDebug::blDebug ( Q_FUNC_INFO, 0, _("No hay pedidos con esta referencia.") ); } // end if delete cur; } catch ( ... ) { blMsgInfo ( _ ( "Error inesperado" ), this ); if ( cur ) delete cur; if ( bud ) delete bud; } // end try }
void Trabajadores::trabajadorClicked() { BtCompany *emp1 = ( BtCompany * ) mainCompany(); BtTicket *ticket = NULL; BtTicket *ticketv = NULL; bool encontrado = false; /// Buscamos cual ha sido el trabajador pulsado. BlDbRecordSet *cur = mainCompany() ->loadQuery ( "SELECT * FROM trabajador" ); while ( !encontrado && !cur->eof() ) { if ( ( ( QPushButton * ) sender() ) ->text() == cur->value( "nomtrabajador" ) + " " + cur->value( "apellidostrabajador" ) && ((cur->value("passwordtrabajador") == mui_password->text() || cur->value("passwordtrabajador") == "")) ) { encontrado = true; } else { cur->nextRecord(); } // end if } // end while if (encontrado) { /// Buscamos el ticket vacio de este trabajador y lo pintamos for ( int i = 0; i < emp1->listaTickets() ->size(); ++i ) { ticket = emp1->listaTickets() ->at ( i ); if ( ticket->nomTicketDefecto() == ticket->dbValue ( "nomticket" ) && cur->value( "idtrabajador" ) == ticket->dbValue ( "idtrabajador" ) ) { ( ( BtCompany * ) mainCompany() ) ->setTicketActual ( ticket ); ticket->pintar(); ticketv = ticket; }// end if }// end for /// Si el trabajador no tiene ticket vacio lo creamos y le ponemos el idtrabajador. if ( !ticketv ) { BtTicket * tick = emp1->newBtTicket(); tick->setDbValue ( "idtrabajador", cur->value( "idtrabajador" ) ); emp1->setTicketActual ( tick ); emp1->listaTickets() ->append ( tick ); tick->pintar(); }// end if /// Segun los privilegios que tenga el camarero le desabilitamos determinados objetos. if(cur->value("admintrabajador") == "t") { QToolButton *toolz = g_main->findChild<QToolButton *> ( "mui_z" ); if (toolz) { toolz->setEnabled(true); } // end if QToolButton *toolx = g_main->findChild<QToolButton *> ( "mui_x" ); if (toolx) { toolx->setEnabled(true); } // end if QToolButton *toolborraticket = g_main->findChild<QToolButton *> ( "mui_borrarticket" ); if (toolborraticket) { toolborraticket->setEnabled(true); } // end if } else { QToolButton *toolz = g_main->findChild<QToolButton *> ( "mui_z" ); if (toolz) { toolz->setEnabled(false); } // end if QToolButton *toolx = g_main->findChild<QToolButton *> ( "mui_x" ); if (toolx) { toolx->setEnabled(false); } // end if QToolButton *toolborraticket = g_main->findChild<QToolButton *> ( "mui_borrarticket" ); if (toolborraticket) { toolborraticket->setEnabled(false); } // end if } // end if delete cur; m_validUser = true; done ( 0 ); } // end if }
void estadisticasview::presentar() { QString query; BlDbRecordSet *cursorapt; QString finicial = "01/01/2003"; QString ffinal = "31/12/2005"; QString cinicial = "10"; QString cfinal = "99"; // La consulta es compleja, requiere la creacion de una tabla temporal y de cierta mandanga por lo que puede // Causar problemas con el motor de base de datos. fprintf ( stderr, "BALANCE: Empezamos a hacer la presentacion\n" ); dbConnection->begin(); query.sprintf ( "CREATE TEMPORARY TABLE balance AS SELECT cuenta.idcuenta, codigo, nivel(codigo) AS nivel, cuenta.descripcion, padre, tipocuenta ,debe, haber, tdebe, thaber,(tdebe-thaber) AS tsaldo, (debe-haber) AS saldo, adebe, ahaber, (adebe-ahaber) AS asaldo FROM cuenta LEFT JOIN (SELECT idcuenta, sum(debe) AS tdebe, sum(haber) AS thaber FROM apunte WHERE fecha >= '%s' AND fecha<= '%s' GROUP BY idcuenta) AS t1 ON t1.idcuenta = cuenta.idcuenta LEFT JOIN (SELECT idcuenta, sum(debe) AS adebe, sum(haber) AS ahaber FROM apunte WHERE fecha < '%s' GROUP BY idcuenta) AS t2 ON t2.idcuenta = cuenta.idcuenta", finicial.ascii(), ffinal.ascii(), finicial.ascii() ); dbConnection->runQuery ( query ); query.sprintf ( "UPDATE BALANCE SET padre=0 WHERE padre ISNULL" ); dbConnection->runQuery ( query ); query.sprintf ( "DELETE FROM balance WHERE debe=0 AND haber =0" ); dbConnection->runQuery ( query ); // Para evitar problemas con los nulls hacemos algunos updates query.sprintf ( "UPDATE BALANCE SET tsaldo=0 WHERE tsaldo ISNULL" ); dbConnection->runQuery ( query ); query.sprintf ( "UPDATE BALANCE SET tdebe=0 WHERE tdebe ISNULL" ); dbConnection->runQuery ( query ); query.sprintf ( "UPDATE BALANCE SET thaber=0 WHERE thaber ISNULL" ); dbConnection->runQuery ( query ); query.sprintf ( "UPDATE BALANCE SET asaldo=0 WHERE asaldo ISNULL" ); dbConnection->runQuery ( query ); query.sprintf ( "SELECT idcuenta FROM balance ORDER BY padre DESC" ); cursorapt = dbConnection->loadQuery ( query, "Balance1view" ); while ( !cursorapt->eof() ) { query.sprintf ( "SELECT * FROM balance WHERE idcuenta=%s", cursorapt->value( "idcuenta" ).ascii() ); BlDbRecordSet *mycur = dbConnection->loadQuery ( query, "cursorrefresco" ); query.sprintf ( "UPDATE balance SET tsaldo = tsaldo + (%2.2f), tdebe = tdebe + (%2.2f), thaber = thaber +(%2.2f), asaldo= asaldo+(%2.2f) WHERE idcuenta = %d", atof ( mycur->value( "tsaldo" ).ascii() ), atof ( mycur->value( "tdebe" ).ascii() ), atof ( mycur->value( "thaber" ).ascii() ), atof ( mycur->value( "asaldo" ).ascii() ), atoi ( mycur->value( "padre" ).ascii() ) ); // fprintf(stderr,"%s para el codigo\n",query, cursorapt->value("codigo").c_str()); dbConnection->runQuery ( query ); delete mycur; cursorapt->nextRecord(); }// end while delete cursorapt; // Borramos todo lo que no es de este nivel query.sprintf ( "DELETE FROM balance where nivel(codigo)>%s", "2" ); dbConnection->runQuery ( query ); //Borramos todo lo que tiene un hijo en el balance query.sprintf ( "DELETE FROM balance WHERE idcuenta IN (SELECT padre FROM balance)" ); dbConnection->runQuery ( query ); query.sprintf ( "SELECT descripcion, abs(tsaldo)::integer AS tsaldoi FROM balance WHERE debe <> 0 OR haber <> 0 ORDER BY codigo" ); cursorapt = dbConnection->loadQuery ( query, "mycursor" ); QString valores = "data=["; int init = 0; while ( !cursorapt->eof() ) { if ( init != 0 ) valores += ","; // Acumulamos los totales para al final poder escribirlos valores += "(\\\"" + cursorapt->value( "descripcion" ) + "\\\"," + QString::number ( cursorapt->value( "tsaldoi" ).toInt() ) + ")"; cursorapt->nextRecord(); init = 1; }// end while valores += "]"; // Vaciamos el cursor de la base de datos. delete cursorapt; query.sprintf ( "DROP TABLE balance" ); dbConnection->runQuery ( query ); dbConnection->commit(); /* values to chart */ fprintf ( stderr, "Llamamos a sacapie\n" ); system ( "cp /usr/lib/bulmages/plugins/plotpie.py /tmp" ); QString cadena = " sed -e \"s&###MARCA###&" + valores + "&g\" /tmp/plotpie.py > /tmp/plotpie1.py"; system ( cadena.ascii() ); system ( "python /tmp/plotpie1.py --format=png > /tmp/pie.png" ); fprintf ( stderr, "Hemos terminado sacapie \n" ); QPixmap *imag = new QPixmap ( "/tmp/pie.png" ); fprintf ( stderr, "Y ahora hemos creado la imagen\n" ); m_imagen->setPixmap ( *imag ); fprintf ( stderr, "Y ahora la hemos mostrado\n" ); //Destruimos la memoria utilizada delete imag; }// end presentar
bool PluginBc_CuentasAnuales2ODS::Arboles() { BL_FUNC_DEBUG /// Para no acceder constantemete a la BD cada vez que se quiere averiguar el saldo /// de una cuenta, vamos a crear una estructura tipo arbol (usando la clase Arbol) donde, /// con un par consultas a BD, se averigüen todos los saldos y puedan estar disponibles en la RAM. /// Primero, averiguaremos la cantidad de ramas iniciales (tantos como /// numero de cuentas de nivel 2) y las vamos creando. dbConnection->begin(); QString query = "SELECT *, nivel(codigo) AS nivel FROM cuenta ORDER BY codigo"; BlDbRecordSet *ramas; ramas = dbConnection->loadQuery ( query, "Ramas" ); dbConnection->commit(); if ( ramas == NULL ) { blMsgInfo ( _ ( "Error con la base de datos" ) ); return 0; } arbolEjercicioActual = new BcPlanContableArbol; arbolEjercicioAnterior = new BcPlanContableArbol; while ( !ramas->eof() ) { if ( ramas->value( "nivel" ).toInt() == 2 ) { /// Cuenta raiz. arbolEjercicioActual->nuevaRama ( ramas ); arbolEjercicioAnterior->nuevaRama ( ramas ); } // end if ramas->nextRecord(); } // end while /// Inicializamos el arbol desde sus raices (desde sus cuentas de nivel 2) /// con el resto de cuentas (las hojas del arbol) arbolEjercicioActual->inicializa ( ramas ); arbolEjercicioAnterior->inicializa ( ramas ); /// Seguidamente, recopilamos todos los apuntes agrupados por cuenta para poder /// establecer asi los valores de cada cuenta para el Ejercicio N. dbConnection->begin(); query = "SELECT cuenta.idcuenta, numapuntes, cuenta.codigo, saldoant, debe, haber,(COALESCE(saldoant,0) + COALESCE(saldop,0)) AS saldo, debeej, haberej, (COALESCE(saldoejp,0) + COALESCE(saldoant,0))AS saldoej FROM (SELECT idcuenta, codigo FROM cuenta) AS cuenta NATURAL JOIN (SELECT idcuenta, count(idcuenta) AS numapuntes, COALESCE(sum(debe),0) AS debeej, COALESCE(sum(haber),0) AS haberej, (COALESCE(sum(debe),0)-COALESCE(sum(haber),0)) AS saldoejp FROM apunte WHERE EXTRACT(year FROM fecha) = '" + ejercicioActual_fechaBalance.right ( 4 ) + "' GROUP BY idcuenta) AS ejercicio LEFT OUTER JOIN (SELECT idcuenta, COALESCE(sum(debe),0) AS debe, COALESCE(sum(haber),0) AS haber, (COALESCE(sum(debe),0)-COALESCE(sum(haber),0)) AS saldop FROM apunte WHERE fecha >= '01/01/" + ejercicioActual_fechaBalance.right ( 4 ) + "' AND fecha <= '" + ejercicioActual_fechaBalance + "' AND conceptocontable !~* '.*asiento.*(cierre|regularizaci).*' GROUP BY idcuenta) AS periodo ON periodo.idcuenta=ejercicio.idcuenta LEFT OUTER JOIN (SELECT idcuenta, (COALESCE(sum(debe),0)-COALESCE(sum(haber),0)) AS saldoant FROM apunte WHERE fecha < '01/01/" + ejercicioActual_fechaBalance.right ( 4 ) + "' GROUP BY idcuenta) AS anterior ON cuenta.idcuenta=anterior.idcuenta ORDER BY codigo"; BlDbRecordSet *hojas; hojas = dbConnection->loadQuery ( query, "Ejercicio N" ); dbConnection->commit(); if ( hojas == NULL ) { blMsgInfo ( _ ( "Error con la base de datos" ) ); return 0; } /// Para cada cuenta con sus saldos ya calculados hay que actualizar las hojas del �rbol. while ( !hojas->eof() ) { arbolEjercicioActual->actualizaHojas ( hojas ); hojas->nextRecord(); } // end while /// Finalmente, recopilamos todos los apuntes agrupados por cuenta para poder /// establecer asi los valores de cada cuenta para el Ejercicio N-1. dbConnection->begin(); query = "SELECT cuenta.idcuenta, numapuntes, cuenta.codigo, saldoant, debe, haber, (saldoant + saldop) AS saldo, debeej, haberej, (saldoant + saldoejp) AS saldoej FROM (SELECT idcuenta, codigo FROM cuenta) AS cuenta NATURAL JOIN (SELECT idcuenta, count(idcuenta) AS numapuntes, COALESCE(sum(debe),0) AS debeej, COALESCE (sum(haber),0) AS haberej, (COALESCE(sum(debe),0)-COALESCE(sum(haber),0)) AS saldoejp FROM apunte WHERE EXTRACT(year FROM fecha) = '" + ejercicioAnterior_fechaBalance.right ( 4 ) + "' GROUP BY idcuenta) AS ejercicio LEFT OUTER JOIN (SELECT idcuenta, COALESCE(sum(debe),0) AS debe, COALESCE(sum(haber),0) AS haber, (COALESCE(sum(debe),0)-COALESCE(sum(haber),0)) AS saldop FROM apunte WHERE fecha >= '01/01/" + ejercicioAnterior_fechaBalance.right ( 4 ) + "' AND fecha <= '" + ejercicioAnterior_fechaBalance + "' AND conceptocontable !~* '.*asiento.*(cierre|regularizaci).*' GROUP BY idcuenta) AS periodo ON periodo.idcuenta=ejercicio.idcuenta LEFT OUTER JOIN (SELECT idcuenta, (COALESCE(sum(debe),0)- COALESCE(sum(haber),0)) AS saldoant FROM apunte WHERE fecha < '01/01/" + ejercicioAnterior_fechaBalance.right ( 4 ) + "' GROUP BY idcuenta) AS anterior ON cuenta.idcuenta=anterior.idcuenta ORDER BY codigo"; hojas = dbConnection->loadQuery ( query, "Ejercicio N-1" ); dbConnection->commit(); if ( hojas == NULL ) { blMsgInfo ( _ ( "Error con la base de datos" ) ); return 0; } /// De nuevo, para cada cuenta con sus saldos ya calculados hay que actualizar las hojas del arbol. while ( !hojas->eof() ) { arbolEjercicioAnterior->actualizaHojas ( hojas ); hojas->nextRecord(); } // end while return 1; }
void DuplicarAsientoView::on_mui_aceptar_clicked() { BL_FUNC_DEBUG QString asientoi = aoinicial->text(); QString asientof = aofinal->text(); QString query1, query2; QString textidasiento; QString idasiento; QString ordenasiento; QString textordeninicial; QDate fedinicial = blNormalizeDate ( fdinicial->text() ); query1 = "SELECT * FROM asiento WHERE ordenasiento >= " + asientoi + " AND ordenasiento <= " + asientof + " AND EXTRACT (YEAR FROM fecha) = EXTRACT (YEAR FROM '" + fedinicial.toString ( "dd/MM/yyyy" ) + "'::date)"; BlDbRecordSet *curasiento = mainCompany() ->loadQuery ( query1 ); while ( !curasiento->eof() ) { query1 = "INSERT INTO asiento (descripcion, fecha, comentariosasiento) VALUES('" + curasiento->value( "descripcion" ) + "','" + fedinicial.toString ( "dd/MM/yyyy" ) + "','" + curasiento->value( "comentariosasiento" ) + "')"; mainCompany() ->runQuery ( query1 ); query1 = "SELECT * FROM asiento ORDER BY idasiento DESC LIMIT 1"; BlDbRecordSet *cursaux = mainCompany() ->loadQuery ( query1 ); if ( !cursaux->eof() ) { idasiento = cursaux->value( "idasiento" ); ordenasiento = cursaux->value( "ordenasiento" ); } // end if delete cursaux; query2 = "SELECT * FROM borrador WHERE idasiento = " + curasiento->value( "idasiento" ); BlDbRecordSet *curborrador = mainCompany() ->loadQuery ( query2 ); while ( !curborrador->eof() ) { QString textiddiario = curborrador->value( "iddiario" ); if ( textiddiario == "" ) { textiddiario = "NULL"; } // end if QString textfecha = curborrador->value( "fecha" ); textfecha = fedinicial.toString ( "dd/MM/yyyy" ); QString textconceptocontable = curborrador->value( "conceptocontable" ); QString textidcuenta = curborrador->value( "idcuenta" ); if ( textidcuenta == "" ) { textidcuenta = "NULL"; } // end if QString textdescripcion = curborrador->value( "descripcion" ); QString textdebe = curborrador->value( "debe" ); QString texthaber = curborrador->value( "haber" ); QString textcontrapartida = curborrador->value( "contrapartida" ); if ( textcontrapartida == "" ) { textcontrapartida = "NULL"; } // end if QString textorden = curborrador->value( "ordenborrador" ); if ( textorden == "" ) { textorden = "0"; } // end if query2 = "INSERT INTO borrador (ordenborrador, idasiento, iddiario, fecha, conceptocontable, idcuenta, descripcion, debe, haber, contrapartida) VALUES (" + textorden + "," + idasiento + "," + textiddiario + ",'" + textfecha + "','" + textconceptocontable + "'," + textidcuenta + ",'" + textdescripcion + "'," + textdebe + "," + texthaber + "," + textcontrapartida + ")"; mainCompany() ->runQuery ( query2 ); curborrador->nextRecord(); } // end while delete curborrador; query2 = "SELECT cierraasiento(" + idasiento + ")"; BlDbRecordSet *cur = mainCompany() ->loadQuery ( query2 ); delete cur; curasiento->nextRecord(); } // end while delete curasiento; mainCompany() ->commit(); done ( 1 ); }
/** \param fechaInicial \param fechaFinal \param cuentaInicial \param cuentaFinal \param nivel \param jerarquico **/ void BalanceView::presentarSyS ( QString fechaInicial, QString fechaFinal, QString cuentaInicial, QString cuentaFinal, int nivel, int, bool jerarquico ) { BL_FUNC_DEBUG BlFixed tsaldoant ( "0.00" ), tdebe ( "0.00" ), thaber ( "0.00" ), tsaldo ( "0.00" ); BlDbRecordSet *ramas = NULL; BlDbRecordSet *hojas = NULL; try { /// Primero, averiguaremos la cantidad de ramas iniciales que nacen de la raíz /// (tantas como número de cuentas de nivel 2) y las vamos creando. mainCompany() ->begin(); QString query = "SELECT *, nivel(codigo) AS nivel FROM cuenta ORDER BY codigo"; ramas = mainCompany() ->loadQuery ( query ); /// Creamos el arbol y lo inicializamos con todas las cuentas. BcPlanContableArbol *arbol; arbol = new BcPlanContableArbol; while ( !ramas->eof() ) { if ( ramas->value( "nivel" ).toInt() == 2 ) { /// Cuenta raíz. /// Se crea una rama en el árbol (de las primeritas que salen /// de una raíz). arbol->nuevaRama ( ramas ); } // end if ramas->nextRecord(); } // end while arbol->inicializa ( ramas ); delete ramas; /// Sacamos la subcadena para centros de coste y canales. BcCanalSeleccionarView *scanal = mainCompany() ->getselcanales(); BcCentroCosteSeleccionarView *scoste = mainCompany() ->getselccostes(); QString ccostes = scoste->cadcoste(); if ( ccostes != "" ) { ccostes = " AND apunte.idc_coste IN (" + ccostes + ") "; ; } // end if QString ccanales = scanal->cadCanal(); if (scanal->sinCanal()) { if ( ccanales != "" ) { ccanales = " AND (apunte.idcanal ISNULL OR apunte.idcanal IN (" + ccanales + ")) "; } else { ccanales = " AND apunte.idcanal ISNULL "; } // end if } else { if ( ccanales != "" ) { ccanales = " AND (apunte.idcanal <> NULL OR apunte.idcanal IN (" + ccanales + ")) "; } else { ccanales = " AND apunte.idcanal <> NULL "; } // end if } // end if QString wherecostesycanales = ccostes + ccanales; /// Ahora, usaremos el árbol para poner los datos a cada hoja (cuenta) /// según los períodos que necesitemos acotar. /// Para ello, vamos a recopilar todos los apuntes introducidos agrupados por cuenta /// para poder averiguar el estado contable de cada cuenta. query = "SELECT cuenta.idcuenta, numapuntes, cuenta.codigo, saldoant, debe, haber, ( COALESCE(saldop,0) + COALESCE(saldoant,0)) AS saldo, debeej, haberej, saldoej FROM "; query += "(SELECT idcuenta, codigo FROM cuenta) AS cuenta "; query += " LEFT JOIN (SELECT idcuenta, COALESCE(sum(debe),0) AS debeej, COALESCE(sum(haber),0) AS haberej, (COALESCE(sum(debe),0) - COALESCE(sum(haber),0)) AS saldoej FROM apunte WHERE EXTRACT(year FROM fecha) = '" + fechaFinal.right ( 4 ) + "' " + wherecostesycanales + " GROUP BY idcuenta) AS ejercicio ON ejercicio.idcuenta = cuenta.idcuenta"; query += " LEFT OUTER JOIN (SELECT idcuenta, count(idcuenta) AS numapuntes, COALESCE(sum(debe),0) AS debe, COALESCE(sum(haber),0) AS haber, (COALESCE(sum(debe),0) - COALESCE(sum(haber),0)) AS saldop FROM apunte WHERE fecha >= '" + fechaInicial + "' AND fecha <= '" + fechaFinal + "' " + wherecostesycanales + " GROUP BY idcuenta) AS periodo ON periodo.idcuenta = cuenta.idcuenta "; query += " LEFT OUTER JOIN (SELECT idcuenta, (COALESCE(sum(debe),0) - COALESCE(sum(haber),0)) AS saldoant FROM apunte WHERE fecha < '" + fechaInicial + "' " + wherecostesycanales + " GROUP BY idcuenta) AS anterior ON cuenta.idcuenta = anterior.idcuenta ORDER BY codigo"; /// Poblamos el árbol de hojas (cuentas). hojas = mainCompany() ->loadQuery ( query ); while ( !hojas->eof() ) { /// Para cada cuenta con apuntes introducidos hay que actualizar hojas del árbol. arbol->actualizaHojas ( hojas ); hojas->nextRecord(); } // end while delete hojas; /// Establecemos la hoja activa arbol->inicia(); /// Por fin, presentamos los valores. /// Aunque antes, prepararemos el Widget con la cabecera a mostrar. QStringList headers, datos; headers << _ ( "Codigo" ) << _ ( "Denominacion" ) << _ ( "Saldo anterior" ) << _ ( "Debe" ) << _ ( "Haber" ) << _ ( "Saldo" ) << _ ( "Debe " ) + fechaFinal.right ( 4 ) << _ ( "Haber " ) + fechaFinal.right ( 4 ) << _ ( "Saldo " ) + fechaFinal.right ( 4 ); mui_list->setHeaderLabels ( headers ); mui_list->clear(); /// Ponemos las columnas mui_list->setColumnWidth ( CUENTA, 250 ); mui_list->setColumnWidth ( DENOMINACION, 150 ); mui_list->setColumnWidth ( SALDO_ANT, 100 ); mui_list->setColumnWidth ( DEBE, 100 ); mui_list->setColumnWidth ( HABER, 100 ); mui_list->setColumnWidth ( SALDO, 100 ); mui_list->setColumnWidth ( DEBEEJ, 100 ); mui_list->setColumnWidth ( HABEREJ, 100 ); mui_list->setColumnWidth ( SALDOEJ, 100 ); /// Cada hoja del árbol usara uno de estos Widgets para mostrarse. QTreeWidgetItem *it; int nivelActual; /// Mantenemos una tabla con índices de niveles del árbol. QMap <int, QTreeWidgetItem *> ptrList; /// Y el iterador para controlar donde accedemos, así como un índice /// adicional. QMap <int, QTreeWidgetItem *>::const_iterator ptrIt, i; ptrList.clear(); while ( arbol->deshoja ( nivel, jerarquico ) ) { QString lcuenta = arbol->hojaActual ( "codigo" ); QString ldenominacion = arbol->hojaActual ( "descripcion" ); QString lsaldoant = arbol->hojaActual ( "saldoant" ); QString ldebe = arbol->hojaActual ( "debe" ); QString lhaber = arbol->hojaActual ( "haber" ); QString lsaldo = arbol->hojaActual ( "saldo" ); QString ldebeej = arbol->hojaActual ( "debeej" ); QString lhaberej = arbol->hojaActual ( "haberej" ); QString lsaldoej = arbol->hojaActual ( "saldoej" ); if ( lcuenta >= cuentaInicial and lcuenta <= cuentaFinal ) { /// Acumulamos los totales para al final poder escribirlos. /// Solo si son del nivel seleccionado o son hojas finales ya que en un jerarquico no se puede acumular /// TODO: No funciona bien en todos los niveles. Principalmente si el arbol no es normalizado if (lcuenta.length() == nivel) { tsaldoant = tsaldoant + BlFixed ( lsaldoant ); tsaldo = tsaldo + BlFixed ( lsaldo ); tdebe = tdebe + BlFixed ( ldebe ); thaber = thaber + BlFixed ( lhaber ); } // end if /// Las variables de las filas en formato español. lsaldoant = QString::number ( lsaldoant.toDouble(), 'f', 2 ); ldebe = QString::number ( ldebe.toDouble(), 'f', 2 ); lhaber = QString::number ( lhaber.toDouble(), 'f', 2 ); lsaldo = QString::number ( lsaldo.toDouble(), 'f', 2 ); ldebeej = QString::number ( ldebeej.toDouble(), 'f', 2 ); lhaberej = QString::number ( lhaberej.toDouble(), 'f', 2 ); lsaldoej = QString::number ( lsaldoej.toDouble(), 'f', 2 ); /// Ahora, vamos a pintar en el Widget cada línea. /// Formamos la línea. datos << lcuenta << ldenominacion << lsaldoant << ldebe << lhaber << lsaldo << ldebeej << lhaberej << lsaldoej; /// Si se van mostrar también las cuentas superiores, habrá que /// jerarquizar el árbol. Sino, se pinta cada línea al mismo nivel. if ( jerarquico ) { /// jerarquizando... nivelActual = lcuenta.length(); if ( nivelActual == 2 ) { /// La hoja cuelga de la raíz principal. it = new QTreeWidgetItem ( mui_list, datos ); } else { while ( ptrIt.key() >= nivelActual ) /// Ascendemos por el árbol para colgar la hoja en el /// lugar correcto. ptrIt--; it = new QTreeWidgetItem ( ptrIt.value(), datos ); } // end if /// Insertamos el widget (hoja actual) en la tabla controlada y obtenemos /// su puntero iterador. ptrIt = ptrList.insert ( nivelActual, it ); mui_list->setItemExpanded ( it, true ); /// Borramos el resto de niveles que cuelgan, para no seguir colgando por /// esa rama. i = ptrIt + 1; while ( i != ptrList.constEnd() ) { /// Borra todas las entradas con la misma clave. ptrList.remove ( i.key() ); ++i; } // end while } else { /// sin jerarquizar... it = new QTreeWidgetItem ( mui_list, datos ); } // end if datos.clear(); /// Formateamos un poquito la información mostrada. int tamanyo = 10; if ( ldenominacion.length() > 40 ) { tamanyo -= 1; } else if ( ldenominacion.length() > 50 ) { tamanyo -= 2; } // end if it->setFont ( DENOMINACION, QFont ( "Serif", tamanyo, -1, false ) ); for ( int col = 0; col < it->columnCount(); col++ ) { if ( col == DEBE || col == HABER || col == SALDO || col == DEBEEJ || col == HABEREJ || col == SALDOEJ ) { it->setFont ( col, QFont ( "SansSerif", 9, QFont::DemiBold, false ) ); } else { it->setFont ( col, QFont ( "SansSerif", 9, QFont::Normal, false ) ); } // end if it->setTextAlignment ( col, Qt::AlignRight ); if ( lcuenta.size() == 2 ) { it->setTextColor ( col, Qt::darkGray ); it->setFont ( col, QFont ( "SansSerif", 10, QFont::Bold, false ) ); } else if ( lcuenta.size() < 5 ) { it->setTextColor ( col, Qt::blue ); } else { if ( it->text ( col ).left ( 1 ) == "-" ) { it->setTextColor ( col, Qt::darkRed ); } else { it->setTextColor ( col, Qt::black ); } // end if } // end if } // end for } // end if } // end while mui_list->resizeColumnToContents ( 1 ); /// Hacemos la actualización de los saldos totales en formato /// español y los ponemos en su Widget. QString totsaldoant = tsaldoant.toQString(); QString totdebe = tdebe.toQString(); QString tothaber = thaber.toQString(); QString totsaldo = tsaldo.toQString(); mui_totalSaldoAnterior->setText ( totsaldoant ); mui_totalDebe->setText ( totdebe ); mui_totalHaber->setText ( tothaber ); mui_totalSaldo->setText ( totsaldo ); /// Eliminamos el árbol de la memória y cerramos la conexión /// con la BD. delete arbol; mainCompany() ->commit(); } catch ( ... ) { blMsgInfo ( _("Error en los calculos.") ); mainCompany() ->rollback(); /// Libermos posible memoria utilizada if ( ramas ) delete ramas; if ( hojas ) delete hojas; } // end try }