* Copyright (C) 2004-2008 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2005-2007 Regis Houssin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** \file htdocs/compta/propal.php \ingroup propale \brief Page liste des propales (vision compta) \version $Id$ */ require("./pre.inc.php"); require_once(DOL_DOCUMENT_ROOT."/html.formfile.class.php"); require_once(DOL_DOCUMENT_ROOT."/propal.class.php"); require_once(DOL_DOCUMENT_ROOT."/lib/propal.lib.php"); if ($conf->projet->enabled) require_once(DOL_DOCUMENT_ROOT.'/project.class.php'); if ($conf->commande->enabled) require_once(DOL_DOCUMENT_ROOT.'/commande/commande.class.php'); $langs->load('companies'); $langs->load('compta'); $langs->load('orders'); $page=$_GET["page"]; $sortorder=$_GET["sortorder"]; $sortfield=$_GET["sortfield"]; $viewstatut=$_GET['viewstatut']; $propal_statut = $_GET['propal_statut']; if($propal_statut != '') $viewstatut=$propal_statut; if (! $sortorder) $sortorder="DESC"; if (! $sortfield) $sortfield="p.datep"; if ($page == -1) { $page = 0 ; } $module='propale'; if (! empty($_GET["socid"])) { $objectid=$_GET["socid"]; $module='societe'; $dbtable=''; } else if (! empty($_GET["propalid"])) { $objectid=$_GET["propalid"]; $module='propale'; $dbtable='propal'; } // Security check if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, $module, $objectid, $dbtable); /******************************************************************************/ /* Actions */ /******************************************************************************/ if ($_GET["action"] == 'setstatut') { /* * Class�e la facture comme factur�e */ $propal = new Propal($db); $propal->id = $_GET["propalid"]; $propal->cloture($user, $_GET["statut"], $note); } if ( $action == 'delete' ) { $sql = "DELETE FROM ".MAIN_DB_PREFIX."propal WHERE rowid = $propalid;"; if ( $db->query($sql) ) { $sql = "DELETE FROM ".MAIN_DB_PREFIX."propaldet WHERE fk_propal = $propalid ;"; if ( $db->query($sql) ) { print '
'.$langs->trans("Deleted").'
'; } else { dolibarr_print_error($db); } } else { dolibarr_print_error($db); } $propalid = 0; $brouillon = 1; } llxHeader(); $html = new Form($db); $formfile = new FormFile($db); $societestatic=new Societe($db); $propalstatic=new Propal($db); /* * * Mode fiche * */ if ($_GET["propalid"] > 0) { if ($mesg) print "$mesg
"; $propal = new Propal($db); $propal->fetch($_GET['propalid']); $societe = new Societe($db); $societe->fetch($propal->socid); $head = propal_prepare_head($propal); dolibarr_fiche_head($head, 'compta', $langs->trans('Proposal')); /* * Fiche propal * */ print ''; $linkback=''.$langs->trans("BackToList").""; // Ref print ''; // Ref client print ''; print ''; $rowspan=8; // Soci�t� print ''; // Ligne info remises tiers print ''; // Dates print ''; if ($conf->projet->enabled) $rowspan++; // Note print ''; print ''; // Date fin propal print ''; print ''; print ''; // Conditions et modes de r�glement print ''; // Mode de paiement print ''; print ''; // Projet if ($conf->projet->enabled) { $langs->load("projects"); print ''; } else { if ($propal->statut == 0 && $user->rights->propale->creer) { if ($_GET['action'] != 'classer' && $propal->brouillon) print ''; print '
'.$langs->trans('Ref').''; print $html->showrefnav($propal,'propalid',$linkback); print '
'; print ''; if ($_GET['action'] != 'refclient' && $propal->brouillon) print ''; print '
'; print $langs->trans('RefCustomer').''; print ''.img_edit($langs->trans('Modify')).'
'; print '
'; print $propal->ref_client; print '
'.$langs->trans('Company').''.$societe->getNomUrl(1).'
'.$langs->trans('Discounts').''; if ($societe->remise_client) print $langs->trans("CompanyHasRelativeDiscount",$societe->remise_client); else print $langs->trans("CompanyHasNoRelativeDiscount"); $absolute_discount=$societe->getAvailableDiscounts(); print '. '; if ($absolute_discount) print $langs->trans("CompanyHasAbsoluteDiscount",$absolute_discount,$langs->trans("Currency".$conf->monnaie)); else print $langs->trans("CompanyHasNoAbsoluteDiscount"); print '.'; print '
'.$langs->trans('Date').''; print dolibarr_print_date($propal->date,'daytext'); print ''.$langs->trans('NotePublic').' :
'. nl2br($propal->note_public).'
'.$langs->trans('DateEndPropal').''; if ($propal->fin_validite) { print dolibarr_print_date($propal->fin_validite,'daytext'); if ($propal->statut == 1 && $propal->fin_validite < (time() - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); } else { print $langs->trans("Unknown"); } print '
'; print ''; if ($_GET['action'] != 'editconditions' && $propal->brouillon) print ''; print '
'; print $langs->trans('PaymentConditionsShort'); print 'id.'">'.img_edit($langs->trans('SetConditions'),1).'
'; print '
'; if ($_GET['action'] == 'editconditions') { $html->form_conditions_reglement($_SERVER['PHP_SELF'].'?propalid='.$propal->id,$propal->cond_reglement_id,'cond_reglement_id'); } else { $html->form_conditions_reglement($_SERVER['PHP_SELF'].'?propalid='.$propal->id,$propal->cond_reglement_id,'none'); } print '
'; print ''; if ($_GET['action'] != 'editmode' && $propal->brouillon) print ''; print '
'; print $langs->trans('PaymentMode'); print 'id.'">'.img_edit($langs->trans('SetMode'),1).'
'; print '
'; if ($_GET['action'] == 'editmode') { $html->form_modes_reglement($_SERVER['PHP_SELF'].'?propalid='.$propal->id,$propal->mode_reglement_id,'mode_reglement_id'); } else { $html->form_modes_reglement($_SERVER['PHP_SELF'].'?propalid='.$propal->id,$propal->mode_reglement_id,'none'); } print '
'; print ''; $numprojet = $societe->has_projects(); if (! $numprojet) { print '
'; print $langs->trans('Project').'
'; print '
'; print $langs->trans("NoProject").''; print 'id.'&action=create>'.$langs->trans('AddProject').''; print ''.img_edit($langs->trans('SetProject')).'
'; print ''; if ($_GET['action'] == 'classer') { $html->form_project($_SERVER['PHP_SELF'].'?propalid='.$propal->id, $propal->socid, $propal->projetidp, 'projetidp'); } else { $html->form_project($_SERVER['PHP_SELF'].'?propalid='.$propal->id, $propal->socid, $propal->projetidp, 'none'); } print ''; } else { print ''; if (!empty($propal->projetidp)) { print ''; $proj = new Project($db); $proj->fetch($propal->projetidp); print ''; print $proj->title; print ''; print ''; } else { print ' '; } } } print ''; } // Amount print ''.$langs->trans('AmountHT').''; print ''.price($propal->total_ht).''; print ''.$langs->trans("Currency".$conf->monnaie).''; print ''.$langs->trans('AmountVAT').''.price($propal->total_tva).''; print ''.$langs->trans("Currency".$conf->monnaie).''; print ''.$langs->trans('AmountTTC').''.price($propal->total_ttc).''; print ''.$langs->trans("Currency".$conf->monnaie).''; // Statut print ''.$langs->trans('Status').''.$propal->getLibStatut(4).''; print '
'; /* * Lignes de propale * */ print ''; $sql = 'SELECT pt.rowid, pt.description, pt.price, pt.fk_product, pt.fk_remise_except,'; $sql.= ' pt.qty, pt.tva_tx, pt.remise_percent, pt.subprice, pt.info_bits,'; $sql.= ' pt.total_ht, pt.total_tva, pt.total_ttc,'; $sql.= ' p.rowid as prodid, p.label as product, p.ref, p.fk_product_type, '; $sql.= ' p.description as product_desc'; $sql.= ' FROM '.MAIN_DB_PREFIX.'propaldet as pt'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON pt.fk_product=p.rowid'; $sql.= ' WHERE pt.fk_propal = '.$propal->id; $sql.= ' ORDER BY pt.rang ASC, pt.rowid'; $resql = $db->query($sql); if ($resql) { $num_lignes = $db->num_rows($resql); $i = 0; $total = 0; if ($num_lignes) { print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print "\n"; } $var=true; while ($i < $num_lignes) { $objp = $db->fetch_object($resql); $var=!$var; if ($_GET['action'] != 'editline' || $_GET['rowid'] != $objp->rowid) { print ''; if ($objp->fk_product > 0) { print ''; } else { print '\n"; } print ''; print '\n"; // Qty print ''; if ($objp->remise_percent > 0) { print '\n"; } else { print ''; } print '\n"; print ''; print ''; } $i++; } $db->free($resql); } else { dolibarr_print_error($db); } print '
'.$langs->trans('Description').''.$langs->trans('VAT').''.$langs->trans('PriceUHT').''.$langs->trans('Qty').''.$langs->trans('ReductionShort').''.$langs->trans('AmountHT').'   
'; if ($objp->fk_product_type==1) print img_object($langs->trans('ShowService'),'service'); else print img_object($langs->trans('ShowProduct'),'product'); print ' '.$objp->ref.' - '.stripslashes(nl2br($objp->product)); if ($objp->date_start && $objp->date_end) { print ' (Du '.dolibarr_print_date($objp->date_start).' au '.dolibarr_print_date($objp->date_end).')'; } if ($objp->date_start && ! $objp->date_end) { print ' (A partir du '.dolibarr_print_date($objp->date_start).')'; } if (! $objp->date_start && $objp->date_end) { print " (Jusqu'au ".dolibarr_print_date($objp->date_end).')'; } print ($objp->description && $objp->description!=$objp->product)?'
'.stripslashes(nl2br($objp->description)):''; print '
'; print ''; // ancre pour retourner sur la ligne if (($objp->info_bits & 2) == 2) { print ''; print img_object($langs->trans("ShowReduc"),'reduc').' '.$langs->trans("Discount"); print ''; if ($objp->description) { if ($objp->description == '(CREDIT_NOTE)') { $discount=new DiscountAbsolute($db); $discount->fetch($objp->fk_remise_except); print ' - '.$langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0)); } else { print ' - '.nl2br($objp->description); } } } else { print nl2br($objp->description); if ($objp->date_start && $objp->date_end) { print ' (Du '.dolibarr_print_date($objp->date_start).' au '.dolibarr_print_date($objp->date_end).')'; } if ($objp->date_start && ! $objp->date_end) { print ' (A partir du '.dolibarr_print_date($objp->date_start).')'; } if (! $objp->date_start && $objp->date_end) { print " (Jusqu'au ".dolibarr_print_date($objp->date_end).')'; } } print "'.vatrate($objp->tva_tx).'%'.price($objp->subprice)."'; if (($objp->info_bits & 2) != 2) { print $objp->qty; } else print ' '; print ''.$objp->remise_percent."% '.price($objp->total_ht)." 
'; print ''; /* * Boutons Actions */ print '
'; if ($propal->statut <> 4 && $user->societe_id == 0) { if ($propal->statut == 2 && $user->rights->facture->creer) { print '".$langs->trans("BuildBill").""; } $arraypropal=$propal->getInvoiceArrayList(); if ($propal->statut == 2 && is_array($arraypropal) && sizeof($arraypropal) > 0) { print '".$langs->trans("ClassifyBilled").""; } } print "
"; print "
\n"; print '
'; /* * Documents g�n�r�s */ $filename=sanitize_string($propal->ref); $filedir=$conf->propal->dir_output . "/" . sanitize_string($propal->ref); $urlsource=$_SERVER["PHP_SELF"]."?propalid=".$propal->id; $genallowed=0; $delallowed=0; $var=true; $somethingshown=$formfile->show_documents('propal',$filename,$filedir,$urlsource,$genallowed,$delallowed); /* * Commandes rattach�es */ if($conf->commande->enabled) { $propal->loadOrders(); $coms = $propal->commandes; if (sizeof($coms) > 0) { $total=0; if ($somethingshown) { print '
'; $somethingshown=1; } print_titre($langs->trans('RelatedOrders')); print ''; print ''; print ''; print ''; print ''; print ''; print ''; $var=true; for ($i = 0 ; $i < sizeof($coms) ; $i++) { $var=!$var; print '\n"; print ''; print ''; print ''; print "\n"; $total = $total + $objp->total; } print '
'.$langs->trans("Ref").''.$langs->trans("Date").''.$langs->trans("Price").''.$langs->trans("Status").'
'; print ''.img_object($langs->trans("ShowOrder"),"order").' '.$coms[$i]->ref."'.dolibarr_print_date($coms[$i]->date,'day').''.price($coms[$i]->total_ttc).''.$coms[$i]->getLibStatut(3).'
'; } } /* * Factures associees */ // Cas des factures lies directement $sql = "SELECT f.facnumber, f.total,".$db->pdate("f.datef")." as df, f.rowid as facid, f.fk_user_author, f.fk_statut, f.paye"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; $sql.= ", ".MAIN_DB_PREFIX."fa_pr as fp"; $sql.= " WHERE fp.fk_facture = f.rowid AND fp.fk_propal = ".$propal->id; $sql.= " UNION "; // Cas des factures lier via la commande $sql.= "SELECT f.facnumber, f.total,".$db->pdate("f.datef")." as df, f.rowid as facid, f.fk_user_author, f.fk_statut, f.paye"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; $sql.= ", ".MAIN_DB_PREFIX."co_pr as cp, ".MAIN_DB_PREFIX."co_fa as cf"; $sql.= " WHERE cp.fk_propale = ".$propal->id." AND cf.fk_commande = cp.fk_commande AND cf.fk_facture = f.rowid"; dolibarr_syslog("propal.php::liste factures sql=".$sql); $resql = $db->query($sql); if ($resql) { $num_fac_asso = $db->num_rows($resql); $i = 0; $total = 0; if ($somethingshown) { print '
'; $somethingshown=1; } if ($num_fac_asso > 1) print_titre($langs->trans("RelatedBills")); else print_titre($langs->trans("RelatedBill")); print ''; print ""; print ''; print ''; print ''; print ''; print "\n"; require_once(DOL_DOCUMENT_ROOT.'/facture.class.php'); $staticfacture=new Facture($db); $var=True; while ($i < $num_fac_asso) { $objp = $db->fetch_object($resql); $var=!$var; print ""; print ''; print ''; print ''; print ''; print ""; $total = $total + $objp->total; $i++; } print ""; print ""; print "\n"; print "
'.$langs->trans("Ref").''.$langs->trans("Date").''.$langs->trans("Price").''.$langs->trans("Status").'
'.img_object($langs->trans("ShowBill"),"bill").' '.$objp->facnumber.''.dolibarr_print_date($objp->df,'day').''.price($objp->total).''.$staticfacture->LibStatut($objp->paye,$objp->fk_statut,3).'
".$langs->trans("TotalHT")."".price($total)." 
"; $db->free(); } print '
'; // List of actions on element include_once(DOL_DOCUMENT_ROOT.'/html.formactions.class.php'); $formactions=new FormActions($db); $somethingshown=$formactions->showactions($propal,'propal',$socid); print '
'; } else { /** * * Mode Liste des propales * */ $limit = $conf->liste_limit; $offset = $limit * $page ; $pageprev = $page - 1; $pagenext = $page + 1; $year = $_REQUEST["year"]; $month = $_REQUEST["month"]; $sql = "SELECT s.nom, s.rowid as socid, s.client,"; $sql.= " p.rowid as propalid, p.ref, p.fk_statut,"; $sql.= " p.total_ht, p.tva, p.total,"; $sql.= $db->pdate("p.datep")." as dp, "; $sql.= $db->pdate("p.fin_validite")." as dfin"; if (!$user->rights->societe->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user"; $sql.= " FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."propal as p"; if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE p.fk_soc = s.rowid"; if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid) $sql .= " AND s.rowid = ".$socid; if ($viewstatut <> '') $sql .= " AND p.fk_statut in ($viewstatut)"; // viewstatut peut etre combinaisons s�par� par virgules if ($month > 0) { if ($year > 0) $sql .= " AND date_format(p.datep, '%Y-%m') = '$year-$month'"; else $sql .= " AND date_format(p.datep, '%m') = '$month'"; } if ($year > 0) $sql .= " AND date_format(p.datep, '%Y') = $year"; if (!empty($_GET['search_ref'])) { $sql .= " AND p.ref LIKE '%".addslashes($_GET['search_ref'])."%'"; } if (!empty($_GET['search_societe'])) { $sql .= " AND s.nom LIKE '%".addslashes($_GET['search_societe'])."%'"; } if (!empty($_GET['search_montant_ht'])) { $sql .= " AND p.price='".addslashes($_GET['search_montant_ht'])."'"; } $sql .= " ORDER BY $sortfield $sortorder, p.rowid DESC "; $sql .= $db->plimit($limit + 1,$offset); if ( $result = $db->query($sql) ) { $num = $db->num_rows(); print_barre_liste($langs->trans("Proposals"), $page, "propal.php","&socid=$socid&month=$month&year=$year&search_ref=$search_ref&search_societe=$search_societe&search_montant_ht=$search_montant_ht".'&viewstatut='.$viewstatut,$sortfield,$sortorder,'',$num); $i = 0; $var=true; print ""; print ''; print_liste_field_titre($langs->trans("Ref"),"propal.php","p.ref","","&year=$year&viewstatut=$viewstatut",'width=20%',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Company"),"propal.php","s.nom","&viewstatut=$viewstatut","",'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),"propal.php","p.datep","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("AmountHT"),"propal.php","p.price","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Status"),"propal.php","p.fk_statut","&viewstatut=$viewstatut","",'align="right"',$sortfield,$sortorder); print ''; print "\n"; // Lignes des champs de filtre print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print "\n"; print ''; while ($i < min($num, $limit)) { $objp = $db->fetch_object($result); $var=!$var; print ""; print '\n"; // Societe print ""; // Date print "\n"; // Prix print "\n"; print "\n"; print ""; print "\n"; $i++; } print "
 
