diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php
index 61bcbac238c..8e98e0014e8 100644
--- a/htdocs/categories/class/categorie.class.php
+++ b/htdocs/categories/class/categorie.class.php
@@ -1717,6 +1717,6 @@ class Categorie extends CommonObject
'categorie_societe'
);
- return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables);
+ return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables, 1);
}
}
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index 4b5da68f8a2..b0e0c431502 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -263,7 +263,7 @@ class Facture extends CommonInvoice
$result=$soc->fetch($this->socid);
if ($result < 0)
{
- $this->error="Failed to fetch company";
+ $this->error="Failed to fetch company: ".$soc->error;
dol_syslog(get_class($this)."::create ".$this->error, LOG_ERR);
return -2;
}
diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php
index 0a886230100..5fa90b6f14d 100644
--- a/htdocs/compta/facture/list.php
+++ b/htdocs/compta/facture/list.php
@@ -29,7 +29,7 @@
/**
* \file htdocs/compta/facture/list.php
* \ingroup facture
- * \brief Page to create/see an invoice
+ * \brief List of customer invoices
*/
require '../../main.inc.php';
@@ -37,6 +37,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/discount.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
@@ -50,7 +51,6 @@ if (! empty($conf->projet->enabled)) require_once DOL_DOCUMENT_ROOT.'/projet/c
$langs->load('bills');
$langs->load('companies');
$langs->load('products');
-$langs->load('main');
$sall=trim(GETPOST('sall'));
$projectid=(GETPOST('projectid')?GETPOST('projectid','int'):0);
@@ -78,8 +78,19 @@ $search_zip=GETPOST('search_zip','alpha');
$search_state=trim(GETPOST("search_state"));
$search_country=GETPOST("search_country",'int');
$search_type_thirdparty=GETPOST("search_type_thirdparty",'int');
+$search_user = GETPOST('search_user','int');
+$search_sale = GETPOST('search_sale','int');
+$day = GETPOST('day','int');
+$month = GETPOST('month','int');
+$year = GETPOST('year','int');
+$day_lim = GETPOST('day_lim','int');
+$month_lim = GETPOST('month_lim','int');
+$year_lim = GETPOST('year_lim','int');
+$toselect = GETPOST('toselect', 'array');
+
$option = GETPOST('option');
if ($option == 'late') $filter = 'paye:0';
+$filtre = GETPOST('filtre');
$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
$sortfield = GETPOST("sortfield",'alpha');
@@ -96,17 +107,6 @@ $pagenext = $page + 1;
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
$contextpage='invoicelist';
-$search_user = GETPOST('search_user','int');
-$search_sale = GETPOST('search_sale','int');
-$day = GETPOST('day','int');
-$month = GETPOST('month','int');
-$year = GETPOST('year','int');
-$day_lim = GETPOST('day_lim','int');
-$month_lim = GETPOST('month_lim','int');
-$year_lim = GETPOST('year_lim','int');
-$filtre = GETPOST('filtre');
-$toselect = GETPOST('toselect', 'array');
-
// Security check
$fieldid = (! empty($ref)?'facnumber':'rowid');
if (! empty($user->societe_id)) $socid=$user->societe_id;
@@ -140,14 +140,14 @@ $checkedtypetiers=0;
$arrayfields=array(
'f.facnumber'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
'f.ref_client'=>array('label'=>$langs->trans("RefCustomer"), 'checked'=>1),
+ 'f.date'=>array('label'=>$langs->trans("DateInvoice"), 'checked'=>1),
+ 'f.date_lim_reglement'=>array('label'=>$langs->trans("DateDue"), 'checked'=>1),
's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1),
's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1),
's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1),
'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0),
'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers),
- 'f.date'=>array('label'=>$langs->trans("DateInvoice"), 'checked'=>1),
- 'f.date_lim_reglement'=>array('label'=>$langs->trans("DateDue"), 'checked'=>1),
'f.fk_mode_reglement'=>array('label'=>$langs->trans("PaymentMode"), 'checked'=>1),
'f.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1),
'f.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0),
@@ -189,6 +189,7 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter") || GETPOS
$search_product_category='';
$search_ref='';
$search_refcustomer='';
+ $search_project='';
$search_societe='';
$search_montant_ht='';
$search_montant_vat='';
@@ -624,8 +625,6 @@ if (empty($reshook))
* View
*/
-llxHeader('',$langs->trans('Bill'),'EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes');
-
$form = new Form($db);
$formother = new FormOther($db);
$formfile = new FormFile($db);
@@ -633,6 +632,8 @@ $bankaccountstatic=new Account($db);
$facturestatic=new Facture($db);
$formcompany=new FormCompany($db);
+llxHeader('',$langs->trans('CustomersInvoices'),'EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes');
+
$sql = 'SELECT';
if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
$sql.= ' f.rowid as facid, f.facnumber, f.ref_client, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_vat, f.total_ttc,';
@@ -687,6 +688,7 @@ if ($filtre)
}
if ($search_ref) $sql .= natural_search('f.facnumber', $search_ref);
if ($search_refcustomer) $sql .= natural_search('f.ref_client', $search_refcustomer);
+if ($search_project) $sql .= natural_search('p.ref', $search_project);
if ($search_societe) $sql .= natural_search('s.nom', $search_societe);
if ($search_town) $sql.= natural_search('s.town', $search_town);
if ($search_zip) $sql.= natural_search("s.zip",$search_zip);
@@ -795,23 +797,23 @@ if ($resql)
$param='&socid='.$socid;
if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
- if ($day) $param.='&day='.$day;
- if ($month) $param.='&month='.$month;
- if ($year) $param.='&year=' .$year;
- if ($day_lim) $param.='&day_lim='.$day_lim;
- if ($month_lim) $param.='&month_lim='.$month_lim;
- if ($year_lim) $param.='&year_lim=' .$year_lim;
- if ($search_ref) $param.='&search_ref=' .$search_ref;
- if ($search_refcustomer) $param.='&search_refcustomer=' .$search_refcustomer;
- if ($search_societe) $param.='&search_societe=' .$search_societe;
- if ($search_sale > 0) $param.='&search_sale=' .$search_sale;
- if ($search_user > 0) $param.='&search_user=' .$search_user;
- if ($search_product_category > 0) $param.='$search_product_category=' .$search_product_category;
- if ($search_montant_ht != '') $param.='&search_montant_ht='.$search_montant_ht;
- if ($search_montant_vat != '') $param.='&search_montant_vat='.$search_montant_vat;
- if ($search_montant_ttc != '') $param.='&search_montant_ttc='.$search_montant_ttc;
- if ($search_status != '') $param.='&search_status='.$search_status;
- if ($search_paymentmode > 0) $param.='search_paymentmode='.$search_paymentmode;
+ if ($day) $param.='&day='.urlencode($day);
+ if ($month) $param.='&month='.urlencode($month);
+ if ($year) $param.='&year=' .urlencode($year);
+ if ($day_lim) $param.='&day_lim='.urlencode($day_lim);
+ if ($month_lim) $param.='&month_lim='.urlencode($month_lim);
+ if ($year_lim) $param.='&year_lim=' .urlencode($year_lim);
+ if ($search_ref) $param.='&search_ref=' .urlencode($search_ref);
+ if ($search_refcustomer) $param.='&search_refcustomer=' .urlencode($search_refcustomer);
+ if ($search_societe) $param.='&search_societe=' .urlencode($search_societe);
+ if ($search_sale > 0) $param.='&search_sale=' .urlencode($search_sale);
+ if ($search_user > 0) $param.='&search_user=' .urlencode($search_user);
+ if ($search_product_category > 0) $param.='$search_product_category=' .urlencode($search_product_category);
+ if ($search_montant_ht != '') $param.='&search_montant_ht='.urlencode($search_montant_ht);
+ if ($search_montant_vat != '') $param.='&search_montant_vat='.urlencode($search_montant_vat);
+ if ($search_montant_ttc != '') $param.='&search_montant_ttc='.urlencode($search_montant_ttc);
+ if ($search_status != '') $param.='&search_status='.urlencode($search_status);
+ if ($search_paymentmode > 0) $param.='search_paymentmode='.urlencode($search_paymentmode);
if ($show_files) $param.='&show_files=' .$show_files;
if ($option) $param.="&option=".$option;
if ($optioncss != '') $param.='&optioncss='.$optioncss;
@@ -1061,12 +1063,12 @@ if ($resql)
// Thirpdarty
if (! empty($arrayfields['s.nom']['checked']))
{
- print '
| ' . $langs->trans("SuppliersCategoriesShort") . ' | ';
print '';
print $form->showCategories($object->id, 'supplier', 1);
diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php
index 7481574ddd9..88f01c1e837 100644
--- a/htdocs/fourn/facture/list.php
+++ b/htdocs/fourn/facture/list.php
@@ -31,17 +31,21 @@
*/
require '../../main.inc.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
-require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
+require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
if (!$user->rights->fournisseur->facture->lire) accessforbidden();
-$langs->load("companies");
$langs->load("bills");
+$langs->load("companies");
+$langs->load('products');
$socid = GETPOST('socid','int');
@@ -56,68 +60,161 @@ if ($user->societe_id > 0)
$mode=GETPOST("mode");
$modesearch=GETPOST("mode_search");
-$page=GETPOST("page",'int');
-$sortorder = GETPOST("sortorder",'alpha');
-$sortfield = GETPOST("sortfield",'alpha');
+$search_product_category=GETPOST('search_product_category','int');
+$search_ref=GETPOST('sf_ref')?GETPOST('sf_ref','alpha'):GETPOST('search_ref','alpha');
+$search_refsupplier=GETPOST('search_refsupplier','alpha');
+$search_project=GETPOST('search_project','alpha');
+$search_societe=GETPOST('search_societe','alpha');
+$search_montant_ht=GETPOST('search_montant_ht','alpha');
+$search_montant_vat=GETPOST('search_montant_vat','alpha');
+$search_montant_ttc=GETPOST('search_montant_ttc','alpha');
+$search_status=GETPOST('search_status','int');
+$search_paymentmode=GETPOST('search_paymentmode','int');
+$search_town=GETPOST('search_town','alpha');
+$search_zip=GETPOST('search_zip','alpha');
+$search_state=trim(GETPOST("search_state"));
+$search_country=GETPOST("search_country",'int');
+$search_type_thirdparty=GETPOST("search_type_thirdparty",'int');
+$search_user = GETPOST('search_user','int');
+$search_sale = GETPOST('search_sale','int');
+$day = GETPOST('day','int');
+$month = GETPOST('month','int');
+$year = GETPOST('year','int');
+$day_lim = GETPOST('day_lim','int');
+$month_lim = GETPOST('month_lim','int');
+$year_lim = GETPOST('year_lim','int');
+$toselect = GETPOST('toselect', 'array');
-$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
-if ($page == -1) { $page = 0 ; }
-$offset = $limit * $page ;
-$pageprev = $page - 1;
-$pagenext = $page + 1;
-if (! $sortorder) $sortorder="DESC";
-if (! $sortfield) $sortfield="fac.datef,fac.rowid";
+$option = GETPOST('option');
+if ($option == 'late') $filter = 'paye:0';
$search_all = GETPOST('sall');
-$search_ref = GETPOST("search_ref","int");
-$search_ref_supplier = GETPOST("search_ref_supplier","alpha");
$search_label = GETPOST("search_label","alpha");
$search_company = GETPOST("search_company","alpha");
$search_amount_no_tax = GETPOST("search_amount_no_tax","alpha");
$search_amount_all_tax = GETPOST("search_amount_all_tax","alpha");
$search_status=GETPOST('search_status','alpha');
-$day = GETPOST("day","int");
-$month = GETPOST("month","int");
-$year = GETPOST("year","int");
-$day_lim = GETPOST('day_lim','int');
-$month_lim = GETPOST('month_lim','int');
-$year_lim = GETPOST('year_lim','int');
$optioncss = GETPOST('optioncss','alpha');
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter") || GETPOST("button_removefilter.x")) // All test must be present to be compatible with all browsers
-{
- $search_all="";
- $search_ref="";
- $search_ref_supplier="";
- $search_label="";
- $search_company="";
- $search_amount_no_tax="";
- $search_amount_all_tax="";
- $search_status="";
- $year="";
- $month="";
- $day="";
- $year_lim="";
- $month_lim="";
- $day_lim="";
-}
+$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit;
+$sortfield = GETPOST("sortfield",'alpha');
+$sortorder = GETPOST("sortorder",'alpha');
+$page=GETPOST("page",'int');
+if ($page == -1) { $page = 0 ; }
+$offset = $limit * $page ;
+$pageprev = $page - 1;
+$pagenext = $page + 1;
+if (! $sortorder) $sortorder="DESC";
+if (! $sortfield) $sortfield="f.datef,f.rowid";
+
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$contextpage='supplierinvoicelist';
+
+$diroutputmassaction=$conf->facture->dir_output . '/temp/massgeneration/'.$user->id;
+
+$object=new FactureFournisseur($db);
+
+$now=dol_now();
+
+// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
+$hookmanager->initHooks(array('supplierinvoicelist'));
+$extrafields = new ExtraFields($db);
+
+// fetch optionals attributes and labels
+$extralabels = $extrafields->fetch_name_optionals_label('facture_fourn');
+$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_');
// List of fields to search into when doing a "search in all"
$fieldstosearchall = array(
- 'fac.ref'=>'Ref',
- 'fac.ref_supplier'=>'RefSupplier',
+ 'f.ref'=>'Ref',
+ 'f.ref_supplier'=>'RefSupplier',
//'fd.description'=>'Description',
's.nom'=>"ThirdParty",
- 'fac.note_public'=>'NotePublic',
+ 'f.note_public'=>'NotePublic',
);
-if (empty($user->socid)) $fieldstosearchall["fac.note_private"]="NotePrivate";
+if (empty($user->socid)) $fieldstosearchall["f.note_private"]="NotePrivate";
+$checkedtypetiers=0;
+$arrayfields=array(
+ 'f.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
+ 'f.ref_supplier'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1),
+ 'f.label'=>array('label'=>$langs->trans("Label"), 'checked'=>0),
+ 'f.datef'=>array('label'=>$langs->trans("DateInvoice"), 'checked'=>1),
+ 'f.date_lim_reglement'=>array('label'=>$langs->trans("DateDue"), 'checked'=>1),
+ 'p.ref'=>array('label'=>$langs->trans("Project"), 'checked'=>0),
+ 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1),
+ 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1),
+ 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1),
+ 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0),
+ 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0),
+ 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers),
+ 'f.fk_mode_reglement'=>array('label'=>$langs->trans("PaymentMode"), 'checked'=>1),
+ 'f.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1),
+ 'f.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0),
+ 'f.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0),
+ 'f.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
+ 'f.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500),
+ 'f.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
+);
+// Extra fields
+if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label))
+{
+ foreach($extrafields->attribute_label as $key => $val)
+ {
+ $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]);
+ }
+}
/*
* Actions
*/
+if (GETPOST('cancel')) { $action='list'; $massaction=''; }
+if (! GETPOST('confirmmassaction')) { $massaction=''; }
+
+$parameters=array('socid'=>$socid);
+$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+
+include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
+
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter") || GETPOST("button_removefilter.x")) // All test must be present to be compatible with all browsers
+{
+ $search_all="";
+ $search_user='';
+ $search_sale='';
+ $search_product_category='';
+ $search_ref="";
+ $search_refsupplier="";
+ $search_label="";
+ $search_project='';
+ $search_societe="";
+ $search_company="";
+ $search_amount_no_tax="";
+ $search_amount_all_tax="";
+ $search_montant_ht='';
+ $search_montant_vat='';
+ $search_montant_ttc='';
+ $search_status='';
+ $search_paymentmode='';
+ $search_town='';
+ $search_zip="";
+ $search_state="";
+ $search_type='';
+ $search_country='';
+ $search_type_thirdparty='';
+ $year="";
+ $month="";
+ $day="";
+ $year_lim="";
+ $month_lim="";
+ $day_lim="";
+ $search_array_options=array();
+ $filter='';
+ $option='';
+}
+
if ($mode == 'search')
{
if ($modesearch == 'soc')
@@ -139,94 +236,130 @@ if ($mode == 'search')
}
}
+if (empty($reshook))
+{
+ // Mass actions. Controls on number of lines checked
+ $maxformassaction=1000;
+ if (! empty($massaction) && count($toselect) < 1)
+ {
+ $error++;
+ setEventMessages($langs->trans("NoLineChecked"), null, "warnings");
+ }
+ if (! $error && count($toselect) > $maxformassaction)
+ {
+ setEventMessages($langs->trans('TooManyRecordForMassAction',$maxformassaction), null, 'errors');
+ $error++;
+ }
+
+
+}
+
/*
* View
*/
-$now=dol_now();
$form=new Form($db);
$formother=new FormOther($db);
$formfile = new FormFile($db);
+$bankaccountstatic=new Account($db);
+$facturestatic=new FactureFournisseur($db);
+$formcompany=new FormCompany($db);
llxHeader('',$langs->trans("SuppliersInvoices"),'EN:Suppliers_Invoices|FR:FactureFournisseur|ES:Facturas_de_proveedores');
-$sql = "SELECT s.rowid as socid, s.nom as name, ";
-$sql.= " fac.rowid as facid, fac.ref, fac.ref_supplier, fac.datef, fac.date_lim_reglement as date_echeance,";
-$sql.= " fac.total_ht, fac.total_ttc, fac.paye as paye, fac.fk_statut as fk_statut, fac.libelle,";
+$sql = "SELECT";
+if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT';
+$sql.= " f.rowid as facid, f.ref, f.ref_supplier, f.datef, f.date_lim_reglement as datelimite,";
+$sql.= " f.total_ht, f.total_ttc, f.paye as paye, f.fk_statut as fk_statut, f.libelle as label,";
+$sql.= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client, ';
+$sql.= " typent.code as typent_code,";
+$sql.= " state.code_departement as state_code, state.nom as state_name,";
$sql.= " p.rowid as project_id, p.ref as project_ref";
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."facture_fourn as fac";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = fac.fk_projet";
-if (!$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
-$sql.= " WHERE fac.entity = ".$conf->entity;
-$sql.= " AND fac.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)
+// Add fields from extrafields
+foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : '');
+// Add fields from hooks
+$parameters=array();
+$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook
+$sql.=$hookmanager->resPrint;
+$sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s';
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)";
+$sql.= ', '.MAIN_DB_PREFIX.'facture_fourn as f';
+if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn_extrafields as ef on (f.rowid = ef.fk_object)";
+else $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_det as fd ON fd.fk_facture_fourn = f.rowid';
+if ($sall || $search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_det as pd ON f.rowid=pd.fk_facture_fourn';
+if ($search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product';
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = f.fk_projet";
+// We'll need this table joined to the select in order to filter by sale
+if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+if ($search_user > 0)
{
- $sql .= " AND s.rowid = ".$socid;
+ $sql.=", ".MAIN_DB_PREFIX."element_contact as ec";
+ $sql.=", ".MAIN_DB_PREFIX."c_type_contact as tc";
}
+$sql.= ' WHERE f.fk_soc = s.rowid';
+$sql.= " AND f.entity = ".$conf->entity;
+if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id;
+if ($search_product_category > 0) $sql.=" AND cp.fk_categorie = ".$search_product_category;
+if ($socid > 0) $sql .= ' AND s.rowid = '.$socid;
if ($search_all)
{
$sql.= natural_search(array_keys($fieldstosearchall), $search_all);
}
if ($search_ref)
{
- if (is_numeric($search_ref)) $sql .= natural_search(array('fac.ref'), $search_ref);
- else $sql .= natural_search('fac.ref', $search_ref);
-}
-if ($search_ref_supplier)
-{
- $sql .= natural_search('fac.ref_supplier', $search_ref_supplier);
+ if (is_numeric($search_ref)) $sql .= natural_search(array('f.ref'), $search_ref);
+ else $sql .= natural_search('f.ref', $search_ref);
}
+if ($search_ref) $sql .= natural_search('f.ref', $search_ref);
+if ($search_ref_supplier) $sql .= natural_search('f.ref_supplier', $search_ref_supplier);
+if ($search_project) $sql .= natural_search('p.ref', $search_project);
+if ($search_societe) $sql .= natural_search('s.nom', $search_societe);
+if ($search_town) $sql.= natural_search('s.town', $search_town);
+if ($search_zip) $sql.= natural_search("s.zip",$search_zip);
+if ($search_state) $sql.= natural_search("state.nom",$search_state);
+if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')';
+if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')';
+if ($search_company) $sql .= natural_search('s.nom', $search_company);
+if ($search_montant_ht != '') $sql.= natural_search('f.total', $search_montant_ht, 1);
+if ($search_montant_vat != '') $sql.= natural_search('f.total_tva', $search_montant_vat, 1);
+if ($search_montant_ttc != '') $sql.= natural_search('f.total_ttc', $search_montant_ttc, 1);
+if ($search_status != '' && $search_status >= 0) $sql.= " AND f.fk_statut = ".$db->escape($search_status);
+if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode."";
if ($month > 0)
{
if ($year > 0 && empty($day))
- $sql.= " AND fac.datef BETWEEN '".$db->idate(dol_get_first_day($year,$month,false))."' AND '".$db->idate(dol_get_last_day($year,$month,false))."'";
+ $sql.= " AND f.datef BETWEEN '".$db->idate(dol_get_first_day($year,$month,false))."' AND '".$db->idate(dol_get_last_day($year,$month,false))."'";
else if ($year > 0 && ! empty($day))
- $sql.= " AND fac.datef BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."'";
+ $sql.= " AND f.datef BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year))."'";
else
- $sql.= " AND date_format(fac.datef, '%m') = '".$month."'";
+ $sql.= " AND date_format(f.datef, '%m') = '".$month."'";
}
else if ($year > 0)
{
- $sql.= " AND fac.datef BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'";
+ $sql.= " AND f.datef BETWEEN '".$db->idate(dol_get_first_day($year,1,false))."' AND '".$db->idate(dol_get_last_day($year,12,false))."'";
}
if ($month_lim > 0)
{
if ($year_lim > 0 && empty($day_lim))
- $sql.= " AND fac.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,$month_lim,false))."' AND '".$db->idate(dol_get_last_day($year_lim,$month_lim,false))."'";
+ $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,$month_lim,false))."' AND '".$db->idate(dol_get_last_day($year_lim,$month_lim,false))."'";
else if ($year_lim > 0 && ! empty($day_lim))
- $sql.= " AND fac.date_lim_reglement BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month_lim, $day_lim, $year_lim))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month_lim, $day_lim, $year_lim))."'";
+ $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month_lim, $day_lim, $year_lim))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month_lim, $day_lim, $year_lim))."'";
else
- $sql.= " AND date_format(fac.date_lim_reglement, '%m') = '".$month_lim."'";
+ $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$month_lim."'";
}
else if ($year_lim > 0)
{
- $sql.= " AND fac.datef BETWEEN '".$db->idate(dol_get_first_day($year_lim,1,false))."' AND '".$db->idate(dol_get_last_day($year_lim,12,false))."'";
+ $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_get_first_day($year_lim,1,false))."' AND '".$db->idate(dol_get_last_day($year_lim,12,false))."'";
}
-if ($search_label)
-{
- $sql .= natural_search('fac.libelle', $search_label);
-}
-
-if ($search_company)
-{
- $sql .= natural_search('s.nom', $search_company);
-}
-
-if ($search_amount_no_tax != '')
-{
- $sql .= natural_search('fac.total_ht', $search_amount_no_tax, 1);
-}
-
-if ($search_amount_all_tax != '')
-{
- $sql .= natural_search('fac.total_ttc', $search_amount_all_tax, 1);
-}
-
+if ($option == 'late') $sql.=" AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->fournisseur->warning_delay)."'";
+if ($filter == 'paye:0') $sql.= " AND f.fk_statut = 1";
+if ($search_label) $sql .= natural_search('f.libelle', $search_label);
if ($search_status != '' && $search_status >= 0)
{
- $sql.= " AND fac.fk_statut = ".$search_status;
+ $sql.= " AND f.fk_statut = ".$search_status;
}
if ($filter && $filter != -1)
{
@@ -237,6 +370,30 @@ if ($filter && $filter != -1)
$sql .= ' AND ' . trim($filt[0]) . ' = ' . trim($filt[1]);
}
}
+if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale;
+if ($search_user > 0)
+{
+ $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='invoice_supplier' AND tc.source='internal' AND ec.element_id = f.rowid AND ec.fk_socpeople = ".$search_user;
+}
+// Add where from extra fields
+foreach ($search_array_options as $key => $val)
+{
+ $crit=$val;
+ $tmpkey=preg_replace('/search_options_/','',$key);
+ $typ=$extrafields->attribute_type[$tmpkey];
+ $mode=0;
+ if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric
+ if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit)))
+ {
+ $sql .= natural_search('ef.'.$tmpkey, $crit, $mode);
+ }
+}
+// Add where from hooks
+$parameters=array();
+$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook
+$sql.=$hookmanager->resPrint;
+
+$sql.= $db->order($sortfield,$sortorder);
$nbtotalofrecords = 0;
if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
@@ -245,21 +402,25 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST))
$nbtotalofrecords = $db->num_rows($result);
}
-$sql.= $db->order($sortfield,$sortorder);
$sql.= $db->plimit($limit+1, $offset);
+//print $sql;
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
- $i = 0;
- if ($socid) {
+ $arrayofselected=is_array($toselect)?$toselect:array();
+
+ if ($socid)
+ {
$soc = new Societe($db);
$soc->fetch($socid);
}
$param='&socid='.$socid;
+ if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
+ if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
if ($day) $param.='&day='.urlencode($day);
if ($month) $param.='&month='.urlencode($month);
if ($year) $param.='&year=' .urlencode($year);
@@ -267,17 +428,31 @@ if ($resql)
if ($month_lim) $param.='&month_lim='.urlencode($month_lim);
if ($year_lim) $param.='&year_lim=' .urlencode($year_lim);
if ($search_ref) $param.='&search_ref='.urlencode($search_ref);
- if ($search_ref_supplier) $param.='&search_ref_supplier'.urlencode($search_ref_supplier);
+ if ($search_refsupplier) $param.='&search_refsupplier'.urlencode($search_refsupplier);
if ($search_label) $param.='&search_label='.urlencode($search_label);
if ($search_company) $param.='&search_company='.urlencode($search_company);
+ if ($search_montant_ht != '') $param.='&search_montant_ht='.urlencode($search_montant_ht);
+ if ($search_montant_vat != '') $param.='&search_montant_vat='.urlencode($search_montant_vat);
+ if ($search_montant_ttc != '') $param.='&search_montant_ttc='.urlencode($search_montant_ttc);
if ($search_amount_no_tax) $param.='&search_amount_no_tax='.urlencode($search_amount_no_tax);
if ($search_amount_all_tax) $param.='&search_amount_all_tax='.urlencode($search_amount_all_tax);
+ if ($search_status >= 0) $param.="&search_status=".urlencode($search_status);
if ($optioncss != '') $param.='&optioncss='.$optioncss;
- if ($search_status >= 0) $param.="&search_status=".$search_status;
-
- print '\n";
}
else
{
diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang
index ba9debb49ba..5d4ea34ded4 100644
--- a/htdocs/langs/en_US/errors.lang
+++ b/htdocs/langs/en_US/errors.lang
@@ -169,6 +169,7 @@ ErrorSavingChanges=An error has ocurred when saving the changes
ErrorWarehouseRequiredIntoShipmentLine=Warehouse is required on the line to ship
ErrorFileMustHaveFormat=File must have format %s
ErrorSupplierCountryIsNotDefined=Country for this supplier is not defined. Correct this first.
+ErrorsThirdpartyMerge=Failed to merge the two records. Request canceled.
# Warnings
WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user.
diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php
index c7f92b2ca1b..69262715b31 100644
--- a/htdocs/societe/class/societe.class.php
+++ b/htdocs/societe/class/societe.class.php
@@ -43,7 +43,7 @@ class Societe extends CommonObject
public $element='societe';
public $table_element = 'societe';
public $fk_element='fk_soc';
- protected $childtables=array("supplier_proposal","propal","commande","facture","contrat","facture_fourn","commande_fournisseur","projet"); // To test if we can delete object
+ protected $childtables=array("supplier_proposal","propal","commande","facture","contrat","facture_fourn","commande_fournisseur","projet","expedition"); // To test if we can delete object
/**
* 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
@@ -1002,14 +1002,16 @@ class Societe extends CommonObject
* @param string $idprof2 Prof id 2 of third party (Warning, this can return several records)
* @param string $idprof3 Prof id 3 of third party (Warning, this can return several records)
* @param string $idprof4 Prof id 4 of third party (Warning, this can return several records)
+ * @param string $idprof5 Prof id 5 of third party (Warning, this can return several records)
+ * @param string $idprof6 Prof id 6 of third party (Warning, this can return several records)
* @return int >0 if OK, <0 if KO or if two records found for same ref or idprof, 0 if not found.
*/
- function fetch($rowid, $ref='', $ref_ext='', $ref_int='', $idprof1='',$idprof2='',$idprof3='',$idprof4='')
+ function fetch($rowid, $ref='', $ref_ext='', $ref_int='', $idprof1='',$idprof2='',$idprof3='',$idprof4='',$idprof5='',$idprof6='')
{
global $langs;
global $conf;
- if (empty($rowid) && empty($ref) && empty($ref_ext) && empty($ref_int) && empty($idprof1) && empty($idprof2) && empty($idprof3) && empty($idprof4)) return -1;
+ if (empty($rowid) && empty($ref) && empty($ref_ext) && empty($ref_int) && empty($idprof1) && empty($idprof2) && empty($idprof3) && empty($idprof4) && empty($idprof5) && empty($idprof6)) return -1;
$sql = 'SELECT s.rowid, s.nom as name, s.name_alias, s.entity, s.ref_ext, s.ref_int, s.address, s.datec as date_creation, s.prefix_comm';
$sql .= ', s.status';
@@ -1049,9 +1051,11 @@ class Societe extends CommonObject
else if ($ref_int) $sql .= " WHERE s.ref_int = '".$this->db->escape($ref_int)."' AND s.entity IN (".getEntity($this->element, 1).")";
else if ($idprof1) $sql .= " WHERE s.siren = '".$this->db->escape($idprof1)."' AND s.entity IN (".getEntity($this->element, 1).")";
else if ($idprof2) $sql .= " WHERE s.siret = '".$this->db->escape($idprof2)."' AND s.entity IN (".getEntity($this->element, 1).")";
- else if ($idprof3) $sql .= " WHERE s.ape = '".$this->db->escape($idprof3)."' AND s.entity IN (".getEntity($this->element, 1).")"; // TODO This request is used ? Multiple database recording provided !!
+ else if ($idprof3) $sql .= " WHERE s.ape = '".$this->db->escape($idprof3)."' AND s.entity IN (".getEntity($this->element, 1).")";
else if ($idprof4) $sql .= " WHERE s.idprof4 = '".$this->db->escape($idprof4)."' AND s.entity IN (".getEntity($this->element, 1).")";
-
+ else if ($idprof5) $sql .= " WHERE s.idprof5 = '".$this->db->escape($idprof5)."' AND s.entity IN (".getEntity($this->element, 1).")";
+ else if ($idprof6) $sql .= " WHERE s.idprof6 = '".$this->db->escape($idprof6)."' AND s.entity IN (".getEntity($this->element, 1).")";
+
$resql=$this->db->query($sql);
dol_syslog(get_class($this)."::fetch ".$sql);
if ($resql)
@@ -1059,11 +1063,11 @@ class Societe extends CommonObject
$num=$this->db->num_rows($resql);
if ($num > 1)
{
- $this->error='Fetch several records found request';
+ $this->error='Fetch found several records. Rename one of tirdparties to avoid duplicate.';
dol_syslog($this->error, LOG_ERR);
$result = -2;
}
- if ($num)
+ elseif ($num) // $num = 1
{
$obj = $this->db->fetch_object($resql);
diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php
index fa1f52a06df..fb758c52f29 100644
--- a/htdocs/societe/soc.php
+++ b/htdocs/societe/soc.php
@@ -168,6 +168,7 @@ if (empty($reshook))
if (!$errors && !$object_name::replaceThirdparty($db, $soc_origin->id, $object->id))
{
$errors++;
+ setEventMessages($db->lasterror(), null, 'errors');
}
}
@@ -202,6 +203,7 @@ if (empty($reshook))
}
else
{
+ $langs->load("errors");
setEventMessages($langs->trans('ErrorsThirdpartyMerge'), null, 'errors');
$db->rollback();
}
diff --git a/test/phpunit/WebservicesInvoicesTest.php b/test/phpunit/WebservicesInvoicesTest.php
index bbfde0a66e5..ce3275bb58e 100644
--- a/test/phpunit/WebservicesInvoicesTest.php
+++ b/test/phpunit/WebservicesInvoicesTest.php
@@ -84,11 +84,11 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
$this->soapclient->decodeUTF8(false);
}
- // create a third_party, needed to create an invoice
+ // create third_parties, needed to test an invoice
$societe=new Societe($db);
$societe->ref='';
$societe->name='name';
- $societe->ref_ext='209';
+ $societe->ref_ext='ref-phpunit';
$societe->status=1;
$societe->client=1;
$societe->fournisseur=0;
@@ -167,16 +167,16 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
$WS_METHOD = 'createInvoice';
// load societe first
- $societe=new Societe($db);
- $societe->fetch('', '', '209');
+ /*$societe=new Societe($db);
+ $societe->fetch('', '', 'ref-phpunit');
print __METHOD__." societe loaded id=".$societe->id."\n";
-
+ */
$body = array (
"id" => NULL,
"ref" => NULL,
- "ref_ext" => "165",
- "thirdparty_id" => $societe->id,
+ "ref_ext" => "ref-phpunit-2",
+ "thirdparty_id" => $this->socid,
"fk_user_author" => NULL,
"fk_user_valid" => NULL,
"date" => "2015-04-19 20:16:53",
@@ -247,7 +247,7 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
print __METHOD__." result=".$result['result']['result_code']."\n";
$this->assertEquals('OK',$result['result']['result_code']);
- $this->assertEquals('165', $result['ref_ext']);
+ $this->assertEquals('ref-phpunit-2', $result['ref_ext']);
return $result;
@@ -282,7 +282,7 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
// Test URL
$result='';
- $parameters = array('authentication'=>$authentication,'id'=>NULL,'ref'=>NULL,'ref_ext'=>165);
+ $parameters = array('authentication'=>$authentication,'id'=>NULL,'ref'=>NULL,'ref_ext'=>'ref-phpunit-2');
print __METHOD__." call method ".$WS_METHOD."\n";
try {
$result = $this->soapclient->call($WS_METHOD,$parameters,$this->ns,'');
@@ -303,7 +303,7 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
}
print __METHOD__." result=".$result['result']['result_code']."\n";
$this->assertEquals('OK',$result['result']['result_code']);
- $this->assertEquals('165', $result['invoice']['ref_ext']);
+ $this->assertEquals('ref-phpunit-2', $result['invoice']['ref_ext']);
return $result;
@@ -332,8 +332,8 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
$body = array (
"id" => NULL,
"ref" => NULL,
- "ref_ext" => "165",
- "thirdparty_id" => "209",
+ "ref_ext" => "ref-phpunit-2",
+ "thirdparty_id" => $this->socid,
"fk_user_author" => NULL,
"fk_user_valid" => NULL,
"date" => "2015-04-19 20:16:53",
@@ -404,7 +404,7 @@ class WebservicesInvoicesTest extends PHPUnit_Framework_TestCase
print __METHOD__." result=".$result['result']['result_code'].$result['result']['result_label']."\n";
$this->assertEquals('OK',$result['result']['result_code']);
- $this->assertEquals('165', $result['ref_ext']);
+ $this->assertEquals('ref-phpunit-2', $result['ref_ext']);
return $result;
|