'; print ''; print ''; print ''; print ''; print $langs->trans('Month').': '; print ' '.$langs->trans('Year').': '; print ''; print ''; print ''; $html->select_propal_statut($viewstatut); print ''; print '
'; $propalstatic->id=$objp->propalid; $propalstatic->ref=$objp->ref; //Ref print ''; print ''; print ''; print '
'; print $propalstatic->getNomUrl(1, 'compta', "&socid=$socid&viewstatut=$viewstatut&sortfield=$sortfield&$sortorder"); print ''; if ($objp->fk_statut == 1 && $objp->din < (time() - $conf->propal->cloture->warning_delay)) print img_warning($langs->trans("Late")); print ''; $filename=sanitize_string($objp->ref); $filedir=$conf->propal->dir_output . '/' . sanitize_string($objp->ref); $urlsource=$_SERVER['PHP_SELF'].'?propalid='.$objp->propalid; $formfile->show_documents('propal',$filename,$filedir,$urlsource,'','','','','',1); print '
'; print "
"; $societestatic->nom=$objp->nom; $societestatic->id=$objp->socid; $societestatic->client=$objp->client; print $societestatic->getNomUrl(1,'customer',44); print ""; $y = strftime("%Y",$objp->dp); $m = strftime("%m",$objp->dp); print strftime("%d",$objp->dp)."\n"; print " "; print strftime("%B",$objp->dp)."\n"; print " "; print strftime("%Y",$objp->dp)."".price($objp->total_ht)."".$propalstatic->LibStatut($objp->fk_statut,5)." 
"; $db->free($result); } else { dolibarr_print_error($db); } } $db->close(); llxFooter('$Date$ - $Revision$'); ?>